@dk/jolly 0.1.8 → 0.1.10

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 (49) hide show
  1. package/README.md +16 -92
  2. package/bin/jolly +2 -0
  3. package/package.json +27 -24
  4. package/src/index.ts +2095 -0
  5. package/src/lib/cloud-api.ts +527 -0
  6. package/src/lib/env-file.ts +68 -0
  7. package/src/lib/saleor-url.ts +37 -0
  8. package/.env.example +0 -3
  9. package/.mcp.json +0 -7
  10. package/.sisyphus/boulder.json +0 -13
  11. package/.sisyphus/notepads/saleor-agent-cli/decisions.md +0 -11
  12. package/.sisyphus/notepads/saleor-agent-cli/issues.md +0 -6
  13. package/.sisyphus/notepads/saleor-agent-cli/learnings.md +0 -6
  14. package/.sisyphus/plans/saleor-agent-cli.md +0 -600
  15. package/AGENTS.md +0 -46
  16. package/bun.lock +0 -123
  17. package/bunfig.toml +0 -8
  18. package/dist/agent.js +0 -258
  19. package/dist/bootstrap.js +0 -184
  20. package/dist/index.js +0 -722
  21. package/src/agents/index.ts +0 -1
  22. package/src/agents/setup.ts +0 -210
  23. package/src/api/auth.ts +0 -75
  24. package/src/api/client.ts +0 -152
  25. package/src/api/endpoints.ts +0 -8
  26. package/src/api/index.ts +0 -4
  27. package/src/cli/agent.ts +0 -26
  28. package/src/cli/bootstrap.ts +0 -24
  29. package/src/cli/commands/agent.ts +0 -40
  30. package/src/cli/commands/app.ts +0 -61
  31. package/src/cli/commands/config.ts +0 -38
  32. package/src/cli/commands/store.ts +0 -75
  33. package/src/cli/index.ts +0 -16
  34. package/src/commands/app.ts +0 -126
  35. package/src/commands/index.ts +0 -1
  36. package/src/commands/store.ts +0 -64
  37. package/src/test/command-handlers.test.ts +0 -232
  38. package/src/test/e2e-flows.test.ts +0 -231
  39. package/src/test/entry-points.test.ts +0 -126
  40. package/src/test/error-handling.test.ts +0 -137
  41. package/src/test/helpers.ts +0 -49
  42. package/src/test/index.ts +0 -1
  43. package/src/test/mocks.ts +0 -172
  44. package/src/test/setup.ts +0 -29
  45. package/src/tui/components.ts +0 -77
  46. package/src/tui/index.ts +0 -3
  47. package/src/tui/renderer.ts +0 -34
  48. package/src/tui/theme.ts +0 -38
  49. package/tsconfig.json +0 -20
package/bun.lock DELETED
@@ -1,123 +0,0 @@
1
- {
2
- "lockfileVersion": 1,
3
- "configVersion": 1,
4
- "workspaces": {
5
- "": {
6
- "name": "@saleor/jolly",
7
- "dependencies": {
8
- "@dotenvx/dotenvx": "^1.59.1",
9
- "yargs": "^17.7.2",
10
- },
11
- "devDependencies": {
12
- "@types/yargs": "^17.0.32",
13
- "bun-types": "^1.3.11",
14
- "typescript": "^5.4.0",
15
- },
16
- },
17
- },
18
- "packages": {
19
- "@dotenvx/dotenvx": ["@dotenvx/dotenvx@1.59.1", "", { "dependencies": { "commander": "^11.1.0", "dotenv": "^17.2.1", "eciesjs": "^0.4.10", "execa": "^5.1.1", "fdir": "^6.2.0", "ignore": "^5.3.0", "object-treeify": "1.1.33", "picomatch": "^4.0.2", "which": "^4.0.0" }, "bin": { "dotenvx": "src/cli/dotenvx.js" } }, "sha512-Qg+meC+XFxliuVSDlEPkKnaUjdaJKK6FNx/Wwl2UxhQR8pyPIuLhMavsF7ePdB9qFZUWV1jEK3ckbJir/WmF4w=="],
20
-
21
- "@ecies/ciphers": ["@ecies/ciphers@0.2.6", "", { "peerDependencies": { "@noble/ciphers": "^1.0.0" } }, "sha512-patgsRPKGkhhoBjETV4XxD0En4ui5fbX0hzayqI3M8tvNMGUoUvmyYAIWwlxBc1KX5cturfqByYdj5bYGRpN9g=="],
22
-
23
- "@noble/ciphers": ["@noble/ciphers@1.3.0", "", {}, "sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw=="],
24
-
25
- "@noble/curves": ["@noble/curves@1.9.7", "", { "dependencies": { "@noble/hashes": "1.8.0" } }, "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw=="],
26
-
27
- "@noble/hashes": ["@noble/hashes@1.8.0", "", {}, "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A=="],
28
-
29
- "@types/node": ["@types/node@25.5.0", "", { "dependencies": { "undici-types": "~7.18.0" } }, "sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw=="],
30
-
31
- "@types/yargs": ["@types/yargs@17.0.35", "", { "dependencies": { "@types/yargs-parser": "*" } }, "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg=="],
32
-
33
- "@types/yargs-parser": ["@types/yargs-parser@21.0.3", "", {}, "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ=="],
34
-
35
- "ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
36
-
37
- "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="],
38
-
39
- "bun-types": ["bun-types@1.3.11", "", { "dependencies": { "@types/node": "*" } }, "sha512-1KGPpoxQWl9f6wcZh57LvrPIInQMn2TQ7jsgxqpRzg+l0QPOFvJVH7HmvHo/AiPgwXy+/Thf6Ov3EdVn1vOabg=="],
40
-
41
- "cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="],
42
-
43
- "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="],
44
-
45
- "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="],
46
-
47
- "commander": ["commander@11.1.0", "", {}, "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ=="],
48
-
49
- "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="],
50
-
51
- "dotenv": ["dotenv@17.4.0", "", {}, "sha512-kCKF62fwtzwYm0IGBNjRUjtJgMfGapII+FslMHIjMR5KTnwEmBmWLDRSnc3XSNP8bNy34tekgQyDT0hr7pERRQ=="],
52
-
53
- "eciesjs": ["eciesjs@0.4.18", "", { "dependencies": { "@ecies/ciphers": "^0.2.5", "@noble/ciphers": "^1.3.0", "@noble/curves": "^1.9.7", "@noble/hashes": "^1.8.0" } }, "sha512-wG99Zcfcys9fZux7Cft8BAX/YrOJLJSZ3jyYPfhZHqN2E+Ffx+QXBDsv3gubEgPtV6dTzJMSQUwk1H98/t/0wQ=="],
54
-
55
- "emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="],
56
-
57
- "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="],
58
-
59
- "execa": ["execa@5.1.1", "", { "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", "human-signals": "^2.1.0", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^4.0.1", "onetime": "^5.1.2", "signal-exit": "^3.0.3", "strip-final-newline": "^2.0.0" } }, "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg=="],
60
-
61
- "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="],
62
-
63
- "get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="],
64
-
65
- "get-stream": ["get-stream@6.0.1", "", {}, "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg=="],
66
-
67
- "human-signals": ["human-signals@2.1.0", "", {}, "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw=="],
68
-
69
- "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="],
70
-
71
- "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="],
72
-
73
- "is-stream": ["is-stream@2.0.1", "", {}, "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="],
74
-
75
- "isexe": ["isexe@3.1.5", "", {}, "sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w=="],
76
-
77
- "merge-stream": ["merge-stream@2.0.0", "", {}, "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="],
78
-
79
- "mimic-fn": ["mimic-fn@2.1.0", "", {}, "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="],
80
-
81
- "npm-run-path": ["npm-run-path@4.0.1", "", { "dependencies": { "path-key": "^3.0.0" } }, "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw=="],
82
-
83
- "object-treeify": ["object-treeify@1.1.33", "", {}, "sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A=="],
84
-
85
- "onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="],
86
-
87
- "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="],
88
-
89
- "picomatch": ["picomatch@4.0.4", "", {}, "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A=="],
90
-
91
- "require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="],
92
-
93
- "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="],
94
-
95
- "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="],
96
-
97
- "signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="],
98
-
99
- "string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="],
100
-
101
- "strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
102
-
103
- "strip-final-newline": ["strip-final-newline@2.0.0", "", {}, "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="],
104
-
105
- "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="],
106
-
107
- "undici-types": ["undici-types@7.18.2", "", {}, "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w=="],
108
-
109
- "which": ["which@4.0.0", "", { "dependencies": { "isexe": "^3.1.1" }, "bin": { "node-which": "bin/which.js" } }, "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg=="],
110
-
111
- "wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="],
112
-
113
- "y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="],
114
-
115
- "yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="],
116
-
117
- "yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="],
118
-
119
- "cross-spawn/which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="],
120
-
121
- "cross-spawn/which/isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="],
122
- }
123
- }
package/bunfig.toml DELETED
@@ -1,8 +0,0 @@
1
- [build]
2
- target = "node"
3
-
4
- [install]
5
- peer = true
6
-
7
- [test]
8
- root = "src/test"
package/dist/agent.js DELETED
@@ -1,258 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- // src/agents/setup.ts
4
- import { writeFileSync, mkdirSync, existsSync } from "fs";
5
- import { spawnSync } from "child_process";
6
- import { join } from "path";
7
-
8
- // src/tui/theme.ts
9
- var theme = {
10
- reset: "\x1B[0m",
11
- bold: "\x1B[1m",
12
- dim: "\x1B[2m",
13
- italic: "\x1B[3m",
14
- underline: "\x1B[4m",
15
- fg: {
16
- black: "\x1B[30m",
17
- red: "\x1B[31m",
18
- green: "\x1B[32m",
19
- yellow: "\x1B[33m",
20
- blue: "\x1B[34m",
21
- magenta: "\x1B[35m",
22
- cyan: "\x1B[36m",
23
- white: "\x1B[37m",
24
- gray: "\x1B[90m",
25
- brightBlack: "\x1B[30;1m",
26
- brightRed: "\x1B[31;1m",
27
- brightGreen: "\x1B[32;1m",
28
- brightYellow: "\x1B[33;1m",
29
- brightBlue: "\x1B[34;1m",
30
- brightMagenta: "\x1B[35;1m",
31
- brightCyan: "\x1B[36;1m",
32
- brightWhite: "\x1B[37;1m"
33
- },
34
- bg: {
35
- black: "\x1B[40m",
36
- red: "\x1B[41m",
37
- green: "\x1B[42m",
38
- yellow: "\x1B[43m",
39
- blue: "\x1B[44m",
40
- magenta: "\x1B[45m",
41
- cyan: "\x1B[46m",
42
- white: "\x1B[47m"
43
- }
44
- };
45
-
46
- // src/tui/components.ts
47
- function text(content, color) {
48
- return `${color || theme.fg.white}${content}${theme.reset}`;
49
- }
50
- function success(msg) {
51
- return text(msg, theme.fg.green);
52
- }
53
- function info(msg) {
54
- return text(msg, theme.fg.cyan);
55
- }
56
-
57
- // src/agents/setup.ts
58
- var AGENT_PATHS = {
59
- opencode: {
60
- skills: ".agents/skills",
61
- agentsMd: "AGENTS.md",
62
- mcpJson: ".mcp.json"
63
- },
64
- claude: {
65
- skills: ".claude/skills",
66
- agentsMd: "CLAUDE.md",
67
- mcpJson: ".mcp.json"
68
- },
69
- openclaw: {
70
- skills: ".openclaw/skills",
71
- agentsMd: "AGENTS.md",
72
- mcpJson: ".mcp.json"
73
- },
74
- nanobot: {
75
- skills: ".nanobot/skills",
76
- agentsMd: "AGENTS.md",
77
- mcpJson: ".mcp.json"
78
- }
79
- };
80
- var SKILLS = [
81
- "saleor-app",
82
- "saleor-configurator",
83
- "saleor-core",
84
- "saleor-storefront"
85
- ];
86
- async function setupAgent(projectPath = ".") {
87
- info("Detecting AI agents...");
88
- const detectedAgents = detectAgents(projectPath);
89
- if (detectedAgents.length === 0) {
90
- info("No AI agents detected. Installing skills anyway...");
91
- installSkills(projectPath, "opencode");
92
- createAgentsMd(projectPath);
93
- createMcpConfig(projectPath);
94
- return;
95
- }
96
- info(`Detected agents: ${detectedAgents.map((a) => a.name).join(", ")}
97
- `);
98
- for (const agent of detectedAgents) {
99
- info(`Configuring ${agent.name}...`);
100
- installSkills(projectPath, agent.name);
101
- createAgentsMd(projectPath, agent.name);
102
- createMcpConfig(projectPath);
103
- success(` ${agent.name} configured!`);
104
- }
105
- success(`
106
- Agent setup complete!`);
107
- info(`
108
- Skills installed: ` + SKILLS.join(", "));
109
- info("AGENTS.md created with Saleor conventions");
110
- info(".mcp.json configured for saleor-mcp");
111
- }
112
- async function installSkillsCommand(projectPath = ".") {
113
- info("Installing Saleor agent skills...");
114
- info("Skills: " + SKILLS.join(", "));
115
- const detectedAgents = detectAgents(projectPath);
116
- if (detectedAgents.length === 0) {
117
- installSkills(projectPath, "opencode");
118
- } else {
119
- for (const agent of detectedAgents) {
120
- installSkills(projectPath, agent.name);
121
- }
122
- }
123
- success(`
124
- Skills installed successfully!`);
125
- }
126
- function detectAgents(projectPath) {
127
- const detected = [];
128
- const filesToCheck = [
129
- { name: "opencode", file: ".agents/skills" },
130
- { name: "claude", file: ".claude" },
131
- { name: "openclaw", file: ".openclaw" },
132
- { name: "nanobot", file: ".nanobot" }
133
- ];
134
- for (const { name, file } of filesToCheck) {
135
- const fullPath = join(projectPath, file);
136
- if (existsSync(fullPath)) {
137
- detected.push({
138
- name,
139
- path: fullPath,
140
- skillsPath: join(fullPath, "skills")
141
- });
142
- }
143
- }
144
- return detected;
145
- }
146
- function installSkills(projectPath, agentName) {
147
- const agentPaths = AGENT_PATHS[agentName];
148
- const skillsDir = join(projectPath, agentPaths.skills);
149
- mkdirSync(skillsDir, { recursive: true });
150
- info(` Installing skills to ${skillsDir}...`);
151
- const skillUrl = "https://github.com/saleor/agent-skills";
152
- const baseDir = join(skillsDir, "..");
153
- try {
154
- const result = spawnSync("git", ["clone", "--depth", "1", skillUrl, "skills"], {
155
- cwd: baseDir,
156
- stdio: "pipe"
157
- });
158
- if (result.status === 0) {
159
- for (const skill of SKILLS) {
160
- info(` Installed ${skill}`);
161
- }
162
- success(` Skills installed to ${skillsDir}`);
163
- } else {
164
- info(` Could not clone skills, skipping...`);
165
- }
166
- } catch {
167
- info(` Could not clone skills, skipping...`);
168
- }
169
- }
170
- function createAgentsMd(projectPath, agentName = "opencode") {
171
- const agentsMdContent = `# Saleor Development Guide
172
-
173
- This project uses Saleor e-commerce platform.
174
-
175
- ## Commands
176
-
177
- \`\`\`bash
178
- # Development
179
- npm run dev
180
-
181
- # Build
182
- npm run build
183
-
184
- # Test
185
- npm run test
186
-
187
- # Lint
188
- npm run lint
189
- \`\`\`
190
-
191
- ## Saleor Cloud
192
-
193
- - Dashboard: https://cloud.saleor.io
194
- - Documentation: https://docs.saleor.io
195
- - API Reference: https://docs.saleor.io/api
196
-
197
- ## Saleor Skills
198
-
199
- This project includes Saleor agent skills:
200
- - saleor-app: App development patterns
201
- - saleor-configurator: Config as code
202
- - saleor-core: Backend internals
203
- - saleor-storefront: Storefront patterns
204
-
205
- ## MCP Server
206
-
207
- Configure saleor-mcp for AI agent capabilities:
208
- \`\`\`json
209
- {
210
- "mcpServers": {
211
- "saleor": {
212
- "url": "https://mcp.saleor.app"
213
- }
214
- }
215
- }
216
- \`\`\`
217
- `;
218
- const agentsMdPath = join(projectPath, "AGENTS.md");
219
- writeFileSync(agentsMdPath, agentsMdContent);
220
- info(` Created AGENTS.md`);
221
- }
222
- function createMcpConfig(projectPath) {
223
- const mcpConfig = {
224
- mcpServers: {
225
- saleor: {
226
- url: "https://mcp.saleor.app"
227
- }
228
- }
229
- };
230
- const mcpPath = join(projectPath, ".mcp.json");
231
- writeFileSync(mcpPath, JSON.stringify(mcpConfig, null, 2));
232
- info(` Created .mcp.json`);
233
- }
234
-
235
- // src/cli/agent.ts
236
- async function main() {
237
- const args = process.argv.slice(2);
238
- const action = args[0] || "setup";
239
- if (action === "setup" || action === "install") {
240
- console.log("Saleor Agent Setup");
241
- console.log(`-------------------
242
- `);
243
- await setupAgent(".");
244
- console.log(`
245
- Agent configured successfully!`);
246
- console.log("Restart your AI agent to enable Saleor capabilities.");
247
- } else if (action === "skills") {
248
- await installSkillsCommand(".");
249
- } else {
250
- console.error(`Unknown action: ${action}`);
251
- console.log("Usage: jolly-agent [setup|skills]");
252
- process.exit(1);
253
- }
254
- }
255
- main().catch((err) => {
256
- console.error(`Agent setup failed: ${err}`);
257
- process.exit(1);
258
- });
package/dist/bootstrap.js DELETED
@@ -1,184 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- // src/api/client.ts
4
- class SaleorCloudClient {
5
- baseUrl = "https://cloud.saleor.io/api/v1";
6
- token;
7
- constructor(token) {
8
- this.token = token || process.env.SALEOR_CLOUD_TOKEN || "";
9
- if (!this.token) {
10
- throw new Error("SALEOR_CLOUD_TOKEN environment variable is required");
11
- }
12
- }
13
- async request(endpoint, options) {
14
- const mergedOptions = {
15
- method: options?.method || "GET",
16
- ...options,
17
- headers: {
18
- Authorization: `Token ${this.token}`,
19
- "Content-Type": "application/json",
20
- ...options?.headers
21
- }
22
- };
23
- const response = await fetch(`${this.baseUrl}${endpoint}`, mergedOptions);
24
- if (!response.ok) {
25
- const body = await response.text();
26
- const truncatedBody = body.length > 200 ? body.substring(0, 200) + "..." : body;
27
- throw new Error(`API error: ${response.status} ${response.statusText} - ${truncatedBody}`);
28
- }
29
- return response.json();
30
- }
31
- async getOrganizations() {
32
- return this.request("/organizations");
33
- }
34
- async getProjects(organizationSlug) {
35
- return this.request(`/organizations/${organizationSlug}/projects`);
36
- }
37
- async createProject(organizationSlug, name, region) {
38
- return this.request(`/organizations/${organizationSlug}/projects`, {
39
- method: "POST",
40
- body: JSON.stringify({ name, region })
41
- });
42
- }
43
- async getEnvironments(organizationSlug, projectSlug) {
44
- return this.request(`/organizations/${organizationSlug}/projects/${projectSlug}/environments`);
45
- }
46
- async createEnvironment(organizationSlug, projectSlug, name, region) {
47
- return this.request(`/organizations/${organizationSlug}/projects/${projectSlug}/environments`, {
48
- method: "POST",
49
- body: JSON.stringify({ name, region })
50
- });
51
- }
52
- async getEnvironment(organizationSlug, projectSlug, environmentSlug) {
53
- return this.request(`/organizations/${organizationSlug}/projects/${projectSlug}/environments/${environmentSlug}`);
54
- }
55
- async registerApp(environmentId, appType, name) {
56
- return this.request(`/environments/${environmentId}/apps`, {
57
- method: "POST",
58
- body: JSON.stringify({ type: appType, name })
59
- });
60
- }
61
- async getStores() {
62
- return this.getOrganizations();
63
- }
64
- async createStore(name, region = "us-east-1") {
65
- const { organizations } = await this.getOrganizations();
66
- if (organizations.length === 0) {
67
- throw new Error("No organizations found. Create one at https://cloud.saleor.io");
68
- }
69
- return this.createProject(organizations[0].slug, name, region);
70
- }
71
- async createEnvironmentFromStore(storeId, name) {
72
- const { environments } = await this.getEnvironments(storeId, "default");
73
- return this.createEnvironment(storeId, environments.length > 0 ? environments[0].project?.slug || "default" : "default", name, "default");
74
- }
75
- }
76
-
77
- // src/api/auth.ts
78
- import { config } from "@dotenvx/dotenvx";
79
- config();
80
- function requireToken() {
81
- const token = process.env.SALEOR_CLOUD_TOKEN;
82
- if (!token) {
83
- console.error(`
84
- \uD83D\uDD11 Saleor Cloud Token Required`);
85
- console.error(` Get your token at: https://cloud.saleor.io/settings/api-tokens
86
- `);
87
- console.error("Or create a .env file with: SALEOR_CLOUD_TOKEN=your-token");
88
- console.error(`
89
- To set token: export SALEOR_CLOUD_TOKEN=your-token
90
- `);
91
- process.exit(1);
92
- }
93
- return token;
94
- }
95
-
96
- // src/tui/theme.ts
97
- var theme = {
98
- reset: "\x1B[0m",
99
- bold: "\x1B[1m",
100
- dim: "\x1B[2m",
101
- italic: "\x1B[3m",
102
- underline: "\x1B[4m",
103
- fg: {
104
- black: "\x1B[30m",
105
- red: "\x1B[31m",
106
- green: "\x1B[32m",
107
- yellow: "\x1B[33m",
108
- blue: "\x1B[34m",
109
- magenta: "\x1B[35m",
110
- cyan: "\x1B[36m",
111
- white: "\x1B[37m",
112
- gray: "\x1B[90m",
113
- brightBlack: "\x1B[30;1m",
114
- brightRed: "\x1B[31;1m",
115
- brightGreen: "\x1B[32;1m",
116
- brightYellow: "\x1B[33;1m",
117
- brightBlue: "\x1B[34;1m",
118
- brightMagenta: "\x1B[35;1m",
119
- brightCyan: "\x1B[36;1m",
120
- brightWhite: "\x1B[37;1m"
121
- },
122
- bg: {
123
- black: "\x1B[40m",
124
- red: "\x1B[41m",
125
- green: "\x1B[42m",
126
- yellow: "\x1B[43m",
127
- blue: "\x1B[44m",
128
- magenta: "\x1B[45m",
129
- cyan: "\x1B[46m",
130
- white: "\x1B[47m"
131
- }
132
- };
133
-
134
- // src/tui/components.ts
135
- function text(content, color) {
136
- return `${color || theme.fg.white}${content}${theme.reset}`;
137
- }
138
- function success(msg) {
139
- return text(msg, theme.fg.green);
140
- }
141
- function error(msg) {
142
- return text(msg, theme.fg.red);
143
- }
144
- function info(msg) {
145
- return text(msg, theme.fg.cyan);
146
- }
147
-
148
- // src/commands/store.ts
149
- async function createStore(name, region) {
150
- const token = requireToken();
151
- const client = new SaleorCloudClient(token);
152
- console.log(info(`Creating store: ${name} in ${region}...`));
153
- try {
154
- const result = await client.createStore(name, region);
155
- console.log(success(`Store created successfully!`));
156
- console.log(info(`Project slug: ${result.project.slug}`));
157
- console.log(info(`Dashboard: https://cloud.saleor.io/organizations/default/projects/${result.project.slug}`));
158
- } catch (err) {
159
- console.log(error(`Failed to create store: ${err}`));
160
- process.exit(1);
161
- }
162
- }
163
-
164
- // src/cli/bootstrap.ts
165
- async function main() {
166
- const args = process.argv.slice(2);
167
- const projectName = args[0];
168
- if (projectName) {
169
- console.log(`Bootstrapping Saleor project: ${projectName}...`);
170
- await createStore(projectName, "us-east-1");
171
- return;
172
- }
173
- console.log("Saleor Store Bootstrapper");
174
- console.log(`------------------------
175
- `);
176
- console.log("Usage: npm create @saleor/jolly <project-name>");
177
- console.log("Or: jolly store create --name <name>");
178
- console.log(`
179
- For app scaffolding: jolly app create --name <name> --type <type>`);
180
- }
181
- main().catch((err) => {
182
- console.error(`Bootstrap failed: ${err}`);
183
- process.exit(1);
184
- });