megabuff 0.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/config.js ADDED
@@ -0,0 +1,153 @@
1
+ import * as fs from "fs/promises";
2
+ import * as path from "path";
3
+ import { homedir } from "os";
4
+ const CONFIG_DIR = path.join(homedir(), ".megabuff");
5
+ const CONFIG_FILE = path.join(CONFIG_DIR, "config.json");
6
+ const SERVICE_NAME = "megabuff-cli";
7
+ const ACCOUNT_NAME = "openai-api-key";
8
+ /**
9
+ * Ensure config directory exists
10
+ */
11
+ async function ensureConfigDir() {
12
+ try {
13
+ await fs.mkdir(CONFIG_DIR, { recursive: true });
14
+ }
15
+ catch (error) {
16
+ // Directory might already exist, ignore
17
+ }
18
+ }
19
+ /**
20
+ * Read config file
21
+ */
22
+ async function readConfig() {
23
+ try {
24
+ const data = await fs.readFile(CONFIG_FILE, "utf-8");
25
+ return JSON.parse(data);
26
+ }
27
+ catch (error) {
28
+ return {};
29
+ }
30
+ }
31
+ /**
32
+ * Write config file
33
+ */
34
+ async function writeConfig(config) {
35
+ await ensureConfigDir();
36
+ await fs.writeFile(CONFIG_FILE, JSON.stringify(config, null, 2), "utf-8");
37
+ }
38
+ /**
39
+ * Get API key from keychain
40
+ */
41
+ async function getKeychainKey() {
42
+ try {
43
+ const keytar = await import("keytar");
44
+ return await keytar.getPassword(SERVICE_NAME, ACCOUNT_NAME);
45
+ }
46
+ catch (error) {
47
+ // Keychain not available or error
48
+ return null;
49
+ }
50
+ }
51
+ /**
52
+ * Set API key in keychain
53
+ */
54
+ async function setKeychainKey(apiKey) {
55
+ const keytar = await import("keytar");
56
+ await keytar.setPassword(SERVICE_NAME, ACCOUNT_NAME, apiKey);
57
+ }
58
+ /**
59
+ * Delete API key from keychain
60
+ */
61
+ async function deleteKeychainKey() {
62
+ try {
63
+ const keytar = await import("keytar");
64
+ await keytar.deletePassword(SERVICE_NAME, ACCOUNT_NAME);
65
+ }
66
+ catch (error) {
67
+ // Ignore if not found
68
+ }
69
+ }
70
+ /**
71
+ * Get API key with priority:
72
+ * 1. Command line flag
73
+ * 2. Environment variable
74
+ * 3. Keychain (if configured)
75
+ * 4. Config file
76
+ */
77
+ export async function getApiKey(cliKey) {
78
+ // Priority 1: CLI flag
79
+ if (cliKey) {
80
+ return cliKey;
81
+ }
82
+ // Priority 2: Environment variable
83
+ if (process.env.OPENAI_API_KEY) {
84
+ return process.env.OPENAI_API_KEY;
85
+ }
86
+ const config = await readConfig();
87
+ // Priority 3: Keychain
88
+ if (config.useKeychain) {
89
+ const keychainKey = await getKeychainKey();
90
+ if (keychainKey) {
91
+ return keychainKey;
92
+ }
93
+ }
94
+ // Priority 4: Config file
95
+ return config.apiKey;
96
+ }
97
+ /**
98
+ * Set API key in config or keychain
99
+ */
100
+ export async function setApiKey(apiKey, useKeychain = false) {
101
+ const config = await readConfig();
102
+ if (useKeychain) {
103
+ // Store in keychain
104
+ await setKeychainKey(apiKey);
105
+ // Update config to indicate keychain usage, but don't store the key
106
+ config.useKeychain = true;
107
+ delete config.apiKey;
108
+ }
109
+ else {
110
+ // Store in config file
111
+ config.apiKey = apiKey;
112
+ config.useKeychain = false;
113
+ // Remove from keychain if it was there
114
+ await deleteKeychainKey();
115
+ }
116
+ await writeConfig(config);
117
+ }
118
+ /**
119
+ * Get current configuration
120
+ */
121
+ export async function getConfig() {
122
+ return await readConfig();
123
+ }
124
+ /**
125
+ * Update configuration
126
+ */
127
+ export async function updateConfig(updates) {
128
+ const config = await readConfig();
129
+ Object.assign(config, updates);
130
+ await writeConfig(config);
131
+ }
132
+ /**
133
+ * Remove API key from config and keychain
134
+ */
135
+ export async function removeApiKey() {
136
+ const config = await readConfig();
137
+ delete config.apiKey;
138
+ config.useKeychain = false;
139
+ await writeConfig(config);
140
+ await deleteKeychainKey();
141
+ }
142
+ /**
143
+ * Check if API key is configured
144
+ */
145
+ export async function hasApiKey() {
146
+ const config = await readConfig();
147
+ if (config.useKeychain) {
148
+ const keychainKey = await getKeychainKey();
149
+ return !!keychainKey;
150
+ }
151
+ return !!config.apiKey;
152
+ }
153
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,220 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from "commander";
3
+ import * as fs from "fs/promises";
4
+ import * as readline from "readline/promises";
5
+ import OpenAI from "openai";
6
+ import * as clipboardy from "clipboardy";
7
+ import { getApiKey, setApiKey, removeApiKey, hasApiKey, getConfig } from "./config.js";
8
+ const program = new Command();
9
+ program
10
+ .name("megabuff")
11
+ .description("AI prompt optimizer CLI")
12
+ .version("0.1.0");
13
+ /**
14
+ * Get input from various sources with priority:
15
+ * 1. Inline argument
16
+ * 2. File input (--file flag)
17
+ * 3. Stdin pipe
18
+ * 4. Interactive prompt
19
+ */
20
+ async function getInput(inlinePrompt, options) {
21
+ // Priority 1: Inline argument
22
+ if (inlinePrompt) {
23
+ return inlinePrompt;
24
+ }
25
+ // Priority 2: File input
26
+ if (options.file) {
27
+ try {
28
+ return await fs.readFile(options.file, "utf-8");
29
+ }
30
+ catch (error) {
31
+ throw new Error(`Failed to read file: ${options.file}`);
32
+ }
33
+ }
34
+ // Priority 3: Check if stdin is piped
35
+ if (!process.stdin.isTTY) {
36
+ const chunks = [];
37
+ for await (const chunk of process.stdin) {
38
+ chunks.push(chunk);
39
+ }
40
+ return Buffer.concat(chunks).toString("utf-8").trim();
41
+ }
42
+ // Priority 4: Interactive prompt
43
+ const rl = readline.createInterface({
44
+ input: process.stdin,
45
+ output: process.stdout,
46
+ });
47
+ console.log("Enter your prompt (press Ctrl+D when done):");
48
+ const lines = [];
49
+ rl.on("line", (line) => {
50
+ lines.push(line);
51
+ });
52
+ return new Promise((resolve) => {
53
+ rl.on("close", () => {
54
+ resolve(lines.join("\n"));
55
+ });
56
+ });
57
+ }
58
+ // TODO
59
+ /**
60
+ * Optimize a prompt using OpenAI
61
+ */
62
+ async function optimizePrompt(prompt, apiKey) {
63
+ if (!apiKey) {
64
+ throw new Error("OpenAI API key not found. Set OPENAI_API_KEY environment variable.");
65
+ }
66
+ const openai = new OpenAI({ apiKey });
67
+ const systemPrompt = `You are an expert prompt engineer. Your task is to analyze and optimize prompts for AI language models.
68
+
69
+ When given a prompt, you should:
70
+ 1. Identify ambiguities or unclear instructions
71
+ 2. Add relevant context that would improve results
72
+ 3. Structure the prompt for clarity
73
+ 4. Specify expected output format if not present
74
+ 5. Make the prompt more specific and actionable
75
+
76
+ Return ONLY the optimized prompt, without explanations or meta-commentary.`;
77
+ try {
78
+ const response = await openai.chat.completions.create({
79
+ model: "gpt-4o-mini",
80
+ messages: [
81
+ { role: "system", content: systemPrompt },
82
+ { role: "user", content: `Optimize this prompt:\n\n${prompt}` }
83
+ ],
84
+ temperature: 0.7,
85
+ });
86
+ return response.choices[0]?.message?.content || "Error: No response from OpenAI";
87
+ }
88
+ catch (error) {
89
+ if (error instanceof Error) {
90
+ throw new Error(`OpenAI API error: ${error.message}`);
91
+ }
92
+ throw error;
93
+ }
94
+ }
95
+ /**
96
+ * Output the result based on options
97
+ */
98
+ async function outputResult(original, optimized, options) {
99
+ // Copy to clipboard by default (unless --no-copy is used)
100
+ if (options.copy !== false) {
101
+ try {
102
+ await clipboardy.default.write(optimized);
103
+ console.error("✓ Optimized prompt copied to clipboard");
104
+ }
105
+ catch (error) {
106
+ const errMsg = error instanceof Error ? error.message : String(error);
107
+ console.error(`⚠ Failed to copy to clipboard: ${errMsg}`);
108
+ }
109
+ }
110
+ // If output file specified, write to file
111
+ if (options.output) {
112
+ await fs.writeFile(options.output, optimized, "utf-8");
113
+ console.error(`✓ Optimized prompt saved to: ${options.output}`);
114
+ // Still print to stdout for piping
115
+ if (!options.interactive) {
116
+ console.log(optimized);
117
+ }
118
+ return;
119
+ }
120
+ // If interactive mode, show comparison
121
+ if (options.interactive) {
122
+ console.log("\n" + "=".repeat(50));
123
+ console.log("ORIGINAL PROMPT:");
124
+ console.log("=".repeat(50));
125
+ console.log(original);
126
+ console.log("\n" + "=".repeat(50));
127
+ console.log("OPTIMIZED PROMPT:");
128
+ console.log("=".repeat(50));
129
+ console.log(optimized);
130
+ console.log("=".repeat(50) + "\n");
131
+ return;
132
+ }
133
+ // Default: print to stdout (pipeable)
134
+ console.log(optimized);
135
+ }
136
+ // Config command
137
+ const configCmd = program
138
+ .command("config")
139
+ .description("Manage configuration");
140
+ configCmd
141
+ .command("set")
142
+ .description("Set your OpenAI API key")
143
+ .argument("<api-key>", "Your OpenAI API key")
144
+ .option("--keychain", "Store in system keychain (more secure)")
145
+ .action(async (apiKey, options) => {
146
+ try {
147
+ await setApiKey(apiKey, options.keychain || false);
148
+ if (options.keychain) {
149
+ console.log("✓ API key saved securely in system keychain");
150
+ }
151
+ else {
152
+ console.log("✓ API key saved to config file at ~/.megabuff/config.json");
153
+ console.log(" Tip: Use --keychain flag for more secure storage");
154
+ }
155
+ }
156
+ catch (error) {
157
+ console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);
158
+ process.exit(1);
159
+ }
160
+ });
161
+ configCmd
162
+ .command("show")
163
+ .description("Show current configuration")
164
+ .action(async () => {
165
+ try {
166
+ const config = await getConfig();
167
+ const hasKey = await hasApiKey();
168
+ console.log("Current configuration:");
169
+ console.log(` API Key: ${hasKey ? "✓ Configured" : "✗ Not configured"}`);
170
+ console.log(` Storage: ${config.useKeychain ? "System Keychain" : "Config File"}`);
171
+ console.log(` Model: ${config.model || "gpt-4o-mini (default)"}`);
172
+ console.log(`\nConfig location: ~/.megabuff/config.json`);
173
+ }
174
+ catch (error) {
175
+ console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);
176
+ process.exit(1);
177
+ }
178
+ });
179
+ configCmd
180
+ .command("remove")
181
+ .description("Remove saved API key")
182
+ .action(async () => {
183
+ try {
184
+ await removeApiKey();
185
+ console.log("✓ API key removed from config and keychain");
186
+ }
187
+ catch (error) {
188
+ console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);
189
+ process.exit(1);
190
+ }
191
+ });
192
+ // Optimize command
193
+ program
194
+ .command("optimize")
195
+ .description("Optimize an AI prompt")
196
+ .argument("[prompt]", "The prompt to optimize (or omit to use other input methods)")
197
+ .option("-f, --file <path>", "Read prompt from file")
198
+ .option("-o, --output <path>", "Write optimized prompt to file")
199
+ .option("-i, --interactive", "Show interactive comparison view")
200
+ .option("--no-copy", "Don't copy optimized prompt to clipboard (copy is default)")
201
+ .option("-k, --api-key <key>", "OpenAI API key (overrides saved config)")
202
+ .action(async (inlinePrompt, options) => {
203
+ try {
204
+ const original = await getInput(inlinePrompt, options);
205
+ if (!original.trim()) {
206
+ console.error("Error: No prompt provided");
207
+ process.exit(1);
208
+ }
209
+ // Get API key with priority: CLI flag > env var > keychain > config file
210
+ const apiKey = await getApiKey(options.apiKey);
211
+ const optimized = await optimizePrompt(original, apiKey);
212
+ await outputResult(original, optimized, options);
213
+ }
214
+ catch (error) {
215
+ console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);
216
+ process.exit(1);
217
+ }
218
+ });
219
+ program.parse();
220
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
Binary file
package/package.json ADDED
@@ -0,0 +1,49 @@
1
+ {
2
+ "name": "megabuff",
3
+ "version": "0.1.0",
4
+ "description": "AI-powered prompt optimizer CLI with BYOK (Bring Your Own Key) support for OpenAI",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "scripts": {
8
+ "test": "echo \"Error: no test specified\" && exit 1",
9
+ "build": "tsc",
10
+ "dev": "tsx src/index.ts",
11
+ "prepublishOnly": "npm run build"
12
+ },
13
+ "keywords": [
14
+ "ai",
15
+ "prompt",
16
+ "optimizer",
17
+ "openai",
18
+ "cli",
19
+ "chatgpt",
20
+ "prompt-engineering",
21
+ "byok",
22
+ "gpt-4",
23
+ "command-line"
24
+ ],
25
+ "author": "thesupermegabuff <your.email@example.com>",
26
+ "license": "MIT",
27
+ "repository": {
28
+ "type": "git",
29
+ "url": "https://github.com/thesupermegabuff/megabuff-cli.git"
30
+ },
31
+ "bugs": {
32
+ "url": "https://github.com/thesupermegabuff/megabuff-cli/issues"
33
+ },
34
+ "homepage": "https://github.com/thesupermegabuff/megabuff-cli#readme",
35
+ "dependencies": {
36
+ "commander": "^14.0.2",
37
+ "openai": "^4.77.3",
38
+ "keytar": "^7.9.0",
39
+ "clipboardy": "^4.0.0"
40
+ },
41
+ "devDependencies": {
42
+ "@types/node": "^25.0.3",
43
+ "tsx": "^4.21.0",
44
+ "typescript": "^5.9.3"
45
+ },
46
+ "bin": {
47
+ "megabuff": "./dist/index.js"
48
+ }
49
+ }