vibe-code-explainer 0.1.9 → 0.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/README.md +121 -59
- package/dist/{chunk-IIUJ6UAO.js → chunk-2PUO5G3C.js} +75 -2
- package/dist/chunk-2PUO5G3C.js.map +1 -0
- package/dist/chunk-5NCRRHU7.js +89 -0
- package/dist/chunk-5NCRRHU7.js.map +1 -0
- package/dist/{chunk-OXXWT37Z.js → chunk-SWGQLRTO.js} +24 -11
- package/dist/chunk-SWGQLRTO.js.map +1 -0
- package/dist/{chunk-QTQXXXT4.js → chunk-YS2XIZIA.js} +29 -12
- package/dist/chunk-YS2XIZIA.js.map +1 -0
- package/dist/cli/index.js +4 -4
- package/dist/{config-NF5WYSJB.js → config-H57D4GXB.js} +38 -8
- package/dist/config-H57D4GXB.js.map +1 -0
- package/dist/hooks/post-tool.js +9 -7
- package/dist/hooks/post-tool.js.map +1 -1
- package/dist/{init-5ZJML72X.js → init-KUVD2YGA.js} +110 -31
- package/dist/init-KUVD2YGA.js.map +1 -0
- package/dist/{ollama-Z5EWJ4H6.js → ollama-34TOVCUY.js} +3 -2
- package/dist/schema-TBXFNCIG.js +17 -0
- package/dist/uninstall-CNGJWJYQ.js +101 -0
- package/dist/uninstall-CNGJWJYQ.js.map +1 -0
- package/package.json +4 -4
- package/dist/chunk-IIUJ6UAO.js.map +0 -1
- package/dist/chunk-OXXWT37Z.js.map +0 -1
- package/dist/chunk-PGDNR7HQ.js +0 -50
- package/dist/chunk-PGDNR7HQ.js.map +0 -1
- package/dist/chunk-QTQXXXT4.js.map +0 -1
- package/dist/config-NF5WYSJB.js.map +0 -1
- package/dist/init-5ZJML72X.js.map +0 -1
- package/dist/schema-SJTKT73Y.js +0 -11
- package/dist/uninstall-BXMUKVRD.js +0 -63
- package/dist/uninstall-BXMUKVRD.js.map +0 -1
- /package/dist/{ollama-Z5EWJ4H6.js.map → ollama-34TOVCUY.js.map} +0 -0
- /package/dist/{schema-SJTKT73Y.js.map → schema-TBXFNCIG.js.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli/config.ts"],"sourcesContent":["import { intro, outro, select, confirm, text, cancel, isCancel, note } from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { existsSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { DEFAULT_CONFIG, loadConfig, type Config, type Engine, type DetailLevel } from \"../config/schema.js\";\nimport { MODEL_OPTIONS } from \"../detect/vram.js\";\n\nconst CONFIG_FILE = \"code-explainer.config.json\";\n\nfunction handleCancel<T>(value: T | symbol): asserts value is T {\n if (isCancel(value)) {\n cancel(\"Exited without saving.\");\n process.exit(0);\n }\n}\n\nfunction renderCurrent(config: Config): string {\n const hooks: string[] = [];\n if (config.hooks.edit) hooks.push(\"Edit\");\n if (config.hooks.write) hooks.push(\"Write\");\n if (config.hooks.bash) hooks.push(\"Bash\");\n\n const excluded = config.exclude.length > 0 ? config.exclude.join(\", \") : \"(none)\";\n const timeoutLabel =\n config.skipIfSlowMs === 0 ? \"Never skip\" : `${Math.round(config.skipIfSlowMs / 1000)}s`;\n\n return [\n `${pc.bold(\"Engine: \")} ${config.engine === \"ollama\" ? \"Local LLM (Ollama)\" : \"Claude Code (native)\"}`,\n `${pc.bold(\"Model: \")} ${config.ollamaModel}`,\n `${pc.bold(\"Ollama URL: \")} ${config.ollamaUrl}`,\n `${pc.bold(\"Detail level: \")} ${config.detailLevel}`,\n `${pc.bold(\"Hooks: \")} ${hooks.join(\" \\u2713 \") || \"(all disabled)\"}`,\n `${pc.bold(\"Excluded: \")} ${excluded}`,\n `${pc.bold(\"Skip if slow: \")} ${timeoutLabel}`,\n ].join(\"\\n\");\n}\n\ntype MenuChoice =\n | \"engine\"\n | \"model\"\n | \"url\"\n | \"detail\"\n | \"hooks\"\n | \"exclude\"\n | \"timeout\"\n | \"back\";\n\nasync function changeEngine(config: Config): Promise<Config> {\n const value = await select<Engine>({\n message: \"Explanation engine\",\n options: [\n { label: \"Local LLM (Ollama)\", value: \"ollama\", hint: \"free, private, works offline\" },\n { label: \"Claude Code (native)\", value: \"claude\", hint: \"best quality, uses API tokens\" },\n ],\n initialValue: config.engine,\n });\n handleCancel(value);\n return { ...config, engine: value };\n}\n\nasync function changeModel(config: Config): Promise<Config> {\n const value = await select({\n message: \"Ollama model\",\n options: MODEL_OPTIONS.map((m) => ({\n label: m.label,\n value: m.model,\n hint: m.hint,\n })),\n initialValue: config.ollamaModel,\n });\n handleCancel(value);\n return { ...config, ollamaModel: value };\n}\n\nasync function changeUrl(config: Config): Promise<Config> {\n const value = await text({\n message: \"Ollama endpoint URL\",\n initialValue: config.ollamaUrl,\n validate(v) {\n try {\n new URL(v);\n return;\n } catch {\n return \"Must be a valid URL (e.g., http://localhost:11434)\";\n }\n },\n });\n handleCancel(value);\n return { ...config, ollamaUrl: value };\n}\n\nasync function changeDetail(config: Config): Promise<Config> {\n const value = await select<DetailLevel>({\n message: \"Detail level\",\n options: [\n { label: \"Standard\", value: \"standard\", hint: \"1-2 sentence explanation per change (recommended)\" },\n { label: \"Minimal\", value: \"minimal\", hint: \"one short sentence per change\" },\n { label: \"Verbose\", value: \"verbose\", hint: \"detailed bullet-point breakdown\" },\n ],\n initialValue: config.detailLevel,\n });\n handleCancel(value);\n return { ...config, detailLevel: value };\n}\n\nasync function changeHooks(config: Config): Promise<Config> {\n const editOn = await confirm({ message: \"Explain file edits?\", initialValue: config.hooks.edit });\n handleCancel(editOn);\n const writeOn = await confirm({ message: \"Explain new files?\", initialValue: config.hooks.write });\n handleCancel(writeOn);\n const bashOn = await confirm({\n message: \"Explain destructive Bash commands (rm, git reset, etc.)?\",\n initialValue: config.hooks.bash,\n });\n handleCancel(bashOn);\n\n return {\n ...config,\n hooks: { edit: editOn, write: writeOn, bash: bashOn },\n };\n}\n\nasync function changeExclude(config: Config): Promise<Config> {\n const action = await select({\n message: `Current exclusions: ${config.exclude.join(\", \") || \"(none)\"}`,\n options: [\n { label: \"Add a pattern\", value: \"add\", hint: \"e.g., *.generated.*\" },\n { label: \"Remove a pattern\", value: \"remove\" },\n { label: \"Reset to defaults\", value: \"reset\", hint: DEFAULT_CONFIG.exclude.join(\", \") },\n { label: \"Back\", value: \"back\" },\n ],\n });\n handleCancel(action);\n\n if (action === \"back\") return config;\n if (action === \"reset\") return { ...config, exclude: [...DEFAULT_CONFIG.exclude] };\n\n if (action === \"add\") {\n const pattern = await text({ message: \"Glob pattern to exclude (e.g., *.generated.*)\" });\n handleCancel(pattern);\n if (!pattern.trim()) return config;\n const exclude = Array.from(new Set([...config.exclude, pattern.trim()]));\n return { ...config, exclude };\n }\n\n if (action === \"remove\") {\n if (config.exclude.length === 0) {\n note(\"No exclusions to remove.\", \"Exclusions\");\n return config;\n }\n const target = await select({\n message: \"Which pattern to remove?\",\n options: config.exclude.map((p) => ({ label: p, value: p })),\n });\n handleCancel(target);\n const exclude = config.exclude.filter((p) => p !== target);\n return { ...config, exclude };\n }\n\n return config;\n}\n\nasync function changeTimeout(config: Config): Promise<Config> {\n const value = await select<number>({\n message: \"Skip explanation if it takes longer than...\",\n options: [\n { label: \"5 seconds\", value: 5000, hint: \"fast, may skip complex changes\" },\n { label: \"8 seconds\", value: 8000, hint: \"balanced (recommended)\" },\n { label: \"15 seconds\", value: 15000, hint: \"patient, rarely skips\" },\n { label: \"Never skip\", value: 0, hint: \"always wait for the explanation\" },\n ],\n initialValue: config.skipIfSlowMs,\n });\n handleCancel(value);\n return { ...config, skipIfSlowMs: value };\n}\n\nexport async function runConfig(): Promise<void> {\n const configPath = join(process.cwd(), CONFIG_FILE);\n if (!existsSync(configPath)) {\n intro(pc.bold(\"code-explainer config\"));\n cancel(\n `${CONFIG_FILE} not found in the current directory. Run ${pc.cyan(\"npx vibe-code-explainer init\")} first.`\n );\n process.exit(1);\n }\n\n intro(pc.bold(\"code-explainer config\"));\n\n let config = loadConfig(configPath);\n\n while (true) {\n note(renderCurrent(config), \"Current settings\");\n\n const choice = await select<MenuChoice>({\n message: \"What would you like to change?\",\n options: [\n { label: \"Engine\", value: \"engine\" },\n { label: \"Model\", value: \"model\" },\n { label: \"Ollama URL\", value: \"url\" },\n { label: \"Detail level\", value: \"detail\" },\n { label: \"Enable/disable hooks\", value: \"hooks\" },\n { label: \"File exclusions\", value: \"exclude\" },\n { label: \"Latency timeout\", value: \"timeout\" },\n { label: \"Back (save and exit)\", value: \"back\" },\n ],\n });\n handleCancel(choice);\n\n if (choice === \"back\") break;\n if (choice === \"engine\") config = await changeEngine(config);\n if (choice === \"model\") config = await changeModel(config);\n if (choice === \"url\") config = await changeUrl(config);\n if (choice === \"detail\") config = await changeDetail(config);\n if (choice === \"hooks\") config = await changeHooks(config);\n if (choice === \"exclude\") config = await changeExclude(config);\n if (choice === \"timeout\") config = await changeTimeout(config);\n\n writeFileSync(configPath, JSON.stringify(config, null, 2) + \"\\n\");\n }\n\n outro(pc.green(\"Settings saved.\"));\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli/init.ts","../src/detect/platform.ts"],"sourcesContent":["import { intro, outro, select, confirm, cancel, isCancel, spinner, note } from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { execFile, execFileSync, spawn } from \"node:child_process\";\nimport { existsSync, writeFileSync } from \"node:fs\";\nimport { join, resolve, basename } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { DEFAULT_CONFIG, type Config, type Engine, type DetailLevel } from \"../config/schema.js\";\nimport { detectPlatform, ollamaInstallCommand } from \"../detect/platform.js\";\nimport { detectNvidiaVram, pickModelForVram, MODEL_OPTIONS } from \"../detect/vram.js\";\nimport { mergeHooksIntoSettings } from \"../config/merge.js\";\nimport { callOllama } from \"../engines/ollama.js\";\n\nconst CONFIG_FILE = \"code-explainer.config.json\";\n\nfunction isInsideNpxCache(path: string): boolean {\n const norm = path.replace(/\\\\/g, \"/\").toLowerCase();\n return norm.includes(\"/_npx/\") || norm.includes(\"/.npm/_npx/\");\n}\n\nasync function ensureLocalInstall(projectRoot: string): Promise<string> {\n // If we're running from the npx temp cache, that path disappears after the\n // cache is cleaned. Install the package into the project so the hook path\n // is stable across runs.\n const thisFile = fileURLToPath(import.meta.url);\n\n if (!isInsideNpxCache(thisFile)) {\n // Running from an already-installed copy (local or global). Use it directly.\n const distDir = resolve(thisFile, \"..\");\n return join(distDir, \"hooks\", \"post-tool.js\");\n }\n\n note(\n \"Installing vibe-code-explainer as a dev dependency so the hook path is stable...\",\n \"Local install\"\n );\n\n // Make sure there's a package.json so npm install has something to attach to.\n const pkgPath = join(projectRoot, \"package.json\");\n if (!existsSync(pkgPath)) {\n writeFileSync(pkgPath, JSON.stringify({ name: basename(projectRoot), private: true, version: \"0.0.0\" }, null, 2) + \"\\n\");\n }\n\n await new Promise<void>((resolvePromise, rejectPromise) => {\n const child = spawn(\n \"npm\",\n [\"install\", \"--save-dev\", \"vibe-code-explainer\"],\n { stdio: \"inherit\", cwd: projectRoot, shell: process.platform === \"win32\" }\n );\n child.on(\"error\", rejectPromise);\n child.on(\"close\", (code) => {\n if (code === 0) resolvePromise();\n else rejectPromise(new Error(`npm install exited with code ${code}`));\n });\n });\n\n return join(projectRoot, \"node_modules\", \"vibe-code-explainer\", \"dist\", \"hooks\", \"post-tool.js\");\n}\n\nasync function checkOllama(): Promise<\"running\" | \"installed-not-running\" | \"missing\"> {\n // First, try the HTTP endpoint.\n try {\n const ctrl = new AbortController();\n const timer = setTimeout(() => ctrl.abort(), 1500);\n const res = await fetch(\"http://localhost:11434/api/tags\", { signal: ctrl.signal });\n clearTimeout(timer);\n if (res.ok) return \"running\";\n } catch {\n // fall through\n }\n\n // Check if the binary exists.\n try {\n execFileSync(\"ollama\", [\"--version\"], { stdio: \"ignore\" });\n return \"installed-not-running\";\n } catch {\n return \"missing\";\n }\n}\n\nasync function pullModel(model: string): Promise<boolean> {\n // Show note first so the user knows what's happening, then stream ollama's\n // own progress bar straight to the terminal by inheriting stdio.\n note(\n `Pulling ${pc.cyan(model)}\\n${pc.dim(\"This can take a while on the first run (several GB download).\")}`,\n \"Downloading model\"\n );\n\n return new Promise((resolvePromise) => {\n const child = spawn(\"ollama\", [\"pull\", model], { stdio: \"inherit\" });\n child.on(\"error\", () => {\n process.stderr.write(pc.red(\"\\nFailed to run `ollama pull`. Make sure Ollama is running.\\n\"));\n resolvePromise(false);\n });\n child.on(\"close\", (code) => {\n if (code === 0) {\n process.stdout.write(pc.green(`\\n\\u2713 Pulled ${model}\\n`));\n resolvePromise(true);\n } else {\n process.stderr.write(pc.red(`\\n\\u2717 ollama pull exited with code ${code}\\n`));\n resolvePromise(false);\n }\n });\n });\n}\n\nasync function runWarmup(config: Config): Promise<void> {\n const s = spinner();\n s.start(`Warming up ${config.ollamaModel}`);\n\n const outcome = await callOllama({\n filePath: \"warmup.txt\",\n diff: \"+ hello world\",\n config: { ...config, skipIfSlowMs: 60000 },\n });\n\n if (outcome.kind === \"ok\") {\n s.stop(\"Warmup complete. First real explanation will be fast.\");\n } else if (outcome.kind === \"error\") {\n s.stop(`Warmup failed: ${outcome.problem}`);\n } else {\n s.stop(`Warmup skipped: ${outcome.reason}`);\n }\n}\n\nasync function pickModel(): Promise<string | symbol> {\n const vram = detectNvidiaVram();\n if (vram) {\n const recommended = pickModelForVram(vram.totalMb);\n note(\n `Detected ${pc.green(vram.gpuName)} with ${pc.green(`${Math.round(vram.totalMb / 1024)} GB VRAM`)}.\\nRecommended model: ${pc.cyan(recommended)}`,\n \"GPU detection\"\n );\n return recommended;\n }\n\n // No auto-detect → show chooser with VRAM hints.\n note(\"No NVIDIA GPU detected (or nvidia-smi unavailable). Pick a model that fits your machine.\", \"GPU detection\");\n const choice = await select({\n message: \"Which model should code-explainer use?\",\n options: MODEL_OPTIONS.map((m) => ({\n label: m.label,\n value: m.model,\n hint: m.hint,\n })),\n initialValue: \"qwen3-coder:30b\",\n });\n return choice;\n}\n\nfunction handleCancel<T>(value: T | symbol): asserts value is T {\n if (isCancel(value)) {\n cancel(\"Setup cancelled.\");\n process.exit(0);\n }\n}\n\nexport async function runInit(args: string[]): Promise<void> {\n const skipWarmup = args.includes(\"--skip-warmup\");\n\n intro(pc.bold(\"code-explainer setup\"));\n\n const engineChoice = await select<Engine>({\n message: \"Which explanation engine do you want to use?\",\n options: [\n { label: \"Local LLM (Ollama)\", value: \"ollama\", hint: \"free, private, works offline\" },\n { label: \"Claude Code (native)\", value: \"claude\", hint: \"best quality, uses API tokens\" },\n ],\n initialValue: \"ollama\",\n });\n handleCancel(engineChoice);\n\n const detailChoice = await select<DetailLevel>({\n message: \"How detailed should explanations be?\",\n options: [\n { label: \"Standard\", value: \"standard\", hint: \"1-2 sentence explanation per change (recommended)\" },\n { label: \"Minimal\", value: \"minimal\", hint: \"one short sentence per change\" },\n { label: \"Verbose\", value: \"verbose\", hint: \"detailed bullet-point breakdown\" },\n ],\n initialValue: \"standard\",\n });\n handleCancel(detailChoice);\n\n let ollamaModel = DEFAULT_CONFIG.ollamaModel;\n\n if (engineChoice === \"ollama\") {\n const status = await checkOllama();\n\n if (status === \"missing\") {\n const platform = detectPlatform();\n const installCmd = ollamaInstallCommand(platform);\n note(\n `Ollama is not installed.\\nInstall with: ${pc.cyan(installCmd)}\\nOr visit: ${pc.cyan(\"https://ollama.com/download\")}`,\n \"Missing prerequisite\"\n );\n const proceed = await confirm({\n message: \"Install Ollama manually and continue after it's ready?\",\n initialValue: true,\n });\n handleCancel(proceed);\n if (!proceed) {\n cancel(\"Setup paused. Run 'npx vibe-code-explainer init' again after installing Ollama.\");\n process.exit(0);\n }\n } else if (status === \"installed-not-running\") {\n note(\n `Ollama is installed but the service isn't running.\\nStart it with: ${pc.cyan(\"ollama serve\")} (in a separate terminal).`,\n \"Ollama not running\"\n );\n }\n\n const modelChoice = await pickModel();\n handleCancel(modelChoice);\n ollamaModel = modelChoice;\n\n const pullOk = await pullModel(ollamaModel);\n if (!pullOk) {\n const skipPull = await confirm({\n message: \"Continue without pulling the model? (You'll need to run 'ollama pull' manually.)\",\n initialValue: false,\n });\n handleCancel(skipPull);\n if (!skipPull) {\n cancel(\"Setup aborted.\");\n process.exit(1);\n }\n }\n }\n\n // Build config.\n const config: Config = {\n ...DEFAULT_CONFIG,\n engine: engineChoice,\n detailLevel: detailChoice,\n ollamaModel,\n };\n\n const projectRoot = process.cwd();\n const configPath = join(projectRoot, CONFIG_FILE);\n\n if (existsSync(configPath)) {\n const overwrite = await confirm({\n message: `${CONFIG_FILE} already exists. Overwrite?`,\n initialValue: false,\n });\n handleCancel(overwrite);\n if (!overwrite) {\n cancel(\"Setup aborted to avoid overwriting existing config.\");\n process.exit(0);\n }\n }\n\n writeFileSync(configPath, JSON.stringify(config, null, 2) + \"\\n\");\n\n // Merge hooks into settings.local.json.\n const hookScript = await ensureLocalInstall(projectRoot);\n const mergeResult = mergeHooksIntoSettings(projectRoot, hookScript);\n\n note(\n `${pc.green(\"\\u2713\")} Wrote ${pc.cyan(CONFIG_FILE)}\\n${pc.green(\"\\u2713\")} ${mergeResult.created ? \"Created\" : \"Updated\"} ${pc.cyan(mergeResult.path)}`,\n \"Configuration saved\"\n );\n\n // Warmup.\n if (engineChoice === \"ollama\" && !skipWarmup) {\n await runWarmup(config);\n }\n\n outro(\n pc.bold(\"code-explainer is active.\") +\n \"\\nClaude Code will now explain every Edit, Write, and destructive Bash command.\"\n );\n}\n","import { platform } from \"node:os\";\n\nexport type Platform = \"windows\" | \"macos\" | \"linux\" | \"wsl\" | \"unknown\";\n\nexport function detectPlatform(): Platform {\n const p = platform();\n if (p === \"win32\") return \"windows\";\n if (p === \"darwin\") return \"macos\";\n if (p === \"linux\") {\n // WSL detection: Microsoft string in /proc/version\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const fs = require(\"node:fs\") as typeof import(\"node:fs\");\n const release = fs.readFileSync(\"/proc/version\", \"utf-8\").toLowerCase();\n if (release.includes(\"microsoft\") || release.includes(\"wsl\")) return \"wsl\";\n } catch {\n // ignore\n }\n return \"linux\";\n }\n return \"unknown\";\n}\n\nexport function ollamaInstallCommand(p: Platform): string {\n switch (p) {\n case \"macos\":\n return \"brew install ollama\";\n case \"windows\":\n return \"winget install Ollama.Ollama\";\n case \"linux\":\n case \"wsl\":\n return \"curl -fsSL https://ollama.com/install.sh | sh\";\n default:\n return \"Visit https://ollama.com/download to install Ollama\";\n }\n}\n"],"mappings":"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","names":["platform"]}
|
package/dist/schema-SJTKT73Y.js
DELETED
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
3
|
-
removeHooksFromSettings
|
|
4
|
-
} from "./chunk-IIUJ6UAO.js";
|
|
5
|
-
import "./chunk-7OCVIDC7.js";
|
|
6
|
-
|
|
7
|
-
// src/cli/uninstall.ts
|
|
8
|
-
import { intro, outro, confirm, cancel, isCancel, note } from "@clack/prompts";
|
|
9
|
-
import pc from "picocolors";
|
|
10
|
-
import { existsSync, unlinkSync } from "fs";
|
|
11
|
-
import { join } from "path";
|
|
12
|
-
var CONFIG_FILE = "code-explainer.config.json";
|
|
13
|
-
async function runUninstall() {
|
|
14
|
-
intro(pc.bold("code-explainer uninstall"));
|
|
15
|
-
const projectRoot = process.cwd();
|
|
16
|
-
const configPath = join(projectRoot, CONFIG_FILE);
|
|
17
|
-
const configExists = existsSync(configPath);
|
|
18
|
-
const hooksFile = join(projectRoot, ".claude", "settings.local.json");
|
|
19
|
-
const hasHooks = existsSync(hooksFile) || existsSync(join(projectRoot, ".claude", "settings.json"));
|
|
20
|
-
if (!configExists && !hasHooks) {
|
|
21
|
-
cancel("Nothing to uninstall in this directory.");
|
|
22
|
-
return;
|
|
23
|
-
}
|
|
24
|
-
const proceed = await confirm({
|
|
25
|
-
message: "Remove code-explainer hooks and config from this project?",
|
|
26
|
-
initialValue: true
|
|
27
|
-
});
|
|
28
|
-
if (isCancel(proceed) || !proceed) {
|
|
29
|
-
cancel("Uninstall cancelled.");
|
|
30
|
-
return;
|
|
31
|
-
}
|
|
32
|
-
const messages = [];
|
|
33
|
-
const hookResult = removeHooksFromSettings(projectRoot, { useLocal: true });
|
|
34
|
-
if (hookResult.removed && hookResult.path) {
|
|
35
|
-
messages.push(`${pc.green("\u2713")} Removed hooks from ${pc.cyan(hookResult.path)}`);
|
|
36
|
-
}
|
|
37
|
-
const hookResultNonLocal = removeHooksFromSettings(projectRoot, { useLocal: false });
|
|
38
|
-
if (hookResultNonLocal.removed && hookResultNonLocal.path) {
|
|
39
|
-
messages.push(`${pc.green("\u2713")} Removed hooks from ${pc.cyan(hookResultNonLocal.path)}`);
|
|
40
|
-
}
|
|
41
|
-
if (configExists) {
|
|
42
|
-
try {
|
|
43
|
-
unlinkSync(configPath);
|
|
44
|
-
messages.push(`${pc.green("\u2713")} Deleted ${pc.cyan(CONFIG_FILE)}`);
|
|
45
|
-
} catch {
|
|
46
|
-
messages.push(`${pc.yellow("\u26A0")} Could not delete ${pc.cyan(CONFIG_FILE)} (permissions?)`);
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
if (messages.length === 0) {
|
|
50
|
-
note("Nothing to remove.", "Uninstall");
|
|
51
|
-
} else {
|
|
52
|
-
note(messages.join("\n"), "Uninstall complete");
|
|
53
|
-
}
|
|
54
|
-
outro(
|
|
55
|
-
pc.dim(
|
|
56
|
-
"Note: Ollama and any pulled models are still installed. Remove them with 'ollama rm <model>' if desired."
|
|
57
|
-
)
|
|
58
|
-
);
|
|
59
|
-
}
|
|
60
|
-
export {
|
|
61
|
-
runUninstall
|
|
62
|
-
};
|
|
63
|
-
//# sourceMappingURL=uninstall-BXMUKVRD.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli/uninstall.ts"],"sourcesContent":["import { intro, outro, confirm, cancel, isCancel, note } from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { existsSync, unlinkSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { removeHooksFromSettings } from \"../config/merge.js\";\n\nconst CONFIG_FILE = \"code-explainer.config.json\";\n\nexport async function runUninstall(): Promise<void> {\n intro(pc.bold(\"code-explainer uninstall\"));\n\n const projectRoot = process.cwd();\n const configPath = join(projectRoot, CONFIG_FILE);\n\n const configExists = existsSync(configPath);\n const hooksFile = join(projectRoot, \".claude\", \"settings.local.json\");\n const hasHooks = existsSync(hooksFile) || existsSync(join(projectRoot, \".claude\", \"settings.json\"));\n\n if (!configExists && !hasHooks) {\n cancel(\"Nothing to uninstall in this directory.\");\n return;\n }\n\n const proceed = await confirm({\n message: \"Remove code-explainer hooks and config from this project?\",\n initialValue: true,\n });\n if (isCancel(proceed) || !proceed) {\n cancel(\"Uninstall cancelled.\");\n return;\n }\n\n const messages: string[] = [];\n\n const hookResult = removeHooksFromSettings(projectRoot, { useLocal: true });\n if (hookResult.removed && hookResult.path) {\n messages.push(`${pc.green(\"\\u2713\")} Removed hooks from ${pc.cyan(hookResult.path)}`);\n }\n\n // Also check the non-local settings file (for older setups).\n const hookResultNonLocal = removeHooksFromSettings(projectRoot, { useLocal: false });\n if (hookResultNonLocal.removed && hookResultNonLocal.path) {\n messages.push(`${pc.green(\"\\u2713\")} Removed hooks from ${pc.cyan(hookResultNonLocal.path)}`);\n }\n\n if (configExists) {\n try {\n unlinkSync(configPath);\n messages.push(`${pc.green(\"\\u2713\")} Deleted ${pc.cyan(CONFIG_FILE)}`);\n } catch {\n messages.push(`${pc.yellow(\"\\u26A0\")} Could not delete ${pc.cyan(CONFIG_FILE)} (permissions?)`);\n }\n }\n\n if (messages.length === 0) {\n note(\"Nothing to remove.\", \"Uninstall\");\n } else {\n note(messages.join(\"\\n\"), \"Uninstall complete\");\n }\n\n outro(\n pc.dim(\n \"Note: Ollama and any pulled models are still installed. Remove them with 'ollama rm <model>' if desired.\"\n )\n );\n}\n"],"mappings":";;;;;;;AAAA,SAAS,OAAO,OAAO,SAAS,QAAQ,UAAU,YAAY;AAC9D,OAAO,QAAQ;AACf,SAAS,YAAY,kBAAkB;AACvC,SAAS,YAAY;AAGrB,IAAM,cAAc;AAEpB,eAAsB,eAA8B;AAClD,QAAM,GAAG,KAAK,0BAA0B,CAAC;AAEzC,QAAM,cAAc,QAAQ,IAAI;AAChC,QAAM,aAAa,KAAK,aAAa,WAAW;AAEhD,QAAM,eAAe,WAAW,UAAU;AAC1C,QAAM,YAAY,KAAK,aAAa,WAAW,qBAAqB;AACpE,QAAM,WAAW,WAAW,SAAS,KAAK,WAAW,KAAK,aAAa,WAAW,eAAe,CAAC;AAElG,MAAI,CAAC,gBAAgB,CAAC,UAAU;AAC9B,WAAO,yCAAyC;AAChD;AAAA,EACF;AAEA,QAAM,UAAU,MAAM,QAAQ;AAAA,IAC5B,SAAS;AAAA,IACT,cAAc;AAAA,EAChB,CAAC;AACD,MAAI,SAAS,OAAO,KAAK,CAAC,SAAS;AACjC,WAAO,sBAAsB;AAC7B;AAAA,EACF;AAEA,QAAM,WAAqB,CAAC;AAE5B,QAAM,aAAa,wBAAwB,aAAa,EAAE,UAAU,KAAK,CAAC;AAC1E,MAAI,WAAW,WAAW,WAAW,MAAM;AACzC,aAAS,KAAK,GAAG,GAAG,MAAM,QAAQ,CAAC,uBAAuB,GAAG,KAAK,WAAW,IAAI,CAAC,EAAE;AAAA,EACtF;AAGA,QAAM,qBAAqB,wBAAwB,aAAa,EAAE,UAAU,MAAM,CAAC;AACnF,MAAI,mBAAmB,WAAW,mBAAmB,MAAM;AACzD,aAAS,KAAK,GAAG,GAAG,MAAM,QAAQ,CAAC,uBAAuB,GAAG,KAAK,mBAAmB,IAAI,CAAC,EAAE;AAAA,EAC9F;AAEA,MAAI,cAAc;AAChB,QAAI;AACF,iBAAW,UAAU;AACrB,eAAS,KAAK,GAAG,GAAG,MAAM,QAAQ,CAAC,YAAY,GAAG,KAAK,WAAW,CAAC,EAAE;AAAA,IACvE,QAAQ;AACN,eAAS,KAAK,GAAG,GAAG,OAAO,QAAQ,CAAC,qBAAqB,GAAG,KAAK,WAAW,CAAC,iBAAiB;AAAA,IAChG;AAAA,EACF;AAEA,MAAI,SAAS,WAAW,GAAG;AACzB,SAAK,sBAAsB,WAAW;AAAA,EACxC,OAAO;AACL,SAAK,SAAS,KAAK,IAAI,GAAG,oBAAoB;AAAA,EAChD;AAEA;AAAA,IACE,GAAG;AAAA,MACD;AAAA,IACF;AAAA,EACF;AACF;","names":[]}
|
|
File without changes
|
|
File without changes
|