@anytio/pspm 0.0.3 → 0.0.4
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 +86 -36
- package/dist/index.js +380 -568
- package/dist/index.js.map +1 -1
- package/package.json +67 -65
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../packages/shared/pspm-types/src/integrity.ts","../../../packages/shared/pspm-types/src/specifier.ts","../../../packages/shared/pspm-types/src/version.ts","../../../packages/sdk/src/fetcher.ts","../../../packages/sdk/src/generated/index.ts","../src/api-client.ts","../src/errors.ts","../src/config.ts","../src/lockfile.ts","../src/commands/add.ts","../src/commands/config/add.ts","../src/commands/config/delete.ts","../src/commands/config/init.ts","../src/commands/config/list.ts","../src/commands/config/set.ts","../src/commands/config/show.ts","../src/commands/config/use.ts","../src/commands/install.ts","../src/commands/list.ts","../src/commands/login.ts","../src/commands/logout.ts","../src/commands/publish.ts","../src/commands/remove.ts","../src/commands/unpublish.ts","../src/commands/update.ts","../src/commands/whoami.ts","../src/index.ts"],"names":["version","config","readFile","mkdir","dirname","writeFile","join","exec","promisify","stat","createHash","rm","exchangeCliToken","execCb","packageJson","semver","match","__dirname"],"mappings":";;;;;;;;;;;;;;AASO,SAAS,mBAAmB,IAAA,EAAsB;AACxD,EAAA,MAAM,IAAA,GAAO,WAAW,QAAQ,CAAA,CAAE,OAAO,IAAI,CAAA,CAAE,OAAO,QAAQ,CAAA;AAC9D,EAAA,OAAO,UAAU,IAAI,CAAA,CAAA;AACtB;;;ACEA,IAAM,iBAAA,GACL,yDAAA;AAiBM,SAAS,oBAAoB,SAAA,EAA0C;AAC7E,EAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,KAAA,CAAM,iBAAiB,CAAA;AAE/C,EAAA,IAAI,CAAC,KAAA,EAAO;AACX,IAAA,OAAO,IAAA;AAAA,EACR;AAEA,EAAA,OAAO;AAAA,IACN,QAAA,EAAU,MAAM,CAAC,CAAA;AAAA,IACjB,IAAA,EAAM,MAAM,CAAC,CAAA;AAAA,IACb,YAAA,EAAc,MAAM,CAAC;AAAA,GACtB;AACD;ACnCO,SAAS,cAAA,CACf,OACA,iBAAA,EACgB;AAChB,EAAA,MAAM,SAAS,iBAAA,CACb,MAAA,CAAO,CAAC,CAAA,KAAa,aAAM,CAAC,CAAC,CAAA,CAC7B,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAa,MAAA,CAAA,QAAA,CAAS,CAAA,EAAG,CAAC,CAAC,CAAA;AAEtC,EAAA,IAAI,CAAC,KAAA,IAAS,KAAA,KAAU,QAAA,IAAY,UAAU,GAAA,EAAK;AAClD,IAAA,OAAO,MAAA,CAAO,CAAC,CAAA,IAAK,IAAA;AAAA,EACrB;AAEA,EAAA,OAAc,MAAA,CAAA,aAAA,CAAc,QAAQ,KAAK,CAAA;AAC1C;;;ACXA,IAAI,MAAA,GAA2B,IAAA;AAgBxB,SAAS,UAAU,OAAA,EAA0B;AACnD,EAAA,MAAA,GAAS,OAAA;AACV;AAMO,SAAS,SAAA,GAAuB;AACtC,EAAA,IAAI,CAAC,MAAA,EAAQ;AACZ,IAAA,MAAM,IAAI,MAAM,6CAA6C,CAAA;AAAA,EAC9D;AACA,EAAA,OAAO,MAAA;AACR;AAwCA,eAAsB,WAAA,CACrB,KACA,OAAA,EACa;AACb,EAAA,MAAM,EAAE,OAAA,EAAS,MAAA,EAAO,GAAI,SAAA,EAAU;AAItC,EAAA,MAAM,OAAA,GAAU,CAAA,EAAG,OAAO,CAAA,EAAG,GAAG,CAAA,CAAA;AAEhC,EAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,OAAA,EAAS;AAAA,IACrC,GAAG,OAAA;AAAA,IACH,OAAA,EAAS;AAAA,MACR,GAAG,OAAA,CAAQ,OAAA;AAAA,MACX,aAAA,EAAe,UAAU,MAAM,CAAA,CAAA;AAAA,MAC/B,cAAA,EAAgB;AAAA;AACjB,GACA,CAAA;AAED,EAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,EAAA,IAAI,IAAA,GAAgB,IAAA;AAEpB,EAAA,IAAI,IAAA,EAAM;AACT,IAAA,IAAI;AACH,MAAA,IAAA,GAAO,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,IACvB,CAAA,CAAA,MAAQ;AACP,MAAA,IAAA,GAAO,IAAA;AAAA,IACR;AAAA,EACD;AAGA,EAAA,OAAO;AAAA,IACN,IAAA;AAAA,IACA,QAAQ,QAAA,CAAS,MAAA;AAAA,IACjB,SAAS,QAAA,CAAS;AAAA,GACnB;AACD;;;AC8RO,IAAM,WAAW,MAAM;AAK5B,EAAA,OAAO,CAAA,GAAA,CAAA;AACT,CAAA;AAEO,IAAM,EAAA,GAAK,OAAQ,OAAA,KAA+C;AAEvE,EAAA,OAAO,WAAA;AAAA,IAAwB,QAAA,EAAS;AAAA,IACxC;AAAA,MACE,GAAG,OAAA;AAAA,MACH,MAAA,EAAQ;AAAA;AAGV,GACF;AAAE,CAAA;AAqIK,IAAM,uBAAA,GAA0B,CAAC,QAAA,EACpC,IAAA,KAAkB;AAKpB,EAAA,OAAO,CAAA,OAAA,EAAU,QAAQ,CAAA,CAAA,EAAI,IAAI,CAAA,SAAA,CAAA;AACnC,CAAA;AAEO,IAAM,iBAAA,GAAoB,OAAO,QAAA,EACpC,IAAA,EAAc,OAAA,KAA8D;AAE9E,EAAA,OAAO,WAAA;AAAA,IAAuC,uBAAA,CAAwB,UAAS,IAAI,CAAA;AAAA,IACnF;AAAA,MACE,GAAG,OAAA;AAAA,MACH,MAAA,EAAQ;AAAA;AAGV,GACF;AAAE,CAAA;AAoBK,IAAM,qBAAA,GAAwB,CAAC,QAAA,EAClC,IAAA,EACAA,QAAAA,KAAqB;AAKvB,EAAA,OAAO,CAAA,OAAA,EAAU,QAAQ,CAAA,CAAA,EAAI,IAAI,IAAIA,QAAO,CAAA,CAAA;AAC9C,CAAA;AAEO,IAAM,eAAA,GAAkB,OAAO,QAAA,EAClC,IAAA,EACAA,UAAiB,OAAA,KAA4D;AAE/E,EAAA,OAAO,WAAA;AAAA,IAAqC,qBAAA,CAAsB,QAAA,EAAS,IAAA,EAAKA,QAAO,CAAA;AAAA,IACvF;AAAA,MACE,GAAG,OAAA;AAAA,MACH,MAAA,EAAQ;AAAA;AAGV,GACF;AAAE,CAAA;AAoBK,IAAM,qBAAqB,MAAM;AAKtC,EAAA,OAAO,CAAA,QAAA,CAAA;AACT,CAAA;AAEO,IAAM,YAAA,GAAe,OAAO,gBAAA,EAAoC,OAAA,KAAyD;AAE9H,EAAA,OAAO,WAAA;AAAA,IAAkC,kBAAA,EAAmB;AAAA,IAC5D;AAAA,MACE,GAAG,OAAA;AAAA,MACH,MAAA,EAAQ,MAAA;AAAA,MACR,SAAS,EAAE,cAAA,EAAgB,kBAAA,EAAoB,GAAG,SAAS,OAAA,EAAQ;AAAA,MACnE,MAAM,IAAA,CAAK,SAAA;AAAA,QACT;AAAA;AAAiB;AACrB,GACF;AAAE,CAAA;AAoBK,IAAM,iBAAA,GAAoB,CAAC,IAAA,KAAkB;AAKlD,EAAA,OAAO,IAAI,IAAI,CAAA,CAAA;AACjB,CAAA;AAEO,IAAM,WAAA,GAAc,OAAO,IAAA,EAC9B,eAAA,EAAmC,OAAA,KAAwD;AAE7F,EAAA,OAAO,WAAA;AAAA,IAAiC,kBAAkB,IAAI,CAAA;AAAA,IAC9D;AAAA,MACE,GAAG,OAAA;AAAA,MACH,MAAA,EAAQ,QAAA;AAAA,MACR,SAAS,EAAE,cAAA,EAAgB,kBAAA,EAAoB,GAAG,SAAS,OAAA,EAAQ;AAAA,MACnE,MAAM,IAAA,CAAK,SAAA;AAAA,QACT;AAAA;AAAgB;AACpB,GACF;AAAE,CAAA;AAoBK,IAAM,wBAAA,GAA2B,CAAC,IAAA,EACrCA,QAAAA,KAAqB;AAKvB,EAAA,OAAO,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,EAAIA,QAAO,CAAA,CAAA;AAC5B,CAAA;AAEO,IAAM,kBAAA,GAAqB,OAAO,IAAA,EACrCA,QAAAA,EACA,wBAAiD,OAAA,KAA+D;AAElH,EAAA,OAAO,WAAA;AAAA,IAAwC,wBAAA,CAAyB,MAAKA,QAAO,CAAA;AAAA,IACpF;AAAA,MACE,GAAG,OAAA;AAAA,MACH,MAAA,EAAQ,QAAA;AAAA,MACR,SAAS,EAAE,cAAA,EAAgB,kBAAA,EAAoB,GAAG,SAAS,OAAA,EAAQ;AAAA,MACnE,MAAM,IAAA,CAAK,SAAA;AAAA,QACT;AAAA;AAAuB;AAC3B,GACF;AAAE,CAAA;;;ACxqBF,eAAsB,aAAA,CACrB,aACA,MAAA,EACuD;AACvD,EAAA,IAAI;AAEH,IAAA,SAAA,CAAU,EAAE,OAAA,EAAS,WAAA,EAAa,MAAA,EAAQ,CAAA;AAC1C,IAAA,MAAM,QAAA,GAAW,MAAM,EAAA,EAAG;AAC1B,IAAA,MAAM,OAAO,QAAA,CAAS,IAAA;AACtB,IAAA,IAAI,CAAC,IAAA,EAAM;AACV,MAAA,OAAO,IAAA;AAAA,IACR;AACA,IAAA,OAAO;AAAA,MACN,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,QAAQ,IAAA,CAAK;AAAA,KACd;AAAA,EACD,CAAA,CAAA,MAAQ;AACP,IAAA,OAAO,IAAA;AAAA,EACR;AACD;;;AClEO,IAAM,WAAA,GAAN,cAA0B,KAAA,CAAM;AAAA,EACtC,YAAY,OAAA,EAAiB;AAC5B,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,aAAA;AAAA,EACb;AACD,CAAA;AAKO,IAAM,oBAAA,GAAN,cAAmC,WAAA,CAAY;AAAA,EACrD,YAAY,WAAA,EAAqB;AAChC,IAAA,KAAA;AAAA,MACC,YAAY,WAAW,CAAA,8DAAA;AAAA,KACxB;AACA,IAAA,IAAA,CAAK,IAAA,GAAO,sBAAA;AAAA,EACb;AACD,CAAA;AA2BO,IAAM,gBAAA,GAAN,cAA+B,WAAA,CAAY;AAAA,EACjD,WAAA,GAAc;AACb,IAAA,KAAA;AAAA,MACC;AAAA,KACD;AACA,IAAA,IAAA,CAAK,IAAA,GAAO,kBAAA;AAAA,EACb;AACD,CAAA;;;ACoBA,IAAM,oBAAA,GAAuB,6BAAA;AAKtB,SAAS,aAAA,GAAwB;AACvC,EAAA,OAAO,IAAA,CAAK,OAAA,EAAQ,EAAG,OAAA,EAAS,aAAa,CAAA;AAC9C;AAKO,SAAS,YAAA,GAAuB;AACtC,EAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,EAAI,EAAG,SAAS,CAAA;AACrC;AAKO,SAAS,eAAA,GAA0B;AACzC,EAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,EAAI,EAAG,iBAAiB,CAAA;AAC7C;AASA,SAAS,qBAAA,GAAsC;AAC9C,EAAA,OAAO;AAAA,IACN,OAAA,EAAS,CAAA;AAAA,IACT,cAAA,EAAgB,SAAA;AAAA,IAChB,QAAA,EAAU;AAAA,MACT,OAAA,EAAS;AAAA,QACR,WAAA,EAAa;AAAA;AACd;AACD,GACD;AACD;AAKO,SAAS,cAAc,QAAA,EAAsC;AACnE,EAAA,OAAO;AAAA,IACN,OAAA,EAAS,CAAA;AAAA,IACT,cAAA,EAAgB,SAAA;AAAA,IAChB,QAAA,EAAU;AAAA,MACT,OAAA,EAAS;AAAA,QACR,WAAA,EAAa,SAAS,WAAA,IAAe,oBAAA;AAAA,QACrC,QAAQ,QAAA,CAAS,MAAA;AAAA,QACjB,UAAU,QAAA,CAAS;AAAA;AACpB;AACD,GACD;AACD;AAKA,SAAS,WAAWC,OAAAA,EAAyC;AAC5D,EAAA,OACC,OAAOA,YAAW,QAAA,IAClBA,OAAAA,KAAW,QACX,SAAA,IAAaA,OAAAA,IACZA,QAAgC,OAAA,KAAY,CAAA;AAE/C;AAKA,eAAsB,cAAA,GAAwC;AAC7D,EAAA,MAAM,aAAa,aAAA,EAAc;AAEjC,EAAA,IAAI,OAAA,CAAQ,IAAI,UAAA,EAAY;AAC3B,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,8BAAA,EAAiC,UAAU,CAAA,CAAE,CAAA;AAAA,EAC1D;AAEA,EAAA,IAAI;AACH,IAAA,MAAM,OAAA,GAAU,MAAM,QAAA,CAAS,UAAA,EAAY,OAAO,CAAA;AAElD,IAAA,IAAI,OAAA,CAAQ,IAAI,UAAA,EAAY;AAE3B,MAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,KAAA,CAAM,uBAAuB,CAAA;AACzD,MAAA,IAAI,WAAA,EAAa;AAChB,QAAA,OAAA,CAAQ,GAAA;AAAA,UACP,CAAA,+BAAA,EAAkC,WAAA,CAAY,CAAC,CAAA,CAAE,SAAA;AAAA,YAChD,CAAA;AAAA,YACA;AAAA,WACA,CAAA,GAAA;AAAA,SACF;AAAA,MACD;AAAA,IACD;AAEA,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAEjC,IAAA,IAAI,OAAA,CAAQ,IAAI,UAAA,EAAY;AAC3B,MAAA,OAAA,CAAQ,GAAA;AAAA,QACP,CAAA,gCAAA,EACE,OAAiC,OACnC,CAAA;AAAA,OACD;AACA,MAAA,OAAA,CAAQ,GAAA;AAAA,QACP,4BAA4B,MAAA,CAAO,IAAA;AAAA,UACjC,MAAA,CAAkD,YAAY;AAAC,SACjE,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,OACb;AAAA,IACD;AAGA,IAAA,IAAI,UAAA,CAAW,MAAM,CAAA,EAAG;AACvB,MAAA,OAAO,MAAA;AAAA,IACR;AAGA,IAAA,MAAM,QAAA,GAAW,cAAc,MAAsB,CAAA;AAGrD,IAAA,MAAM,gBAAgB,QAAQ,CAAA;AAE9B,IAAA,OAAO,QAAA;AAAA,EACR,SAAS,KAAA,EAAO;AACf,IAAA,IAAI,OAAA,CAAQ,IAAI,UAAA,EAAY;AAC3B,MAAA,OAAA,CAAQ,GAAA;AAAA,QACP,kCACC,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CACtD,CAAA;AAAA,OACD;AACA,MAAA,OAAA,CAAQ,IAAI,CAAA,uCAAA,CAAyC,CAAA;AAAA,IACtD;AACA,IAAA,OAAO,qBAAA,EAAsB;AAAA,EAC9B;AACD;AAKA,eAAsB,gBAAgBA,OAAAA,EAAqC;AAC1E,EAAA,MAAM,aAAa,aAAA,EAAc;AACjC,EAAA,MAAM,MAAM,OAAA,CAAQ,UAAU,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AACpD,EAAA,MAAM,UAAU,UAAA,EAAY,IAAA,CAAK,UAAUA,OAAAA,EAAQ,IAAA,EAAM,CAAC,CAAC,CAAA;AAC5D;AAKA,eAAsB,iBAAA,GAAmD;AACxE,EAAA,IAAI,UAAA,GAAa,QAAQ,GAAA,EAAI;AAC7B,EAAA,MAAM,IAAA,GAAO,QAAQ,UAAU,CAAA;AAE/B,EAAA,OAAO,eAAe,IAAA,EAAM;AAC3B,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,UAAA,EAAY,SAAS,CAAA;AAC7C,IAAA,IAAI;AACH,MAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,UAAU,CAAA;AACnC,MAAA,IAAI,KAAA,CAAM,QAAO,EAAG;AACnB,QAAA,MAAM,OAAA,GAAU,MAAM,QAAA,CAAS,UAAA,EAAY,OAAO,CAAA;AAClD,QAAA,OAAO,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,MAC1B;AAAA,IACD,CAAA,CAAA,MAAQ;AAAA,IAER;AACA,IAAA,UAAA,GAAa,QAAQ,UAAU,CAAA;AAAA,EAChC;AAEA,EAAA,OAAO,IAAA;AACR;AAYA,eAAsB,cACrB,aAAA,EAC0B;AAC1B,EAAA,MAAM,UAAA,GAAa,MAAM,cAAA,EAAe;AACxC,EAAA,MAAM,aAAA,GAAgB,MAAM,iBAAA,EAAkB;AAG9C,EAAA,IAAI,WAAA;AACJ,EAAA,IAAI,aAAA;AAEJ,EAAA,IAAI,eAAe,OAAA,EAAS;AAC3B,IAAA,WAAA,GAAc,aAAA,CAAc,OAAA;AAC5B,IAAA,aAAA,GAAgB,KAAA;AAAA,EACjB,CAAA,MAAA,IAAW,OAAA,CAAQ,GAAA,CAAI,YAAA,EAAc;AACpC,IAAA,WAAA,GAAc,QAAQ,GAAA,CAAI,YAAA;AAC1B,IAAA,aAAA,GAAgB,KAAA;AAAA,EACjB,CAAA,MAAA,IAAW,eAAe,OAAA,EAAS;AAClC,IAAA,WAAA,GAAc,aAAA,CAAc,OAAA;AAC5B,IAAA,aAAA,GAAgB,SAAA;AAAA,EACjB,CAAA,MAAA,IAAW,WAAW,cAAA,EAAgB;AACrC,IAAA,WAAA,GAAc,UAAA,CAAW,cAAA;AACzB,IAAA,aAAA,GAAgB,MAAA;AAAA,EACjB,CAAA,MAAO;AACN,IAAA,WAAA,GAAc,SAAA;AACd,IAAA,aAAA,GAAgB,SAAA;AAAA,EACjB;AAGA,EAAA,MAAM,OAAA,GAAU,UAAA,CAAW,QAAA,CAAS,WAAW,CAAA;AAC/C,EAAA,IAAI,CAAC,OAAA,EAAS;AACb,IAAA,IAAI,OAAA,CAAQ,IAAI,UAAA,EAAY;AAC3B,MAAA,OAAA,CAAQ,GAAA;AAAA,QACP,CAAA,kBAAA,EAAqB,WAAW,CAAA,wBAAA,EAA2B,MAAA,CAAO,IAAA;AAAA,UACjE,UAAA,CAAW;AAAA,SACZ,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,OACb;AAAA,IACD;AACA,IAAA,MAAM,IAAI,qBAAqB,WAAW,CAAA;AAAA,EAC3C;AAEA,EAAA,IAAI,OAAA,CAAQ,IAAI,UAAA,EAAY;AAC3B,IAAA,OAAA,CAAQ,GAAA;AAAA,MACP,CAAA,wBAAA,EAA2B,WAAW,CAAA,UAAA,EAAa,aAAa,CAAA,CAAA;AAAA,KACjE;AACA,IAAA,OAAA,CAAQ,IAAI,CAAA,6BAAA,EAAgC,CAAC,CAAC,OAAA,CAAQ,MAAM,CAAA,CAAE,CAAA;AAAA,EAC/D;AAGA,EAAA,IAAI,cAAc,OAAA,CAAQ,WAAA;AAC1B,EAAA,IAAI,SAAS,OAAA,CAAQ,MAAA;AACrB,EAAA,MAAM,WAAW,OAAA,CAAQ,QAAA;AAGzB,EAAA,IAAI,eAAe,WAAA,EAAa;AAC/B,IAAA,WAAA,GAAc,aAAA,CAAc,WAAA;AAAA,EAC7B;AAGA,EAAA,IAAI,OAAA,CAAQ,IAAI,iBAAA,EAAmB;AAClC,IAAA,WAAA,GAAc,QAAQ,GAAA,CAAI,iBAAA;AAAA,EAC3B;AACA,EAAA,IAAI,OAAA,CAAQ,IAAI,YAAA,EAAc;AAC7B,IAAA,MAAA,GAAS,QAAQ,GAAA,CAAI,YAAA;AAAA,EACtB;AAEA,EAAA,OAAO;AAAA,IACN,WAAA;AAAA,IACA,aAAA;AAAA,IACA,WAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA,GACD;AACD;AAKA,eAAsB,WACrB,WAAA,EACgC;AAChC,EAAA,MAAM,UAAA,GAAa,MAAM,cAAA,EAAe;AACxC,EAAA,OAAO,UAAA,CAAW,QAAA,CAAS,WAAW,CAAA,IAAK,IAAA;AAC5C;AAKA,eAAsB,YAAA,GAAkC;AACvD,EAAA,MAAM,UAAA,GAAa,MAAM,cAAA,EAAe;AACxC,EAAA,OAAO,MAAA,CAAO,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA;AACvC;AAKA,eAAsB,UAAA,CACrB,aACAA,OAAAA,EACgB;AAChB,EAAA,MAAM,UAAA,GAAa,MAAM,cAAA,EAAe;AAExC,EAAA,MAAM,QAAA,GAAW,UAAA,CAAW,QAAA,CAAS,WAAW,CAAA,IAAK;AAAA,IACpD,WAAA,EAAa;AAAA,GACd;AAEA,EAAA,UAAA,CAAW,QAAA,CAAS,WAAW,CAAA,GAAI;AAAA,IAClC,GAAG,QAAA;AAAA,IACH,GAAGA;AAAA,GACJ;AAEA,EAAA,MAAM,gBAAgB,UAAU,CAAA;AACjC;AAKA,eAAsB,cAAc,WAAA,EAAuC;AAC1E,EAAA,MAAM,UAAA,GAAa,MAAM,cAAA,EAAe;AAExC,EAAA,IAAI,CAAC,UAAA,CAAW,QAAA,CAAS,WAAW,CAAA,EAAG;AACtC,IAAA,OAAO,KAAA;AAAA,EACR;AAEA,EAAA,OAAO,UAAA,CAAW,SAAS,WAAW,CAAA;AAGtC,EAAA,IAAI,UAAA,CAAW,mBAAmB,WAAA,EAAa;AAC9C,IAAA,MAAM,iBAAA,GAAoB,MAAA,CAAO,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA;AACzD,IAAA,UAAA,CAAW,cAAA,GAAiB,iBAAA,CAAkB,CAAC,CAAA,IAAK,SAAA;AAAA,EACrD;AAEA,EAAA,MAAM,gBAAgB,UAAU,CAAA;AAChC,EAAA,OAAO,IAAA;AACR;AAKA,eAAsB,kBAAkB,WAAA,EAAoC;AAC3E,EAAA,MAAM,UAAA,GAAa,MAAM,cAAA,EAAe;AAExC,EAAA,IAAI,CAAC,UAAA,CAAW,QAAA,CAAS,WAAW,CAAA,EAAG;AACtC,IAAA,MAAM,IAAI,qBAAqB,WAAW,CAAA;AAAA,EAC3C;AAEA,EAAA,UAAA,CAAW,cAAA,GAAiB,WAAA;AAC5B,EAAA,MAAM,gBAAgB,UAAU,CAAA;AACjC;AAKA,eAAsB,qBAAA,GAAyC;AAC9D,EAAA,MAAM,UAAA,GAAa,MAAM,cAAA,EAAe;AACxC,EAAA,OAAO,UAAA,CAAW,cAAA;AACnB;CAUmC;AAAA,EAClC,WAAA,EAAa,OAAA,CAAQ,GAAA,CAAI,iBAAA,IAAqB;AAC/C;AAuDA,eAAsB,WACrB,aAAA,EACmB;AACnB,EAAA,IAAI;AACH,IAAA,MAAM,QAAA,GAAW,MAAM,aAAA,CAAc,aAAa,CAAA;AAClD,IAAA,OAAO,CAAC,CAAC,QAAA,CAAS,MAAA;AAAA,EACnB,CAAA,CAAA,MAAQ;AACP,IAAA,OAAO,KAAA;AAAA,EACR;AACD;AAMA,eAAsB,cACrB,aAAA,EACkB;AAClB,EAAA,MAAM,QAAA,GAAW,MAAM,aAAA,CAAc,aAAa,CAAA;AAElD,EAAA,IAAI,CAAC,SAAS,MAAA,EAAQ;AACrB,IAAA,IAAI,OAAA,CAAQ,IAAI,UAAA,EAAY;AAC3B,MAAA,OAAA,CAAQ,GAAA;AAAA,QACP,CAAA,sDAAA,EAAyD,SAAS,WAAW,CAAA,CAAA;AAAA,OAC9E;AAAA,IACD;AACA,IAAA,MAAM,IAAI,gBAAA,EAAiB;AAAA,EAC5B;AAEA,EAAA,IAAI,OAAA,CAAQ,IAAI,UAAA,EAAY;AAC3B,IAAA,OAAA,CAAQ,GAAA;AAAA,MACP,CAAA,qCAAA,EAAwC,SAAS,MAAA,CAAO,SAAA;AAAA,QACvD,CAAA;AAAA,QACA;AAAA,OACA,CAAA,IAAA;AAAA,KACF;AAAA,EACD;AAEA,EAAA,OAAO,QAAA,CAAS,MAAA;AACjB;AAKA,eAAsB,eACrB,aAAA,EACkB;AAClB,EAAA,MAAM,QAAA,GAAW,MAAM,aAAA,CAAc,aAAa,CAAA;AAClD,EAAA,OAAO,QAAA,CAAS,WAAA;AACjB;AAKA,eAAsB,wBACrB,WAAA,EACgB;AAChB,EAAA,MAAM,UAAA,GAAa,MAAM,cAAA,EAAe;AAExC,EAAA,IAAI,UAAA,CAAW,QAAA,CAAS,WAAW,CAAA,EAAG;AACrC,IAAA,UAAA,CAAW,QAAA,CAAS,WAAW,CAAA,CAAE,MAAA,GAAS,MAAA;AAC1C,IAAA,UAAA,CAAW,QAAA,CAAS,WAAW,CAAA,CAAE,QAAA,GAAW,MAAA;AAC5C,IAAA,MAAM,gBAAgB,UAAU,CAAA;AAAA,EACjC;AACD;AAKA,eAAsB,qBAAA,CACrB,WAAA,EACA,MAAA,EACA,QAAA,EACA,WAAA,EACgB;AAChB,EAAA,MAAM,UAAA,GAAa,MAAM,cAAA,EAAe;AAGxC,EAAA,IAAI,CAAC,UAAA,CAAW,QAAA,CAAS,WAAW,CAAA,EAAG;AACtC,IAAA,UAAA,CAAW,QAAA,CAAS,WAAW,CAAA,GAAI;AAAA,MAClC,aAAa,WAAA,IAAe;AAAA,KAC7B;AAAA,EACD;AAEA,EAAA,UAAA,CAAW,QAAA,CAAS,WAAW,CAAA,CAAE,MAAA,GAAS,MAAA;AAC1C,EAAA,IAAI,QAAA,EAAU;AACb,IAAA,UAAA,CAAW,QAAA,CAAS,WAAW,CAAA,CAAE,QAAA,GAAW,QAAA;AAAA,EAC7C;AACA,EAAA,IAAI,WAAA,EAAa;AAChB,IAAA,UAAA,CAAW,QAAA,CAAS,WAAW,CAAA,CAAE,WAAA,GAAc,WAAA;AAAA,EAChD;AAEA,EAAA,MAAM,gBAAgB,UAAU,CAAA;AACjC;ACjjBA,eAAsB,YAAA,GAA8C;AACnE,EAAA,MAAM,eAAe,eAAA,EAAgB;AAErC,EAAA,IAAI;AACH,IAAA,MAAM,OAAA,GAAU,MAAMC,QAAAA,CAAS,YAAA,EAAc,OAAO,CAAA;AACpD,IAAA,OAAO,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,EAC1B,CAAA,CAAA,MAAQ;AACP,IAAA,OAAO,IAAA;AAAA,EACR;AACD;AAKA,eAAsB,cAAc,QAAA,EAAwC;AAC3E,EAAA,MAAM,eAAe,eAAA,EAAgB;AACrC,EAAA,MAAMC,MAAMC,OAAAA,CAAQ,YAAY,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AACtD,EAAA,MAAMC,SAAAA,CAAU,cAAc,CAAA,EAAG,IAAA,CAAK,UAAU,QAAA,EAAU,IAAA,EAAM,CAAC,CAAC;AAAA,CAAI,CAAA;AACvE;AAKA,eAAsB,mBAAA,GAA8C;AACnE,EAAA,MAAM,WAAA,GAAc,MAAM,cAAA,EAAe;AACzC,EAAA,OAAO;AAAA,IACN,eAAA,EAAiB,CAAA;AAAA,IACjB,WAAA;AAAA,IACA,QAAQ;AAAC,GACV;AACD;AAKA,eAAsB,aAAA,CACrB,UACA,KAAA,EACgB;AAChB,EAAA,IAAI,QAAA,GAAW,MAAM,YAAA,EAAa;AAClC,EAAA,IAAI,CAAC,QAAA,EAAU;AACd,IAAA,QAAA,GAAW,MAAM,mBAAA,EAAoB;AAAA,EACtC;AAEA,EAAA,QAAA,CAAS,MAAA,CAAO,QAAQ,CAAA,GAAI,KAAA;AAC5B,EAAA,MAAM,cAAc,QAAQ,CAAA;AAC7B;AAKA,eAAsB,mBAAmB,QAAA,EAAoC;AAC5E,EAAA,MAAM,QAAA,GAAW,MAAM,YAAA,EAAa;AACpC,EAAA,IAAI,CAAC,QAAA,IAAY,CAAC,QAAA,CAAS,MAAA,CAAO,QAAQ,CAAA,EAAG;AAC5C,IAAA,OAAO,KAAA;AAAA,EACR;AAEA,EAAA,OAAO,QAAA,CAAS,OAAO,QAAQ,CAAA;AAC/B,EAAA,MAAM,cAAc,QAAQ,CAAA;AAC5B,EAAA,OAAO,IAAA;AACR;AAkBA,eAAsB,kBAAA,GAEpB;AACD,EAAA,MAAM,QAAA,GAAW,MAAM,YAAA,EAAa;AACpC,EAAA,IAAI,CAAC,QAAA,EAAU;AACd,IAAA,OAAO,EAAC;AAAA,EACT;AAEA,EAAA,OAAO,MAAA,CAAO,OAAA,CAAQ,QAAA,CAAS,MAAM,CAAA,CAAE,IAAI,CAAC,CAAC,IAAA,EAAM,KAAK,CAAA,MAAO;AAAA,IAC9D,IAAA;AAAA,IACA;AAAA,GACD,CAAE,CAAA;AACH;;;AC1EA,eAAsB,GAAA,CACrB,SAAA,EACA,QAAA,EACA,aAAA,EACgB;AAChB,EAAA,IAAI;AACH,IAAA,MAAM,MAAA,GAAS,MAAM,aAAA,CAAc,aAAa,CAAA;AAChD,IAAA,MAAM,WAAA,GAAc,MAAM,cAAA,CAAe,aAAa,CAAA;AAGtD,IAAA,MAAM,MAAA,GAAS,oBAAoB,SAAS,CAAA;AAC5C,IAAA,IAAI,CAAC,MAAA,EAAQ;AACZ,MAAA,OAAA,CAAQ,KAAA;AAAA,QACP,mCAAmC,SAAS,CAAA,kDAAA;AAAA,OAC7C;AACA,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IACf;AAEA,IAAA,MAAM,EAAE,QAAA,EAAU,IAAA,EAAM,YAAA,EAAa,GAAI,MAAA;AAGzC,IAAA,SAAA,CAAU,EAAE,OAAA,EAAS,WAAA,EAAa,MAAA,EAAQ,CAAA;AAE1C,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,UAAA,EAAa,SAAS,CAAA,GAAA,CAAK,CAAA;AAGvC,IAAA,MAAM,gBAAA,GAAmB,MAAM,iBAAA,CAAkB,QAAA,EAAU,IAAI,CAAA;AAC/D,IAAA,MAAM,WAAW,gBAAA,CAAiB,IAAA;AAClC,IAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AAC1B,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,mBAAA,EAAsB,QAAQ,CAAA,CAAA,EAAI,IAAI,CAAA,UAAA,CAAY,CAAA;AAChE,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IACf;AAGA,IAAA,MAAM,iBAAiB,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAA2B,EAAE,OAAO,CAAA;AACzE,IAAA,MAAM,QAAA,GAAW,cAAA,CAAe,YAAA,IAAgB,GAAA,EAAK,cAAc,CAAA;AAEnE,IAAA,IAAI,CAAC,QAAA,EAAU;AACd,MAAA,OAAA,CAAQ,KAAA;AAAA,QACP,+BAA+B,YAAA,IAAgB,QAAQ,CAAA,kBAAA,EAAqB,QAAQ,IAAI,IAAI,CAAA;AAAA,OAC7F;AACA,MAAA,OAAA,CAAQ,MAAM,CAAA,oBAAA,EAAuB,cAAA,CAAe,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAChE,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IACf;AAEA,IAAA,OAAA,CAAQ,IAAI,CAAA,iBAAA,EAAoB,QAAQ,IAAI,IAAI,CAAA,CAAA,EAAI,QAAQ,CAAA,GAAA,CAAK,CAAA;AAGjE,IAAA,MAAM,eAAA,GAAkB,MAAM,eAAA,CAAgB,QAAA,EAAU,MAAM,QAAQ,CAAA;AACtE,IAAA,MAAM,cAAc,eAAA,CAAgB,IAAA;AACpC,IAAA,IAAI,CAAC,WAAA,EAAa;AACjB,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,eAAA,EAAkB,QAAQ,CAAA,UAAA,CAAY,CAAA;AACpD,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IACf;AAIA,IAAA,MAAM,WAAA,GAAc,GAAG,WAAW,CAAA,OAAA,EAAU,QAAQ,CAAA,CAAA,EAAI,IAAI,IAAI,QAAQ,CAAA,SAAA,CAAA;AAExE,IAAA,MAAM,eAAA,GAAkB,MAAM,KAAA,CAAM,WAAA,EAAa;AAAA,MAChD,OAAA,EAAS;AAAA,QACR,aAAA,EAAe,UAAU,MAAM,CAAA;AAAA,OAChC;AAAA,MACA,QAAA,EAAU;AAAA,KACV,CAAA;AAED,IAAA,IAAI,CAAC,gBAAgB,EAAA,EAAI;AACxB,MAAA,OAAA,CAAQ,KAAA;AAAA,QACP,CAAA,mCAAA,EAAsC,gBAAgB,MAAM,CAAA,CAAA;AAAA,OAC7D;AACA,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IACf;AAEA,IAAA,MAAM,gBAAgB,MAAA,CAAO,IAAA,CAAK,MAAM,eAAA,CAAgB,aAAa,CAAA;AAGrE,IAAA,MAAM,SAAA,GAAY,mBAAmB,aAAa,CAAA;AAGlD,IAAA,MAAM,iBAAA,GAAoB,CAAA,OAAA,EAAU,MAAA,CAAO,IAAA,CAAK,WAAA,CAAY,UAAU,KAAK,CAAA,CAAE,QAAA,CAAS,QAAQ,CAAC,CAAA,CAAA;AAC/F,IAAA,IAAI,cAAc,iBAAA,EAAmB;AACpC,MAAA,OAAA,CAAQ,MAAM,qCAAqC,CAAA;AACnD,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IACf;AAGA,IAAA,MAAM,YAAY,YAAA,EAAa;AAC/B,IAAA,MAAM,OAAA,GAAUC,IAAAA,CAAK,SAAA,EAAW,QAAA,EAAU,IAAI,CAAA;AAC9C,IAAA,MAAMH,KAAAA,CAAM,OAAA,EAAS,EAAE,SAAA,EAAW,MAAM,CAAA;AAGxC,IAAA,MAAM,EAAE,SAAA,EAAAE,UAAAA,EAAU,GAAI,MAAM,OAAO,aAAkB,CAAA;AACrD,IAAA,MAAM,QAAA,GAAWC,IAAAA,CAAK,OAAA,EAAS,WAAW,CAAA;AAC1C,IAAA,MAAMD,UAAAA,CAAU,UAAU,aAAa,CAAA;AAEvC,IAAA,MAAM,EAAE,IAAA,EAAAE,KAAAA,EAAK,GAAI,MAAM,OAAO,eAAoB,CAAA;AAClD,IAAA,MAAM,EAAE,SAAA,EAAAC,UAAAA,EAAU,GAAI,MAAM,OAAO,MAAW,CAAA;AAC9C,IAAA,MAAM,SAAA,GAAYA,WAAUD,KAAI,CAAA;AAEhC,IAAA,IAAI;AAEH,MAAA,MAAM,GAAG,OAAA,EAAS,EAAE,WAAW,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AAClD,MAAA,MAAMJ,KAAAA,CAAM,OAAA,EAAS,EAAE,SAAA,EAAW,MAAM,CAAA;AACxC,MAAA,MAAME,UAAAA,CAAU,UAAU,aAAa,CAAA;AACvC,MAAA,MAAM,SAAA;AAAA,QACL,CAAA,UAAA,EAAa,QAAQ,CAAA,MAAA,EAAS,OAAO,CAAA,sBAAA;AAAA,OACtC;AAAA,IACD,CAAA,SAAE;AACD,MAAA,MAAM,EAAA,CAAG,QAAA,EAAU,EAAE,KAAA,EAAO,MAAM,CAAA;AAAA,IACnC;AAGA,IAAA,MAAM,QAAA,GAAW,CAAA,MAAA,EAAS,QAAQ,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA;AAC1C,IAAA,MAAM,cAAc,QAAA,EAAU;AAAA,MAC7B,OAAA,EAAS,QAAA;AAAA,MACT,UAAU,WAAA,CAAY,WAAA;AAAA,MACtB;AAAA,KACA,CAAA;AAED,IAAA,OAAA,CAAQ,IAAI,CAAA,gBAAA,EAAmB,QAAQ,IAAI,IAAI,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAE,CAAA;AAC7D,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,UAAA,EAAa,OAAO,CAAA,CAAE,CAAA;AAAA,EACnC,SAAS,KAAA,EAAO;AACf,IAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AACzD,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,OAAA,EAAU,OAAO,CAAA,CAAE,CAAA;AACjC,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EACf;AACD;;;AC7IA,eAAsB,SAAA,CACrB,MACA,OAAA,EACgB;AAChB,EAAA,IAAI;AAEH,IAAA,MAAM,QAAA,GAAW,MAAM,UAAA,CAAW,IAAI,CAAA;AACtC,IAAA,IAAI,QAAA,EAAU;AACb,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,gBAAA,EAAmB,IAAI,CAAA,iBAAA,CAAmB,CAAA;AACxD,MAAA,OAAA,CAAQ,IAAI,qCAAqC,CAAA;AACjD,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IACf;AAGA,IAAA,MAAM,WAAW,IAAA,EAAM;AAAA,MACtB,WAAA,EAAa,QAAQ,WAAA,IAAe;AAAA,KACpC,CAAA;AAED,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,iBAAA,EAAoB,IAAI,CAAA,EAAA,CAAI,CAAA;AAExC,IAAA,IAAI,QAAQ,WAAA,EAAa;AACxB,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,gBAAA,EAAmB,OAAA,CAAQ,WAAW,CAAA,CAAE,CAAA;AAAA,IACrD;AAEA,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,IAAA,OAAA,CAAQ,GAAA;AAAA,MACP,iEAAiE,IAAI,CAAA;AAAA,KACtE;AACA,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,+CAAA,EAAkD,IAAI,CAAA,CAAE,CAAA;AAAA,EACrE,SAAS,KAAA,EAAO;AACf,IAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AACzD,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,OAAA,EAAU,OAAO,CAAA,CAAE,CAAA;AACjC,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EACf;AACD;;;AClCA,eAAsB,aAAa,IAAA,EAA6B;AAC/D,EAAA,IAAI;AACH,IAAA,MAAM,QAAA,GAAW,MAAM,YAAA,EAAa;AACpC,IAAA,MAAM,cAAA,GAAiB,MAAM,qBAAA,EAAsB;AAGnD,IAAA,IAAI,CAAC,QAAA,CAAS,QAAA,CAAS,IAAI,CAAA,EAAG;AAC7B,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,gBAAA,EAAmB,IAAI,CAAA,YAAA,CAAc,CAAA;AACnD,MAAA,OAAA,CAAQ,IAAI,mDAAmD,CAAA;AAC/D,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IACf;AAGA,IAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AAC1B,MAAA,OAAA,CAAQ,MAAM,wCAAwC,CAAA;AACtD,MAAA,OAAA,CAAQ,IAAI,qDAAqD,CAAA;AACjE,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IACf;AAEA,IAAA,MAAM,aAAa,IAAA,KAAS,cAAA;AAC5B,IAAA,MAAM,OAAA,GAAU,MAAM,aAAA,CAAc,IAAI,CAAA;AAExC,IAAA,IAAI,OAAA,EAAS;AACZ,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,iBAAA,EAAoB,IAAI,CAAA,EAAA,CAAI,CAAA;AACxC,MAAA,IAAI,UAAA,EAAY;AACf,QAAA,MAAM,UAAA,GAAa,MAAM,qBAAA,EAAsB;AAC/C,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,wBAAA,EAA2B,UAAU,CAAA,EAAA,CAAI,CAAA;AAAA,MACtD;AAAA,IACD,CAAA,MAAO;AACN,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,iCAAA,EAAoC,IAAI,CAAA,EAAA,CAAI,CAAA;AAC1D,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IACf;AAAA,EACD,SAAS,KAAA,EAAO;AACf,IAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AACzD,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,OAAA,EAAU,OAAO,CAAA,CAAE,CAAA;AACjC,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EACf;AACD;AClCA,eAAsB,WAAW,OAAA,EAA2C;AAC3E,EAAA,IAAI;AACH,IAAA,MAAM,UAAA,GAAaC,IAAAA,CAAK,OAAA,CAAQ,GAAA,IAAO,SAAS,CAAA;AAGhD,IAAA,IAAI;AACH,MAAA,MAAMG,KAAK,UAAU,CAAA;AACrB,MAAA,OAAA,CAAQ,MAAM,kDAAkD,CAAA;AAChE,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IACf,CAAA,CAAA,MAAQ;AAAA,IAER;AAGA,IAAA,MAAMR,UAAwB,EAAC;AAE/B,IAAA,IAAI,QAAQ,OAAA,EAAS;AACpB,MAAAA,OAAAA,CAAO,UAAU,OAAA,CAAQ,OAAA;AAAA,IAC1B;AACA,IAAA,IAAI,QAAQ,WAAA,EAAa;AACxB,MAAAA,OAAAA,CAAO,cAAc,OAAA,CAAQ,WAAA;AAAA,IAC9B;AAGA,IAAA,IAAI,MAAA,CAAO,IAAA,CAAKA,OAAM,CAAA,CAAE,WAAW,CAAA,EAAG;AACrC,MAAAA,QAAO,OAAA,GAAU,aAAA;AAAA,IAClB;AAGA,IAAA,MAAMI,SAAAA,CAAU,YAAY,CAAA,EAAG,IAAA,CAAK,UAAUJ,OAAAA,EAAQ,IAAA,EAAM,CAAC,CAAC;AAAA,CAAI,CAAA;AAElE,IAAA,OAAA,CAAQ,IAAI,iBAAiB,CAAA;AAC7B,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,IAAA,OAAA,CAAQ,IAAI,WAAW,CAAA;AACvB,IAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,SAAA,CAAUA,OAAAA,EAAQ,IAAA,EAAM,CAAC,CAAC,CAAA;AAC3C,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,IAAA,OAAA,CAAQ,IAAI,uDAAuD,CAAA;AACnE,IAAA,OAAA,CAAQ,IAAI,8DAA8D,CAAA;AAAA,EAC3E,SAAS,KAAA,EAAO;AACf,IAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AACzD,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,OAAA,EAAU,OAAO,CAAA,CAAE,CAAA;AACjC,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EACf;AACD;;;AClDA,eAAsB,UAAA,GAA4B;AACjD,EAAA,IAAI;AACH,IAAA,MAAM,QAAA,GAAW,MAAM,YAAA,EAAa;AACpC,IAAA,MAAM,cAAA,GAAiB,MAAM,qBAAA,EAAsB;AAEnD,IAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AAC1B,MAAA,OAAA,CAAQ,IAAI,yBAAyB,CAAA;AACrC,MAAA,OAAA,CAAQ,IAAI,6CAA6C,CAAA;AACzD,MAAA;AAAA,IACD;AAEA,IAAA,OAAA,CAAQ,IAAI,aAAa,CAAA;AACzB,IAAA,KAAA,MAAW,QAAQ,QAAA,EAAU;AAC5B,MAAA,MAAM,MAAA,GAAS,IAAA,KAAS,cAAA,GAAiB,YAAA,GAAe,EAAA;AACxD,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAA,EAAK,IAAI,CAAA,EAAG,MAAM,CAAA,CAAE,CAAA;AAAA,IACjC;AACA,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAAA,EACf,SAAS,KAAA,EAAO;AACf,IAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AACzD,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,OAAA,EAAU,OAAO,CAAA,CAAE,CAAA;AACjC,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EACf;AACD;;;ACzBA,IAAM,UAAA,GAAa,CAAC,aAAA,EAAe,QAAA,EAAU,UAAU,CAAA;AAMvD,eAAsB,SAAA,CACrB,OAAA,EACA,GAAA,EACA,KAAA,EACgB;AAChB,EAAA,IAAI;AAEH,IAAA,IAAI,CAAC,UAAA,CAAW,QAAA,CAAS,GAAe,CAAA,EAAG;AAC1C,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,oBAAA,EAAuB,GAAG,CAAA,EAAA,CAAI,CAAA;AAC5C,MAAA,OAAA,CAAQ,IAAI,CAAA,YAAA,EAAe,UAAA,CAAW,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAClD,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IACf;AAGA,IAAA,MAAM,QAAA,GAAW,MAAM,UAAA,CAAW,OAAO,CAAA;AACzC,IAAA,IAAI,CAAC,QAAA,EAAU;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,gBAAA,EAAmB,OAAO,CAAA,YAAA,CAAc,CAAA;AACtD,MAAA,OAAA,CAAQ,IAAI,2CAA2C,CAAA;AACvD,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IACf;AAGA,IAAA,MAAM,WAAW,OAAA,EAAS,EAAE,CAAC,GAAG,GAAG,OAAO,CAAA;AAC1C,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,QAAA,EAAW,GAAG,CAAA,cAAA,EAAiB,OAAO,CAAA,EAAA,CAAI,CAAA;AAAA,EACvD,SAAS,KAAA,EAAO;AACf,IAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AACzD,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,OAAA,EAAU,OAAO,CAAA,CAAE,CAAA;AACjC,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EACf;AACD;;;ACrBA,eAAsB,UAAA,CACrB,SACA,aAAA,EACgB;AAChB,EAAA,IAAI;AACH,IAAA,IAAI,QAAQ,IAAA,EAAM;AAEjB,MAAA,MAAM,OAAA,GAAU,MAAM,UAAA,CAAW,OAAA,CAAQ,IAAI,CAAA;AAC7C,MAAA,IAAI,CAAC,OAAA,EAAS;AACb,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,gBAAA,EAAmB,OAAA,CAAQ,IAAI,CAAA,YAAA,CAAc,CAAA;AAC3D,QAAA,OAAA,CAAQ,IAAI,mDAAmD,CAAA;AAC/D,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MACf;AAEA,MAAA,MAAM,cAAA,GAAiB,MAAM,qBAAA,EAAsB;AACnD,MAAA,MAAM,SAAA,GAAY,QAAQ,IAAA,KAAS,cAAA;AAEnC,MAAA,OAAA,CAAQ,IAAI,CAAA,SAAA,EAAY,OAAA,CAAQ,IAAI,CAAA,EAAG,SAAA,GAAY,eAAe,EAAE;AAAA,CAAI,CAAA;AACxE,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,gBAAA,EAAmB,OAAA,CAAQ,WAAW,CAAA,CAAE,CAAA;AACpD,MAAA,OAAA,CAAQ,IAAI,CAAA,gBAAA,EAAmB,OAAA,CAAQ,MAAA,GAAS,KAAA,GAAQ,WAAW,CAAA,CAAE,CAAA;AACrE,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,gBAAA,EAAmB,OAAA,CAAQ,QAAA,IAAY,WAAW,CAAA,CAAE,CAAA;AAAA,IACjE,CAAA,MAAO;AAEN,MAAA,MAAM,QAAA,GAAW,MAAM,aAAA,CAAc,aAAa,CAAA;AAClD,MAAA,MAAM,aAAA,GAAgB,MAAM,iBAAA,EAAkB;AAC9C,MAAA,MAAM,aAAa,aAAA,EAAc;AAEjC,MAAA,OAAA,CAAQ,IAAI,2BAA2B,CAAA;AACvC,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,kBAAA,EAAqB,QAAA,CAAS,WAAW,CAAA,CAAE,CAAA;AACvD,MAAA,OAAA,CAAQ,IAAI,CAAA,kBAAA,EAAqB,YAAA,CAAa,QAAA,CAAS,aAAa,CAAC,CAAA,CAAE,CAAA;AACvE,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,kBAAA,EAAqB,QAAA,CAAS,WAAW,CAAA,CAAE,CAAA;AACvD,MAAA,OAAA,CAAQ,IAAI,CAAA,kBAAA,EAAqB,QAAA,CAAS,MAAA,GAAS,KAAA,GAAQ,WAAW,CAAA,CAAE,CAAA;AACxE,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,kBAAA,EAAqB,QAAA,CAAS,QAAA,IAAY,WAAW,CAAA,CAAE,CAAA;AACnE,MAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,MAAA,OAAA,CAAQ,IAAI,mBAAmB,CAAA;AAC/B,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,kBAAA,EAAqB,UAAU,CAAA,CAAE,CAAA;AAC7C,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,kBAAA,EAAqB,aAAA,GAAgB,SAAA,GAAY,QAAQ,CAAA,CAAE,CAAA;AAAA,IACxE;AAAA,EACD,SAAS,KAAA,EAAO;AACf,IAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AACzD,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,OAAA,EAAU,OAAO,CAAA,CAAE,CAAA;AACjC,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EACf;AACD;AAEA,SAAS,aAAa,MAAA,EAAwB;AAC7C,EAAA,QAAQ,MAAA;AAAQ,IACf,KAAK,KAAA;AACJ,MAAA,OAAO,gBAAA;AAAA,IACR,KAAK,KAAA;AACJ,MAAA,OAAO,sBAAA;AAAA,IACR,KAAK,SAAA;AACJ,MAAA,OAAO,cAAA;AAAA,IACR,KAAK,MAAA;AACJ,MAAA,OAAO,qBAAA;AAAA,IACR,KAAK,SAAA;AACJ,MAAA,OAAO,kBAAA;AAAA,IACR;AACC,MAAA,OAAO,MAAA;AAAA;AAEV;;;ACvEA,eAAsB,UAAU,IAAA,EAA6B;AAC5D,EAAA,IAAI;AAEH,IAAA,MAAM,OAAA,GAAU,MAAM,UAAA,CAAW,IAAI,CAAA;AACrC,IAAA,IAAI,CAAC,OAAA,EAAS;AACb,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,gBAAA,EAAmB,IAAI,CAAA,YAAA,CAAc,CAAA;AACnD,MAAA,OAAA,CAAQ,IAAI,mDAAmD,CAAA;AAC/D,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IACf;AAEA,IAAA,MAAM,kBAAkB,IAAI,CAAA;AAC5B,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,wBAAA,EAA2B,IAAI,CAAA,EAAA,CAAI,CAAA;AAAA,EAChD,SAAS,KAAA,EAAO;AACf,IAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AACzD,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,OAAA,EAAU,OAAO,CAAA,CAAE,CAAA;AACjC,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EACf;AACD;ACNA,eAAsB,OAAA,CACrB,SACA,aAAA,EACgB;AAChB,EAAA,IAAI;AACH,IAAA,MAAM,MAAA,GAAS,MAAM,aAAA,CAAc,aAAa,CAAA;AAChD,IAAA,MAAM,eAAe,aAAa,CAAA;AAClC,IAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,GAAA,IAAO,YAAA,EAAa;AAE9C,IAAA,MAAM,QAAA,GAAW,MAAM,YAAA,EAAa;AACpC,IAAA,IAAI,CAAC,QAAA,EAAU;AACd,MAAA,IAAI,QAAQ,cAAA,EAAgB;AAC3B,QAAA,OAAA,CAAQ,KAAA;AAAA,UACP;AAAA,SACD;AACA,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MACf;AACA,MAAA,OAAA,CAAQ,IAAI,wCAAwC,CAAA;AACpD,MAAA;AAAA,IACD;AAEA,IAAA,MAAM,UAAA,GAAa,MAAA,CAAO,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA,CAAE,MAAA;AAChD,IAAA,IAAI,eAAe,CAAA,EAAG;AACrB,MAAA,OAAA,CAAQ,IAAI,4CAA4C,CAAA;AACxD,MAAA;AAAA,IACD;AAEA,IAAA,OAAA,CAAQ,GAAA,CAAI,cAAc,UAAU,CAAA;AAAA,CAAgB,CAAA;AAEpD,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,OAAA,CAAQ,QAAA,CAAS,MAAM,CAAA;AAK9C,IAAA,KAAA,MAAW,CAAC,QAAA,EAAU,KAAK,CAAA,IAAK,OAAA,EAAS;AACxC,MAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,CAAM,2BAA2B,CAAA;AACxD,MAAA,IAAI,CAAC,KAAA,EAAO;AACX,QAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,yCAAA,EAA4C,QAAQ,CAAA,CAAE,CAAA;AACnE,QAAA;AAAA,MACD;AAEA,MAAA,MAAM,GAAG,QAAA,EAAU,IAAI,CAAA,GAAI,KAAA;AAC3B,MAAA,OAAA,CAAQ,IAAI,CAAA,WAAA,EAAc,QAAQ,CAAA,CAAA,EAAI,KAAA,CAAM,OAAO,CAAA,GAAA,CAAK,CAAA;AAGxD,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,KAAA,CAAM,QAAA,EAAU;AAAA,QAC5C,OAAA,EAAS;AAAA,UACR,aAAA,EAAe,UAAU,MAAM,CAAA;AAAA,SAChC;AAAA,QACA,QAAA,EAAU;AAAA,OACV,CAAA;AAED,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AACjB,QAAA,OAAA,CAAQ,KAAA;AAAA,UACP,CAAA,4BAAA,EAA+B,QAAQ,CAAA,EAAA,EAAK,QAAA,CAAS,MAAM,CAAA,CAAA;AAAA,SAC5D;AACA,QAAA;AAAA,MACD;AAEA,MAAA,MAAM,gBAAgB,MAAA,CAAO,IAAA,CAAK,MAAM,QAAA,CAAS,aAAa,CAAA;AAG9D,MAAA,MAAM,EAAE,UAAA,EAAAS,WAAAA,EAAW,GAAI,MAAM,OAAO,QAAa,CAAA;AACjD,MAAA,MAAM,eAAA,GAAkB,CAAA,OAAA,EAAUA,WAAAA,CAAW,QAAQ,CAAA,CAAE,OAAO,aAAa,CAAA,CAAE,MAAA,CAAO,QAAQ,CAAC,CAAA,CAAA;AAE7F,MAAA,IAAI,eAAA,KAAoB,MAAM,SAAA,EAAW;AACxC,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,0CAAA,EAA6C,QAAQ,CAAA,CAAE,CAAA;AACrE,QAAA,IAAI,QAAQ,cAAA,EAAgB;AAC3B,UAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,QACf;AACA,QAAA;AAAA,MACD;AAGA,MAAA,MAAM,OAAA,GAAUJ,IAAAA,CAAK,SAAA,EAAW,QAAA,EAAU,IAAI,CAAA;AAC9C,MAAA,MAAMK,GAAG,OAAA,EAAS,EAAE,WAAW,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AAClD,MAAA,MAAMR,KAAAA,CAAM,OAAA,EAAS,EAAE,SAAA,EAAW,MAAM,CAAA;AAExC,MAAA,MAAM,QAAA,GAAWG,IAAAA,CAAK,OAAA,EAAS,WAAW,CAAA;AAC1C,MAAA,MAAM,EAAE,SAAA,EAAAD,UAAAA,EAAU,GAAI,MAAM,OAAO,aAAkB,CAAA;AACrD,MAAA,MAAMA,UAAAA,CAAU,UAAU,aAAa,CAAA;AAEvC,MAAA,MAAM,EAAE,IAAA,EAAAE,KAAAA,EAAK,GAAI,MAAM,OAAO,eAAoB,CAAA;AAClD,MAAA,MAAM,EAAE,SAAA,EAAAC,UAAAA,EAAU,GAAI,MAAM,OAAO,MAAW,CAAA;AAC9C,MAAA,MAAM,SAAA,GAAYA,WAAUD,KAAI,CAAA;AAEhC,MAAA,IAAI;AACH,QAAA,MAAM,SAAA;AAAA,UACL,CAAA,UAAA,EAAa,QAAQ,CAAA,MAAA,EAAS,OAAO,CAAA,sBAAA;AAAA,SACtC;AAAA,MACD,CAAA,SAAE;AACD,QAAA,MAAMI,EAAAA,CAAG,QAAA,EAAU,EAAE,KAAA,EAAO,MAAM,CAAA;AAAA,MACnC;AAEA,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,eAAA,EAAkB,OAAO,CAAA,CAAE,CAAA;AAAA,IACxC;AAEA,IAAA,OAAA,CAAQ,GAAA,CAAI;AAAA,IAAA,EAAS,UAAU,CAAA,oBAAA,CAAsB,CAAA;AAAA,EACtD,SAAS,KAAA,EAAO;AACf,IAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AACzD,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,OAAA,EAAU,OAAO,CAAA,CAAE,CAAA;AACjC,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EACf;AACD;AC9GA,eAAsB,KAAK,OAAA,EAAqC;AAC/D,EAAA,IAAI;AACH,IAAA,MAAM,MAAA,GAAS,MAAM,kBAAA,EAAmB;AAExC,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACxB,MAAA,OAAA,CAAQ,IAAI,sBAAsB,CAAA;AAClC,MAAA;AAAA,IACD;AAEA,IAAA,IAAI,QAAQ,IAAA,EAAM;AACjB,MAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAC,CAAA;AAC3C,MAAA;AAAA,IACD;AAEA,IAAA,MAAM,YAAY,YAAA,EAAa;AAE/B,IAAA,OAAA,CAAQ,IAAI,qBAAqB,CAAA;AAEjC,IAAA,KAAA,MAAW,EAAE,IAAA,EAAM,KAAA,EAAM,IAAK,MAAA,EAAQ;AACrC,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,2BAA2B,CAAA;AACpD,MAAA,IAAI,CAAC,KAAA,EAAO;AAEZ,MAAA,MAAM,GAAG,QAAA,EAAU,SAAS,CAAA,GAAI,KAAA;AAChC,MAAA,MAAM,SAAA,GAAYL,IAAAA,CAAK,SAAA,EAAW,QAAA,EAAU,SAAS,CAAA;AAGrD,MAAA,IAAI,MAAA,GAAS,WAAA;AACb,MAAA,IAAI;AACH,QAAA,MAAM,OAAO,SAAS,CAAA;AAAA,MACvB,CAAA,CAAA,MAAQ;AACP,QAAA,MAAA,GAAS,SAAA;AAAA,MACV;AAEA,MAAA,OAAA,CAAQ,IAAI,CAAA,EAAA,EAAK,IAAI,CAAA,CAAA,EAAI,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AACxC,MAAA,IAAI,WAAW,SAAA,EAAW;AACzB,QAAA,OAAA,CAAQ,IAAI,CAAA,mDAAA,CAAqD,CAAA;AAAA,MAClE;AAAA,IACD;AAEA,IAAA,OAAA,CAAQ,GAAA,CAAI;AAAA,OAAA,EAAY,MAAA,CAAO,MAAM,CAAA,SAAA,CAAW,CAAA;AAAA,EACjD,SAAS,KAAA,EAAO;AACf,IAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AACzD,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,OAAA,EAAU,OAAO,CAAA,CAAE,CAAA;AACjC,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EACf;AACD;ACtCA,IAAM,mBAAA,GAAsB,kBAAA;AAc5B,SAAS,aAAa,WAAA,EAA6B;AAElD,EAAA,IAAI,OAAA,CAAQ,IAAI,YAAA,EAAc;AAC7B,IAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,YAAA,CAAa,OAAA,CAAQ,OAAO,EAAE,CAAA;AAAA,EAClD;AAEA,EAAA,IAAI;AACH,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,WAAW,CAAA;AAC/B,IAAA,OAAO,CAAA,EAAG,GAAA,CAAI,QAAQ,CAAA,EAAA,EAAK,IAAI,IAAI,CAAA,CAAA;AAAA,EACpC,CAAA,CAAA,MAAQ;AACP,IAAA,OAAO,mBAAA;AAAA,EACR;AACD;AAOA,SAAS,aAAa,WAAA,EAA6B;AAClD,EAAA,IAAI;AACH,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,WAAW,CAAA;AAC/B,IAAA,OAAO,CAAA,EAAG,GAAA,CAAI,QAAQ,CAAA,EAAA,EAAK,IAAI,IAAI,CAAA,CAAA;AAAA,EACpC,CAAA,CAAA,MAAQ;AACP,IAAA,OAAO,mBAAA;AAAA,EACR;AACD;AAKA,eAAeM,iBAAAA,CACd,aACA,KAAA,EACgD;AAChD,EAAA,MAAM,SAAA,GAAY,aAAa,WAAW,CAAA;AAE1C,EAAA,MAAM,MAAA,GAAS,GAAG,SAAS,CAAA,gCAAA,CAAA;AAE3B,EAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,MAAA,EAAQ;AAAA,IACpC,MAAA,EAAQ,MAAA;AAAA,IACR,OAAA,EAAS;AAAA,MACR,cAAA,EAAgB;AAAA,KACjB;AAAA,IACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,OAAO;AAAA,GAC9B,CAAA;AAED,EAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AACjB,IAAA,MAAM,SAAA,GAAY,MAAM,QAAA,CAAS,IAAA,EAAK;AACtC,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,0BAAA,EAA6B,SAAS,CAAA,CAAE,CAAA;AAAA,EACzD;AAEA,EAAA,OAAO,SAAS,IAAA,EAAK;AACtB;AAKA,SAAS,oBAAoB,aAAA,EAI1B;AACF,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,aAAA,EAAe,YAAA,KAAiB;AACnD,IAAA,IAAI,YAAA;AACJ,IAAA,IAAI,WAAA;AACJ,IAAA,IAAI,SAAA;AAEJ,IAAA,MAAM,YAAA,GAAe,IAAI,OAAA,CAAgB,CAAC,SAAS,MAAA,KAAW;AAC7D,MAAA,YAAA,GAAe,OAAA;AACf,MAAA,WAAA,GAAc,MAAA;AAAA,IACf,CAAC,CAAA;AAED,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,YAAA,CAAa,CAAC,KAAK,GAAA,KAAQ;AAC9C,MAAA,MAAM,MAAM,IAAI,GAAA,CAAI,GAAA,CAAI,GAAA,IAAO,KAAK,CAAA,gBAAA,CAAkB,CAAA;AAEtD,MAAA,IAAI,GAAA,CAAI,aAAa,WAAA,EAAa;AACjC,QAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,OAAO,CAAA;AAC1C,QAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,OAAO,CAAA;AAE1C,QAAA,IAAI,UAAU,aAAA,EAAe;AAC5B,UAAA,GAAA,CAAI,SAAA,CAAU,GAAA,EAAK,EAAE,cAAA,EAAgB,aAAa,CAAA;AAClD,UAAA,GAAA,CAAI,GAAA,CAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAAA,CAQP,CAAA;AACD,UAAA,WAAA,CAAY,IAAI,KAAA,CAAM,uCAAuC,CAAC,CAAA;AAC9D,UAAA;AAAA,QACD;AAEA,QAAA,IAAI,CAAC,KAAA,EAAO;AACX,UAAA,GAAA,CAAI,SAAA,CAAU,GAAA,EAAK,EAAE,cAAA,EAAgB,aAAa,CAAA;AAClD,UAAA,GAAA,CAAI,GAAA,CAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAAA,CAQP,CAAA;AACD,UAAA,WAAA,CAAY,IAAI,KAAA,CAAM,mBAAmB,CAAC,CAAA;AAC1C,UAAA;AAAA,QACD;AAEA,QAAA,GAAA,CAAI,SAAA,CAAU,GAAA,EAAK,EAAE,cAAA,EAAgB,aAAa,CAAA;AAClD,QAAA,GAAA,CAAI,GAAA,CAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAgBP,CAAA;AAED,QAAA,YAAA,CAAa,KAAK,CAAA;AAAA,MACnB,CAAA,MAAO;AACN,QAAA,GAAA,CAAI,SAAA,CAAU,GAAA,EAAK,EAAE,cAAA,EAAgB,cAAc,CAAA;AACnD,QAAA,GAAA,CAAI,IAAI,WAAW,CAAA;AAAA,MACpB;AAAA,IACD,CAAC,CAAA;AAGD,IAAA,MAAM,UAAU,MAAM;AACrB,MAAA,YAAA,CAAa,SAAS,CAAA;AACtB,MAAA,MAAA,CAAO,KAAA,EAAM;AAAA,IACd,CAAA;AAGA,IAAA,MAAA,CAAO,MAAA,CAAO,CAAA,EAAG,WAAA,EAAa,MAAM;AACnC,MAAA,MAAM,OAAA,GAAU,OAAO,OAAA,EAAQ;AAC/B,MAAA,IAAI,OAAO,OAAA,KAAY,QAAA,IAAY,OAAA,KAAY,IAAA,EAAM;AACpD,QAAA,aAAA,CAAc,EAAE,IAAA,EAAM,OAAA,CAAQ,IAAA,EAAM,YAAA,EAAc,SAAS,CAAA;AAAA,MAC5D,CAAA,MAAO;AACN,QAAA,YAAA,CAAa,IAAI,KAAA,CAAM,8BAA8B,CAAC,CAAA;AAAA,MACvD;AAAA,IACD,CAAC,CAAA;AAED,IAAA,MAAA,CAAO,EAAA,CAAG,OAAA,EAAS,CAAC,GAAA,KAAQ;AAC3B,MAAA,YAAA,CAAa,GAAG,CAAA;AAAA,IACjB,CAAC,CAAA;AAGD,IAAA,SAAA,GAAY,UAAA;AAAA,MACX,MAAM;AACL,QAAA,WAAA,CAAY,IAAI,KAAA,CAAM,oCAAoC,CAAC,CAAA;AAC3D,QAAA,MAAA,CAAO,KAAA,EAAM;AAAA,MACd,CAAA;AAAA,MACA,IAAI,EAAA,GAAK;AAAA,KACV;AAAA,EACD,CAAC,CAAA;AACF;AAKA,eAAe,aAAa,aAAA,EAA8C;AACzE,EAAA,MAAM,QAAA,GAAW,MAAM,aAAA,CAAc,aAAa,CAAA;AAClD,EAAA,MAAM,WAAA,GAAc,MAAM,cAAA,CAAe,aAAa,CAAA;AACtD,EAAA,MAAM,SAAA,GAAY,aAAa,WAAW,CAAA;AAG1C,EAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,EAAE,CAAA,CAAE,SAAS,WAAW,CAAA;AAElD,EAAA,OAAA,CAAQ,IAAI,iCAAiC,CAAA;AAG7C,EAAA,MAAM,EAAE,IAAA,EAAM,YAAA,EAAc,SAAQ,GAAI,MAAM,oBAAoB,KAAK,CAAA;AAGvE,EAAA,MAAM,QAAA,GAAW,GAAG,SAAS,CAAA,gBAAA,EAAmB,IAAI,CAAA,OAAA,EAAU,kBAAA,CAAmB,KAAK,CAAC,CAAA,CAAA;AAEvF,EAAA,OAAA,CAAQ,IAAI,CAAA,kCAAA,CAAoC,CAAA;AAChD,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,oCAAA,EAAuC,QAAQ,CAAA,CAAE,CAAA;AAG7D,EAAA,IAAI;AACH,IAAA,MAAM,KAAK,QAAQ,CAAA;AAAA,EACpB,CAAA,CAAA,MAAQ;AACP,IAAA,OAAA,CAAQ,IAAI,uCAAuC,CAAA;AACnD,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,cAAA,EAAiB,QAAQ,CAAA,CAAE,CAAA;AAAA,EACxC;AAEA,EAAA,OAAA,CAAQ,IAAI,+BAA+B,CAAA;AAG3C,EAAA,MAAM,QAAQ,MAAM,YAAA;AAGpB,EAAA,OAAA,EAAQ;AAER,EAAA,OAAA,CAAQ,IAAI,2CAA2C,CAAA;AAGvD,EAAA,MAAM,EAAE,MAAA,EAAQ,QAAA,KAAa,MAAMA,iBAAAA,CAAiB,aAAa,KAAK,CAAA;AAGtE,EAAA,MAAM,qBAAA;AAAA,IACL,QAAA,CAAS,WAAA;AAAA,IACT,MAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,GACD;AAEA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,aAAA,EAAgB,QAAQ,CAAA,CAAE,CAAA;AACtC,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,SAAA,EAAY,QAAA,CAAS,WAAW,CAAA,CAAE,CAAA;AAC9C,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,UAAA,EAAa,WAAW,CAAA,CAAE,CAAA;AACvC;AAKA,eAAe,WAAA,CACd,QACA,aAAA,EACgB;AAChB,EAAA,OAAA,CAAQ,IAAI,sBAAsB,CAAA;AAElC,EAAA,MAAM,QAAA,GAAW,MAAM,aAAA,CAAc,aAAa,CAAA;AAClD,EAAA,MAAM,WAAA,GAAc,MAAM,cAAA,CAAe,aAAa,CAAA;AAEtD,EAAA,MAAM,IAAA,GAAO,MAAM,aAAA,CAAc,WAAA,EAAa,MAAM,CAAA;AACpD,EAAA,IAAI,CAAC,IAAA,EAAM;AACV,IAAA,OAAA,CAAQ,MAAM,6CAA6C,CAAA;AAC3D,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EACf;AAGA,EAAA,MAAM,qBAAA;AAAA,IACL,QAAA,CAAS,WAAA;AAAA,IACT,MAAA;AAAA,IACA,IAAA,CAAK,QAAA;AAAA,IACL;AAAA,GACD;AACA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,aAAA,EAAgB,IAAA,CAAK,QAAQ,CAAA,CAAE,CAAA;AAC3C,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,SAAA,EAAY,QAAA,CAAS,WAAW,CAAA,CAAE,CAAA;AAC9C,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,UAAA,EAAa,WAAW,CAAA,CAAE,CAAA;AACvC;AAEA,eAAsB,KAAA,CACrB,SACA,aAAA,EACgB;AAChB,EAAA,IAAI;AACH,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAEnB,MAAA,MAAM,WAAA,CAAY,OAAA,CAAQ,MAAA,EAAQ,aAAa,CAAA;AAAA,IAChD,CAAA,MAAO;AAEN,MAAA,MAAM,aAAa,aAAa,CAAA;AAAA,IACjC;AAAA,EACD,SAAS,KAAA,EAAO;AACf,IAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AACzD,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,OAAA,EAAU,OAAO,CAAA,CAAE,CAAA;AACjC,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EACf;AACD;;;ACrSA,eAAsB,OAAO,aAAA,EAA8C;AAC1E,EAAA,IAAI;AACH,IAAA,MAAM,QAAA,GAAW,MAAM,aAAA,CAAc,aAAa,CAAA;AAClD,IAAA,MAAM,QAAA,GAAW,MAAM,UAAA,CAAW,aAAa,CAAA;AAE/C,IAAA,IAAI,CAAC,QAAA,EAAU;AACd,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,wBAAA,EAA2B,QAAA,CAAS,WAAW,CAAA,EAAA,CAAI,CAAA;AAC/D,MAAA;AAAA,IACD;AAEA,IAAA,MAAM,uBAAA,CAAwB,SAAS,WAAW,CAAA;AAClD,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,yBAAA,EAA4B,QAAA,CAAS,WAAW,CAAA,EAAA,CAAI,CAAA;AAAA,EACjE,SAAS,KAAA,EAAO;AACf,IAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AACzD,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,OAAA,EAAU,OAAO,CAAA,CAAE,CAAA;AACjC,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EACf;AACD;ACZA,IAAM,IAAA,GAAO,UAAUC,MAAM,CAAA;AAO7B,eAAsB,cAAA,CACrB,SACA,aAAA,EACgB;AAChB,EAAA,IAAI;AACH,IAAA,MAAM,MAAA,GAAS,MAAM,aAAA,CAAc,aAAa,CAAA;AAChD,IAAA,MAAM,WAAA,GAAc,MAAM,cAAA,CAAe,aAAa,CAAA;AAGtD,IAAA,MAAM,eAAA,GAAkBP,IAAAA,CAAK,OAAA,CAAQ,GAAA,IAAO,cAAc,CAAA;AAC1D,IAAA,IAAIQ,YAAAA;AAEJ,IAAA,IAAI;AACH,MAAA,MAAM,OAAA,GAAU,MAAMZ,QAAAA,CAAS,eAAA,EAAiB,OAAO,CAAA;AACvD,MAAAY,YAAAA,GAAc,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAAA,IACjC,CAAA,CAAA,MAAQ;AACP,MAAA,OAAA,CAAQ,MAAM,mDAAmD,CAAA;AACjE,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IACf;AAGA,IAAA,IAAI,CAACA,aAAY,IAAA,EAAM;AACtB,MAAA,OAAA,CAAQ,MAAM,8CAA8C,CAAA;AAC5D,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IACf;AAEA,IAAA,IAAI,CAACA,aAAY,OAAA,EAAS;AACzB,MAAA,OAAA,CAAQ,MAAM,iDAAiD,CAAA;AAC/D,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IACf;AAGA,IAAA,IAAI,QAAQ,IAAA,EAAM;AACjB,MAAA,MAAMC,OAAAA,GAAS,MAAM,OAAO,QAAQ,CAAA;AACpC,MAAA,MAAM,aAAaA,OAAAA,CAAO,OAAA,CAAQ,IAAID,YAAAA,CAAY,OAAA,EAAS,QAAQ,IAAI,CAAA;AACvE,MAAA,IAAI,CAAC,UAAA,EAAY;AAChB,QAAA,OAAA,CAAQ,KAAA;AAAA,UACP,CAAA,mCAAA,EAAsCA,aAAY,OAAO,CAAA;AAAA,SAC1D;AACA,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MACf;AACA,MAAAA,aAAY,OAAA,GAAU,UAAA;AACtB,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,kBAAA,EAAqB,UAAU,CAAA,CAAE,CAAA;AAAA,IAC9C;AAEA,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,UAAA,EAAa,WAAW,CAAA,CAAE,CAAA;AACtC,IAAA,OAAA,CAAQ,IAAI,CAAA,WAAA,EAAcA,YAAAA,CAAY,IAAI,CAAA,CAAA,EAAIA,YAAAA,CAAY,OAAO,CAAA,GAAA,CAAK,CAAA;AAItE,IAAA,MAAM,QAAA,GAAWA,aAAY,IAAA,CAAK,OAAA,CAAQ,SAAS,GAAG,CAAA,CAAE,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AACzE,IAAA,MAAM,WAAA,GAAc,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAIA,aAAY,OAAO,CAAA,IAAA,CAAA;AACtD,IAAA,MAAM,OAAA,GAAUR,IAAAA,CAAK,OAAA,CAAQ,GAAA,IAAO,eAAe,CAAA;AAGnD,IAAA,IAAI;AACH,MAAA,MAAM,IAAA,CAAK,CAAA,QAAA,EAAW,OAAO,CAAA,eAAA,EAAkB,OAAO,CAAA,CAAA,CAAG,CAAA;AAGzD,MAAA,MAAM,KAAA,GAAQQ,aAAY,KAAA,IAAS;AAAA,QAClC,cAAA;AAAA,QACA,UAAA;AAAA,QACA,SAAA;AAAA,QACA,SAAA;AAAA,QACA;AAAA,OACD;AAGA,MAAA,MAAM,IAAA,CAAK,CAAA,UAAA,EAAa,OAAO,CAAA,SAAA,CAAW,CAAA;AAE1C,MAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACzB,QAAA,IAAI;AAEH,UAAA,MAAM,IAAA;AAAA,YACL,CAAA,oDAAA,EAAuD,IAAI,CAAA,GAAA,EAAM,OAAO,CAAA,8BAAA;AAAA,WACzE;AAAA,QACD,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACD;AAGA,MAAA,MAAM,IAAA,CAAK,CAAA,iBAAA,EAAoB,OAAO,CAAA,UAAA,CAAY,CAAA;AAGlD,MAAA,MAAM,WAAA,GAAcR,IAAAA,CAAK,OAAA,EAAS,WAAW,CAAA;AAC7C,MAAA,MAAM,IAAA;AAAA,QACL,CAAA,UAAA,EAAa,WAAW,CAAA,MAAA,EAAS,OAAO,CAAA,mDAAA;AAAA,OACzC;AAGA,MAAA,MAAM,aAAA,GAAgB,MAAMJ,QAAAA,CAAS,WAAW,CAAA;AAChD,MAAA,MAAM,aAAA,GAAgB,aAAA,CAAc,QAAA,CAAS,QAAQ,CAAA;AAGrD,MAAA,SAAA,CAAU,EAAE,OAAA,EAAS,WAAA,EAAa,MAAA,EAAQ,CAAA;AAC1C,MAAA,MAAM,QAAA,GAAW,MAAM,YAAA,CAAa;AAAA,QACnC,QAAA,EAAUY,YAAAA;AAAA,QACV;AAAA,OACA,CAAA;AAED,MAAA,IAAI,QAAA,CAAS,WAAW,GAAA,EAAK;AAC5B,QAAA,MAAM,YAAY,QAAA,CAAS,IAAA;AAI3B,QAAA,MAAM,YAAA,GACL,SAAA,EAAW,KAAA,IAAS,SAAA,EAAW,OAAA,IAAW,gBAAA;AAC3C,QAAA,MAAM,IAAI,MAAM,YAAY,CAAA;AAAA,MAC7B;AAEA,MAAA,MAAM,SAAS,QAAA,CAAS,IAAA;AACxB,MAAA,OAAA,CAAQ,GAAA;AAAA,QACP;AAAA,gBAAA,EAAqB,MAAA,CAAO,KAAA,CAAM,QAAQ,CAAA,CAAA,EAAI,MAAA,CAAO,MAAM,IAAI,CAAA,CAAA,EAAI,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA;AAAA,OAC1F;AACA,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,UAAA,EAAa,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA,CAAE,CAAA;AAAA,IACnD,CAAA,SAAE;AAED,MAAA,MAAM,KAAK,CAAA,QAAA,EAAW,OAAO,CAAA,CAAA,CAAG,CAAA,CAAE,MAAM,MAAM;AAAA,MAAC,CAAC,CAAA;AAAA,IACjD;AAAA,EACD,SAAS,KAAA,EAAO;AAEf,IAAA,IAAI,iBAAiB,KAAA,EAAO;AAC3B,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,OAAA,EAAU,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAGvC,MAAA,MAAM,QAAA,GAAW,KAAA;AAQjB,MAAA,IAAI,QAAA,CAAS,OAAO,QAAA,EAAU;AAC7B,QAAA,IAAI;AACH,UAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,KAAA,CAAM,SAAS,IAAA,EAAK;AAChD,UAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,eAAA,EAAkB,IAAI,CAAA,CAAE,CAAA;AAAA,QACvC,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACD;AAGA,MAAA,IAAI,QAAA,CAAS,OAAO,IAAA,EAAM;AACzB,QAAA,OAAA,CAAQ,KAAA;AAAA,UACP,CAAA,YAAA,EAAe,KAAK,SAAA,CAAU,QAAA,CAAS,MAAM,IAAA,EAAM,IAAA,EAAM,CAAC,CAAC,CAAA;AAAA,SAC5D;AAAA,MACD;AACA,MAAA,IAAI,SAAS,IAAA,EAAM;AAClB,QAAA,OAAA,CAAQ,KAAA,CAAM,eAAe,IAAA,CAAK,SAAA,CAAU,SAAS,IAAA,EAAM,IAAA,EAAM,CAAC,CAAC,CAAA,CAAE,CAAA;AAAA,MACtE;AAGA,MAAA,IAAI,SAAS,IAAA,EAAM;AAClB,QAAA,OAAA,CAAQ,KAAA,CAAM,eAAe,IAAA,CAAK,SAAA,CAAU,SAAS,IAAA,EAAM,IAAA,EAAM,CAAC,CAAC,CAAA,CAAE,CAAA;AAAA,MACtE;AAGA,MAAA,IAAI,OAAA,CAAQ,IAAI,UAAA,EAAY;AAC3B,QAAA,OAAA,CAAQ,MAAM,uBAAuB,CAAA;AACrC,QAAA,OAAA,CAAQ,MAAM,KAAK,CAAA;AACnB,QAAA,IAAI,MAAM,KAAA,EAAO;AAChB,UAAA,OAAA,CAAQ,MAAM,gBAAgB,CAAA;AAC9B,UAAA,OAAA,CAAQ,KAAA,CAAM,MAAM,KAAK,CAAA;AAAA,QAC1B;AAAA,MACD;AAAA,IACD,CAAA,MAAO;AACN,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,OAAA,EAAU,MAAA,CAAO,KAAK,CAAC,CAAA,CAAE,CAAA;AAAA,IACxC;AACA,IAAA,OAAA,CAAQ,MAAM,wDAAwD,CAAA;AACtE,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EACf;AACD;AC3LA,eAAsB,OAAO,eAAA,EAAwC;AACpE,EAAA,IAAI;AACH,IAAA,MAAM,aAAA,EAAc;AAGpB,IAAA,IAAI,QAAA;AACJ,IAAA,IAAI,QAAA;AACJ,IAAA,IAAI,IAAA;AAEJ,IAAA,IAAI,eAAA,CAAgB,UAAA,CAAW,QAAQ,CAAA,EAAG;AAEzC,MAAA,MAAM,KAAA,GAAQ,eAAA,CAAgB,KAAA,CAAM,2BAA2B,CAAA;AAC/D,MAAA,IAAI,CAAC,KAAA,EAAO;AACX,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,gCAAA,EAAmC,eAAe,CAAA,CAAE,CAAA;AAClE,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MACf;AACA,MAAA,QAAA,GAAW,SAAS,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AACxC,MAAA,QAAA,GAAW,MAAM,CAAC,CAAA;AAClB,MAAA,IAAA,GAAO,MAAM,CAAC,CAAA;AAAA,IACf,CAAA,MAAO;AAEN,MAAA,MAAM,MAAA,GAAS,MAAM,kBAAA,EAAmB;AACxC,MAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM;AAChC,QAAA,MAAME,MAAAA,GAAQ,CAAA,CAAE,IAAA,CAAK,KAAA,CAAM,2BAA2B,CAAA;AACtD,QAAA,OAAOA,MAAAA,IAASA,MAAAA,CAAM,CAAC,CAAA,KAAM,eAAA;AAAA,MAC9B,CAAC,CAAA;AAED,MAAA,IAAI,CAAC,KAAA,EAAO;AACX,QAAA,OAAA,CAAQ,KAAA;AAAA,UACP,iBAAiB,eAAe,CAAA,uBAAA;AAAA,SACjC;AACA,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MACf;AAEA,MAAA,QAAA,GAAW,KAAA,CAAM,IAAA;AACjB,MAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,CAAM,2BAA2B,CAAA;AACxD,MAAA,IAAI,CAAC,KAAA,EAAO;AACX,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,uCAAA,EAA0C,QAAQ,CAAA,CAAE,CAAA;AAClE,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MACf;AACA,MAAA,QAAA,GAAW,MAAM,CAAC,CAAA;AAClB,MAAA,IAAA,GAAO,MAAM,CAAC,CAAA;AAAA,IACf;AAEA,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,SAAA,EAAY,QAAQ,CAAA,GAAA,CAAK,CAAA;AAGrC,IAAA,MAAM,OAAA,GAAU,MAAM,kBAAA,CAAmB,QAAQ,CAAA;AACjD,IAAA,IAAI,CAAC,OAAA,EAAS;AACb,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,OAAA,EAAU,QAAQ,CAAA,sBAAA,CAAwB,CAAA;AACxD,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IACf;AAGA,IAAA,MAAM,YAAY,YAAA,EAAa;AAC/B,IAAA,MAAM,OAAA,GAAUV,IAAAA,CAAK,SAAA,EAAW,QAAA,EAAU,IAAI,CAAA;AAE9C,IAAA,IAAI;AACH,MAAA,MAAMK,GAAG,OAAA,EAAS,EAAE,WAAW,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AAAA,IACnD,CAAA,CAAA,MAAQ;AAAA,IAER;AAEA,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,QAAA,EAAW,QAAQ,CAAA,CAAE,CAAA;AAAA,EAClC,SAAS,KAAA,EAAO;AACf,IAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AACzD,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,OAAA,EAAU,OAAO,CAAA,CAAE,CAAA;AACjC,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EACf;AACD;;;AC9DA,eAAsB,SAAA,CACrB,SAAA,EACA,OAAA,EACA,aAAA,EACgB;AAChB,EAAA,IAAI;AACH,IAAA,MAAM,MAAA,GAAS,MAAM,aAAA,CAAc,aAAa,CAAA;AAChD,IAAA,MAAM,WAAA,GAAc,MAAM,cAAA,CAAe,aAAa,CAAA;AAGtD,IAAA,MAAM,MAAA,GAAS,oBAAoB,SAAS,CAAA;AAC5C,IAAA,IAAI,CAAC,MAAA,EAAQ;AACZ,MAAA,OAAA,CAAQ,KAAA;AAAA,QACP,mCAAmC,SAAS,CAAA,kDAAA;AAAA,OAC7C;AACA,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IACf;AAEA,IAAA,MAAM,EAAE,QAAA,EAAU,IAAA,EAAM,YAAA,EAAa,GAAI,MAAA;AAGzC,IAAA,SAAA,CAAU,EAAE,OAAA,EAAS,WAAA,EAAa,MAAA,EAAQ,CAAA;AAE1C,IAAA,IAAI,YAAA,EAAc;AAEjB,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,aAAA,EAAgB,SAAS,CAAA,GAAA,CAAK,CAAA;AAE1C,MAAA,IAAI,CAAC,QAAQ,KAAA,EAAO;AACnB,QAAA,OAAA,CAAQ,KAAA;AAAA,UACP;AAAA,SACD;AACA,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MACf;AAEA,MAAA,MAAM,QAAA,GAAW,MAAM,kBAAA,CAAmB,IAAA,EAAM,YAAY,CAAA;AAC5D,MAAA,IAAI,QAAA,CAAS,WAAW,GAAA,EAAK;AAC5B,QAAA,MAAM,YAAY,QAAA,CAAS,IAAA;AAI3B,QAAA,MAAM,YAAA,GACL,SAAA,EAAW,KAAA,IACX,SAAA,EAAW,OAAA,IACX,6CAAA;AACD,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,OAAA,EAAU,YAAY,CAAA,CAAE,CAAA;AACtC,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MACf;AACA,MAAA,OAAA,CAAQ,IAAI,CAAA,kBAAA,EAAqB,QAAQ,IAAI,IAAI,CAAA,CAAA,EAAI,YAAY,CAAA,CAAE,CAAA;AAAA,IACpE,CAAA,MAAO;AAEN,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,mCAAA,EAAsC,QAAQ,CAAA,CAAA,EAAI,IAAI,CAAA,GAAA,CAAK,CAAA;AAEvE,MAAA,IAAI,CAAC,QAAQ,KAAA,EAAO;AACnB,QAAA,OAAA,CAAQ,KAAA;AAAA,UACP;AAAA,SACD;AACA,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MACf;AAEA,MAAA,MAAM,QAAA,GAAW,MAAM,WAAA,CAAY,IAAI,CAAA;AACvC,MAAA,IAAI,QAAA,CAAS,WAAW,GAAA,EAAK;AAC5B,QAAA,MAAM,YAAY,QAAA,CAAS,IAAA;AAI3B,QAAA,MAAM,YAAA,GACL,SAAA,EAAW,KAAA,IACX,SAAA,EAAW,OAAA,IACX,2CAAA;AACD,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,OAAA,EAAU,YAAY,CAAA,CAAE,CAAA;AACtC,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MACf;AACA,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,kBAAA,EAAqB,QAAQ,CAAA,CAAA,EAAI,IAAI,CAAA,eAAA,CAAiB,CAAA;AAAA,IACnE;AAAA,EACD,SAAS,KAAA,EAAO;AACf,IAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AACzD,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,OAAA,EAAU,OAAO,CAAA,CAAE,CAAA;AACjC,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EACf;AACD;;;AC7EA,eAAsB,MAAA,CACrB,SACA,aAAA,EACgB;AAChB,EAAA,IAAI;AACH,IAAA,MAAM,MAAA,GAAS,MAAM,aAAA,CAAc,aAAa,CAAA;AAChD,IAAA,MAAM,WAAA,GAAc,MAAM,cAAA,CAAe,aAAa,CAAA;AAEtD,IAAA,MAAM,MAAA,GAAS,MAAM,kBAAA,EAAmB;AAExC,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACxB,MAAA,OAAA,CAAQ,IAAI,sBAAsB,CAAA;AAClC,MAAA;AAAA,IACD;AAGA,IAAA,SAAA,CAAU,EAAE,OAAA,EAAS,WAAA,EAAa,MAAA,EAAQ,CAAA;AAE1C,IAAA,MAAM,UAID,EAAC;AAEN,IAAA,OAAA,CAAQ,IAAI,2BAA2B,CAAA;AAEvC,IAAA,KAAA,MAAW,EAAE,IAAA,EAAM,KAAA,EAAM,IAAK,MAAA,EAAQ;AACrC,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,2BAA2B,CAAA;AACpD,MAAA,IAAI,CAAC,KAAA,EAAO;AAEZ,MAAA,MAAM,GAAG,QAAA,EAAU,SAAS,CAAA,GAAI,KAAA;AAEhC,MAAA,IAAI;AACH,QAAA,MAAM,gBAAA,GAAmB,MAAM,iBAAA,CAAkB,QAAA,EAAU,SAAS,CAAA;AACpE,QAAA,MAAM,WAAW,gBAAA,CAAiB,IAAA;AAClC,QAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AAE3B,QAAA,MAAM,iBAAiB,QAAA,CAAS,GAAA;AAAA,UAC/B,CAAC,MAA2B,CAAA,CAAE;AAAA,SAC/B;AACA,QAAA,MAAM,MAAA,GAAS,cAAA,CAAe,GAAA,EAAK,cAAc,CAAA;AAEjD,QAAA,IAAI,MAAA,IAAU,MAAA,KAAW,KAAA,CAAM,OAAA,EAAS;AACvC,UAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,YACZ,IAAA;AAAA,YACA,SAAS,KAAA,CAAM,OAAA;AAAA,YACf;AAAA,WACA,CAAA;AAAA,QACF;AAAA,MACD,CAAA,CAAA,MAAQ;AACP,QAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,uCAAA,EAA0C,IAAI,CAAA,CAAE,CAAA;AAAA,MAC9D;AAAA,IACD;AAEA,IAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACzB,MAAA,OAAA,CAAQ,IAAI,4BAA4B,CAAA;AACxC,MAAA;AAAA,IACD;AAEA,IAAA,OAAA,CAAQ,IAAI,sBAAsB,CAAA;AAClC,IAAA,KAAA,MAAW,EAAE,IAAA,EAAM,OAAA,EAAS,MAAA,MAAY,OAAA,EAAS;AAChD,MAAA,OAAA,CAAQ,IAAI,CAAA,EAAA,EAAK,IAAI,KAAK,OAAO,CAAA,IAAA,EAAO,MAAM,CAAA,CAAE,CAAA;AAAA,IACjD;AAEA,IAAA,IAAI,QAAQ,MAAA,EAAQ;AACnB,MAAA,OAAA,CAAQ,IAAI,8BAA8B,CAAA;AAC1C,MAAA;AAAA,IACD;AAEA,IAAA,OAAA,CAAQ,IAAI,iBAAiB,CAAA;AAE7B,IAAA,KAAA,MAAW,EAAE,IAAA,EAAM,MAAA,EAAO,IAAK,OAAA,EAAS;AACvC,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,2BAA2B,CAAA;AACpD,MAAA,IAAI,CAAC,KAAA,EAAO;AAEZ,MAAA,MAAM,GAAG,QAAA,EAAU,SAAS,CAAA,GAAI,KAAA;AAChC,MAAA,MAAM,YAAY,CAAA,MAAA,EAAS,QAAQ,CAAA,CAAA,EAAI,SAAS,IAAI,MAAM,CAAA,CAAA;AAE1D,MAAA,MAAM,GAAA,CAAI,SAAA,EAAW,EAAC,EAAG,aAAa,CAAA;AAAA,IACvC;AAEA,IAAA,OAAA,CAAQ,IAAI,uBAAuB,CAAA;AAAA,EACpC,SAAS,KAAA,EAAO;AACf,IAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AACzD,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,OAAA,EAAU,OAAO,CAAA,CAAE,CAAA;AACjC,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EACf;AACD;;;AC7FA,eAAsB,OAAO,aAAA,EAA8C;AAC1E,EAAA,IAAI;AACH,IAAA,MAAM,QAAA,GAAW,MAAM,aAAA,CAAc,aAAa,CAAA;AAClD,IAAA,MAAM,MAAA,GAAS,MAAM,aAAA,CAAc,aAAa,CAAA;AAChD,IAAA,MAAM,WAAA,GAAc,MAAM,cAAA,CAAe,aAAa,CAAA;AAEtD,IAAA,MAAM,IAAA,GAAO,MAAM,aAAA,CAAc,WAAA,EAAa,MAAM,CAAA;AAEpD,IAAA,IAAI,IAAA,EAAM;AACT,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,UAAA,EAAa,IAAA,CAAK,QAAQ,CAAA,CAAE,CAAA;AACxC,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,UAAA,EAAa,IAAA,CAAK,MAAM,CAAA,CAAE,CAAA;AACtC,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,UAAA,EAAa,WAAW,CAAA,CAAE,CAAA;AACtC,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,UAAA,EAAa,QAAA,CAAS,WAAW,CAAA,CAAE,CAAA;AAAA,IAChD,CAAA,MAAA,IAAW,SAAS,QAAA,EAAU;AAE7B,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,UAAA,EAAa,QAAA,CAAS,QAAQ,CAAA,SAAA,CAAW,CAAA;AACrD,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,UAAA,EAAa,WAAW,CAAA,CAAE,CAAA;AACtC,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,UAAA,EAAa,QAAA,CAAS,WAAW,CAAA,CAAE,CAAA;AAAA,IAChD,CAAA,MAAO;AACN,MAAA,OAAA,CAAQ,MAAM,mCAAmC,CAAA;AACjD,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IACf;AAAA,EACD,SAAS,KAAA,EAAO;AACf,IAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AACzD,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,OAAA,EAAU,OAAO,CAAA,CAAE,CAAA;AACjC,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EACf;AACD;;;ACPA,IAAMM,WAAA,GAAYb,OAAAA,CAAQ,aAAA,CAAc,MAAA,CAAA,IAAA,CAAY,GAAG,CAAC,CAAA;AACxD,IAAM,cAAc,IAAA,CAAK,KAAA;AAAA,EACxB,aAAaE,IAAAA,CAAKW,WAAA,EAAW,IAAA,EAAM,cAAc,GAAG,OAAO;AAC5D,CAAA;AACA,IAAM,UAAkB,WAAA,CAAY,OAAA;AAEpC,IAAM,OAAA,GAAU,IAAI,OAAA,EAAQ;AAE5B,OAAA,CACE,IAAA,CAAK,MAAM,CAAA,CACX,WAAA,CAAY,uCAAuC,CAAA,CACnD,OAAA,CAAQ,OAAO,CAAA,CACf,MAAA,CAAO,sBAAA,EAAwB,wBAAwB,CAAA;AAKzD,SAAS,iBAAiB,GAAA,EAA6B;AAEtD,EAAA,IAAI,OAAA,GAA0B,GAAA;AAC9B,EAAA,OAAO,QAAQ,MAAA,EAAQ;AACtB,IAAA,OAAA,GAAU,OAAA,CAAQ,MAAA;AAAA,EACnB;AACA,EAAA,MAAM,IAAA,GAAO,QAAQ,IAAA,EAAK;AAC1B,EAAA,OAAO;AAAA,IACN,SAAS,IAAA,CAAK;AAAA,GACf;AACD;AAMA,IAAM,YAAY,OAAA,CAChB,OAAA,CAAQ,QAAQ,CAAA,CAChB,YAAY,wCAAwC,CAAA;AAEtD,SAAA,CACE,QAAQ,MAAM,CAAA,CACd,YAAY,mBAAmB,CAAA,CAC/B,OAAO,YAAY;AACnB,EAAA,MAAM,UAAA,EAAW;AAClB,CAAC,CAAA;AAEF,SAAA,CACE,OAAA,CAAQ,aAAa,CAAA,CACrB,WAAA,CAAY,4CAA4C,EACxD,MAAA,CAAO,OAAO,IAAA,EAAM,QAAA,EAAU,GAAA,KAAQ;AACtC,EAAA,MAAM,aAAA,GAAgB,iBAAiB,GAAG,CAAA;AAC1C,EAAA,MAAM,UAAA,CAAW,EAAE,IAAA,EAAK,EAAG,aAAa,CAAA;AACzC,CAAC,CAAA;AAEF,SAAA,CACE,OAAA,CAAQ,YAAY,CAAA,CACpB,WAAA,CAAY,sBAAsB,CAAA,CAClC,MAAA,CAAO,sBAAA,EAAwB,8BAA8B,CAAA,CAC7D,MAAA,CAAO,OAAO,MAAM,OAAA,KAAY;AAChC,EAAA,MAAM,UAAU,IAAA,EAAM,EAAE,WAAA,EAAa,OAAA,CAAQ,aAAa,CAAA;AAC3D,CAAC,CAAA;AAEF,SAAA,CACE,OAAA,CAAQ,YAAY,CAAA,CACpB,WAAA,CAAY,yBAAyB,CAAA,CACrC,MAAA,CAAO,OAAO,IAAA,KAAS;AACvB,EAAA,MAAM,UAAU,IAAI,CAAA;AACrB,CAAC,CAAA;AAEF,SAAA,CACE,OAAA,CAAQ,6BAA6B,CAAA,CACrC,WAAA,CAAY,qDAAqD,EACjE,MAAA,CAAO,OAAO,OAAA,EAAS,GAAA,EAAK,KAAA,KAAU;AACtC,EAAA,MAAM,SAAA,CAAU,OAAA,EAAS,GAAA,EAAK,KAAK,CAAA;AACpC,CAAC,CAAA;AAEF,SAAA,CACE,OAAA,CAAQ,eAAe,CAAA,CACvB,WAAA,CAAY,kBAAkB,CAAA,CAC9B,MAAA,CAAO,OAAO,IAAA,KAAS;AACvB,EAAA,MAAM,aAAa,IAAI,CAAA;AACxB,CAAC,CAAA;AAEF,SAAA,CACE,QAAQ,MAAM,CAAA,CACd,WAAA,CAAY,gDAAgD,EAC5D,MAAA,CAAO,kBAAA,EAAoB,iCAAiC,CAAA,CAC5D,OAAO,sBAAA,EAAwB,uBAAuB,CAAA,CACtD,MAAA,CAAO,OAAO,OAAA,KAAY;AAC1B,EAAA,MAAM,UAAA,CAAW;AAAA,IAChB,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,aAAa,OAAA,CAAQ;AAAA,GACrB,CAAA;AACF,CAAC,CAAA;AAMF,OAAA,CACE,OAAA,CAAQ,OAAO,CAAA,CACf,WAAA,CAAY,uCAAuC,CAAA,CACnD,MAAA;AAAA,EACA,iBAAA;AAAA,EACA;AACD,CAAA,CACC,MAAA,CAAO,OAAO,OAAA,EAAS,GAAA,KAAQ;AAC/B,EAAA,MAAM,aAAA,GAAgB,iBAAiB,GAAG,CAAA;AAC1C,EAAA,MAAM,MAAM,EAAE,MAAA,EAAQ,OAAA,CAAQ,MAAA,IAAU,aAAa,CAAA;AACtD,CAAC,CAAA;AAEF,OAAA,CACE,OAAA,CAAQ,QAAQ,CAAA,CAChB,WAAA,CAAY,sCAAsC,CAAA,CAClD,MAAA,CAAO,OAAO,QAAA,EAAU,GAAA,KAAQ;AAChC,EAAA,MAAM,aAAA,GAAgB,iBAAiB,GAAG,CAAA;AAC1C,EAAA,MAAM,OAAO,aAAa,CAAA;AAC3B,CAAC,CAAA;AAEF,OAAA,CACE,OAAA,CAAQ,QAAQ,CAAA,CAChB,WAAA,CAAY,+BAA+B,CAAA,CAC3C,MAAA,CAAO,OAAO,QAAA,EAAU,GAAA,KAAQ;AAChC,EAAA,MAAM,aAAA,GAAgB,iBAAiB,GAAG,CAAA;AAC1C,EAAA,MAAM,OAAO,aAAa,CAAA;AAC3B,CAAC,CAAA;AAMF,OAAA,CACE,OAAA,CAAQ,iBAAiB,CAAA,CACzB,WAAA,CAAY,qDAAqD,CAAA,CACjE,MAAA,CAAO,QAAA,EAAU,4BAA4B,CAAA,CAC7C,MAAA,CAAO,OAAO,SAAA,EAAW,SAAS,GAAA,KAAQ;AAC1C,EAAA,MAAM,aAAA,GAAgB,iBAAiB,GAAG,CAAA;AAC1C,EAAA,MAAM,GAAA,CAAI,WAAW,EAAE,IAAA,EAAM,QAAQ,IAAA,IAAQ,IAAA,IAAQ,aAAa,CAAA;AACnE,CAAC,CAAA;AAEF,OAAA,CACE,OAAA,CAAQ,eAAe,CAAA,CACvB,KAAA,CAAM,IAAI,CAAA,CACV,WAAA,CAAY,2BAA2B,CAAA,CACvC,MAAA,CAAO,OAAO,IAAA,KAAS;AACvB,EAAA,MAAM,OAAO,IAAI,CAAA;AAClB,CAAC,CAAA;AAEF,OAAA,CACE,OAAA,CAAQ,MAAM,CAAA,CACd,KAAA,CAAM,IAAI,CAAA,CACV,WAAA,CAAY,uBAAuB,CAAA,CACnC,OAAO,QAAA,EAAU,gBAAgB,CAAA,CACjC,MAAA,CAAO,OAAO,OAAA,KAAY;AAC1B,EAAA,MAAM,IAAA,CAAK,EAAE,IAAA,EAAM,OAAA,CAAQ,MAAM,CAAA;AAClC,CAAC,CAAA;AAEF,OAAA,CACE,OAAA,CAAQ,SAAS,CAAA,CACjB,KAAA,CAAM,GAAG,CAAA,CACT,WAAA,CAAY,kCAAkC,CAAA,CAC9C,MAAA,CAAO,qBAAqB,yCAAyC,CAAA,CACrE,OAAO,cAAA,EAAgB,wCAAwC,EAC/D,MAAA,CAAO,OAAO,SAAS,GAAA,KAAQ;AAC/B,EAAA,MAAM,aAAA,GAAgB,iBAAiB,GAAG,CAAA;AAC1C,EAAA,MAAM,OAAA;AAAA,IACL;AAAA,MACC,gBAAgB,OAAA,CAAQ,cAAA;AAAA,MACxB,KAAK,OAAA,CAAQ;AAAA,KACd;AAAA,IACA;AAAA,GACD;AACD,CAAC,CAAA;AAEF,OAAA,CACE,OAAA,CAAQ,QAAQ,CAAA,CAChB,WAAA,CAAY,iDAAiD,CAAA,CAC7D,MAAA,CAAO,WAAA,EAAa,mDAAmD,CAAA,CACvE,MAAA,CAAO,OAAO,SAAS,GAAA,KAAQ;AAC/B,EAAA,MAAM,aAAA,GAAgB,iBAAiB,GAAG,CAAA;AAC1C,EAAA,MAAM,OAAO,EAAE,MAAA,EAAQ,OAAA,CAAQ,MAAA,IAAU,aAAa,CAAA;AACvD,CAAC,CAAA;AAMF,OAAA,CACE,QAAQ,SAAS,CAAA,CACjB,WAAA,CAAY,sCAAsC,EAClD,MAAA,CAAO,gBAAA,EAAkB,oCAAoC,CAAA,CAC7D,OAAO,aAAA,EAAe,qBAAqB,EAC3C,MAAA,CAAO,OAAO,SAAS,GAAA,KAAQ;AAC/B,EAAA,MAAM,aAAA,GAAgB,iBAAiB,GAAG,CAAA;AAC1C,EAAA,MAAM,cAAA;AAAA,IACL;AAAA,MACC,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,KAAK,OAAA,CAAQ;AAAA,KACd;AAAA,IACA;AAAA,GACD;AACD,CAAC,CAAA;AAEF,OAAA,CACE,OAAA,CAAQ,uBAAuB,CAAA,CAC/B,WAAA,CAAY,kCAAkC,CAAA,CAC9C,MAAA,CAAO,SAAA,EAAW,4BAA4B,CAAA,CAC9C,MAAA,CAAO,OAAO,SAAA,EAAW,SAAS,GAAA,KAAQ;AAC1C,EAAA,MAAM,aAAA,GAAgB,iBAAiB,GAAG,CAAA;AAC1C,EAAA,MAAM,UAAU,SAAA,EAAW,EAAE,OAAO,OAAA,CAAQ,KAAA,IAAS,aAAa,CAAA;AACnE,CAAC,CAAA;AAEF,OAAA,CAAQ,KAAA,EAAM","file":"index.js","sourcesContent":["import { createHash } from \"node:crypto\";\n\n/**\n * Calculate integrity hash for a buffer.\n * Uses SHA-256 with base64 encoding, prefixed with \"sha256-\".\n *\n * @param data - The buffer to hash\n * @returns Integrity string (e.g., \"sha256-abc123...\")\n */\nexport function calculateIntegrity(data: Buffer): string {\n\tconst hash = createHash(\"sha256\").update(data).digest(\"base64\");\n\treturn `sha256-${hash}`;\n}\n\n/**\n * Verify that a buffer matches an expected integrity hash.\n *\n * @param data - The buffer to verify\n * @param expectedIntegrity - The expected integrity string\n * @returns True if the integrity matches\n */\nexport function verifyIntegrity(\n\tdata: Buffer,\n\texpectedIntegrity: string,\n): boolean {\n\tconst match = expectedIntegrity.match(/^sha256-(.+)$/);\n\tif (!match) {\n\t\treturn false;\n\t}\n\n\tconst actualHash = createHash(\"sha256\").update(data).digest(\"base64\");\n\treturn actualHash === match[1];\n}\n","/**\n * Parsed skill specifier (from CLI input)\n * e.g., \"@user/bsheng/vite_slides@^2.0.0\"\n */\nexport interface SkillSpecifier {\n\tusername: string;\n\tname: string;\n\tversionRange?: string;\n}\n\n/**\n * Skill specifier regex pattern\n * Matches: @user/{username}/{name}[@{version}]\n */\nconst SPECIFIER_PATTERN =\n\t/^@user\\/([a-zA-Z0-9_-]+)\\/([a-z][a-z0-9_-]*)(?:@(.+))?$/;\n\n/**\n * Parse a skill specifier string.\n *\n * @param specifier - The specifier string (e.g., \"@user/bsheng/vite_slides@^2.0.0\")\n * @returns Parsed specifier or null if invalid\n *\n * @example\n * ```typescript\n * parseSkillSpecifier(\"@user/bsheng/my-skill@^1.0.0\")\n * // => { username: \"bsheng\", name: \"my-skill\", versionRange: \"^1.0.0\" }\n *\n * parseSkillSpecifier(\"@user/bsheng/my-skill\")\n * // => { username: \"bsheng\", name: \"my-skill\", versionRange: undefined }\n * ```\n */\nexport function parseSkillSpecifier(specifier: string): SkillSpecifier | null {\n\tconst match = specifier.match(SPECIFIER_PATTERN);\n\n\tif (!match) {\n\t\treturn null;\n\t}\n\n\treturn {\n\t\tusername: match[1],\n\t\tname: match[2],\n\t\tversionRange: match[3],\n\t};\n}\n\n/**\n * Generate a full skill identifier string.\n *\n * @param username - The owner's username\n * @param name - The skill name\n * @param version - Optional version string\n * @returns Full identifier (e.g., \"@user/bsheng/my-skill@1.0.0\")\n */\nexport function generateSkillIdentifier(\n\tusername: string,\n\tname: string,\n\tversion?: string,\n): string {\n\tconst base = `@user/${username}/${name}`;\n\treturn version ? `${base}@${version}` : base;\n}\n","import * as semver from \"semver\";\n\n/**\n * Resolve the best matching version from a list of available versions.\n *\n * @param range - The version range to match (e.g., \"^1.0.0\", \"~2.1.0\", \"*\")\n * @param availableVersions - List of available version strings\n * @returns The best matching version or null if none found\n */\nexport function resolveVersion(\n\trange: string,\n\tavailableVersions: string[],\n): string | null {\n\tconst sorted = availableVersions\n\t\t.filter((v) => semver.valid(v))\n\t\t.sort((a, b) => semver.rcompare(a, b));\n\n\tif (!range || range === \"latest\" || range === \"*\") {\n\t\treturn sorted[0] ?? null;\n\t}\n\n\treturn semver.maxSatisfying(sorted, range);\n}\n\n/**\n * Check if a version satisfies a given range.\n */\nexport function versionSatisfies(version: string, range: string): boolean {\n\treturn semver.satisfies(version, range);\n}\n\n/**\n * Normalize a version range string.\n * Converts \"latest\" or empty to \"*\".\n */\nexport function normalizeVersionRange(range?: string): string {\n\tif (!range || range === \"latest\") {\n\t\treturn \"*\";\n\t}\n\treturn range;\n}\n\n/**\n * Compare two versions.\n * Returns: -1 if a < b, 0 if a === b, 1 if a > b\n */\nexport function compareVersions(a: string, b: string): number {\n\treturn semver.compare(a, b);\n}\n\n/**\n * Check if version a is greater than version b.\n */\nexport function isNewerVersion(a: string, b: string): boolean {\n\treturn semver.gt(a, b);\n}\n\n/**\n * Get the latest version from a list.\n */\nexport function getLatestVersion(versions: string[]): string | null {\n\tconst valid = versions.filter((v) => semver.valid(v));\n\tif (valid.length === 0) return null;\n\treturn valid.sort((a, b) => semver.rcompare(a, b))[0];\n}\n","/**\n * Custom fetch wrapper for Orval-generated SDK\n *\n * Handles authentication and base URL configuration.\n */\n\nexport interface SDKConfig {\n\tbaseUrl: string;\n\tapiKey: string;\n}\n\nlet config: SDKConfig | null = null;\n\n/**\n * Configure the SDK with base URL and API key.\n * Must be called before making any API requests.\n *\n * @example\n * ```typescript\n * import { configure } from \"@repo/sdk\";\n *\n * configure({\n * baseUrl: \"http://localhost:5600\",\n * apiKey: \"your-api-key\"\n * });\n * ```\n */\nexport function configure(options: SDKConfig): void {\n\tconfig = options;\n}\n\n/**\n * Get the current SDK configuration.\n * @throws Error if not configured\n */\nexport function getConfig(): SDKConfig {\n\tif (!config) {\n\t\tthrow new Error(\"SDK not configured. Call configure() first.\");\n\t}\n\treturn config;\n}\n\n/**\n * Check if the SDK is configured.\n */\nexport function isConfigured(): boolean {\n\treturn config !== null;\n}\n\n/**\n * Error class for SDK API errors\n */\nexport class SDKError extends Error {\n\tconstructor(\n\t\tmessage: string,\n\t\tpublic readonly status: number,\n\t\tpublic readonly body?: string,\n\t) {\n\t\tsuper(message);\n\t\tthis.name = \"SDKError\";\n\t}\n}\n\n/**\n * Response structure returned by all SDK functions\n */\nexport interface SDKResponse<T> {\n\tdata: T;\n\tstatus: number;\n\theaders: Headers;\n}\n\n/**\n * Custom fetch function for Orval\n *\n * This is used by all generated API functions to make HTTP requests.\n * It handles authentication, error handling, and response parsing.\n *\n * Returns { data, status, headers } structure expected by Orval v8.\n */\nexport async function customFetch<T>(\n\turl: string,\n\toptions: RequestInit,\n): Promise<T> {\n\tconst { baseUrl, apiKey } = getConfig();\n\n\t// The URL from Orval will be like \"/api/skills/me\"\n\t// We need to prepend the baseUrl\n\tconst fullUrl = `${baseUrl}${url}`;\n\n\tconst response = await fetch(fullUrl, {\n\t\t...options,\n\t\theaders: {\n\t\t\t...options.headers,\n\t\t\tAuthorization: `Bearer ${apiKey}`,\n\t\t\t\"Content-Type\": \"application/json\",\n\t\t},\n\t});\n\n\tconst text = await response.text();\n\tlet data: unknown = null;\n\n\tif (text) {\n\t\ttry {\n\t\t\tdata = JSON.parse(text);\n\t\t} catch {\n\t\t\tdata = text;\n\t\t}\n\t}\n\n\t// Return the structure expected by Orval v8: { data, status, headers }\n\treturn {\n\t\tdata,\n\t\tstatus: response.status,\n\t\theaders: response.headers,\n\t} as T;\n}\n","/**\n * Generated by orval v8.0.2 🍺\n * Do not edit manually.\n * PSPM API\n * Backend API for PSPM - Private Skill Package Manager for Claude Code\n * OpenAPI spec version: 1.0.0\n */\nimport { customFetch } from '../fetcher';\nexport type ReportErrorsBodyErrorsItemSource = typeof ReportErrorsBodyErrorsItemSource[keyof typeof ReportErrorsBodyErrorsItemSource];\n\n\nexport const ReportErrorsBodyErrorsItemSource = {\n hydration: 'hydration',\n loader: 'loader',\n action: 'action',\n render: 'render',\n streaming: 'streaming',\n network: 'network',\n global: 'global',\n unknown: 'unknown',\n} as const;\n\nexport type ReportErrorsBodyErrorsItemSeverity = typeof ReportErrorsBodyErrorsItemSeverity[keyof typeof ReportErrorsBodyErrorsItemSeverity];\n\n\nexport const ReportErrorsBodyErrorsItemSeverity = {\n fatal: 'fatal',\n error: 'error',\n warning: 'warning',\n info: 'info',\n} as const;\n\nexport type ReportErrorsBodyErrorsItemContext = {[key: string]: unknown};\n\nexport type ReportErrorsBodyErrorsItem = {\n id: string;\n message: string;\n stack?: string;\n componentStack?: string;\n source: ReportErrorsBodyErrorsItemSource;\n severity: ReportErrorsBodyErrorsItemSeverity;\n route?: string;\n timestamp: number;\n context?: ReportErrorsBodyErrorsItemContext;\n digest?: string;\n};\n\nexport type ReportErrorsBody = {\n errors: ReportErrorsBodyErrorsItem[];\n userAgent: string;\n url: string;\n timestamp: number;\n};\n\nexport type ReportErrors200 = {\n success: boolean;\n};\n\nexport type Me200 = {\n userId: string;\n username: string;\n} | null;\n\nexport type ListMySkills200Item = {\n id: string;\n name: string;\n userId: string;\n description: string | null;\n createdAt: string;\n updatedAt: string;\n username: string;\n};\n\nexport type ListUserSkills200Item = {\n id: string;\n name: string;\n userId: string;\n description: string | null;\n createdAt: string;\n updatedAt: string;\n username: string;\n};\n\nexport type GetSkill200 = {\n id: string;\n name: string;\n userId: string;\n description: string | null;\n createdAt: string;\n updatedAt: string;\n username: string;\n} | null;\n\nexport type ListSkillVersions200ItemManifestPspmRequirements = {\n claude?: string;\n node?: string;\n};\n\nexport type ListSkillVersions200ItemManifestPspm = {\n type: 'skill';\n capabilities?: string[];\n requirements?: ListSkillVersions200ItemManifestPspmRequirements;\n};\n\nexport type ListSkillVersions200ItemManifest = {\n /**\n * @minLength 1\n * @maxLength 100\n * @pattern ^[a-z][a-z0-9_-]*$\n */\n name: string;\n /**\n * Semantic version string (e.g., 1.0.0)\n * @pattern ^\\d+\\.\\d+\\.\\d+(-[\\w.]+)?(\\+[\\w.]+)?$\n */\n version: string;\n /** @maxLength 500 */\n description?: string;\n files?: string[];\n pspm?: ListSkillVersions200ItemManifestPspm;\n};\n\nexport type ListSkillVersions200Item = {\n id: string;\n skillId: string;\n version: string;\n r2Key: string;\n checksum: string;\n manifest: ListSkillVersions200ItemManifest;\n publishedAt: string;\n};\n\nexport type GetSkillVersion200 = {\n id: string;\n skillId: string;\n version: string;\n r2Key: string;\n checksum: string;\n manifest: {\n /**\n * @minLength 1\n * @maxLength 100\n * @pattern ^[a-z][a-z0-9_-]*$\n */\n name: string;\n /**\n * Semantic version string (e.g., 1.0.0)\n * @pattern ^\\d+\\.\\d+\\.\\d+(-[\\w.]+)?(\\+[\\w.]+)?$\n */\n version: string;\n /** @maxLength 500 */\n description?: string;\n files?: string[];\n pspm?: {\n type: 'skill';\n capabilities?: string[];\n requirements?: {\n claude?: string;\n node?: string;\n};\n};\n};\n publishedAt: string;\n downloadUrl: string;\n} | null;\n\nexport type PublishSkillBodyManifestPspmRequirements = {\n claude?: string;\n node?: string;\n};\n\nexport type PublishSkillBodyManifestPspm = {\n type: 'skill';\n capabilities?: string[];\n requirements?: PublishSkillBodyManifestPspmRequirements;\n};\n\nexport type PublishSkillBodyManifest = {\n /**\n * @minLength 1\n * @maxLength 100\n * @pattern ^[a-z][a-z0-9_-]*$\n */\n name: string;\n /**\n * Semantic version string (e.g., 1.0.0)\n * @pattern ^\\d+\\.\\d+\\.\\d+(-[\\w.]+)?(\\+[\\w.]+)?$\n */\n version: string;\n /** @maxLength 500 */\n description?: string;\n files?: string[];\n pspm?: PublishSkillBodyManifestPspm;\n};\n\nexport type PublishSkillBody = {\n manifest: PublishSkillBodyManifest;\n tarballBase64: string;\n};\n\nexport type PublishSkill200Skill = {\n id: string;\n name: string;\n userId: string;\n description: string | null;\n createdAt: string;\n updatedAt: string;\n username: string;\n};\n\nexport type PublishSkill200VersionManifestPspmRequirements = {\n claude?: string;\n node?: string;\n};\n\nexport type PublishSkill200VersionManifestPspm = {\n type: 'skill';\n capabilities?: string[];\n requirements?: PublishSkill200VersionManifestPspmRequirements;\n};\n\nexport type PublishSkill200VersionManifest = {\n /**\n * @minLength 1\n * @maxLength 100\n * @pattern ^[a-z][a-z0-9_-]*$\n */\n name: string;\n /**\n * Semantic version string (e.g., 1.0.0)\n * @pattern ^\\d+\\.\\d+\\.\\d+(-[\\w.]+)?(\\+[\\w.]+)?$\n */\n version: string;\n /** @maxLength 500 */\n description?: string;\n files?: string[];\n pspm?: PublishSkill200VersionManifestPspm;\n};\n\nexport type PublishSkill200Version = {\n id: string;\n skillId: string;\n version: string;\n r2Key: string;\n checksum: string;\n manifest: PublishSkill200VersionManifest;\n publishedAt: string;\n};\n\nexport type PublishSkill200 = {\n skill: PublishSkill200Skill;\n version: PublishSkill200Version;\n};\n\nexport type DeleteSkillBody = { [key: string]: unknown };\n\nexport type DeleteSkill200 = {\n success: boolean;\n};\n\nexport type DeleteSkillVersionBody = { [key: string]: unknown };\n\nexport type DeleteSkillVersion200 = {\n success: boolean;\n};\n\nexport type ListApiKeys200Item = {\n id: string;\n name: string;\n keyPrefix: string;\n userId: string;\n expiresAt: string | null;\n lastUsedAt: string | null;\n createdAt: string;\n};\n\nexport type CreateApiKeyBody = {\n /**\n * @minLength 1\n * @maxLength 100\n */\n name: string;\n expiresAt?: string | null;\n};\n\nexport type CreateApiKey200ApiKey = {\n id: string;\n name: string;\n keyPrefix: string;\n userId: string;\n expiresAt: string | null;\n lastUsedAt: string | null;\n createdAt: string;\n};\n\nexport type CreateApiKey200 = {\n apiKey: CreateApiKey200ApiKey;\n plainKey: string;\n};\n\nexport type DeleteApiKeyBody = {\n id: string;\n};\n\nexport type DeleteApiKey200 = {\n success: boolean;\n};\n\nexport type UpdateApiKeyNameBody = {\n id: string;\n /**\n * @minLength 1\n * @maxLength 100\n */\n name: string;\n};\n\nexport type UpdateApiKeyName200 = {\n id: string;\n name: string;\n keyPrefix: string;\n userId: string;\n expiresAt: string | null;\n lastUsedAt: string | null;\n createdAt: string;\n};\n\nexport type CreateCliTokenBody = {\n /** @minLength 1 */\n state: string;\n /** @minLength 1 */\n port: string;\n};\n\nexport type CreateCliToken200 = {\n token: string;\n};\n\nexport type ExchangeCliTokenBody = {\n /** @minLength 1 */\n token: string;\n};\n\nexport type ExchangeCliToken200 = {\n apiKey: string;\n username: string;\n};\n\n/**\n * Submit client-side errors for logging and monitoring. Used by the frontend error capture service.\n * @summary Report client errors\n */\nexport type reportErrorsResponse200 = {\n data: ReportErrors200\n status: 200\n}\n \nexport type reportErrorsResponseSuccess = (reportErrorsResponse200) & {\n headers: Headers;\n};\n;\n\nexport type reportErrorsResponse = (reportErrorsResponseSuccess)\n\nexport const getReportErrorsUrl = () => {\n\n\n \n\n return `/errors/report`\n}\n\nexport const reportErrors = async (reportErrorsBody: ReportErrorsBody, options?: RequestInit): Promise<reportErrorsResponse> => {\n \n return customFetch<reportErrorsResponse>(getReportErrorsUrl(),\n { \n ...options,\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...options?.headers },\n body: JSON.stringify(\n reportErrorsBody,)\n }\n);}\n\n\n\n/**\n * Get the current authenticated user's info\n * @summary Get current user\n */\nexport type meResponse200 = {\n data: Me200\n status: 200\n}\n \nexport type meResponseSuccess = (meResponse200) & {\n headers: Headers;\n};\n;\n\nexport type meResponse = (meResponseSuccess)\n\nexport const getMeUrl = () => {\n\n\n \n\n return `/me`\n}\n\nexport const me = async ( options?: RequestInit): Promise<meResponse> => {\n \n return customFetch<meResponse>(getMeUrl(),\n { \n ...options,\n method: 'GET'\n \n \n }\n);}\n\n\n\n/**\n * List all skills owned by the authenticated user\n * @summary List my skills\n */\nexport type listMySkillsResponse200 = {\n data: ListMySkills200Item[]\n status: 200\n}\n \nexport type listMySkillsResponseSuccess = (listMySkillsResponse200) & {\n headers: Headers;\n};\n;\n\nexport type listMySkillsResponse = (listMySkillsResponseSuccess)\n\nexport const getListMySkillsUrl = () => {\n\n\n \n\n return `/`\n}\n\nexport const listMySkills = async ( options?: RequestInit): Promise<listMySkillsResponse> => {\n \n return customFetch<listMySkillsResponse>(getListMySkillsUrl(),\n { \n ...options,\n method: 'GET'\n \n \n }\n);}\n\n\n\n/**\n * List all skills for a specific user\n * @summary List user skills\n */\nexport type listUserSkillsResponse200 = {\n data: ListUserSkills200Item[]\n status: 200\n}\n \nexport type listUserSkillsResponseSuccess = (listUserSkillsResponse200) & {\n headers: Headers;\n};\n;\n\nexport type listUserSkillsResponse = (listUserSkillsResponseSuccess)\n\nexport const getListUserSkillsUrl = (username: string,) => {\n\n\n \n\n return `/@user/${username}`\n}\n\nexport const listUserSkills = async (username: string, options?: RequestInit): Promise<listUserSkillsResponse> => {\n \n return customFetch<listUserSkillsResponse>(getListUserSkillsUrl(username),\n { \n ...options,\n method: 'GET'\n \n \n }\n);}\n\n\n\n/**\n * Get a specific skill by username and name\n * @summary Get skill\n */\nexport type getSkillResponse200 = {\n data: GetSkill200\n status: 200\n}\n \nexport type getSkillResponseSuccess = (getSkillResponse200) & {\n headers: Headers;\n};\n;\n\nexport type getSkillResponse = (getSkillResponseSuccess)\n\nexport const getGetSkillUrl = (username: string,\n name: string,) => {\n\n\n \n\n return `/@user/${username}/${name}`\n}\n\nexport const getSkill = async (username: string,\n name: string, options?: RequestInit): Promise<getSkillResponse> => {\n \n return customFetch<getSkillResponse>(getGetSkillUrl(username,name),\n { \n ...options,\n method: 'GET'\n \n \n }\n);}\n\n\n\n/**\n * List all versions for a specific skill\n * @summary List skill versions\n */\nexport type listSkillVersionsResponse200 = {\n data: ListSkillVersions200Item[]\n status: 200\n}\n \nexport type listSkillVersionsResponseSuccess = (listSkillVersionsResponse200) & {\n headers: Headers;\n};\n;\n\nexport type listSkillVersionsResponse = (listSkillVersionsResponseSuccess)\n\nexport const getListSkillVersionsUrl = (username: string,\n name: string,) => {\n\n\n \n\n return `/@user/${username}/${name}/versions`\n}\n\nexport const listSkillVersions = async (username: string,\n name: string, options?: RequestInit): Promise<listSkillVersionsResponse> => {\n \n return customFetch<listSkillVersionsResponse>(getListSkillVersionsUrl(username,name),\n { \n ...options,\n method: 'GET'\n \n \n }\n);}\n\n\n\n/**\n * Get metadata for a specific skill version\n * @summary Get skill version\n */\nexport type getSkillVersionResponse200 = {\n data: GetSkillVersion200\n status: 200\n}\n \nexport type getSkillVersionResponseSuccess = (getSkillVersionResponse200) & {\n headers: Headers;\n};\n;\n\nexport type getSkillVersionResponse = (getSkillVersionResponseSuccess)\n\nexport const getGetSkillVersionUrl = (username: string,\n name: string,\n version: string,) => {\n\n\n \n\n return `/@user/${username}/${name}/${version}`\n}\n\nexport const getSkillVersion = async (username: string,\n name: string,\n version: string, options?: RequestInit): Promise<getSkillVersionResponse> => {\n \n return customFetch<getSkillVersionResponse>(getGetSkillVersionUrl(username,name,version),\n { \n ...options,\n method: 'GET'\n \n \n }\n);}\n\n\n\n/**\n * Publish a new skill or a new version of an existing skill\n * @summary Publish skill\n */\nexport type publishSkillResponse200 = {\n data: PublishSkill200\n status: 200\n}\n \nexport type publishSkillResponseSuccess = (publishSkillResponse200) & {\n headers: Headers;\n};\n;\n\nexport type publishSkillResponse = (publishSkillResponseSuccess)\n\nexport const getPublishSkillUrl = () => {\n\n\n \n\n return `/publish`\n}\n\nexport const publishSkill = async (publishSkillBody: PublishSkillBody, options?: RequestInit): Promise<publishSkillResponse> => {\n \n return customFetch<publishSkillResponse>(getPublishSkillUrl(),\n { \n ...options,\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...options?.headers },\n body: JSON.stringify(\n publishSkillBody,)\n }\n);}\n\n\n\n/**\n * Delete a skill and all its versions (owner only)\n * @summary Delete skill\n */\nexport type deleteSkillResponse200 = {\n data: DeleteSkill200\n status: 200\n}\n \nexport type deleteSkillResponseSuccess = (deleteSkillResponse200) & {\n headers: Headers;\n};\n;\n\nexport type deleteSkillResponse = (deleteSkillResponseSuccess)\n\nexport const getDeleteSkillUrl = (name: string,) => {\n\n\n \n\n return `/${name}`\n}\n\nexport const deleteSkill = async (name: string,\n deleteSkillBody?: DeleteSkillBody, options?: RequestInit): Promise<deleteSkillResponse> => {\n \n return customFetch<deleteSkillResponse>(getDeleteSkillUrl(name),\n { \n ...options,\n method: 'DELETE',\n headers: { 'Content-Type': 'application/json', ...options?.headers },\n body: JSON.stringify(\n deleteSkillBody,)\n }\n);}\n\n\n\n/**\n * Delete a specific version of a skill (owner only)\n * @summary Delete skill version\n */\nexport type deleteSkillVersionResponse200 = {\n data: DeleteSkillVersion200\n status: 200\n}\n \nexport type deleteSkillVersionResponseSuccess = (deleteSkillVersionResponse200) & {\n headers: Headers;\n};\n;\n\nexport type deleteSkillVersionResponse = (deleteSkillVersionResponseSuccess)\n\nexport const getDeleteSkillVersionUrl = (name: string,\n version: string,) => {\n\n\n \n\n return `/${name}/${version}`\n}\n\nexport const deleteSkillVersion = async (name: string,\n version: string,\n deleteSkillVersionBody?: DeleteSkillVersionBody, options?: RequestInit): Promise<deleteSkillVersionResponse> => {\n \n return customFetch<deleteSkillVersionResponse>(getDeleteSkillVersionUrl(name,version),\n { \n ...options,\n method: 'DELETE',\n headers: { 'Content-Type': 'application/json', ...options?.headers },\n body: JSON.stringify(\n deleteSkillVersionBody,)\n }\n);}\n\n\n\n/**\n * Retrieve all API keys for the authenticated user\n * @summary List all API keys\n */\nexport type listApiKeysResponse200 = {\n data: ListApiKeys200Item[]\n status: 200\n}\n \nexport type listApiKeysResponseSuccess = (listApiKeysResponse200) & {\n headers: Headers;\n};\n;\n\nexport type listApiKeysResponse = (listApiKeysResponseSuccess)\n\nexport const getListApiKeysUrl = () => {\n\n\n \n\n return `/api-keys`\n}\n\nexport const listApiKeys = async ( options?: RequestInit): Promise<listApiKeysResponse> => {\n \n return customFetch<listApiKeysResponse>(getListApiKeysUrl(),\n { \n ...options,\n method: 'GET'\n \n \n }\n);}\n\n\n\n/**\n * Create a new API key with optional expiration\n * @summary Create a new API key\n */\nexport type createApiKeyResponse200 = {\n data: CreateApiKey200\n status: 200\n}\n \nexport type createApiKeyResponseSuccess = (createApiKeyResponse200) & {\n headers: Headers;\n};\n;\n\nexport type createApiKeyResponse = (createApiKeyResponseSuccess)\n\nexport const getCreateApiKeyUrl = () => {\n\n\n \n\n return `/api-keys`\n}\n\nexport const createApiKey = async (createApiKeyBody: CreateApiKeyBody, options?: RequestInit): Promise<createApiKeyResponse> => {\n \n return customFetch<createApiKeyResponse>(getCreateApiKeyUrl(),\n { \n ...options,\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...options?.headers },\n body: JSON.stringify(\n createApiKeyBody,)\n }\n);}\n\n\n\n/**\n * Revoke and delete an API key\n * @summary Delete an API key\n */\nexport type deleteApiKeyResponse200 = {\n data: DeleteApiKey200\n status: 200\n}\n \nexport type deleteApiKeyResponseSuccess = (deleteApiKeyResponse200) & {\n headers: Headers;\n};\n;\n\nexport type deleteApiKeyResponse = (deleteApiKeyResponseSuccess)\n\nexport const getDeleteApiKeyUrl = () => {\n\n\n \n\n return `/api-keys`\n}\n\nexport const deleteApiKey = async (deleteApiKeyBody: DeleteApiKeyBody, options?: RequestInit): Promise<deleteApiKeyResponse> => {\n \n return customFetch<deleteApiKeyResponse>(getDeleteApiKeyUrl(),\n { \n ...options,\n method: 'DELETE',\n headers: { 'Content-Type': 'application/json', ...options?.headers },\n body: JSON.stringify(\n deleteApiKeyBody,)\n }\n);}\n\n\n\n/**\n * Update the name/description of an API key\n * @summary Update API key name\n */\nexport type updateApiKeyNameResponse200 = {\n data: UpdateApiKeyName200\n status: 200\n}\n \nexport type updateApiKeyNameResponseSuccess = (updateApiKeyNameResponse200) & {\n headers: Headers;\n};\n;\n\nexport type updateApiKeyNameResponse = (updateApiKeyNameResponseSuccess)\n\nexport const getUpdateApiKeyNameUrl = () => {\n\n\n \n\n return `/api-keys`\n}\n\nexport const updateApiKeyName = async (updateApiKeyNameBody: UpdateApiKeyNameBody, options?: RequestInit): Promise<updateApiKeyNameResponse> => {\n \n return customFetch<updateApiKeyNameResponse>(getUpdateApiKeyNameUrl(),\n { \n ...options,\n method: 'PUT',\n headers: { 'Content-Type': 'application/json', ...options?.headers },\n body: JSON.stringify(\n updateApiKeyNameBody,)\n }\n);}\n\n\n\n/**\n * Create a short-lived token for CLI browser-based authentication\n * @summary Create a CLI login token\n */\nexport type createCliTokenResponse200 = {\n data: CreateCliToken200\n status: 200\n}\n \nexport type createCliTokenResponseSuccess = (createCliTokenResponse200) & {\n headers: Headers;\n};\n;\n\nexport type createCliTokenResponse = (createCliTokenResponseSuccess)\n\nexport const getCreateCliTokenUrl = () => {\n\n\n \n\n return `/cli-token`\n}\n\nexport const createCliToken = async (createCliTokenBody: CreateCliTokenBody, options?: RequestInit): Promise<createCliTokenResponse> => {\n \n return customFetch<createCliTokenResponse>(getCreateCliTokenUrl(),\n { \n ...options,\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...options?.headers },\n body: JSON.stringify(\n createCliTokenBody,)\n }\n);}\n\n\n\n/**\n * Exchange a CLI login token for an API key (called by CLI after browser redirect)\n * @summary Exchange CLI token for API key\n */\nexport type exchangeCliTokenResponse200 = {\n data: ExchangeCliToken200\n status: 200\n}\n \nexport type exchangeCliTokenResponseSuccess = (exchangeCliTokenResponse200) & {\n headers: Headers;\n};\n;\n\nexport type exchangeCliTokenResponse = (exchangeCliTokenResponseSuccess)\n\nexport const getExchangeCliTokenUrl = () => {\n\n\n \n\n return `/cli-token-exchange`\n}\n\nexport const exchangeCliToken = async (exchangeCliTokenBody: ExchangeCliTokenBody, options?: RequestInit): Promise<exchangeCliTokenResponse> => {\n \n return customFetch<exchangeCliTokenResponse>(getExchangeCliTokenUrl(),\n { \n ...options,\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...options?.headers },\n body: JSON.stringify(\n exchangeCliTokenBody,)\n }\n);}\n","/**\n * API Client for PSPM CLI\n *\n * This module re-exports the SDK functions and provides the\n * initialization logic for the CLI.\n */\n\nimport {\n\tconfigure,\n\tdeleteSkill,\n\tdeleteSkillVersion,\n\texchangeCliToken,\n\tgetConfig,\n\tgetSkill,\n\tgetSkillVersion,\n\tisConfigured,\n\tlistMySkills,\n\tlistSkillVersions,\n\tlistUserSkills,\n\tme,\n\tpublishSkill,\n\ttype SDKConfig,\n\tSDKError,\n} from \"@repo/sdk\";\n\n// Re-export SDK functions for convenience\nexport {\n\tconfigure,\n\tdeleteSkill,\n\tdeleteSkillVersion,\n\texchangeCliToken,\n\tgetConfig,\n\tgetSkill,\n\tgetSkillVersion,\n\tisConfigured,\n\tlistMySkills,\n\tlistSkillVersions,\n\tlistUserSkills,\n\tme,\n\tpublishSkill,\n\tSDKError,\n};\n\n// Re-export types\nexport type { SDKConfig };\n\n/**\n * Get user info from the API using the /me endpoint.\n * Returns null if not authenticated.\n */\nexport async function whoamiRequest(\n\tregistryUrl: string,\n\tapiKey: string,\n): Promise<{ username: string; userId: string } | null> {\n\ttry {\n\t\t// Use direct REST endpoints (not oRPC /rpc prefix)\n\t\tconfigure({ baseUrl: registryUrl, apiKey });\n\t\tconst response = await me();\n\t\tconst user = response.data;\n\t\tif (!user) {\n\t\t\treturn null;\n\t\t}\n\t\treturn {\n\t\t\tusername: user.username,\n\t\t\tuserId: user.userId,\n\t\t};\n\t} catch {\n\t\treturn null;\n\t}\n}\n","/**\n * Base error class for PSPM configuration errors\n */\nexport class ConfigError extends Error {\n\tconstructor(message: string) {\n\t\tsuper(message);\n\t\tthis.name = \"ConfigError\";\n\t}\n}\n\n/**\n * Error thrown when a profile is not found\n */\nexport class ProfileNotFoundError extends ConfigError {\n\tconstructor(profileName: string) {\n\t\tsuper(\n\t\t\t`Profile \"${profileName}\" not found. Run 'pspm config list' to see available profiles.`,\n\t\t);\n\t\tthis.name = \"ProfileNotFoundError\";\n\t}\n}\n\n/**\n * Error thrown when no default profile is configured\n */\nexport class NoDefaultProfileError extends ConfigError {\n\tconstructor() {\n\t\tsuper(\n\t\t\t\"No default profile configured. Run 'pspm config add <name>' to create one.\",\n\t\t);\n\t\tthis.name = \"NoDefaultProfileError\";\n\t}\n}\n\n/**\n * Error thrown when config migration fails\n */\nexport class ConfigMigrationError extends ConfigError {\n\tconstructor(message: string) {\n\t\tsuper(`Failed to migrate config: ${message}`);\n\t\tthis.name = \"ConfigMigrationError\";\n\t}\n}\n\n/**\n * Error thrown when the user is not logged in\n */\nexport class NotLoggedInError extends ConfigError {\n\tconstructor() {\n\t\tsuper(\n\t\t\t\"Not logged in. Run 'pspm login --api-key <key>' first, or set PSPM_API_KEY env var.\",\n\t\t);\n\t\tthis.name = \"NotLoggedInError\";\n\t}\n}\n","import { mkdir, readFile, stat, writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport { NotLoggedInError, ProfileNotFoundError } from \"./errors.js\";\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * Individual profile configuration\n */\nexport interface ProfileConfig {\n\tregistryUrl: string;\n\tapiKey?: string;\n\tusername?: string;\n}\n\n/**\n * V1 config schema (for migration)\n */\nexport interface PspmConfigV1 {\n\tregistryUrl: string;\n\tapiKey?: string;\n\tusername?: string;\n}\n\n/**\n * V2 user config schema with profiles\n */\nexport interface UserConfigV2 {\n\tversion: 2;\n\tdefaultProfile: string;\n\tprofiles: Record<string, ProfileConfig>;\n}\n\n/**\n * Project config schema (.pspmrc)\n */\nexport interface ProjectConfig {\n\tprofile?: string;\n\tregistryUrl?: string;\n}\n\n/**\n * Source of config resolution\n */\nexport type ConfigSource = \"cli\" | \"env\" | \"project\" | \"user\" | \"default\";\n\n/**\n * Fully resolved configuration\n */\nexport interface ResolvedConfig {\n\tprofileName: string;\n\tprofileSource: ConfigSource;\n\tregistryUrl: string;\n\tapiKey?: string;\n\tusername?: string;\n}\n\n/**\n * Global CLI options passed to commands\n */\nexport interface GlobalOptions {\n\tprofile?: string;\n}\n\n// Legacy type alias for backward compatibility\nexport type PspmConfig = PspmConfigV1;\n\n// =============================================================================\n// Constants\n// =============================================================================\n\nconst DEFAULT_REGISTRY_URL = \"https://pspm.dev/api/skills\";\n\n/**\n * Get the config file path\n */\nexport function getConfigPath(): string {\n\treturn join(homedir(), \".pspm\", \"config.json\");\n}\n\n/**\n * Get the skills directory path (for current project)\n */\nexport function getSkillsDir(): string {\n\treturn join(process.cwd(), \".skills\");\n}\n\n/**\n * Get the lockfile path (for current project)\n */\nexport function getLockfilePath(): string {\n\treturn join(process.cwd(), \"skill-lock.json\");\n}\n\n// =============================================================================\n// V2 Config Functions\n// =============================================================================\n\n/**\n * Create a default empty V2 config\n */\nfunction createDefaultV2Config(): UserConfigV2 {\n\treturn {\n\t\tversion: 2,\n\t\tdefaultProfile: \"default\",\n\t\tprofiles: {\n\t\t\tdefault: {\n\t\t\t\tregistryUrl: DEFAULT_REGISTRY_URL,\n\t\t\t},\n\t\t},\n\t};\n}\n\n/**\n * Migrate V1 config to V2 format\n */\nexport function migrateV1ToV2(v1Config: PspmConfigV1): UserConfigV2 {\n\treturn {\n\t\tversion: 2,\n\t\tdefaultProfile: \"default\",\n\t\tprofiles: {\n\t\t\tdefault: {\n\t\t\t\tregistryUrl: v1Config.registryUrl || DEFAULT_REGISTRY_URL,\n\t\t\t\tapiKey: v1Config.apiKey,\n\t\t\t\tusername: v1Config.username,\n\t\t\t},\n\t\t},\n\t};\n}\n\n/**\n * Check if a config object is V2 format\n */\nfunction isV2Config(config: unknown): config is UserConfigV2 {\n\treturn (\n\t\ttypeof config === \"object\" &&\n\t\tconfig !== null &&\n\t\t\"version\" in config &&\n\t\t(config as { version: unknown }).version === 2\n\t);\n}\n\n/**\n * Read the user config file (V2 format, with auto-migration)\n */\nexport async function readUserConfig(): Promise<UserConfigV2> {\n\tconst configPath = getConfigPath();\n\n\tif (process.env.PSPM_DEBUG) {\n\t\tconsole.log(`[config] Reading config from: ${configPath}`);\n\t}\n\n\ttry {\n\t\tconst content = await readFile(configPath, \"utf-8\");\n\n\t\tif (process.env.PSPM_DEBUG) {\n\t\t\t// Show raw API key from file content for debugging\n\t\t\tconst apiKeyMatch = content.match(/\"apiKey\":\\s*\"([^\"]+)\"/);\n\t\t\tif (apiKeyMatch) {\n\t\t\t\tconsole.log(\n\t\t\t\t\t`[config] Raw apiKey from file: ${apiKeyMatch[1].substring(\n\t\t\t\t\t\t0,\n\t\t\t\t\t\t15,\n\t\t\t\t\t)}...`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tconst parsed = JSON.parse(content);\n\n\t\tif (process.env.PSPM_DEBUG) {\n\t\t\tconsole.log(\n\t\t\t\t`[config] Parsed config version: ${\n\t\t\t\t\t(parsed as { version?: unknown }).version\n\t\t\t\t}`,\n\t\t\t);\n\t\t\tconsole.log(\n\t\t\t\t`[config] Profiles found: ${Object.keys(\n\t\t\t\t\t(parsed as { profiles?: Record<string, unknown> }).profiles || {},\n\t\t\t\t).join(\", \")}`,\n\t\t\t);\n\t\t}\n\n\t\t// Check if already V2\n\t\tif (isV2Config(parsed)) {\n\t\t\treturn parsed;\n\t\t}\n\n\t\t// Migrate from V1\n\t\tconst v2Config = migrateV1ToV2(parsed as PspmConfigV1);\n\n\t\t// Write migrated config back\n\t\tawait writeUserConfig(v2Config);\n\n\t\treturn v2Config;\n\t} catch (error) {\n\t\tif (process.env.PSPM_DEBUG) {\n\t\t\tconsole.log(\n\t\t\t\t`[config] Error reading config: ${\n\t\t\t\t\terror instanceof Error ? error.message : String(error)\n\t\t\t\t}`,\n\t\t\t);\n\t\t\tconsole.log(`[config] Falling back to default config`);\n\t\t}\n\t\treturn createDefaultV2Config();\n\t}\n}\n\n/**\n * Write the user config file (V2 format)\n */\nexport async function writeUserConfig(config: UserConfigV2): Promise<void> {\n\tconst configPath = getConfigPath();\n\tawait mkdir(dirname(configPath), { recursive: true });\n\tawait writeFile(configPath, JSON.stringify(config, null, 2));\n}\n\n/**\n * Find and read project config (.pspmrc) by searching up directory tree\n */\nexport async function findProjectConfig(): Promise<ProjectConfig | null> {\n\tlet currentDir = process.cwd();\n\tconst root = dirname(currentDir);\n\n\twhile (currentDir !== root) {\n\t\tconst configPath = join(currentDir, \".pspmrc\");\n\t\ttry {\n\t\t\tconst stats = await stat(configPath);\n\t\t\tif (stats.isFile()) {\n\t\t\t\tconst content = await readFile(configPath, \"utf-8\");\n\t\t\t\treturn JSON.parse(content) as ProjectConfig;\n\t\t\t}\n\t\t} catch {\n\t\t\t// File doesn't exist, continue searching\n\t\t}\n\t\tcurrentDir = dirname(currentDir);\n\t}\n\n\treturn null;\n}\n\n/**\n * Resolve the full configuration using cascade priority:\n * 1. CLI --profile flag\n * 2. PSPM_PROFILE env var\n * 3. Project .pspmrc file\n * 4. User config default profile\n * 5. Defaults\n *\n * Environment variables (PSPM_REGISTRY_URL, PSPM_API_KEY) always override profile values.\n */\nexport async function resolveConfig(\n\tglobalOptions?: GlobalOptions,\n): Promise<ResolvedConfig> {\n\tconst userConfig = await readUserConfig();\n\tconst projectConfig = await findProjectConfig();\n\n\t// Determine which profile to use (cascade priority)\n\tlet profileName: string;\n\tlet profileSource: ConfigSource;\n\n\tif (globalOptions?.profile) {\n\t\tprofileName = globalOptions.profile;\n\t\tprofileSource = \"cli\";\n\t} else if (process.env.PSPM_PROFILE) {\n\t\tprofileName = process.env.PSPM_PROFILE;\n\t\tprofileSource = \"env\";\n\t} else if (projectConfig?.profile) {\n\t\tprofileName = projectConfig.profile;\n\t\tprofileSource = \"project\";\n\t} else if (userConfig.defaultProfile) {\n\t\tprofileName = userConfig.defaultProfile;\n\t\tprofileSource = \"user\";\n\t} else {\n\t\tprofileName = \"default\";\n\t\tprofileSource = \"default\";\n\t}\n\n\t// Get the profile config\n\tconst profile = userConfig.profiles[profileName];\n\tif (!profile) {\n\t\tif (process.env.PSPM_DEBUG) {\n\t\t\tconsole.log(\n\t\t\t\t`[config] Profile \"${profileName}\" not found. Available: ${Object.keys(\n\t\t\t\t\tuserConfig.profiles,\n\t\t\t\t).join(\", \")}`,\n\t\t\t);\n\t\t}\n\t\tthrow new ProfileNotFoundError(profileName);\n\t}\n\n\tif (process.env.PSPM_DEBUG) {\n\t\tconsole.log(\n\t\t\t`[config] Using profile: ${profileName} (source: ${profileSource})`,\n\t\t);\n\t\tconsole.log(`[config] Profile has apiKey: ${!!profile.apiKey}`);\n\t}\n\n\t// Build resolved config, applying env var overrides\n\tlet registryUrl = profile.registryUrl;\n\tlet apiKey = profile.apiKey;\n\tconst username = profile.username;\n\n\t// Project config can override registryUrl (but not apiKey for security)\n\tif (projectConfig?.registryUrl) {\n\t\tregistryUrl = projectConfig.registryUrl;\n\t}\n\n\t// Environment variables always win\n\tif (process.env.PSPM_REGISTRY_URL) {\n\t\tregistryUrl = process.env.PSPM_REGISTRY_URL;\n\t}\n\tif (process.env.PSPM_API_KEY) {\n\t\tapiKey = process.env.PSPM_API_KEY;\n\t}\n\n\treturn {\n\t\tprofileName,\n\t\tprofileSource,\n\t\tregistryUrl,\n\t\tapiKey,\n\t\tusername,\n\t};\n}\n\n/**\n * Get a specific profile from user config\n */\nexport async function getProfile(\n\tprofileName: string,\n): Promise<ProfileConfig | null> {\n\tconst userConfig = await readUserConfig();\n\treturn userConfig.profiles[profileName] || null;\n}\n\n/**\n * List all profile names\n */\nexport async function listProfiles(): Promise<string[]> {\n\tconst userConfig = await readUserConfig();\n\treturn Object.keys(userConfig.profiles);\n}\n\n/**\n * Add or update a profile\n */\nexport async function setProfile(\n\tprofileName: string,\n\tconfig: Partial<ProfileConfig>,\n): Promise<void> {\n\tconst userConfig = await readUserConfig();\n\n\tconst existing = userConfig.profiles[profileName] || {\n\t\tregistryUrl: DEFAULT_REGISTRY_URL,\n\t};\n\n\tuserConfig.profiles[profileName] = {\n\t\t...existing,\n\t\t...config,\n\t};\n\n\tawait writeUserConfig(userConfig);\n}\n\n/**\n * Delete a profile\n */\nexport async function deleteProfile(profileName: string): Promise<boolean> {\n\tconst userConfig = await readUserConfig();\n\n\tif (!userConfig.profiles[profileName]) {\n\t\treturn false;\n\t}\n\n\tdelete userConfig.profiles[profileName];\n\n\t// If we deleted the default profile, set a new default\n\tif (userConfig.defaultProfile === profileName) {\n\t\tconst remainingProfiles = Object.keys(userConfig.profiles);\n\t\tuserConfig.defaultProfile = remainingProfiles[0] || \"default\";\n\t}\n\n\tawait writeUserConfig(userConfig);\n\treturn true;\n}\n\n/**\n * Set the default profile\n */\nexport async function setDefaultProfile(profileName: string): Promise<void> {\n\tconst userConfig = await readUserConfig();\n\n\tif (!userConfig.profiles[profileName]) {\n\t\tthrow new ProfileNotFoundError(profileName);\n\t}\n\n\tuserConfig.defaultProfile = profileName;\n\tawait writeUserConfig(userConfig);\n}\n\n/**\n * Get the default profile name\n */\nexport async function getDefaultProfileName(): Promise<string> {\n\tconst userConfig = await readUserConfig();\n\treturn userConfig.defaultProfile;\n}\n\n// =============================================================================\n// Legacy Functions (for backward compatibility)\n// =============================================================================\n\n/**\n * Default configuration (legacy)\n * PSPM_REGISTRY_URL env var can override the default\n */\nconst DEFAULT_CONFIG: PspmConfig = {\n\tregistryUrl: process.env.PSPM_REGISTRY_URL || DEFAULT_REGISTRY_URL,\n};\n\n/**\n * Read the config file (legacy - wraps resolveConfig)\n */\nexport async function readConfig(): Promise<PspmConfig> {\n\ttry {\n\t\tconst resolved = await resolveConfig();\n\t\treturn {\n\t\t\tregistryUrl: resolved.registryUrl,\n\t\t\tapiKey: resolved.apiKey,\n\t\t\tusername: resolved.username,\n\t\t};\n\t} catch {\n\t\treturn { ...DEFAULT_CONFIG };\n\t}\n}\n\n/**\n * Write the config file (legacy - updates default profile)\n */\nexport async function writeConfig(config: Partial<PspmConfig>): Promise<void> {\n\tconst userConfig = await readUserConfig();\n\tconst defaultProfileName = userConfig.defaultProfile;\n\n\tconst existing = userConfig.profiles[defaultProfileName] || {\n\t\tregistryUrl: DEFAULT_REGISTRY_URL,\n\t};\n\n\tuserConfig.profiles[defaultProfileName] = {\n\t\t...existing,\n\t\t...config,\n\t};\n\n\tawait writeUserConfig(userConfig);\n}\n\n/**\n * Clear the config file (for logout) - clears credentials from default profile\n */\nexport async function clearConfig(): Promise<void> {\n\tconst userConfig = await readUserConfig();\n\tconst defaultProfileName = userConfig.defaultProfile;\n\n\tif (userConfig.profiles[defaultProfileName]) {\n\t\tuserConfig.profiles[defaultProfileName].apiKey = undefined;\n\t\tuserConfig.profiles[defaultProfileName].username = undefined;\n\t}\n\n\tawait writeUserConfig(userConfig);\n}\n\n/**\n * Check if user is logged in (legacy - checks resolved config)\n */\nexport async function isLoggedIn(\n\tglobalOptions?: GlobalOptions,\n): Promise<boolean> {\n\ttry {\n\t\tconst resolved = await resolveConfig(globalOptions);\n\t\treturn !!resolved.apiKey;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\n/**\n * Get the API key (throws if not logged in)\n * PSPM_API_KEY env var can override the stored key\n */\nexport async function requireApiKey(\n\tglobalOptions?: GlobalOptions,\n): Promise<string> {\n\tconst resolved = await resolveConfig(globalOptions);\n\n\tif (!resolved.apiKey) {\n\t\tif (process.env.PSPM_DEBUG) {\n\t\t\tconsole.log(\n\t\t\t\t`[config] requireApiKey: No API key found for profile \"${resolved.profileName}\"`,\n\t\t\t);\n\t\t}\n\t\tthrow new NotLoggedInError();\n\t}\n\n\tif (process.env.PSPM_DEBUG) {\n\t\tconsole.log(\n\t\t\t`[config] requireApiKey: Got API key (${resolved.apiKey.substring(\n\t\t\t\t0,\n\t\t\t\t10,\n\t\t\t)}...)`,\n\t\t);\n\t}\n\n\treturn resolved.apiKey;\n}\n\n/**\n * Get the registry URL\n */\nexport async function getRegistryUrl(\n\tglobalOptions?: GlobalOptions,\n): Promise<string> {\n\tconst resolved = await resolveConfig(globalOptions);\n\treturn resolved.registryUrl;\n}\n\n/**\n * Clear credentials for a specific profile\n */\nexport async function clearProfileCredentials(\n\tprofileName: string,\n): Promise<void> {\n\tconst userConfig = await readUserConfig();\n\n\tif (userConfig.profiles[profileName]) {\n\t\tuserConfig.profiles[profileName].apiKey = undefined;\n\t\tuserConfig.profiles[profileName].username = undefined;\n\t\tawait writeUserConfig(userConfig);\n\t}\n}\n\n/**\n * Set credentials for a specific profile\n */\nexport async function setProfileCredentials(\n\tprofileName: string,\n\tapiKey: string,\n\tusername?: string,\n\tregistryUrl?: string,\n): Promise<void> {\n\tconst userConfig = await readUserConfig();\n\n\t// Create profile if it doesn't exist\n\tif (!userConfig.profiles[profileName]) {\n\t\tuserConfig.profiles[profileName] = {\n\t\t\tregistryUrl: registryUrl || DEFAULT_REGISTRY_URL,\n\t\t};\n\t}\n\n\tuserConfig.profiles[profileName].apiKey = apiKey;\n\tif (username) {\n\t\tuserConfig.profiles[profileName].username = username;\n\t}\n\tif (registryUrl) {\n\t\tuserConfig.profiles[profileName].registryUrl = registryUrl;\n\t}\n\n\tawait writeUserConfig(userConfig);\n}\n","import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport type { SkillLockfile, SkillLockfileEntry } from \"@repo/pspm-types\";\nimport { getLockfilePath, getRegistryUrl } from \"./config\";\n\n/**\n * Read the lockfile\n */\nexport async function readLockfile(): Promise<SkillLockfile | null> {\n\tconst lockfilePath = getLockfilePath();\n\n\ttry {\n\t\tconst content = await readFile(lockfilePath, \"utf-8\");\n\t\treturn JSON.parse(content) as SkillLockfile;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/**\n * Write the lockfile\n */\nexport async function writeLockfile(lockfile: SkillLockfile): Promise<void> {\n\tconst lockfilePath = getLockfilePath();\n\tawait mkdir(dirname(lockfilePath), { recursive: true });\n\tawait writeFile(lockfilePath, `${JSON.stringify(lockfile, null, 2)}\\n`);\n}\n\n/**\n * Create a new empty lockfile\n */\nexport async function createEmptyLockfile(): Promise<SkillLockfile> {\n\tconst registryUrl = await getRegistryUrl();\n\treturn {\n\t\tlockfileVersion: 1,\n\t\tregistryUrl,\n\t\tskills: {},\n\t};\n}\n\n/**\n * Add a skill to the lockfile\n */\nexport async function addToLockfile(\n\tfullName: string,\n\tentry: SkillLockfileEntry,\n): Promise<void> {\n\tlet lockfile = await readLockfile();\n\tif (!lockfile) {\n\t\tlockfile = await createEmptyLockfile();\n\t}\n\n\tlockfile.skills[fullName] = entry;\n\tawait writeLockfile(lockfile);\n}\n\n/**\n * Remove a skill from the lockfile\n */\nexport async function removeFromLockfile(fullName: string): Promise<boolean> {\n\tconst lockfile = await readLockfile();\n\tif (!lockfile || !lockfile.skills[fullName]) {\n\t\treturn false;\n\t}\n\n\tdelete lockfile.skills[fullName];\n\tawait writeLockfile(lockfile);\n\treturn true;\n}\n\n/**\n * Get a skill entry from the lockfile\n */\nexport async function getFromLockfile(\n\tfullName: string,\n): Promise<SkillLockfileEntry | null> {\n\tconst lockfile = await readLockfile();\n\tif (!lockfile || !lockfile.skills[fullName]) {\n\t\treturn null;\n\t}\n\treturn lockfile.skills[fullName];\n}\n\n/**\n * List all skills in the lockfile\n */\nexport async function listLockfileSkills(): Promise<\n\tArray<{ name: string; entry: SkillLockfileEntry }>\n> {\n\tconst lockfile = await readLockfile();\n\tif (!lockfile) {\n\t\treturn [];\n\t}\n\n\treturn Object.entries(lockfile.skills).map(([name, entry]) => ({\n\t\tname,\n\t\tentry: entry as SkillLockfileEntry,\n\t}));\n}\n","import { mkdir, rm } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport {\n\tcalculateIntegrity,\n\tparseSkillSpecifier,\n\tresolveVersion,\n} from \"@repo/pspm-types\";\nimport {\n\tconfigure,\n\tgetSkillVersion,\n\tlistSkillVersions,\n} from \"../api-client.js\";\nimport {\n\ttype GlobalOptions,\n\tgetRegistryUrl,\n\tgetSkillsDir,\n\trequireApiKey,\n} from \"../config.js\";\nimport { addToLockfile } from \"../lockfile.js\";\n\nexport interface AddOptions {\n\tsave?: boolean;\n}\n\nexport async function add(\n\tspecifier: string,\n\t_options: AddOptions,\n\tglobalOptions?: GlobalOptions,\n): Promise<void> {\n\ttry {\n\t\tconst apiKey = await requireApiKey(globalOptions);\n\t\tconst registryUrl = await getRegistryUrl(globalOptions);\n\n\t\t// Parse the specifier\n\t\tconst parsed = parseSkillSpecifier(specifier);\n\t\tif (!parsed) {\n\t\t\tconsole.error(\n\t\t\t\t`Error: Invalid skill specifier \"${specifier}\". Use format: @user/{username}/{name}[@{version}]`,\n\t\t\t);\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tconst { username, name, versionRange } = parsed;\n\n\t\t// Configure SDK (use direct REST endpoints, not oRPC)\n\t\tconfigure({ baseUrl: registryUrl, apiKey });\n\n\t\tconsole.log(`Resolving ${specifier}...`);\n\n\t\t// Get available versions\n\t\tconst versionsResponse = await listSkillVersions(username, name);\n\t\tconst versions = versionsResponse.data;\n\t\tif (versions.length === 0) {\n\t\t\tconsole.error(`Error: Skill @user/${username}/${name} not found`);\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\t// Resolve version\n\t\tconst versionStrings = versions.map((v: { version: string }) => v.version);\n\t\tconst resolved = resolveVersion(versionRange || \"*\", versionStrings);\n\n\t\tif (!resolved) {\n\t\t\tconsole.error(\n\t\t\t\t`Error: No version matching \"${versionRange || \"latest\"}\" found for @user/${username}/${name}`,\n\t\t\t);\n\t\t\tconsole.error(`Available versions: ${versionStrings.join(\", \")}`);\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tconsole.log(`Installing @user/${username}/${name}@${resolved}...`);\n\n\t\t// Get version details with download URL\n\t\tconst versionResponse = await getSkillVersion(username, name, resolved);\n\t\tconst versionInfo = versionResponse.data;\n\t\tif (!versionInfo) {\n\t\t\tconsole.error(`Error: Version ${resolved} not found`);\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\t// Download the tarball via the API endpoint\n\t\t// Use the API download endpoint for reliability (handles redirects)\n\t\tconst downloadUrl = `${registryUrl}/@user/${username}/${name}/${resolved}/download`;\n\n\t\tconst tarballResponse = await fetch(downloadUrl, {\n\t\t\theaders: {\n\t\t\t\tAuthorization: `Bearer ${apiKey}`,\n\t\t\t},\n\t\t\tredirect: \"follow\",\n\t\t});\n\n\t\tif (!tarballResponse.ok) {\n\t\t\tconsole.error(\n\t\t\t\t`Error: Failed to download tarball (${tarballResponse.status})`,\n\t\t\t);\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tconst tarballBuffer = Buffer.from(await tarballResponse.arrayBuffer());\n\n\t\t// Calculate integrity\n\t\tconst integrity = calculateIntegrity(tarballBuffer);\n\n\t\t// Verify checksum matches\n\t\tconst expectedIntegrity = `sha256-${Buffer.from(versionInfo.checksum, \"hex\").toString(\"base64\")}`;\n\t\tif (integrity !== expectedIntegrity) {\n\t\t\tconsole.error(\"Error: Checksum verification failed\");\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\t// Create skills directory\n\t\tconst skillsDir = getSkillsDir();\n\t\tconst destDir = join(skillsDir, username, name);\n\t\tawait mkdir(destDir, { recursive: true });\n\n\t\t// Extract tarball\n\t\tconst { writeFile } = await import(\"node:fs/promises\");\n\t\tconst tempFile = join(destDir, \".temp.tgz\");\n\t\tawait writeFile(tempFile, tarballBuffer);\n\n\t\tconst { exec } = await import(\"node:child_process\");\n\t\tconst { promisify } = await import(\"node:util\");\n\t\tconst execAsync = promisify(exec);\n\n\t\ttry {\n\t\t\t// Clear destination and extract\n\t\t\tawait rm(destDir, { recursive: true, force: true });\n\t\t\tawait mkdir(destDir, { recursive: true });\n\t\t\tawait writeFile(tempFile, tarballBuffer);\n\t\t\tawait execAsync(\n\t\t\t\t`tar -xzf \"${tempFile}\" -C \"${destDir}\" --strip-components=1`,\n\t\t\t);\n\t\t} finally {\n\t\t\tawait rm(tempFile, { force: true });\n\t\t}\n\n\t\t// Update lockfile\n\t\tconst fullName = `@user/${username}/${name}`;\n\t\tawait addToLockfile(fullName, {\n\t\t\tversion: resolved,\n\t\t\tresolved: versionInfo.downloadUrl,\n\t\t\tintegrity,\n\t\t});\n\n\t\tconsole.log(`Installed @user/${username}/${name}@${resolved}`);\n\t\tconsole.log(`Location: ${destDir}`);\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n","import { getProfile, setProfile } from \"../../config.js\";\n\nexport interface ConfigAddOptions {\n\tregistryUrl?: string;\n}\n\n/**\n * Create a new profile\n */\nexport async function configAdd(\n\tname: string,\n\toptions: ConfigAddOptions,\n): Promise<void> {\n\ttry {\n\t\t// Check if profile already exists\n\t\tconst existing = await getProfile(name);\n\t\tif (existing) {\n\t\t\tconsole.error(`Error: Profile \"${name}\" already exists.`);\n\t\t\tconsole.log(\"Use 'pspm config set' to modify it.\");\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\t// Create the profile\n\t\tawait setProfile(name, {\n\t\t\tregistryUrl: options.registryUrl || \"https://pspm.dev/api/skills\",\n\t\t});\n\n\t\tconsole.log(`Created profile \"${name}\".`);\n\n\t\tif (options.registryUrl) {\n\t\t\tconsole.log(` Registry URL: ${options.registryUrl}`);\n\t\t}\n\n\t\tconsole.log(\"\");\n\t\tconsole.log(\n\t\t\t`To set credentials, run: pspm login --api-key <key> --profile ${name}`,\n\t\t);\n\t\tconsole.log(`To make this the default, run: pspm config use ${name}`);\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n","import {\n\tdeleteProfile,\n\tgetDefaultProfileName,\n\tlistProfiles,\n} from \"../../config.js\";\n\n/**\n * Delete a profile\n */\nexport async function configDelete(name: string): Promise<void> {\n\ttry {\n\t\tconst profiles = await listProfiles();\n\t\tconst defaultProfile = await getDefaultProfileName();\n\n\t\t// Check if profile exists\n\t\tif (!profiles.includes(name)) {\n\t\t\tconsole.error(`Error: Profile \"${name}\" not found.`);\n\t\t\tconsole.log(\"Run 'pspm config list' to see available profiles.\");\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\t// Prevent deleting last profile\n\t\tif (profiles.length === 1) {\n\t\t\tconsole.error(\"Error: Cannot delete the last profile.\");\n\t\t\tconsole.log(\"Create another profile first, then delete this one.\");\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tconst wasDefault = name === defaultProfile;\n\t\tconst success = await deleteProfile(name);\n\n\t\tif (success) {\n\t\t\tconsole.log(`Deleted profile \"${name}\".`);\n\t\t\tif (wasDefault) {\n\t\t\t\tconst newDefault = await getDefaultProfileName();\n\t\t\t\tconsole.log(`Default profile is now \"${newDefault}\".`);\n\t\t\t}\n\t\t} else {\n\t\t\tconsole.error(`Error: Failed to delete profile \"${name}\".`);\n\t\t\tprocess.exit(1);\n\t\t}\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n","import { stat, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { ProjectConfig } from \"../../config.js\";\n\nexport interface ConfigInitOptions {\n\tprofile?: string;\n\tregistryUrl?: string;\n}\n\n/**\n * Create a .pspmrc file in the current directory\n */\nexport async function configInit(options: ConfigInitOptions): Promise<void> {\n\ttry {\n\t\tconst configPath = join(process.cwd(), \".pspmrc\");\n\n\t\t// Check if file already exists\n\t\ttry {\n\t\t\tawait stat(configPath);\n\t\t\tconsole.error(\"Error: .pspmrc already exists in this directory.\");\n\t\t\tprocess.exit(1);\n\t\t} catch {\n\t\t\t// File doesn't exist, good\n\t\t}\n\n\t\t// Build the config\n\t\tconst config: ProjectConfig = {};\n\n\t\tif (options.profile) {\n\t\t\tconfig.profile = options.profile;\n\t\t}\n\t\tif (options.registryUrl) {\n\t\t\tconfig.registryUrl = options.registryUrl;\n\t\t}\n\n\t\t// If no options provided, create a minimal example\n\t\tif (Object.keys(config).length === 0) {\n\t\t\tconfig.profile = \"development\";\n\t\t}\n\n\t\t// Write the file\n\t\tawait writeFile(configPath, `${JSON.stringify(config, null, 2)}\\n`);\n\n\t\tconsole.log(\"Created .pspmrc\");\n\t\tconsole.log(\"\");\n\t\tconsole.log(\"Contents:\");\n\t\tconsole.log(JSON.stringify(config, null, 2));\n\t\tconsole.log(\"\");\n\t\tconsole.log(\"Note: .pspmrc should be committed to version control.\");\n\t\tconsole.log(\"API keys should NOT be stored here - use pspm login instead.\");\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n","import { getDefaultProfileName, listProfiles } from \"../../config.js\";\n\n/**\n * List all available profiles\n */\nexport async function configList(): Promise<void> {\n\ttry {\n\t\tconst profiles = await listProfiles();\n\t\tconst defaultProfile = await getDefaultProfileName();\n\n\t\tif (profiles.length === 0) {\n\t\t\tconsole.log(\"No profiles configured.\");\n\t\t\tconsole.log(\"Run 'pspm config add <name>' to create one.\");\n\t\t\treturn;\n\t\t}\n\n\t\tconsole.log(\"Profiles:\\n\");\n\t\tfor (const name of profiles) {\n\t\t\tconst marker = name === defaultProfile ? \" (default)\" : \"\";\n\t\t\tconsole.log(` ${name}${marker}`);\n\t\t}\n\t\tconsole.log(\"\");\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n","import { getProfile, setProfile } from \"../../config.js\";\n\nconst VALID_KEYS = [\"registryUrl\", \"apiKey\", \"username\"] as const;\ntype ValidKey = (typeof VALID_KEYS)[number];\n\n/**\n * Set a profile field value\n */\nexport async function configSet(\n\tprofile: string,\n\tkey: string,\n\tvalue: string,\n): Promise<void> {\n\ttry {\n\t\t// Validate key\n\t\tif (!VALID_KEYS.includes(key as ValidKey)) {\n\t\t\tconsole.error(`Error: Invalid key \"${key}\".`);\n\t\t\tconsole.log(`Valid keys: ${VALID_KEYS.join(\", \")}`);\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\t// Check if profile exists\n\t\tconst existing = await getProfile(profile);\n\t\tif (!existing) {\n\t\t\tconsole.error(`Error: Profile \"${profile}\" not found.`);\n\t\t\tconsole.log(\"Run 'pspm config add' to create it first.\");\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\t// Update the profile\n\t\tawait setProfile(profile, { [key]: value });\n\t\tconsole.log(`Updated ${key} for profile \"${profile}\".`);\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n","import {\n\tfindProjectConfig,\n\ttype GlobalOptions,\n\tgetConfigPath,\n\tgetDefaultProfileName,\n\tgetProfile,\n\tresolveConfig,\n} from \"../../config.js\";\n\nexport interface ConfigShowOptions {\n\tname?: string;\n}\n\n/**\n * Show profile details or resolved config\n */\nexport async function configShow(\n\toptions: ConfigShowOptions,\n\tglobalOptions?: GlobalOptions,\n): Promise<void> {\n\ttry {\n\t\tif (options.name) {\n\t\t\t// Show specific profile\n\t\t\tconst profile = await getProfile(options.name);\n\t\t\tif (!profile) {\n\t\t\t\tconsole.error(`Error: Profile \"${options.name}\" not found.`);\n\t\t\t\tconsole.log(\"Run 'pspm config list' to see available profiles.\");\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\n\t\t\tconst defaultProfile = await getDefaultProfileName();\n\t\t\tconst isDefault = options.name === defaultProfile;\n\n\t\t\tconsole.log(`Profile: ${options.name}${isDefault ? \" (default)\" : \"\"}\\n`);\n\t\t\tconsole.log(` Registry URL: ${profile.registryUrl}`);\n\t\t\tconsole.log(` API Key: ${profile.apiKey ? \"***\" : \"(not set)\"}`);\n\t\t\tconsole.log(` Username: ${profile.username || \"(not set)\"}`);\n\t\t} else {\n\t\t\t// Show resolved config\n\t\t\tconst resolved = await resolveConfig(globalOptions);\n\t\t\tconst projectConfig = await findProjectConfig();\n\t\t\tconst configPath = getConfigPath();\n\n\t\t\tconsole.log(\"Resolved Configuration:\\n\");\n\t\t\tconsole.log(` Active Profile: ${resolved.profileName}`);\n\t\t\tconsole.log(` Profile Source: ${formatSource(resolved.profileSource)}`);\n\t\t\tconsole.log(` Registry URL: ${resolved.registryUrl}`);\n\t\t\tconsole.log(` API Key: ${resolved.apiKey ? \"***\" : \"(not set)\"}`);\n\t\t\tconsole.log(` Username: ${resolved.username || \"(not set)\"}`);\n\t\t\tconsole.log(\"\");\n\t\t\tconsole.log(\"Config Locations:\");\n\t\t\tconsole.log(` User config: ${configPath}`);\n\t\t\tconsole.log(` Project config: ${projectConfig ? \".pspmrc\" : \"(none)\"}`);\n\t\t}\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n\nfunction formatSource(source: string): string {\n\tswitch (source) {\n\t\tcase \"cli\":\n\t\t\treturn \"--profile flag\";\n\t\tcase \"env\":\n\t\t\treturn \"PSPM_PROFILE env var\";\n\t\tcase \"project\":\n\t\t\treturn \".pspmrc file\";\n\t\tcase \"user\":\n\t\t\treturn \"user config default\";\n\t\tcase \"default\":\n\t\t\treturn \"fallback default\";\n\t\tdefault:\n\t\t\treturn source;\n\t}\n}\n","import { getProfile, setDefaultProfile } from \"../../config.js\";\n\n/**\n * Set the default profile\n */\nexport async function configUse(name: string): Promise<void> {\n\ttry {\n\t\t// Check if profile exists\n\t\tconst profile = await getProfile(name);\n\t\tif (!profile) {\n\t\t\tconsole.error(`Error: Profile \"${name}\" not found.`);\n\t\t\tconsole.log(\"Run 'pspm config list' to see available profiles.\");\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tawait setDefaultProfile(name);\n\t\tconsole.log(`Default profile set to \"${name}\".`);\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n","import { mkdir, rm } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { SkillLockfileEntry } from \"@repo/pspm-types\";\nimport {\n\ttype GlobalOptions,\n\tgetRegistryUrl,\n\tgetSkillsDir,\n\trequireApiKey,\n} from \"../config.js\";\nimport { readLockfile } from \"../lockfile.js\";\n\nexport interface InstallOptions {\n\tfrozenLockfile?: boolean;\n\tdir?: string;\n}\n\nexport async function install(\n\toptions: InstallOptions,\n\tglobalOptions?: GlobalOptions,\n): Promise<void> {\n\ttry {\n\t\tconst apiKey = await requireApiKey(globalOptions);\n\t\tawait getRegistryUrl(globalOptions); // Validate we have a registry configured\n\t\tconst skillsDir = options.dir || getSkillsDir();\n\n\t\tconst lockfile = await readLockfile();\n\t\tif (!lockfile) {\n\t\t\tif (options.frozenLockfile) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t\"Error: No lockfile found. Cannot install with --frozen-lockfile\",\n\t\t\t\t);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\tconsole.log(\"No lockfile found. Nothing to install.\");\n\t\t\treturn;\n\t\t}\n\n\t\tconst skillCount = Object.keys(lockfile.skills).length;\n\t\tif (skillCount === 0) {\n\t\t\tconsole.log(\"No skills in lockfile. Nothing to install.\");\n\t\t\treturn;\n\t\t}\n\n\t\tconsole.log(`Installing ${skillCount} skill(s)...\\n`);\n\n\t\tconst entries = Object.entries(lockfile.skills) as [\n\t\t\tstring,\n\t\t\tSkillLockfileEntry,\n\t\t][];\n\n\t\tfor (const [fullName, entry] of entries) {\n\t\t\tconst match = fullName.match(/^@user\\/([^/]+)\\/([^/]+)$/);\n\t\t\tif (!match) {\n\t\t\t\tconsole.warn(`Warning: Invalid skill name in lockfile: ${fullName}`);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst [, username, name] = match;\n\t\t\tconsole.log(`Installing ${fullName}@${entry.version}...`);\n\n\t\t\t// Download the tarball\n\t\t\tconst response = await fetch(entry.resolved, {\n\t\t\t\theaders: {\n\t\t\t\t\tAuthorization: `Bearer ${apiKey}`,\n\t\t\t\t},\n\t\t\t\tredirect: \"follow\",\n\t\t\t});\n\n\t\t\tif (!response.ok) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t` Error: Failed to download ${fullName} (${response.status})`,\n\t\t\t\t);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst tarballBuffer = Buffer.from(await response.arrayBuffer());\n\n\t\t\t// Verify checksum\n\t\t\tconst { createHash } = await import(\"node:crypto\");\n\t\t\tconst actualIntegrity = `sha256-${createHash(\"sha256\").update(tarballBuffer).digest(\"base64\")}`;\n\n\t\t\tif (actualIntegrity !== entry.integrity) {\n\t\t\t\tconsole.error(` Error: Checksum verification failed for ${fullName}`);\n\t\t\t\tif (options.frozenLockfile) {\n\t\t\t\t\tprocess.exit(1);\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Extract tarball\n\t\t\tconst destDir = join(skillsDir, username, name);\n\t\t\tawait rm(destDir, { recursive: true, force: true });\n\t\t\tawait mkdir(destDir, { recursive: true });\n\n\t\t\tconst tempFile = join(destDir, \".temp.tgz\");\n\t\t\tconst { writeFile } = await import(\"node:fs/promises\");\n\t\t\tawait writeFile(tempFile, tarballBuffer);\n\n\t\t\tconst { exec } = await import(\"node:child_process\");\n\t\t\tconst { promisify } = await import(\"node:util\");\n\t\t\tconst execAsync = promisify(exec);\n\n\t\t\ttry {\n\t\t\t\tawait execAsync(\n\t\t\t\t\t`tar -xzf \"${tempFile}\" -C \"${destDir}\" --strip-components=1`,\n\t\t\t\t);\n\t\t\t} finally {\n\t\t\t\tawait rm(tempFile, { force: true });\n\t\t\t}\n\n\t\t\tconsole.log(` Installed to ${destDir}`);\n\t\t}\n\n\t\tconsole.log(`\\nAll ${skillCount} skill(s) installed.`);\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n","import { access } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { getSkillsDir } from \"../config.js\";\nimport { listLockfileSkills } from \"../lockfile.js\";\n\nexport interface ListOptions {\n\tjson?: boolean;\n}\n\nexport async function list(options: ListOptions): Promise<void> {\n\ttry {\n\t\tconst skills = await listLockfileSkills();\n\n\t\tif (skills.length === 0) {\n\t\t\tconsole.log(\"No skills installed.\");\n\t\t\treturn;\n\t\t}\n\n\t\tif (options.json) {\n\t\t\tconsole.log(JSON.stringify(skills, null, 2));\n\t\t\treturn;\n\t\t}\n\n\t\tconst skillsDir = getSkillsDir();\n\n\t\tconsole.log(\"Installed skills:\\n\");\n\n\t\tfor (const { name, entry } of skills) {\n\t\t\tconst match = name.match(/^@user\\/([^/]+)\\/([^/]+)$/);\n\t\t\tif (!match) continue;\n\n\t\t\tconst [, username, skillName] = match;\n\t\t\tconst skillPath = join(skillsDir, username, skillName);\n\n\t\t\t// Check if skill is actually installed on disk\n\t\t\tlet status = \"installed\";\n\t\t\ttry {\n\t\t\t\tawait access(skillPath);\n\t\t\t} catch {\n\t\t\t\tstatus = \"missing\";\n\t\t\t}\n\n\t\t\tconsole.log(` ${name}@${entry.version}`);\n\t\t\tif (status === \"missing\") {\n\t\t\t\tconsole.log(` Status: MISSING (run 'pspm install' to restore)`);\n\t\t\t}\n\t\t}\n\n\t\tconsole.log(`\\nTotal: ${skills.length} skill(s)`);\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n","import { randomBytes } from \"node:crypto\";\nimport http from \"node:http\";\nimport { URL } from \"node:url\";\nimport open from \"open\";\nimport { whoamiRequest } from \"../api-client.js\";\nimport {\n\ttype GlobalOptions,\n\tgetRegistryUrl,\n\tresolveConfig,\n\tsetProfileCredentials,\n} from \"../config.js\";\n\nexport interface LoginOptions {\n\tapiKey?: string;\n}\n\nconst DEFAULT_WEB_APP_URL = \"https://pspm.dev\";\n\n/**\n * Get the web app URL.\n * Priority:\n * 1. PSPM_WEB_URL environment variable (for local dev where web and server run on different ports)\n * 2. Derived from registry URL (for production where they share the same origin)\n *\n * Local dev example:\n * PSPM_WEB_URL=http://localhost:5500 pspm login\n *\n * The registry URL is like https://pspm.dev/api/skills\n * The web app URL should be like https://pspm.dev\n */\nfunction getWebAppUrl(registryUrl: string): string {\n\t// Environment variable takes priority (for local dev)\n\tif (process.env.PSPM_WEB_URL) {\n\t\treturn process.env.PSPM_WEB_URL.replace(/\\/$/, \"\"); // Remove trailing slash\n\t}\n\n\ttry {\n\t\tconst url = new URL(registryUrl);\n\t\treturn `${url.protocol}//${url.host}`;\n\t} catch {\n\t\treturn DEFAULT_WEB_APP_URL;\n\t}\n}\n\n/**\n * Get the server/API base URL from the registry URL\n * The registry URL is like https://pspm.dev/api/skills\n * The server URL should be like https://pspm.dev\n */\nfunction getServerUrl(registryUrl: string): string {\n\ttry {\n\t\tconst url = new URL(registryUrl);\n\t\treturn `${url.protocol}//${url.host}`;\n\t} catch {\n\t\treturn DEFAULT_WEB_APP_URL;\n\t}\n}\n\n/**\n * Exchange a CLI token for an API key using fetch\n */\nasync function exchangeCliToken(\n\tregistryUrl: string,\n\ttoken: string,\n): Promise<{ apiKey: string; username: string }> {\n\tconst serverUrl = getServerUrl(registryUrl);\n\t// Use direct REST endpoint (not oRPC) for CLI compatibility\n\tconst rpcUrl = `${serverUrl}/api/api-keys/cli-token-exchange`;\n\n\tconst response = await fetch(rpcUrl, {\n\t\tmethod: \"POST\",\n\t\theaders: {\n\t\t\t\"Content-Type\": \"application/json\",\n\t\t},\n\t\tbody: JSON.stringify({ token }),\n\t});\n\n\tif (!response.ok) {\n\t\tconst errorText = await response.text();\n\t\tthrow new Error(`Failed to exchange token: ${errorText}`);\n\t}\n\n\treturn response.json() as Promise<{ apiKey: string; username: string }>;\n}\n\n/**\n * Start a local HTTP server to receive the OAuth callback\n */\nfunction startCallbackServer(expectedState: string): Promise<{\n\tport: number;\n\ttokenPromise: Promise<string>;\n\tcleanup: () => void;\n}> {\n\treturn new Promise((resolveServer, rejectServer) => {\n\t\tlet resolveToken: (token: string) => void;\n\t\tlet rejectToken: (error: Error) => void;\n\t\tlet timeoutId: NodeJS.Timeout;\n\n\t\tconst tokenPromise = new Promise<string>((resolve, reject) => {\n\t\t\tresolveToken = resolve;\n\t\t\trejectToken = reject;\n\t\t});\n\n\t\tconst server = http.createServer((req, res) => {\n\t\t\tconst url = new URL(req.url || \"/\", `http://localhost`);\n\n\t\t\tif (url.pathname === \"/callback\") {\n\t\t\t\tconst token = url.searchParams.get(\"token\");\n\t\t\t\tconst state = url.searchParams.get(\"state\");\n\n\t\t\t\tif (state !== expectedState) {\n\t\t\t\t\tres.writeHead(400, { \"Content-Type\": \"text/html\" });\n\t\t\t\t\tres.end(`\n\t\t\t\t\t\t<html>\n\t\t\t\t\t\t\t<body style=\"font-family: system-ui; text-align: center; padding: 40px;\">\n\t\t\t\t\t\t\t\t<h1 style=\"color: #dc2626;\">Security Error</h1>\n\t\t\t\t\t\t\t\t<p>State mismatch - this may be a security issue.</p>\n\t\t\t\t\t\t\t\t<p>Please try running <code>pspm login</code> again.</p>\n\t\t\t\t\t\t\t</body>\n\t\t\t\t\t\t</html>\n\t\t\t\t\t`);\n\t\t\t\t\trejectToken(new Error(\"State mismatch - possible CSRF attack\"));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (!token) {\n\t\t\t\t\tres.writeHead(400, { \"Content-Type\": \"text/html\" });\n\t\t\t\t\tres.end(`\n\t\t\t\t\t\t<html>\n\t\t\t\t\t\t\t<body style=\"font-family: system-ui; text-align: center; padding: 40px;\">\n\t\t\t\t\t\t\t\t<h1 style=\"color: #dc2626;\">Error</h1>\n\t\t\t\t\t\t\t\t<p>No token received from the server.</p>\n\t\t\t\t\t\t\t\t<p>Please try running <code>pspm login</code> again.</p>\n\t\t\t\t\t\t\t</body>\n\t\t\t\t\t\t</html>\n\t\t\t\t\t`);\n\t\t\t\t\trejectToken(new Error(\"No token received\"));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tres.writeHead(200, { \"Content-Type\": \"text/html\" });\n\t\t\t\tres.end(`\n\t\t\t\t\t<html>\n\t\t\t\t\t\t<head>\n\t\t\t\t\t\t\t<script>\n\t\t\t\t\t\t\t\t// Try to close the window after a short delay\n\t\t\t\t\t\t\t\tsetTimeout(function() {\n\t\t\t\t\t\t\t\t\twindow.close();\n\t\t\t\t\t\t\t\t}, 1500);\n\t\t\t\t\t\t\t</script>\n\t\t\t\t\t\t</head>\n\t\t\t\t\t\t<body style=\"font-family: system-ui; text-align: center; padding: 40px;\">\n\t\t\t\t\t\t\t<h1 style=\"color: #16a34a;\">Success!</h1>\n\t\t\t\t\t\t\t<p>You are now logged in to PSPM.</p>\n\t\t\t\t\t\t\t<p style=\"color: #666; font-size: 14px;\">This window will close automatically, or you can close it manually.</p>\n\t\t\t\t\t\t</body>\n\t\t\t\t\t</html>\n\t\t\t\t`);\n\n\t\t\t\tresolveToken(token);\n\t\t\t} else {\n\t\t\t\tres.writeHead(404, { \"Content-Type\": \"text/plain\" });\n\t\t\t\tres.end(\"Not found\");\n\t\t\t}\n\t\t});\n\n\t\t// Cleanup function to close server and clear timeout\n\t\tconst cleanup = () => {\n\t\t\tclearTimeout(timeoutId);\n\t\t\tserver.close();\n\t\t};\n\n\t\t// Use port 0 to let the OS assign an available port\n\t\tserver.listen(0, \"127.0.0.1\", () => {\n\t\t\tconst address = server.address();\n\t\t\tif (typeof address === \"object\" && address !== null) {\n\t\t\t\tresolveServer({ port: address.port, tokenPromise, cleanup });\n\t\t\t} else {\n\t\t\t\trejectServer(new Error(\"Failed to get server address\"));\n\t\t\t}\n\t\t});\n\n\t\tserver.on(\"error\", (err) => {\n\t\t\trejectServer(err);\n\t\t});\n\n\t\t// Timeout after 5 minutes\n\t\ttimeoutId = setTimeout(\n\t\t\t() => {\n\t\t\t\trejectToken(new Error(\"Login timed out - please try again\"));\n\t\t\t\tserver.close();\n\t\t\t},\n\t\t\t5 * 60 * 1000,\n\t\t);\n\t});\n}\n\n/**\n * Login using browser-based OAuth flow\n */\nasync function browserLogin(globalOptions?: GlobalOptions): Promise<void> {\n\tconst resolved = await resolveConfig(globalOptions);\n\tconst registryUrl = await getRegistryUrl(globalOptions);\n\tconst webAppUrl = getWebAppUrl(registryUrl);\n\n\t// Generate state for CSRF protection\n\tconst state = randomBytes(32).toString(\"base64url\");\n\n\tconsole.log(\"Starting browser-based login...\");\n\n\t// Start local callback server\n\tconst { port, tokenPromise, cleanup } = await startCallbackServer(state);\n\n\t// Build the login URL\n\tconst loginUrl = `${webAppUrl}/cli/login?port=${port}&state=${encodeURIComponent(state)}`;\n\n\tconsole.log(`Opening browser to authenticate...`);\n\tconsole.log(`If the browser doesn't open, visit: ${loginUrl}`);\n\n\t// Open the browser\n\ttry {\n\t\tawait open(loginUrl);\n\t} catch {\n\t\tconsole.log(\"Could not open browser automatically.\");\n\t\tconsole.log(`Please visit: ${loginUrl}`);\n\t}\n\n\tconsole.log(\"Waiting for authentication...\");\n\n\t// Wait for the callback with the token\n\tconst token = await tokenPromise;\n\n\t// Clean up server and timeout immediately after receiving token\n\tcleanup();\n\n\tconsole.log(\"Received token, exchanging for API key...\");\n\n\t// Exchange the token for an API key\n\tconst { apiKey, username } = await exchangeCliToken(registryUrl, token);\n\n\t// Store credentials\n\tawait setProfileCredentials(\n\t\tresolved.profileName,\n\t\tapiKey,\n\t\tusername,\n\t\tregistryUrl,\n\t);\n\n\tconsole.log(`Logged in as ${username}`);\n\tconsole.log(`Profile: ${resolved.profileName}`);\n\tconsole.log(`Registry: ${registryUrl}`);\n}\n\n/**\n * Login using direct API key (fallback method)\n */\nasync function directLogin(\n\tapiKey: string,\n\tglobalOptions?: GlobalOptions,\n): Promise<void> {\n\tconsole.log(\"Verifying API key...\");\n\n\tconst resolved = await resolveConfig(globalOptions);\n\tconst registryUrl = await getRegistryUrl(globalOptions);\n\n\tconst user = await whoamiRequest(registryUrl, apiKey);\n\tif (!user) {\n\t\tconsole.error(\"Error: Invalid API key or not authenticated\");\n\t\tprocess.exit(1);\n\t}\n\n\t// Store credentials for the resolved profile\n\tawait setProfileCredentials(\n\t\tresolved.profileName,\n\t\tapiKey,\n\t\tuser.username,\n\t\tregistryUrl,\n\t);\n\tconsole.log(`Logged in as ${user.username}`);\n\tconsole.log(`Profile: ${resolved.profileName}`);\n\tconsole.log(`Registry: ${registryUrl}`);\n}\n\nexport async function login(\n\toptions: LoginOptions,\n\tglobalOptions?: GlobalOptions,\n): Promise<void> {\n\ttry {\n\t\tif (options.apiKey) {\n\t\t\t// Direct login with API key\n\t\t\tawait directLogin(options.apiKey, globalOptions);\n\t\t} else {\n\t\t\t// Browser-based OAuth flow\n\t\t\tawait browserLogin(globalOptions);\n\t\t}\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n","import {\n\tclearProfileCredentials,\n\ttype GlobalOptions,\n\tisLoggedIn,\n\tresolveConfig,\n} from \"../config.js\";\n\nexport async function logout(globalOptions?: GlobalOptions): Promise<void> {\n\ttry {\n\t\tconst resolved = await resolveConfig(globalOptions);\n\t\tconst loggedIn = await isLoggedIn(globalOptions);\n\n\t\tif (!loggedIn) {\n\t\t\tconsole.log(`Not logged in (profile: ${resolved.profileName}).`);\n\t\t\treturn;\n\t\t}\n\n\t\tawait clearProfileCredentials(resolved.profileName);\n\t\tconsole.log(`Logged out from profile \"${resolved.profileName}\".`);\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n","import { exec as execCb } from \"node:child_process\";\nimport { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { promisify } from \"node:util\";\nimport type { PublishSkillBodyManifest } from \"@repo/sdk\";\nimport { configure, publishSkill } from \"../api-client.js\";\nimport {\n\ttype GlobalOptions,\n\tgetRegistryUrl,\n\trequireApiKey,\n} from \"../config.js\";\n\nconst exec = promisify(execCb);\n\nexport interface PublishOptions {\n\tbump?: \"major\" | \"minor\" | \"patch\";\n\ttag?: string;\n}\n\nexport async function publishCommand(\n\toptions: PublishOptions,\n\tglobalOptions?: GlobalOptions,\n): Promise<void> {\n\ttry {\n\t\tconst apiKey = await requireApiKey(globalOptions);\n\t\tconst registryUrl = await getRegistryUrl(globalOptions);\n\n\t\t// Read package.json from current directory\n\t\tconst packageJsonPath = join(process.cwd(), \"package.json\");\n\t\tlet packageJson: PublishSkillBodyManifest;\n\n\t\ttry {\n\t\t\tconst content = await readFile(packageJsonPath, \"utf-8\");\n\t\t\tpackageJson = JSON.parse(content);\n\t\t} catch {\n\t\t\tconsole.error(\"Error: No package.json found in current directory\");\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\t// Validate required fields\n\t\tif (!packageJson.name) {\n\t\t\tconsole.error(\"Error: package.json must have a 'name' field\");\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tif (!packageJson.version) {\n\t\t\tconsole.error(\"Error: package.json must have a 'version' field\");\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\t// Handle version bump if requested\n\t\tif (options.bump) {\n\t\t\tconst semver = await import(\"semver\");\n\t\t\tconst newVersion = semver.default.inc(packageJson.version, options.bump);\n\t\t\tif (!newVersion) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t`Error: Failed to bump version from ${packageJson.version}`,\n\t\t\t\t);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\tpackageJson.version = newVersion;\n\t\t\tconsole.log(`Bumped version to ${newVersion}`);\n\t\t}\n\n\t\tconsole.log(`Registry: ${registryUrl}`);\n\t\tconsole.log(`Publishing ${packageJson.name}@${packageJson.version}...`);\n\n\t\t// Create tarball using npm pack (or tar directly)\n\t\t// Sanitize name for filename (replace @ and / with -)\n\t\tconst safeName = packageJson.name.replace(/[@/]/g, \"-\").replace(/^-+/, \"\");\n\t\tconst tarballName = `${safeName}-${packageJson.version}.tgz`;\n\t\tconst tempDir = join(process.cwd(), \".pspm-publish\");\n\n\t\t// Create tarball\n\t\ttry {\n\t\t\tawait exec(`rm -rf \"${tempDir}\" && mkdir -p \"${tempDir}\"`);\n\n\t\t\t// Get files to include (use 'files' from package.json or default)\n\t\t\tconst files = packageJson.files || [\n\t\t\t\t\"package.json\",\n\t\t\t\t\"SKILL.md\",\n\t\t\t\t\"runtime\",\n\t\t\t\t\"scripts\",\n\t\t\t\t\"data\",\n\t\t\t];\n\n\t\t\t// Create the tarball structure: package/{files}\n\t\t\tawait exec(`mkdir -p \"${tempDir}/package\"`);\n\n\t\t\tfor (const file of files) {\n\t\t\t\ttry {\n\t\t\t\t\t// Use rsync to copy while excluding node_modules\n\t\t\t\t\tawait exec(\n\t\t\t\t\t\t`rsync -a --exclude='node_modules' --exclude='.git' \"${file}\" \"${tempDir}/package/\" 2>/dev/null || true`,\n\t\t\t\t\t);\n\t\t\t\t} catch {\n\t\t\t\t\t// Ignore files that don't exist\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Always include package.json\n\t\t\tawait exec(`cp package.json \"${tempDir}/package/\"`);\n\n\t\t\t// Create tarball (excluding node_modules just in case)\n\t\t\tconst tarballPath = join(tempDir, tarballName);\n\t\t\tawait exec(\n\t\t\t\t`tar -czf \"${tarballPath}\" -C \"${tempDir}\" --exclude='node_modules' --exclude='.git' package`,\n\t\t\t);\n\n\t\t\t// Read tarball and convert to base64\n\t\t\tconst tarballBuffer = await readFile(tarballPath);\n\t\t\tconst tarballBase64 = tarballBuffer.toString(\"base64\");\n\n\t\t\t// Configure SDK and publish (use direct REST endpoints, not oRPC)\n\t\t\tconfigure({ baseUrl: registryUrl, apiKey });\n\t\t\tconst response = await publishSkill({\n\t\t\t\tmanifest: packageJson,\n\t\t\t\ttarballBase64,\n\t\t\t});\n\n\t\t\tif (response.status !== 200) {\n\t\t\t\tconst errorData = response.data as unknown as {\n\t\t\t\t\terror?: string;\n\t\t\t\t\tmessage?: string;\n\t\t\t\t};\n\t\t\t\tconst errorMessage =\n\t\t\t\t\terrorData?.error || errorData?.message || \"Publish failed\";\n\t\t\t\tthrow new Error(errorMessage);\n\t\t\t}\n\n\t\t\tconst result = response.data;\n\t\t\tconsole.log(\n\t\t\t\t`\\nPublished @user/${result.skill.username}/${result.skill.name}@${result.version.version}`,\n\t\t\t);\n\t\t\tconsole.log(`Checksum: ${result.version.checksum}`);\n\t\t} finally {\n\t\t\t// Cleanup\n\t\t\tawait exec(`rm -rf \"${tempDir}\"`).catch(() => {});\n\t\t}\n\t} catch (error) {\n\t\t// Try to extract detailed error info\n\t\tif (error instanceof Error) {\n\t\t\tconsole.error(`Error: ${error.message}`);\n\n\t\t\t// Check for oRPC error with response details\n\t\t\tconst anyError = error as {\n\t\t\t\tcause?: { response?: Response; data?: unknown; body?: unknown };\n\t\t\t\tresponse?: Response;\n\t\t\t\tdata?: unknown;\n\t\t\t\tbody?: unknown;\n\t\t\t};\n\n\t\t\t// Try to get response body for more details\n\t\t\tif (anyError.cause?.response) {\n\t\t\t\ttry {\n\t\t\t\t\tconst text = await anyError.cause.response.text();\n\t\t\t\t\tconsole.error(`Response body: ${text}`);\n\t\t\t\t} catch {\n\t\t\t\t\t// ignore\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Log cause body if available\n\t\t\tif (anyError.cause?.body) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t`Cause body: ${JSON.stringify(anyError.cause.body, null, 2)}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (anyError.body) {\n\t\t\t\tconsole.error(`Error body: ${JSON.stringify(anyError.body, null, 2)}`);\n\t\t\t}\n\n\t\t\t// Log additional error properties\n\t\t\tif (anyError.data) {\n\t\t\t\tconsole.error(`Error data: ${JSON.stringify(anyError.data, null, 2)}`);\n\t\t\t}\n\n\t\t\t// Log the full error in verbose mode\n\t\t\tif (process.env.PSPM_DEBUG) {\n\t\t\t\tconsole.error(\"\\nFull error details:\");\n\t\t\t\tconsole.error(error);\n\t\t\t\tif (error.stack) {\n\t\t\t\t\tconsole.error(\"\\nStack trace:\");\n\t\t\t\t\tconsole.error(error.stack);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tconsole.error(`Error: ${String(error)}`);\n\t\t}\n\t\tconsole.error(\"\\nTip: Set PSPM_DEBUG=1 for more detailed error output\");\n\t\tprocess.exit(1);\n\t}\n}\n\n// Keep old export name for backwards compatibility\nexport { publishCommand as publish };\n","import { rm } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { getSkillsDir, requireApiKey } from \"../config.js\";\nimport { listLockfileSkills, removeFromLockfile } from \"../lockfile.js\";\n\nexport async function remove(nameOrSpecifier: string): Promise<void> {\n\ttry {\n\t\tawait requireApiKey();\n\n\t\t// Normalize the name\n\t\tlet fullName: string;\n\t\tlet username: string;\n\t\tlet name: string;\n\n\t\tif (nameOrSpecifier.startsWith(\"@user/\")) {\n\t\t\t// Full specifier: @user/{username}/{name}\n\t\t\tconst match = nameOrSpecifier.match(/^@user\\/([^/]+)\\/([^@/]+)/);\n\t\t\tif (!match) {\n\t\t\t\tconsole.error(`Error: Invalid skill specifier: ${nameOrSpecifier}`);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\tfullName = `@user/${match[1]}/${match[2]}`;\n\t\t\tusername = match[1];\n\t\t\tname = match[2];\n\t\t} else {\n\t\t\t// Short name - find in lockfile\n\t\t\tconst skills = await listLockfileSkills();\n\t\t\tconst found = skills.find((s) => {\n\t\t\t\tconst match = s.name.match(/^@user\\/([^/]+)\\/([^/]+)$/);\n\t\t\t\treturn match && match[2] === nameOrSpecifier;\n\t\t\t});\n\n\t\t\tif (!found) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t`Error: Skill \"${nameOrSpecifier}\" not found in lockfile`,\n\t\t\t\t);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\n\t\t\tfullName = found.name;\n\t\t\tconst match = fullName.match(/^@user\\/([^/]+)\\/([^/]+)$/);\n\t\t\tif (!match) {\n\t\t\t\tconsole.error(`Error: Invalid skill name in lockfile: ${fullName}`);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\tusername = match[1];\n\t\t\tname = match[2];\n\t\t}\n\n\t\tconsole.log(`Removing ${fullName}...`);\n\n\t\t// Remove from lockfile\n\t\tconst removed = await removeFromLockfile(fullName);\n\t\tif (!removed) {\n\t\t\tconsole.error(`Error: ${fullName} not found in lockfile`);\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\t// Remove from disk\n\t\tconst skillsDir = getSkillsDir();\n\t\tconst destDir = join(skillsDir, username, name);\n\n\t\ttry {\n\t\t\tawait rm(destDir, { recursive: true, force: true });\n\t\t} catch {\n\t\t\t// Ignore errors if directory doesn't exist\n\t\t}\n\n\t\tconsole.log(`Removed ${fullName}`);\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n","import { parseSkillSpecifier } from \"@repo/pspm-types\";\nimport { configure, deleteSkill, deleteSkillVersion } from \"../api-client.js\";\nimport {\n\ttype GlobalOptions,\n\tgetRegistryUrl,\n\trequireApiKey,\n} from \"../config.js\";\n\nexport interface UnpublishOptions {\n\tforce?: boolean;\n}\n\nexport async function unpublish(\n\tspecifier: string,\n\toptions: UnpublishOptions,\n\tglobalOptions?: GlobalOptions,\n): Promise<void> {\n\ttry {\n\t\tconst apiKey = await requireApiKey(globalOptions);\n\t\tconst registryUrl = await getRegistryUrl(globalOptions);\n\n\t\t// Parse the specifier\n\t\tconst parsed = parseSkillSpecifier(specifier);\n\t\tif (!parsed) {\n\t\t\tconsole.error(\n\t\t\t\t`Error: Invalid skill specifier \"${specifier}\". Use format: @user/{username}/{name}[@{version}]`,\n\t\t\t);\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tconst { username, name, versionRange } = parsed;\n\n\t\t// Configure SDK (use direct REST endpoints, not oRPC)\n\t\tconfigure({ baseUrl: registryUrl, apiKey });\n\n\t\tif (versionRange) {\n\t\t\t// Delete specific version\n\t\t\tconsole.log(`Unpublishing ${specifier}...`);\n\n\t\t\tif (!options.force) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t\"Warning: This action is irreversible. Use --force to confirm.\",\n\t\t\t\t);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\n\t\t\tconst response = await deleteSkillVersion(name, versionRange);\n\t\t\tif (response.status !== 200) {\n\t\t\t\tconst errorData = response.data as unknown as {\n\t\t\t\t\terror?: string;\n\t\t\t\t\tmessage?: string;\n\t\t\t\t};\n\t\t\t\tconst errorMessage =\n\t\t\t\t\terrorData?.error ||\n\t\t\t\t\terrorData?.message ||\n\t\t\t\t\t\"Failed to unpublish. Version may not exist.\";\n\t\t\t\tconsole.error(`Error: ${errorMessage}`);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\tconsole.log(`Unpublished @user/${username}/${name}@${versionRange}`);\n\t\t} else {\n\t\t\t// Delete entire skill\n\t\t\tconsole.log(`Unpublishing all versions of @user/${username}/${name}...`);\n\n\t\t\tif (!options.force) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t\"Warning: This will delete ALL versions. Use --force to confirm.\",\n\t\t\t\t);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\n\t\t\tconst response = await deleteSkill(name);\n\t\t\tif (response.status !== 200) {\n\t\t\t\tconst errorData = response.data as unknown as {\n\t\t\t\t\terror?: string;\n\t\t\t\t\tmessage?: string;\n\t\t\t\t};\n\t\t\t\tconst errorMessage =\n\t\t\t\t\terrorData?.error ||\n\t\t\t\t\terrorData?.message ||\n\t\t\t\t\t\"Failed to unpublish. Skill may not exist.\";\n\t\t\t\tconsole.error(`Error: ${errorMessage}`);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\tconsole.log(`Unpublished @user/${username}/${name} (all versions)`);\n\t\t}\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n","import { resolveVersion } from \"@repo/pspm-types\";\nimport { configure, listSkillVersions } from \"../api-client.js\";\nimport {\n\ttype GlobalOptions,\n\tgetRegistryUrl,\n\trequireApiKey,\n} from \"../config.js\";\nimport { listLockfileSkills } from \"../lockfile.js\";\nimport { add } from \"./add.js\";\n\nexport interface UpdateOptions {\n\tdryRun?: boolean;\n}\n\nexport async function update(\n\toptions: UpdateOptions,\n\tglobalOptions?: GlobalOptions,\n): Promise<void> {\n\ttry {\n\t\tconst apiKey = await requireApiKey(globalOptions);\n\t\tconst registryUrl = await getRegistryUrl(globalOptions);\n\n\t\tconst skills = await listLockfileSkills();\n\n\t\tif (skills.length === 0) {\n\t\t\tconsole.log(\"No skills installed.\");\n\t\t\treturn;\n\t\t}\n\n\t\t// Configure SDK (use direct REST endpoints, not oRPC)\n\t\tconfigure({ baseUrl: registryUrl, apiKey });\n\n\t\tconst updates: Array<{\n\t\t\tname: string;\n\t\t\tcurrent: string;\n\t\t\tlatest: string;\n\t\t}> = [];\n\n\t\tconsole.log(\"Checking for updates...\\n\");\n\n\t\tfor (const { name, entry } of skills) {\n\t\t\tconst match = name.match(/^@user\\/([^/]+)\\/([^/]+)$/);\n\t\t\tif (!match) continue;\n\n\t\t\tconst [, username, skillName] = match;\n\n\t\t\ttry {\n\t\t\t\tconst versionsResponse = await listSkillVersions(username, skillName);\n\t\t\t\tconst versions = versionsResponse.data;\n\t\t\t\tif (versions.length === 0) continue;\n\n\t\t\t\tconst versionStrings = versions.map(\n\t\t\t\t\t(v: { version: string }) => v.version,\n\t\t\t\t);\n\t\t\t\tconst latest = resolveVersion(\"*\", versionStrings);\n\n\t\t\t\tif (latest && latest !== entry.version) {\n\t\t\t\t\tupdates.push({\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tcurrent: entry.version,\n\t\t\t\t\t\tlatest,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\tconsole.warn(` Warning: Could not check updates for ${name}`);\n\t\t\t}\n\t\t}\n\n\t\tif (updates.length === 0) {\n\t\t\tconsole.log(\"All skills are up to date.\");\n\t\t\treturn;\n\t\t}\n\n\t\tconsole.log(\"Updates available:\\n\");\n\t\tfor (const { name, current, latest } of updates) {\n\t\t\tconsole.log(` ${name}: ${current} -> ${latest}`);\n\t\t}\n\n\t\tif (options.dryRun) {\n\t\t\tconsole.log(\"\\nDry run - no changes made.\");\n\t\t\treturn;\n\t\t}\n\n\t\tconsole.log(\"\\nUpdating...\\n\");\n\n\t\tfor (const { name, latest } of updates) {\n\t\t\tconst match = name.match(/^@user\\/([^/]+)\\/([^/]+)$/);\n\t\t\tif (!match) continue;\n\n\t\t\tconst [, username, skillName] = match;\n\t\t\tconst specifier = `@user/${username}/${skillName}@${latest}`;\n\n\t\t\tawait add(specifier, {}, globalOptions);\n\t\t}\n\n\t\tconsole.log(\"\\nAll skills updated.\");\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n","import { whoamiRequest } from \"../api-client.js\";\nimport {\n\ttype GlobalOptions,\n\tgetRegistryUrl,\n\trequireApiKey,\n\tresolveConfig,\n} from \"../config.js\";\n\nexport async function whoami(globalOptions?: GlobalOptions): Promise<void> {\n\ttry {\n\t\tconst resolved = await resolveConfig(globalOptions);\n\t\tconst apiKey = await requireApiKey(globalOptions);\n\t\tconst registryUrl = await getRegistryUrl(globalOptions);\n\n\t\tconst user = await whoamiRequest(registryUrl, apiKey);\n\n\t\tif (user) {\n\t\t\tconsole.log(`Username: ${user.username}`);\n\t\t\tconsole.log(`User ID: ${user.userId}`);\n\t\t\tconsole.log(`Registry: ${registryUrl}`);\n\t\t\tconsole.log(`Profile: ${resolved.profileName}`);\n\t\t} else if (resolved.username) {\n\t\t\t// Use cached username if API call fails\n\t\t\tconsole.log(`Username: ${resolved.username} (cached)`);\n\t\t\tconsole.log(`Registry: ${registryUrl}`);\n\t\t\tconsole.log(`Profile: ${resolved.profileName}`);\n\t\t} else {\n\t\t\tconsole.error(\"Could not determine current user.\");\n\t\t\tprocess.exit(1);\n\t\t}\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n","#!/usr/bin/env node\n\nimport { readFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { Command } from \"commander\";\nimport {\n\tadd,\n\tconfigAdd,\n\tconfigDelete,\n\tconfigInit,\n\tconfigList,\n\tconfigSet,\n\tconfigShow,\n\tconfigUse,\n\tinstall,\n\tlist,\n\tlogin,\n\tlogout,\n\tpublish,\n\tremove,\n\tunpublish,\n\tupdate,\n\twhoami,\n} from \"./commands/index.js\";\nimport type { GlobalOptions } from \"./config.js\";\n\n// Read version from package.json\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nconst packageJson = JSON.parse(\n\treadFileSync(join(__dirname, \"..\", \"package.json\"), \"utf-8\"),\n);\nconst version: string = packageJson.version;\n\nconst program = new Command();\n\nprogram\n\t.name(\"pspm\")\n\t.description(\"Prompt Skill Package Manager for AnyT\")\n\t.version(version)\n\t.option(\"-p, --profile <name>\", \"Use a specific profile\");\n\n/**\n * Get global options from a command\n */\nfunction getGlobalOptions(cmd: Command): GlobalOptions {\n\t// Walk up to the root program to get global options\n\tlet current: Command | null = cmd;\n\twhile (current.parent) {\n\t\tcurrent = current.parent;\n\t}\n\tconst opts = current.opts();\n\treturn {\n\t\tprofile: opts.profile,\n\t};\n}\n\n// =============================================================================\n// Config commands\n// =============================================================================\n\nconst configCmd = program\n\t.command(\"config\")\n\t.description(\"Manage PSPM configuration and profiles\");\n\nconfigCmd\n\t.command(\"list\")\n\t.description(\"List all profiles\")\n\t.action(async () => {\n\t\tawait configList();\n\t});\n\nconfigCmd\n\t.command(\"show [name]\")\n\t.description(\"Show resolved config or a specific profile\")\n\t.action(async (name, _options, cmd) => {\n\t\tconst globalOptions = getGlobalOptions(cmd);\n\t\tawait configShow({ name }, globalOptions);\n\t});\n\nconfigCmd\n\t.command(\"add <name>\")\n\t.description(\"Create a new profile\")\n\t.option(\"--registry-url <url>\", \"Registry URL for the profile\")\n\t.action(async (name, options) => {\n\t\tawait configAdd(name, { registryUrl: options.registryUrl });\n\t});\n\nconfigCmd\n\t.command(\"use <name>\")\n\t.description(\"Set the default profile\")\n\t.action(async (name) => {\n\t\tawait configUse(name);\n\t});\n\nconfigCmd\n\t.command(\"set <profile> <key> <value>\")\n\t.description(\"Set a profile field (registryUrl, apiKey, username)\")\n\t.action(async (profile, key, value) => {\n\t\tawait configSet(profile, key, value);\n\t});\n\nconfigCmd\n\t.command(\"delete <name>\")\n\t.description(\"Delete a profile\")\n\t.action(async (name) => {\n\t\tawait configDelete(name);\n\t});\n\nconfigCmd\n\t.command(\"init\")\n\t.description(\"Create a .pspmrc file in the current directory\")\n\t.option(\"--profile <name>\", \"Profile to use for this project\")\n\t.option(\"--registry-url <url>\", \"Registry URL override\")\n\t.action(async (options) => {\n\t\tawait configInit({\n\t\t\tprofile: options.profile,\n\t\t\tregistryUrl: options.registryUrl,\n\t\t});\n\t});\n\n// =============================================================================\n// Authentication commands\n// =============================================================================\n\nprogram\n\t.command(\"login\")\n\t.description(\"Log in via browser or with an API key\")\n\t.option(\n\t\t\"--api-key <key>\",\n\t\t\"API key for direct authentication (skips browser)\",\n\t)\n\t.action(async (options, cmd) => {\n\t\tconst globalOptions = getGlobalOptions(cmd);\n\t\tawait login({ apiKey: options.apiKey }, globalOptions);\n\t});\n\nprogram\n\t.command(\"logout\")\n\t.description(\"Log out and clear stored credentials\")\n\t.action(async (_options, cmd) => {\n\t\tconst globalOptions = getGlobalOptions(cmd);\n\t\tawait logout(globalOptions);\n\t});\n\nprogram\n\t.command(\"whoami\")\n\t.description(\"Show current user information\")\n\t.action(async (_options, cmd) => {\n\t\tconst globalOptions = getGlobalOptions(cmd);\n\t\tawait whoami(globalOptions);\n\t});\n\n// =============================================================================\n// Skill management commands\n// =============================================================================\n\nprogram\n\t.command(\"add <specifier>\")\n\t.description(\"Add a skill (e.g., @user/bsheng/vite_slides@^2.0.0)\")\n\t.option(\"--save\", \"Save to lockfile (default)\")\n\t.action(async (specifier, options, cmd) => {\n\t\tconst globalOptions = getGlobalOptions(cmd);\n\t\tawait add(specifier, { save: options.save ?? true }, globalOptions);\n\t});\n\nprogram\n\t.command(\"remove <name>\")\n\t.alias(\"rm\")\n\t.description(\"Remove an installed skill\")\n\t.action(async (name) => {\n\t\tawait remove(name);\n\t});\n\nprogram\n\t.command(\"list\")\n\t.alias(\"ls\")\n\t.description(\"List installed skills\")\n\t.option(\"--json\", \"Output as JSON\")\n\t.action(async (options) => {\n\t\tawait list({ json: options.json });\n\t});\n\nprogram\n\t.command(\"install\")\n\t.alias(\"i\")\n\t.description(\"Install all skills from lockfile\")\n\t.option(\"--frozen-lockfile\", \"Fail if lockfile is missing or outdated\")\n\t.option(\"--dir <path>\", \"Install skills to a specific directory\")\n\t.action(async (options, cmd) => {\n\t\tconst globalOptions = getGlobalOptions(cmd);\n\t\tawait install(\n\t\t\t{\n\t\t\t\tfrozenLockfile: options.frozenLockfile,\n\t\t\t\tdir: options.dir,\n\t\t\t},\n\t\t\tglobalOptions,\n\t\t);\n\t});\n\nprogram\n\t.command(\"update\")\n\t.description(\"Update all skills to latest compatible versions\")\n\t.option(\"--dry-run\", \"Show what would be updated without making changes\")\n\t.action(async (options, cmd) => {\n\t\tconst globalOptions = getGlobalOptions(cmd);\n\t\tawait update({ dryRun: options.dryRun }, globalOptions);\n\t});\n\n// =============================================================================\n// Publishing commands\n// =============================================================================\n\nprogram\n\t.command(\"publish\")\n\t.description(\"Publish current directory as a skill\")\n\t.option(\"--bump <level>\", \"Bump version (major, minor, patch)\")\n\t.option(\"--tag <tag>\", \"Tag for the release\")\n\t.action(async (options, cmd) => {\n\t\tconst globalOptions = getGlobalOptions(cmd);\n\t\tawait publish(\n\t\t\t{\n\t\t\t\tbump: options.bump as \"major\" | \"minor\" | \"patch\" | undefined,\n\t\t\t\ttag: options.tag,\n\t\t\t},\n\t\t\tglobalOptions,\n\t\t);\n\t});\n\nprogram\n\t.command(\"unpublish <specifier>\")\n\t.description(\"Remove a published skill version\")\n\t.option(\"--force\", \"Confirm destructive action\")\n\t.action(async (specifier, options, cmd) => {\n\t\tconst globalOptions = getGlobalOptions(cmd);\n\t\tawait unpublish(specifier, { force: options.force }, globalOptions);\n\t});\n\nprogram.parse();\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../packages/shared/pspm-types/src/integrity.ts","../../../packages/shared/pspm-types/src/specifier.ts","../../../packages/shared/pspm-types/src/version.ts","../../../packages/sdk/src/fetchers/cli-fetcher.ts","../../../packages/sdk/src/generated/fetch/index.ts","../src/api-client.ts","../src/errors.ts","../src/config.ts","../src/lockfile.ts","../src/commands/add.ts","../src/commands/config/init.ts","../src/commands/config/show.ts","../src/commands/install.ts","../src/commands/list.ts","../src/commands/login.ts","../src/commands/logout.ts","../src/commands/publish.ts","../src/commands/remove.ts","../src/commands/unpublish.ts","../src/commands/update.ts","../src/commands/whoami.ts","../src/index.ts"],"names":["version","configure","config","readFile","mkdir","dirname","writeFile","join","exec","promisify","stat","createHash","rm","exchangeCliToken","execCb","packageJson","semver","match","__dirname"],"mappings":"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","file":"index.js","sourcesContent":["import { createHash } from \"node:crypto\";\n\n/**\n * Calculate integrity hash for a buffer.\n * Uses SHA-256 with base64 encoding, prefixed with \"sha256-\".\n *\n * @param data - The buffer to hash\n * @returns Integrity string (e.g., \"sha256-abc123...\")\n */\nexport function calculateIntegrity(data: Buffer): string {\n\tconst hash = createHash(\"sha256\").update(data).digest(\"base64\");\n\treturn `sha256-${hash}`;\n}\n\n/**\n * Verify that a buffer matches an expected integrity hash.\n *\n * @param data - The buffer to verify\n * @param expectedIntegrity - The expected integrity string\n * @returns True if the integrity matches\n */\nexport function verifyIntegrity(\n\tdata: Buffer,\n\texpectedIntegrity: string,\n): boolean {\n\tconst match = expectedIntegrity.match(/^sha256-(.+)$/);\n\tif (!match) {\n\t\treturn false;\n\t}\n\n\tconst actualHash = createHash(\"sha256\").update(data).digest(\"base64\");\n\treturn actualHash === match[1];\n}\n","/**\n * Parsed skill specifier (from CLI input)\n * e.g., \"@user/bsheng/vite_slides@^2.0.0\"\n */\nexport interface SkillSpecifier {\n\tusername: string;\n\tname: string;\n\tversionRange?: string;\n}\n\n/**\n * Skill specifier regex pattern\n * Matches: @user/{username}/{name}[@{version}]\n */\nconst SPECIFIER_PATTERN =\n\t/^@user\\/([a-zA-Z0-9_-]+)\\/([a-z][a-z0-9_-]*)(?:@(.+))?$/;\n\n/**\n * Parse a skill specifier string.\n *\n * @param specifier - The specifier string (e.g., \"@user/bsheng/vite_slides@^2.0.0\")\n * @returns Parsed specifier or null if invalid\n *\n * @example\n * ```typescript\n * parseSkillSpecifier(\"@user/bsheng/my-skill@^1.0.0\")\n * // => { username: \"bsheng\", name: \"my-skill\", versionRange: \"^1.0.0\" }\n *\n * parseSkillSpecifier(\"@user/bsheng/my-skill\")\n * // => { username: \"bsheng\", name: \"my-skill\", versionRange: undefined }\n * ```\n */\nexport function parseSkillSpecifier(specifier: string): SkillSpecifier | null {\n\tconst match = specifier.match(SPECIFIER_PATTERN);\n\n\tif (!match) {\n\t\treturn null;\n\t}\n\n\treturn {\n\t\tusername: match[1],\n\t\tname: match[2],\n\t\tversionRange: match[3],\n\t};\n}\n\n/**\n * Generate a full skill identifier string.\n *\n * @param username - The owner's username\n * @param name - The skill name\n * @param version - Optional version string\n * @returns Full identifier (e.g., \"@user/bsheng/my-skill@1.0.0\")\n */\nexport function generateSkillIdentifier(\n\tusername: string,\n\tname: string,\n\tversion?: string,\n): string {\n\tconst base = `@user/${username}/${name}`;\n\treturn version ? `${base}@${version}` : base;\n}\n","import * as semver from \"semver\";\n\n/**\n * Resolve the best matching version from a list of available versions.\n *\n * @param range - The version range to match (e.g., \"^1.0.0\", \"~2.1.0\", \"*\")\n * @param availableVersions - List of available version strings\n * @returns The best matching version or null if none found\n */\nexport function resolveVersion(\n\trange: string,\n\tavailableVersions: string[],\n): string | null {\n\tconst sorted = availableVersions\n\t\t.filter((v) => semver.valid(v))\n\t\t.sort((a, b) => semver.rcompare(a, b));\n\n\tif (!range || range === \"latest\" || range === \"*\") {\n\t\treturn sorted[0] ?? null;\n\t}\n\n\treturn semver.maxSatisfying(sorted, range);\n}\n\n/**\n * Check if a version satisfies a given range.\n */\nexport function versionSatisfies(version: string, range: string): boolean {\n\treturn semver.satisfies(version, range);\n}\n\n/**\n * Normalize a version range string.\n * Converts \"latest\" or empty to \"*\".\n */\nexport function normalizeVersionRange(range?: string): string {\n\tif (!range || range === \"latest\") {\n\t\treturn \"*\";\n\t}\n\treturn range;\n}\n\n/**\n * Compare two versions.\n * Returns: -1 if a < b, 0 if a === b, 1 if a > b\n */\nexport function compareVersions(a: string, b: string): number {\n\treturn semver.compare(a, b);\n}\n\n/**\n * Check if version a is greater than version b.\n */\nexport function isNewerVersion(a: string, b: string): boolean {\n\treturn semver.gt(a, b);\n}\n\n/**\n * Get the latest version from a list.\n */\nexport function getLatestVersion(versions: string[]): string | null {\n\tconst valid = versions.filter((v) => semver.valid(v));\n\tif (valid.length === 0) return null;\n\treturn valid.sort((a, b) => semver.rcompare(a, b))[0];\n}\n","/**\n * Custom fetch wrapper for Orval-generated SDK\n *\n * Handles authentication and base URL configuration.\n */\n\nexport interface SDKConfig {\n\tbaseUrl: string;\n\tapiKey: string;\n}\n\nlet config: SDKConfig | null = null;\n\n/**\n * Configure the SDK with base URL and API key.\n * Must be called before making any API requests.\n *\n * @example\n * ```typescript\n * import { configure } from \"@repo/sdk\";\n *\n * configure({\n * baseUrl: \"http://localhost:5600\",\n * apiKey: \"your-api-key\"\n * });\n * ```\n */\nexport function configure(options: SDKConfig): void {\n\tconfig = options;\n}\n\n/**\n * Get the current SDK configuration.\n * @throws Error if not configured\n */\nexport function getConfig(): SDKConfig {\n\tif (!config) {\n\t\tthrow new Error(\"SDK not configured. Call configure() first.\");\n\t}\n\treturn config;\n}\n\n/**\n * Check if the SDK is configured.\n */\nexport function isConfigured(): boolean {\n\treturn config !== null;\n}\n\n/**\n * Error class for SDK API errors\n */\nexport class SDKError extends Error {\n\tconstructor(\n\t\tmessage: string,\n\t\tpublic readonly status: number,\n\t\tpublic readonly body?: string,\n\t) {\n\t\tsuper(message);\n\t\tthis.name = \"SDKError\";\n\t}\n}\n\n/**\n * Response structure returned by all SDK functions\n */\nexport interface SDKResponse<T> {\n\tdata: T;\n\tstatus: number;\n\theaders: Headers;\n}\n\n/**\n * Custom fetch function for Orval\n *\n * This is used by all generated API functions to make HTTP requests.\n * It handles authentication, error handling, and response parsing.\n *\n * Returns { data, status, headers } structure expected by Orval v8.\n */\nexport async function customFetch<T>(\n\turl: string,\n\toptions: RequestInit,\n): Promise<T> {\n\tconst { baseUrl, apiKey } = getConfig();\n\n\t// The URL from Orval will be like \"/api/skills/me\"\n\t// We need to prepend the baseUrl\n\tconst fullUrl = `${baseUrl}${url}`;\n\n\tconst response = await fetch(fullUrl, {\n\t\t...options,\n\t\theaders: {\n\t\t\t...options.headers,\n\t\t\tAuthorization: `Bearer ${apiKey}`,\n\t\t\t\"Content-Type\": \"application/json\",\n\t\t},\n\t});\n\n\tconst text = await response.text();\n\tlet data: unknown = null;\n\n\tif (text) {\n\t\ttry {\n\t\t\tdata = JSON.parse(text);\n\t\t} catch {\n\t\t\tdata = text;\n\t\t}\n\t}\n\n\t// Return the structure expected by Orval v8: { data, status, headers }\n\treturn {\n\t\tdata,\n\t\tstatus: response.status,\n\t\theaders: response.headers,\n\t} as T;\n}\n","/**\n * Generated by orval v8.0.2 🍺\n * Do not edit manually.\n * PSPM API\n * Backend API for PSPM - Private Skill Package Manager for Claude Code\n * OpenAPI spec version: 1.0.0\n */\nimport { customFetch } from '../../fetchers/cli-fetcher';\n/**\n * API key record (without the key value)\n */\nexport interface ApiKey {\n id: string;\n name: string;\n keyPrefix: string;\n userId: string;\n expiresAt: string | null;\n lastUsedAt: string | null;\n createdAt: string | null;\n}\n\nexport type ApiKeyListResponse = ApiKey[];\n\nexport type Item = {\n path: (string | number)[];\n message: string;\n};\n\nexport type ApiErrorCode = typeof ApiErrorCode[keyof typeof ApiErrorCode];\n\n\nexport const ApiErrorCode = {\n BAD_REQUEST: 'BAD_REQUEST',\n UNAUTHORIZED: 'UNAUTHORIZED',\n FORBIDDEN: 'FORBIDDEN',\n NOT_FOUND: 'NOT_FOUND',\n CONFLICT: 'CONFLICT',\n VALIDATION_ERROR: 'VALIDATION_ERROR',\n INTERNAL_ERROR: 'INTERNAL_ERROR',\n} as const;\n\nexport type ApiErrorDetails = {[key: string]: unknown | null};\n\nexport interface ApiError {\n code: ApiErrorCode;\n message: string;\n details?: ApiErrorDetails;\n requestId?: string;\n timestamp: string;\n}\n\nexport type ValidationError = ApiError & {\n code?: 'VALIDATION_ERROR';\n details: {\n issues: Item[];\n};\n};\n\n/**\n * Created API key with the plain key (only shown once)\n */\nexport interface CreateApiKeyResponse {\n apiKey: ApiKey;\n plainKey: string;\n}\n\n/**\n * Input for creating a new API key\n */\nexport interface CreateApiKeyInput {\n /**\n * @minLength 1\n * @maxLength 100\n */\n name: string;\n expiresAt?: string | null;\n}\n\nexport interface SuccessResponse {\n success: boolean;\n}\n\nexport interface DeleteApiKeyInput {\n id: string;\n}\n\nexport interface UpdateApiKeyInput {\n id: string;\n /**\n * @minLength 1\n * @maxLength 100\n */\n name: string;\n}\n\nexport interface CreateCliTokenResponse {\n token: string;\n}\n\nexport interface CreateCliTokenInput {\n /** @minLength 1 */\n state: string;\n /** @minLength 1 */\n port: string;\n}\n\nexport interface ExchangeCliTokenResponse {\n apiKey: string;\n username: string;\n}\n\nexport interface ExchangeCliTokenInput {\n /** @minLength 1 */\n token: string;\n}\n\n/**\n * User's username information\n */\nexport interface UsernameInfo {\n username: string | null;\n canChange: boolean;\n usernameChangedAt: string | null;\n}\n\nexport interface CheckUsernameOutput {\n available: boolean;\n error: string | null;\n}\n\nexport interface UpdateUsernameOutput {\n success: boolean;\n username: string | null;\n error: string | null;\n}\n\nexport interface UpdateUsernameInput {\n /**\n * @minLength 3\n * @maxLength 39\n */\n username: string;\n}\n\nexport interface GetSuggestionsOutput {\n suggestions: string[];\n}\n\n/**\n * Current user info\n */\nexport type MeResponseData = {\n userId: string;\n username: string;\n} | null\n\n/**\n * Skill metadata\n */\nexport interface Skill {\n id: string;\n name: string;\n userId: string;\n description: string | null;\n createdAt: string | null;\n updatedAt: string | null;\n}\n\n/**\n * Skill metadata with owner username\n */\nexport type SkillWithUser = Skill & {\n username: string;\n};\n\n/**\n * List of skills\n */\nexport type SkillListResponse = SkillWithUser[];\n\n/**\n * User's username\n * @minLength 1\n * @maxLength 50\n * @pattern ^[a-zA-Z0-9_-]+$\n */\nexport type Username = string;\n\n/**\n * Skill name identifier\n * @minLength 1\n * @maxLength 100\n * @pattern ^[a-z][a-z0-9-]*$\n */\nexport type SkillName = string;\n\n/**\n * Semantic version string (e.g., 1.0.0)\n */\nexport type Semver = string;\n\nexport type PspmMetadataType = typeof PspmMetadataType[keyof typeof PspmMetadataType];\n\n\nexport const PspmMetadataType = {\n skill: 'skill',\n} as const;\n\nexport type PspmMetadataRequirements = {\n claude?: string;\n node?: string;\n};\n\n/**\n * PSPM-specific metadata for the skill package\n */\nexport interface PspmMetadata {\n type: PspmMetadataType;\n capabilities?: string[];\n requirements?: PspmMetadataRequirements;\n}\n\n/**\n * Skill package manifest (package.json)\n */\nexport interface SkillManifest {\n name: SkillName;\n version: Semver;\n /** @maxLength 500 */\n description?: string;\n files?: string[];\n pspm?: PspmMetadata;\n}\n\n/**\n * Skill version metadata\n */\nexport interface SkillVersion {\n id: string;\n skillId: string;\n version: string;\n r2Key: string;\n checksum: string;\n manifest: SkillManifest;\n publishedAt: string | null;\n}\n\n/**\n * Skill version metadata with download URL\n */\nexport type SkillVersionWithDownload = SkillVersion & {\n downloadUrl: string;\n} | null;\n\n/**\n * Published skill with version info\n */\nexport interface PublishSkillResponse {\n skill: SkillWithUser;\n version: SkillVersion;\n}\n\n/**\n * Input for publishing a skill\n */\nexport interface PublishSkillInput {\n manifest: SkillManifest;\n /** @maxLength 73400320 */\n tarballBase64: string;\n}\n\nexport type CapturedErrorSource = typeof CapturedErrorSource[keyof typeof CapturedErrorSource];\n\n\nexport const CapturedErrorSource = {\n hydration: 'hydration',\n loader: 'loader',\n action: 'action',\n render: 'render',\n streaming: 'streaming',\n network: 'network',\n global: 'global',\n unknown: 'unknown',\n} as const;\n\nexport type CapturedErrorSeverity = typeof CapturedErrorSeverity[keyof typeof CapturedErrorSeverity];\n\n\nexport const CapturedErrorSeverity = {\n fatal: 'fatal',\n error: 'error',\n warning: 'warning',\n info: 'info',\n} as const;\n\nexport type CapturedErrorContext = {[key: string]: unknown | null};\n\n/**\n * A captured client error\n */\nexport interface CapturedError {\n id: string;\n message: string;\n stack?: string;\n componentStack?: string;\n source: CapturedErrorSource;\n severity: CapturedErrorSeverity;\n route?: string;\n timestamp: number;\n context?: CapturedErrorContext;\n digest?: string;\n}\n\n/**\n * Payload for reporting client errors\n */\nexport interface ErrorReportPayload {\n errors: CapturedError[];\n userAgent: string;\n url: string;\n timestamp: number;\n}\n\nexport type CheckUsernameAvailabilityParams = {\n/**\n * @minLength 3\n * @maxLength 39\n */\nusername: string;\n};\n\n/**\n * Retrieve all API keys for the authenticated user\n * @summary List all API keys\n */\nexport type listApiKeysResponse200 = {\n data: ApiKeyListResponse\n status: 200\n}\n\nexport type listApiKeysResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type listApiKeysResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type listApiKeysResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type listApiKeysResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type listApiKeysResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type listApiKeysResponseSuccess = (listApiKeysResponse200) & {\n headers: Headers;\n};\nexport type listApiKeysResponseError = (listApiKeysResponse400 | listApiKeysResponse401 | listApiKeysResponse403 | listApiKeysResponse404 | listApiKeysResponse500) & {\n headers: Headers;\n};\n\nexport type listApiKeysResponse = (listApiKeysResponseSuccess | listApiKeysResponseError)\n\nexport const getListApiKeysUrl = () => {\n\n\n \n\n return `/api/api-keys/api-keys`\n}\n\nexport const listApiKeys = async ( options?: RequestInit): Promise<listApiKeysResponse> => {\n \n return customFetch<listApiKeysResponse>(getListApiKeysUrl(),\n { \n ...options,\n method: 'GET'\n \n \n }\n);}\n\n\n\n/**\n * Create a new API key with optional expiration\n * @summary Create a new API key\n */\nexport type createApiKeyResponse200 = {\n data: CreateApiKeyResponse\n status: 200\n}\n\nexport type createApiKeyResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type createApiKeyResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type createApiKeyResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type createApiKeyResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type createApiKeyResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type createApiKeyResponseSuccess = (createApiKeyResponse200) & {\n headers: Headers;\n};\nexport type createApiKeyResponseError = (createApiKeyResponse400 | createApiKeyResponse401 | createApiKeyResponse403 | createApiKeyResponse404 | createApiKeyResponse500) & {\n headers: Headers;\n};\n\nexport type createApiKeyResponse = (createApiKeyResponseSuccess | createApiKeyResponseError)\n\nexport const getCreateApiKeyUrl = () => {\n\n\n \n\n return `/api/api-keys/api-keys`\n}\n\nexport const createApiKey = async (createApiKeyInput: CreateApiKeyInput, options?: RequestInit): Promise<createApiKeyResponse> => {\n \n return customFetch<createApiKeyResponse>(getCreateApiKeyUrl(),\n { \n ...options,\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...options?.headers },\n body: JSON.stringify(\n createApiKeyInput,)\n }\n);}\n\n\n\n/**\n * Revoke and delete an API key\n * @summary Delete an API key\n */\nexport type deleteApiKeyResponse200 = {\n data: SuccessResponse\n status: 200\n}\n\nexport type deleteApiKeyResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type deleteApiKeyResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type deleteApiKeyResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type deleteApiKeyResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type deleteApiKeyResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type deleteApiKeyResponseSuccess = (deleteApiKeyResponse200) & {\n headers: Headers;\n};\nexport type deleteApiKeyResponseError = (deleteApiKeyResponse400 | deleteApiKeyResponse401 | deleteApiKeyResponse403 | deleteApiKeyResponse404 | deleteApiKeyResponse500) & {\n headers: Headers;\n};\n\nexport type deleteApiKeyResponse = (deleteApiKeyResponseSuccess | deleteApiKeyResponseError)\n\nexport const getDeleteApiKeyUrl = () => {\n\n\n \n\n return `/api/api-keys/api-keys`\n}\n\nexport const deleteApiKey = async (deleteApiKeyInput: DeleteApiKeyInput, options?: RequestInit): Promise<deleteApiKeyResponse> => {\n \n return customFetch<deleteApiKeyResponse>(getDeleteApiKeyUrl(),\n { \n ...options,\n method: 'DELETE',\n headers: { 'Content-Type': 'application/json', ...options?.headers },\n body: JSON.stringify(\n deleteApiKeyInput,)\n }\n);}\n\n\n\n/**\n * Update the name/description of an API key\n * @summary Update API key name\n */\nexport type updateApiKeyNameResponse200 = {\n data: ApiKey\n status: 200\n}\n\nexport type updateApiKeyNameResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type updateApiKeyNameResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type updateApiKeyNameResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type updateApiKeyNameResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type updateApiKeyNameResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type updateApiKeyNameResponseSuccess = (updateApiKeyNameResponse200) & {\n headers: Headers;\n};\nexport type updateApiKeyNameResponseError = (updateApiKeyNameResponse400 | updateApiKeyNameResponse401 | updateApiKeyNameResponse403 | updateApiKeyNameResponse404 | updateApiKeyNameResponse500) & {\n headers: Headers;\n};\n\nexport type updateApiKeyNameResponse = (updateApiKeyNameResponseSuccess | updateApiKeyNameResponseError)\n\nexport const getUpdateApiKeyNameUrl = () => {\n\n\n \n\n return `/api/api-keys/api-keys`\n}\n\nexport const updateApiKeyName = async (updateApiKeyInput: UpdateApiKeyInput, options?: RequestInit): Promise<updateApiKeyNameResponse> => {\n \n return customFetch<updateApiKeyNameResponse>(getUpdateApiKeyNameUrl(),\n { \n ...options,\n method: 'PUT',\n headers: { 'Content-Type': 'application/json', ...options?.headers },\n body: JSON.stringify(\n updateApiKeyInput,)\n }\n);}\n\n\n\n/**\n * Create a short-lived token for CLI browser-based authentication\n * @summary Create a CLI login token\n */\nexport type createCliTokenResponse200 = {\n data: CreateCliTokenResponse\n status: 200\n}\n\nexport type createCliTokenResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type createCliTokenResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type createCliTokenResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type createCliTokenResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type createCliTokenResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type createCliTokenResponseSuccess = (createCliTokenResponse200) & {\n headers: Headers;\n};\nexport type createCliTokenResponseError = (createCliTokenResponse400 | createCliTokenResponse401 | createCliTokenResponse403 | createCliTokenResponse404 | createCliTokenResponse500) & {\n headers: Headers;\n};\n\nexport type createCliTokenResponse = (createCliTokenResponseSuccess | createCliTokenResponseError)\n\nexport const getCreateCliTokenUrl = () => {\n\n\n \n\n return `/api/api-keys/cli-token`\n}\n\nexport const createCliToken = async (createCliTokenInput: CreateCliTokenInput, options?: RequestInit): Promise<createCliTokenResponse> => {\n \n return customFetch<createCliTokenResponse>(getCreateCliTokenUrl(),\n { \n ...options,\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...options?.headers },\n body: JSON.stringify(\n createCliTokenInput,)\n }\n);}\n\n\n\n/**\n * Exchange a CLI login token for an API key (called by CLI after browser redirect)\n * @summary Exchange CLI token for API key\n */\nexport type exchangeCliTokenResponse200 = {\n data: ExchangeCliTokenResponse\n status: 200\n}\n\nexport type exchangeCliTokenResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type exchangeCliTokenResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type exchangeCliTokenResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type exchangeCliTokenResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type exchangeCliTokenResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type exchangeCliTokenResponseSuccess = (exchangeCliTokenResponse200) & {\n headers: Headers;\n};\nexport type exchangeCliTokenResponseError = (exchangeCliTokenResponse400 | exchangeCliTokenResponse401 | exchangeCliTokenResponse403 | exchangeCliTokenResponse404 | exchangeCliTokenResponse500) & {\n headers: Headers;\n};\n\nexport type exchangeCliTokenResponse = (exchangeCliTokenResponseSuccess | exchangeCliTokenResponseError)\n\nexport const getExchangeCliTokenUrl = () => {\n\n\n \n\n return `/api/api-keys/cli-token-exchange`\n}\n\nexport const exchangeCliToken = async (exchangeCliTokenInput: ExchangeCliTokenInput, options?: RequestInit): Promise<exchangeCliTokenResponse> => {\n \n return customFetch<exchangeCliTokenResponse>(getExchangeCliTokenUrl(),\n { \n ...options,\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...options?.headers },\n body: JSON.stringify(\n exchangeCliTokenInput,)\n }\n);}\n\n\n\n/**\n * Get current user's username and whether they can change it\n * @summary Get username info\n */\nexport type getUsernameInfoResponse200 = {\n data: UsernameInfo\n status: 200\n}\n\nexport type getUsernameInfoResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type getUsernameInfoResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type getUsernameInfoResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type getUsernameInfoResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type getUsernameInfoResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type getUsernameInfoResponseSuccess = (getUsernameInfoResponse200) & {\n headers: Headers;\n};\nexport type getUsernameInfoResponseError = (getUsernameInfoResponse400 | getUsernameInfoResponse401 | getUsernameInfoResponse403 | getUsernameInfoResponse404 | getUsernameInfoResponse500) & {\n headers: Headers;\n};\n\nexport type getUsernameInfoResponse = (getUsernameInfoResponseSuccess | getUsernameInfoResponseError)\n\nexport const getGetUsernameInfoUrl = () => {\n\n\n \n\n return `/api/auth/username`\n}\n\nexport const getUsernameInfo = async ( options?: RequestInit): Promise<getUsernameInfoResponse> => {\n \n return customFetch<getUsernameInfoResponse>(getGetUsernameInfoUrl(),\n { \n ...options,\n method: 'GET'\n \n \n }\n);}\n\n\n\n/**\n * Update the current user's username. Can only be done once.\n * @summary Update username\n */\nexport type updateUsernameResponse200 = {\n data: UpdateUsernameOutput\n status: 200\n}\n\nexport type updateUsernameResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type updateUsernameResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type updateUsernameResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type updateUsernameResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type updateUsernameResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type updateUsernameResponseSuccess = (updateUsernameResponse200) & {\n headers: Headers;\n};\nexport type updateUsernameResponseError = (updateUsernameResponse400 | updateUsernameResponse401 | updateUsernameResponse403 | updateUsernameResponse404 | updateUsernameResponse500) & {\n headers: Headers;\n};\n\nexport type updateUsernameResponse = (updateUsernameResponseSuccess | updateUsernameResponseError)\n\nexport const getUpdateUsernameUrl = () => {\n\n\n \n\n return `/api/auth/username`\n}\n\nexport const updateUsername = async (updateUsernameInput: UpdateUsernameInput, options?: RequestInit): Promise<updateUsernameResponse> => {\n \n return customFetch<updateUsernameResponse>(getUpdateUsernameUrl(),\n { \n ...options,\n method: 'PUT',\n headers: { 'Content-Type': 'application/json', ...options?.headers },\n body: JSON.stringify(\n updateUsernameInput,)\n }\n);}\n\n\n\n/**\n * Check if a username is available for use\n * @summary Check username availability\n */\nexport type checkUsernameAvailabilityResponse200 = {\n data: CheckUsernameOutput\n status: 200\n}\n\nexport type checkUsernameAvailabilityResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type checkUsernameAvailabilityResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type checkUsernameAvailabilityResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type checkUsernameAvailabilityResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type checkUsernameAvailabilityResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type checkUsernameAvailabilityResponseSuccess = (checkUsernameAvailabilityResponse200) & {\n headers: Headers;\n};\nexport type checkUsernameAvailabilityResponseError = (checkUsernameAvailabilityResponse400 | checkUsernameAvailabilityResponse401 | checkUsernameAvailabilityResponse403 | checkUsernameAvailabilityResponse404 | checkUsernameAvailabilityResponse500) & {\n headers: Headers;\n};\n\nexport type checkUsernameAvailabilityResponse = (checkUsernameAvailabilityResponseSuccess | checkUsernameAvailabilityResponseError)\n\nexport const getCheckUsernameAvailabilityUrl = (params: CheckUsernameAvailabilityParams,) => {\n const normalizedParams = new URLSearchParams();\n\n Object.entries(params || {}).forEach(([key, value]) => {\n \n if (value !== undefined) {\n normalizedParams.append(key, value === null ? 'null' : value.toString())\n }\n });\n\n const stringifiedParams = normalizedParams.toString();\n\n return stringifiedParams.length > 0 ? `/api/auth/username/check?${stringifiedParams}` : `/api/auth/username/check`\n}\n\nexport const checkUsernameAvailability = async (params: CheckUsernameAvailabilityParams, options?: RequestInit): Promise<checkUsernameAvailabilityResponse> => {\n \n return customFetch<checkUsernameAvailabilityResponse>(getCheckUsernameAvailabilityUrl(params),\n { \n ...options,\n method: 'GET'\n \n \n }\n);}\n\n\n\n/**\n * Get available username suggestions based on user's email and name\n * @summary Get username suggestions\n */\nexport type getUsernameSuggestionsResponse200 = {\n data: GetSuggestionsOutput\n status: 200\n}\n\nexport type getUsernameSuggestionsResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type getUsernameSuggestionsResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type getUsernameSuggestionsResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type getUsernameSuggestionsResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type getUsernameSuggestionsResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type getUsernameSuggestionsResponseSuccess = (getUsernameSuggestionsResponse200) & {\n headers: Headers;\n};\nexport type getUsernameSuggestionsResponseError = (getUsernameSuggestionsResponse400 | getUsernameSuggestionsResponse401 | getUsernameSuggestionsResponse403 | getUsernameSuggestionsResponse404 | getUsernameSuggestionsResponse500) & {\n headers: Headers;\n};\n\nexport type getUsernameSuggestionsResponse = (getUsernameSuggestionsResponseSuccess | getUsernameSuggestionsResponseError)\n\nexport const getGetUsernameSuggestionsUrl = () => {\n\n\n \n\n return `/api/auth/username/suggestions`\n}\n\nexport const getUsernameSuggestions = async ( options?: RequestInit): Promise<getUsernameSuggestionsResponse> => {\n \n return customFetch<getUsernameSuggestionsResponse>(getGetUsernameSuggestionsUrl(),\n { \n ...options,\n method: 'GET'\n \n \n }\n);}\n\n\n\n/**\n * Get the current authenticated user's info\n * @summary Get current user\n */\nexport type meResponse200 = {\n data: MeResponseData | null\n status: 200\n}\n\nexport type meResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type meResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type meResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type meResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type meResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type meResponseSuccess = (meResponse200) & {\n headers: Headers;\n};\nexport type meResponseError = (meResponse400 | meResponse401 | meResponse403 | meResponse404 | meResponse500) & {\n headers: Headers;\n};\n\nexport type meResponse = (meResponseSuccess | meResponseError)\n\nexport const getMeUrl = () => {\n\n\n \n\n return `/api/skills/me`\n}\n\nexport const me = async ( options?: RequestInit): Promise<meResponse> => {\n \n return customFetch<meResponse>(getMeUrl(),\n { \n ...options,\n method: 'GET'\n \n \n }\n);}\n\n\n\n/**\n * List all skills owned by the authenticated user\n * @summary List my skills\n */\nexport type listMySkillsResponse200 = {\n data: SkillListResponse\n status: 200\n}\n\nexport type listMySkillsResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type listMySkillsResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type listMySkillsResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type listMySkillsResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type listMySkillsResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type listMySkillsResponseSuccess = (listMySkillsResponse200) & {\n headers: Headers;\n};\nexport type listMySkillsResponseError = (listMySkillsResponse400 | listMySkillsResponse401 | listMySkillsResponse403 | listMySkillsResponse404 | listMySkillsResponse500) & {\n headers: Headers;\n};\n\nexport type listMySkillsResponse = (listMySkillsResponseSuccess | listMySkillsResponseError)\n\nexport const getListMySkillsUrl = () => {\n\n\n \n\n return `/api/skills`\n}\n\nexport const listMySkills = async ( options?: RequestInit): Promise<listMySkillsResponse> => {\n \n return customFetch<listMySkillsResponse>(getListMySkillsUrl(),\n { \n ...options,\n method: 'GET'\n \n \n }\n);}\n\n\n\n/**\n * List all skills for a specific user\n * @summary List user skills\n */\nexport type listUserSkillsResponse200 = {\n data: SkillListResponse\n status: 200\n}\n\nexport type listUserSkillsResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type listUserSkillsResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type listUserSkillsResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type listUserSkillsResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type listUserSkillsResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type listUserSkillsResponseSuccess = (listUserSkillsResponse200) & {\n headers: Headers;\n};\nexport type listUserSkillsResponseError = (listUserSkillsResponse400 | listUserSkillsResponse401 | listUserSkillsResponse403 | listUserSkillsResponse404 | listUserSkillsResponse500) & {\n headers: Headers;\n};\n\nexport type listUserSkillsResponse = (listUserSkillsResponseSuccess | listUserSkillsResponseError)\n\nexport const getListUserSkillsUrl = (username: Username,) => {\n\n\n \n\n return `/api/skills/@user/${username}`\n}\n\nexport const listUserSkills = async (username: Username, options?: RequestInit): Promise<listUserSkillsResponse> => {\n \n return customFetch<listUserSkillsResponse>(getListUserSkillsUrl(username),\n { \n ...options,\n method: 'GET'\n \n \n }\n);}\n\n\n\n/**\n * Get a specific skill by username and name\n * @summary Get skill\n */\nexport type getSkillResponse200 = {\n data: SkillWithUser\n status: 200\n}\n\nexport type getSkillResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type getSkillResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type getSkillResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type getSkillResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type getSkillResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type getSkillResponseSuccess = (getSkillResponse200) & {\n headers: Headers;\n};\nexport type getSkillResponseError = (getSkillResponse400 | getSkillResponse401 | getSkillResponse403 | getSkillResponse404 | getSkillResponse500) & {\n headers: Headers;\n};\n\nexport type getSkillResponse = (getSkillResponseSuccess | getSkillResponseError)\n\nexport const getGetSkillUrl = (username: Username,\n name: SkillName,) => {\n\n\n \n\n return `/api/skills/@user/${username}/${name}`\n}\n\nexport const getSkill = async (username: Username,\n name: SkillName, options?: RequestInit): Promise<getSkillResponse> => {\n \n return customFetch<getSkillResponse>(getGetSkillUrl(username,name),\n { \n ...options,\n method: 'GET'\n \n \n }\n);}\n\n\n\n/**\n * List all versions for a specific skill\n * @summary List skill versions\n */\nexport type listSkillVersionsResponse200 = {\n data: SkillVersion[]\n status: 200\n}\n\nexport type listSkillVersionsResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type listSkillVersionsResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type listSkillVersionsResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type listSkillVersionsResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type listSkillVersionsResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type listSkillVersionsResponseSuccess = (listSkillVersionsResponse200) & {\n headers: Headers;\n};\nexport type listSkillVersionsResponseError = (listSkillVersionsResponse400 | listSkillVersionsResponse401 | listSkillVersionsResponse403 | listSkillVersionsResponse404 | listSkillVersionsResponse500) & {\n headers: Headers;\n};\n\nexport type listSkillVersionsResponse = (listSkillVersionsResponseSuccess | listSkillVersionsResponseError)\n\nexport const getListSkillVersionsUrl = (username: Username,\n name: SkillName,) => {\n\n\n \n\n return `/api/skills/@user/${username}/${name}/versions`\n}\n\nexport const listSkillVersions = async (username: Username,\n name: SkillName, options?: RequestInit): Promise<listSkillVersionsResponse> => {\n \n return customFetch<listSkillVersionsResponse>(getListSkillVersionsUrl(username,name),\n { \n ...options,\n method: 'GET'\n \n \n }\n);}\n\n\n\n/**\n * Get metadata for a specific skill version\n * @summary Get skill version\n */\nexport type getSkillVersionResponse200 = {\n data: SkillVersionWithDownload\n status: 200\n}\n\nexport type getSkillVersionResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type getSkillVersionResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type getSkillVersionResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type getSkillVersionResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type getSkillVersionResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type getSkillVersionResponseSuccess = (getSkillVersionResponse200) & {\n headers: Headers;\n};\nexport type getSkillVersionResponseError = (getSkillVersionResponse400 | getSkillVersionResponse401 | getSkillVersionResponse403 | getSkillVersionResponse404 | getSkillVersionResponse500) & {\n headers: Headers;\n};\n\nexport type getSkillVersionResponse = (getSkillVersionResponseSuccess | getSkillVersionResponseError)\n\nexport const getGetSkillVersionUrl = (username: Username,\n name: SkillName,\n version: Semver,) => {\n\n\n \n\n return `/api/skills/@user/${username}/${name}/${version}`\n}\n\nexport const getSkillVersion = async (username: Username,\n name: SkillName,\n version: Semver, options?: RequestInit): Promise<getSkillVersionResponse> => {\n \n return customFetch<getSkillVersionResponse>(getGetSkillVersionUrl(username,name,version),\n { \n ...options,\n method: 'GET'\n \n \n }\n);}\n\n\n\n/**\n * Publish a new skill or a new version of an existing skill\n * @summary Publish skill\n */\nexport type publishSkillResponse200 = {\n data: PublishSkillResponse\n status: 200\n}\n\nexport type publishSkillResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type publishSkillResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type publishSkillResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type publishSkillResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type publishSkillResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type publishSkillResponseSuccess = (publishSkillResponse200) & {\n headers: Headers;\n};\nexport type publishSkillResponseError = (publishSkillResponse400 | publishSkillResponse401 | publishSkillResponse403 | publishSkillResponse404 | publishSkillResponse500) & {\n headers: Headers;\n};\n\nexport type publishSkillResponse = (publishSkillResponseSuccess | publishSkillResponseError)\n\nexport const getPublishSkillUrl = () => {\n\n\n \n\n return `/api/skills/publish`\n}\n\nexport const publishSkill = async (publishSkillInput: PublishSkillInput, options?: RequestInit): Promise<publishSkillResponse> => {\n \n return customFetch<publishSkillResponse>(getPublishSkillUrl(),\n { \n ...options,\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...options?.headers },\n body: JSON.stringify(\n publishSkillInput,)\n }\n);}\n\n\n\n/**\n * Delete a skill and all its versions (owner only)\n * @summary Delete skill\n */\nexport type deleteSkillResponse200 = {\n data: SuccessResponse & unknown\n status: 200\n}\n\nexport type deleteSkillResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type deleteSkillResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type deleteSkillResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type deleteSkillResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type deleteSkillResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type deleteSkillResponseSuccess = (deleteSkillResponse200) & {\n headers: Headers;\n};\nexport type deleteSkillResponseError = (deleteSkillResponse400 | deleteSkillResponse401 | deleteSkillResponse403 | deleteSkillResponse404 | deleteSkillResponse500) & {\n headers: Headers;\n};\n\nexport type deleteSkillResponse = (deleteSkillResponseSuccess | deleteSkillResponseError)\n\nexport const getDeleteSkillUrl = (name: SkillName,) => {\n\n\n \n\n return `/api/skills/${name}`\n}\n\nexport const deleteSkill = async (name: SkillName, options?: RequestInit): Promise<deleteSkillResponse> => {\n \n return customFetch<deleteSkillResponse>(getDeleteSkillUrl(name),\n { \n ...options,\n method: 'DELETE'\n \n \n }\n);}\n\n\n\n/**\n * Delete a specific version of a skill (owner only)\n * @summary Delete skill version\n */\nexport type deleteSkillVersionResponse200 = {\n data: SuccessResponse & unknown\n status: 200\n}\n\nexport type deleteSkillVersionResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type deleteSkillVersionResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type deleteSkillVersionResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type deleteSkillVersionResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type deleteSkillVersionResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type deleteSkillVersionResponseSuccess = (deleteSkillVersionResponse200) & {\n headers: Headers;\n};\nexport type deleteSkillVersionResponseError = (deleteSkillVersionResponse400 | deleteSkillVersionResponse401 | deleteSkillVersionResponse403 | deleteSkillVersionResponse404 | deleteSkillVersionResponse500) & {\n headers: Headers;\n};\n\nexport type deleteSkillVersionResponse = (deleteSkillVersionResponseSuccess | deleteSkillVersionResponseError)\n\nexport const getDeleteSkillVersionUrl = (name: SkillName,\n version: Semver,) => {\n\n\n \n\n return `/api/skills/${name}/${version}`\n}\n\nexport const deleteSkillVersion = async (name: SkillName,\n version: Semver, options?: RequestInit): Promise<deleteSkillVersionResponse> => {\n \n return customFetch<deleteSkillVersionResponse>(getDeleteSkillVersionUrl(name,version),\n { \n ...options,\n method: 'DELETE'\n \n \n }\n);}\n\n\n\n/**\n * Submit client-side errors for logging and monitoring. Used by the frontend error capture service.\n * @summary Report client errors\n */\nexport type reportErrorsResponse200 = {\n data: SuccessResponse\n status: 200\n}\n\nexport type reportErrorsResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type reportErrorsResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type reportErrorsResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type reportErrorsResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type reportErrorsResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type reportErrorsResponseSuccess = (reportErrorsResponse200) & {\n headers: Headers;\n};\nexport type reportErrorsResponseError = (reportErrorsResponse400 | reportErrorsResponse401 | reportErrorsResponse403 | reportErrorsResponse404 | reportErrorsResponse500) & {\n headers: Headers;\n};\n\nexport type reportErrorsResponse = (reportErrorsResponseSuccess | reportErrorsResponseError)\n\nexport const getReportErrorsUrl = () => {\n\n\n \n\n return `/errors/report`\n}\n\nexport const reportErrors = async (errorReportPayload: ErrorReportPayload, options?: RequestInit): Promise<reportErrorsResponse> => {\n \n return customFetch<reportErrorsResponse>(getReportErrorsUrl(),\n { \n ...options,\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...options?.headers },\n body: JSON.stringify(\n errorReportPayload,)\n }\n);}\n","/**\n * API Client for PSPM CLI\n *\n * This module re-exports the SDK functions and provides the\n * initialization logic for the CLI.\n */\n\nimport {\n\tdeleteSkill,\n\tdeleteSkillVersion,\n\texchangeCliToken,\n\tgetConfig,\n\tgetSkill,\n\tgetSkillVersion,\n\tisConfigured,\n\tlistMySkills,\n\tlistSkillVersions,\n\tlistUserSkills,\n\tme,\n\tpublishSkill,\n\ttype SDKConfig,\n\tSDKError,\n\tconfigure as sdkConfigure,\n} from \"@repo/sdk\";\n\n/**\n * Convert a registry URL to the base server URL for the SDK.\n *\n * The CLI stores registry URLs like \"https://pspm.dev\". This function\n * normalizes the URL by removing any trailing /api/skills path if present\n * (for backwards compatibility with older configs).\n */\nfunction registryUrlToBaseUrl(registryUrl: string): string {\n\treturn registryUrl.replace(/\\/api\\/skills\\/?$/, \"\");\n}\n\n/**\n * Configure the SDK with registry URL and API key.\n *\n * This wrapper handles converting the CLI's registry URL format to the\n * base URL format expected by the SDK.\n */\nexport function configure(options: {\n\tregistryUrl: string;\n\tapiKey: string;\n}): void {\n\tconst baseUrl = registryUrlToBaseUrl(options.registryUrl);\n\tsdkConfigure({ baseUrl, apiKey: options.apiKey });\n}\n\n// Re-export SDK functions for convenience\nexport {\n\tdeleteSkill,\n\tdeleteSkillVersion,\n\texchangeCliToken,\n\tgetConfig,\n\tgetSkill,\n\tgetSkillVersion,\n\tisConfigured,\n\tlistMySkills,\n\tlistSkillVersions,\n\tlistUserSkills,\n\tme,\n\tpublishSkill,\n\tSDKError,\n};\n\n// Re-export types\nexport type { SDKConfig };\n\n/**\n * Get user info from the API using the /me endpoint.\n * Returns null if not authenticated.\n */\nexport async function whoamiRequest(\n\tregistryUrl: string,\n\tapiKey: string,\n): Promise<{ username: string; userId: string } | null> {\n\ttry {\n\t\t// Use direct REST endpoints (not oRPC /rpc prefix)\n\t\tconfigure({ registryUrl, apiKey });\n\t\tconst response = await me();\n\t\t// Check for successful response before accessing user data\n\t\tif (response.status !== 200 || !response.data) {\n\t\t\treturn null;\n\t\t}\n\t\tconst user = response.data;\n\t\treturn {\n\t\t\tusername: user.username,\n\t\t\tuserId: user.userId,\n\t\t};\n\t} catch {\n\t\treturn null;\n\t}\n}\n","/**\n * Base error class for PSPM configuration errors\n */\nexport class ConfigError extends Error {\n\tconstructor(message: string) {\n\t\tsuper(message);\n\t\tthis.name = \"ConfigError\";\n\t}\n}\n\n/**\n * Error thrown when the user is not logged in\n */\nexport class NotLoggedInError extends ConfigError {\n\tconstructor() {\n\t\tsuper(\n\t\t\t\"Not logged in. Run 'pspm login --api-key <key>' first, or set PSPM_API_KEY env var.\",\n\t\t);\n\t\tthis.name = \"NotLoggedInError\";\n\t}\n}\n\n/**\n * API error response structure from OpenAPI spec\n */\ninterface ApiErrorResponse {\n\tcode?: string;\n\tmessage?: string;\n\tdetails?:\n\t\t| {\n\t\t\t\tissues?: Array<{ path?: Array<string | number>; message?: string }>;\n\t\t }\n\t\t| Record<string, unknown>;\n\trequestId?: string;\n\ttimestamp?: string;\n}\n\n/**\n * Extract a human-readable error message from an API response\n * Handles both ApiError and ValidationError types\n */\nexport function extractApiErrorMessage(\n\tresponse: { status: number; data: unknown },\n\tfallbackMessage: string,\n): string {\n\tconst errorData = response.data as ApiErrorResponse | null;\n\n\tif (process.env.PSPM_DEBUG) {\n\t\tconsole.log(`[debug] API response status: ${response.status}`);\n\t\tconsole.log(\n\t\t\t`[debug] API response data:`,\n\t\t\tJSON.stringify(errorData, null, 2),\n\t\t);\n\t}\n\n\tif (!errorData) {\n\t\treturn `${fallbackMessage} (HTTP ${response.status})`;\n\t}\n\n\t// Start with the message field or fallback\n\tlet errorMessage = errorData.message || fallbackMessage;\n\n\t// For validation errors, format the issues\n\tif (errorData.code === \"VALIDATION_ERROR\" && errorData.details) {\n\t\tconst issues = (\n\t\t\terrorData.details as {\n\t\t\t\tissues?: Array<{ path?: Array<string | number>; message?: string }>;\n\t\t\t}\n\t\t).issues;\n\t\tif (issues && Array.isArray(issues)) {\n\t\t\tconst issueMessages = issues\n\t\t\t\t.map((issue) => {\n\t\t\t\t\tconst path = issue.path?.join(\".\") || \"input\";\n\t\t\t\t\tconst msg = issue.message || \"invalid value\";\n\t\t\t\t\treturn ` - ${path}: ${msg}`;\n\t\t\t\t})\n\t\t\t\t.join(\"\\n\");\n\t\t\terrorMessage = `Validation failed:\\n${issueMessages}`;\n\t\t}\n\t}\n\n\t// Add error code prefix if available and not already in message\n\tif (errorData.code && !errorMessage.includes(errorData.code)) {\n\t\terrorMessage = `[${errorData.code}] ${errorMessage}`;\n\t}\n\n\t// Add request ID for debugging\n\tif (errorData.requestId) {\n\t\terrorMessage += `\\n(Request ID: ${errorData.requestId})`;\n\t}\n\n\treturn errorMessage;\n}\n","import { mkdir, readFile, stat, unlink, writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport * as ini from \"ini\";\nimport { NotLoggedInError } from \"./errors.js\";\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * User config stored in ~/.pspmrc (INI format)\n */\nexport interface UserConfig {\n\tregistry?: string;\n\tauthToken?: string;\n\tusername?: string;\n}\n\n/**\n * Project config stored in .pspmrc (INI format)\n */\nexport interface ProjectConfig {\n\tregistry?: string;\n}\n\n/**\n * Fully resolved configuration (after cascade)\n */\nexport interface ResolvedConfig {\n\tregistryUrl: string;\n\tapiKey?: string;\n\tusername?: string;\n}\n\n/**\n * Legacy V1 config schema (for migration)\n */\ninterface LegacyConfigV1 {\n\tregistryUrl?: string;\n\tapiKey?: string;\n\tusername?: string;\n}\n\n/**\n * Legacy V2 config schema (for migration)\n */\ninterface LegacyConfigV2 {\n\tversion: 2;\n\tdefaultProfile: string;\n\tprofiles: Record<\n\t\tstring,\n\t\t{\n\t\t\tregistryUrl?: string;\n\t\t\tapiKey?: string;\n\t\t\tusername?: string;\n\t\t}\n\t>;\n}\n\n// =============================================================================\n// Constants\n// =============================================================================\n\nconst DEFAULT_REGISTRY_URL = \"https://pspm.dev\";\n\n/**\n * Get the user config file path (~/.pspmrc)\n */\nexport function getConfigPath(): string {\n\treturn join(homedir(), \".pspmrc\");\n}\n\n/**\n * Get the legacy config file path (~/.pspm/config.json) for migration\n */\nfunction getLegacyConfigPath(): string {\n\treturn join(homedir(), \".pspm\", \"config.json\");\n}\n\n/**\n * Get the skills directory path (for current project)\n */\nexport function getSkillsDir(): string {\n\treturn join(process.cwd(), \".skills\");\n}\n\n/**\n * Get the lockfile path (for current project)\n */\nexport function getLockfilePath(): string {\n\treturn join(process.cwd(), \"skill-lock.json\");\n}\n\n// =============================================================================\n// INI Config Functions\n// =============================================================================\n\n/**\n * Read the user config file (~/.pspmrc, INI format)\n */\nexport async function readUserConfig(): Promise<UserConfig> {\n\tconst configPath = getConfigPath();\n\n\tif (process.env.PSPM_DEBUG) {\n\t\tconsole.log(`[config] Reading config from: ${configPath}`);\n\t}\n\n\ttry {\n\t\tconst content = await readFile(configPath, \"utf-8\");\n\t\tconst parsed = ini.parse(content);\n\n\t\tif (process.env.PSPM_DEBUG) {\n\t\t\tconsole.log(`[config] Parsed config:`, JSON.stringify(parsed, null, 2));\n\t\t}\n\n\t\treturn {\n\t\t\tregistry: parsed.registry as string | undefined,\n\t\t\tauthToken: parsed.authToken as string | undefined,\n\t\t\tusername: parsed.username as string | undefined,\n\t\t};\n\t} catch (error) {\n\t\tif (process.env.PSPM_DEBUG) {\n\t\t\tconsole.log(\n\t\t\t\t`[config] Error reading config: ${\n\t\t\t\t\terror instanceof Error ? error.message : String(error)\n\t\t\t\t}`,\n\t\t\t);\n\t\t}\n\t\treturn {};\n\t}\n}\n\n/**\n * Write the user config file (~/.pspmrc, INI format)\n */\nexport async function writeUserConfig(config: UserConfig): Promise<void> {\n\tconst configPath = getConfigPath();\n\n\t// Build INI content with comments\n\tconst lines: string[] = [\"; PSPM Configuration\", \"\"];\n\n\tif (config.registry) {\n\t\tlines.push(`registry = ${config.registry}`);\n\t}\n\tif (config.authToken) {\n\t\tlines.push(`authToken = ${config.authToken}`);\n\t}\n\tif (config.username) {\n\t\tlines.push(`username = ${config.username}`);\n\t}\n\n\t// Always end with a newline\n\tlines.push(\"\");\n\n\tawait mkdir(dirname(configPath), { recursive: true });\n\tawait writeFile(configPath, lines.join(\"\\n\"));\n\n\tif (process.env.PSPM_DEBUG) {\n\t\tconsole.log(`[config] Wrote config to: ${configPath}`);\n\t}\n}\n\n/**\n * Find and read project config (.pspmrc) by searching up directory tree\n */\nexport async function findProjectConfig(): Promise<ProjectConfig | null> {\n\tlet currentDir = process.cwd();\n\tconst root = dirname(currentDir);\n\n\twhile (currentDir !== root) {\n\t\tconst configPath = join(currentDir, \".pspmrc\");\n\t\ttry {\n\t\t\tconst stats = await stat(configPath);\n\t\t\tif (stats.isFile()) {\n\t\t\t\tconst content = await readFile(configPath, \"utf-8\");\n\t\t\t\t// Try parsing as INI first\n\t\t\t\ttry {\n\t\t\t\t\tconst parsed = ini.parse(content);\n\t\t\t\t\tif (process.env.PSPM_DEBUG) {\n\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t`[config] Found project config at ${configPath}:`,\n\t\t\t\t\t\t\tJSON.stringify(parsed, null, 2),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\treturn {\n\t\t\t\t\t\tregistry: parsed.registry as string | undefined,\n\t\t\t\t\t};\n\t\t\t\t} catch {\n\t\t\t\t\t// Fall back to JSON for backward compatibility during migration\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst jsonConfig = JSON.parse(content);\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tregistry: jsonConfig.registryUrl,\n\t\t\t\t\t\t};\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// Unparseable, skip\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {\n\t\t\t// File doesn't exist, continue searching\n\t\t}\n\t\tcurrentDir = dirname(currentDir);\n\t}\n\n\treturn null;\n}\n\n/**\n * Migrate from legacy config format (~/.pspm/config.json) if it exists\n */\nasync function migrateFromLegacyConfig(): Promise<UserConfig | null> {\n\tconst legacyPath = getLegacyConfigPath();\n\n\ttry {\n\t\tconst content = await readFile(legacyPath, \"utf-8\");\n\t\tconst parsed = JSON.parse(content);\n\n\t\tlet config: UserConfig = {};\n\n\t\t// Check if V2 format (with profiles)\n\t\tif (parsed.version === 2 && parsed.profiles) {\n\t\t\tconst v2Config = parsed as LegacyConfigV2;\n\t\t\tconst defaultProfileName = v2Config.defaultProfile || \"default\";\n\t\t\tconst profile = v2Config.profiles[defaultProfileName];\n\n\t\t\tif (profile) {\n\t\t\t\tconfig = {\n\t\t\t\t\tregistry:\n\t\t\t\t\t\tprofile.registryUrl !== DEFAULT_REGISTRY_URL\n\t\t\t\t\t\t\t? profile.registryUrl\n\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\tauthToken: profile.apiKey,\n\t\t\t\t\tusername: profile.username,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconsole.log(\n\t\t\t\t`Migrating from legacy config (profile: ${defaultProfileName})...`,\n\t\t\t);\n\t\t} else {\n\t\t\t// V1 format (flat)\n\t\t\tconst v1Config = parsed as LegacyConfigV1;\n\t\t\tconfig = {\n\t\t\t\tregistry:\n\t\t\t\t\tv1Config.registryUrl !== DEFAULT_REGISTRY_URL\n\t\t\t\t\t\t? v1Config.registryUrl\n\t\t\t\t\t\t: undefined,\n\t\t\t\tauthToken: v1Config.apiKey,\n\t\t\t\tusername: v1Config.username,\n\t\t\t};\n\n\t\t\tconsole.log(\"Migrating from legacy config...\");\n\t\t}\n\n\t\t// Write new format\n\t\tawait writeUserConfig(config);\n\t\tconsole.log(`Created new config at: ${getConfigPath()}`);\n\n\t\t// Remove old config directory\n\t\tawait unlink(legacyPath);\n\t\tconsole.log(`Removed legacy config: ${legacyPath}`);\n\n\t\treturn config;\n\t} catch {\n\t\t// Legacy config doesn't exist or couldn't be read\n\t\treturn null;\n\t}\n}\n\n/**\n * Resolve the full configuration using cascade priority:\n * 1. Environment variables (PSPM_REGISTRY_URL, PSPM_API_KEY)\n * 2. Project config (.pspmrc in project directory)\n * 3. User config (~/.pspmrc)\n * 4. Defaults\n */\nexport async function resolveConfig(): Promise<ResolvedConfig> {\n\t// Check for legacy config and migrate if needed\n\tconst newConfigPath = getConfigPath();\n\ttry {\n\t\tawait stat(newConfigPath);\n\t} catch {\n\t\t// New config doesn't exist, try migrating from legacy\n\t\tawait migrateFromLegacyConfig();\n\t}\n\n\tconst userConfig = await readUserConfig();\n\tconst projectConfig = await findProjectConfig();\n\n\t// Build resolved config with cascade priority\n\tlet registryUrl = DEFAULT_REGISTRY_URL;\n\tlet apiKey = userConfig.authToken;\n\tconst username = userConfig.username;\n\n\t// User config\n\tif (userConfig.registry) {\n\t\tregistryUrl = userConfig.registry;\n\t}\n\n\t// Project config can override registryUrl (but not apiKey for security)\n\tif (projectConfig?.registry) {\n\t\tregistryUrl = projectConfig.registry;\n\t}\n\n\t// Environment variables always win\n\tif (process.env.PSPM_REGISTRY_URL) {\n\t\tregistryUrl = process.env.PSPM_REGISTRY_URL;\n\t}\n\tif (process.env.PSPM_API_KEY) {\n\t\tapiKey = process.env.PSPM_API_KEY;\n\t}\n\n\tif (process.env.PSPM_DEBUG) {\n\t\tconsole.log(`[config] Resolved config:`);\n\t\tconsole.log(`[config] registryUrl: ${registryUrl}`);\n\t\tconsole.log(`[config] apiKey: ${apiKey ? \"***\" : \"(not set)\"}`);\n\t\tconsole.log(`[config] username: ${username || \"(not set)\"}`);\n\t}\n\n\treturn {\n\t\tregistryUrl,\n\t\tapiKey,\n\t\tusername,\n\t};\n}\n\n// =============================================================================\n// Credential Management\n// =============================================================================\n\n/**\n * Set credentials (authToken and optionally username/registry)\n */\nexport async function setCredentials(\n\tauthToken: string,\n\tusername?: string,\n\tregistry?: string,\n): Promise<void> {\n\tconst config = await readUserConfig();\n\n\tconfig.authToken = authToken;\n\tif (username) {\n\t\tconfig.username = username;\n\t}\n\tif (registry && registry !== DEFAULT_REGISTRY_URL) {\n\t\tconfig.registry = registry;\n\t}\n\n\tawait writeUserConfig(config);\n}\n\n/**\n * Clear credentials (authToken and username)\n */\nexport async function clearCredentials(): Promise<void> {\n\tconst config = await readUserConfig();\n\n\tdelete config.authToken;\n\tdelete config.username;\n\n\tawait writeUserConfig(config);\n}\n\n/**\n * Check if user is logged in\n */\nexport async function isLoggedIn(): Promise<boolean> {\n\ttry {\n\t\tconst resolved = await resolveConfig();\n\t\treturn !!resolved.apiKey;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\n/**\n * Get the API key (throws if not logged in)\n */\nexport async function requireApiKey(): Promise<string> {\n\tconst resolved = await resolveConfig();\n\n\tif (!resolved.apiKey) {\n\t\tif (process.env.PSPM_DEBUG) {\n\t\t\tconsole.log(`[config] requireApiKey: No API key found`);\n\t\t}\n\t\tthrow new NotLoggedInError();\n\t}\n\n\tif (process.env.PSPM_DEBUG) {\n\t\tconsole.log(\n\t\t\t`[config] requireApiKey: Got API key (${resolved.apiKey.substring(0, 10)}...)`,\n\t\t);\n\t}\n\n\treturn resolved.apiKey;\n}\n\n/**\n * Get the registry URL\n */\nexport async function getRegistryUrl(): Promise<string> {\n\tconst resolved = await resolveConfig();\n\treturn resolved.registryUrl;\n}\n\n// =============================================================================\n// Legacy Exports (for backward compatibility during transition)\n// =============================================================================\n\n// Legacy type alias\nexport type PspmConfig = {\n\tregistryUrl: string;\n\tapiKey?: string;\n\tusername?: string;\n};\n\n/**\n * Read config (legacy - wraps resolveConfig)\n */\nexport async function readConfig(): Promise<PspmConfig> {\n\tconst resolved = await resolveConfig();\n\treturn {\n\t\tregistryUrl: resolved.registryUrl,\n\t\tapiKey: resolved.apiKey,\n\t\tusername: resolved.username,\n\t};\n}\n\n/**\n * Write config (legacy - wraps setCredentials)\n */\nexport async function writeConfig(config: Partial<PspmConfig>): Promise<void> {\n\tif (config.apiKey) {\n\t\tawait setCredentials(config.apiKey, config.username, config.registryUrl);\n\t} else {\n\t\tconst current = await readUserConfig();\n\t\tif (config.registryUrl && config.registryUrl !== DEFAULT_REGISTRY_URL) {\n\t\t\tcurrent.registry = config.registryUrl;\n\t\t}\n\t\tif (config.username) {\n\t\t\tcurrent.username = config.username;\n\t\t}\n\t\tawait writeUserConfig(current);\n\t}\n}\n\n/**\n * Clear config (legacy - wraps clearCredentials)\n */\nexport async function clearConfig(): Promise<void> {\n\tawait clearCredentials();\n}\n","import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport type { SkillLockfile, SkillLockfileEntry } from \"@repo/pspm-types\";\nimport { getLockfilePath, getRegistryUrl } from \"./config\";\n\n/**\n * Read the lockfile\n */\nexport async function readLockfile(): Promise<SkillLockfile | null> {\n\tconst lockfilePath = getLockfilePath();\n\n\ttry {\n\t\tconst content = await readFile(lockfilePath, \"utf-8\");\n\t\treturn JSON.parse(content) as SkillLockfile;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/**\n * Write the lockfile\n */\nexport async function writeLockfile(lockfile: SkillLockfile): Promise<void> {\n\tconst lockfilePath = getLockfilePath();\n\tawait mkdir(dirname(lockfilePath), { recursive: true });\n\tawait writeFile(lockfilePath, `${JSON.stringify(lockfile, null, 2)}\\n`);\n}\n\n/**\n * Create a new empty lockfile\n */\nexport async function createEmptyLockfile(): Promise<SkillLockfile> {\n\tconst registryUrl = await getRegistryUrl();\n\treturn {\n\t\tlockfileVersion: 1,\n\t\tregistryUrl,\n\t\tskills: {},\n\t};\n}\n\n/**\n * Add a skill to the lockfile\n */\nexport async function addToLockfile(\n\tfullName: string,\n\tentry: SkillLockfileEntry,\n): Promise<void> {\n\tlet lockfile = await readLockfile();\n\tif (!lockfile) {\n\t\tlockfile = await createEmptyLockfile();\n\t}\n\n\tlockfile.skills[fullName] = entry;\n\tawait writeLockfile(lockfile);\n}\n\n/**\n * Remove a skill from the lockfile\n */\nexport async function removeFromLockfile(fullName: string): Promise<boolean> {\n\tconst lockfile = await readLockfile();\n\tif (!lockfile || !lockfile.skills[fullName]) {\n\t\treturn false;\n\t}\n\n\tdelete lockfile.skills[fullName];\n\tawait writeLockfile(lockfile);\n\treturn true;\n}\n\n/**\n * Get a skill entry from the lockfile\n */\nexport async function getFromLockfile(\n\tfullName: string,\n): Promise<SkillLockfileEntry | null> {\n\tconst lockfile = await readLockfile();\n\tif (!lockfile || !lockfile.skills[fullName]) {\n\t\treturn null;\n\t}\n\treturn lockfile.skills[fullName];\n}\n\n/**\n * List all skills in the lockfile\n */\nexport async function listLockfileSkills(): Promise<\n\tArray<{ name: string; entry: SkillLockfileEntry }>\n> {\n\tconst lockfile = await readLockfile();\n\tif (!lockfile) {\n\t\treturn [];\n\t}\n\n\treturn Object.entries(lockfile.skills).map(([name, entry]) => ({\n\t\tname,\n\t\tentry: entry as SkillLockfileEntry,\n\t}));\n}\n","import { mkdir, rm } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport {\n\tcalculateIntegrity,\n\tparseSkillSpecifier,\n\tresolveVersion,\n} from \"@repo/pspm-types\";\nimport {\n\tconfigure,\n\tgetSkillVersion,\n\tlistSkillVersions,\n} from \"../api-client.js\";\nimport { getRegistryUrl, getSkillsDir, requireApiKey } from \"../config.js\";\nimport { extractApiErrorMessage } from \"../errors.js\";\nimport { addToLockfile } from \"../lockfile.js\";\n\nexport interface AddOptions {\n\tsave?: boolean;\n}\n\nexport async function add(\n\tspecifier: string,\n\t_options: AddOptions,\n): Promise<void> {\n\ttry {\n\t\tconst apiKey = await requireApiKey();\n\t\tconst registryUrl = await getRegistryUrl();\n\n\t\t// Parse the specifier\n\t\tconst parsed = parseSkillSpecifier(specifier);\n\t\tif (!parsed) {\n\t\t\tconsole.error(\n\t\t\t\t`Error: Invalid skill specifier \"${specifier}\". Use format: @user/{username}/{name}[@{version}]`,\n\t\t\t);\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tconst { username, name, versionRange } = parsed;\n\n\t\t// Configure SDK (use direct REST endpoints, not oRPC)\n\t\tconfigure({ registryUrl, apiKey });\n\n\t\tconsole.log(`Resolving ${specifier}...`);\n\n\t\t// Get available versions\n\t\tconst versionsResponse = await listSkillVersions(username, name);\n\t\tif (versionsResponse.status !== 200) {\n\t\t\tconst errorMessage = extractApiErrorMessage(\n\t\t\t\tversionsResponse,\n\t\t\t\t`Skill @user/${username}/${name} not found`,\n\t\t\t);\n\t\t\tconsole.error(`Error: ${errorMessage}`);\n\t\t\tprocess.exit(1);\n\t\t}\n\t\tconst versions = versionsResponse.data;\n\t\tif (versions.length === 0) {\n\t\t\tconsole.error(`Error: Skill @user/${username}/${name} not found`);\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\t// Resolve version\n\t\tconst versionStrings = versions.map((v: { version: string }) => v.version);\n\t\tconst resolved = resolveVersion(versionRange || \"*\", versionStrings);\n\n\t\tif (!resolved) {\n\t\t\tconsole.error(\n\t\t\t\t`Error: No version matching \"${versionRange || \"latest\"}\" found for @user/${username}/${name}`,\n\t\t\t);\n\t\t\tconsole.error(`Available versions: ${versionStrings.join(\", \")}`);\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tconsole.log(`Installing @user/${username}/${name}@${resolved}...`);\n\n\t\t// Get version details with download URL\n\t\tconst versionResponse = await getSkillVersion(username, name, resolved);\n\t\tif (versionResponse.status !== 200 || !versionResponse.data) {\n\t\t\tconst errorMessage = extractApiErrorMessage(\n\t\t\t\tversionResponse,\n\t\t\t\t`Version ${resolved} not found`,\n\t\t\t);\n\t\t\tconsole.error(`Error: ${errorMessage}`);\n\t\t\tprocess.exit(1);\n\t\t}\n\t\tconst versionInfo = versionResponse.data;\n\n\t\t// Download the tarball via the API endpoint\n\t\t// Use the API download endpoint for reliability (handles redirects)\n\t\tconst downloadUrl = `${registryUrl}/@user/${username}/${name}/${resolved}/download`;\n\n\t\tconst tarballResponse = await fetch(downloadUrl, {\n\t\t\theaders: {\n\t\t\t\tAuthorization: `Bearer ${apiKey}`,\n\t\t\t},\n\t\t\tredirect: \"follow\",\n\t\t});\n\n\t\tif (!tarballResponse.ok) {\n\t\t\tconsole.error(\n\t\t\t\t`Error: Failed to download tarball (${tarballResponse.status})`,\n\t\t\t);\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tconst tarballBuffer = Buffer.from(await tarballResponse.arrayBuffer());\n\n\t\t// Calculate integrity\n\t\tconst integrity = calculateIntegrity(tarballBuffer);\n\n\t\t// Verify checksum matches\n\t\tconst expectedIntegrity = `sha256-${Buffer.from(versionInfo.checksum, \"hex\").toString(\"base64\")}`;\n\t\tif (integrity !== expectedIntegrity) {\n\t\t\tconsole.error(\"Error: Checksum verification failed\");\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\t// Create skills directory\n\t\tconst skillsDir = getSkillsDir();\n\t\tconst destDir = join(skillsDir, username, name);\n\t\tawait mkdir(destDir, { recursive: true });\n\n\t\t// Extract tarball\n\t\tconst { writeFile } = await import(\"node:fs/promises\");\n\t\tconst tempFile = join(destDir, \".temp.tgz\");\n\t\tawait writeFile(tempFile, tarballBuffer);\n\n\t\tconst { exec } = await import(\"node:child_process\");\n\t\tconst { promisify } = await import(\"node:util\");\n\t\tconst execAsync = promisify(exec);\n\n\t\ttry {\n\t\t\t// Clear destination and extract\n\t\t\tawait rm(destDir, { recursive: true, force: true });\n\t\t\tawait mkdir(destDir, { recursive: true });\n\t\t\tawait writeFile(tempFile, tarballBuffer);\n\t\t\tawait execAsync(\n\t\t\t\t`tar -xzf \"${tempFile}\" -C \"${destDir}\" --strip-components=1`,\n\t\t\t);\n\t\t} finally {\n\t\t\tawait rm(tempFile, { force: true });\n\t\t}\n\n\t\t// Update lockfile\n\t\tconst fullName = `@user/${username}/${name}`;\n\t\tawait addToLockfile(fullName, {\n\t\t\tversion: resolved,\n\t\t\tresolved: versionInfo.downloadUrl,\n\t\t\tintegrity,\n\t\t});\n\n\t\tconsole.log(`Installed @user/${username}/${name}@${resolved}`);\n\t\tconsole.log(`Location: ${destDir}`);\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n","import { stat, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nexport interface ConfigInitOptions {\n\tregistry?: string;\n}\n\n/**\n * Create a .pspmrc file in the current directory (INI format)\n */\nexport async function configInit(options: ConfigInitOptions): Promise<void> {\n\ttry {\n\t\tconst configPath = join(process.cwd(), \".pspmrc\");\n\n\t\t// Check if file already exists\n\t\ttry {\n\t\t\tawait stat(configPath);\n\t\t\tconsole.error(\"Error: .pspmrc already exists in this directory.\");\n\t\t\tprocess.exit(1);\n\t\t} catch {\n\t\t\t// File doesn't exist, good\n\t\t}\n\n\t\t// Build INI content\n\t\tconst lines: string[] = [\"; Project-specific PSPM configuration\", \"\"];\n\n\t\tif (options.registry) {\n\t\t\tlines.push(`registry = ${options.registry}`);\n\t\t} else {\n\t\t\tlines.push(\"; Uncomment to use a custom registry:\");\n\t\t\tlines.push(\"; registry = https://custom-registry.example.com\");\n\t\t}\n\n\t\tlines.push(\"\");\n\n\t\t// Write the file\n\t\tawait writeFile(configPath, lines.join(\"\\n\"));\n\n\t\tconsole.log(\"Created .pspmrc\");\n\t\tconsole.log(\"\");\n\t\tconsole.log(\"Contents:\");\n\t\tconsole.log(lines.join(\"\\n\"));\n\t\tconsole.log(\"Note: .pspmrc should be committed to version control.\");\n\t\tconsole.log(\"API keys should NOT be stored here - use pspm login instead.\");\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n","import {\n\tfindProjectConfig,\n\tgetConfigPath,\n\tresolveConfig,\n} from \"../../config.js\";\n\n/**\n * Show resolved configuration\n */\nexport async function configShow(): Promise<void> {\n\ttry {\n\t\tconst resolved = await resolveConfig();\n\t\tconst projectConfig = await findProjectConfig();\n\t\tconst configPath = getConfigPath();\n\n\t\tconsole.log(\"Resolved Configuration:\\n\");\n\t\tconsole.log(` Registry URL: ${resolved.registryUrl}`);\n\t\tconsole.log(` API Key: ${resolved.apiKey ? \"***\" : \"(not set)\"}`);\n\t\tconsole.log(` Username: ${resolved.username || \"(not set)\"}`);\n\t\tconsole.log(\"\");\n\t\tconsole.log(\"Config Locations:\");\n\t\tconsole.log(` User config: ${configPath}`);\n\t\tconsole.log(` Project config: ${projectConfig ? \".pspmrc\" : \"(none)\"}`);\n\t\tconsole.log(\"\");\n\t\tconsole.log(\"Environment Variables:\");\n\t\tconsole.log(\n\t\t\t` PSPM_REGISTRY_URL: ${process.env.PSPM_REGISTRY_URL || \"(not set)\"}`,\n\t\t);\n\t\tconsole.log(\n\t\t\t` PSPM_API_KEY: ${process.env.PSPM_API_KEY ? \"***\" : \"(not set)\"}`,\n\t\t);\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n","import { mkdir, rm } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { SkillLockfileEntry } from \"@repo/pspm-types\";\nimport { getRegistryUrl, getSkillsDir, requireApiKey } from \"../config.js\";\nimport { readLockfile } from \"../lockfile.js\";\n\nexport interface InstallOptions {\n\tfrozenLockfile?: boolean;\n\tdir?: string;\n}\n\nexport async function install(options: InstallOptions): Promise<void> {\n\ttry {\n\t\tconst apiKey = await requireApiKey();\n\t\tawait getRegistryUrl(); // Validate we have a registry configured\n\t\tconst skillsDir = options.dir || getSkillsDir();\n\n\t\tconst lockfile = await readLockfile();\n\t\tif (!lockfile) {\n\t\t\tif (options.frozenLockfile) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t\"Error: No lockfile found. Cannot install with --frozen-lockfile\",\n\t\t\t\t);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\tconsole.log(\"No lockfile found. Nothing to install.\");\n\t\t\treturn;\n\t\t}\n\n\t\tconst skillCount = Object.keys(lockfile.skills).length;\n\t\tif (skillCount === 0) {\n\t\t\tconsole.log(\"No skills in lockfile. Nothing to install.\");\n\t\t\treturn;\n\t\t}\n\n\t\tconsole.log(`Installing ${skillCount} skill(s)...\\n`);\n\n\t\tconst entries = Object.entries(lockfile.skills) as [\n\t\t\tstring,\n\t\t\tSkillLockfileEntry,\n\t\t][];\n\n\t\tfor (const [fullName, entry] of entries) {\n\t\t\tconst match = fullName.match(/^@user\\/([^/]+)\\/([^/]+)$/);\n\t\t\tif (!match) {\n\t\t\t\tconsole.warn(`Warning: Invalid skill name in lockfile: ${fullName}`);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst [, username, name] = match;\n\t\t\tconsole.log(`Installing ${fullName}@${entry.version}...`);\n\n\t\t\t// Download the tarball\n\t\t\tconst response = await fetch(entry.resolved, {\n\t\t\t\theaders: {\n\t\t\t\t\tAuthorization: `Bearer ${apiKey}`,\n\t\t\t\t},\n\t\t\t\tredirect: \"follow\",\n\t\t\t});\n\n\t\t\tif (!response.ok) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t` Error: Failed to download ${fullName} (${response.status})`,\n\t\t\t\t);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst tarballBuffer = Buffer.from(await response.arrayBuffer());\n\n\t\t\t// Verify checksum\n\t\t\tconst { createHash } = await import(\"node:crypto\");\n\t\t\tconst actualIntegrity = `sha256-${createHash(\"sha256\").update(tarballBuffer).digest(\"base64\")}`;\n\n\t\t\tif (actualIntegrity !== entry.integrity) {\n\t\t\t\tconsole.error(` Error: Checksum verification failed for ${fullName}`);\n\t\t\t\tif (options.frozenLockfile) {\n\t\t\t\t\tprocess.exit(1);\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Extract tarball\n\t\t\tconst destDir = join(skillsDir, username, name);\n\t\t\tawait rm(destDir, { recursive: true, force: true });\n\t\t\tawait mkdir(destDir, { recursive: true });\n\n\t\t\tconst tempFile = join(destDir, \".temp.tgz\");\n\t\t\tconst { writeFile } = await import(\"node:fs/promises\");\n\t\t\tawait writeFile(tempFile, tarballBuffer);\n\n\t\t\tconst { exec } = await import(\"node:child_process\");\n\t\t\tconst { promisify } = await import(\"node:util\");\n\t\t\tconst execAsync = promisify(exec);\n\n\t\t\ttry {\n\t\t\t\tawait execAsync(\n\t\t\t\t\t`tar -xzf \"${tempFile}\" -C \"${destDir}\" --strip-components=1`,\n\t\t\t\t);\n\t\t\t} finally {\n\t\t\t\tawait rm(tempFile, { force: true });\n\t\t\t}\n\n\t\t\tconsole.log(` Installed to ${destDir}`);\n\t\t}\n\n\t\tconsole.log(`\\nAll ${skillCount} skill(s) installed.`);\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n","import { access } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { getSkillsDir } from \"../config.js\";\nimport { listLockfileSkills } from \"../lockfile.js\";\n\nexport interface ListOptions {\n\tjson?: boolean;\n}\n\nexport async function list(options: ListOptions): Promise<void> {\n\ttry {\n\t\tconst skills = await listLockfileSkills();\n\n\t\tif (skills.length === 0) {\n\t\t\tconsole.log(\"No skills installed.\");\n\t\t\treturn;\n\t\t}\n\n\t\tif (options.json) {\n\t\t\tconsole.log(JSON.stringify(skills, null, 2));\n\t\t\treturn;\n\t\t}\n\n\t\tconst skillsDir = getSkillsDir();\n\n\t\tconsole.log(\"Installed skills:\\n\");\n\n\t\tfor (const { name, entry } of skills) {\n\t\t\tconst match = name.match(/^@user\\/([^/]+)\\/([^/]+)$/);\n\t\t\tif (!match) continue;\n\n\t\t\tconst [, username, skillName] = match;\n\t\t\tconst skillPath = join(skillsDir, username, skillName);\n\n\t\t\t// Check if skill is actually installed on disk\n\t\t\tlet status = \"installed\";\n\t\t\ttry {\n\t\t\t\tawait access(skillPath);\n\t\t\t} catch {\n\t\t\t\tstatus = \"missing\";\n\t\t\t}\n\n\t\t\tconsole.log(` ${name}@${entry.version}`);\n\t\t\tif (status === \"missing\") {\n\t\t\t\tconsole.log(` Status: MISSING (run 'pspm install' to restore)`);\n\t\t\t}\n\t\t}\n\n\t\tconsole.log(`\\nTotal: ${skills.length} skill(s)`);\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n","import { randomBytes } from \"node:crypto\";\nimport http from \"node:http\";\nimport { URL } from \"node:url\";\nimport open from \"open\";\nimport { whoamiRequest } from \"../api-client.js\";\nimport { getRegistryUrl, setCredentials } from \"../config.js\";\n\nexport interface LoginOptions {\n\tapiKey?: string;\n}\n\nconst DEFAULT_WEB_APP_URL = \"https://pspm.dev\";\n\n/**\n * Get the web app URL.\n * Priority:\n * 1. PSPM_WEB_URL environment variable (for local dev where web and server run on different ports)\n * 2. Derived from registry URL (for production where they share the same origin)\n *\n * Local dev example:\n * PSPM_WEB_URL=http://localhost:5500 pspm login\n *\n * The registry URL is like https://pspm.dev\n * The web app URL is the same: https://pspm.dev\n */\nfunction getWebAppUrl(registryUrl: string): string {\n\t// Environment variable takes priority (for local dev)\n\tif (process.env.PSPM_WEB_URL) {\n\t\treturn process.env.PSPM_WEB_URL.replace(/\\/$/, \"\"); // Remove trailing slash\n\t}\n\n\ttry {\n\t\tconst url = new URL(registryUrl);\n\t\treturn `${url.protocol}//${url.host}`;\n\t} catch {\n\t\treturn DEFAULT_WEB_APP_URL;\n\t}\n}\n\n/**\n * Get the server/API base URL from the registry URL\n * The registry URL is like https://pspm.dev\n * The server URL is the same: https://pspm.dev\n */\nfunction getServerUrl(registryUrl: string): string {\n\ttry {\n\t\tconst url = new URL(registryUrl);\n\t\treturn `${url.protocol}//${url.host}`;\n\t} catch {\n\t\treturn DEFAULT_WEB_APP_URL;\n\t}\n}\n\n/**\n * Exchange a CLI token for an API key using fetch\n */\nasync function exchangeCliToken(\n\tregistryUrl: string,\n\ttoken: string,\n): Promise<{ apiKey: string; username: string }> {\n\tconst serverUrl = getServerUrl(registryUrl);\n\t// Use direct REST endpoint (not oRPC) for CLI compatibility\n\tconst rpcUrl = `${serverUrl}/api/api-keys/cli-token-exchange`;\n\n\tconst response = await fetch(rpcUrl, {\n\t\tmethod: \"POST\",\n\t\theaders: {\n\t\t\t\"Content-Type\": \"application/json\",\n\t\t},\n\t\tbody: JSON.stringify({ token }),\n\t});\n\n\tif (!response.ok) {\n\t\tconst errorText = await response.text();\n\t\tthrow new Error(`Failed to exchange token: ${errorText}`);\n\t}\n\n\treturn response.json() as Promise<{ apiKey: string; username: string }>;\n}\n\n/**\n * Start a local HTTP server to receive the OAuth callback\n */\nfunction startCallbackServer(expectedState: string): Promise<{\n\tport: number;\n\ttokenPromise: Promise<string>;\n\tcleanup: () => void;\n}> {\n\treturn new Promise((resolveServer, rejectServer) => {\n\t\tlet resolveToken: (token: string) => void;\n\t\tlet rejectToken: (error: Error) => void;\n\t\tlet timeoutId: NodeJS.Timeout;\n\n\t\tconst tokenPromise = new Promise<string>((resolve, reject) => {\n\t\t\tresolveToken = resolve;\n\t\t\trejectToken = reject;\n\t\t});\n\n\t\tconst server = http.createServer((req, res) => {\n\t\t\tconst url = new URL(req.url || \"/\", `http://localhost`);\n\n\t\t\tif (url.pathname === \"/callback\") {\n\t\t\t\tconst token = url.searchParams.get(\"token\");\n\t\t\t\tconst state = url.searchParams.get(\"state\");\n\n\t\t\t\tif (state !== expectedState) {\n\t\t\t\t\tres.writeHead(400, { \"Content-Type\": \"text/html\" });\n\t\t\t\t\tres.end(`\n\t\t\t\t\t\t<html>\n\t\t\t\t\t\t\t<body style=\"font-family: system-ui; text-align: center; padding: 40px;\">\n\t\t\t\t\t\t\t\t<h1 style=\"color: #dc2626;\">Security Error</h1>\n\t\t\t\t\t\t\t\t<p>State mismatch - this may be a security issue.</p>\n\t\t\t\t\t\t\t\t<p>Please try running <code>pspm login</code> again.</p>\n\t\t\t\t\t\t\t</body>\n\t\t\t\t\t\t</html>\n\t\t\t\t\t`);\n\t\t\t\t\trejectToken(new Error(\"State mismatch - possible CSRF attack\"));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (!token) {\n\t\t\t\t\tres.writeHead(400, { \"Content-Type\": \"text/html\" });\n\t\t\t\t\tres.end(`\n\t\t\t\t\t\t<html>\n\t\t\t\t\t\t\t<body style=\"font-family: system-ui; text-align: center; padding: 40px;\">\n\t\t\t\t\t\t\t\t<h1 style=\"color: #dc2626;\">Error</h1>\n\t\t\t\t\t\t\t\t<p>No token received from the server.</p>\n\t\t\t\t\t\t\t\t<p>Please try running <code>pspm login</code> again.</p>\n\t\t\t\t\t\t\t</body>\n\t\t\t\t\t\t</html>\n\t\t\t\t\t`);\n\t\t\t\t\trejectToken(new Error(\"No token received\"));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tres.writeHead(200, { \"Content-Type\": \"text/html\" });\n\t\t\t\tres.end(`\n\t\t\t\t\t<html>\n\t\t\t\t\t\t<head>\n\t\t\t\t\t\t\t<script>\n\t\t\t\t\t\t\t\t// Try to close the window after a short delay\n\t\t\t\t\t\t\t\tsetTimeout(function() {\n\t\t\t\t\t\t\t\t\twindow.close();\n\t\t\t\t\t\t\t\t}, 1500);\n\t\t\t\t\t\t\t</script>\n\t\t\t\t\t\t</head>\n\t\t\t\t\t\t<body style=\"font-family: system-ui; text-align: center; padding: 40px;\">\n\t\t\t\t\t\t\t<h1 style=\"color: #16a34a;\">Success!</h1>\n\t\t\t\t\t\t\t<p>You are now logged in to PSPM.</p>\n\t\t\t\t\t\t\t<p style=\"color: #666; font-size: 14px;\">This window will close automatically, or you can close it manually.</p>\n\t\t\t\t\t\t</body>\n\t\t\t\t\t</html>\n\t\t\t\t`);\n\n\t\t\t\tresolveToken(token);\n\t\t\t} else {\n\t\t\t\tres.writeHead(404, { \"Content-Type\": \"text/plain\" });\n\t\t\t\tres.end(\"Not found\");\n\t\t\t}\n\t\t});\n\n\t\t// Cleanup function to close server and clear timeout\n\t\tconst cleanup = () => {\n\t\t\tclearTimeout(timeoutId);\n\t\t\tserver.close();\n\t\t};\n\n\t\t// Use port 0 to let the OS assign an available port\n\t\tserver.listen(0, \"127.0.0.1\", () => {\n\t\t\tconst address = server.address();\n\t\t\tif (typeof address === \"object\" && address !== null) {\n\t\t\t\tresolveServer({ port: address.port, tokenPromise, cleanup });\n\t\t\t} else {\n\t\t\t\trejectServer(new Error(\"Failed to get server address\"));\n\t\t\t}\n\t\t});\n\n\t\tserver.on(\"error\", (err) => {\n\t\t\trejectServer(err);\n\t\t});\n\n\t\t// Timeout after 5 minutes\n\t\ttimeoutId = setTimeout(\n\t\t\t() => {\n\t\t\t\trejectToken(new Error(\"Login timed out - please try again\"));\n\t\t\t\tserver.close();\n\t\t\t},\n\t\t\t5 * 60 * 1000,\n\t\t);\n\t});\n}\n\n/**\n * Login using browser-based OAuth flow\n */\nasync function browserLogin(): Promise<void> {\n\tconst registryUrl = await getRegistryUrl();\n\tconst webAppUrl = getWebAppUrl(registryUrl);\n\n\t// Generate state for CSRF protection\n\tconst state = randomBytes(32).toString(\"base64url\");\n\n\tconsole.log(\"Starting browser-based login...\");\n\n\t// Start local callback server\n\tconst { port, tokenPromise, cleanup } = await startCallbackServer(state);\n\n\t// Build the login URL\n\tconst loginUrl = `${webAppUrl}/cli/login?port=${port}&state=${encodeURIComponent(state)}`;\n\n\tconsole.log(`Opening browser to authenticate...`);\n\tconsole.log(`If the browser doesn't open, visit: ${loginUrl}`);\n\n\t// Open the browser\n\ttry {\n\t\tawait open(loginUrl);\n\t} catch {\n\t\tconsole.log(\"Could not open browser automatically.\");\n\t\tconsole.log(`Please visit: ${loginUrl}`);\n\t}\n\n\tconsole.log(\"Waiting for authentication...\");\n\n\t// Wait for the callback with the token\n\tconst token = await tokenPromise;\n\n\t// Clean up server and timeout immediately after receiving token\n\tcleanup();\n\n\tconsole.log(\"Received token, exchanging for API key...\");\n\n\t// Exchange the token for an API key\n\tconst { apiKey, username } = await exchangeCliToken(registryUrl, token);\n\n\t// Store credentials\n\tawait setCredentials(apiKey, username, registryUrl);\n\n\tconsole.log(`Logged in as ${username}`);\n\tconsole.log(`Registry: ${registryUrl}`);\n}\n\n/**\n * Login using direct API key (fallback method)\n */\nasync function directLogin(apiKey: string): Promise<void> {\n\tconsole.log(\"Verifying API key...\");\n\n\tconst registryUrl = await getRegistryUrl();\n\n\tconst user = await whoamiRequest(registryUrl, apiKey);\n\tif (!user) {\n\t\tconsole.error(\"Error: Invalid API key or not authenticated\");\n\t\tprocess.exit(1);\n\t}\n\n\t// Store credentials\n\tawait setCredentials(apiKey, user.username, registryUrl);\n\tconsole.log(`Logged in as ${user.username}`);\n\tconsole.log(`Registry: ${registryUrl}`);\n}\n\nexport async function login(options: LoginOptions): Promise<void> {\n\ttry {\n\t\tif (options.apiKey) {\n\t\t\t// Direct login with API key\n\t\t\tawait directLogin(options.apiKey);\n\t\t} else {\n\t\t\t// Browser-based OAuth flow\n\t\t\tawait browserLogin();\n\t\t}\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n","import { clearCredentials, isLoggedIn } from \"../config.js\";\n\nexport async function logout(): Promise<void> {\n\ttry {\n\t\tconst loggedIn = await isLoggedIn();\n\n\t\tif (!loggedIn) {\n\t\t\tconsole.log(\"Not logged in.\");\n\t\t\treturn;\n\t\t}\n\n\t\tawait clearCredentials();\n\t\tconsole.log(\"Logged out successfully.\");\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n","import { exec as execCb } from \"node:child_process\";\nimport { createHash } from \"node:crypto\";\nimport { readdir, readFile, stat } from \"node:fs/promises\";\nimport { join, relative } from \"node:path\";\nimport { promisify } from \"node:util\";\nimport type { SkillManifest } from \"@repo/sdk\";\nimport { configure, publishSkill } from \"../api-client.js\";\nimport { getRegistryUrl, requireApiKey } from \"../config.js\";\nimport { extractApiErrorMessage } from \"../errors.js\";\n\nconst exec = promisify(execCb);\n\n/**\n * Format bytes to human readable string\n */\nfunction formatBytes(bytes: number): string {\n\tif (bytes < 1024) return `${bytes}B`;\n\tif (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)}kB`;\n\treturn `${(bytes / (1024 * 1024)).toFixed(1)}MB`;\n}\n\n/**\n * Recursively get all files in a directory with their sizes\n */\nasync function getFilesWithSizes(\n\tdir: string,\n\tbaseDir: string,\n): Promise<Array<{ path: string; size: number }>> {\n\tconst results: Array<{ path: string; size: number }> = [];\n\n\ttry {\n\t\tconst entries = await readdir(dir, { withFileTypes: true });\n\n\t\tfor (const entry of entries) {\n\t\t\tconst fullPath = join(dir, entry.name);\n\t\t\tconst relativePath = relative(baseDir, fullPath);\n\n\t\t\t// Skip node_modules and .git\n\t\t\tif (entry.name === \"node_modules\" || entry.name === \".git\") {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (entry.isDirectory()) {\n\t\t\t\tconst subFiles = await getFilesWithSizes(fullPath, baseDir);\n\t\t\t\tresults.push(...subFiles);\n\t\t\t} else {\n\t\t\t\tconst fileStat = await stat(fullPath);\n\t\t\t\tresults.push({ path: relativePath, size: fileStat.size });\n\t\t\t}\n\t\t}\n\t} catch {\n\t\t// Directory doesn't exist or can't be read\n\t}\n\n\treturn results;\n}\n\nexport interface PublishOptions {\n\tbump?: \"major\" | \"minor\" | \"patch\";\n\ttag?: string;\n}\n\nexport async function publishCommand(options: PublishOptions): Promise<void> {\n\ttry {\n\t\tconst apiKey = await requireApiKey();\n\t\tconst registryUrl = await getRegistryUrl();\n\n\t\t// Read package.json from current directory\n\t\tconst packageJsonPath = join(process.cwd(), \"package.json\");\n\t\tlet packageJson: SkillManifest;\n\n\t\ttry {\n\t\t\tconst content = await readFile(packageJsonPath, \"utf-8\");\n\t\t\tpackageJson = JSON.parse(content);\n\t\t} catch {\n\t\t\tconsole.error(\"Error: No package.json found in current directory\");\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\t// Validate required fields\n\t\tif (!packageJson.name) {\n\t\t\tconsole.error(\"Error: package.json must have a 'name' field\");\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tif (!packageJson.version) {\n\t\t\tconsole.error(\"Error: package.json must have a 'version' field\");\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\t// Handle version bump if requested\n\t\tif (options.bump) {\n\t\t\tconst semver = await import(\"semver\");\n\t\t\tconst newVersion = semver.default.inc(packageJson.version, options.bump);\n\t\t\tif (!newVersion) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t`Error: Failed to bump version from ${packageJson.version}`,\n\t\t\t\t);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\tpackageJson.version = newVersion;\n\t\t\tconsole.log(`Bumped version to ${newVersion}`);\n\t\t}\n\n\t\t// Create tarball using npm pack (or tar directly)\n\t\t// Sanitize name for filename (replace @ and / with -)\n\t\tconst safeName = packageJson.name.replace(/[@/]/g, \"-\").replace(/^-+/, \"\");\n\t\tconst tarballName = `${safeName}-${packageJson.version}.tgz`;\n\t\tconst tempDir = join(process.cwd(), \".pspm-publish\");\n\n\t\t// Create tarball\n\t\ttry {\n\t\t\tawait exec(`rm -rf \"${tempDir}\" && mkdir -p \"${tempDir}\"`);\n\n\t\t\t// Get files to include (use 'files' from package.json or default)\n\t\t\tconst files = packageJson.files || [\n\t\t\t\t\"package.json\",\n\t\t\t\t\"SKILL.md\",\n\t\t\t\t\"runtime\",\n\t\t\t\t\"scripts\",\n\t\t\t\t\"data\",\n\t\t\t];\n\n\t\t\t// Create the tarball structure: package/{files}\n\t\t\tawait exec(`mkdir -p \"${tempDir}/package\"`);\n\n\t\t\tfor (const file of files) {\n\t\t\t\ttry {\n\t\t\t\t\t// Use rsync to copy while excluding node_modules\n\t\t\t\t\tawait exec(\n\t\t\t\t\t\t`rsync -a --exclude='node_modules' --exclude='.git' \"${file}\" \"${tempDir}/package/\" 2>/dev/null || true`,\n\t\t\t\t\t);\n\t\t\t\t} catch {\n\t\t\t\t\t// Ignore files that don't exist\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Always include package.json\n\t\t\tawait exec(`cp package.json \"${tempDir}/package/\"`);\n\n\t\t\t// Get list of files that will be included and their sizes\n\t\t\tconst packageDir = join(tempDir, \"package\");\n\t\t\tconst tarballContents = await getFilesWithSizes(packageDir, packageDir);\n\t\t\tconst unpackedSize = tarballContents.reduce((acc, f) => acc + f.size, 0);\n\n\t\t\t// Create tarball (excluding node_modules just in case)\n\t\t\tconst tarballPath = join(tempDir, tarballName);\n\t\t\tawait exec(\n\t\t\t\t`tar -czf \"${tarballPath}\" -C \"${tempDir}\" --exclude='node_modules' --exclude='.git' package`,\n\t\t\t);\n\n\t\t\t// Read tarball and calculate hashes\n\t\t\tconst tarballBuffer = await readFile(tarballPath);\n\t\t\tconst tarballBase64 = tarballBuffer.toString(\"base64\");\n\t\t\tconst tarballSize = tarballBuffer.length;\n\n\t\t\t// Calculate shasum (sha1) and integrity (sha512)\n\t\t\tconst shasum = createHash(\"sha1\").update(tarballBuffer).digest(\"hex\");\n\t\t\tconst integrityHash = createHash(\"sha512\")\n\t\t\t\t.update(tarballBuffer)\n\t\t\t\t.digest(\"base64\");\n\t\t\tconst integrity = `sha512-${integrityHash}`;\n\n\t\t\t// Print npm-style publish notice\n\t\t\tconsole.log(\"\");\n\t\t\tconsole.log(`pspm notice`);\n\t\t\tconsole.log(`pspm notice 📦 ${packageJson.name}@${packageJson.version}`);\n\t\t\tconsole.log(`pspm notice Tarball Contents`);\n\n\t\t\t// Sort files by size descending for display\n\t\t\ttarballContents.sort((a, b) => b.size - a.size);\n\t\t\tfor (const file of tarballContents) {\n\t\t\t\tconsole.log(\n\t\t\t\t\t`pspm notice ${formatBytes(file.size).padStart(8)} ${file.path}`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconsole.log(`pspm notice Tarball Details`);\n\t\t\tconsole.log(`pspm notice name: ${packageJson.name}`);\n\t\t\tconsole.log(`pspm notice version: ${packageJson.version}`);\n\t\t\tconsole.log(`pspm notice filename: ${tarballName}`);\n\t\t\tconsole.log(`pspm notice package size: ${formatBytes(tarballSize)}`);\n\t\t\tconsole.log(`pspm notice unpacked size: ${formatBytes(unpackedSize)}`);\n\t\t\tconsole.log(`pspm notice shasum: ${shasum}`);\n\t\t\tconsole.log(\n\t\t\t\t`pspm notice integrity: ${integrity.substring(0, 50)}...`,\n\t\t\t);\n\t\t\tconsole.log(`pspm notice total files: ${tarballContents.length}`);\n\t\t\tconsole.log(`pspm notice`);\n\t\t\tconsole.log(`pspm notice Publishing to ${registryUrl} with tag latest`);\n\n\t\t\t// Configure SDK and publish (use direct REST endpoints, not oRPC)\n\t\t\tconfigure({ registryUrl, apiKey });\n\t\t\tconst response = await publishSkill({\n\t\t\t\tmanifest: packageJson,\n\t\t\t\ttarballBase64,\n\t\t\t});\n\n\t\t\tif (response.status !== 200) {\n\t\t\t\tconst errorMessage = extractApiErrorMessage(response, \"Publish failed\");\n\n\t\t\t\t// Check for version conflict errors\n\t\t\t\tif (\n\t\t\t\t\terrorMessage.includes(\"must be greater than\") ||\n\t\t\t\t\terrorMessage.includes(\"already exists\")\n\t\t\t\t) {\n\t\t\t\t\tconsole.error(`pspm error code E403`);\n\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t`pspm error 403 403 Forbidden - You cannot publish over the previously published versions: ${packageJson.version}.`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tthrow new Error(errorMessage);\n\t\t\t}\n\n\t\t\tconst result = response.data;\n\t\t\tconsole.log(\n\t\t\t\t`+ @user/${result.skill.username}/${result.skill.name}@${result.version.version}`,\n\t\t\t);\n\t\t\tconsole.log(`Checksum: ${result.version.checksum}`);\n\t\t} finally {\n\t\t\t// Cleanup\n\t\t\tawait exec(`rm -rf \"${tempDir}\"`).catch(() => {});\n\t\t}\n\t} catch (error) {\n\t\tif (error instanceof Error) {\n\t\t\tconsole.error(`Error: ${error.message}`);\n\t\t} else {\n\t\t\tconsole.error(`Error: ${String(error)}`);\n\t\t}\n\t\tprocess.exit(1);\n\t}\n}\n\n// Keep old export name for backwards compatibility\nexport { publishCommand as publish };\n","import { rm } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { getSkillsDir, requireApiKey } from \"../config.js\";\nimport { listLockfileSkills, removeFromLockfile } from \"../lockfile.js\";\n\nexport async function remove(nameOrSpecifier: string): Promise<void> {\n\ttry {\n\t\tawait requireApiKey();\n\n\t\t// Normalize the name\n\t\tlet fullName: string;\n\t\tlet username: string;\n\t\tlet name: string;\n\n\t\tif (nameOrSpecifier.startsWith(\"@user/\")) {\n\t\t\t// Full specifier: @user/{username}/{name}\n\t\t\tconst match = nameOrSpecifier.match(/^@user\\/([^/]+)\\/([^@/]+)/);\n\t\t\tif (!match) {\n\t\t\t\tconsole.error(`Error: Invalid skill specifier: ${nameOrSpecifier}`);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\tfullName = `@user/${match[1]}/${match[2]}`;\n\t\t\tusername = match[1];\n\t\t\tname = match[2];\n\t\t} else {\n\t\t\t// Short name - find in lockfile\n\t\t\tconst skills = await listLockfileSkills();\n\t\t\tconst found = skills.find((s) => {\n\t\t\t\tconst match = s.name.match(/^@user\\/([^/]+)\\/([^/]+)$/);\n\t\t\t\treturn match && match[2] === nameOrSpecifier;\n\t\t\t});\n\n\t\t\tif (!found) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t`Error: Skill \"${nameOrSpecifier}\" not found in lockfile`,\n\t\t\t\t);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\n\t\t\tfullName = found.name;\n\t\t\tconst match = fullName.match(/^@user\\/([^/]+)\\/([^/]+)$/);\n\t\t\tif (!match) {\n\t\t\t\tconsole.error(`Error: Invalid skill name in lockfile: ${fullName}`);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\tusername = match[1];\n\t\t\tname = match[2];\n\t\t}\n\n\t\tconsole.log(`Removing ${fullName}...`);\n\n\t\t// Remove from lockfile\n\t\tconst removed = await removeFromLockfile(fullName);\n\t\tif (!removed) {\n\t\t\tconsole.error(`Error: ${fullName} not found in lockfile`);\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\t// Remove from disk\n\t\tconst skillsDir = getSkillsDir();\n\t\tconst destDir = join(skillsDir, username, name);\n\n\t\ttry {\n\t\t\tawait rm(destDir, { recursive: true, force: true });\n\t\t} catch {\n\t\t\t// Ignore errors if directory doesn't exist\n\t\t}\n\n\t\tconsole.log(`Removed ${fullName}`);\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n","import { parseSkillSpecifier } from \"@repo/pspm-types\";\nimport { configure, deleteSkill, deleteSkillVersion } from \"../api-client.js\";\nimport { getRegistryUrl, requireApiKey } from \"../config.js\";\nimport { extractApiErrorMessage } from \"../errors.js\";\n\nexport interface UnpublishOptions {\n\tforce?: boolean;\n}\n\nexport async function unpublish(\n\tspecifier: string,\n\toptions: UnpublishOptions,\n): Promise<void> {\n\ttry {\n\t\tconst apiKey = await requireApiKey();\n\t\tconst registryUrl = await getRegistryUrl();\n\n\t\t// Parse the specifier\n\t\tconst parsed = parseSkillSpecifier(specifier);\n\t\tif (!parsed) {\n\t\t\tconsole.error(\n\t\t\t\t`Error: Invalid skill specifier \"${specifier}\". Use format: @user/{username}/{name}[@{version}]`,\n\t\t\t);\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tconst { username, name, versionRange } = parsed;\n\n\t\t// Configure SDK (use direct REST endpoints, not oRPC)\n\t\tconfigure({ registryUrl, apiKey });\n\n\t\tif (versionRange) {\n\t\t\t// Delete specific version\n\t\t\tconsole.log(`Unpublishing ${specifier}...`);\n\n\t\t\tif (!options.force) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t\"Warning: This action is irreversible. Use --force to confirm.\",\n\t\t\t\t);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\n\t\t\tconst response = await deleteSkillVersion(name, versionRange);\n\t\t\tif (response.status !== 200) {\n\t\t\t\tconst errorMessage = extractApiErrorMessage(\n\t\t\t\t\tresponse,\n\t\t\t\t\t\"Failed to unpublish. Version may not exist.\",\n\t\t\t\t);\n\t\t\t\tconsole.error(`Error: ${errorMessage}`);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\tconsole.log(`Unpublished @user/${username}/${name}@${versionRange}`);\n\t\t} else {\n\t\t\t// Delete entire skill\n\t\t\tconsole.log(`Unpublishing all versions of @user/${username}/${name}...`);\n\n\t\t\tif (!options.force) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t\"Warning: This will delete ALL versions. Use --force to confirm.\",\n\t\t\t\t);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\n\t\t\tconst response = await deleteSkill(name);\n\t\t\tif (response.status !== 200) {\n\t\t\t\tconst errorMessage = extractApiErrorMessage(\n\t\t\t\t\tresponse,\n\t\t\t\t\t\"Failed to unpublish. Skill may not exist.\",\n\t\t\t\t);\n\t\t\t\tconsole.error(`Error: ${errorMessage}`);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\tconsole.log(`Unpublished @user/${username}/${name} (all versions)`);\n\t\t}\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n","import { resolveVersion } from \"@repo/pspm-types\";\nimport { configure, listSkillVersions } from \"../api-client.js\";\nimport { getRegistryUrl, requireApiKey } from \"../config.js\";\nimport { extractApiErrorMessage } from \"../errors.js\";\nimport { listLockfileSkills } from \"../lockfile.js\";\nimport { add } from \"./add.js\";\n\nexport interface UpdateOptions {\n\tdryRun?: boolean;\n}\n\nexport async function update(options: UpdateOptions): Promise<void> {\n\ttry {\n\t\tconst apiKey = await requireApiKey();\n\t\tconst registryUrl = await getRegistryUrl();\n\n\t\tconst skills = await listLockfileSkills();\n\n\t\tif (skills.length === 0) {\n\t\t\tconsole.log(\"No skills installed.\");\n\t\t\treturn;\n\t\t}\n\n\t\t// Configure SDK (use direct REST endpoints, not oRPC)\n\t\tconfigure({ registryUrl, apiKey });\n\n\t\tconst updates: Array<{\n\t\t\tname: string;\n\t\t\tcurrent: string;\n\t\t\tlatest: string;\n\t\t}> = [];\n\n\t\tconsole.log(\"Checking for updates...\\n\");\n\n\t\tfor (const { name, entry } of skills) {\n\t\t\tconst match = name.match(/^@user\\/([^/]+)\\/([^/]+)$/);\n\t\t\tif (!match) continue;\n\n\t\t\tconst [, username, skillName] = match;\n\n\t\t\ttry {\n\t\t\t\tconst versionsResponse = await listSkillVersions(username, skillName);\n\t\t\t\tif (versionsResponse.status !== 200) {\n\t\t\t\t\tconst errorMessage = extractApiErrorMessage(\n\t\t\t\t\t\tversionsResponse,\n\t\t\t\t\t\t\"Failed to fetch versions\",\n\t\t\t\t\t);\n\t\t\t\t\tconsole.warn(` Warning: ${name}: ${errorMessage}`);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst versions = versionsResponse.data;\n\t\t\t\tif (versions.length === 0) continue;\n\n\t\t\t\tconst versionStrings = versions.map(\n\t\t\t\t\t(v: { version: string }) => v.version,\n\t\t\t\t);\n\t\t\t\tconst latest = resolveVersion(\"*\", versionStrings);\n\n\t\t\t\tif (latest && latest !== entry.version) {\n\t\t\t\t\tupdates.push({\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tcurrent: entry.version,\n\t\t\t\t\t\tlatest,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\tconsole.warn(` Warning: Could not check updates for ${name}`);\n\t\t\t}\n\t\t}\n\n\t\tif (updates.length === 0) {\n\t\t\tconsole.log(\"All skills are up to date.\");\n\t\t\treturn;\n\t\t}\n\n\t\tconsole.log(\"Updates available:\\n\");\n\t\tfor (const { name, current, latest } of updates) {\n\t\t\tconsole.log(` ${name}: ${current} -> ${latest}`);\n\t\t}\n\n\t\tif (options.dryRun) {\n\t\t\tconsole.log(\"\\nDry run - no changes made.\");\n\t\t\treturn;\n\t\t}\n\n\t\tconsole.log(\"\\nUpdating...\\n\");\n\n\t\tfor (const { name, latest } of updates) {\n\t\t\tconst match = name.match(/^@user\\/([^/]+)\\/([^/]+)$/);\n\t\t\tif (!match) continue;\n\n\t\t\tconst [, username, skillName] = match;\n\t\t\tconst specifier = `@user/${username}/${skillName}@${latest}`;\n\n\t\t\tawait add(specifier, {});\n\t\t}\n\n\t\tconsole.log(\"\\nAll skills updated.\");\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n","import { whoamiRequest } from \"../api-client.js\";\nimport { getRegistryUrl, requireApiKey, resolveConfig } from \"../config.js\";\n\nexport async function whoami(): Promise<void> {\n\ttry {\n\t\tconst resolved = await resolveConfig();\n\t\tconst apiKey = await requireApiKey();\n\t\tconst registryUrl = await getRegistryUrl();\n\n\t\tconst user = await whoamiRequest(registryUrl, apiKey);\n\n\t\tif (user) {\n\t\t\tconsole.log(`Username: ${user.username}`);\n\t\t\tconsole.log(`User ID: ${user.userId}`);\n\t\t\tconsole.log(`Registry: ${registryUrl}`);\n\t\t} else if (resolved.username) {\n\t\t\t// Use cached username if API call fails\n\t\t\tconsole.log(`Username: ${resolved.username} (cached)`);\n\t\t\tconsole.log(`Registry: ${registryUrl}`);\n\t\t} else {\n\t\t\tconsole.error(\"Could not determine current user.\");\n\t\t\tprocess.exit(1);\n\t\t}\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n","#!/usr/bin/env node\n\nimport { readFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { Command } from \"commander\";\nimport {\n\tadd,\n\tconfigInit,\n\tconfigShow,\n\tinstall,\n\tlist,\n\tlogin,\n\tlogout,\n\tpublish,\n\tremove,\n\tunpublish,\n\tupdate,\n\twhoami,\n} from \"./commands/index.js\";\n\n// Read version from package.json\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nconst packageJson = JSON.parse(\n\treadFileSync(join(__dirname, \"..\", \"package.json\"), \"utf-8\"),\n);\nconst version: string = packageJson.version;\n\nconst program = new Command();\n\nprogram\n\t.name(\"pspm\")\n\t.description(\"Prompt Skill Package Manager for AnyT\")\n\t.version(version);\n\n// =============================================================================\n// Config commands\n// =============================================================================\n\nconst configCmd = program\n\t.command(\"config\")\n\t.description(\"Manage PSPM configuration\");\n\nconfigCmd\n\t.command(\"show\")\n\t.description(\"Show resolved configuration\")\n\t.action(async () => {\n\t\tawait configShow();\n\t});\n\nconfigCmd\n\t.command(\"init\")\n\t.description(\"Create a .pspmrc file in the current directory\")\n\t.option(\"--registry <url>\", \"Registry URL override\")\n\t.action(async (options) => {\n\t\tawait configInit({\n\t\t\tregistry: options.registry,\n\t\t});\n\t});\n\n// =============================================================================\n// Authentication commands\n// =============================================================================\n\nprogram\n\t.command(\"login\")\n\t.description(\"Log in via browser or with an API key\")\n\t.option(\n\t\t\"--api-key <key>\",\n\t\t\"API key for direct authentication (skips browser)\",\n\t)\n\t.action(async (options) => {\n\t\tawait login({ apiKey: options.apiKey });\n\t});\n\nprogram\n\t.command(\"logout\")\n\t.description(\"Log out and clear stored credentials\")\n\t.action(async () => {\n\t\tawait logout();\n\t});\n\nprogram\n\t.command(\"whoami\")\n\t.description(\"Show current user information\")\n\t.action(async () => {\n\t\tawait whoami();\n\t});\n\n// =============================================================================\n// Skill management commands\n// =============================================================================\n\nprogram\n\t.command(\"add <specifier>\")\n\t.description(\"Add a skill (e.g., @user/bsheng/vite_slides@^2.0.0)\")\n\t.option(\"--save\", \"Save to lockfile (default)\")\n\t.action(async (specifier, options) => {\n\t\tawait add(specifier, { save: options.save ?? true });\n\t});\n\nprogram\n\t.command(\"remove <name>\")\n\t.alias(\"rm\")\n\t.description(\"Remove an installed skill\")\n\t.action(async (name) => {\n\t\tawait remove(name);\n\t});\n\nprogram\n\t.command(\"list\")\n\t.alias(\"ls\")\n\t.description(\"List installed skills\")\n\t.option(\"--json\", \"Output as JSON\")\n\t.action(async (options) => {\n\t\tawait list({ json: options.json });\n\t});\n\nprogram\n\t.command(\"install\")\n\t.alias(\"i\")\n\t.description(\"Install all skills from lockfile\")\n\t.option(\"--frozen-lockfile\", \"Fail if lockfile is missing or outdated\")\n\t.option(\"--dir <path>\", \"Install skills to a specific directory\")\n\t.action(async (options) => {\n\t\tawait install({\n\t\t\tfrozenLockfile: options.frozenLockfile,\n\t\t\tdir: options.dir,\n\t\t});\n\t});\n\nprogram\n\t.command(\"update\")\n\t.description(\"Update all skills to latest compatible versions\")\n\t.option(\"--dry-run\", \"Show what would be updated without making changes\")\n\t.action(async (options) => {\n\t\tawait update({ dryRun: options.dryRun });\n\t});\n\n// =============================================================================\n// Publishing commands\n// =============================================================================\n\nprogram\n\t.command(\"publish\")\n\t.description(\"Publish current directory as a skill\")\n\t.option(\"--bump <level>\", \"Bump version (major, minor, patch)\")\n\t.option(\"--tag <tag>\", \"Tag for the release\")\n\t.action(async (options) => {\n\t\tawait publish({\n\t\t\tbump: options.bump as \"major\" | \"minor\" | \"patch\" | undefined,\n\t\t\ttag: options.tag,\n\t\t});\n\t});\n\nprogram\n\t.command(\"unpublish <specifier>\")\n\t.description(\"Remove a published skill version\")\n\t.option(\"--force\", \"Confirm destructive action\")\n\t.action(async (specifier, options) => {\n\t\tawait unpublish(specifier, { force: options.force });\n\t});\n\nprogram.parse();\n"]}
|