fridayy 1.0.0

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.
Files changed (192) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +283 -0
  3. package/bin/fridayy.js +12 -0
  4. package/dist/adapters/base.d.ts +40 -0
  5. package/dist/adapters/base.d.ts.map +1 -0
  6. package/dist/adapters/base.js +7 -0
  7. package/dist/adapters/base.js.map +1 -0
  8. package/dist/adapters/manual/adapter.d.ts +18 -0
  9. package/dist/adapters/manual/adapter.d.ts.map +1 -0
  10. package/dist/adapters/manual/adapter.js +52 -0
  11. package/dist/adapters/manual/adapter.js.map +1 -0
  12. package/dist/adapters/nodejs/adapter.d.ts +19 -0
  13. package/dist/adapters/nodejs/adapter.d.ts.map +1 -0
  14. package/dist/adapters/nodejs/adapter.js +135 -0
  15. package/dist/adapters/nodejs/adapter.js.map +1 -0
  16. package/dist/adapters/nodejs/ast-scanner.d.ts +21 -0
  17. package/dist/adapters/nodejs/ast-scanner.d.ts.map +1 -0
  18. package/dist/adapters/nodejs/ast-scanner.js +102 -0
  19. package/dist/adapters/nodejs/ast-scanner.js.map +1 -0
  20. package/dist/adapters/openapi/adapter.d.ts +22 -0
  21. package/dist/adapters/openapi/adapter.d.ts.map +1 -0
  22. package/dist/adapters/openapi/adapter.js +271 -0
  23. package/dist/adapters/openapi/adapter.js.map +1 -0
  24. package/dist/adapters/openapi/parser.d.ts +30 -0
  25. package/dist/adapters/openapi/parser.d.ts.map +1 -0
  26. package/dist/adapters/openapi/parser.js +136 -0
  27. package/dist/adapters/openapi/parser.js.map +1 -0
  28. package/dist/adapters/openapi/request-builder.d.ts +13 -0
  29. package/dist/adapters/openapi/request-builder.d.ts.map +1 -0
  30. package/dist/adapters/openapi/request-builder.js +83 -0
  31. package/dist/adapters/openapi/request-builder.js.map +1 -0
  32. package/dist/adapters/registry.d.ts +28 -0
  33. package/dist/adapters/registry.d.ts.map +1 -0
  34. package/dist/adapters/registry.js +46 -0
  35. package/dist/adapters/registry.js.map +1 -0
  36. package/dist/adapters/rest/adapter.d.ts +18 -0
  37. package/dist/adapters/rest/adapter.d.ts.map +1 -0
  38. package/dist/adapters/rest/adapter.js +41 -0
  39. package/dist/adapters/rest/adapter.js.map +1 -0
  40. package/dist/adapters/rest/executor.d.ts +19 -0
  41. package/dist/adapters/rest/executor.d.ts.map +1 -0
  42. package/dist/adapters/rest/executor.js +101 -0
  43. package/dist/adapters/rest/executor.js.map +1 -0
  44. package/dist/cli/commands/config.d.ts +7 -0
  45. package/dist/cli/commands/config.d.ts.map +1 -0
  46. package/dist/cli/commands/config.js +92 -0
  47. package/dist/cli/commands/config.js.map +1 -0
  48. package/dist/cli/commands/doctor.d.ts +7 -0
  49. package/dist/cli/commands/doctor.d.ts.map +1 -0
  50. package/dist/cli/commands/doctor.js +126 -0
  51. package/dist/cli/commands/doctor.js.map +1 -0
  52. package/dist/cli/commands/generate.d.ts +7 -0
  53. package/dist/cli/commands/generate.d.ts.map +1 -0
  54. package/dist/cli/commands/generate.js +58 -0
  55. package/dist/cli/commands/generate.js.map +1 -0
  56. package/dist/cli/commands/init.d.ts +7 -0
  57. package/dist/cli/commands/init.d.ts.map +1 -0
  58. package/dist/cli/commands/init.js +54 -0
  59. package/dist/cli/commands/init.js.map +1 -0
  60. package/dist/cli/commands/review.d.ts +7 -0
  61. package/dist/cli/commands/review.d.ts.map +1 -0
  62. package/dist/cli/commands/review.js +151 -0
  63. package/dist/cli/commands/review.js.map +1 -0
  64. package/dist/cli/commands/scan.d.ts +7 -0
  65. package/dist/cli/commands/scan.d.ts.map +1 -0
  66. package/dist/cli/commands/scan.js +77 -0
  67. package/dist/cli/commands/scan.js.map +1 -0
  68. package/dist/cli/commands/start.d.ts +7 -0
  69. package/dist/cli/commands/start.d.ts.map +1 -0
  70. package/dist/cli/commands/start.js +54 -0
  71. package/dist/cli/commands/start.js.map +1 -0
  72. package/dist/cli/commands/tools.d.ts +7 -0
  73. package/dist/cli/commands/tools.d.ts.map +1 -0
  74. package/dist/cli/commands/tools.js +48 -0
  75. package/dist/cli/commands/tools.js.map +1 -0
  76. package/dist/cli/index.d.ts +8 -0
  77. package/dist/cli/index.d.ts.map +1 -0
  78. package/dist/cli/index.js +42 -0
  79. package/dist/cli/index.js.map +1 -0
  80. package/dist/cli/ui/banner.d.ts +6 -0
  81. package/dist/cli/ui/banner.d.ts.map +1 -0
  82. package/dist/cli/ui/banner.js +20 -0
  83. package/dist/cli/ui/banner.js.map +1 -0
  84. package/dist/cli/ui/logger.d.ts +12 -0
  85. package/dist/cli/ui/logger.d.ts.map +1 -0
  86. package/dist/cli/ui/logger.js +13 -0
  87. package/dist/cli/ui/logger.js.map +1 -0
  88. package/dist/cli/ui/tables.d.ts +9 -0
  89. package/dist/cli/ui/tables.d.ts.map +1 -0
  90. package/dist/cli/ui/tables.js +72 -0
  91. package/dist/cli/ui/tables.js.map +1 -0
  92. package/dist/config/config-manager.d.ts +37 -0
  93. package/dist/config/config-manager.d.ts.map +1 -0
  94. package/dist/config/config-manager.js +129 -0
  95. package/dist/config/config-manager.js.map +1 -0
  96. package/dist/config/defaults.d.ts +8 -0
  97. package/dist/config/defaults.d.ts.map +1 -0
  98. package/dist/config/defaults.js +37 -0
  99. package/dist/config/defaults.js.map +1 -0
  100. package/dist/core/authentication/manager.d.ts +20 -0
  101. package/dist/core/authentication/manager.d.ts.map +1 -0
  102. package/dist/core/authentication/manager.js +71 -0
  103. package/dist/core/authentication/manager.js.map +1 -0
  104. package/dist/core/authentication/secret-resolver.d.ts +39 -0
  105. package/dist/core/authentication/secret-resolver.d.ts.map +1 -0
  106. package/dist/core/authentication/secret-resolver.js +89 -0
  107. package/dist/core/authentication/secret-resolver.js.map +1 -0
  108. package/dist/core/discovery/index.d.ts +5 -0
  109. package/dist/core/discovery/index.d.ts.map +1 -0
  110. package/dist/core/discovery/index.js +5 -0
  111. package/dist/core/discovery/index.js.map +1 -0
  112. package/dist/core/discovery/project-scanner.d.ts +20 -0
  113. package/dist/core/discovery/project-scanner.d.ts.map +1 -0
  114. package/dist/core/discovery/project-scanner.js +174 -0
  115. package/dist/core/discovery/project-scanner.js.map +1 -0
  116. package/dist/core/permissions/classifier.d.ts +25 -0
  117. package/dist/core/permissions/classifier.d.ts.map +1 -0
  118. package/dist/core/permissions/classifier.js +92 -0
  119. package/dist/core/permissions/classifier.js.map +1 -0
  120. package/dist/core/permissions/enforcer.d.ts +24 -0
  121. package/dist/core/permissions/enforcer.d.ts.map +1 -0
  122. package/dist/core/permissions/enforcer.js +71 -0
  123. package/dist/core/permissions/enforcer.js.map +1 -0
  124. package/dist/core/schema/json-schema.d.ts +29 -0
  125. package/dist/core/schema/json-schema.d.ts.map +1 -0
  126. package/dist/core/schema/json-schema.js +129 -0
  127. package/dist/core/schema/json-schema.js.map +1 -0
  128. package/dist/core/schema/types.d.ts +187 -0
  129. package/dist/core/schema/types.d.ts.map +1 -0
  130. package/dist/core/schema/types.js +6 -0
  131. package/dist/core/schema/types.js.map +1 -0
  132. package/dist/core/tool-generator/description-builder.d.ts +15 -0
  133. package/dist/core/tool-generator/description-builder.d.ts.map +1 -0
  134. package/dist/core/tool-generator/description-builder.js +32 -0
  135. package/dist/core/tool-generator/description-builder.js.map +1 -0
  136. package/dist/core/tool-generator/generator.d.ts +21 -0
  137. package/dist/core/tool-generator/generator.d.ts.map +1 -0
  138. package/dist/core/tool-generator/generator.js +61 -0
  139. package/dist/core/tool-generator/generator.js.map +1 -0
  140. package/dist/core/tool-generator/name-sanitizer.d.ts +21 -0
  141. package/dist/core/tool-generator/name-sanitizer.d.ts.map +1 -0
  142. package/dist/core/tool-generator/name-sanitizer.js +84 -0
  143. package/dist/core/tool-generator/name-sanitizer.js.map +1 -0
  144. package/dist/core/validation/config-schema.d.ts +1458 -0
  145. package/dist/core/validation/config-schema.d.ts.map +1 -0
  146. package/dist/core/validation/config-schema.js +137 -0
  147. package/dist/core/validation/config-schema.js.map +1 -0
  148. package/dist/core/validation/validator.d.ts +28 -0
  149. package/dist/core/validation/validator.d.ts.map +1 -0
  150. package/dist/core/validation/validator.js +108 -0
  151. package/dist/core/validation/validator.js.map +1 -0
  152. package/dist/index.d.ts +38 -0
  153. package/dist/index.d.ts.map +1 -0
  154. package/dist/index.js +38 -0
  155. package/dist/index.js.map +1 -0
  156. package/dist/mcp/prompts/prompt-registry.d.ts +28 -0
  157. package/dist/mcp/prompts/prompt-registry.d.ts.map +1 -0
  158. package/dist/mcp/prompts/prompt-registry.js +65 -0
  159. package/dist/mcp/prompts/prompt-registry.js.map +1 -0
  160. package/dist/mcp/resources/resource-registry.d.ts +26 -0
  161. package/dist/mcp/resources/resource-registry.d.ts.map +1 -0
  162. package/dist/mcp/resources/resource-registry.js +87 -0
  163. package/dist/mcp/resources/resource-registry.js.map +1 -0
  164. package/dist/mcp/server/fridayy-server.d.ts +38 -0
  165. package/dist/mcp/server/fridayy-server.d.ts.map +1 -0
  166. package/dist/mcp/server/fridayy-server.js +143 -0
  167. package/dist/mcp/server/fridayy-server.js.map +1 -0
  168. package/dist/mcp/tools/tool-handler.d.ts +29 -0
  169. package/dist/mcp/tools/tool-handler.d.ts.map +1 -0
  170. package/dist/mcp/tools/tool-handler.js +206 -0
  171. package/dist/mcp/tools/tool-handler.js.map +1 -0
  172. package/dist/mcp/tools/tool-registry.d.ts +20 -0
  173. package/dist/mcp/tools/tool-registry.d.ts.map +1 -0
  174. package/dist/mcp/tools/tool-registry.js +38 -0
  175. package/dist/mcp/tools/tool-registry.js.map +1 -0
  176. package/dist/security/allowlist.d.ts +10 -0
  177. package/dist/security/allowlist.d.ts.map +1 -0
  178. package/dist/security/allowlist.js +30 -0
  179. package/dist/security/allowlist.js.map +1 -0
  180. package/dist/security/audit-logger.d.ts +35 -0
  181. package/dist/security/audit-logger.d.ts.map +1 -0
  182. package/dist/security/audit-logger.js +52 -0
  183. package/dist/security/audit-logger.js.map +1 -0
  184. package/dist/security/rate-limiter.d.ts +28 -0
  185. package/dist/security/rate-limiter.d.ts.map +1 -0
  186. package/dist/security/rate-limiter.js +64 -0
  187. package/dist/security/rate-limiter.js.map +1 -0
  188. package/dist/security/sanitizer.d.ts +17 -0
  189. package/dist/security/sanitizer.d.ts.map +1 -0
  190. package/dist/security/sanitizer.js +70 -0
  191. package/dist/security/sanitizer.js.map +1 -0
  192. package/package.json +77 -0
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Fridayy - Generate Command
3
+ * Generates candidate MCP tools and saves them to fridayy.tools.json.
4
+ */
5
+ import { Command } from 'commander';
6
+ export declare function registerGenerateCommand(program: Command): void;
7
+ //# sourceMappingURL=generate.d.ts.map
@@ -0,0 +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,CAmD9D"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Fridayy - Generate Command
3
+ * Generates candidate MCP tools and saves them to fridayy.tools.json.
4
+ */
5
+ import ora from 'ora';
6
+ import chalk from 'chalk';
7
+ import { defaultConfigManager } from '../../config/config-manager.js';
8
+ import { defaultToolGenerator } from '../../core/tool-generator/generator.js';
9
+ import { createToolsTable } from '../ui/tables.js';
10
+ import { printBanner } from '../ui/banner.js';
11
+ import { logger } from '../ui/logger.js';
12
+ export function registerGenerateCommand(program) {
13
+ program
14
+ .command('generate')
15
+ .description('Generate candidate MCP tools from configured API sources')
16
+ .option('--force', 'Regenerate all tools and reset approval statuses')
17
+ .option('--spec <path>', 'Path to OpenAPI specification')
18
+ .action(async (options) => {
19
+ printBanner();
20
+ const rootDir = process.cwd();
21
+ if (!defaultConfigManager.configExists(rootDir)) {
22
+ logger.error('No configuration found. Please run `fridayy init` first.');
23
+ return;
24
+ }
25
+ const config = defaultConfigManager.loadConfig(rootDir);
26
+ if (options.spec) {
27
+ config.source.path = options.spec;
28
+ }
29
+ const spinner = ora('Generating candidate MCP tools...').start();
30
+ try {
31
+ // Collect previous tool approval statuses unless --force is given
32
+ let preserveMap;
33
+ if (!options.force) {
34
+ const existingTools = defaultConfigManager.loadTools(rootDir);
35
+ if (existingTools.length > 0) {
36
+ preserveMap = new Map();
37
+ for (const t of existingTools) {
38
+ preserveMap.set(t.name, t.status);
39
+ }
40
+ }
41
+ }
42
+ const tools = await defaultToolGenerator.generate({
43
+ config,
44
+ rootDir,
45
+ preserveStatuses: preserveMap
46
+ });
47
+ const savedPath = defaultConfigManager.saveTools(tools, config.source.type, rootDir);
48
+ spinner.succeed(`Generated ${chalk.bold.green(tools.length)} MCP tools.`);
49
+ console.log('\n' + createToolsTable(tools) + '\n');
50
+ logger.success(`Saved tools definition to ${chalk.bold(savedPath)}`);
51
+ console.log(`\nNext step: Run ${chalk.cyan('fridayy review')} to approve/reject tools.\n`);
52
+ }
53
+ catch (err) {
54
+ spinner.fail(`Generation failed: ${err.message}`);
55
+ }
56
+ });
57
+ }
58
+ //# sourceMappingURL=generate.js.map
@@ -0,0 +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,mCAAmC,CAAC,CAAC,KAAK,EAAE,CAAC;QAEjE,IAAI,CAAC;YACH,kEAAkE;YAClE,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;YACnD,MAAM,CAAC,OAAO,CAAC,6BAA6B,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YACrE,OAAO,CAAC,GAAG,CAAC,oBAAoB,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,6BAA6B,CAAC,CAAC;QAC7F,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,OAAO,CAAC,IAAI,CAAC,sBAAsB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACpD,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Fridayy - Init Command
3
+ * Initializes fridayy.config.json in the current project.
4
+ */
5
+ import { Command } from 'commander';
6
+ export declare function registerInitCommand(program: Command): void;
7
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUpC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA4C1D"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Fridayy - Init Command
3
+ * Initializes fridayy.config.json in the current project.
4
+ */
5
+ import path from 'node:path';
6
+ import ora from 'ora';
7
+ import chalk from 'chalk';
8
+ import { defaultConfigManager } from '../../config/config-manager.js';
9
+ import { defaultProjectScanner } from '../../core/discovery/project-scanner.js';
10
+ import { DEFAULT_CONFIG } from '../../config/defaults.js';
11
+ import { logger } from '../ui/logger.js';
12
+ import { printBanner } from '../ui/banner.js';
13
+ export function registerInitCommand(program) {
14
+ program
15
+ .command('init')
16
+ .description('Initialize Fridayy configuration in the current project')
17
+ .option('-y, --yes', 'Skip prompts and accept recommended defaults')
18
+ .option('-f, --force', 'Overwrite existing configuration file')
19
+ .option('--name <name>', 'Project name')
20
+ .option('--spec <path>', 'Path to OpenAPI specification file')
21
+ .option('--url <url>', 'Target API base URL')
22
+ .action(async (options) => {
23
+ printBanner();
24
+ const rootDir = process.cwd();
25
+ if (defaultConfigManager.configExists(rootDir) && !options.force) {
26
+ logger.warn('Configuration file fridayy.config.json already exists.');
27
+ logger.info('Use --force to overwrite or run `fridayy scan` to analyze project.');
28
+ return;
29
+ }
30
+ const spinner = ora('Analyzing project structure...').start();
31
+ const scanResult = await defaultProjectScanner.scan(rootDir);
32
+ spinner.succeed('Project analysis complete.');
33
+ let config = {
34
+ ...DEFAULT_CONFIG,
35
+ ...scanResult.recommendedConfig
36
+ };
37
+ if (options.name)
38
+ config.name = options.name;
39
+ if (options.spec) {
40
+ config.source = { type: 'openapi', path: options.spec };
41
+ }
42
+ if (options.url) {
43
+ config.source.baseUrl = options.url;
44
+ }
45
+ const savedPath = defaultConfigManager.saveConfig(config, rootDir);
46
+ logger.success(`Created configuration: ${chalk.bold(path.basename(savedPath))}`);
47
+ console.log(`\nNext steps:`);
48
+ console.log(` 1. Run ${chalk.cyan('fridayy scan')} to inspect discovered endpoints`);
49
+ console.log(` 2. Run ${chalk.cyan('fridayy generate')} to build MCP tool definitions`);
50
+ console.log(` 3. Run ${chalk.cyan('fridayy review')} to approve candidate tools`);
51
+ console.log(` 4. Run ${chalk.cyan('fridayy start')} to launch your MCP server\n`);
52
+ });
53
+ }
54
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Fridayy - Review Command
3
+ * Interactive and automated developer review workflow to approve, reject, modify, or block MCP tools.
4
+ */
5
+ import { Command } from 'commander';
6
+ export declare function registerReviewCommand(program: Command): void;
7
+ //# sourceMappingURL=review.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/review.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAuF5D"}
@@ -0,0 +1,151 @@
1
+ /**
2
+ * Fridayy - Review Command
3
+ * Interactive and automated developer review workflow to approve, reject, modify, or block MCP tools.
4
+ */
5
+ import chalk from 'chalk';
6
+ import { select } from '@inquirer/prompts';
7
+ import { defaultConfigManager } from '../../config/config-manager.js';
8
+ import { printBanner } from '../ui/banner.js';
9
+ import { logger } from '../ui/logger.js';
10
+ import { formatPermissionBadge, formatStatusBadge } from '../ui/tables.js';
11
+ export function registerReviewCommand(program) {
12
+ program
13
+ .command('review')
14
+ .description('Review, approve, reject, or block candidate MCP tools')
15
+ .option('--approve-all', 'Approve all tools (including write and destructive)')
16
+ .option('--approve-read', 'Approve all safe READ tools')
17
+ .option('--approve <name>', 'Approve a specific tool by name')
18
+ .option('--reject <name>', 'Reject a specific tool by name')
19
+ .option('--block <name>', 'Block a specific tool by name')
20
+ .action(async (options) => {
21
+ printBanner();
22
+ const rootDir = process.cwd();
23
+ if (!defaultConfigManager.configExists(rootDir)) {
24
+ logger.error('No configuration found. Run `fridayy init` first.');
25
+ return;
26
+ }
27
+ let tools = defaultConfigManager.loadTools(rootDir);
28
+ if (tools.length === 0) {
29
+ logger.warn('No tools found in fridayy.tools.json. Run `fridayy generate` first.');
30
+ return;
31
+ }
32
+ // Flag-based handling
33
+ if (options.approveAll) {
34
+ const count = defaultConfigManager.bulkUpdateStatus(() => true, 'APPROVED', rootDir);
35
+ logger.success(`Approved all ${chalk.bold(count)} tools.`);
36
+ printToolsSummary(defaultConfigManager.loadTools(rootDir));
37
+ return;
38
+ }
39
+ if (options.approveRead) {
40
+ const count = defaultConfigManager.bulkUpdateStatus(t => t.permissions.type === 'READ', 'APPROVED', rootDir);
41
+ logger.success(`Approved all ${chalk.bold(count)} READ tools.`);
42
+ printToolsSummary(defaultConfigManager.loadTools(rootDir));
43
+ return;
44
+ }
45
+ if (options.approve) {
46
+ const ok = defaultConfigManager.updateToolStatus(options.approve, 'APPROVED', rootDir);
47
+ if (ok) {
48
+ logger.success(`Approved tool "${chalk.bold(options.approve)}".`);
49
+ }
50
+ else {
51
+ logger.error(`Tool "${options.approve}" not found.`);
52
+ }
53
+ return;
54
+ }
55
+ if (options.reject) {
56
+ const ok = defaultConfigManager.updateToolStatus(options.reject, 'REJECTED', rootDir);
57
+ if (ok) {
58
+ logger.success(`Rejected tool "${chalk.bold(options.reject)}".`);
59
+ }
60
+ else {
61
+ logger.error(`Tool "${options.reject}" not found.`);
62
+ }
63
+ return;
64
+ }
65
+ if (options.block) {
66
+ const ok = defaultConfigManager.updateToolStatus(options.block, 'BLOCKED', rootDir);
67
+ if (ok) {
68
+ logger.success(`Blocked tool "${chalk.bold(options.block)}".`);
69
+ }
70
+ else {
71
+ logger.error(`Tool "${options.block}" not found.`);
72
+ }
73
+ return;
74
+ }
75
+ // Display current tools
76
+ printToolsSummary(tools);
77
+ // Interactive Review Menu (if stdin is a TTY)
78
+ if (process.stdin.isTTY) {
79
+ await runInteractiveReview(tools, rootDir);
80
+ }
81
+ else {
82
+ console.log(`\nUse review flags to modify tool statuses:`);
83
+ console.log(` ${chalk.cyan('fridayy review --approve-read')} (Approve all read-only tools)`);
84
+ console.log(` ${chalk.cyan('fridayy review --approve-all')} (Approve all tools)`);
85
+ console.log(` ${chalk.cyan('fridayy review --approve <name>')} (Approve specific tool)`);
86
+ console.log(` ${chalk.cyan('fridayy review --block <name>')} (Block specific tool)\n`);
87
+ }
88
+ });
89
+ }
90
+ function printToolsSummary(tools) {
91
+ console.log(chalk.bold('\nCurrent Tools Review Status:\n'));
92
+ for (const tool of tools) {
93
+ const sourceInfo = tool.source.method
94
+ ? `${tool.source.method} ${tool.source.path || tool.source.url || '/'}`
95
+ : tool.source.type;
96
+ console.log(`${chalk.bold('Tool:')} ${chalk.cyan.bold(tool.name)}`);
97
+ console.log(` ${chalk.gray('Type:')} ${formatPermissionBadge(tool.permissions.type)}`);
98
+ console.log(` ${chalk.gray('Source:')} ${chalk.white(sourceInfo)}`);
99
+ console.log(` ${chalk.gray('Status:')} ${formatStatusBadge(tool.status)}`);
100
+ if (tool.description) {
101
+ console.log(` ${chalk.gray('Desc:')} ${chalk.gray(tool.description)}`);
102
+ }
103
+ console.log('');
104
+ }
105
+ const approvedCount = tools.filter(t => t.status === 'APPROVED').length;
106
+ const pendingCount = tools.filter(t => t.status === 'PENDING').length;
107
+ const blockedCount = tools.filter(t => t.status === 'BLOCKED').length;
108
+ console.log(`Summary: ${chalk.green(`${approvedCount} approved`)}, ${chalk.yellow(`${pendingCount} pending`)}, ${chalk.red(`${blockedCount} blocked`)} out of ${tools.length} total tools.\n`);
109
+ }
110
+ async function runInteractiveReview(tools, rootDir) {
111
+ try {
112
+ const action = await select({
113
+ message: 'Choose a review action:',
114
+ choices: [
115
+ { name: '✓ Approve all safe READ tools', value: 'approve-read' },
116
+ { name: '✓ Approve ALL candidate tools', value: 'approve-all' },
117
+ { name: '🔍 Review tools individually', value: 'individual' },
118
+ { name: '🚪 Done / Exit review', value: 'exit' }
119
+ ]
120
+ });
121
+ if (action === 'approve-read') {
122
+ const count = defaultConfigManager.bulkUpdateStatus(t => t.permissions.type === 'READ', 'APPROVED', rootDir);
123
+ logger.success(`Approved ${count} READ tools.`);
124
+ }
125
+ else if (action === 'approve-all') {
126
+ const count = defaultConfigManager.bulkUpdateStatus(() => true, 'APPROVED', rootDir);
127
+ logger.success(`Approved all ${count} tools.`);
128
+ }
129
+ else if (action === 'individual') {
130
+ for (const tool of tools) {
131
+ const choice = await select({
132
+ message: `Tool "${tool.name}" [${tool.permissions.type}] (${tool.source.method || ''} ${tool.source.path || ''})`,
133
+ choices: [
134
+ { name: 'Approve', value: 'APPROVED' },
135
+ { name: 'Reject', value: 'REJECTED' },
136
+ { name: 'Block', value: 'BLOCKED' },
137
+ { name: 'Keep current (' + tool.status + ')', value: 'KEEP' }
138
+ ]
139
+ });
140
+ if (choice !== 'KEEP') {
141
+ defaultConfigManager.updateToolStatus(tool.name, choice, rootDir);
142
+ }
143
+ }
144
+ logger.success('Individual review completed.');
145
+ }
146
+ }
147
+ catch {
148
+ // User cancelled interactive prompt
149
+ }
150
+ }
151
+ //# sourceMappingURL=review.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review.js","sourceRoot":"","sources":["../../../src/cli/commands/review.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Fridayy - Scan Command
3
+ * Analyzes the project or API and identifies available capabilities.
4
+ */
5
+ import { Command } from 'commander';
6
+ export declare function registerScanCommand(program: Command): void;
7
+ //# sourceMappingURL=scan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/scan.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWpC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAsE1D"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Fridayy - Scan Command
3
+ * Analyzes the project or API and identifies available capabilities.
4
+ */
5
+ import ora from 'ora';
6
+ import chalk from 'chalk';
7
+ import { defaultProjectScanner } from '../../core/discovery/project-scanner.js';
8
+ import { defaultToolGenerator } from '../../core/tool-generator/generator.js';
9
+ import { defaultConfigManager } from '../../config/config-manager.js';
10
+ import { DEFAULT_CONFIG } from '../../config/defaults.js';
11
+ import { printBanner } from '../ui/banner.js';
12
+ import { logger } from '../ui/logger.js';
13
+ export function registerScanCommand(program) {
14
+ program
15
+ .command('scan')
16
+ .description('Scan project or API to detect capabilities, endpoints, and candidate tools')
17
+ .option('--spec <path>', 'Path to OpenAPI specification file')
18
+ .action(async (options) => {
19
+ printBanner();
20
+ const rootDir = process.cwd();
21
+ const spinner = ora('Scanning project...').start();
22
+ try {
23
+ const scanResult = await defaultProjectScanner.scan(rootDir);
24
+ spinner.succeed('Scan completed.\n');
25
+ if (scanResult.hasOpenApi) {
26
+ logger.success('OpenAPI specification detected');
27
+ for (const spec of scanResult.details.openApiSpecs || []) {
28
+ console.log(` └─ ${chalk.cyan(spec.path)} (${spec.title}, ${spec.endpointsCount} endpoints)`);
29
+ }
30
+ }
31
+ if (scanResult.hasNodeJs) {
32
+ logger.success(`Node.js application detected (${chalk.cyan(scanResult.nodeJsFramework || 'standard')})`);
33
+ }
34
+ logger.success(`${scanResult.discoveredEndpointsCount} endpoints discovered`);
35
+ if (scanResult.authSchemesDetected.length > 0) {
36
+ logger.success(`Authentication detected: [${scanResult.authSchemesDetected.join(', ')}]`);
37
+ }
38
+ else {
39
+ logger.info('No explicit authentication schemes detected');
40
+ }
41
+ // Try generating candidate tools
42
+ let config;
43
+ if (defaultConfigManager.configExists(rootDir)) {
44
+ config = defaultConfigManager.loadConfig(rootDir);
45
+ }
46
+ else {
47
+ config = {
48
+ ...DEFAULT_CONFIG,
49
+ ...scanResult.recommendedConfig
50
+ };
51
+ if (options.spec) {
52
+ config.source = { type: 'openapi', path: options.spec };
53
+ }
54
+ }
55
+ const candidateTools = await defaultToolGenerator.generate({
56
+ config,
57
+ rootDir
58
+ });
59
+ console.log('\n' + chalk.bold('Candidate MCP tools:'));
60
+ candidateTools.forEach((tool, index) => {
61
+ const typeBadge = tool.permissions.type === 'READ'
62
+ ? chalk.green('READ')
63
+ : tool.permissions.type === 'WRITE'
64
+ ? chalk.yellow('WRITE')
65
+ : chalk.red.bold('DESTRUCTIVE');
66
+ console.log(` ${index + 1}. ${chalk.bold(tool.name)} [${typeBadge}] - ${tool.description}`);
67
+ });
68
+ console.log(`\n${chalk.bold.green(candidateTools.length)} tools generated.`);
69
+ console.log(`\nRun ${chalk.cyan('fridayy review')} to review and approve generated tools.`);
70
+ console.log(`Run ${chalk.cyan('fridayy start')} to launch the MCP server.\n`);
71
+ }
72
+ catch (err) {
73
+ spinner.fail(`Scan failed: ${err.message}`);
74
+ }
75
+ });
76
+ }
77
+ //# sourceMappingURL=scan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan.js","sourceRoot":"","sources":["../../../src/cli/commands/scan.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,qBAAqB,EAAE,MAAM,yCAAyC,CAAC;AAChF,OAAO,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAC;AAC9E,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAEzC,MAAM,UAAU,mBAAmB,CAAC,OAAgB;IAClD,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,4EAA4E,CAAC;SACzF,MAAM,CAAC,eAAe,EAAE,oCAAoC,CAAC;SAC7D,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,WAAW,EAAE,CAAC;QACd,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QAC9B,MAAM,OAAO,GAAG,GAAG,CAAC,qBAAqB,CAAC,CAAC,KAAK,EAAE,CAAC;QAEnD,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,MAAM,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC7D,OAAO,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;YAErC,IAAI,UAAU,CAAC,UAAU,EAAE,CAAC;gBAC1B,MAAM,CAAC,OAAO,CAAC,gCAAgC,CAAC,CAAC;gBACjD,KAAK,MAAM,IAAI,IAAI,UAAU,CAAC,OAAO,CAAC,YAAY,IAAI,EAAE,EAAE,CAAC;oBACzD,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,cAAc,aAAa,CAAC,CAAC;gBACjG,CAAC;YACH,CAAC;YAED,IAAI,UAAU,CAAC,SAAS,EAAE,CAAC;gBACzB,MAAM,CAAC,OAAO,CAAC,iCAAiC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,eAAe,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC;YAC3G,CAAC;YAED,MAAM,CAAC,OAAO,CAAC,GAAG,UAAU,CAAC,wBAAwB,uBAAuB,CAAC,CAAC;YAE9E,IAAI,UAAU,CAAC,mBAAmB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC9C,MAAM,CAAC,OAAO,CAAC,6BAA6B,UAAU,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC5F,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;YAC7D,CAAC;YAED,iCAAiC;YACjC,IAAI,MAAqB,CAAC;YAC1B,IAAI,oBAAoB,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC/C,MAAM,GAAG,oBAAoB,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YACpD,CAAC;iBAAM,CAAC;gBACN,MAAM,GAAG;oBACP,GAAG,cAAc;oBACjB,GAAI,UAAU,CAAC,iBAAmC;iBACnD,CAAC;gBACF,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;oBACjB,MAAM,CAAC,MAAM,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;gBAC1D,CAAC;YACH,CAAC;YAED,MAAM,cAAc,GAAG,MAAM,oBAAoB,CAAC,QAAQ,CAAC;gBACzD,MAAM;gBACN,OAAO;aACR,CAAC,CAAC;YAEH,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC;YACvD,cAAc,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;gBACrC,MAAM,SAAS,GACb,IAAI,CAAC,WAAW,CAAC,IAAI,KAAK,MAAM;oBAC9B,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC;oBACrB,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,KAAK,OAAO;wBACnC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC;wBACvB,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;gBACpC,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,SAAS,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;YAC/F,CAAC,CAAC,CAAC;YAEH,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;YAC7E,OAAO,CAAC,GAAG,CAAC,SAAS,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,yCAAyC,CAAC,CAAC;YAC5F,OAAO,CAAC,GAAG,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,8BAA8B,CAAC,CAAC;QAChF,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,OAAO,CAAC,IAAI,CAAC,gBAAgB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Fridayy - Start Command
3
+ * Boots the MCP server over Stdio or SSE transports.
4
+ */
5
+ import { Command } from 'commander';
6
+ export declare function registerStartCommand(program: Command): void;
7
+ //# sourceMappingURL=start.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/start.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAuD3D"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Fridayy - Start Command
3
+ * Boots the MCP server over Stdio or SSE transports.
4
+ */
5
+ import chalk from 'chalk';
6
+ import { defaultConfigManager } from '../../config/config-manager.js';
7
+ import { FridayyMcpServer } from '../../mcp/server/fridayy-server.js';
8
+ import { defaultAdapterRegistry } from '../../adapters/registry.js';
9
+ import { getBanner } from '../ui/banner.js';
10
+ export function registerStartCommand(program) {
11
+ program
12
+ .command('start')
13
+ .description('Start the Fridayy MCP server')
14
+ .option('-t, --transport <type>', 'Transport mechanism: stdio or sse', 'stdio')
15
+ .option('-p, --port <port>', 'Port number for SSE transport', '3000')
16
+ .option('-h, --host <host>', 'Host address for SSE transport', 'localhost')
17
+ .action(async (options) => {
18
+ const rootDir = process.cwd();
19
+ if (!defaultConfigManager.configExists(rootDir)) {
20
+ console.error(chalk.red('✖ Configuration not found. Run `fridayy init` first.'));
21
+ process.exit(1);
22
+ }
23
+ const config = defaultConfigManager.loadConfig(rootDir);
24
+ const tools = defaultConfigManager.loadTools(rootDir);
25
+ const server = new FridayyMcpServer({
26
+ config,
27
+ tools,
28
+ adapterRegistry: defaultAdapterRegistry
29
+ });
30
+ const exposedTools = server.getToolRegistry().getExposedTools();
31
+ if (exposedTools.length === 0) {
32
+ console.error(chalk.yellow('⚠ Warning: No tools are currently APPROVED. MCP clients will discover 0 tools.'));
33
+ console.error(chalk.gray(' Run `fridayy review --approve-read` or `fridayy review --approve-all` to approve tools.'));
34
+ }
35
+ const transport = options.transport || config.server?.transport || 'stdio';
36
+ if (transport === 'sse') {
37
+ const port = parseInt(options.port || String(config.server?.port || 3000), 10);
38
+ const host = options.host || config.server?.host || 'localhost';
39
+ console.log(getBanner());
40
+ console.log(chalk.green(`✓ Fridayy MCP Server (SSE) running at http://${host}:${port}`));
41
+ console.log(chalk.cyan(` - SSE Endpoint: http://${host}:${port}/sse`));
42
+ console.log(chalk.cyan(` - Messages Post: http://${host}:${port}/messages`));
43
+ console.log(chalk.cyan(` - Health Check: http://${host}:${port}/health`));
44
+ console.log(`\nExposing ${chalk.bold.green(exposedTools.length)} approved tools to MCP clients.`);
45
+ await server.startSse(port, host);
46
+ }
47
+ else {
48
+ // Stdio transport: Logs must go to stderr to preserve stdout for JSON-RPC
49
+ console.error(chalk.cyan(`[fridayy] Stdio MCP Server started with ${exposedTools.length} approved tools.`));
50
+ await server.startStdio();
51
+ }
52
+ });
53
+ }
54
+ //# sourceMappingURL=start.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.js","sourceRoot":"","sources":["../../../src/cli/commands/start.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AACtE,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,MAAM,UAAU,oBAAoB,CAAC,OAAgB;IACnD,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,8BAA8B,CAAC;SAC3C,MAAM,CAAC,wBAAwB,EAAE,mCAAmC,EAAE,OAAO,CAAC;SAC9E,MAAM,CAAC,mBAAmB,EAAE,+BAA+B,EAAE,MAAM,CAAC;SACpE,MAAM,CAAC,mBAAmB,EAAE,gCAAgC,EAAE,WAAW,CAAC;SAC1E,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QAE9B,IAAI,CAAC,oBAAoB,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC;YAChD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC,CAAC;YACjF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,MAAM,GAAG,oBAAoB,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QACxD,MAAM,KAAK,GAAG,oBAAoB,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAEtD,MAAM,MAAM,GAAG,IAAI,gBAAgB,CAAC;YAClC,MAAM;YACN,KAAK;YACL,eAAe,EAAE,sBAAsB;SACxC,CAAC,CAAC;QAEH,MAAM,YAAY,GAAG,MAAM,CAAC,eAAe,EAAE,CAAC,eAAe,EAAE,CAAC;QAEhE,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9B,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,MAAM,CAAC,gFAAgF,CAAC,CAC/F,CAAC;YACF,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,2FAA2F,CAAC,CAAC,CAAC;QACzH,CAAC;QAED,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,MAAM,CAAC,MAAM,EAAE,SAAS,IAAI,OAAO,CAAC;QAE3E,IAAI,SAAS,KAAK,KAAK,EAAE,CAAC;YACxB,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;YAC/E,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,MAAM,CAAC,MAAM,EAAE,IAAI,IAAI,WAAW,CAAC;YAEhE,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,gDAAgD,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC;YACzF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,8BAA8B,IAAI,IAAI,IAAI,MAAM,CAAC,CAAC,CAAC;YAC1E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,8BAA8B,IAAI,IAAI,IAAI,WAAW,CAAC,CAAC,CAAC;YAC/E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,8BAA8B,IAAI,IAAI,IAAI,SAAS,CAAC,CAAC,CAAC;YAC7E,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,iCAAiC,CAAC,CAAC;YAElG,MAAM,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACpC,CAAC;aAAM,CAAC;YACN,0EAA0E;YAC1E,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,IAAI,CAAC,2CAA2C,YAAY,CAAC,MAAM,kBAAkB,CAAC,CAC7F,CAAC;YACF,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;QAC5B,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Fridayy - Tools Command
3
+ * Lists available MCP tools with formatting, filter options, and JSON export.
4
+ */
5
+ import { Command } from 'commander';
6
+ export declare function registerToolsCommand(program: Command): void;
7
+ //# sourceMappingURL=tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/tools.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA4C3D"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Fridayy - Tools Command
3
+ * Lists available MCP tools with formatting, filter options, and JSON export.
4
+ */
5
+ import chalk from 'chalk';
6
+ import { defaultConfigManager } from '../../config/config-manager.js';
7
+ import { createToolsTable } from '../ui/tables.js';
8
+ import { printBanner } from '../ui/banner.js';
9
+ import { logger } from '../ui/logger.js';
10
+ export function registerToolsCommand(program) {
11
+ program
12
+ .command('tools')
13
+ .description('List available MCP tools and their approval status')
14
+ .option('--approved', 'Show only APPROVED tools')
15
+ .option('--pending', 'Show only PENDING tools')
16
+ .option('--blocked', 'Show only BLOCKED tools')
17
+ .option('--json', 'Output tools as JSON')
18
+ .action(async (options) => {
19
+ const rootDir = process.cwd();
20
+ if (!defaultConfigManager.configExists(rootDir)) {
21
+ logger.error('No configuration found. Run `fridayy init` first.');
22
+ return;
23
+ }
24
+ let tools = defaultConfigManager.loadTools(rootDir);
25
+ if (options.approved) {
26
+ tools = tools.filter(t => t.status === 'APPROVED');
27
+ }
28
+ else if (options.pending) {
29
+ tools = tools.filter(t => t.status === 'PENDING');
30
+ }
31
+ else if (options.blocked) {
32
+ tools = tools.filter(t => t.status === 'BLOCKED');
33
+ }
34
+ if (options.json) {
35
+ console.log(JSON.stringify(tools, null, 2));
36
+ return;
37
+ }
38
+ printBanner();
39
+ if (tools.length === 0) {
40
+ logger.warn('No tools matching filter criteria.');
41
+ return;
42
+ }
43
+ console.log(createToolsTable(tools) + '\n');
44
+ const approvedCount = tools.filter(t => t.status === 'APPROVED').length;
45
+ console.log(`Total shown: ${tools.length} (${chalk.green(`${approvedCount} approved and ready for AI models`)})\n`);
46
+ });
47
+ }
48
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../../src/cli/commands/tools.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AACtE,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,oBAAoB,CAAC,OAAgB;IACnD,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,oDAAoD,CAAC;SACjE,MAAM,CAAC,YAAY,EAAE,0BAA0B,CAAC;SAChD,MAAM,CAAC,WAAW,EAAE,yBAAyB,CAAC;SAC9C,MAAM,CAAC,WAAW,EAAE,yBAAyB,CAAC;SAC9C,MAAM,CAAC,QAAQ,EAAE,sBAAsB,CAAC;SACxC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QAE9B,IAAI,CAAC,oBAAoB,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC;YAChD,MAAM,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC;YAClE,OAAO;QACT,CAAC;QAED,IAAI,KAAK,GAAG,oBAAoB,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAEpD,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACrB,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC;QACrD,CAAC;aAAM,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YAC3B,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;QACpD,CAAC;aAAM,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YAC3B,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;QACpD,CAAC;QAED,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC5C,OAAO;QACT,CAAC;QAED,WAAW,EAAE,CAAC;QACd,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,MAAM,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;YAClD,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;QAE5C,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,MAAM,CAAC;QACxE,OAAO,CAAC,GAAG,CACT,gBAAgB,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,KAAK,CAAC,GAAG,aAAa,mCAAmC,CAAC,KAAK,CACvG,CAAC;IACJ,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Fridayy - Universal Application-to-MCP Platform CLI
4
+ */
5
+ import { Command } from 'commander';
6
+ export declare function createCli(): Command;
7
+ export declare function run(): Promise<void>;
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AACA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUpC,wBAAgB,SAAS,IAAI,OAAO,CAmBnC;AAED,wBAAsB,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,CAGzC"}
@@ -0,0 +1,42 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Fridayy - Universal Application-to-MCP Platform CLI
4
+ */
5
+ import { Command } from 'commander';
6
+ import { registerInitCommand } from './commands/init.js';
7
+ import { registerScanCommand } from './commands/scan.js';
8
+ import { registerGenerateCommand } from './commands/generate.js';
9
+ import { registerReviewCommand } from './commands/review.js';
10
+ import { registerStartCommand } from './commands/start.js';
11
+ import { registerToolsCommand } from './commands/tools.js';
12
+ import { registerConfigCommand } from './commands/config.js';
13
+ import { registerDoctorCommand } from './commands/doctor.js';
14
+ export function createCli() {
15
+ const program = new Command();
16
+ program
17
+ .name('fridayy')
18
+ .description('Universal Application-to-MCP Platform — Turn existing APIs into AI-ready MCP tools')
19
+ .version('1.0.0');
20
+ // Register commands
21
+ registerInitCommand(program);
22
+ registerScanCommand(program);
23
+ registerGenerateCommand(program);
24
+ registerReviewCommand(program);
25
+ registerStartCommand(program);
26
+ registerToolsCommand(program);
27
+ registerConfigCommand(program);
28
+ registerDoctorCommand(program);
29
+ return program;
30
+ }
31
+ export async function run() {
32
+ const program = createCli();
33
+ await program.parseAsync(process.argv);
34
+ }
35
+ // If directly executed
36
+ if (import.meta.url === `file://${process.argv[1]}` || process.argv[1]?.endsWith('fridayy') || process.argv[1]?.endsWith('index.ts') || process.argv[1]?.endsWith('index.js')) {
37
+ run().catch((err) => {
38
+ console.error('Fatal error:', err);
39
+ process.exit(1);
40
+ });
41
+ }
42
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AACA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,MAAM,UAAU,SAAS;IACvB,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAE9B,OAAO;SACJ,IAAI,CAAC,SAAS,CAAC;SACf,WAAW,CAAC,oFAAoF,CAAC;SACjG,OAAO,CAAC,OAAO,CAAC,CAAC;IAEpB,oBAAoB;IACpB,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC7B,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC7B,uBAAuB,CAAC,OAAO,CAAC,CAAC;IACjC,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC/B,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAC9B,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAC9B,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC/B,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAE/B,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,GAAG;IACvB,MAAM,OAAO,GAAG,SAAS,EAAE,CAAC;IAC5B,MAAM,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AACzC,CAAC;AAED,uBAAuB;AACvB,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,UAAU,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,SAAS,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,UAAU,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;IAC9K,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;QAClB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;QACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC"}