aicommit2 2.2.19 → 2.2.20

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.
Files changed (2) hide show
  1. package/dist/cli.mjs +2 -2
  2. package/package.json +2 -2
package/dist/cli.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import{command as Y,cli as Ho}from"cleye";import{createRequire as Uo}from"module";import{Buffer as qo}from"node:buffer";import te from"node:path";import Vt,{ChildProcess as zo}from"node:child_process";import U from"node:process";import Ko from"child_process";import P from"path";import _ from"fs";import{fileURLToPath as Xt}from"node:url";import Wo,{constants as Jt}from"node:os";import Qt from"assert";import Zt from"events";import{createWriteStream as Yo,createReadStream as Vo}from"node:fs";import Xo from"buffer";import ot from"stream";import er from"util";import{debuglog as Jo}from"node:util";import ke from"inquirer";import st from"ora";import w from"chalk";import{of as de,concatMap as k,from as $,map as A,catchError as S,mergeMap as Me,BehaviorSubject as tr,ReplaySubject as Qo,lastValueFrom as rr,filter as or,toArray as sr,Subject as nr}from"rxjs";import Zo from"@anthropic-ai/sdk";import{fromPromise as M}from"rxjs/internal/observable/innerFrom";import q from"winston";import"winston-daily-rotate-file";import x from"fs/promises";import Ie from"os";import{xxh64 as es}from"@pacote/xxhash";import ts from"axios";import{CohereClient as rs}from"cohere-ai";import ir from"openai";import{GoogleGenerativeAI as os,HarmCategory as Re,HarmBlockThreshold as Oe}from"@google/generative-ai";import ss from"groq-sdk";import{Ollama as ns}from"ollama";import{fetch as is,Agent as as}from"undici";import cs from"http";import ls from"https";import ms from"net";import us from"tls";import ps,{fileURLToPath as fs,pathToFileURL as ds}from"url";import ar from"tty";import Le from"readline";import hs from"figlet";import gs from"inquirer-reactive-list-prompt";import{rm as ys}from"node:fs/promises";import ws from"chokidar";import{takeUntil as vs}from"rxjs/operators";var bs="aicommit2",cr="2.2.19",Cs="A Reactive CLI that generates git commit messages with various AI",Ps=["cli","ai","git","commit","git-commit","command-line","commandline","aipick","aicommit","aicommits","aicommit2","openai","huggingface","anthropic","claude","claude3","gemini","gemini-pro","generative-ai","mistral","ollama","llama3","llama3.2","llama3.3","gemma","llm","chatgpt","cohere","groq","codestral","perplexity","deepseek","deepseek-r1","pre-commit"],$s="MIT",Es="tak-bro/aicommit2",xs="Hyungtak Jin(@tak-bro)",As="module",Ss=["dist"],ks={aicommit2:"./dist/cli.mjs",aic2:"./dist/cli.mjs"},Ms={prepare:"simple-git-hooks",build:"pkgroll --minify",lint:"eslint --cache .","type-check":"tsc",test:"tsx tests",prepack:"pnpm build && clean-pkg-json",prettier:"prettier"},Is={"@anthropic-ai/sdk":"^0.39.0","@dqbd/tiktoken":"^1.0.21","@google/generative-ai":"^0.24.1","@inquirer/prompts":"^3.3.2","@pacote/xxhash":"^0.3.2","@types/winston":"^2.4.4",axios:"^1.9.0",chalk:"^5.4.1",chokidar:"^4.0.3",cleye:"^1.3.4","cohere-ai":"^7.17.1","copy-paste":"^1.5.3",figlet:"^1.8.1","formdata-node":"^6.0.3","groq-sdk":"^0.7.0",inquirer:"9.2.8","inquirer-reactive-list-prompt":"^1.0.15",ollama:"^0.5.15",openai:"^4.102.0",ora:"^8.2.0",readline:"^1.3.0",rxjs:"^7.8.2",undici:"^7.10.0",uuid:"^9.0.1",winston:"^3.17.0","winston-daily-rotate-file":"^5.0.0"},Rs={"@pvtnbr/eslint-config":"^0.33.0","@semantic-release/changelog":"^6.0.3","@semantic-release/commit-analyzer":"^12.0.0","@semantic-release/git":"^10.0.1","@semantic-release/github":"^10.3.5","@semantic-release/npm":"^12.0.1","@semantic-release/release-notes-generator":"^13.0.0","@types/figlet":"^1.7.0","@types/ini":"^1.3.34","@types/inquirer":"^9.0.8","@types/node":"^18.19.103","@types/uuid":"^9.0.8","@typescript-eslint/eslint-plugin":"^6.21.0","@typescript-eslint/parser":"^6.21.0","clean-pkg-json":"^1.3.0","conventional-changelog-conventionalcommits":"^7.0.2","conventional-commits-parser":"^5.0.0",eslint:"^8.57.1","eslint-config-prettier":"^8.10.0","eslint-plugin-eslint-comments":"^3.2.0","eslint-plugin-import":"^2.31.0","eslint-plugin-jsonc":"^2.20.1","eslint-plugin-no-use-extend-native":"^0.5.0","eslint-plugin-promise":"^6.6.0","eslint-plugin-unicorn":"^49.0.0","eslint-plugin-unused-imports":"^3.2.0",execa:"^7.2.0","fs-fixture":"^1.2.0","https-proxy-agent":"^5.0.1",ini:"^3.0.1","lint-staged":"^13.3.0",manten:"^0.7.0",pkgroll:"^1.11.1",prettier:"^3.5.3","semantic-release":"^23.1.1","simple-git-hooks":"^2.13.0",tsx:"^3.14.0",typescript:"^4.9.5","undici-types":"^7.10.0"},Os={extends:["@pvtnbr","prettier"],rules:{"unicorn/no-process-exit":"off"},overrides:[{files:"./src/commands/prepare-commit-msg-hook.ts",rules:{"unicorn/prevent-abbreviations":"off"}}]},Ls={branches:["main"],plugins:[["@semantic-release/commit-analyzer",{preset:"conventionalcommits",releaseRules:[{type:"refactor",release:"patch"},{type:"chore",release:"patch"},{type:"feat",release:"patch"},{scope:"major",release:"major"},{scope:"minor",release:"minor"},{scope:"patch",release:"patch"}]}],"@semantic-release/release-notes-generator",["@semantic-release/changelog",{changelogFile:"CHANGELOG.md"}],"@semantic-release/github",["@semantic-release/git",{assets:["CHANGELOG.md"],message:"chore(release): ${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"}],"@semantic-release/npm"]},Ts={name:bs,version:cr,description:Cs,keywords:Ps,license:$s,repository:Es,author:xs,type:As,files:Ss,bin:ks,scripts:Ms,"simple-git-hooks":{"pre-commit":"pnpm lint-staged"},"lint-staged":{"*.ts":["prettier --config ./.prettierrc --write","eslint --fix"]},dependencies:Is,devDependencies:Rs,eslintConfig:Os,release:Ls},Ns=Uo(import.meta.url),O=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function re(t){return t&&t.__esModule&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t}var oe={exports:{}},nt,lr;function _s(){if(lr)return nt;lr=1,nt=r,r.sync=n;var t=_;function e(s,i){var c=i.pathExt!==void 0?i.pathExt:process.env.PATHEXT;if(!c||(c=c.split(";"),c.indexOf("")!==-1))return!0;for(var l=0;l<c.length;l++){var u=c[l].toLowerCase();if(u&&s.substr(-u.length).toLowerCase()===u)return!0}return!1}function o(s,i,c){return!s.isSymbolicLink()&&!s.isFile()?!1:e(i,c)}function r(s,i,c){t.stat(s,function(l,u){c(l,l?!1:o(u,s,i))})}function n(s,i){return o(t.statSync(s),s,i)}return nt}var it,mr;function Fs(){if(mr)return it;mr=1,it=e,e.sync=o;var t=_;function e(s,i,c){t.stat(s,function(l,u){c(l,l?!1:r(u,i))})}function o(s,i){return r(t.statSync(s),i)}function r(s,i){return s.isFile()&&n(s,i)}function n(s,i){var c=s.mode,l=s.uid,u=s.gid,p=i.uid!==void 0?i.uid:process.getuid&&process.getuid(),a=i.gid!==void 0?i.gid:process.getgid&&process.getgid(),m=parseInt("100",8),d=parseInt("010",8),h=parseInt("001",8),g=m|d,y=c&h||c&d&&u===a||c&m&&l===p||c&g&&p===0;return y}return it}var Te;process.platform==="win32"||O.TESTING_WINDOWS?Te=_s():Te=Fs();var Ds=at;at.sync=Gs;function at(t,e,o){if(typeof e=="function"&&(o=e,e={}),!o){if(typeof Promise!="function")throw new TypeError("callback not provided");return new Promise(function(r,n){at(t,e||{},function(s,i){s?n(s):r(i)})})}Te(t,e||{},function(r,n){r&&(r.code==="EACCES"||e&&e.ignoreErrors)&&(r=null,n=!1),o(r,n)})}function Gs(t,e){try{return Te.sync(t,e||{})}catch(o){if(e&&e.ignoreErrors||o.code==="EACCES")return!1;throw o}}const se=process.platform==="win32"||process.env.OSTYPE==="cygwin"||process.env.OSTYPE==="msys",ur=P,js=se?";":":",pr=Ds,fr=t=>Object.assign(new Error(`not found: ${t}`),{code:"ENOENT"}),dr=(t,e)=>{const o=e.colon||js,r=t.match(/\//)||se&&t.match(/\\/)?[""]:[...se?[process.cwd()]:[],...(e.path||process.env.PATH||"").split(o)],n=se?e.pathExt||process.env.PATHEXT||".EXE;.CMD;.BAT;.COM":"",s=se?n.split(o):[""];return se&&t.indexOf(".")!==-1&&s[0]!==""&&s.unshift(""),{pathEnv:r,pathExt:s,pathExtExe:n}},hr=(t,e,o)=>{typeof e=="function"&&(o=e,e={}),e||(e={});const{pathEnv:r,pathExt:n,pathExtExe:s}=dr(t,e),i=[],c=u=>new Promise((p,a)=>{if(u===r.length)return e.all&&i.length?p(i):a(fr(t));const m=r[u],d=/^".*"$/.test(m)?m.slice(1,-1):m,h=ur.join(d,t),g=!d&&/^\.[\\\/]/.test(t)?t.slice(0,2)+h:h;p(l(g,u,0))}),l=(u,p,a)=>new Promise((m,d)=>{if(a===n.length)return m(c(p+1));const h=n[a];pr(u+h,{pathExt:s},(g,y)=>{if(!g&&y)if(e.all)i.push(u+h);else return m(u+h);return m(l(u,p,a+1))})});return o?c(0).then(u=>o(null,u),o):c(0)},Bs=(t,e)=>{e=e||{};const{pathEnv:o,pathExt:r,pathExtExe:n}=dr(t,e),s=[];for(let i=0;i<o.length;i++){const c=o[i],l=/^".*"$/.test(c)?c.slice(1,-1):c,u=ur.join(l,t),p=!l&&/^\.[\\\/]/.test(t)?t.slice(0,2)+u:u;for(let a=0;a<r.length;a++){const m=p+r[a];try{if(pr.sync(m,{pathExt:n}))if(e.all)s.push(m);else return m}catch{}}}if(e.all&&s.length)return s;if(e.nothrow)return null;throw fr(t)};var Hs=hr;hr.sync=Bs;var ct={exports:{}};const gr=(t={})=>{const e=t.env||process.env;return(t.platform||process.platform)!=="win32"?"PATH":Object.keys(e).reverse().find(r=>r.toUpperCase()==="PATH")||"Path"};ct.exports=gr,ct.exports.default=gr;var Us=ct.exports;const yr=P,qs=Hs,zs=Us;function wr(t,e){const o=t.options.env||process.env,r=process.cwd(),n=t.options.cwd!=null,s=n&&process.chdir!==void 0&&!process.chdir.disabled;if(s)try{process.chdir(t.options.cwd)}catch{}let i;try{i=qs.sync(t.command,{path:o[zs({env:o})],pathExt:e?yr.delimiter:void 0})}catch{}finally{s&&process.chdir(r)}return i&&(i=yr.resolve(n?t.options.cwd:"",i)),i}function Ks(t){return wr(t)||wr(t,!0)}var Ws=Ks,lt={};const mt=/([()\][%!^"`<>&|;, *?])/g;function Ys(t){return t=t.replace(mt,"^$1"),t}function Vs(t,e){return t=`${t}`,t=t.replace(/(?=(\\+?)?)\1"/g,'$1$1\\"'),t=t.replace(/(?=(\\+?)?)\1$/,"$1$1"),t=`"${t}"`,t=t.replace(mt,"^$1"),e&&(t=t.replace(mt,"^$1")),t}lt.command=Ys,lt.argument=Vs;var Xs=/^#!(.*)/;const Js=Xs;var Qs=(t="")=>{const e=t.match(Js);if(!e)return null;const[o,r]=e[0].replace(/#! ?/,"").split(" "),n=o.split("/").pop();return n==="env"?r:r?`${n} ${r}`:n};const ut=_,Zs=Qs;function en(t){const o=Buffer.alloc(150);let r;try{r=ut.openSync(t,"r"),ut.readSync(r,o,0,150,0),ut.closeSync(r)}catch{}return Zs(o.toString())}var tn=en;const rn=P,vr=Ws,br=lt,on=tn,sn=process.platform==="win32",nn=/\.(?:com|exe)$/i,an=/node_modules[\\/].bin[\\/][^\\/]+\.cmd$/i;function cn(t){t.file=vr(t);const e=t.file&&on(t.file);return e?(t.args.unshift(t.file),t.command=e,vr(t)):t.file}function ln(t){if(!sn)return t;const e=cn(t),o=!nn.test(e);if(t.options.forceShell||o){const r=an.test(e);t.command=rn.normalize(t.command),t.command=br.command(t.command),t.args=t.args.map(s=>br.argument(s,r));const n=[t.command].concat(t.args).join(" ");t.args=["/d","/s","/c",`"${n}"`],t.command=process.env.comspec||"cmd.exe",t.options.windowsVerbatimArguments=!0}return t}function mn(t,e,o){e&&!Array.isArray(e)&&(o=e,e=null),e=e?e.slice(0):[],o=Object.assign({},o);const r={command:t,args:e,options:o,file:void 0,original:{command:t,args:e}};return o.shell?r:ln(r)}var un=mn;const pt=process.platform==="win32";function ft(t,e){return Object.assign(new Error(`${e} ${t.command} ENOENT`),{code:"ENOENT",errno:"ENOENT",syscall:`${e} ${t.command}`,path:t.command,spawnargs:t.args})}function pn(t,e){if(!pt)return;const o=t.emit;t.emit=function(r,n){if(r==="exit"){const s=Cr(n,e);if(s)return o.call(t,"error",s)}return o.apply(t,arguments)}}function Cr(t,e){return pt&&t===1&&!e.file?ft(e.original,"spawn"):null}function fn(t,e){return pt&&t===1&&!e.file?ft(e.original,"spawnSync"):null}var dn={hookChildProcess:pn,verifyENOENT:Cr,verifyENOENTSync:fn,notFoundError:ft};const Pr=Ko,dt=un,ht=dn;function $r(t,e,o){const r=dt(t,e,o),n=Pr.spawn(r.command,r.args,r.options);return ht.hookChildProcess(n,r),n}function hn(t,e,o){const r=dt(t,e,o),n=Pr.spawnSync(r.command,r.args,r.options);return n.error=n.error||ht.verifyENOENTSync(n.status,r),n}oe.exports=$r,oe.exports.spawn=$r,oe.exports.sync=hn,oe.exports._parse=dt,oe.exports._enoent=ht;var gn=oe.exports,yn=re(gn);function wn(t){const e=typeof t=="string"?`
2
+ import{command as Y,cli as Ho}from"cleye";import{createRequire as Uo}from"module";import{Buffer as qo}from"node:buffer";import te from"node:path";import Vt,{ChildProcess as zo}from"node:child_process";import U from"node:process";import Ko from"child_process";import P from"path";import _ from"fs";import{fileURLToPath as Xt}from"node:url";import Wo,{constants as Jt}from"node:os";import Qt from"assert";import Zt from"events";import{createWriteStream as Yo,createReadStream as Vo}from"node:fs";import Xo from"buffer";import ot from"stream";import er from"util";import{debuglog as Jo}from"node:util";import ke from"inquirer";import st from"ora";import w from"chalk";import{of as de,concatMap as k,from as $,map as A,catchError as S,mergeMap as Me,BehaviorSubject as tr,ReplaySubject as Qo,lastValueFrom as rr,filter as or,toArray as sr,Subject as nr}from"rxjs";import Zo from"@anthropic-ai/sdk";import{fromPromise as M}from"rxjs/internal/observable/innerFrom";import q from"winston";import"winston-daily-rotate-file";import x from"fs/promises";import Ie from"os";import{xxh64 as es}from"@pacote/xxhash";import ts from"axios";import{CohereClient as rs}from"cohere-ai";import ir from"openai";import{GoogleGenerativeAI as os,HarmCategory as Re,HarmBlockThreshold as Oe}from"@google/generative-ai";import ss from"groq-sdk";import{Ollama as ns}from"ollama";import{fetch as is,Agent as as}from"undici";import cs from"http";import ls from"https";import ms from"net";import us from"tls";import ps,{fileURLToPath as fs,pathToFileURL as ds}from"url";import ar from"tty";import Le from"readline";import hs from"figlet";import gs from"inquirer-reactive-list-prompt";import{rm as ys}from"node:fs/promises";import ws from"chokidar";import{takeUntil as vs}from"rxjs/operators";var bs="aicommit2",cr="2.2.20",Cs="A Reactive CLI that generates git commit messages with various AI",Ps=["cli","ai","git","commit","git-commit","command-line","commandline","aipick","aicommit","aicommits","aicommit2","openai","huggingface","anthropic","claude","claude3","gemini","gemini-pro","generative-ai","mistral","ollama","llama3","llama3.2","llama3.3","gemma","llm","chatgpt","cohere","groq","codestral","perplexity","deepseek","deepseek-r1","pre-commit"],$s="MIT",Es="tak-bro/aicommit2",xs="Hyungtak Jin(@tak-bro)",As="module",Ss=["dist"],ks={aicommit2:"./dist/cli.mjs",aic2:"./dist/cli.mjs"},Ms={prepare:"simple-git-hooks",build:"pkgroll --minify",lint:"eslint --cache .","type-check":"tsc",test:"tsx tests",prepack:"pnpm build && clean-pkg-json",prettier:"prettier"},Is={"@anthropic-ai/sdk":"^0.39.0","@dqbd/tiktoken":"^1.0.21","@google/generative-ai":"^0.24.1","@inquirer/prompts":"^3.3.2","@pacote/xxhash":"^0.3.2","@types/winston":"^2.4.4",axios:"^1.9.0",chalk:"^5.4.1",chokidar:"^4.0.3",cleye:"^1.3.4","cohere-ai":"^7.17.1","copy-paste":"^1.5.3",figlet:"^1.8.1","formdata-node":"^6.0.3","groq-sdk":"^0.7.0",inquirer:"9.2.8","inquirer-reactive-list-prompt":"^1.0.15",ollama:"^0.5.15",openai:"^5.0.1",ora:"^8.2.0",readline:"^1.3.0",rxjs:"^7.8.2",undici:"^7.10.0",uuid:"^9.0.1",winston:"^3.17.0","winston-daily-rotate-file":"^5.0.0"},Rs={"@pvtnbr/eslint-config":"^0.33.0","@semantic-release/changelog":"^6.0.3","@semantic-release/commit-analyzer":"^12.0.0","@semantic-release/git":"^10.0.1","@semantic-release/github":"^10.3.5","@semantic-release/npm":"^12.0.1","@semantic-release/release-notes-generator":"^13.0.0","@types/figlet":"^1.7.0","@types/ini":"^1.3.34","@types/inquirer":"^9.0.8","@types/node":"^18.19.103","@types/uuid":"^9.0.8","@typescript-eslint/eslint-plugin":"^6.21.0","@typescript-eslint/parser":"^6.21.0","clean-pkg-json":"^1.3.0","conventional-changelog-conventionalcommits":"^7.0.2","conventional-commits-parser":"^5.0.0",eslint:"^8.57.1","eslint-config-prettier":"^8.10.0","eslint-plugin-eslint-comments":"^3.2.0","eslint-plugin-import":"^2.31.0","eslint-plugin-jsonc":"^2.20.1","eslint-plugin-no-use-extend-native":"^0.5.0","eslint-plugin-promise":"^6.6.0","eslint-plugin-unicorn":"^49.0.0","eslint-plugin-unused-imports":"^3.2.0",execa:"^7.2.0","fs-fixture":"^1.2.0","https-proxy-agent":"^5.0.1",ini:"^3.0.1","lint-staged":"^13.3.0",manten:"^0.7.0",pkgroll:"^1.11.1",prettier:"^3.5.3","semantic-release":"^23.1.1","simple-git-hooks":"^2.13.0",tsx:"^3.14.0",typescript:"^4.9.5","undici-types":"^7.10.0"},Os={extends:["@pvtnbr","prettier"],rules:{"unicorn/no-process-exit":"off"},overrides:[{files:"./src/commands/prepare-commit-msg-hook.ts",rules:{"unicorn/prevent-abbreviations":"off"}}]},Ls={branches:["main"],plugins:[["@semantic-release/commit-analyzer",{preset:"conventionalcommits",releaseRules:[{type:"refactor",release:"patch"},{type:"chore",release:"patch"},{type:"feat",release:"patch"},{scope:"major",release:"major"},{scope:"minor",release:"minor"},{scope:"patch",release:"patch"}]}],"@semantic-release/release-notes-generator",["@semantic-release/changelog",{changelogFile:"CHANGELOG.md"}],"@semantic-release/github",["@semantic-release/git",{assets:["CHANGELOG.md"],message:"chore(release): ${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"}],"@semantic-release/npm"]},Ts={name:bs,version:cr,description:Cs,keywords:Ps,license:$s,repository:Es,author:xs,type:As,files:Ss,bin:ks,scripts:Ms,"simple-git-hooks":{"pre-commit":"pnpm lint-staged"},"lint-staged":{"*.ts":["prettier --config ./.prettierrc --write","eslint --fix"]},dependencies:Is,devDependencies:Rs,eslintConfig:Os,release:Ls},Ns=Uo(import.meta.url),O=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function re(t){return t&&t.__esModule&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t}var oe={exports:{}},nt,lr;function _s(){if(lr)return nt;lr=1,nt=r,r.sync=n;var t=_;function e(s,i){var c=i.pathExt!==void 0?i.pathExt:process.env.PATHEXT;if(!c||(c=c.split(";"),c.indexOf("")!==-1))return!0;for(var l=0;l<c.length;l++){var u=c[l].toLowerCase();if(u&&s.substr(-u.length).toLowerCase()===u)return!0}return!1}function o(s,i,c){return!s.isSymbolicLink()&&!s.isFile()?!1:e(i,c)}function r(s,i,c){t.stat(s,function(l,u){c(l,l?!1:o(u,s,i))})}function n(s,i){return o(t.statSync(s),s,i)}return nt}var it,mr;function Fs(){if(mr)return it;mr=1,it=e,e.sync=o;var t=_;function e(s,i,c){t.stat(s,function(l,u){c(l,l?!1:r(u,i))})}function o(s,i){return r(t.statSync(s),i)}function r(s,i){return s.isFile()&&n(s,i)}function n(s,i){var c=s.mode,l=s.uid,u=s.gid,p=i.uid!==void 0?i.uid:process.getuid&&process.getuid(),a=i.gid!==void 0?i.gid:process.getgid&&process.getgid(),m=parseInt("100",8),d=parseInt("010",8),h=parseInt("001",8),g=m|d,y=c&h||c&d&&u===a||c&m&&l===p||c&g&&p===0;return y}return it}var Te;process.platform==="win32"||O.TESTING_WINDOWS?Te=_s():Te=Fs();var Ds=at;at.sync=Gs;function at(t,e,o){if(typeof e=="function"&&(o=e,e={}),!o){if(typeof Promise!="function")throw new TypeError("callback not provided");return new Promise(function(r,n){at(t,e||{},function(s,i){s?n(s):r(i)})})}Te(t,e||{},function(r,n){r&&(r.code==="EACCES"||e&&e.ignoreErrors)&&(r=null,n=!1),o(r,n)})}function Gs(t,e){try{return Te.sync(t,e||{})}catch(o){if(e&&e.ignoreErrors||o.code==="EACCES")return!1;throw o}}const se=process.platform==="win32"||process.env.OSTYPE==="cygwin"||process.env.OSTYPE==="msys",ur=P,js=se?";":":",pr=Ds,fr=t=>Object.assign(new Error(`not found: ${t}`),{code:"ENOENT"}),dr=(t,e)=>{const o=e.colon||js,r=t.match(/\//)||se&&t.match(/\\/)?[""]:[...se?[process.cwd()]:[],...(e.path||process.env.PATH||"").split(o)],n=se?e.pathExt||process.env.PATHEXT||".EXE;.CMD;.BAT;.COM":"",s=se?n.split(o):[""];return se&&t.indexOf(".")!==-1&&s[0]!==""&&s.unshift(""),{pathEnv:r,pathExt:s,pathExtExe:n}},hr=(t,e,o)=>{typeof e=="function"&&(o=e,e={}),e||(e={});const{pathEnv:r,pathExt:n,pathExtExe:s}=dr(t,e),i=[],c=u=>new Promise((p,a)=>{if(u===r.length)return e.all&&i.length?p(i):a(fr(t));const m=r[u],d=/^".*"$/.test(m)?m.slice(1,-1):m,h=ur.join(d,t),g=!d&&/^\.[\\\/]/.test(t)?t.slice(0,2)+h:h;p(l(g,u,0))}),l=(u,p,a)=>new Promise((m,d)=>{if(a===n.length)return m(c(p+1));const h=n[a];pr(u+h,{pathExt:s},(g,y)=>{if(!g&&y)if(e.all)i.push(u+h);else return m(u+h);return m(l(u,p,a+1))})});return o?c(0).then(u=>o(null,u),o):c(0)},Bs=(t,e)=>{e=e||{};const{pathEnv:o,pathExt:r,pathExtExe:n}=dr(t,e),s=[];for(let i=0;i<o.length;i++){const c=o[i],l=/^".*"$/.test(c)?c.slice(1,-1):c,u=ur.join(l,t),p=!l&&/^\.[\\\/]/.test(t)?t.slice(0,2)+u:u;for(let a=0;a<r.length;a++){const m=p+r[a];try{if(pr.sync(m,{pathExt:n}))if(e.all)s.push(m);else return m}catch{}}}if(e.all&&s.length)return s;if(e.nothrow)return null;throw fr(t)};var Hs=hr;hr.sync=Bs;var ct={exports:{}};const gr=(t={})=>{const e=t.env||process.env;return(t.platform||process.platform)!=="win32"?"PATH":Object.keys(e).reverse().find(r=>r.toUpperCase()==="PATH")||"Path"};ct.exports=gr,ct.exports.default=gr;var Us=ct.exports;const yr=P,qs=Hs,zs=Us;function wr(t,e){const o=t.options.env||process.env,r=process.cwd(),n=t.options.cwd!=null,s=n&&process.chdir!==void 0&&!process.chdir.disabled;if(s)try{process.chdir(t.options.cwd)}catch{}let i;try{i=qs.sync(t.command,{path:o[zs({env:o})],pathExt:e?yr.delimiter:void 0})}catch{}finally{s&&process.chdir(r)}return i&&(i=yr.resolve(n?t.options.cwd:"",i)),i}function Ks(t){return wr(t)||wr(t,!0)}var Ws=Ks,lt={};const mt=/([()\][%!^"`<>&|;, *?])/g;function Ys(t){return t=t.replace(mt,"^$1"),t}function Vs(t,e){return t=`${t}`,t=t.replace(/(?=(\\+?)?)\1"/g,'$1$1\\"'),t=t.replace(/(?=(\\+?)?)\1$/,"$1$1"),t=`"${t}"`,t=t.replace(mt,"^$1"),e&&(t=t.replace(mt,"^$1")),t}lt.command=Ys,lt.argument=Vs;var Xs=/^#!(.*)/;const Js=Xs;var Qs=(t="")=>{const e=t.match(Js);if(!e)return null;const[o,r]=e[0].replace(/#! ?/,"").split(" "),n=o.split("/").pop();return n==="env"?r:r?`${n} ${r}`:n};const ut=_,Zs=Qs;function en(t){const o=Buffer.alloc(150);let r;try{r=ut.openSync(t,"r"),ut.readSync(r,o,0,150,0),ut.closeSync(r)}catch{}return Zs(o.toString())}var tn=en;const rn=P,vr=Ws,br=lt,on=tn,sn=process.platform==="win32",nn=/\.(?:com|exe)$/i,an=/node_modules[\\/].bin[\\/][^\\/]+\.cmd$/i;function cn(t){t.file=vr(t);const e=t.file&&on(t.file);return e?(t.args.unshift(t.file),t.command=e,vr(t)):t.file}function ln(t){if(!sn)return t;const e=cn(t),o=!nn.test(e);if(t.options.forceShell||o){const r=an.test(e);t.command=rn.normalize(t.command),t.command=br.command(t.command),t.args=t.args.map(s=>br.argument(s,r));const n=[t.command].concat(t.args).join(" ");t.args=["/d","/s","/c",`"${n}"`],t.command=process.env.comspec||"cmd.exe",t.options.windowsVerbatimArguments=!0}return t}function mn(t,e,o){e&&!Array.isArray(e)&&(o=e,e=null),e=e?e.slice(0):[],o=Object.assign({},o);const r={command:t,args:e,options:o,file:void 0,original:{command:t,args:e}};return o.shell?r:ln(r)}var un=mn;const pt=process.platform==="win32";function ft(t,e){return Object.assign(new Error(`${e} ${t.command} ENOENT`),{code:"ENOENT",errno:"ENOENT",syscall:`${e} ${t.command}`,path:t.command,spawnargs:t.args})}function pn(t,e){if(!pt)return;const o=t.emit;t.emit=function(r,n){if(r==="exit"){const s=Cr(n,e);if(s)return o.call(t,"error",s)}return o.apply(t,arguments)}}function Cr(t,e){return pt&&t===1&&!e.file?ft(e.original,"spawn"):null}function fn(t,e){return pt&&t===1&&!e.file?ft(e.original,"spawnSync"):null}var dn={hookChildProcess:pn,verifyENOENT:Cr,verifyENOENTSync:fn,notFoundError:ft};const Pr=Ko,dt=un,ht=dn;function $r(t,e,o){const r=dt(t,e,o),n=Pr.spawn(r.command,r.args,r.options);return ht.hookChildProcess(n,r),n}function hn(t,e,o){const r=dt(t,e,o),n=Pr.spawnSync(r.command,r.args,r.options);return n.error=n.error||ht.verifyENOENTSync(n.status,r),n}oe.exports=$r,oe.exports.spawn=$r,oe.exports.sync=hn,oe.exports._parse=dt,oe.exports._enoent=ht;var gn=oe.exports,yn=re(gn);function wn(t){const e=typeof t=="string"?`
3
3
  `:`
4
4
  `.charCodeAt(),o=typeof t=="string"?"\r":"\r".charCodeAt();return t[t.length-1]===e&&(t=t.slice(0,-1)),t[t.length-1]===o&&(t=t.slice(0,-1)),t}function Er(t={}){const{env:e=process.env,platform:o=process.platform}=t;return o!=="win32"?"PATH":Object.keys(e).reverse().find(r=>r.toUpperCase()==="PATH")||"Path"}const vn=({cwd:t=U.cwd(),path:e=U.env[Er()],preferLocal:o=!0,execPath:r=U.execPath,addExecPath:n=!0}={})=>{const s=t instanceof URL?Xt(t):t,i=te.resolve(s),c=[];return o&&bn(c,i),n&&Cn(c,r,i),[...c,e].join(te.delimiter)},bn=(t,e)=>{let o;for(;o!==e;)t.push(te.join(e,"node_modules/.bin")),o=e,e=te.resolve(e,"..")},Cn=(t,e,o)=>{const r=e instanceof URL?Xt(e):e;t.push(te.resolve(o,r,".."))},Pn=({env:t=U.env,...e}={})=>{t={...t};const o=Er({env:t});return e.path=t[o],t[o]=vn(e),t},$n=(t,e,o,r)=>{if(o==="length"||o==="prototype"||o==="arguments"||o==="caller")return;const n=Object.getOwnPropertyDescriptor(t,o),s=Object.getOwnPropertyDescriptor(e,o);!En(n,s)&&r||Object.defineProperty(t,o,s)},En=function(t,e){return t===void 0||t.configurable||t.writable===e.writable&&t.enumerable===e.enumerable&&t.configurable===e.configurable&&(t.writable||t.value===e.value)},xn=(t,e)=>{const o=Object.getPrototypeOf(e);o!==Object.getPrototypeOf(t)&&Object.setPrototypeOf(t,o)},An=(t,e)=>`/* Wrapped ${t}*/
5
5
  ${e}`,Sn=Object.getOwnPropertyDescriptor(Function.prototype,"toString"),kn=Object.getOwnPropertyDescriptor(Function.prototype.toString,"name"),Mn=(t,e,o)=>{const r=o===""?"":`with ${o.trim()}() `,n=An.bind(null,r,e.toString());Object.defineProperty(n,"name",kn),Object.defineProperty(t,"toString",{...Sn,value:n})};function In(t,e,{ignoreNonConfigurable:o=!1}={}){const{name:r}=t;for(const n of Reflect.ownKeys(e))$n(t,e,n,o);return xn(t,e),Mn(t,e,r),t}const Ne=new WeakMap,xr=(t,e={})=>{if(typeof t!="function")throw new TypeError("Expected a function");let o,r=0;const n=t.displayName||t.name||"<anonymous>",s=function(...i){if(Ne.set(s,++r),r===1)o=t.apply(this,i),t=null;else if(e.throw===!0)throw new Error(`Function \`${n}\` can only be called once`);return o};return In(s,t),Ne.set(s,r),s};xr.callCount=t=>{if(!Ne.has(t))throw new Error(`The given function \`${t.name}\` is not wrapped by the \`onetime\` package`);return Ne.get(t)};const Rn=()=>{const t=Sr-Ar+1;return Array.from({length:t},On)},On=(t,e)=>({name:`SIGRT${e+1}`,number:Ar+e,action:"terminate",description:"Application-specific signal (realtime)",standard:"posix"}),Ar=34,Sr=64,Ln=[{name:"SIGHUP",number:1,action:"terminate",description:"Terminal closed",standard:"posix"},{name:"SIGINT",number:2,action:"terminate",description:"User interruption with CTRL-C",standard:"ansi"},{name:"SIGQUIT",number:3,action:"core",description:"User interruption with CTRL-\\",standard:"posix"},{name:"SIGILL",number:4,action:"core",description:"Invalid machine instruction",standard:"ansi"},{name:"SIGTRAP",number:5,action:"core",description:"Debugger breakpoint",standard:"posix"},{name:"SIGABRT",number:6,action:"core",description:"Aborted",standard:"ansi"},{name:"SIGIOT",number:6,action:"core",description:"Aborted",standard:"bsd"},{name:"SIGBUS",number:7,action:"core",description:"Bus error due to misaligned, non-existing address or paging error",standard:"bsd"},{name:"SIGEMT",number:7,action:"terminate",description:"Command should be emulated but is not implemented",standard:"other"},{name:"SIGFPE",number:8,action:"core",description:"Floating point arithmetic error",standard:"ansi"},{name:"SIGKILL",number:9,action:"terminate",description:"Forced termination",standard:"posix",forced:!0},{name:"SIGUSR1",number:10,action:"terminate",description:"Application-specific signal",standard:"posix"},{name:"SIGSEGV",number:11,action:"core",description:"Segmentation fault",standard:"ansi"},{name:"SIGUSR2",number:12,action:"terminate",description:"Application-specific signal",standard:"posix"},{name:"SIGPIPE",number:13,action:"terminate",description:"Broken pipe or socket",standard:"posix"},{name:"SIGALRM",number:14,action:"terminate",description:"Timeout or timer",standard:"posix"},{name:"SIGTERM",number:15,action:"terminate",description:"Termination",standard:"ansi"},{name:"SIGSTKFLT",number:16,action:"terminate",description:"Stack is empty or overflowed",standard:"other"},{name:"SIGCHLD",number:17,action:"ignore",description:"Child process terminated, paused or unpaused",standard:"posix"},{name:"SIGCLD",number:17,action:"ignore",description:"Child process terminated, paused or unpaused",standard:"other"},{name:"SIGCONT",number:18,action:"unpause",description:"Unpaused",standard:"posix",forced:!0},{name:"SIGSTOP",number:19,action:"pause",description:"Paused",standard:"posix",forced:!0},{name:"SIGTSTP",number:20,action:"pause",description:'Paused using CTRL-Z or "suspend"',standard:"posix"},{name:"SIGTTIN",number:21,action:"pause",description:"Background process cannot read terminal input",standard:"posix"},{name:"SIGBREAK",number:21,action:"terminate",description:"User interruption with CTRL-BREAK",standard:"other"},{name:"SIGTTOU",number:22,action:"pause",description:"Background process cannot write to terminal output",standard:"posix"},{name:"SIGURG",number:23,action:"ignore",description:"Socket received out-of-band data",standard:"bsd"},{name:"SIGXCPU",number:24,action:"core",description:"Process timed out",standard:"bsd"},{name:"SIGXFSZ",number:25,action:"core",description:"File too big",standard:"bsd"},{name:"SIGVTALRM",number:26,action:"terminate",description:"Timeout or timer",standard:"bsd"},{name:"SIGPROF",number:27,action:"terminate",description:"Timeout or timer",standard:"bsd"},{name:"SIGWINCH",number:28,action:"ignore",description:"Terminal window size changed",standard:"bsd"},{name:"SIGIO",number:29,action:"terminate",description:"I/O is available",standard:"other"},{name:"SIGPOLL",number:29,action:"terminate",description:"Watched event",standard:"other"},{name:"SIGINFO",number:29,action:"ignore",description:"Request for process information",standard:"other"},{name:"SIGPWR",number:30,action:"terminate",description:"Device running out of power",standard:"systemv"},{name:"SIGSYS",number:31,action:"core",description:"Invalid system call",standard:"other"},{name:"SIGUNUSED",number:31,action:"terminate",description:"Invalid system call",standard:"other"}],kr=()=>{const t=Rn();return[...Ln,...t].map(Tn)},Tn=({name:t,number:e,description:o,action:r,forced:n=!1,standard:s})=>{const{signals:{[t]:i}}=Jt,c=i!==void 0;return{name:t,number:c?i:e,description:o,supported:c,action:r,forced:n,standard:s}},Nn=()=>{const t=kr();return Object.fromEntries(t.map(_n))},_n=({name:t,number:e,description:o,supported:r,action:n,forced:s,standard:i})=>[t,{name:t,number:e,description:o,supported:r,action:n,forced:s,standard:i}],Fn=Nn(),Dn=()=>{const t=kr(),e=Sr+1,o=Array.from({length:e},(r,n)=>Gn(n,t));return Object.assign({},...o)},Gn=(t,e)=>{const o=jn(t,e);if(o===void 0)return{};const{name:r,description:n,supported:s,action:i,forced:c,standard:l}=o;return{[t]:{name:r,number:t,description:n,supported:s,action:i,forced:c,standard:l}}},jn=(t,e)=>{const o=e.find(({name:r})=>Jt.signals[r]===t);return o!==void 0?o:e.find(r=>r.number===t)};Dn();const Bn=({timedOut:t,timeout:e,errorCode:o,signal:r,signalDescription:n,exitCode:s,isCanceled:i})=>t?`timed out after ${e} milliseconds`:i?"was canceled":o!==void 0?`failed with ${o}`:r!==void 0?`was killed with ${r} (${n})`:s!==void 0?`failed with exit code ${s}`:"failed",Mr=({stdout:t,stderr:e,all:o,error:r,signal:n,exitCode:s,command:i,escapedCommand:c,timedOut:l,isCanceled:u,killed:p,parsed:{options:{timeout:a,cwd:m=U.cwd()}}})=>{s=s===null?void 0:s,n=n===null?void 0:n;const d=n===void 0?void 0:Fn[n].description,h=r&&r.code,y=`Command ${Bn({timedOut:l,timeout:a,errorCode:h,signal:n,signalDescription:d,exitCode:s,isCanceled:u})}: ${i}`,v=Object.prototype.toString.call(r)==="[object Error]",E=v?`${y}
@@ -95,7 +95,7 @@ ${w.bold.green("\u2714")} ${w.bold("Saved commit message")}`)}printCancelledComm
95
95
  ${w.bold.yellow("\u26A0")} ${w.yellow("Commit cancelled")}`)}printError(e){console.log(`
96
96
  ${w.bold.red("\u2716")} ${w.red(`${e}`)}`)}printWarning(e){console.log(`
97
97
  ${w.bold.yellow("\u26A0")} ${w.red(`${e}`)}`)}printSetupGitEvent(e){console.log(`
98
- ${w.bold.green("\u2714")} ${w.bold(`Git ${e} hook has been set up`)}`)}moveCursorUp(){const e=Le.createInterface({input:process.stdin,output:process.stdout});Le.moveCursor(process.stdout,0,-1),e.close()}moveCursorDown(){const e=Le.createInterface({input:process.stdin,output:process.stdout});Le.moveCursor(process.stdout,0,2),e.close()}}const qa={isLoading:!1,startOption:{text:"AI is analyzing your changes"}},Eo={isLoading:!1,startOption:{text:"AI is performing a code review"}},Ut="No commit messages were generated",xo="No code reviews were generated",qt={type:"reactiveListPrompt",name:"aicommit2Prompt",message:"Pick a commit message to use: ",emptyMessage:`\u26A0 ${Ut}`,loop:!1,descPageSize:15,showDescription:!0,pickKey:"short",isDescriptionDim:!0,stopMessage:"Changes analyzed"};class zt{constructor(e){this.choices$=new tr([]),this.destroyed$=new Qo(1),this.stopMessage="Changes analyzed",this.inquirerInstance=null,this.loader$=new tr(e)}initPrompt(e=qt){return this.stopMessage=e.stopMessage,ke.registerPrompt("reactiveListPrompt",gs),this.inquirerInstance=ke.prompt({choices$:this.choices$,loader$:this.loader$,...e}),this.inquirerInstance}startLoader(){this.loader$.next({isLoading:!0})}clearLoader(){this.inquirerInstance&&this.loader$.next({isLoading:!1,clear:!0})}refreshChoices(e){const{value:o,isError:r}=e;!e||!o||this.choices$.next([...this.currentChoices,e].sort(Bi))}checkErrorOnChoices(e=!0){if(this.choices$.getValue().map(r=>r).every(r=>r?.isError||r?.disabled)){this.alertNoGeneratedMessage(),this.logEmptyCommitMessage(),e&&process.exit(1);return}this.stopLoaderOnSuccess()}completeSubject(){this.choices$.complete(),this.loader$.complete(),this.destroyed$.next(!0),this.destroyed$.complete()}closeInquirerInstance(){this.inquirerInstance&&this.inquirerInstance.ui.close()}cancel(){this.inquirerInstance?.ui?.activePrompt&&this.inquirerInstance.ui.activePrompt.abortPrompt()}alertNoGeneratedMessage(){this.loader$.next({isLoading:!1,message:Ut,stopOption:{doneFrame:"\u26A0",color:"yellow"}})}stopLoaderOnSuccess(){this.loader$.next({isLoading:!1,message:this.stopMessage})}logEmptyCommitMessage(){console.log(`${w.bold.yellow("\u26A0")} ${w.yellow(`${Ut}`)}`)}get currentChoices(){return this.choices$.getValue().map(e=>e)}}const z=new Q;var za=async(t,e,o,r,n,s,i,c,l)=>(async()=>{z.printTitle(),await Bt(),r&&await X("git",["add","--update"]);const u=await ue({locale:t?.toString(),generate:e?.toString(),commitType:n?.toString(),systemPrompt:c?.toString()},l);await Zr(u);const p=z.displaySpinner("Detecting staged files"),a=await Ht(o,u.exclude);if(p.stop(),!a)throw new C("No staged changes found. Stage your changes manually, or automatically stage all changes with the `--all` flag.");z.printStagedFiles(a);const m=Ao(u,"commit");if(m.length===0)throw new C("Please set at least one API key via the `aicommit2 config set` command");const d=new Je(u,a),h=Ao(u,"review");h.length>0&&await Ka(d,h);const g=await Wa(d,m);i&&(Ns("copy-paste").copy(g),z.printCopied(),process.exit()),s&&(await So(g,l),process.exit());const{confirmationPrompt:y}=await ke.prompt([{type:"confirm",name:"confirmationPrompt",message:"Use selected message?",default:!0}]);y?await So(g,l):z.printCancelledCommit(),process.exit()})().catch(u=>{z.printError(u.message),ee(u),process.exit(1)});function Ao(t,e){return Object.entries(t).map(([o,r])=>[o,r]).filter(([o,r])=>!r.disabled).filter(([o,r])=>le.includes(o)||r.compatible===!0).filter(([o,r])=>{switch(e){case"commit":return o==="OLLAMA"?!!r&&!!r.model&&r.model.length>0:o==="HUGGINGFACE"?!!r&&!!r.cookie:!!r.key&&r.key.length>0;case"review":const n=t.codeReview||r.codeReview;return o==="OLLAMA"?!!r&&!!r.model&&r.model.length>0&&n:o==="HUGGINGFACE"?!!r&&!!r.cookie&&n:!!r.key&&r.key.length>0&&n}}).map(([o])=>o)}async function Ka(t,e){const o=new zt(Eo),r=o.initPrompt({...qt,name:"codeReviewPrompt",message:"Please check code reviews: ",emptyMessage:`\u26A0 ${xo}`,isDescriptionDim:!1,stopMessage:"Code review completed",descPageSize:20});o.startLoader();const n=t.createCodeReviewRequests$(e).subscribe(l=>o.refreshChoices(l),()=>{},()=>o.checkErrorOnChoices());if(!(await r).codeReviewPrompt?.value)throw new C("An error occurred! No selected code review");n.unsubscribe(),o.completeSubject(),z.moveCursorUp();const{continuePrompt:c}=await ke.prompt([{type:"confirm",name:"continuePrompt",message:"Will you continue without changing the code?",default:!0}]);c||(z.printCancelledCommit(),process.exit())}async function Wa(t,e){const o=new zt(qa),r=o.initPrompt();o.startLoader();const n=t.createCommitMsgRequests$(e).subscribe(c=>o.refreshChoices(c),()=>{},()=>o.checkErrorOnChoices()),s=await r;n.unsubscribe(),o.completeSubject(),z.moveCursorUp();const i=s.aicommit2Prompt?.value;if(!i)throw new C("An error occurred! No selected message");return i}async function So(t,e){const o=st("Committing with the generated message").start();await X("git",["commit","-m",t,...e]),o.stop(),o.clear(),z.printCommitted()}var Ya=Y({name:"config",parameters:["<mode>","[key=value...]"],help:{description:"Manage configuration settings",examples:["aic2 config set <key>=<value> [<key>=<value> ...]","aic2 config get [<key> [<key> ...]]","aic2 config add <key>=<value> [<key>=<value> ...]","aic2 config del <key>","aic2 config list"]},commands:[Y({name:"set",parameters:["<key>=<value>","[<key>=<value> ...]"],help:{description:"Set configuration values. Multiple key-value pairs can be set at once.",examples:["aic2 config set OPENAI.key=<your key>","aic2 config set ANTHROPIC.topP=0.8 ANTHROPIC.generate=2"]}}),Y({name:"get",parameters:["[<key>","[<key> ...]]"],help:{description:"Retrieve configuration values for specified AI provider.",examples:["aic2 config get OPENAI","aic2 config get ANTHROPIC"]}}),Y({name:"add",parameters:["<key>=<value>","[<key>=<value> ...]"],help:{description:"Add new model to existing configuration. Only Ollama.model can be added.",examples:['aic2 config add OLLAMA.model="gemma2"']}}),Y({name:"list",parameters:[],help:{description:"Display all configuration keys and their values.",examples:["aic2 config list"]}}),Y({name:"del",parameters:["<config-name>"],help:{description:"Delete a configuration setting or section.",examples:["aic2 config del <config-name>","aic2 config del OPENAI.key","aic2 config del OPENAI"]}}),Y({name:"path",parameters:[],help:{description:"Display the path of the loaded configuration file.",examples:["aic2 config path"]}})]},t=>{(async()=>{const{mode:e,keyValue:o}=t._,r=t._[1];if(e==="get"){const n=await ue({},[]);if(o.length===0){console.log(n);return}for(const s of o){const i=s.split(".");let c=n,l=!0;for(const u of i)if(kt(c,u))c=c[u];else{l=!1;break}l?console.log(s,c):console.log(`${s} not found`)}return}if(e==="set"){await Qi(o.map(n=>{const s=n.indexOf("=");if(s===-1)throw new C("Invalid format. Use: key=value");const i=n.slice(0,s),c=n.slice(s+1);return[i,c]}));return}if(e==="add"){await Zi(o.map(n=>{const s=n.indexOf("=");if(s===-1)throw new C("Invalid format. Use: key=value");const i=n.slice(0,s),c=n.slice(s+1);return[i,c]}));return}if(e==="list"){await ea();return}if(e==="del"){if(!r)throw new C("Please provide the config name to delete.");const n=await be(),s=r.split(".");if(s.length===2){const[i,c]=s;if(n[i]&&typeof n[i]=="object"&&kt(n[i],c)){delete n[i][c],Object.keys(n[i]).length===0&&delete n[i];const l=await me();await x.writeFile(l,ce.stringify(n),"utf8"),console.log(`Successfully deleted config: ${r}`);const u=await x.readFile(l,"utf8");console.log("--- Updated Config Content ---"),console.log(u),console.log("----------------------------")}else throw new C(`Config not found: ${r}`)}else if(s.length===1){const i=s[0];if(kt(n,i)){delete n[i];const c=await me();await x.writeFile(c,ce.stringify(n),"utf8"),console.log(`Successfully deleted config: ${r}`);const l=await x.readFile(c,"utf8");console.log("--- Updated Config Content ---"),console.log(l),console.log("----------------------------")}else throw new C(`Config not found: ${r}`)}else throw new C(`Invalid config name format: ${r}`);return}if(e==="path"){await ta();return}throw new C(`Invalid mode: ${e}`)})().catch(e=>{new Q().printError(e.message),ee(e),process.exit(1)})});const ko="prepare-commit-msg",Mo=`.git/hooks/${ko}`,Ze=fs(new URL("cli.mjs",import.meta.url)),Va=process.argv[1].replace(/\\/g,"/").endsWith(`/${Mo}`),Io=process.platform==="win32",Ro=`
98
+ ${w.bold.green("\u2714")} ${w.bold(`Git ${e} hook has been set up`)}`)}moveCursorUp(){const e=Le.createInterface({input:process.stdin,output:process.stdout});Le.moveCursor(process.stdout,0,-1),e.close()}moveCursorDown(){const e=Le.createInterface({input:process.stdin,output:process.stdout});Le.moveCursor(process.stdout,0,2),e.close()}}const qa={isLoading:!1,startOption:{text:"AI is analyzing your changes"}},Eo={isLoading:!1,startOption:{text:"AI is performing a code review"}},Ut="No commit messages were generated",xo="No code reviews were generated",qt={type:"reactiveListPrompt",name:"aicommit2Prompt",message:"Pick a commit message to use: ",emptyMessage:`\u26A0 ${Ut}`,loop:!1,descPageSize:15,showDescription:!0,pickKey:"short",isDescriptionDim:!0,stopMessage:"Changes analyzed"};class zt{constructor(e){this.choices$=new tr([]),this.destroyed$=new Qo(1),this.stopMessage="Changes analyzed",this.inquirerInstance=null,this.loader$=new tr(e)}initPrompt(e=qt){return this.stopMessage=e.stopMessage,ke.registerPrompt("reactiveListPrompt",gs),this.inquirerInstance=ke.prompt({choices$:this.choices$,loader$:this.loader$,...e}),this.inquirerInstance}startLoader(){this.loader$.next({isLoading:!0})}clearLoader(){this.inquirerInstance&&this.loader$.next({isLoading:!1,clear:!0})}refreshChoices(e){const{value:o,isError:r}=e;!e||!o||this.choices$.next([...this.currentChoices,e].sort(Bi))}checkErrorOnChoices(e=!0){if(this.choices$.getValue().map(r=>r).every(r=>r?.isError||r?.disabled)){this.alertNoGeneratedMessage(),this.logEmptyCommitMessage(),e&&process.exit(1);return}this.stopLoaderOnSuccess()}completeSubject(){this.choices$.complete(),this.loader$.complete(),this.destroyed$.next(!0),this.destroyed$.complete()}closeInquirerInstance(){this.inquirerInstance&&this.inquirerInstance.ui.close()}cancel(){this.inquirerInstance?.ui?.activePrompt&&this.inquirerInstance.ui.activePrompt.abortPrompt()}alertNoGeneratedMessage(){this.loader$.next({isLoading:!1,message:Ut,stopOption:{doneFrame:"\u26A0",color:"yellow"}})}stopLoaderOnSuccess(){this.loader$.next({isLoading:!1,message:this.stopMessage})}logEmptyCommitMessage(){console.log(`${w.bold.yellow("\u26A0")} ${w.yellow(`${Ut}`)}`)}get currentChoices(){return this.choices$.getValue().map(e=>e)}}const z=new Q;var za=async(t,e,o,r,n,s,i,c,l)=>(async()=>{z.printTitle(),await Bt(),r&&await X("git",["add","--update"]);const u=await ue({locale:t?.toString(),generate:e?.toString(),type:n?.toString(),systemPrompt:c?.toString()},l);await Zr(u);const p=z.displaySpinner("Detecting staged files"),a=await Ht(o,u.exclude);if(p.stop(),!a)throw new C("No staged changes found. Stage your changes manually, or automatically stage all changes with the `--all` flag.");z.printStagedFiles(a);const m=Ao(u,"commit");if(m.length===0)throw new C("Please set at least one API key via the `aicommit2 config set` command");const d=new Je(u,a),h=Ao(u,"review");h.length>0&&await Ka(d,h);const g=await Wa(d,m);i&&(Ns("copy-paste").copy(g),z.printCopied(),process.exit()),s&&(await So(g,l),process.exit());const{confirmationPrompt:y}=await ke.prompt([{type:"confirm",name:"confirmationPrompt",message:"Use selected message?",default:!0}]);y?await So(g,l):z.printCancelledCommit(),process.exit()})().catch(u=>{z.printError(u.message),ee(u),process.exit(1)});function Ao(t,e){return Object.entries(t).map(([o,r])=>[o,r]).filter(([o,r])=>!r.disabled).filter(([o,r])=>le.includes(o)||r.compatible===!0).filter(([o,r])=>{switch(e){case"commit":return o==="OLLAMA"?!!r&&!!r.model&&r.model.length>0:o==="HUGGINGFACE"?!!r&&!!r.cookie:!!r.key&&r.key.length>0;case"review":const n=t.codeReview||r.codeReview;return o==="OLLAMA"?!!r&&!!r.model&&r.model.length>0&&n:o==="HUGGINGFACE"?!!r&&!!r.cookie&&n:!!r.key&&r.key.length>0&&n}}).map(([o])=>o)}async function Ka(t,e){const o=new zt(Eo),r=o.initPrompt({...qt,name:"codeReviewPrompt",message:"Please check code reviews: ",emptyMessage:`\u26A0 ${xo}`,isDescriptionDim:!1,stopMessage:"Code review completed",descPageSize:20});o.startLoader();const n=t.createCodeReviewRequests$(e).subscribe(l=>o.refreshChoices(l),()=>{},()=>o.checkErrorOnChoices());if(!(await r).codeReviewPrompt?.value)throw new C("An error occurred! No selected code review");n.unsubscribe(),o.completeSubject(),z.moveCursorUp();const{continuePrompt:c}=await ke.prompt([{type:"confirm",name:"continuePrompt",message:"Will you continue without changing the code?",default:!0}]);c||(z.printCancelledCommit(),process.exit())}async function Wa(t,e){const o=new zt(qa),r=o.initPrompt();o.startLoader();const n=t.createCommitMsgRequests$(e).subscribe(c=>o.refreshChoices(c),()=>{},()=>o.checkErrorOnChoices()),s=await r;n.unsubscribe(),o.completeSubject(),z.moveCursorUp();const i=s.aicommit2Prompt?.value;if(!i)throw new C("An error occurred! No selected message");return i}async function So(t,e){const o=st("Committing with the generated message").start();await X("git",["commit","-m",t,...e]),o.stop(),o.clear(),z.printCommitted()}var Ya=Y({name:"config",parameters:["<mode>","[key=value...]"],help:{description:"Manage configuration settings",examples:["aic2 config set <key>=<value> [<key>=<value> ...]","aic2 config get [<key> [<key> ...]]","aic2 config add <key>=<value> [<key>=<value> ...]","aic2 config del <key>","aic2 config list"]},commands:[Y({name:"set",parameters:["<key>=<value>","[<key>=<value> ...]"],help:{description:"Set configuration values. Multiple key-value pairs can be set at once.",examples:["aic2 config set OPENAI.key=<your key>","aic2 config set ANTHROPIC.topP=0.8 ANTHROPIC.generate=2"]}}),Y({name:"get",parameters:["[<key>","[<key> ...]]"],help:{description:"Retrieve configuration values for specified AI provider.",examples:["aic2 config get OPENAI","aic2 config get ANTHROPIC"]}}),Y({name:"add",parameters:["<key>=<value>","[<key>=<value> ...]"],help:{description:"Add new model to existing configuration. Only Ollama.model can be added.",examples:['aic2 config add OLLAMA.model="gemma2"']}}),Y({name:"list",parameters:[],help:{description:"Display all configuration keys and their values.",examples:["aic2 config list"]}}),Y({name:"del",parameters:["<config-name>"],help:{description:"Delete a configuration setting or section.",examples:["aic2 config del <config-name>","aic2 config del OPENAI.key","aic2 config del OPENAI"]}}),Y({name:"path",parameters:[],help:{description:"Display the path of the loaded configuration file.",examples:["aic2 config path"]}})]},t=>{(async()=>{const{mode:e,keyValue:o}=t._,r=t._[1];if(e==="get"){const n=await ue({},[]);if(o.length===0){console.log(n);return}for(const s of o){const i=s.split(".");let c=n,l=!0;for(const u of i)if(kt(c,u))c=c[u];else{l=!1;break}l?console.log(s,c):console.log(`${s} not found`)}return}if(e==="set"){await Qi(o.map(n=>{const s=n.indexOf("=");if(s===-1)throw new C("Invalid format. Use: key=value");const i=n.slice(0,s),c=n.slice(s+1);return[i,c]}));return}if(e==="add"){await Zi(o.map(n=>{const s=n.indexOf("=");if(s===-1)throw new C("Invalid format. Use: key=value");const i=n.slice(0,s),c=n.slice(s+1);return[i,c]}));return}if(e==="list"){await ea();return}if(e==="del"){if(!r)throw new C("Please provide the config name to delete.");const n=await be(),s=r.split(".");if(s.length===2){const[i,c]=s;if(n[i]&&typeof n[i]=="object"&&kt(n[i],c)){delete n[i][c],Object.keys(n[i]).length===0&&delete n[i];const l=await me();await x.writeFile(l,ce.stringify(n),"utf8"),console.log(`Successfully deleted config: ${r}`);const u=await x.readFile(l,"utf8");console.log("--- Updated Config Content ---"),console.log(u),console.log("----------------------------")}else throw new C(`Config not found: ${r}`)}else if(s.length===1){const i=s[0];if(kt(n,i)){delete n[i];const c=await me();await x.writeFile(c,ce.stringify(n),"utf8"),console.log(`Successfully deleted config: ${r}`);const l=await x.readFile(c,"utf8");console.log("--- Updated Config Content ---"),console.log(l),console.log("----------------------------")}else throw new C(`Config not found: ${r}`)}else throw new C(`Invalid config name format: ${r}`);return}if(e==="path"){await ta();return}throw new C(`Invalid mode: ${e}`)})().catch(e=>{new Q().printError(e.message),ee(e),process.exit(1)})});const ko="prepare-commit-msg",Mo=`.git/hooks/${ko}`,Ze=fs(new URL("cli.mjs",import.meta.url)),Va=process.argv[1].replace(/\\/g,"/").endsWith(`/${Mo}`),Io=process.platform==="win32",Ro=`
99
99
  #!/usr/bin/env node
100
100
  import(${JSON.stringify(ds(Ze))})
101
101
  `.trim();var Xa=Y({name:"hook",parameters:["<install/uninstall>"],help:{description:"Install or uninstall the Git prepare-commit-msg hook",examples:["aic2 hook install","aic2 hook uninstall"]}},t=>{(async()=>{const e=await Bt(),{installUninstall:o}=t._,r=P.join(e,Mo),n=await Hr(r);if(o==="install"){if(n){if(await x.realpath(r).catch(()=>{})===Ze){console.warn("The hook is already installed");return}throw new C(`A different ${ko} hook seems to be installed. Please remove it before installing aicommit2.`)}await x.mkdir(P.dirname(r),{recursive:!0}),Io?await x.writeFile(r,Ro):(await x.symlink(Ze,r,"file"),await x.chmod(r,493)),console.log(`${w.green("\u2714")} Hook installed`);return}if(o==="uninstall"){if(!n){console.warn("Hook is not installed");return}if(Io){if(await x.readFile(r,"utf8")!==Ro){console.warn("Hook is not installed");return}}else if(await x.realpath(r)!==Ze){console.warn("Hook is not installed");return}await x.rm(r),console.log(`${w.green("\u2714")} Hook uninstalled`);return}throw new C(`Invalid mode: ${o}`)})().catch(e=>{console.error(`${w.red("\u2716")} ${e.message}`),ee(e),process.exit(1)})}),Ja=Y({name:"log",parameters:["<removeAll>"],help:{description:"Manage log files generated by the application",examples:["aic2 log removeAll"]}},t=>{(async()=>{const{removeAll:e}=t._;if(e==="removeAll"){await ys(Ke,{recursive:!0,force:!0}),console.log(`${w.green("\u2714")} All Log files are removed!`);return}throw new C(`Invalid mode: ${e}`)})().catch(e=>{new Q().printError(e.message),ee(e),process.exit(1)})});const Qa=process.argv.slice(2).filter(t=>!t.startsWith("--pre-commit")),[et,Oo]=Qa;var Za=()=>(async()=>{if(!et)throw new C('Commit message file path is missing. This file should be called from the "pre-commit framework"');if(Oo){console.log(`Skipping aicommit2 message generation for ${Oo} commit`);return}const t=await Ht();if(!t)return;const e=new Q;e.printTitle();const o=await ue({});if(o.systemPromptPath)try{await x.readFile(P.resolve(o.systemPromptPath),"utf-8")}catch{throw new C(`Error reading system prompt file: ${o.systemPromptPath}`)}const r=Object.entries(o).filter(([d])=>le.includes(d)).map(([d,h])=>[d,h]).filter(([d,h])=>!h.disabled).filter(([d,h])=>d==="OLLAMA"?!!h&&!!h.model&&h.model.length>0:d==="HUGGINGFACE"?!!h&&!!h.cookie:!!h.key&&h.key.length>0).map(([d])=>d);if(r.length===0)throw new C("Please set at least one API key via the `aicommit2 config set` command");const s=new Je(o,t);let i;try{i=await rr(s.createCommitMsgRequests$(r).pipe(or(d=>!d.isError),A(d=>d.value),sr()))}finally{e.printAnalyzed()}const l=await x.readFile(et,"utf8")!=="",u=i.length>1;let p="";l&&(p=`# \u{1F916} Generated by aicommit2 (https://github.com/tak-bro/aicommit2)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aicommit2",
3
- "version": "2.2.19",
3
+ "version": "2.2.20",
4
4
  "description": "A Reactive CLI that generates git commit messages with various AI",
5
5
  "keywords": [
6
6
  "cli",
@@ -68,7 +68,7 @@
68
68
  "inquirer": "9.2.8",
69
69
  "inquirer-reactive-list-prompt": "^1.0.15",
70
70
  "ollama": "^0.5.15",
71
- "openai": "^4.102.0",
71
+ "openai": "^5.0.1",
72
72
  "ora": "^8.2.0",
73
73
  "readline": "^1.3.0",
74
74
  "rxjs": "^7.8.2",