pushai 1.0.11 → 1.0.14
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/dist/index.mjs +3 -3
- package/package.json +3 -3
- package/ui.txt +58 -0
package/dist/index.mjs
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import Me from"chalk";import{basename as Ee}from"path";import w from"chalk";var e={common:{operationCancelled:"Operation cancelled.",interrupted:"Request interrupted.",dryRun:"[DRY RUN] No changes were committed or pushed.",noRemote:{header:"There's no Git remote repository configured.",instruction:"Try adding a remote repository (e.g. `git remote add origin <url>`) and run the command again."},success:{committed:"Changes committed successfully.",pushed:"Changes pushed successfully."}},commit:{intro:(t,o)=>`
|
|
2
|
+
import Me from"chalk";import{basename as Ee}from"path";import{Command as ke}from"commander";import b from"chalk";import{confirm as fe,intro as he,isCancel as ye,outro as M}from"@clack/prompts";import Q from"os";import L from"path";import h from"fs";import q from"keytar";var B="pushai",D="api-key";async function U(){let t=T(),o={};if(h.existsSync(t))try{o=JSON.parse(h.readFileSync(t,"utf-8"))}catch{}let i=await q.getPassword(B,D);return i&&(o.apiKey=i),o}async function V(t){let o=T(),{apiKey:i,...l}=t;i&&await q.setPassword(B,D,i);let a={};if(h.existsSync(o))try{a=JSON.parse(h.readFileSync(o,"utf-8"))}catch{}let m={...a,...l};h.writeFileSync(o,JSON.stringify(m,null,2),"utf-8")}async function J(){try{let t=Q.homedir(),o=L.join(t,".config","pushai"),i=!1;return h.existsSync(o)&&(h.rmSync(o,{recursive:!0,force:!0}),i=!0),await q.deletePassword(B,D),i}catch(t){return console.error("Failed to reset config:",t),!1}}function T(){let t=L.join(Q.homedir(),".config","pushai");return h.existsSync(t)||h.mkdirSync(t,{recursive:!0}),L.join(t,"config.json")}import w from"chalk";var e={common:{operationCancelled:"Operation cancelled.",interrupted:"Request interrupted.",dryRun:"[DRY RUN] No changes were committed or pushed.",noRemote:{header:"There's no Git remote repository configured.",instruction:"Try adding a remote repository (e.g. `git remote add origin <url>`) and run the command again."},success:{committed:"Changes committed successfully.",pushed:"Changes pushed successfully."}},commit:{intro:(t,o)=>`
|
|
3
3
|
${w.cyan("\u25CF")} ${w.bgCyan.black.bold(` ${t.toUpperCase()} `)} ${w.dim("\u2022")} ${w.white(o)}
|
|
4
4
|
`,outro:"Successfully synced with the remote repository.",noteTitle:"Ready to commit",gitRepoMissing:"There's no Git repository in this directory.",initConfirm:"Would you like to initialize a new Git repository?",initSuccess:"Git repository initialized successfully.",abortNoRepo:"A Git repository is required to continue.",noChanges:"No changes were found to commit.",generating:"Putting together a commit message..",generatingSlow10:"Please wait.. This might take a moment.",generatingSlow60:"This is taking longer than usual..",generated:"Commit message generated.",generationFailed:"AI failed to generate commit message.",generationCancelled:"Commit message generation cancelled.",emptyMessageTitle:"Empty commit message",emptyMessagePrompt:"AI returned an empty commit message. What would you like to do?",emptyRegenerate:"Regenerate",emptyManual:"Enter manually",emptyCancel:"Cancel",stillEmptyWarning:"Still empty, try manual entry.",manualMessagePrompt:"Enter commit message manually:",manualMessageRequired:"Message cannot be empty",manualAccepted:"Manual message accepted.",actionPrompt:"What would you like to do next?",actions:{accept:"Commit and push changes",edit:"Edit commit message",regenerate:"Generate another message",cancel:"Cancel operation"},editPrompt:"Update the commit message:",regenerating:"Regenerating a new commit message..",regenerated:"New commit message ready.",regenerationFailed:t=>`Couldn't generate another message: ${t}`,processStopped:"Process stopped. No changes were committed or pushed.",committing:"Creating commit..",committingSlow10:"Almost there..",committingSlow60:"Still processing your request..",pushing:"Pushing changes to remote..",pushingSlow10:"Syncing changes..",pushingSlow60:"Still syncing changes.. Please wait.",operationFailed:"Something went wrong while completing the operation.",gitError:t=>`Git reported an error: ${t}`},config:{intro:"Welcome to PushAI. Let's get things set up.",outro:"Configuration complete. You're ready to go!",providerPrompt:"Choose from the available AI providers:",apiKeyPrompt:t=>`Enter your ${w.cyan.bold(t)} API key:`,apiKeyRequired:"You'll need an API key to continue. Simply copy and paste to proceed.",modelPrompt:"Which model would you like to use?",customModelSeparator:"Use a custom model ID",customModelPrompt:"Enter the custom model ID:",customModelRequired:"A model ID is required.",baseUrlPrompt:"Enter a base URL",baseUrlPromptPlaceholder:"Optional \u2014 press Enter to skip",saved:"Configuration saved successfully.",providerLabel:t=>`${w.white.bold("Provider:")} ${t}`,modelLabel:t=>`${w.white.bold("Model: ")} ${t}`,apiKeyLabel:t=>`${w.white.bold("API Key: ")} ****${t}`,configFile:t=>`
|
|
5
|
-
File: ${t}`,commandsHint:"Here are a few commands to try:",hintCommit:"Generate AI-powered commit messages",hintConfig:"Update provider or API settings",hintReset:"Clear saved configuration"},reset:{intro:"Resetting PushAI configuration",confirm:"Remove all PushAI configurations and API keys?",outro:"PushAI configuration removed successfully.",nothingToDelete:"There's no configuration data to remove."},errors:{authFix:"Run `pai reset` to update your credentials."}};
|
|
5
|
+
File: ${t}`,commandsHint:"Here are a few commands to try:",hintCommit:"Generate AI-powered commit messages",hintConfig:"Update provider or API settings",hintReset:"Clear saved configuration"},reset:{intro:"Resetting PushAI configuration",confirm:"Remove all PushAI configurations and API keys?",outro:"PushAI configuration removed successfully.",nothingToDelete:"There's no configuration data to remove."},errors:{authFix:"Run `pai reset` to update your credentials."}};async function Y(){he(b.yellow.bold(e.reset.intro));try{let t=await fe({message:b.red(e.reset.confirm),initialValue:!1});if(ye(t)){M(b.red(e.common.operationCancelled));return}if(!t){M(b.red(e.common.operationCancelled));return}await J()?M(b.green.bold(e.reset.outro)):M(b.dim(e.reset.nothingToDelete))}catch(t){if(t.name==="ExitPromptError"||t.name==="AbortError"){M(b.red(e.common.operationCancelled));return}throw t}}import p from"chalk";import{select as ee,password as Pe,isCancel as O,text as be,intro as Ce,note as te,outro as E}from"@clack/prompts";import{GoogleGenAI as we}from"@google/genai";var v=class{apiKey;model;constructor(o,i){this.apiKey=o,this.model=i}};var C=(t,o=!1)=>{let i=`
|
|
6
6
|
Generate a single conventional commit message from the git diff.
|
|
7
7
|
|
|
8
8
|
Rules:
|
|
@@ -40,4 +40,4 @@ ${e.config.modelLabel(n)}
|
|
|
40
40
|
${e.config.apiKeyLabel(a.slice(-4))}
|
|
41
41
|
${p.dim(e.config.configFile(g))}`;te(f,p.cyan(e.config.saved));let c=`${p.white.bold("pai commit:")} ${p.white(e.config.hintCommit)}
|
|
42
42
|
${p.white.bold("pai config:")} ${p.white(e.config.hintConfig)}
|
|
43
|
-
${p.white.bold("pai reset:")} ${p.white(e.config.hintReset)}`;te(c,p.cyan(e.config.commandsHint)),E(p.green.bold(e.config.outro))}catch(t){if(t.name==="ExitPromptError"){console.log(p.dim(e.common.operationCancelled));return}throw t}}import Re from"ora";import r from"chalk";import Ie from"simple-git";import{confirm as Ae,select as le,text as de,isCancel as k,note as se,outro as d}from"@clack/prompts";import oe from"chalk";import{outro as ie}from"@clack/prompts";function xe(t){if(!(t instanceof Error))return"Something unexpected went wrong.";let o=t.message.toLowerCase();if(o.includes("api key")||o.includes("invalid_api_key")||o.includes("authentication")||o.includes("authorization")||o.includes("unauthorized")||o.includes("401")||o.includes("403"))return"Authentication failed. The API key appears to be invalid.";if(o.includes("429")||o.includes("quota")||o.includes("rate limit")||o.includes("resource_exhausted")||o.includes("too many requests")){let l=(t.message.match(/retry in ([\d.]+s?)/i)||t.message.match(/retrydelay":"(\d+s)"/i))?.[1];return l?`Rate limit exceeded. Try again in ${l}.`:"Rate limit exceeded. Please try again later."}return o.includes("model")&&(o.includes("not found")||o.includes("unsupported")||o.includes("does not exist"))?"The selected AI model is unavailable or unsupported.":o.includes("maximum context length")||o.includes("token limit")?"The git diff is too large for the selected AI model.":o.includes("safety")||o.includes("blocked")?"The AI provider blocked this request.":o.includes("fetch failed")||o.includes("network")||o.includes("econnreset")||o.includes("timeout")?"Network error. Please check your internet connection.":"Commit message generation cancelled."}function j(t){if(t.name==="ExitPromptError")return;let o=xe(t);ie(oe.red(o)),o.includes("Authentication failed")&&ie(oe.yellow(e.errors.authFix))}import{simpleGit as Se}from"simple-git";var x=Se();async function z(){if(!await x.checkIsRepo())return{isRepo:!1};let o=await x.status();return(o.not_added.length>0||o.modified.length>0||o.deleted.length>0)&&await x.add("--all"),{isRepo:!0,diff:await x.diff(["--cached"])}}async function re(){await x.init()}async function ne(){try{return(await x.getRemotes()).length>0}catch{return!1}}import ae from"chalk";function S(t,o,i){let l=setTimeout(()=>{t.isSpinning&&(t.color="yellow",t.text=ae.yellow(o))},1e4),a=setTimeout(()=>{t.isSpinning&&(t.color="red",t.text=ae.red(i))},6e4);return()=>{clearTimeout(l),clearTimeout(a),t.color="cyan"}}var me=Ie();async function ce(t,o,i,l,a){let m=t;for(;!m||m.trim()==="";){a.fail(r.red(e.commit.emptyMessageTitle));let n=await le({message:e.commit.emptyMessagePrompt,options:[{label:e.commit.emptyRegenerate,value:"regenerate"},{label:e.commit.emptyManual,value:"manual"},{label:e.commit.emptyCancel,value:"cancel"}]});if((k(n)||n==="cancel")&&(d(r.dim(e.commit.processStopped)),process.exit(0)),n==="regenerate"){a.start(r.blue(e.commit.regenerating));let g=S(a,e.commit.generatingSlow10,e.commit.generatingSlow60);try{if(m=await o.generateCommitMessage(i,l,{regenerate:!0}),g(),!m||m.trim()===""){a.warn(r.yellow(e.commit.stillEmptyWarning));continue}a.succeed(r.green(e.commit.regenerated))}catch(f){g(),a.fail(r.red(e.commit.regenerationFailed(f.message))),f.name==="AbortError"&&(d(r.yellow(e.commit.generationCancelled)),process.exit(0))}}else if(n==="manual"){let g=await de({message:e.commit.manualMessagePrompt,validate:f=>!f||f.trim()===""?e.commit.manualMessageRequired:void 0});k(g)&&(d(r.dim(e.commit.processStopped)),process.exit(0)),m=g,a.succeed(r.green(e.commit.manualAccepted))}}return m}async function W(t,o){let i=new AbortController;process.stdin.setRawMode?.(!0),process.stdin.resume(),process.stdin.setEncoding("utf8");let l=()=>{i.abort(),d(r.red(e.common.operationCancelled)),process.exit(0)},a=n=>{n===""&&l()};process.stdin.on("data",a),o?.(i);let m=()=>{i.abort(),d(r.red(e.common.operationCancelled)),process.exit(0)};process.once("SIGINT",m);try{let n=await U();if(!n.apiKey||!n.provider||!n.model){await _(),Object.assign(n,await U());return}console.log(e.commit.intro(n.provider.toUpperCase(),n.model));let g=await z();if(!g.isRepo){console.log(r.yellow(e.commit.gitRepoMissing));let u=await Ae({message:e.commit.initConfirm,initialValue:!0});k(u)&&(d(r.red(e.common.operationCancelled)),process.exit(0)),u?(await re(),console.log(r.green(e.commit.initSuccess)),g=await z()):(d(r.dim(e.commit.abortNoRepo)),process.exit(0))}let f=g.diff;f||(d(r.red(e.commit.noChanges)),process.exit(0));let c=Re({color:"cyan"}),s="",y;try{c.start(r.blue(e.commit.generating));let u=S(c,e.commit.generatingSlow10,e.commit.generatingSlow60);y=await Z(n),s=await y.generateCommitMessage(f,i.signal),u(),s=await ce(s,y,f,i.signal,c),c.succeed(r.green(e.commit.generated))}catch(u){c.fail(r.red.bold(e.commit.generationFailed)),u.name==="AbortError"&&(d(r.yellow(e.commit.generationCancelled)),process.exit(0)),j(u),process.exit(1)}t&&(se(r.bold(s),e.commit.noteTitle),d(r.yellow(e.common.dryRun)),process.exit(0));let K=!1;for(;!K;){se(r.bold(s),e.commit.noteTitle);let u=await le({message:e.commit.actionPrompt,options:[{label:e.commit.actions.accept,value:"accept"},{label:e.commit.actions.edit,value:"edit"},{label:e.commit.actions.regenerate,value:"regenerate"},{label:e.commit.actions.cancel,value:"cancel"}]});k(u)&&(d(r.dim(e.commit.processStopped)),process.exit(0));let I=u;if(I==="accept")K=!0;else if(I==="edit"){let A=await de({message:e.commit.editPrompt,initialValue:s});k(A)&&(d(r.dim(e.commit.processStopped)),process.exit(0)),s=A,K=!0}else if(I==="regenerate"){c.start(r.blue(e.commit.regenerating));let A=S(c,e.commit.generatingSlow10,e.commit.generatingSlow60);try{s=await y.generateCommitMessage(f,i.signal,{regenerate:!0}),A(),s=await ce(s,y,f,i.signal,c),c.succeed(r.green(e.commit.regenerated))}catch(H){A(),c.fail(r.red(e.commit.regenerationFailed(H.message))),H.name==="AbortError"&&(d(r.yellow(e.commit.generationCancelled)),process.exit(0))}}else d(r.dim(e.commit.processStopped)),process.exit(0)}await ne()||(c.fail(r.red.bold(e.common.noRemote.header)),d(r.yellow(e.common.noRemote.instruction)),process.exit(1));try{c.start(r.blue(e.commit.committing));let u=S(c,e.commit.committingSlow10,e.commit.committingSlow60);await me.commit(s),u(),c.succeed(r.green(e.common.success.committed)),c.start(r.blue(e.commit.pushing));let I=S(c,e.commit.pushingSlow10,e.commit.pushingSlow60);await me.push(),I(),c.succeed(r.green.bold(e.common.success.pushed)),d(r.green(e.commit.outro))}catch(u){c.fail(r.red.bold(e.commit.operationFailed)),d(r.red(e.commit.gitError(u.message))),process.exit(1)}}catch(n){(n.name==="ExitPromptError"||n.name==="AbortError")&&(d(r.red(e.common.operationCancelled)),process.exit(0)),j(n),process.exit(1)}finally{process.stdin.removeListener("data",a),process.stdin.setRawMode?.(!1),o?.(null)}}var ge="1.0.
|
|
43
|
+
${p.white.bold("pai reset:")} ${p.white(e.config.hintReset)}`;te(c,p.cyan(e.config.commandsHint)),E(p.green.bold(e.config.outro))}catch(t){if(t.name==="ExitPromptError"){console.log(p.dim(e.common.operationCancelled));return}throw t}}import Re from"ora";import r from"chalk";import Ie from"simple-git";import{confirm as Ae,select as le,text as de,isCancel as k,note as se,outro as d}from"@clack/prompts";import oe from"chalk";import{outro as ie}from"@clack/prompts";function xe(t){if(!(t instanceof Error))return"Something unexpected went wrong.";let o=t.message.toLowerCase();if(o.includes("api key")||o.includes("invalid_api_key")||o.includes("authentication")||o.includes("authorization")||o.includes("unauthorized")||o.includes("401")||o.includes("403"))return"Authentication failed. The API key appears to be invalid.";if(o.includes("429")||o.includes("quota")||o.includes("rate limit")||o.includes("resource_exhausted")||o.includes("too many requests")){let l=(t.message.match(/retry in ([\d.]+s?)/i)||t.message.match(/retrydelay":"(\d+s)"/i))?.[1];return l?`Rate limit exceeded. Try again in ${l}.`:"Rate limit exceeded. Please try again later."}return o.includes("model")&&(o.includes("not found")||o.includes("unsupported")||o.includes("does not exist"))?"The selected AI model is unavailable or unsupported.":o.includes("maximum context length")||o.includes("token limit")?"The git diff is too large for the selected AI model.":o.includes("safety")||o.includes("blocked")?"The AI provider blocked this request.":o.includes("fetch failed")||o.includes("network")||o.includes("econnreset")||o.includes("timeout")?"Network error. Please check your internet connection.":"Commit message generation cancelled."}function j(t){if(t.name==="ExitPromptError")return;let o=xe(t);ie(oe.red(o)),o.includes("Authentication failed")&&ie(oe.yellow(e.errors.authFix))}import{simpleGit as Se}from"simple-git";var x=Se();async function z(){if(!await x.checkIsRepo())return{isRepo:!1};let o=await x.status();return(o.not_added.length>0||o.modified.length>0||o.deleted.length>0)&&await x.add("--all"),{isRepo:!0,diff:await x.diff(["--cached"])}}async function re(){await x.init()}async function ne(){try{return(await x.getRemotes()).length>0}catch{return!1}}import ae from"chalk";function S(t,o,i){let l=setTimeout(()=>{t.isSpinning&&(t.color="yellow",t.text=ae.yellow(o))},1e4),a=setTimeout(()=>{t.isSpinning&&(t.color="red",t.text=ae.red(i))},6e4);return()=>{clearTimeout(l),clearTimeout(a),t.color="cyan"}}var me=Ie();async function ce(t,o,i,l,a){let m=t;for(;!m||m.trim()==="";){a.fail(r.red(e.commit.emptyMessageTitle));let n=await le({message:e.commit.emptyMessagePrompt,options:[{label:e.commit.emptyRegenerate,value:"regenerate"},{label:e.commit.emptyManual,value:"manual"},{label:e.commit.emptyCancel,value:"cancel"}]});if((k(n)||n==="cancel")&&(d(r.dim(e.commit.processStopped)),process.exit(0)),n==="regenerate"){a.start(r.blue(e.commit.regenerating));let g=S(a,e.commit.generatingSlow10,e.commit.generatingSlow60);try{if(m=await o.generateCommitMessage(i,l,{regenerate:!0}),g(),!m||m.trim()===""){a.warn(r.yellow(e.commit.stillEmptyWarning));continue}a.succeed(r.green(e.commit.regenerated))}catch(f){g(),a.fail(r.red(e.commit.regenerationFailed(f.message))),f.name==="AbortError"&&(d(r.yellow(e.commit.generationCancelled)),process.exit(0))}}else if(n==="manual"){let g=await de({message:e.commit.manualMessagePrompt,validate:f=>!f||f.trim()===""?e.commit.manualMessageRequired:void 0});k(g)&&(d(r.dim(e.commit.processStopped)),process.exit(0)),m=g,a.succeed(r.green(e.commit.manualAccepted))}}return m}async function W(t,o){let i=new AbortController;process.stdin.setRawMode?.(!0),process.stdin.resume(),process.stdin.setEncoding("utf8");let l=()=>{i.abort(),d(r.red(e.common.operationCancelled)),process.exit(0)},a=n=>{n===""&&l()};process.stdin.on("data",a),o?.(i);let m=()=>{i.abort(),d(r.red(e.common.operationCancelled)),process.exit(0)};process.once("SIGINT",m);try{let n=await U();if(!n.apiKey||!n.provider||!n.model){await _(),Object.assign(n,await U());return}console.log(e.commit.intro(n.provider.toUpperCase(),n.model));let g=await z();if(!g.isRepo){console.log(r.yellow(e.commit.gitRepoMissing));let u=await Ae({message:e.commit.initConfirm,initialValue:!0});k(u)&&(d(r.red(e.common.operationCancelled)),process.exit(0)),u?(await re(),console.log(r.green(e.commit.initSuccess)),g=await z()):(d(r.dim(e.commit.abortNoRepo)),process.exit(0))}let f=g.diff;f||(d(r.red(e.commit.noChanges)),process.exit(0));let c=Re({color:"cyan"}),s="",y;try{c.start(r.blue(e.commit.generating));let u=S(c,e.commit.generatingSlow10,e.commit.generatingSlow60);y=await Z(n),s=await y.generateCommitMessage(f,i.signal),u(),s=await ce(s,y,f,i.signal,c),c.succeed(r.green(e.commit.generated))}catch(u){c.fail(r.red.bold(e.commit.generationFailed)),u.name==="AbortError"&&(d(r.yellow(e.commit.generationCancelled)),process.exit(0)),j(u),process.exit(1)}t&&(se(r.bold(s),e.commit.noteTitle),d(r.yellow(e.common.dryRun)),process.exit(0));let K=!1;for(;!K;){se(r.bold(s),e.commit.noteTitle);let u=await le({message:e.commit.actionPrompt,options:[{label:e.commit.actions.accept,value:"accept"},{label:e.commit.actions.edit,value:"edit"},{label:e.commit.actions.regenerate,value:"regenerate"},{label:e.commit.actions.cancel,value:"cancel"}]});k(u)&&(d(r.dim(e.commit.processStopped)),process.exit(0));let I=u;if(I==="accept")K=!0;else if(I==="edit"){let A=await de({message:e.commit.editPrompt,initialValue:s});k(A)&&(d(r.dim(e.commit.processStopped)),process.exit(0)),s=A,K=!0}else if(I==="regenerate"){c.start(r.blue(e.commit.regenerating));let A=S(c,e.commit.generatingSlow10,e.commit.generatingSlow60);try{s=await y.generateCommitMessage(f,i.signal,{regenerate:!0}),A(),s=await ce(s,y,f,i.signal,c),c.succeed(r.green(e.commit.regenerated))}catch(H){A(),c.fail(r.red(e.commit.regenerationFailed(H.message))),H.name==="AbortError"&&(d(r.yellow(e.commit.generationCancelled)),process.exit(0))}}else d(r.dim(e.commit.processStopped)),process.exit(0)}await ne()||(c.fail(r.red.bold(e.common.noRemote.header)),d(r.yellow(e.common.noRemote.instruction)),process.exit(1));try{c.start(r.blue(e.commit.committing));let u=S(c,e.commit.committingSlow10,e.commit.committingSlow60);await me.commit(s),u(),c.succeed(r.green(e.common.success.committed)),c.start(r.blue(e.commit.pushing));let I=S(c,e.commit.pushingSlow10,e.commit.pushingSlow60);await me.push(),I(),c.succeed(r.green.bold(e.common.success.pushed)),d(r.green(e.commit.outro))}catch(u){c.fail(r.red.bold(e.commit.operationFailed)),d(r.red(e.commit.gitError(u.message))),process.exit(1)}}catch(n){(n.name==="ExitPromptError"||n.name==="AbortError")&&(d(r.red(e.common.operationCancelled)),process.exit(0)),j(n),process.exit(1)}finally{process.stdin.removeListener("data",a),process.stdin.setRawMode?.(!1),o?.(null)}}var ge="1.0.13",ue="Ship commits at the speed of thought.";var R=null,P=new ke,Te=Ee(process.argv[1]);P.name(Te);P.description(ue);P.version(ge,"-v, --version","output the version number");P.action(async()=>{let o=process.argv.slice(2).includes("--dry-run");await W(o,i=>{R=i}),R=null});P.command("commit").description("Stage changes, generate a message, and push").option("--dry-run","Generate commit message but do not commit or push").action(async t=>{let o=process.argv.includes("--dry-run");await W(o,i=>{R=i}),R=null});P.command("config").description("Configure AI providers and API keys").action(_);P.command("reset").description("Delete the local config.json file").action(Y);process.on("SIGINT",()=>{console.log(Me.yellow(e.common.interrupted)),R?R.abort():process.exit(0)});P.parse();
|
package/package.json
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pushai",
|
|
3
|
-
"version": "1.0.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "1.0.14",
|
|
4
|
+
"description": "Ship commits at the speed of thought.",
|
|
5
5
|
"bin": {
|
|
6
6
|
"pai": "./dist/index.mjs",
|
|
7
7
|
"pushai": "./dist/index.mjs"
|
|
8
8
|
},
|
|
9
9
|
"scripts": {
|
|
10
10
|
"dev": "tsup src/index.ts --format esm --watch --clean",
|
|
11
|
-
"build": "tsup
|
|
11
|
+
"build": "tsup",
|
|
12
12
|
"start": "pnpm build && clear && node dist/index.mjs",
|
|
13
13
|
"pushout": "npm publish",
|
|
14
14
|
"pushout-inc": "npm version patch --no-git-tag-version && pnpm pushout"
|
package/ui.txt
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
```markdown pai config
|
|
2
|
+
┌ Welcome to PushAI. Let's get things set up.
|
|
3
|
+
│
|
|
4
|
+
◇ Choose from the available AI providers:
|
|
5
|
+
│ Google Gemini
|
|
6
|
+
│
|
|
7
|
+
◇ Enter your gemini API key:
|
|
8
|
+
│ ***************************************
|
|
9
|
+
│
|
|
10
|
+
◇ Which model would you like to use?
|
|
11
|
+
│ Gemini 3.1 Flash Lite
|
|
12
|
+
│
|
|
13
|
+
└ Configuration complete. You're ready to go!
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
```markdown pai commit
|
|
17
|
+
┌ ● GEMINI • gemini-3.1-flash-lite
|
|
18
|
+
│
|
|
19
|
+
✔ Commit message generated.
|
|
20
|
+
│
|
|
21
|
+
◇ Ready to commit ───────────────────────────────────╮
|
|
22
|
+
│ │
|
|
23
|
+
│ feat(providers): add streaming support for Gemini │
|
|
24
|
+
│ │
|
|
25
|
+
├─────────────────────────────────────────────────────╯
|
|
26
|
+
│
|
|
27
|
+
◇ What would you like to do next?
|
|
28
|
+
│ Commit and push changes
|
|
29
|
+
│
|
|
30
|
+
✔ Changes committed successfully.
|
|
31
|
+
│
|
|
32
|
+
✔ Changes pushed successfully.
|
|
33
|
+
│
|
|
34
|
+
└ Successfully synced with the remote repository.
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
```markdown pai commit --dry-run
|
|
38
|
+
┌ ● GEMINI • gemini-3.1-flash-lite
|
|
39
|
+
│
|
|
40
|
+
✔ Commit message generated.
|
|
41
|
+
│
|
|
42
|
+
◇ Ready to commit ───────────────────────────────────╮
|
|
43
|
+
│ │
|
|
44
|
+
│ feat(providers): add streaming support for Gemini │
|
|
45
|
+
│ │
|
|
46
|
+
├─────────────────────────────────────────────────────╯
|
|
47
|
+
│
|
|
48
|
+
└ [DRY RUN] No changes were committed or pushed.
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
```markdown pai reset
|
|
52
|
+
┌ Resetting PushAI configuration
|
|
53
|
+
│
|
|
54
|
+
◇ Remove all PushAI configurations and API keys?
|
|
55
|
+
│ ● Yes / ○ No
|
|
56
|
+
│
|
|
57
|
+
└ PushAI configuration removed successfully.
|
|
58
|
+
```
|