@puzzmo/cli 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/README.md +75 -0
  2. package/lib/commands/game/create.d.ts +2 -0
  3. package/lib/commands/game/create.js +145 -0
  4. package/lib/commands/game/create.js.map +1 -0
  5. package/lib/commands/login.d.ts +2 -0
  6. package/lib/commands/login.js +13 -0
  7. package/lib/commands/login.js.map +1 -0
  8. package/lib/commands/upload.d.ts +2 -0
  9. package/lib/commands/upload.js +87 -0
  10. package/lib/commands/upload.js.map +1 -0
  11. package/lib/download/page-downloader.d.ts +2 -0
  12. package/lib/download/page-downloader.js +94 -0
  13. package/lib/download/page-downloader.js.map +1 -0
  14. package/lib/index.d.ts +2 -0
  15. package/lib/index.js +53 -0
  16. package/lib/index.js.map +1 -0
  17. package/lib/lib/api.d.ts +10 -0
  18. package/lib/lib/api.js +53 -0
  19. package/lib/lib/api.js.map +1 -0
  20. package/lib/lib/config.d.ts +13 -0
  21. package/lib/lib/config.js +29 -0
  22. package/lib/lib/config.js.map +1 -0
  23. package/lib/lib/exec.d.ts +15 -0
  24. package/lib/lib/exec.js +34 -0
  25. package/lib/lib/exec.js.map +1 -0
  26. package/lib/lib/package-manager.d.ts +2 -0
  27. package/lib/lib/package-manager.js +15 -0
  28. package/lib/lib/package-manager.js.map +1 -0
  29. package/lib/skills/registry.d.ts +13 -0
  30. package/lib/skills/registry.js +49 -0
  31. package/lib/skills/registry.js.map +1 -0
  32. package/lib/skills/runner.d.ts +4 -0
  33. package/lib/skills/runner.js +80 -0
  34. package/lib/skills/runner.js.map +1 -0
  35. package/lib/tui/pipeline.d.ts +2 -0
  36. package/lib/tui/pipeline.js +426 -0
  37. package/lib/tui/pipeline.js.map +1 -0
  38. package/lib/wizard/agent-detect.d.ts +4 -0
  39. package/lib/wizard/agent-detect.js +4 -0
  40. package/lib/wizard/agent-detect.js.map +1 -0
  41. package/package.json +20 -0
  42. package/src/commands/game/create.ts +171 -0
  43. package/src/commands/login.ts +15 -0
  44. package/src/commands/upload.ts +94 -0
  45. package/src/download/page-downloader.ts +104 -0
  46. package/src/index.ts +56 -0
  47. package/src/lib/api.ts +75 -0
  48. package/src/lib/config.ts +37 -0
  49. package/src/lib/exec.ts +38 -0
  50. package/src/skills/registry.ts +57 -0
  51. package/src/skills/runner.ts +91 -0
  52. package/src/tui/pipeline.ts +460 -0
  53. package/src/wizard/agent-detect.ts +6 -0
  54. package/tsconfig.json +15 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../src/tui/pipeline.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAqB,MAAM,oBAAoB,CAAA;AAC7D,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,IAAI,MAAM,WAAW,CAAA;AAE5B,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAKnE,sBAAsB;AACtB,MAAM,GAAG,GAAG,MAAM,CAAA;AAClB,MAAM,GAAG,GAAG,GAAG,GAAG,GAAG,CAAA;AACrB,MAAM,MAAM,GAAG,CAAC,GAAW,EAAE,GAAW,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,CAAA;AACnE,MAAM,WAAW,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,IAAI,CAAA;AACpC,MAAM,UAAU,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,MAAM,CAAA;AACrC,MAAM,UAAU,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,MAAM,CAAA;AACrC,MAAM,IAAI,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,GAAG,IAAI,CAAA;AAClD,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,GAAG,IAAI,CAAA;AACjD,MAAM,EAAE,GAAG,CAAC,IAAY,EAAE,CAAS,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,IAAI,IAAI,CAAC,GAAG,GAAG,IAAI,CAAA;AAEpE,MAAM,KAAK,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;AACtC,MAAM,MAAM,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;AACvC,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;AACpC,MAAM,IAAI,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;AACrC,MAAM,IAAI,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;AAClC,MAAM,OAAO,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;AAExC,MAAM,SAAS,GAA8B;IAC3C,OAAO,EAAE,GAAG;IACZ,OAAO,EAAE,GAAG;IACZ,OAAO,EAAE,GAAG;IACZ,MAAM,EAAE,GAAG;IACX,OAAO,EAAE,GAAG;CACb,CAAA;AAED,MAAM,UAAU,GAA6C;IAC3D,OAAO,EAAE,IAAI;IACb,OAAO,EAAE,MAAM;IACf,OAAO,EAAE,KAAK;IACd,MAAM,EAAE,GAAG;IACX,OAAO,EAAE,IAAI;CACd,CAAA;AAED,MAAM,UAAU,GAAyC;IACvD,KAAK,EAAE,MAAM;IACb,KAAK,EAAE,IAAI;IACX,MAAM,EAAE,OAAO;IACf,IAAI,EAAE,IAAI;CACX,CAAA;AAED,4DAA4D;AAC5D,MAAM,aAAa,GAAG,CAAC,KAAa,EAAE,MAAc,EAAmC,EAAE;IACvF,IAAI,KAAK,KAAK,QAAQ;QAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,CAAC,EAAE,CAAA;IACrH,IAAI,KAAK,KAAK,OAAO;QAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,CAAA;IACzE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE,CAAA;AACvC,CAAC,CAAA;AAED,MAAM,WAAW,GAAG,CAAC,SAAiB,EAAE,KAAa,EAAU,EAAE;IAC/D,MAAM,QAAQ,GAAG,cAAc,CAAC,KAAK,CAAC,CAAA;IACtC,OAAO,iBAAiB,SAAS,gCAAgC,QAAQ,IAAI,SAAS,yDAAyD,CAAA;AACjJ,CAAC,CAAA;AAED,MAAM,WAAW;IAUL;IACA;IAVF,MAAM,CAAa;IACnB,WAAW,GAAG,CAAC,CAAA;IACf,WAAW,GAAa,EAAE,CAAA;IAC1B,KAAK,GAAU,MAAM,CAAA;IACrB,IAAI,GAAG,KAAK,CAAA;IACZ,UAAU,GAAwB,IAAI,CAAA;IACtC,YAAY,GAAG,EAAE,CAAA;IAEzB,YACU,KAAa,EACb,OAAe;QADf,UAAK,GAAL,KAAK,CAAQ;QACb,YAAO,GAAP,OAAO,CAAQ;QAEvB,IAAI,CAAC,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAA;IACnD,CAAC;IAED,IAAY,IAAI;QACd,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAA;IAClC,CAAC;IAED,IAAY,IAAI;QACd,OAAO,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAA;IACrC,CAAC;IAED,IAAY,cAAc;QACxB,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC,CAAA;IACnC,CAAC;IAEO,KAAK,CAAC,CAAS;QACrB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IACzB,CAAC;IAED,6BAA6B;IACrB,MAAM;QACZ,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,IAAI,CAAA;QACzC,MAAM,WAAW,GAAG,IAAI,GAAG,YAAY,GAAG,CAAC,CAAA;QAC3C,IAAI,GAAG,GAAG,EAAE,CAAA;QAEZ,GAAG,IAAI,WAAW,EAAE,CAAA;QACpB,GAAG,IAAI,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;QAEnB,aAAa;QACb,GAAG,IAAI,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,YAAY,GAAG,CAAC,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,WAAW,GAAG,CAAC,CAAC,GAAG,GAAG,CAAA;QAEnF,iBAAiB;QACjB,GAAG,IAAI,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;QACnB,GAAG,IAAI,IAAI,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,YAAY,GAAG,EAAE,CAAC,CAAC,GAAG,GAAG,CAAA;QAE3F,sBAAsB;QACtB,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI;YAC3B,CAAC,CAAC,MAAM;YACR,CAAC,CAAC,GAAG,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,EAAE,CAAA;QAC/E,MAAM,WAAW,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAC1C,GAAG,IAAI,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAA;QAC3C,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAA;QAE1F,YAAY;QACZ,GAAG,IAAI,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;QACnB,GAAG,IAAI,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,YAAY,GAAG,CAAC,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,WAAW,GAAG,CAAC,CAAC,GAAG,GAAG,CAAA;QAEnF,eAAe;QACf,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAA,CAAC,kDAAkD;QAC/E,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,WAAW,EAAE,GAAG,EAAE,EAAE,CAAC;YAC3C,GAAG,IAAI,MAAM,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,CAAA;YAEzB,iBAAiB;YACjB,MAAM,UAAU,GAAG,GAAG,CAAA;YACtB,IAAI,UAAU,GAAG,cAAc,CAAC,MAAM,EAAE,CAAC;gBACvC,MAAM,KAAK,GAAG,cAAc,CAAC,UAAU,CAAC,CAAA;gBACxC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;gBACrC,MAAM,QAAQ,GAAG,UAAU,KAAK,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,IAAI,CAAA;gBAC9D,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,CAAA;gBAC7B,MAAM,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC,CAAA;gBACjC,MAAM,KAAK,GAAG,GAAG,IAAI,IAAI,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAA;gBAClE,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;gBAC/D,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,MAAM,CAAA;gBAC5C,GAAG,IAAI,IAAI,GAAG,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,YAAY,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAA;YACjF,CAAC;iBAAM,IAAI,UAAU,KAAK,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACpD,cAAc;gBACd,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,MAAM,CAAA;gBACxE,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,MAAM,CAAA;gBACpE,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI;oBACtB,CAAC,CAAC,WAAW,GAAG,CAAC;wBACf,CAAC,CAAC,GAAG,CAAC,GAAG,WAAW,aAAa,CAAC;wBAClC,CAAC,CAAC,KAAK,CAAC,eAAe,CAAC;oBAC1B,CAAC,CAAC,GAAG,CAAC,GAAG,cAAc,IAAI,cAAc,CAAC,MAAM,OAAO,CAAC,CAAA;gBAC1D,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,MAAM,CAAA;gBAC5C,GAAG,IAAI,IAAI,GAAG,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,YAAY,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAA;YACjF,CAAC;iBAAM,IAAI,UAAU,KAAK,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACpD,GAAG,IAAI,IAAI,GAAG,GAAG,CAAC,cAAc,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,YAAY,GAAG,EAAE,CAAC,CAAC,GAAG,GAAG,CAAA;YACtF,CAAC;iBAAM,CAAC;gBACN,GAAG,IAAI,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,YAAY,GAAG,CAAC,CAAC,GAAG,GAAG,CAAA;YACjD,CAAC;YAED,gBAAgB;YAChB,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,WAAW,GAAG,GAAG,CAAA;YAC7D,MAAM,IAAI,GAAG,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;YACpE,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,WAAW,GAAG,CAAC,CAAC,CAAA;YAC7D,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,MAAM,CAAA;YACnD,GAAG,IAAI,GAAG,GAAG,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,GAAG,UAAU,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAA;QACtF,CAAC;QAED,gBAAgB;QAChB,GAAG,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;QACtB,GAAG,IAAI,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,YAAY,GAAG,CAAC,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,WAAW,GAAG,CAAC,CAAC,GAAG,GAAG,CAAA;QAEnF,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IACjB,CAAC;IAED,qDAAqD;IAC7C,SAAS,CAAC,CAAS;QACzB,4CAA4C;QAC5C,OAAO,CAAC,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAA;IACzC,CAAC;IAED,kEAAkE;IAC1D,eAAe,CAAC,CAAS,EAAE,QAAgB;QACjD,IAAI,OAAO,GAAG,CAAC,CAAA;QACf,IAAI,CAAC,GAAG,CAAC,CAAA;QACT,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,IAAI,OAAO,GAAG,QAAQ,EAAE,CAAC;YAC1C,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,MAAM,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;gBACxC,MAAM,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;gBAC7B,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;oBACf,CAAC,GAAG,GAAG,GAAG,CAAC,CAAA;oBACX,SAAQ;gBACV,CAAC;YACH,CAAC;YACD,OAAO,EAAE,CAAA;YACT,CAAC,EAAE,CAAA;QACL,CAAC;QACD,mFAAmF;QACnF,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,MAAM,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YAC3D,MAAM,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;YAC7B,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;gBACf,CAAC,GAAG,GAAG,GAAG,CAAC,CAAA;YACb,CAAC;;gBAAM,MAAK;QACd,CAAC;QACD,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IACtB,CAAC;IAED,4EAA4E;IACpE,YAAY,CAAC,IAAY;QAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;QACzD,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;YAC5B,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAA;YACzC,IAAI,MAAM,EAAE,CAAC;gBACX,6DAA6D;gBAC7D,KAAK,MAAM,WAAW,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC7C,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;gBACpC,CAAC;YACH,CAAC;QACH,CAAC;QACD,sBAAsB;QACtB,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;YAClC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;QACjE,CAAC;QACD,IAAI,CAAC,MAAM,EAAE,CAAA;IACf,CAAC;IAED,kDAAkD;IAC1C,aAAa,CAAC,CAAM;QAC1B,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,SAAS,CAAA;QAChC,IAAI,IAAI,KAAK,MAAM;YAAE,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,EAAE,CAAA;QAC3E,IAAI,IAAI,KAAK,OAAO;YAAE,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,EAAE,CAAA;QAC7E,IAAI,IAAI,KAAK,MAAM;YAAE,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,EAAE,CAAA;QAC3E,IAAI,IAAI,KAAK,MAAM;YAAE,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,OAAO,IAAI,EAAE,EAAE,CAAA;QACzE,IAAI,IAAI,KAAK,MAAM;YAAE,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,OAAO,IAAI,EAAE,EAAE,CAAA;QACzE,IAAI,IAAI,KAAK,MAAM;YAAE,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,OAAO,IAAI,EAAE,EAAE,CAAA;QACzE,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,CAAA;IAC1B,CAAC;IAED,oFAAoF;IAC5E,eAAe,CAAC,IAAY;QAClC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;YAE5B,sEAAsE;YACtE,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW,IAAI,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC;gBACrD,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,OAAgB,CAAA;gBAC5C,MAAM,KAAK,GAAa,EAAE,CAAA;gBAE1B,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;gBACzE,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;oBAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAA;gBAEhD,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAA;gBAC7D,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;oBAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;gBAE1F,mEAAmE;gBACnE,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;oBAAE,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;gBAC7C,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC;oBAAE,OAAO,IAAI,CAAA;gBAC3D,OAAO,IAAI,CAAA;YACb,CAAC;YAED,8CAA8C;YAC9C,IAAI,GAAG,CAAC,IAAI,KAAK,qBAAqB,IAAI,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC;gBAC1D,OAAO,GAAG,CAAC,KAAK,CAAC,IAAI,CAAA;YACvB,CAAC;YAED,4BAA4B;YAC5B,IAAI,GAAG,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;gBAC5B,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAA;YAChC,CAAC;YAED,2CAA2C;YAC3C,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBACxB,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,EAAE,OAA4B,CAAA;gBACzD,IAAI,CAAC,OAAO;oBAAE,OAAO,IAAI,CAAA;gBACzB,kCAAkC;gBAClC,MAAM,MAAM,GAAG,GAAG,CAAC,eAAe,CAAA;gBAClC,IAAI,MAAM,EAAE,IAAI,KAAK,QAAQ;oBAAE,OAAO,GAAG,CAAC,WAAW,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAA;gBACvE,IAAI,MAAM,EAAE,IAAI,KAAK,QAAQ;oBAAE,OAAO,GAAG,CAAC,WAAW,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAA;gBACvE,OAAO,IAAI,CAAA;YACb,CAAC;YAED,+BAA+B;YAC/B,IAAI,GAAG,CAAC,IAAI,KAAK,kBAAkB;gBAAE,OAAO,IAAI,CAAA;YAEhD,eAAe;YACf,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC1B,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAA;gBACjE,OAAO,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,CAAA;YAC7B,CAAC;YAED,kBAAkB;YAClB,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC1B,IAAI,GAAG,CAAC,OAAO,KAAK,MAAM;oBAAE,OAAO,GAAG,CAAC,iBAAiB,CAAC,CAAA;gBACzD,IAAI,GAAG,CAAC,OAAO,KAAK,cAAc;oBAAE,OAAO,IAAI,CAAA;gBAC/C,IAAI,GAAG,CAAC,OAAO,KAAK,eAAe;oBAAE,OAAO,IAAI,CAAA;gBAChD,OAAO,GAAG,CAAC,WAAW,GAAG,CAAC,OAAO,GAAG,CAAC,CAAA;YACvC,CAAC;YAED,gDAAgD;YAChD,OAAO,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;QACpE,CAAC;QAAC,MAAM,CAAC;YACP,wBAAwB;YACxB,OAAO,IAAI,CAAA;QACb,CAAC;IACH,CAAC;IAED,oCAAoC;IAC5B,QAAQ,CAAC,MAAc;QAC7B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;YACvD,MAAM,GAAG,GAAuC,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAA;YACnG,sDAAsD;YACtD,OAAO,GAAG,CAAC,UAAU,CAAA;YACrB,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE;gBAC5B,GAAG,EAAE,IAAI,CAAC,OAAO;gBACjB,GAAG;gBACH,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;aAClC,CAAC,CAAA;YAEF,IAAI,CAAC,UAAU,GAAG,IAAI,CAAA;YACtB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,oBAAoB,CAAC,CAAA;YAE9D,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;gBACvC,EAAE,CAAC,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAA;gBAC5C,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAA;YACpC,CAAC,CAAC,CAAA;YACF,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;gBACvC,EAAE,CAAC,cAAc,CAAC,QAAQ,EAAE,YAAY,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAA;gBAC1D,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAA;YACpC,CAAC,CAAC,CAAA;YAEF,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;gBACxB,EAAE,CAAC,cAAc,CAAC,QAAQ,EAAE,kBAAkB,IAAI,IAAI,CAAC,CAAA;gBAEvD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAA;gBACtB,OAAO,CAAC,IAAI,KAAK,CAAC,CAAC,CAAA;YACrB,CAAC,CAAC,CAAA;YACF,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;gBACvB,IAAI,CAAC,YAAY,CAAC,UAAU,GAAG,CAAC,OAAO,EAAE,CAAC,CAAA;gBAC1C,IAAI,CAAC,UAAU,GAAG,IAAI,CAAA;gBACtB,OAAO,CAAC,KAAK,CAAC,CAAA;YAChB,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,4BAA4B;IACpB,KAAK,CAAC,OAAO,CAAC,SAAiB;QACrC,MAAM,KAAK,GAAG,cAAc,CAAC,SAAS,CAAC,CAAA;QACvC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,SAAS,CAAA;QAClC,IAAI,CAAC,WAAW,GAAG,SAAS,CAAA;QAC5B,IAAI,CAAC,WAAW,GAAG,EAAE,CAAA;QACrB,IAAI,CAAC,KAAK,GAAG,OAAO,CAAA;QACpB,IAAI,CAAC,MAAM,EAAE,CAAA;QAEb,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAA;QAClD,IAAI,OAAO,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;QAEzC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;gBACnB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,SAAS,CAAA;gBAClC,IAAI,CAAC,MAAM,EAAE,CAAA;gBACb,OAAO,IAAI,CAAA;YACb,CAAC;YACD,IAAI,CAAC,YAAY,CAAC,sBAAsB,CAAC,CAAA;YACzC,OAAO,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;YACrC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,QAAQ,CAAA;gBACjC,IAAI,CAAC,MAAM,EAAE,CAAA;gBACb,OAAO,KAAK,CAAA;YACd,CAAC;QACH,CAAC;QAED,eAAe;QACf,IAAI,CAAC,KAAK,GAAG,OAAO,CAAA;QACpB,IAAI,CAAC,MAAM,EAAE,CAAA;QACb,IAAI,CAAC,YAAY,CAAC,oBAAoB,CAAC,CAAA;QACvC,MAAM,WAAW,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAC7C,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;YACzB,IAAI,CAAC,YAAY,CAAC,iBAAiB,WAAW,CAAC,KAAK,0BAA0B,CAAC,CAAA;YAC/E,MAAM,SAAS,GAAG,6CAA6C,KAAK,CAAC,IAAI,8BAA8B,WAAW,CAAC,KAAK,EAAE,CAAA;YAC1H,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAA;YAE9B,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;YACvC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;gBACnB,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;oBACnB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,SAAS,CAAA;oBAClC,IAAI,CAAC,MAAM,EAAE,CAAA;oBACb,OAAO,IAAI,CAAA;gBACb,CAAC;gBACD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,QAAQ,CAAA;gBACjC,IAAI,CAAC,MAAM,EAAE,CAAA;gBACb,OAAO,KAAK,CAAA;YACd,CAAC;QACH,CAAC;QAED,SAAS;QACT,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAA;QACrB,IAAI,CAAC,MAAM,EAAE,CAAA;QACb,IAAI,CAAC;YACH,UAAU,CAAC,YAAY,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAA;YAC/C,SAAS,CAAC,UAAU,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAA;YACxD,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,CAAA;QACjC,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC,YAAY,CAAC,uBAAuB,CAAC,CAAA;QAC5C,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,SAAS,CAAA;QAClC,IAAI,CAAC,MAAM,EAAE,CAAA;QACb,OAAO,IAAI,CAAA;IACb,CAAC;IAED,gDAAgD;IACxC,UAAU;QAChB,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACxB,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;QAChC,CAAC;QACD,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAA;QACtB,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;YACxC,SAAS;YACT,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;gBAClB,IAAI,IAAI,CAAC,UAAU;oBAAE,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAA;gBAC3C,IAAI,CAAC,OAAO,EAAE,CAAA;gBACd,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACjB,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;IAEO,OAAO;QACb,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,CAAA;QACxB,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACxB,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAA;QACjC,CAAC;QACD,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAA;IACvB,CAAC;IAED,4BAA4B;IAC5B,KAAK,CAAC,GAAG;QACP,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,CAAA;QACxB,IAAI,CAAC,UAAU,EAAE,CAAA;QACjB,IAAI,CAAC,MAAM,EAAE,CAAA;QAEb,4BAA4B;QAC5B,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAA;QAEhD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC/C,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;YAChC,IAAI,CAAC,EAAE,EAAE,CAAC;gBACR,IAAI,CAAC,YAAY,CAAC,oCAAoC,CAAC,CAAA;gBACvD,MAAK;YACP,CAAC;QACH,CAAC;QAED,IAAI,CAAC,KAAK,GAAG,MAAM,CAAA;QACnB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,MAAM,EAAE,CAAA;QACb,IAAI,CAAC,OAAO,EAAE,CAAA;IAChB,CAAC;CACF;AAED,0DAA0D;AAC1D,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,EAAE,KAAa,EAAE,OAAe,EAAiB,EAAE;IACpF,MAAM,GAAG,GAAG,IAAI,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;IAC3C,MAAM,GAAG,CAAC,GAAG,EAAE,CAAA;AACjB,CAAC,CAAA"}
@@ -0,0 +1,4 @@
1
+ import { type DetectedAgentCLI } from "@puzzmo/agent-cli-detect";
2
+ export type { DetectedAgentCLI as AgentInfo };
3
+ /** Detects installed LLM agent CLIs on the system */
4
+ export declare const detectAgent: () => DetectedAgentCLI[];
@@ -0,0 +1,4 @@
1
+ import { detectAgentCLIs } from "@puzzmo/agent-cli-detect";
2
+ /** Detects installed LLM agent CLIs on the system */
3
+ export const detectAgent = () => detectAgentCLIs();
4
+ //# sourceMappingURL=agent-detect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-detect.js","sourceRoot":"","sources":["../../src/wizard/agent-detect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAyB,MAAM,0BAA0B,CAAA;AAIjF,qDAAqD;AACrD,MAAM,CAAC,MAAM,WAAW,GAAG,GAAuB,EAAE,CAAC,eAAe,EAAE,CAAA"}
package/package.json ADDED
@@ -0,0 +1,20 @@
1
+ {
2
+ "name": "@puzzmo/cli",
3
+ "version": "1.0.0",
4
+ "type": "module",
5
+ "bin": {
6
+ "puzzmo": "./lib/index.js"
7
+ },
8
+ "main": "./lib/index.js",
9
+ "scripts": {
10
+ "build": "tsc",
11
+ "type-check": "tsc --noEmit"
12
+ },
13
+ "dependencies": {
14
+ "@puzzmo/agent-cli-detect": "workspace:*"
15
+ },
16
+ "devDependencies": {
17
+ "@types/node": "^20.1.0",
18
+ "typescript": "catalog:"
19
+ }
20
+ }
@@ -0,0 +1,171 @@
1
+ import fs from "node:fs"
2
+ import path from "node:path"
3
+
4
+ import { detectAgent } from "../../wizard/agent-detect.js"
5
+ import { downloadPage } from "../../download/page-downloader.js"
6
+ import { runCommand, gitCommit } from "../../lib/exec.js"
7
+ import { runSkillsPipelineTUI } from "../../skills/runner.js"
8
+ import { installSkills } from "../../skills/registry.js"
9
+ import { login } from "../login.js"
10
+
11
+ type CreateOptions = {
12
+ name?: string
13
+ url?: string
14
+ agent?: string
15
+ accessToken?: string
16
+ }
17
+
18
+ /** Parses CLI args into CreateOptions */
19
+ const parseArgs = (args: string[]): CreateOptions => {
20
+ const opts: CreateOptions = {}
21
+ let i = 0
22
+
23
+ // First positional arg could be access token
24
+ if (args[0] && !args[0].startsWith("--")) {
25
+ opts.accessToken = args[0]
26
+ i = 1
27
+ }
28
+
29
+ while (i < args.length) {
30
+ const arg = args[i]
31
+ if (arg === "--name" && args[i + 1]) {
32
+ opts.name = args[++i]
33
+ } else if (arg === "--url" && args[i + 1]) {
34
+ opts.url = args[++i]
35
+ } else if (arg === "--agent" && args[i + 1]) {
36
+ opts.agent = args[++i]
37
+ }
38
+ i++
39
+ }
40
+
41
+ return opts
42
+ }
43
+
44
+ /** Interactive text prompt (simple readline-based fallback) */
45
+ const askText = async (message: string, defaultValue?: string): Promise<string> => {
46
+ const { createInterface } = await import("node:readline")
47
+ const rl = createInterface({ input: process.stdin, output: process.stdout })
48
+ const prompt = defaultValue ? `${message} (${defaultValue}): ` : `${message}: `
49
+
50
+ return new Promise((resolve) => {
51
+ rl.question(prompt, (answer) => {
52
+ rl.close()
53
+ resolve(answer.trim() || defaultValue || "")
54
+ })
55
+ })
56
+ }
57
+
58
+ /** Interactive select prompt */
59
+ const askSelect = async (message: string, options: { value: string; label: string; disabled?: boolean }[]): Promise<string> => {
60
+ console.log(`\n${message}`)
61
+ const enabled = options.filter((o) => !o.disabled)
62
+ options.forEach((opt) => {
63
+ const prefix = opt.disabled ? " " : ` ${enabled.indexOf(opt) + 1}.`
64
+ const suffix = opt.disabled ? " (Coming soon)" : ""
65
+ console.log(`${prefix} ${opt.label}${suffix}`)
66
+ })
67
+
68
+ const { createInterface } = await import("node:readline")
69
+ const rl = createInterface({ input: process.stdin, output: process.stdout })
70
+
71
+ return new Promise((resolve) => {
72
+ rl.question(`\nChoice (1-${enabled.length}): `, (answer) => {
73
+ rl.close()
74
+ const idx = parseInt(answer.trim(), 10) - 1
75
+ resolve(enabled[idx]?.value ?? enabled[0].value)
76
+ })
77
+ })
78
+ }
79
+
80
+ /** Main game create wizard */
81
+ export const gameCreate = async (args: string[]) => {
82
+ const opts = parseArgs(args)
83
+
84
+ console.log("\n Puzzmo Game Creator\n")
85
+
86
+ // Step 1: Game name
87
+ const name = opts.name || (await askText("Game name"))
88
+ if (!name) {
89
+ console.error("Game name is required")
90
+ process.exit(1)
91
+ }
92
+
93
+ // Step 2: Mode selection
94
+ const mode = await askSelect("How would you like to create your game?", [
95
+ { value: "import", label: "Import an HTML game from a web page" },
96
+ { value: "new-repo", label: "Create game in a new repo", disabled: true },
97
+ { value: "add-to-repo", label: "Add a game to this repo", disabled: true },
98
+ ])
99
+
100
+ if (mode !== "import") {
101
+ console.log("This mode is not yet supported.")
102
+ process.exit(0)
103
+ }
104
+
105
+ // Step 3: Source URL
106
+ const url = opts.url || (await askText("Source URL to import"))
107
+ if (!url) {
108
+ console.error("Source URL is required for import mode")
109
+ process.exit(1)
110
+ }
111
+
112
+ // Step 4: Download page
113
+ const gameDir = path.resolve(name)
114
+ console.log(`\nDownloading ${url} into ./${name}/...`)
115
+ await downloadPage(url, gameDir)
116
+ console.log("Download complete.")
117
+
118
+ // Step 5: Detect agents
119
+ const agents = detectAgent()
120
+ const agentChoices = [
121
+ ...agents.map((a) => ({ value: a.binary, label: `${a.displayName} (${a.path})` })),
122
+ { value: "none", label: "None - I'll run the skills manually" },
123
+ ]
124
+
125
+ // Step 6: Ask about agent
126
+ let selectedAgent: string
127
+ if (opts.agent) {
128
+ selectedAgent = opts.agent
129
+ } else if (agents.length > 0) {
130
+ selectedAgent = await askSelect("Which LLM agent do you use?", agentChoices)
131
+ } else {
132
+ console.log("\nNo LLM agents detected (checked: claude, codex)")
133
+ selectedAgent = "none"
134
+ }
135
+
136
+ // Step 7: Login if token provided
137
+ if (opts.accessToken) {
138
+ console.log("\nLogging in...")
139
+ login(opts.accessToken)
140
+ }
141
+
142
+ // Step 8: Install skills into the game directory
143
+ if (selectedAgent !== "none") {
144
+ console.log("\nInstalling Puzzmo skills...")
145
+ const count = installSkills(selectedAgent, gameDir)
146
+ console.log(`Installed ${count} skill(s).`)
147
+ }
148
+
149
+ // Step 9: Initialize git
150
+ if (!fs.existsSync(path.join(gameDir, ".git"))) {
151
+ runCommand("git init", { cwd: gameDir })
152
+ runCommand("git add -A", { cwd: gameDir })
153
+ gitCommit("Initial game import", { cwd: gameDir })
154
+ }
155
+
156
+ // Step 10: Run skills pipeline
157
+ if (selectedAgent !== "none") {
158
+ console.log("\nStarting migration pipeline...\n")
159
+ await runSkillsPipelineTUI(selectedAgent, gameDir)
160
+ }
161
+
162
+ // Done
163
+ console.log(`\nDone! Your game is in ./${name}/`)
164
+ console.log(`\nNext steps:`)
165
+ console.log(` cd ${name}`)
166
+ console.log(` npx vite # Start development server`)
167
+ console.log(` npx vite build # Build for production`)
168
+ if (selectedAgent === "none") {
169
+ console.log(`\nTo run migration skills manually, see packages/skills/ for SKILL.md files.`)
170
+ }
171
+ }
@@ -0,0 +1,15 @@
1
+ import { writeConfig, readConfig } from "../lib/config.js"
2
+
3
+ /** Saves a CLI token to ~/.puzzmo/config.json */
4
+ export const login = (token: string) => {
5
+ if (!token.startsWith("pzt-")) {
6
+ console.error("Invalid CLI token. Generate one from studio.puzzmo.com.")
7
+ process.exit(1)
8
+ }
9
+
10
+ const config = readConfig()
11
+ config.token = token
12
+ writeConfig(config)
13
+
14
+ console.log("Logged in successfully. Token saved to ~/.puzzmo/config.json")
15
+ }
@@ -0,0 +1,94 @@
1
+ import { execSync } from "node:child_process"
2
+ import crypto from "node:crypto"
3
+ import fs from "node:fs"
4
+ import path from "node:path"
5
+
6
+ import { uploadFiles } from "../lib/api.js"
7
+ import { getAPIURL, getToken } from "../lib/config.js"
8
+
9
+ /** Collects all files in a directory recursively */
10
+ const collectFiles = (dir: string): string[] => {
11
+ const entries = fs.readdirSync(dir, { withFileTypes: true })
12
+ const files: string[] = []
13
+ for (const entry of entries) {
14
+ const full = path.join(dir, entry.name)
15
+ if (entry.isDirectory()) files.push(...collectFiles(full))
16
+ else files.push(full)
17
+ }
18
+ return files
19
+ }
20
+
21
+ /** Tries to get the current git SHA, returns null if not in a git repo */
22
+ const getGitSHA = (): string | null => {
23
+ try {
24
+ return execSync("git rev-parse HEAD", { encoding: "utf-8" }).trim()
25
+ } catch {
26
+ return null
27
+ }
28
+ }
29
+
30
+ /** Hashes all file contents to produce a deterministic SHA */
31
+ const hashFiles = (filePaths: string[]): string => {
32
+ const hash = crypto.createHash("sha256")
33
+ for (const fp of filePaths.sort()) {
34
+ hash.update(fs.readFileSync(fp))
35
+ }
36
+ return hash.digest("hex").slice(0, 12)
37
+ }
38
+
39
+ /** Formats a byte count as a human-readable string */
40
+ const formatBytes = (bytes: number): string => {
41
+ if (bytes < 1024) return `${bytes} B`
42
+ if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`
43
+ return `${(bytes / (1024 * 1024)).toFixed(1)} MB`
44
+ }
45
+
46
+ /** Uploads game build artifacts to Puzzmo */
47
+ export const upload = async (gameSlug: string, dir: string) => {
48
+ const token = getToken()
49
+ if (!token) {
50
+ console.error("Not logged in. Run `puzzmo login <token>` or set PUZZMO_TOKEN.")
51
+ process.exit(1)
52
+ }
53
+
54
+ const distDir = path.resolve(dir)
55
+ if (!fs.existsSync(distDir)) {
56
+ console.error(`Directory not found: ${dir}`)
57
+ process.exit(1)
58
+ }
59
+
60
+ const files = collectFiles(distDir)
61
+ if (!files.length) {
62
+ console.error(`Directory is empty: ${dir}`)
63
+ process.exit(1)
64
+ }
65
+
66
+ // Determine SHA
67
+ const sha = getGitSHA() || hashFiles(files)
68
+
69
+ console.log(`\nUploading ${gameSlug} (${sha.slice(0, 8)})`)
70
+ console.log(`Directory: ${distDir}`)
71
+ console.log("")
72
+
73
+ let totalBytes = 0
74
+ for (const file of files) {
75
+ const size = fs.statSync(file).size
76
+ totalBytes += size
77
+ const rel = path.relative(distDir, file)
78
+ console.log(` ${rel} (${formatBytes(size)})`)
79
+ }
80
+
81
+ const apiURL = getAPIURL()
82
+ const defaultURL = "https://api.puzzmo.com"
83
+
84
+ console.log(`\n${files.length} file(s), ${formatBytes(totalBytes)} total`)
85
+ if (apiURL !== defaultURL) console.log(`Uploading to ${apiURL}...`)
86
+ else console.log("Uploading...")
87
+
88
+ const result = await uploadFiles(token, gameSlug, sha, files, distDir, (batch, totalBatches, uploaded) => {
89
+ console.log(` Batch ${batch}/${totalBatches} done (${uploaded} file(s) uploaded)`)
90
+ })
91
+
92
+ console.log(`\nDone - ${result.versionID}`)
93
+ console.log(`CDN: ${result.cdnBase}`)
94
+ }
@@ -0,0 +1,104 @@
1
+ import fs from "node:fs"
2
+ import path from "node:path"
3
+ import https from "node:https"
4
+ import http from "node:http"
5
+
6
+ /** Fetch that tolerates expired/self-signed SSL certificates */
7
+ const fetchPage = async (url: string): Promise<{ ok: boolean; status: number; text: () => Promise<string>; arrayBuffer: () => Promise<ArrayBuffer> }> => {
8
+ const parsed = new URL(url)
9
+ const isHttps = parsed.protocol === "https:"
10
+
11
+ return new Promise((resolve, reject) => {
12
+ const mod = isHttps ? https : http
13
+ const opts = isHttps ? { rejectUnauthorized: false } : {}
14
+
15
+ const req = mod.get(url, opts, (res) => {
16
+ const chunks: Uint8Array[] = []
17
+ res.on("data", (chunk: Uint8Array) => chunks.push(chunk))
18
+ res.on("end", () => {
19
+ const buffer = Buffer.concat(chunks)
20
+ const ab = new ArrayBuffer(buffer.byteLength)
21
+ const view = new Uint8Array(ab)
22
+ view.set(buffer)
23
+ resolve({
24
+ ok: (res.statusCode ?? 0) >= 200 && (res.statusCode ?? 0) < 300,
25
+ status: res.statusCode ?? 0,
26
+ text: async () => buffer.toString("utf-8"),
27
+ arrayBuffer: async () => ab,
28
+ })
29
+ })
30
+ })
31
+ req.on("error", reject)
32
+ })
33
+ }
34
+
35
+ /** Downloads an HTML page and its referenced assets into a src/ directory */
36
+ export const downloadPage = async (url: string, outputDir: string) => {
37
+ const srcDir = path.join(outputDir, "src")
38
+ fs.mkdirSync(srcDir, { recursive: true })
39
+
40
+ // Download the HTML
41
+ const response = await fetchPage(url)
42
+ if (!response.ok) throw new Error(`Failed to fetch ${url}: ${response.status}`)
43
+ let html = await response.text()
44
+
45
+ const baseURL = new URL(url)
46
+ const downloaded = new Set<string>()
47
+
48
+ // Find referenced assets (src, href, url())
49
+ const assetRefs = extractAssetRefs(html)
50
+
51
+ for (const ref of assetRefs) {
52
+ if (downloaded.has(ref)) continue
53
+ if (ref.startsWith("data:") || ref.startsWith("#") || ref.startsWith("javascript:")) continue
54
+
55
+ try {
56
+ const assetURL = new URL(ref, baseURL)
57
+ // Only download same-origin assets
58
+ if (assetURL.origin !== baseURL.origin) continue
59
+
60
+ const assetPath = assetURL.pathname.replace(/^\//, "")
61
+ if (!assetPath) continue
62
+ const localPath = path.join(srcDir, assetPath)
63
+
64
+ fs.mkdirSync(path.dirname(localPath), { recursive: true })
65
+
66
+ const assetResponse = await fetchPage(assetURL.href)
67
+ if (!assetResponse.ok) continue
68
+
69
+ const ab = await assetResponse.arrayBuffer()
70
+ fs.writeFileSync(localPath, new Uint8Array(ab))
71
+
72
+ // Rewrite reference in HTML to local path
73
+ html = html.replaceAll(ref, assetPath)
74
+ downloaded.add(ref)
75
+ } catch {
76
+ // Skip assets that fail to download
77
+ }
78
+ }
79
+
80
+ // Write the HTML file
81
+ fs.writeFileSync(path.join(srcDir, "index.html"), html)
82
+
83
+ console.log(` Saved index.html + ${downloaded.size} asset(s) to ${path.relative(process.cwd(), srcDir)}/`)
84
+ }
85
+
86
+ /** Extracts asset references from HTML using regex */
87
+ const extractAssetRefs = (html: string): string[] => {
88
+ const refs: string[] = []
89
+
90
+ // src="..." and href="..."
91
+ const attrRegex = /(?:src|href)=["']([^"']+)["']/gi
92
+ let match
93
+ while ((match = attrRegex.exec(html)) !== null) {
94
+ if (match[1]) refs.push(match[1])
95
+ }
96
+
97
+ // url("...") in CSS
98
+ const urlRegex = /url\(["']?([^"')]+)["']?\)/gi
99
+ while ((match = urlRegex.exec(html)) !== null) {
100
+ if (match[1]) refs.push(match[1])
101
+ }
102
+
103
+ return [...new Set(refs)]
104
+ }
package/src/index.ts ADDED
@@ -0,0 +1,56 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { login } from "./commands/login.js"
4
+ import { upload } from "./commands/upload.js"
5
+ import { gameCreate } from "./commands/game/create.js"
6
+
7
+ const [command, ...args] = process.argv.slice(2)
8
+
9
+ const printUsage = () => {
10
+ console.log(`Usage:
11
+ puzzmo login <token> Save a CLI auth token
12
+ puzzmo upload <slug> <dir> Upload game build from <dir>
13
+ puzzmo game create [token] Create a new Puzzmo game project`)
14
+ }
15
+
16
+ const run = async () => {
17
+ switch (command) {
18
+ case "login": {
19
+ const token = args[0]
20
+ if (!token) {
21
+ console.error("Usage: puzzmo login <token>")
22
+ process.exit(1)
23
+ }
24
+ login(token)
25
+ break
26
+ }
27
+ case "upload": {
28
+ const gameSlug = args[0]
29
+ const dir = args[1]
30
+ if (!gameSlug || !dir) {
31
+ console.error("Usage: puzzmo upload <gameSlug> <dir>")
32
+ process.exit(1)
33
+ }
34
+ await upload(gameSlug, dir)
35
+ break
36
+ }
37
+ case "game": {
38
+ const [subcommand, ...subArgs] = args
39
+ if (subcommand === "create") {
40
+ await gameCreate(subArgs)
41
+ } else {
42
+ console.error("Usage: puzzmo game create [token] [--name <name>] [--url <url>] [--agent <agent>]")
43
+ process.exit(1)
44
+ }
45
+ break
46
+ }
47
+ default:
48
+ printUsage()
49
+ break
50
+ }
51
+ }
52
+
53
+ run().catch((err) => {
54
+ console.error(err.message || err)
55
+ process.exit(1)
56
+ })
package/src/lib/api.ts ADDED
@@ -0,0 +1,75 @@
1
+ import fs from "node:fs"
2
+ import path from "node:path"
3
+
4
+ import { getAPIURL } from "./config.js"
5
+
6
+ const BATCH_SIZE = 10
7
+
8
+ type InitResponse = { sessionID: string; basePath: string; error?: string }
9
+ type FileResponse = { path: string; error?: string }
10
+ type CompleteResponse = { cdnBase: string; versionID: string; error?: string }
11
+
12
+ /** Callback for reporting batch upload progress */
13
+ export type UploadProgress = (batch: number, totalBatches: number, uploaded: number) => void
14
+
15
+ /** Sends a JSON POST request */
16
+ const jsonPost = async (url: string, token: string, body: object) => {
17
+ const res = await fetch(url, {
18
+ method: "POST",
19
+ headers: { Authorization: `Bearer ${token}`, "Content-Type": "application/json" },
20
+ body: JSON.stringify(body),
21
+ })
22
+ const json = await res.json()
23
+ if (!res.ok) throw new Error(`Server error (${res.status}): ${(json as any).error || "Unknown error"}`)
24
+ return json
25
+ }
26
+
27
+ /** Uploads a single file as raw binary with filename in query param */
28
+ const uploadFile = async (url: string, token: string, filePath: string, baseDir: string): Promise<FileResponse> => {
29
+ const relativePath = path.relative(baseDir, filePath)
30
+ const content = fs.readFileSync(filePath)
31
+
32
+ const res = await fetch(`${url}?name=${encodeURIComponent(relativePath)}`, {
33
+ method: "POST",
34
+ headers: {
35
+ Authorization: `Bearer ${token}`,
36
+ "Content-Type": "application/octet-stream",
37
+ },
38
+ body: content,
39
+ })
40
+ const json = await res.json()
41
+ if (!res.ok) throw new Error(`Server error (${res.status}): ${(json as any).error || "Unknown error"}`)
42
+ return json as FileResponse
43
+ }
44
+
45
+ /** Multi-step upload: init -> batched file uploads -> complete */
46
+ export const uploadFiles = async (
47
+ token: string,
48
+ gameSlug: string,
49
+ sha: string,
50
+ filePaths: string[],
51
+ baseDir: string,
52
+ onProgress?: UploadProgress,
53
+ ): Promise<CompleteResponse> => {
54
+ const apiURL = getAPIURL()
55
+
56
+ // Step 1: Init session
57
+ const init = (await jsonPost(`${apiURL}/cliUpload`, token, { gameSlug, sha })) as InitResponse
58
+
59
+ // Step 2: Upload files in concurrent batches
60
+ const fileURL = `${apiURL}/cliUpload/${init.sessionID}/file`
61
+ const totalBatches = Math.ceil(filePaths.length / BATCH_SIZE)
62
+ let totalUploaded = 0
63
+
64
+ for (let i = 0; i < filePaths.length; i += BATCH_SIZE) {
65
+ const batch = filePaths.slice(i, i + BATCH_SIZE)
66
+ const batchNum = Math.floor(i / BATCH_SIZE) + 1
67
+ await Promise.all(batch.map((fp) => uploadFile(fileURL, token, fp, baseDir)))
68
+ totalUploaded += batch.length
69
+ onProgress?.(batchNum, totalBatches, totalUploaded)
70
+ }
71
+
72
+ // Step 3: Complete
73
+ return (await jsonPost(`${apiURL}/cliUpload/${init.sessionID}/complete`, token, {})) as CompleteResponse
74
+ }
75
+
@@ -0,0 +1,37 @@
1
+ import fs from "node:fs"
2
+ import os from "node:os"
3
+ import path from "node:path"
4
+
5
+ const configDir = path.join(os.homedir(), ".puzzmo")
6
+ const configPath = path.join(configDir, "config.json")
7
+
8
+ type Config = {
9
+ token?: string
10
+ apiURL?: string
11
+ }
12
+
13
+ /** Reads the CLI config from ~/.puzzmo/config.json */
14
+ export const readConfig = (): Config => {
15
+ try {
16
+ const raw = fs.readFileSync(configPath, "utf-8")
17
+ return JSON.parse(raw)
18
+ } catch {
19
+ return {}
20
+ }
21
+ }
22
+
23
+ /** Writes the CLI config to ~/.puzzmo/config.json */
24
+ export const writeConfig = (config: Config) => {
25
+ fs.mkdirSync(configDir, { recursive: true })
26
+ fs.writeFileSync(configPath, JSON.stringify(config, null, 2) + "\n")
27
+ }
28
+
29
+ /** Returns the auth token from config or PUZZMO_TOKEN env var */
30
+ export const getToken = (): string | undefined => {
31
+ return process.env.PUZZMO_TOKEN || readConfig().token
32
+ }
33
+
34
+ /** Returns the API base URL */
35
+ export const getAPIURL = (): string => {
36
+ return process.env.PUZZMO_API_URL || readConfig().apiURL || "https://api.puzzmo.com"
37
+ }
@@ -0,0 +1,38 @@
1
+ import { execSync } from "node:child_process"
2
+
3
+ type ExecOptions = { cwd?: string }
4
+
5
+ /** Runs a shell command, printing output */
6
+ export const runCommand = (cmd: string, opts: ExecOptions = {}) => {
7
+ execSync(cmd, {
8
+ cwd: opts.cwd,
9
+ stdio: "inherit",
10
+ encoding: "utf-8",
11
+ })
12
+ }
13
+
14
+ /** Runs a command and returns stdout */
15
+ export const runCommandOutput = (cmd: string, opts: ExecOptions = {}): string => {
16
+ return execSync(cmd, {
17
+ cwd: opts.cwd,
18
+ encoding: "utf-8",
19
+ }).trim()
20
+ }
21
+
22
+ /** Creates a git commit */
23
+ export const gitCommit = (message: string, opts: ExecOptions = {}) => {
24
+ execSync(`git commit -m "${message}"`, {
25
+ cwd: opts.cwd,
26
+ stdio: "inherit",
27
+ })
28
+ }
29
+
30
+ /** Runs vite build and returns success/failure */
31
+ export const verifyBuild = (cwd: string): { success: boolean; error?: string } => {
32
+ try {
33
+ execSync("npx vite build", { cwd, encoding: "utf-8", stdio: "pipe" })
34
+ return { success: true }
35
+ } catch (e: any) {
36
+ return { success: false, error: e.stderr || e.stdout || e.message }
37
+ }
38
+ }