@esha_susan/mockingbird-cli 1.0.0 → 1.1.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.
package/dist/cli/cli.js CHANGED
@@ -8,12 +8,19 @@ const generator_1 = require("../generator/generator");
8
8
  const writer_1 = require("../writer/writer");
9
9
  const reporter_1 = require("../reporter/reporter");
10
10
  const logger_1 = require("../utils/logger");
11
+ const init_1 = require("./init");
11
12
  function runCLI() {
12
13
  const program = new commander_1.Command();
13
14
  program
14
15
  .name("mockingbird")
15
16
  .description("AI-powered Jest test generator for Express.js APIs")
16
17
  .version("1.0.0");
18
+ program
19
+ .command("init")
20
+ .description("Set up your Gemini API key for Mockingbird")
21
+ .action(async () => {
22
+ await (0, init_1.runInit)();
23
+ });
17
24
  program
18
25
  .command("run")
19
26
  .description("Scan a project and generate Jest tests for its API routes")
@@ -0,0 +1,102 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.runInit = runInit;
40
+ const fs = __importStar(require("fs"));
41
+ const path = __importStar(require("path"));
42
+ const inquirer_1 = __importDefault(require("inquirer"));
43
+ const logger_1 = require("../utils/logger");
44
+ async function runInit() {
45
+ console.log("\n🐦 Welcome to Mockingbird CLI!\n");
46
+ (0, logger_1.logInfo)("To generate tests, you need a free Google Gemini API key.");
47
+ (0, logger_1.logInfo)("Get one at: https://aistudio.google.com\n");
48
+ const answers = await inquirer_1.default.prompt([
49
+ {
50
+ type: "password",
51
+ name: "apiKey",
52
+ message: "Enter your Gemini API key:",
53
+ mask: "*",
54
+ validate: (input) => {
55
+ if (!input || input.trim().length === 0) {
56
+ return "API key cannot be empty";
57
+ }
58
+ return true;
59
+ }
60
+ }
61
+ ]);
62
+ const envPath = path.resolve(process.cwd(), ".env");
63
+ const envContent = `GEMINI_API_KEY=${answers.apiKey.trim()}\n`;
64
+ try {
65
+ if (fs.existsSync(envPath)) {
66
+ // Read existing .env content
67
+ const existingContent = fs.readFileSync(envPath, "utf-8");
68
+ if (existingContent.includes("GEMINI_API_KEY")) {
69
+ // Key already exists — ask before overwriting just that line
70
+ const overwrite = await inquirer_1.default.prompt([
71
+ {
72
+ type: "confirm",
73
+ name: "confirm",
74
+ message: "GEMINI_API_KEY already exists in .env. Update it?",
75
+ default: false
76
+ }
77
+ ]);
78
+ if (!overwrite.confirm) {
79
+ (0, logger_1.logInfo)("Keeping existing GEMINI_API_KEY. Setup cancelled.");
80
+ return;
81
+ }
82
+ // Replace just the GEMINI_API_KEY line, leave everything else untouched
83
+ const updatedContent = existingContent.replace(/GEMINI_API_KEY=.*/, `GEMINI_API_KEY=${answers.apiKey.trim()}`);
84
+ fs.writeFileSync(envPath, updatedContent, "utf-8");
85
+ }
86
+ else {
87
+ // .env exists but no GEMINI_API_KEY — safely append it
88
+ fs.appendFileSync(envPath, `\nGEMINI_API_KEY=${answers.apiKey.trim()}\n`, "utf-8");
89
+ }
90
+ }
91
+ else {
92
+ // No .env exists — create a fresh one
93
+ fs.writeFileSync(envPath, envContent, "utf-8");
94
+ }
95
+ (0, logger_1.logSuccess)("\n.env updated successfully!");
96
+ (0, logger_1.logSuccess)("You're all set. Run: mockingbird run <path-to-your-project>");
97
+ }
98
+ catch (error) {
99
+ const message = error instanceof Error ? error.message : "Unknown error";
100
+ (0, logger_1.logError)(`Failed to update .env file: ${message}`);
101
+ }
102
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@esha_susan/mockingbird-cli",
3
- "version": "1.0.0",
3
+ "version": "1.1.0",
4
4
  "description": "AI-powered test generation CLI for Express.js backends",
5
5
  "main": "dist/index.js",
6
6
  "bin": {
@@ -31,9 +31,11 @@
31
31
  "chalk": "^4.1.2",
32
32
  "commander": "^15.0.0",
33
33
  "dotenv": "^17.4.2",
34
+ "inquirer": "^8.2.7",
34
35
  "prettier": "^3.8.3"
35
36
  },
36
37
  "devDependencies": {
38
+ "@types/inquirer": "^8.2.13",
37
39
  "@types/jest": "^30.0.0",
38
40
  "@types/node": "^25.9.1",
39
41
  "jest": "^30.4.2",