prjct-cli 3.50.1 → 3.50.2

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.
@@ -1209,7 +1209,7 @@ CREATE TABLE velocity_sprints (
1209
1209
  name TEXT NOT NULL,
1210
1210
  applied_at TEXT NOT NULL
1211
1211
  )
1212
- `);let r=new Set(e.prepare("SELECT version FROM _migrations").all().map(i=>i.version)),s=No.filter(i=>!r.has(i.version));if(s.length!==0){if(n&&r.size>0)try{let i=`${n}.pre-migrate.bak`;ti.existsSync(i)&&ti.rmSync(i,{force:!0}),e.prepare("VACUUM INTO ?").run(i)}catch(i){console.warn(`prjct: pre-migration backup failed (continuing): ${i?.message??i}`)}for(let i of s)Yl(e,()=>{i.up(e),e.prepare("INSERT INTO _migrations (version, name, applied_at) VALUES (?, ?, ?)").run(i.version,i.name,new Date().toISOString())})}}getMigrations(e){return this.getDb(e).prepare("SELECT * FROM _migrations ORDER BY version").all()}getSchemaVersion(e){return this.getDb(e).prepare("SELECT MAX(version) as version FROM _migrations").get()?.version??0}},E=new Do,y=E});function dh(t){let e=t.toLowerCase();return e.includes("github")?"github":e.includes("gitlab")?"gitlab":e.includes("bitbucket")?"bitbucket":"other"}function zl(t){let e=t.trim();if(!e)return{};let n=e.match(/^[^/@]+@([^:/]+):(.+?)(?:\.git)?\/?$/);if(n)return{provider:dh(n[1]),repoSlug:n[2]};try{let r=new URL(e),s=r.pathname.replace(/^\/+/,"").replace(/\.git$/,"").replace(/\/+$/,"");return!r.host||!s?{}:{provider:dh(r.host),repoSlug:s}}catch{return{}}}async function BA(t){try{let{stdout:e}=await H("git",["remote","get-url","origin"],{cwd:t});return e.trim()||void 0}catch{return}}async function GA(t){try{let{stdout:e}=await H("git",["symbolic-ref","--short","refs/remotes/origin/HEAD"],{cwd:t});return e.trim().replace(/^origin\//,"")||void 0}catch{return}}function zn(t){return typeof t=="string"&&t.length>0?t:void 0}function ph(t){return typeof t=="number"&&Number.isFinite(t)?t:void 0}function XA(t){return Object.fromEntries(Object.entries(t).filter(([,e])=>e!==void 0))}async function mh(t){let e=E.getDoc(t,"project")||{},n=zn(e.repoPath),{provider:r,repoSlug:s}=n?zl(await BA(n)||""):{},i=n?await GA(n):void 0,o=Array.isArray(e.techStack)?e.techStack.filter(c=>typeof c=="string"):void 0;return XA({provider:r,repoSlug:s,currentBranch:zn(e.currentBranch),defaultBranch:i,stack:zn(e.stack),techStack:o&&o.length>0?o:void 0,version:zn(e.version),commitCount:ph(e.commitCount),fileCount:ph(e.fileCount),lastCommit:zn(e.lastSyncCommit),hasUncommitted:typeof e.hasUncommittedChanges=="boolean"?e.hasUncommittedChanges:void 0,cliVersion:zn(e.cliVersion),syncedAt:zn(e.lastSync)})}var Ql=f(()=>{"use strict";N();re();a(dh,"providerForHost");a(zl,"parseRemote");a(BA,"gitRemoteUrl");a(GA,"gitDefaultBranch");a(zn,"str");a(ph,"num");a(XA,"compact");a(mh,"buildProjectMeta")});import{execFile as qA}from"node:child_process";import VA from"node:crypto";import{promisify as JA}from"node:util";function zA(t,e=YA){let n=Buffer.from(e.replace(/-/g,""),"hex"),s=VA.createHash("sha1").update(n).update(t,"utf8").digest().subarray(0,16);s[6]=s[6]&15|80,s[8]=s[8]&63|128;let i=s.toString("hex");return`${i.slice(0,8)}-${i.slice(8,12)}-${i.slice(12,16)}-${i.slice(16,20)}-${i.slice(20,32)}`}async function QA(t){let e;try{let{stdout:s}=await KA("git",["remote","get-url","origin"],{cwd:t});e=s.trim()||void 0}catch{return null}if(!e)return null;let{provider:n,repoSlug:r}=zl(e);return!n||!r?null:`${n}:${r}`.toLowerCase()}async function gh(t){let e=await QA(t);return e?zA(e):null}var KA,YA,fh=f(()=>{"use strict";Ql();KA=JA(qA),YA="6f9b2c1a-3d4e-5f60-8a7b-1c2d3e4f5a6b";a(zA,"uuidv5");a(QA,"repoKey");a(gh,"deriveProjectId")});var tu={};x(tu,{PACKAGE_ROOT:()=>sn,VERSION:()=>We,getPackageRoot:()=>eu,getVersion:()=>Oo,resetPackageRoot:()=>ZA});import Zl from"node:fs";import Po from"node:path";function eu(){if(Wr)return Wr;let t=__dirname;for(let e=0;e<5;e++){let n=Po.join(t,"package.json");if(Zl.existsSync(n))try{if(JSON.parse(Zl.readFileSync(n,"utf-8")).name==="prjct-cli")return Wr=t,t}catch{}t=Po.dirname(t)}return Wr=Po.join(__dirname,"..","..",".."),Wr}function Oo(){if(Qn)return Qn;let t="3.50.1";if(t&&/^\d+\.\d+\.\d+/.test(t))return Qn=t,Qn;try{let e=Po.join(eu(),"package.json");return Qn=JSON.parse(Zl.readFileSync(e,"utf-8")).version,Qn}catch(e){return process.env.PRJCT_DEBUG==="1"&&console.error("Failed to read version from package.json:",R(e)),"0.0.0"}}function ZA(t){Wr=t,Qn=null}var Qn,Wr,We,sn,bt=f(()=>{"use strict";ee();Qn=null,Wr=null;a(eu,"getPackageRoot");a(Oo,"getVersion");a(ZA,"resetPackageRoot");We=Oo(),sn=eu()});async function Lo(t){try{let{stdout:e}=await $(t,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function eI(){let t=await Lo("gh api user --jq .login");return t.success&&t.output||(t=await Lo("git config --global github.user"),t.success&&t.output)?t.output:null}async function tI(){let t=await Lo("git config user.name");return t.success&&t.output?t.output:null}async function nI(){let t=await Lo("git config user.email");return t.success&&t.output?t.output:null}async function Br(){let[t,e,n]=await Promise.all([eI(),tI(),nI()]);return{github:t,email:n,name:e||t||"Unknown"}}var jo=f(()=>{"use strict";re();a(Lo,"execCommand");a(eI,"detectGitHubUsername");a(tI,"detectGitName");a(nI,"detectGitEmail");a(Br,"detect")});var Mo={};x(Mo,{worktreeService:()=>rI});import ru from"node:fs/promises";import Ut from"node:path";var hh,su,rI,$o=f(()=>{"use strict";re();Y();hh=".worktrees",su=class{static{a(this,"WorktreeService")}async create(e,n,r={}){let s=await this.getMainWorktree(e),i=Ut.join(s,hh,n),o=r.branch||`feat/${n}`;await ru.mkdir(Ut.join(s,hh),{recursive:!0});let c=r.baseBranch?` ${r.baseBranch}`:"";await $(`git worktree add "${i}" -b "${o}"${c}`,{cwd:s});let{stdout:l}=await $("git rev-parse HEAD",{cwd:i});return{path:i,branch:o,commit:l.trim(),isMain:!1,slug:n}}async remove(e,n=!1){let r=await this.getMainWorktree(e),s;if(n)try{let{stdout:i}=await $("git rev-parse --abbrev-ref HEAD",{cwd:e});s=i.trim()}catch{}if(await $(`git worktree remove "${e}" --force`,{cwd:r}),n&&s&&s!=="main"&&s!=="master")try{await $(`git branch -D "${s}"`,{cwd:r})}catch{}}async list(e){let n=await this.getMainWorktree(e),{stdout:r}=await $("git worktree list --porcelain",{cwd:n});return this.parsePorcelainOutput(r,n)}async detect(e){try{let{stdout:n}=await $("git rev-parse --git-common-dir",{cwd:e}),{stdout:r}=await $("git rev-parse --git-dir",{cwd:e}),s=Ut.resolve(e,n.trim()),i=Ut.resolve(e,r.trim());if(s!==i){let{stdout:o}=await $("git rev-parse --abbrev-ref HEAD",{cwd:e}),{stdout:c}=await $("git rev-parse HEAD",{cwd:e}),{stdout:l}=await $("git rev-parse --show-toplevel",{cwd:e}),u=l.trim(),d=Ut.basename(u);return{path:u,branch:o.trim(),commit:c.trim(),isMain:!1,slug:d}}return null}catch{return null}}async getMainWorktree(e){try{let{stdout:r}=await $("git worktree list --porcelain",{cwd:e}),s=r.split(`
1212
+ `);let r=new Set(e.prepare("SELECT version FROM _migrations").all().map(i=>i.version)),s=No.filter(i=>!r.has(i.version));if(s.length!==0){if(n&&r.size>0)try{let i=`${n}.pre-migrate.bak`;ti.existsSync(i)&&ti.rmSync(i,{force:!0}),e.prepare("VACUUM INTO ?").run(i)}catch(i){console.warn(`prjct: pre-migration backup failed (continuing): ${i?.message??i}`)}for(let i of s)Yl(e,()=>{i.up(e),e.prepare("INSERT INTO _migrations (version, name, applied_at) VALUES (?, ?, ?)").run(i.version,i.name,new Date().toISOString())})}}getMigrations(e){return this.getDb(e).prepare("SELECT * FROM _migrations ORDER BY version").all()}getSchemaVersion(e){return this.getDb(e).prepare("SELECT MAX(version) as version FROM _migrations").get()?.version??0}},E=new Do,y=E});function dh(t){let e=t.toLowerCase();return e.includes("github")?"github":e.includes("gitlab")?"gitlab":e.includes("bitbucket")?"bitbucket":"other"}function zl(t){let e=t.trim();if(!e)return{};let n=e.match(/^[^/@]+@([^:/]+):(.+?)(?:\.git)?\/?$/);if(n)return{provider:dh(n[1]),repoSlug:n[2]};try{let r=new URL(e),s=r.pathname.replace(/^\/+/,"").replace(/\.git$/,"").replace(/\/+$/,"");return!r.host||!s?{}:{provider:dh(r.host),repoSlug:s}}catch{return{}}}async function BA(t){try{let{stdout:e}=await H("git",["remote","get-url","origin"],{cwd:t});return e.trim()||void 0}catch{return}}async function GA(t){try{let{stdout:e}=await H("git",["symbolic-ref","--short","refs/remotes/origin/HEAD"],{cwd:t});return e.trim().replace(/^origin\//,"")||void 0}catch{return}}function zn(t){return typeof t=="string"&&t.length>0?t:void 0}function ph(t){return typeof t=="number"&&Number.isFinite(t)?t:void 0}function XA(t){return Object.fromEntries(Object.entries(t).filter(([,e])=>e!==void 0))}async function mh(t){let e=E.getDoc(t,"project")||{},n=zn(e.repoPath),{provider:r,repoSlug:s}=n?zl(await BA(n)||""):{},i=n?await GA(n):void 0,o=Array.isArray(e.techStack)?e.techStack.filter(c=>typeof c=="string"):void 0;return XA({provider:r,repoSlug:s,currentBranch:zn(e.currentBranch),defaultBranch:i,stack:zn(e.stack),techStack:o&&o.length>0?o:void 0,version:zn(e.version),commitCount:ph(e.commitCount),fileCount:ph(e.fileCount),lastCommit:zn(e.lastSyncCommit),hasUncommitted:typeof e.hasUncommittedChanges=="boolean"?e.hasUncommittedChanges:void 0,cliVersion:zn(e.cliVersion),syncedAt:zn(e.lastSync)})}var Ql=f(()=>{"use strict";N();re();a(dh,"providerForHost");a(zl,"parseRemote");a(BA,"gitRemoteUrl");a(GA,"gitDefaultBranch");a(zn,"str");a(ph,"num");a(XA,"compact");a(mh,"buildProjectMeta")});import{execFile as qA}from"node:child_process";import VA from"node:crypto";import{promisify as JA}from"node:util";function zA(t,e=YA){let n=Buffer.from(e.replace(/-/g,""),"hex"),s=VA.createHash("sha1").update(n).update(t,"utf8").digest().subarray(0,16);s[6]=s[6]&15|80,s[8]=s[8]&63|128;let i=s.toString("hex");return`${i.slice(0,8)}-${i.slice(8,12)}-${i.slice(12,16)}-${i.slice(16,20)}-${i.slice(20,32)}`}async function QA(t){let e;try{let{stdout:s}=await KA("git",["remote","get-url","origin"],{cwd:t});e=s.trim()||void 0}catch{return null}if(!e)return null;let{provider:n,repoSlug:r}=zl(e);return!n||!r?null:`${n}:${r}`.toLowerCase()}async function gh(t){let e=await QA(t);return e?zA(e):null}var KA,YA,fh=f(()=>{"use strict";Ql();KA=JA(qA),YA="6f9b2c1a-3d4e-5f60-8a7b-1c2d3e4f5a6b";a(zA,"uuidv5");a(QA,"repoKey");a(gh,"deriveProjectId")});var tu={};x(tu,{PACKAGE_ROOT:()=>sn,VERSION:()=>We,getPackageRoot:()=>eu,getVersion:()=>Oo,resetPackageRoot:()=>ZA});import Zl from"node:fs";import Po from"node:path";function eu(){if(Wr)return Wr;let t=__dirname;for(let e=0;e<5;e++){let n=Po.join(t,"package.json");if(Zl.existsSync(n))try{if(JSON.parse(Zl.readFileSync(n,"utf-8")).name==="prjct-cli")return Wr=t,t}catch{}t=Po.dirname(t)}return Wr=Po.join(__dirname,"..","..",".."),Wr}function Oo(){if(Qn)return Qn;let t="3.50.2";if(t&&/^\d+\.\d+\.\d+/.test(t))return Qn=t,Qn;try{let e=Po.join(eu(),"package.json");return Qn=JSON.parse(Zl.readFileSync(e,"utf-8")).version,Qn}catch(e){return process.env.PRJCT_DEBUG==="1"&&console.error("Failed to read version from package.json:",R(e)),"0.0.0"}}function ZA(t){Wr=t,Qn=null}var Qn,Wr,We,sn,bt=f(()=>{"use strict";ee();Qn=null,Wr=null;a(eu,"getPackageRoot");a(Oo,"getVersion");a(ZA,"resetPackageRoot");We=Oo(),sn=eu()});async function Lo(t){try{let{stdout:e}=await $(t,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function eI(){let t=await Lo("gh api user --jq .login");return t.success&&t.output||(t=await Lo("git config --global github.user"),t.success&&t.output)?t.output:null}async function tI(){let t=await Lo("git config user.name");return t.success&&t.output?t.output:null}async function nI(){let t=await Lo("git config user.email");return t.success&&t.output?t.output:null}async function Br(){let[t,e,n]=await Promise.all([eI(),tI(),nI()]);return{github:t,email:n,name:e||t||"Unknown"}}var jo=f(()=>{"use strict";re();a(Lo,"execCommand");a(eI,"detectGitHubUsername");a(tI,"detectGitName");a(nI,"detectGitEmail");a(Br,"detect")});var Mo={};x(Mo,{worktreeService:()=>rI});import ru from"node:fs/promises";import Ut from"node:path";var hh,su,rI,$o=f(()=>{"use strict";re();Y();hh=".worktrees",su=class{static{a(this,"WorktreeService")}async create(e,n,r={}){let s=await this.getMainWorktree(e),i=Ut.join(s,hh,n),o=r.branch||`feat/${n}`;await ru.mkdir(Ut.join(s,hh),{recursive:!0});let c=r.baseBranch?` ${r.baseBranch}`:"";await $(`git worktree add "${i}" -b "${o}"${c}`,{cwd:s});let{stdout:l}=await $("git rev-parse HEAD",{cwd:i});return{path:i,branch:o,commit:l.trim(),isMain:!1,slug:n}}async remove(e,n=!1){let r=await this.getMainWorktree(e),s;if(n)try{let{stdout:i}=await $("git rev-parse --abbrev-ref HEAD",{cwd:e});s=i.trim()}catch{}if(await $(`git worktree remove "${e}" --force`,{cwd:r}),n&&s&&s!=="main"&&s!=="master")try{await $(`git branch -D "${s}"`,{cwd:r})}catch{}}async list(e){let n=await this.getMainWorktree(e),{stdout:r}=await $("git worktree list --porcelain",{cwd:n});return this.parsePorcelainOutput(r,n)}async detect(e){try{let{stdout:n}=await $("git rev-parse --git-common-dir",{cwd:e}),{stdout:r}=await $("git rev-parse --git-dir",{cwd:e}),s=Ut.resolve(e,n.trim()),i=Ut.resolve(e,r.trim());if(s!==i){let{stdout:o}=await $("git rev-parse --abbrev-ref HEAD",{cwd:e}),{stdout:c}=await $("git rev-parse HEAD",{cwd:e}),{stdout:l}=await $("git rev-parse --show-toplevel",{cwd:e}),u=l.trim(),d=Ut.basename(u);return{path:u,branch:o.trim(),commit:c.trim(),isMain:!1,slug:d}}return null}catch{return null}}async getMainWorktree(e){try{let{stdout:r}=await $("git worktree list --porcelain",{cwd:e}),s=r.split(`
1213
1213
  `)[0];if(s?.startsWith("worktree "))return s.replace("worktree ","").trim()}catch{}let{stdout:n}=await $("git rev-parse --show-toplevel",{cwd:e});return n.trim()}async setup(e,n){let r=Ut.join(n,".env");await I(r)&&await ru.copyFile(r,Ut.join(e,".env"));let s=Ut.join(n,".prjct"),i=Ut.join(e,".prjct");await I(s)&&!await I(i)&&await ru.symlink(s,i,"dir")}async teardown(e){}async clean(e){let n=await this.list(e),r=[],s=await this.getMainWorktree(e);await $("git worktree prune",{cwd:s});for(let i of n)i.isMain||await I(i.path)||r.push(i.slug);return r}parsePorcelainOutput(e,n){let r=[],s=e.trim().split(`
1214
1214
 
1215
1215
  `);for(let i of s){if(!i.trim())continue;let o=i.trim().split(`