@anonymous-dev/0x0-git-linux-x64-baseline-musl 2.0.0 → 2.2.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/bin/0x0-git +0 -0
- package/bin/index.js.map +15 -0
- package/package.json +1 -1
package/bin/0x0-git
CHANGED
|
Binary file
|
package/bin/index.js.map
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["src/config.ts", "src/llm.ts", "src/git.ts", "src/prompt.ts", "src/hook.ts", "src/index.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"export type Provider = \"claude\" | \"codex\"\n\nexport interface Config {\n provider: Provider\n model: string\n url: string\n auth?: { username: string; password: string }\n verbose: boolean\n}\n\nconst DEFAULT_MODELS: Record<Provider, string> = {\n claude: \"claude-haiku-4-5-20251001\",\n codex: \"o4-mini\",\n}\n\n/**\n * Resolve provider and model from CLI flags > env vars > auto-detect.\n */\nexport function resolveConfig(flags?: {\n provider?: string\n model?: string\n verbose?: boolean\n}): Config {\n const provider = resolveProvider(flags?.provider)\n const model =\n flags?.model ||\n process.env.GIT_AI_MODEL ||\n DEFAULT_MODELS[provider]\n\n const url = process.env.GIT_AI_URL || \"http://localhost:4096\"\n\n const auth = process.env.GIT_AI_AUTH\n ? (() => {\n const [username, password] = process.env.GIT_AI_AUTH!.split(\":\")\n return username && password ? { username, password } : undefined\n })()\n : undefined\n\n const verbose = flags?.verbose || process.env.GIT_AI_DEBUG === \"1\"\n\n return { provider, model, url, auth, verbose }\n}\n\nfunction resolveProvider(flag?: string): Provider {\n // CLI flag\n if (flag === \"claude\" || flag === \"codex\") return flag\n\n // Env var\n const env = process.env.GIT_AI_PROVIDER\n if (env === \"claude\" || env === \"codex\") return env\n\n // Auto-detect: prefer claude\n if (Bun.which(\"claude\")) return \"claude\"\n if (Bun.which(\"codex\")) return \"codex\"\n\n throw new Error(\n \"No LLM provider found. Install Claude Code CLI (claude) or OpenAI Codex CLI (codex).\",\n )\n}\n",
|
|
6
|
+
"import type { Config } from \"./config\"\n\nfunction createDebug(verbose: boolean) {\n return (msg: string) => {\n if (verbose) process.stderr.write(`[debug] ${msg}\\n`)\n }\n}\n\nasync function isServerUp(baseUrl: string): Promise<boolean> {\n try {\n await fetch(baseUrl.replace(/\\/$/, \"\"), { signal: AbortSignal.timeout(1_000) })\n return true\n } catch {\n return false\n }\n}\n\nasync function ensureServer(baseUrl: string, debug: (msg: string) => void): Promise<void> {\n if (await isServerUp(baseUrl)) {\n debug(`server already running at ${baseUrl}`)\n return\n }\n\n const binary = Bun.which(\"0x0\")\n if (!binary) throw new Error(\"0x0 not found in PATH. Cannot auto-start server.\")\n\n const port = new URL(baseUrl).port || \"4096\"\n debug(`spawning server: ${binary} server --port ${port}`)\n process.stderr.write(\"Starting 0x0 server...\\n\")\n\n const proc = Bun.spawn([binary, \"server\", \"--port\", port], {\n detached: true,\n stdout: \"ignore\",\n stderr: \"ignore\",\n stdin: \"ignore\",\n })\n proc.unref()\n\n const deadline = Date.now() + 15_000\n let dots = 0\n while (Date.now() < deadline) {\n await new Promise<void>((r) => setTimeout(r, 300))\n if (await isServerUp(baseUrl)) {\n if (dots > 0) process.stderr.write(\"\\n\")\n return\n }\n process.stderr.write(\".\")\n dots++\n }\n\n if (dots > 0) process.stderr.write(\"\\n\")\n throw new Error(\"0x0 server did not start within 15 seconds.\")\n}\n\n/**\n * One-shot text generation via the 0x0 server's /completion/text endpoint.\n * Returns the generated text or throws on failure.\n */\nexport async function generate(config: Config, prompt: string): Promise<string> {\n const debug = createDebug(config.verbose)\n\n debug(`config: url=${config.url} provider=${config.provider} model=${config.model} auth=${config.auth ? \"yes\" : \"no\"}`)\n\n await ensureServer(config.url, debug)\n\n const url = `${config.url.replace(/\\/$/, \"\")}/completion/text`\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n }\n\n if (config.auth) {\n const credentials = btoa(`${config.auth.username}:${config.auth.password}`)\n headers[\"Authorization\"] = `Basic ${credentials}`\n }\n\n const body: Record<string, unknown> = { prompt }\n if (config.model) body.model = config.model\n\n debug(`POST ${url} (auth=${config.auth ? \"yes\" : \"no\"})`)\n debug(`request body: ${JSON.stringify(body)}`)\n\n let response: Response\n try {\n response = await fetch(url, {\n method: \"POST\",\n headers,\n body: JSON.stringify(body),\n signal: AbortSignal.timeout(60_000),\n })\n } catch (err) {\n throw new Error(`Failed to connect to 0x0 server at ${config.url}`, { cause: err })\n }\n\n debug(`response: ${response.status} ${response.statusText}`)\n debug(`response headers: content-type=${response.headers.get(\"content-type\")}`)\n\n if (!response.ok) {\n const errorBody = await response.text().catch(() => \"Unknown error\")\n debug(`error response body: ${errorBody}`)\n throw new Error(`Server error (${response.status}): ${errorBody}`)\n }\n\n if (!response.body) {\n throw new Error(\"No response body from server\")\n }\n\n // Read SSE stream and collect delta text\n const reader = response.body.getReader()\n const decoder = new TextDecoder()\n let buffer = \"\"\n const parts: string[] = []\n\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n\n buffer += decoder.decode(value, { stream: true })\n\n while (true) {\n const newlinePos = buffer.indexOf(\"\\n\")\n if (newlinePos === -1) break\n\n const line = buffer.slice(0, newlinePos)\n buffer = buffer.slice(newlinePos + 1)\n\n if (!line.startsWith(\"data:\")) continue\n\n const jsonStr = line.slice(5).trim()\n if (!jsonStr) continue\n\n try {\n const parsed = JSON.parse(jsonStr)\n if (parsed.type === \"delta\" && parsed.text) {\n parts.push(parsed.text)\n debug(`stream: delta chunk=${parsed.text.length}b total=${parts.length}`)\n } else if (parsed.type === \"error\") {\n debug(`stream: error — ${parsed.error}`)\n throw new Error(parsed.error || \"Server stream error\")\n } else if (parsed.type === \"done\") {\n debug(`stream: done`)\n } else {\n debug(`stream: unexpected event type=${parsed.type} data=${jsonStr.slice(0, 200)}`)\n }\n } catch (err) {\n // Re-throw errors from parsed server error events\n if (err instanceof SyntaxError) {\n debug(`stream: malformed JSON chunk: ${jsonStr.slice(0, 200)}`)\n continue\n }\n throw err\n }\n }\n }\n\n const text = parts.join(\"\").trim()\n debug(`result: ${parts.length} deltas, ${text.length} chars`)\n\n if (!text) {\n throw new Error(\"No response text from server\")\n }\n\n return text\n}\n",
|
|
7
|
+
"const MAX_DIFF_CHARS = 20_000\n\nexport interface StagedContext {\n diff: string\n files: string[]\n}\n\n/**\n * Get staged changes context for commit message generation.\n * Throws if nothing is staged.\n */\nexport async function getStagedContext(): Promise<StagedContext> {\n const files = await run([\"git\", \"diff\", \"--cached\", \"--name-only\"])\n const fileList = files\n .split(\"\\n\")\n .map((f) => f.trim())\n .filter(Boolean)\n\n if (fileList.length === 0) {\n throw new Error(\"No staged changes. Stage files with `git add` first.\")\n }\n\n let diff = await run([\"git\", \"diff\", \"--cached\"])\n\n // Truncate large diffs but always keep the file list\n if (diff.length > MAX_DIFF_CHARS) {\n diff =\n diff.slice(0, MAX_DIFF_CHARS) +\n \"\\n\\n[diff truncated — full file list below]\\n\"\n }\n\n return { diff, files: fileList }\n}\n\nasync function run(cmd: string[]): Promise<string> {\n const proc = Bun.spawn(cmd, {\n stdout: \"pipe\",\n stderr: \"pipe\",\n })\n\n const text = await new Response(proc.stdout).text()\n const exitCode = await proc.exited\n\n if (exitCode !== 0) {\n const stderr = await new Response(proc.stderr).text()\n throw new Error(`${cmd.join(\" \")} failed: ${stderr}`)\n }\n\n return text\n}\n",
|
|
8
|
+
"import type { StagedContext } from \"./git\"\n\n/**\n * Build the prompt for commit message generation.\n */\nexport function buildPrompt(ctx: StagedContext): string {\n const fileSection = ctx.files.map((f) => `- ${f}`).join(\"\\n\")\n\n return `You are a commit message generator. Output ONLY the commit message, nothing else.\n\nRules:\n- Use Conventional Commits format: <type>(<scope>): <description>\n- Types: feat, fix, refactor, docs, style, test, chore, perf, ci, build\n- Scope is optional — use the most relevant module/area if obvious\n- Keep the subject line under 72 characters\n- Use imperative mood (\"add\" not \"added\")\n- Add a body after a blank line only if the changes warrant explanation\n- Do NOT wrap the message in quotes or code blocks\n\nFiles changed:\n${fileSection}\n\nDiff:\n${ctx.diff}`\n}\n",
|
|
9
|
+
"import { existsSync } from \"fs\"\nimport { readFile, writeFile, mkdir, chmod } from \"fs/promises\"\nimport { join, resolve, basename, dirname } from \"path\"\n\nconst MARKER_START = \"# 0x0-git:start\"\nconst MARKER_END = \"# 0x0-git:end\"\n\n/**\n * Build the hook script with an embedded absolute path to 0x0-git.\n * Falls back to PATH lookup so the hook still works if the binary moves.\n */\nfunction buildHookScript(): string {\n // Resolve the absolute path at install time so the hook works in\n // environments with a restricted PATH (e.g. nvim launched from a GUI).\n const binPath = Bun.which(\"0x0-git\")\n\n const resolveCmd = binPath\n ? `ZEROXZERO_GIT=\"${binPath}\"\n if [ ! -x \"$ZEROXZERO_GIT\" ]; then\n command -v 0x0-git >/dev/null 2>&1 && ZEROXZERO_GIT=\"0x0-git\" || return 0\n fi`\n : `command -v 0x0-git >/dev/null 2>&1 || return 0\n ZEROXZERO_GIT=\"0x0-git\"`\n\n return `${MARKER_START}\n# AI commit message generation — https://github.com/anonymous-dev-org/0x0\n__0x0_git_hook() {\n ${resolveCmd}\n COMMIT_MSG_FILE=\"$1\"\n COMMIT_SOURCE=\"$2\"\n # Skip if message already provided (-m), merge, squash, or amend\n if [ -z \"$COMMIT_SOURCE\" ]; then\n MSG=$(\"$ZEROXZERO_GIT\" commit-msg 2>/dev/null) || true\n if [ -n \"$MSG\" ]; then\n printf '%s\\\\n' \"$MSG\" > \"$COMMIT_MSG_FILE\"\n fi\n fi\n}\n__0x0_git_hook \"$@\"\n${MARKER_END}`\n}\n\n/**\n * Resolve the hooks directory for the current git repo.\n * Checks core.hooksPath first (husky compatibility), then falls back to .git/hooks.\n */\nasync function getRepoRoot(): Promise<string> {\n const proc = Bun.spawn([\"git\", \"rev-parse\", \"--show-toplevel\"], {\n stdout: \"pipe\",\n stderr: \"pipe\",\n })\n const root = (await new Response(proc.stdout).text()).trim()\n const exitCode = await proc.exited\n if (exitCode !== 0) {\n throw new Error(\"Not a git repository\")\n }\n return root\n}\n\n/**\n * Detect if a directory is a husky v9 internal `_/` stub directory.\n * Husky v9 sets core.hooksPath to `.husky/_` and puts an `h` dispatcher there.\n * User scripts go in the parent `.husky/` directory.\n */\nfunction isHuskyStubDir(dir: string): boolean {\n return basename(dir) === \"_\" && existsSync(join(dir, \"h\"))\n}\n\nasync function getHooksDir(): Promise<{ hooksDir: string; huskyDir?: string }> {\n const repoRoot = await getRepoRoot()\n\n // Check git config for custom hooks path\n try {\n const proc = Bun.spawn([\"git\", \"config\", \"core.hooksPath\"], {\n stdout: \"pipe\",\n stderr: \"pipe\",\n })\n const text = await new Response(proc.stdout).text()\n const exitCode = await proc.exited\n if (exitCode === 0 && text.trim()) {\n const resolved = resolve(repoRoot, text.trim())\n\n // Husky v9: core.hooksPath points to .husky/_ (stub dir).\n // User hook scripts belong in the parent .husky/ directory.\n if (isHuskyStubDir(resolved)) {\n return { hooksDir: dirname(resolved), huskyDir: resolved }\n }\n\n return { hooksDir: resolved }\n }\n } catch {\n // fall through\n }\n\n // Find .git directory (resolve relative to repo root)\n const proc = Bun.spawn([\"git\", \"rev-parse\", \"--git-dir\"], {\n stdout: \"pipe\",\n stderr: \"pipe\",\n })\n const gitDir = (await new Response(proc.stdout).text()).trim()\n await proc.exited\n\n return { hooksDir: join(resolve(repoRoot, gitDir), \"hooks\") }\n}\n\nexport async function installHook(): Promise<string> {\n const { hooksDir, huskyDir } = await getHooksDir()\n const hookPath = join(hooksDir, \"prepare-commit-msg\")\n\n await mkdir(hooksDir, { recursive: true })\n\n // If husky v9 was detected, clean up any previous mis-install in the stub dir\n if (huskyDir) {\n const stubPath = join(huskyDir, \"prepare-commit-msg\")\n if (existsSync(stubPath)) {\n const stubContent = await readFile(stubPath, \"utf-8\")\n if (stubContent.includes(MARKER_START)) {\n const re = new RegExp(\n `\\\\n*${escapeRegex(MARKER_START)}[\\\\s\\\\S]*?${escapeRegex(MARKER_END)}\\\\n*`,\n )\n const cleaned = stubContent.replace(re, \"\\n\")\n await writeFile(stubPath, cleaned)\n }\n }\n }\n\n let existing = \"\"\n if (existsSync(hookPath)) {\n existing = await readFile(hookPath, \"utf-8\")\n\n // Already installed\n if (existing.includes(MARKER_START)) {\n return `Hook already installed at ${hookPath}`\n }\n }\n\n // Build new hook content\n const hookScript = buildHookScript()\n let content: string\n if (existing) {\n // Append to existing hook\n content = existing.trimEnd() + \"\\n\\n\" + hookScript + \"\\n\"\n } else {\n content = \"#!/bin/sh\\n\\n\" + hookScript + \"\\n\"\n }\n\n await writeFile(hookPath, content)\n await chmod(hookPath, 0o755)\n\n return `Hook installed at ${hookPath}`\n}\n\nexport async function uninstallHook(): Promise<string> {\n const { hooksDir, huskyDir } = await getHooksDir()\n\n // Also check the husky stub dir for a previous mis-install\n const candidates = [join(hooksDir, \"prepare-commit-msg\")]\n if (huskyDir) {\n candidates.push(join(huskyDir, \"prepare-commit-msg\"))\n }\n\n let removed = false\n for (const hookPath of candidates) {\n if (!existsSync(hookPath)) continue\n const content = await readFile(hookPath, \"utf-8\")\n if (!content.includes(MARKER_START)) continue\n\n // Remove our section (including surrounding blank lines)\n const re = new RegExp(\n `\\\\n*${escapeRegex(MARKER_START)}[\\\\s\\\\S]*?${escapeRegex(MARKER_END)}\\\\n*`,\n )\n let cleaned = content.replace(re, \"\\n\")\n\n // If only the shebang remains, remove the file entirely\n if (cleaned.replace(/^#!.*\\n?/, \"\").trim() === \"\") {\n const { unlink } = await import(\"fs/promises\")\n await unlink(hookPath)\n if (!removed) removed = true\n continue\n }\n\n await writeFile(hookPath, cleaned)\n removed = true\n }\n\n if (!removed) {\n return \"0x0-git hook not found in prepare-commit-msg\"\n }\n\n return `Hook removed from ${candidates[0]}`\n}\n\nfunction escapeRegex(s: string): string {\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")\n}\n",
|
|
10
|
+
"import { resolveConfig } from \"./config\"\nimport { generate } from \"./llm\"\nimport { getStagedContext } from \"./git\"\nimport { buildPrompt } from \"./prompt\"\nimport { installHook, uninstallHook } from \"./hook\"\n\nconst args = process.argv.slice(2)\nconst command = args[0]\n\nfunction parseFlags(args: string[]): { provider?: string; model?: string; verbose?: boolean } {\n const flags: { provider?: string; model?: string; verbose?: boolean } = {}\n for (let i = 0; i < args.length; i++) {\n if (args[i] === \"--provider\" && args[i + 1]) {\n flags.provider = args[++i]\n } else if (args[i] === \"--model\" && args[i + 1]) {\n flags.model = args[++i]\n } else if (args[i] === \"--verbose\") {\n flags.verbose = true\n }\n }\n return flags\n}\n\nasync function commitMsg() {\n const flags = parseFlags(args)\n const config = resolveConfig(flags)\n process.stderr.write(`Provider: ${config.provider} (${config.model})\\n`)\n process.stderr.write(\"Reading staged changes...\\n\")\n const ctx = await getStagedContext()\n process.stderr.write(`${ctx.files.length} file${ctx.files.length === 1 ? \"\" : \"s\"} staged\\n`)\n const prompt = buildPrompt(ctx)\n process.stderr.write(\"Generating commit message...\\n\")\n const message = await generate(config, prompt)\n process.stderr.write(\"Done\\n\")\n process.stdout.write(message + \"\\n\")\n}\n\nasync function hookCommand() {\n const sub = args[1]\n if (sub === \"install\") {\n const result = await installHook()\n console.log(result)\n } else if (sub === \"uninstall\") {\n const result = await uninstallHook()\n console.log(result)\n } else {\n console.error(\"Usage: 0x0-git hook [install|uninstall]\")\n process.exit(1)\n }\n}\n\nasync function main() {\n try {\n switch (command) {\n case \"commit-msg\":\n await commitMsg()\n break\n case \"hook\":\n await hookCommand()\n break\n default:\n console.error(\n `Usage:\n 0x0-git commit-msg [--provider claude|codex] [--model <model>] [--verbose]\n 0x0-git hook install\n 0x0-git hook uninstall`,\n )\n process.exit(1)\n }\n } catch (err: any) {\n process.stderr.write(`\\nError: ${err.message}\\n`)\n if (err.cause) {\n process.stderr.write(`Cause: ${err.cause.message ?? err.cause}\\n`)\n }\n process.exit(1)\n }\n}\n\nmain()\n"
|
|
11
|
+
],
|
|
12
|
+
"mappings": "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",
|
|
13
|
+
"debugId": "2979AFD944B049F464756E2164756E21",
|
|
14
|
+
"names": []
|
|
15
|
+
}
|