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/LICENSE +661 -0
- package/PUBLISHING.md +165 -0
- package/README.md +402 -0
- package/dist/config.d.ts +35 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +153 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +220 -0
- package/dist/index.js.map +1 -0
- package/megabuff-0.1.0.tgz +0 -0
- package/package.json +49 -0
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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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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
|
+
}
|