@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.
- package/README.md +16 -92
- package/bin/jolly +2 -0
- package/package.json +27 -24
- package/src/index.ts +2095 -0
- package/src/lib/cloud-api.ts +527 -0
- package/src/lib/env-file.ts +68 -0
- package/src/lib/saleor-url.ts +37 -0
- package/.env.example +0 -3
- package/.mcp.json +0 -7
- package/.sisyphus/boulder.json +0 -13
- package/.sisyphus/notepads/saleor-agent-cli/decisions.md +0 -11
- package/.sisyphus/notepads/saleor-agent-cli/issues.md +0 -6
- package/.sisyphus/notepads/saleor-agent-cli/learnings.md +0 -6
- package/.sisyphus/plans/saleor-agent-cli.md +0 -600
- package/AGENTS.md +0 -46
- package/bun.lock +0 -123
- package/bunfig.toml +0 -8
- package/dist/agent.js +0 -258
- package/dist/bootstrap.js +0 -184
- package/dist/index.js +0 -722
- package/src/agents/index.ts +0 -1
- package/src/agents/setup.ts +0 -210
- package/src/api/auth.ts +0 -75
- package/src/api/client.ts +0 -152
- package/src/api/endpoints.ts +0 -8
- package/src/api/index.ts +0 -4
- package/src/cli/agent.ts +0 -26
- package/src/cli/bootstrap.ts +0 -24
- package/src/cli/commands/agent.ts +0 -40
- package/src/cli/commands/app.ts +0 -61
- package/src/cli/commands/config.ts +0 -38
- package/src/cli/commands/store.ts +0 -75
- package/src/cli/index.ts +0 -16
- package/src/commands/app.ts +0 -126
- package/src/commands/index.ts +0 -1
- package/src/commands/store.ts +0 -64
- package/src/test/command-handlers.test.ts +0 -232
- package/src/test/e2e-flows.test.ts +0 -231
- package/src/test/entry-points.test.ts +0 -126
- package/src/test/error-handling.test.ts +0 -137
- package/src/test/helpers.ts +0 -49
- package/src/test/index.ts +0 -1
- package/src/test/mocks.ts +0 -172
- package/src/test/setup.ts +0 -29
- package/src/tui/components.ts +0 -77
- package/src/tui/index.ts +0 -3
- package/src/tui/renderer.ts +0 -34
- package/src/tui/theme.ts +0 -38
- 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
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
|
-
});
|