aicontext-commit
Advanced tools
| export declare const AI_API_KEY_NAMES: readonly ["ANTHROPIC_API_KEY", "OPENAI_API_KEY"]; | ||
| export type RedactionResult = { | ||
| text: string; | ||
| redactionCount: number; | ||
| }; | ||
| export declare function redactSecrets(text: string): RedactionResult; | ||
| export declare function readConfigValue(name: string): string | undefined; | ||
| export declare function sanitizeEnvForGit(env?: NodeJS.ProcessEnv): NodeJS.ProcessEnv; | ||
| //# sourceMappingURL=security.d.ts.map |
| {"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../src/security.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,gBAAgB,kDAAmD,CAAA;AAwChF,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,cAAc,EAAE,MAAM,CAAA;CACvB,CAAA;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,CAY3D;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAchE;AAED,wBAAgB,iBAAiB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAAC,UAAU,CAWzF"} |
| "use strict"; | ||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||
| exports.AI_API_KEY_NAMES = void 0; | ||
| exports.redactSecrets = redactSecrets; | ||
| exports.readConfigValue = readConfigValue; | ||
| exports.sanitizeEnvForGit = sanitizeEnvForGit; | ||
| const fs_1 = require("fs"); | ||
| const path_1 = require("path"); | ||
| const dotenv_1 = require("dotenv"); | ||
| exports.AI_API_KEY_NAMES = ['ANTHROPIC_API_KEY', 'OPENAI_API_KEY']; | ||
| const REDACTION = '[REDACTED]'; | ||
| const SENSITIVE_ENV_KEY_PATTERN = /(?:^|_)(?:API_?KEY|ACCESS_?KEY|ACCESS_?TOKEN|AUTH_?TOKEN|TOKEN|SECRET|PASSWORD|PRIVATE_?KEY|CREDENTIALS?)(?:_|$)/i; | ||
| const REDACTION_PATTERNS = [ | ||
| { | ||
| pattern: /-----BEGIN [A-Z ]*PRIVATE KEY-----[\s\S]*?-----END [A-Z ]*PRIVATE KEY-----/g, | ||
| replacement: REDACTION | ||
| }, | ||
| { | ||
| pattern: /(\b[A-Z0-9_-]*(?:API[_-]?KEY|ACCESS[_-]?KEY|TOKEN|SECRET|PASSWORD|PRIVATE[_-]?KEY|CLIENT[_-]?SECRET)[A-Z0-9_-]*\b\s*[:=]\s*)(["']?)([^\s"'`]+)(\2)/gi, | ||
| replacement: (_match, prefix, quote, _secret, closingQuote) => `${prefix}${quote}${REDACTION}${closingQuote}` | ||
| }, | ||
| { | ||
| pattern: /\b(Bearer\s+)[A-Za-z0-9._~+/=-]{16,}/gi, | ||
| replacement: (_match, prefix) => `${prefix}${REDACTION}` | ||
| }, | ||
| { | ||
| pattern: /\b(?:sk-(?:ant-|proj-)?|gh[pousr]_|xox[baprs]-)[A-Za-z0-9_-]{16,}\b/g, | ||
| replacement: REDACTION | ||
| }, | ||
| { | ||
| pattern: /\b(?:AKIA|ASIA)[0-9A-Z]{16}\b/g, | ||
| replacement: REDACTION | ||
| }, | ||
| { | ||
| pattern: /\beyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\b/g, | ||
| replacement: REDACTION | ||
| } | ||
| ]; | ||
| function redactSecrets(text) { | ||
| let redactionCount = 0; | ||
| let redacted = text; | ||
| for (const { pattern, replacement } of REDACTION_PATTERNS) { | ||
| redacted = redacted.replace(pattern, (...matches) => { | ||
| redactionCount += 1; | ||
| return typeof replacement === 'function' ? replacement(...matches) : replacement; | ||
| }); | ||
| } | ||
| return { text: redacted, redactionCount }; | ||
| } | ||
| function readConfigValue(name) { | ||
| const envValue = process.env[name]?.trim(); | ||
| if (envValue) | ||
| return envValue; | ||
| const dotenvPath = (0, path_1.resolve)(process.cwd(), '.env'); | ||
| if (!(0, fs_1.existsSync)(dotenvPath)) | ||
| return undefined; | ||
| try { | ||
| const parsed = (0, dotenv_1.parse)((0, fs_1.readFileSync)(dotenvPath, 'utf-8')); | ||
| const dotenvValue = parsed[name]?.trim(); | ||
| return dotenvValue || undefined; | ||
| } | ||
| catch { | ||
| return undefined; | ||
| } | ||
| } | ||
| function sanitizeEnvForGit(env = process.env) { | ||
| const sanitized = {}; | ||
| for (const [key, value] of Object.entries(env)) { | ||
| if (value === undefined) | ||
| continue; | ||
| if (exports.AI_API_KEY_NAMES.includes(key)) | ||
| continue; | ||
| if (SENSITIVE_ENV_KEY_PATTERN.test(key)) | ||
| continue; | ||
| sanitized[key] = value; | ||
| } | ||
| return sanitized; | ||
| } | ||
| //# sourceMappingURL=security.js.map |
| {"version":3,"file":"security.js","sourceRoot":"","sources":["../src/security.ts"],"names":[],"mappings":"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"} |
+1
-1
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"ai.d.ts","sourceRoot":"","sources":["../src/ai.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,UAAU,GAAG,WAAW,GAAG,QAAQ,CAAA;AAY/C,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAO7D;AAED,wBAAgB,gCAAgC,CAAC,MAAM,EAAE,MAAM;;;;;;;EAM9D;AAED,wBAAsB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAuD9E"} | ||
| {"version":3,"file":"ai.d.ts","sourceRoot":"","sources":["../src/ai.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,UAAU,GAAG,WAAW,GAAG,QAAQ,CAAA;AAuB/C,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAO7D;AAED,wBAAgB,gCAAgC,CAAC,MAAM,EAAE,MAAM;;;;;;;EAM9D;AAED,wBAAsB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CA0D9E"} |
+16
-9
@@ -12,7 +12,11 @@ "use strict"; | ||
| const errors_1 = require("./errors"); | ||
| const security_1 = require("./security"); | ||
| const AI_REQUEST_TIMEOUT_MS = 30000; | ||
| function detectProvider() { | ||
| if (process.env.ANTHROPIC_API_KEY) | ||
| return 'anthropic'; | ||
| if (process.env.OPENAI_API_KEY) | ||
| return 'openai'; | ||
| const anthropicApiKey = (0, security_1.readConfigValue)(security_1.AI_API_KEY_NAMES[0]); | ||
| if (anthropicApiKey) | ||
| return { provider: 'anthropic', apiKey: anthropicApiKey }; | ||
| const openaiApiKey = (0, security_1.readConfigValue)(security_1.AI_API_KEY_NAMES[1]); | ||
| if (openaiApiKey) | ||
| return { provider: 'openai', apiKey: openaiApiKey }; | ||
| throw new errors_1.CliError({ | ||
@@ -40,7 +44,7 @@ code: 'MISSING_API_KEY', | ||
| async function generateCommitMessages(prompt) { | ||
| const provider = detectProvider(); | ||
| const { provider, apiKey } = detectProvider(); | ||
| let rawText = ''; | ||
| try { | ||
| if (provider === 'anthropic') { | ||
| const client = new sdk_1.default(); | ||
| const client = new sdk_1.default({ apiKey, timeout: AI_REQUEST_TIMEOUT_MS }); | ||
| const response = await client.messages.create({ | ||
@@ -61,3 +65,3 @@ model: 'claude-sonnet-4-20250514', | ||
| else { | ||
| const client = new openai_1.default(); | ||
| const client = new openai_1.default({ apiKey, timeout: AI_REQUEST_TIMEOUT_MS }); | ||
| const response = await client.chat.completions.create(buildOpenAIChatCompletionRequest(prompt)); | ||
@@ -75,3 +79,3 @@ rawText = response.choices[0]?.message?.content ?? ''; | ||
| 'Check your connection, the API key, and the provider status.', | ||
| (0, errors_1.messageFromUnknown)(error) | ||
| (0, security_1.redactSecrets)((0, errors_1.messageFromUnknown)(error)).text | ||
| ], | ||
@@ -83,2 +87,3 @@ cause: error | ||
| if (suggestions.length !== 3) { | ||
| const redactedResponse = (0, security_1.redactSecrets)(rawText).text; | ||
| throw new errors_1.CliError({ | ||
@@ -89,3 +94,5 @@ code: 'AI_PARSE_ERROR', | ||
| 'Regenerate the suggestions or write the message manually.', | ||
| `Model response: ${truncate(rawText)}` | ||
| process.env.DEBUG | ||
| ? `Model response: ${truncate(redactedResponse)}` | ||
| : 'Set DEBUG=1 to inspect the redacted raw model response.' | ||
| ] | ||
@@ -92,0 +99,0 @@ }); |
+1
-1
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"ai.js","sourceRoot":"","sources":["../src/ai.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"ai.js","sourceRoot":"","sources":["../src/ai.ts"],"names":[],"mappings":"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"} |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../src/git.ts"],"names":[],"mappings":"AAKA,wBAAgB,aAAa,IAAI,MAAM,CAyCtC;AA0BD,wBAAgB,gBAAgB,CAAC,CAAC,GAAE,MAAW,GAAG,MAAM,CAWvD"} | ||
| {"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../src/git.ts"],"names":[],"mappings":"AAUA,wBAAgB,aAAa,IAAI,MAAM,CA2CtC;AA4BD,wBAAgB,gBAAgB,CAAC,CAAC,GAAE,MAAW,GAAG,MAAM,CAcvD"} |
+22
-5
@@ -8,8 +8,15 @@ "use strict"; | ||
| const MAX_STAGED_DIFF_CHARACTERS = 60000; | ||
| const MAX_GIT_OUTPUT_BYTES = 1000000; | ||
| const GIT_COMMAND_TIMEOUT_MS = 10000; | ||
| const GIT_LOG_TIMEOUT_MS = 5000; | ||
| const DEFAULT_COMMIT_HISTORY_LIMIT = 30; | ||
| const MAX_COMMIT_HISTORY_LIMIT = 100; | ||
| function getStagedDiff() { | ||
| try { | ||
| ensureGitWorkTree(); | ||
| const diff = (0, child_process_1.execFileSync)('git', ['diff', '--cached'], { | ||
| const diff = (0, child_process_1.execFileSync)('git', ['diff', '--cached', '--no-ext-diff', '--no-color'], { | ||
| encoding: 'utf-8', | ||
| stdio: ['ignore', 'pipe', 'pipe'] | ||
| stdio: ['ignore', 'pipe', 'pipe'], | ||
| timeout: GIT_COMMAND_TIMEOUT_MS, | ||
| maxBuffer: MAX_GIT_OUTPUT_BYTES | ||
| }); | ||
@@ -55,3 +62,5 @@ if (!diff.trim()) { | ||
| encoding: 'utf-8', | ||
| stdio: ['ignore', 'pipe', 'pipe'] | ||
| stdio: ['ignore', 'pipe', 'pipe'], | ||
| timeout: GIT_COMMAND_TIMEOUT_MS, | ||
| maxBuffer: MAX_GIT_OUTPUT_BYTES | ||
| }); | ||
@@ -77,5 +86,8 @@ if (isInsideWorkTree.trim() === 'true') | ||
| try { | ||
| const commits = (0, child_process_1.execFileSync)('git', ['log', '--oneline', `-${n}`], { | ||
| const limit = normalizeCommitLimit(n); | ||
| const commits = (0, child_process_1.execFileSync)('git', ['log', `-${limit}`, '--format=%h %s'], { | ||
| encoding: 'utf-8', | ||
| stdio: ['ignore', 'pipe', 'pipe'] | ||
| stdio: ['ignore', 'pipe', 'pipe'], | ||
| timeout: GIT_LOG_TIMEOUT_MS, | ||
| maxBuffer: MAX_GIT_OUTPUT_BYTES | ||
| }); | ||
@@ -90,2 +102,7 @@ if (!commits.trim()) | ||
| } | ||
| function normalizeCommitLimit(n) { | ||
| if (!Number.isInteger(n) || n <= 0) | ||
| return DEFAULT_COMMIT_HISTORY_LIMIT; | ||
| return Math.min(n, MAX_COMMIT_HISTORY_LIMIT); | ||
| } | ||
| //# sourceMappingURL=git.js.map |
+1
-1
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"git.js","sourceRoot":"","sources":["../src/git.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"git.js","sourceRoot":"","sources":["../src/git.ts"],"names":[],"mappings":"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"} |
+1
-1
@@ -1,2 +0,2 @@ | ||
| import 'dotenv/config'; | ||
| export {}; | ||
| //# sourceMappingURL=index.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAA"} | ||
| {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""} |
+92
-10
| "use strict"; | ||
| var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { | ||
| if (k2 === undefined) k2 = k; | ||
| var desc = Object.getOwnPropertyDescriptor(m, k); | ||
| if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { | ||
| desc = { enumerable: true, get: function() { return m[k]; } }; | ||
| } | ||
| Object.defineProperty(o, k2, desc); | ||
| }) : (function(o, m, k, k2) { | ||
| if (k2 === undefined) k2 = k; | ||
| o[k2] = m[k]; | ||
| })); | ||
| var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { | ||
| Object.defineProperty(o, "default", { enumerable: true, value: v }); | ||
| }) : function(o, v) { | ||
| o["default"] = v; | ||
| }); | ||
| var __importStar = (this && this.__importStar) || (function () { | ||
| var ownKeys = function(o) { | ||
| ownKeys = Object.getOwnPropertyNames || function (o) { | ||
| var ar = []; | ||
| for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; | ||
| return ar; | ||
| }; | ||
| return ownKeys(o); | ||
| }; | ||
| return function (mod) { | ||
| if (mod && mod.__esModule) return mod; | ||
| var result = {}; | ||
| if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); | ||
| __setModuleDefault(result, mod); | ||
| return result; | ||
| }; | ||
| })(); | ||
| var __importDefault = (this && this.__importDefault) || function (mod) { | ||
@@ -6,5 +39,5 @@ return (mod && mod.__esModule) ? mod : { "default": mod }; | ||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||
| require("dotenv/config"); | ||
| const picocolors_1 = __importDefault(require("picocolors")); | ||
| const prompts_1 = require("@inquirer/prompts"); | ||
| const input_1 = __importDefault(require("@inquirer/input")); | ||
| const select_1 = __importDefault(require("@inquirer/select")); | ||
| const git_1 = require("./git"); | ||
@@ -14,4 +47,46 @@ const prompt_1 = require("./prompt"); | ||
| const child_process_1 = require("child_process"); | ||
| const readline = __importStar(require("readline")); | ||
| const errors_1 = require("./errors"); | ||
| const security_1 = require("./security"); | ||
| function editableInput(promptText, initialValue) { | ||
| return new Promise((resolve, reject) => { | ||
| const rl = readline.createInterface({ input: process.stdin, output: process.stdout, terminal: true }); | ||
| process.stdout.write(promptText); | ||
| rl.write(initialValue); | ||
| rl.once('line', (line) => { | ||
| rl.close(); | ||
| resolve(line.trim() || initialValue); | ||
| }); | ||
| rl.once('SIGINT', () => { | ||
| rl.close(); | ||
| process.stdout.write('\n'); | ||
| const err = new Error('User force closed the prompt'); | ||
| err.name = 'ExitPromptError'; | ||
| reject(err); | ||
| }); | ||
| }); | ||
| } | ||
| const VERSION = '0.1.0'; | ||
| const GIT_COMMIT_TIMEOUT_MS = 60000; | ||
| const HELP = ` | ||
| Usage: aicontext-commit [options] | ||
| Generate AI-powered commit messages from your staged changes. | ||
| Options: | ||
| -v, --version Show version number | ||
| -h, --help Show this help message | ||
| Before running, stage your changes with git add. | ||
| `.trim(); | ||
| async function main() { | ||
| const args = process.argv.slice(2); | ||
| if (args.includes('--version') || args.includes('-v')) { | ||
| console.log(VERSION); | ||
| process.exit(0); | ||
| } | ||
| if (args.includes('--help') || args.includes('-h')) { | ||
| console.log(HELP); | ||
| process.exit(0); | ||
| } | ||
| // 1. Read git | ||
@@ -21,9 +96,15 @@ console.log(picocolors_1.default.dim('Reading staged changes...')); | ||
| const commits = (0, git_1.getRecentCommits)(30); | ||
| const redactedDiff = (0, security_1.redactSecrets)(diff); | ||
| const redactedCommits = (0, security_1.redactSecrets)(commits); | ||
| const redactionCount = redactedDiff.redactionCount + redactedCommits.redactionCount; | ||
| if (redactionCount > 0) { | ||
| console.log(picocolors_1.default.yellow(`Redacted ${redactionCount} potential secret(s) before sending context to AI.`)); | ||
| } | ||
| // 2. Generate suggestions | ||
| console.log(picocolors_1.default.dim('Generating suggestions...')); | ||
| const prompt = (0, prompt_1.buildPrompt)(diff, commits); | ||
| const prompt = (0, prompt_1.buildPrompt)(redactedDiff.text, redactedCommits.text); | ||
| let suggestions = await (0, ai_1.generateCommitMessages)(prompt); | ||
| // 3. Show options to the user | ||
| while (true) { | ||
| const choice = await (0, prompts_1.select)({ | ||
| const choice = await (0, select_1.default)({ | ||
| message: picocolors_1.default.green('Choose a commit message:'), | ||
@@ -42,3 +123,3 @@ choices: [ | ||
| if (choice === 'manual') { | ||
| const manual = await (0, prompts_1.input)({ message: 'Write your commit message:' }); | ||
| const manual = await (0, input_1.default)({ message: 'Write your commit message:' }); | ||
| if (manual.trim()) { | ||
@@ -51,6 +132,3 @@ doCommit(manual.trim()); | ||
| const selected = suggestions[Number(choice)]; | ||
| const edited = await (0, prompts_1.input)({ | ||
| message: 'Edit the message if needed (Enter to confirm):', | ||
| default: selected | ||
| }); | ||
| const edited = await editableInput(picocolors_1.default.green('?') + ' Edit if needed (Enter to confirm): ', selected); | ||
| doCommit(edited.trim()); | ||
@@ -62,3 +140,7 @@ break; | ||
| try { | ||
| (0, child_process_1.execFileSync)('git', ['commit', '-m', message], { stdio: 'inherit' }); | ||
| (0, child_process_1.execFileSync)('git', ['commit', '-m', message], { | ||
| stdio: 'inherit', | ||
| timeout: GIT_COMMIT_TIMEOUT_MS, | ||
| env: (0, security_1.sanitizeEnvForGit)() | ||
| }); | ||
| console.log(picocolors_1.default.green('✓ Commit created')); | ||
@@ -65,0 +147,0 @@ } |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"} |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../src/prompt.ts"],"names":[],"mappings":"AAAA,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,CAqDvE"} | ||
| {"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../src/prompt.ts"],"names":[],"mappings":"AAAA,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,CAuDvE"} |
+11
-6
@@ -6,2 +6,4 @@ "use strict"; | ||
| const hasHistory = recentCommits.trim().length > 0; | ||
| const safeDiff = escapeCodeFence(diff); | ||
| const safeRecentCommits = escapeCodeFence(recentCommits); | ||
| const styleSection = hasHistory | ||
@@ -11,3 +13,3 @@ ? `## Repository style | ||
| ${recentCommits} | ||
| ${safeRecentCommits} | ||
@@ -21,7 +23,2 @@ ` | ||
| ${styleSection}## Staged changes | ||
| \`\`\`diff | ||
| ${diff} | ||
| \`\`\` | ||
| ## Instructions | ||
@@ -53,2 +50,7 @@ - Generate EXACTLY 3 commit message suggestions | ||
| ${styleSection}## Staged changes | ||
| \`\`\`diff | ||
| ${safeDiff} | ||
| \`\`\` | ||
| ## Response format | ||
@@ -60,2 +62,5 @@ Return ONLY this, with no additional text: | ||
| } | ||
| function escapeCodeFence(text) { | ||
| return text.replace(/```/g, '``\\`'); | ||
| } | ||
| //# sourceMappingURL=prompt.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../src/prompt.ts"],"names":[],"mappings":";;AAAA,kCAqDC;AArDD,SAAgB,WAAW,CAAC,IAAY,EAAE,aAAqB;IAC7D,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAA;IAElD,MAAM,YAAY,GAAG,UAAU;QAC7B,CAAC,CAAC;;;EAGJ,aAAa;;CAEd;QACG,CAAC,CAAC;;;CAGL,CAAA;IAEC,OAAO;;EAEP,YAAY;;EAEZ,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aAiCO,CAAA;AACb,CAAC"} | ||
| {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../src/prompt.ts"],"names":[],"mappings":";;AAAA,kCAuDC;AAvDD,SAAgB,WAAW,CAAC,IAAY,EAAE,aAAqB;IAC7D,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAA;IAClD,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAI,CAAC,CAAA;IACtC,MAAM,iBAAiB,GAAG,eAAe,CAAC,aAAa,CAAC,CAAA;IAExD,MAAM,YAAY,GAAG,UAAU;QAC7B,CAAC,CAAC;;;EAGJ,iBAAiB;;CAElB;QACG,CAAC,CAAC;;;CAGL,CAAA;IAEC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4BP,YAAY;;EAEZ,QAAQ;;;;;;;aAOG,CAAA;AACb,CAAC;AAED,SAAS,eAAe,CAAC,IAAY;IACnC,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AACtC,CAAC"} |
+4
-5
| { | ||
| "name": "aicontext-commit", | ||
| "version": "0.1.0", | ||
| "description": "CLI tool that generates commit messages by analyzing the repository history with AI", | ||
| "version": "0.1.1", | ||
| "description": "AI commit messages that match your team's style — reads your last 30 commits to learn your conventions before suggesting anything", | ||
| "bin": { | ||
@@ -40,6 +40,5 @@ "aicontext-commit": "./bin/index.js", | ||
| "@anthropic-ai/sdk": "^0.92.0", | ||
| "@inquirer/prompts": "^4.0.0", | ||
| "commander": "^12.0.0", | ||
| "@inquirer/input": "^2.3.0", | ||
| "@inquirer/select": "^2.5.0", | ||
| "dotenv": "^17.4.2", | ||
| "execa": "^8.0.0", | ||
| "openai": "^4.28.0", | ||
@@ -46,0 +45,0 @@ "picocolors": "^1.0.0" |
+7
-5
| # aicontext-commit | ||
| > CLI that writes your commit messages by reading the staged diff **and** the repo's history — so suggestions match the style, language, and conventions you already use. | ||
| > Commit messages that sound like **your team** wrote them, not a generic LLM. `acc` reads your last 30 commits before writing a single word — matching your style, language, and conventions automatically. | ||
@@ -18,3 +18,3 @@ `acc` looks at what you have staged with `git add`, scans your recent commits to learn how *this* project writes commits, and asks an LLM (Anthropic or OpenAI) for **3 ready-to-use suggestions**. Pick one, tweak it, or regenerate. | ||
| - 🤝 **Two providers** — works with Anthropic (Claude) or OpenAI; uses whichever key you have set | ||
| - 🛡️ **Safe by design** — won't run without staged changes, refuses oversized diffs, treats history and diff as data (not as instructions) | ||
| - 🛡️ **Safe by design** — won't run without staged changes, refuses oversized diffs, redacts common secrets, and treats history and diff as data | ||
@@ -45,3 +45,3 @@ ## Installation | ||
| If both are set, Anthropic is used. You can also drop them into a `.env` file in your project root — `acc` loads it automatically. See `.env.example` for the format. | ||
| If both are set, Anthropic is used. You can also drop them into a `.env` file in your project root. `acc` reads only the supported API key names from that file and does not inject the whole file into the process environment. See `.env.example` for the format. | ||
@@ -96,3 +96,5 @@ ## Usage | ||
| - **Diff over ~60k characters** → refuses and asks you to split the commit. Keeps token usage and quality predictable. | ||
| - **Prompt injection** → the prompt explicitly tells the model to treat the diff and history as data, not instructions. | ||
| - **Secret redaction** → common API keys, bearer tokens, private keys, and credential assignments are redacted before the diff/history is sent to the model. | ||
| - **Prompt injection** → instructions are placed before untrusted repo data, code fences are escaped, and the prompt tells the model to treat the diff and history as data. | ||
| - **Git hooks** → `git commit` runs with a sanitized environment so API keys and secret-looking variables are not passed to hooks. | ||
@@ -148,2 +150,2 @@ ## Development | ||
| MIT © Samuel Fernandez — see [LICENSE](./LICENSE). | ||
| MIT © Samuel Fernandez — see [LICENSE](./LICENSE). |
Shell access
Supply chain riskThis module accesses the system shell. Accessing the system shell increases the risk of executing arbitrary code.
Found 1 instance in 1 package
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 2 instances in 1 package
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
Found 1 instance in 1 package
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
Found 1 instance in 1 package
Shell access
Supply chain riskThis module accesses the system shell. Accessing the system shell increases the risk of executing arbitrary code.
Found 1 instance in 1 package
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 3 instances in 1 package
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
Found 1 instance in 1 package
48895
40.9%6
-14.29%29
16%597
48.14%148
2.07%6
50%+ Added
+ Added
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed