Big News: Socket raises $60M Series C at a $1B valuation to secure software supply chains for AI-driven development.Announcement
Sign In

aicontext-commit

Package Overview
Dependencies
Maintainers
1
Versions
3
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

aicontext-commit - npm Package Compare versions

Comparing version
0.1.0
to
0.1.1
+9
dist/security.d.ts
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"}

@@ -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 +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"}

@@ -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 +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,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":""}
"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"}

@@ -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"}
{
"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"

# 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).