upclaw-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 (53) hide show
  1. package/README.md +188 -0
  2. package/dist/commands/info.d.ts +2 -0
  3. package/dist/commands/info.d.ts.map +1 -0
  4. package/dist/commands/info.js +44 -0
  5. package/dist/commands/info.js.map +1 -0
  6. package/dist/commands/install.d.ts +4 -0
  7. package/dist/commands/install.d.ts.map +1 -0
  8. package/dist/commands/install.js +100 -0
  9. package/dist/commands/install.js.map +1 -0
  10. package/dist/commands/list.d.ts +4 -0
  11. package/dist/commands/list.d.ts.map +1 -0
  12. package/dist/commands/list.js +43 -0
  13. package/dist/commands/list.js.map +1 -0
  14. package/dist/commands/login.d.ts +5 -0
  15. package/dist/commands/login.d.ts.map +1 -0
  16. package/dist/commands/login.js +111 -0
  17. package/dist/commands/login.js.map +1 -0
  18. package/dist/commands/publish.d.ts +10 -0
  19. package/dist/commands/publish.d.ts.map +1 -0
  20. package/dist/commands/publish.js +163 -0
  21. package/dist/commands/publish.js.map +1 -0
  22. package/dist/commands/search.d.ts +9 -0
  23. package/dist/commands/search.d.ts.map +1 -0
  24. package/dist/commands/search.js +47 -0
  25. package/dist/commands/search.js.map +1 -0
  26. package/dist/commands/whoami.d.ts +2 -0
  27. package/dist/commands/whoami.d.ts.map +1 -0
  28. package/dist/commands/whoami.js +22 -0
  29. package/dist/commands/whoami.js.map +1 -0
  30. package/dist/config.d.ts +10 -0
  31. package/dist/config.d.ts.map +1 -0
  32. package/dist/config.js +13 -0
  33. package/dist/config.js.map +1 -0
  34. package/dist/index.d.ts +3 -0
  35. package/dist/index.d.ts.map +1 -0
  36. package/dist/index.js +59 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/utils/api.d.ts +5 -0
  39. package/dist/utils/api.d.ts.map +1 -0
  40. package/dist/utils/api.js +31 -0
  41. package/dist/utils/api.js.map +1 -0
  42. package/package.json +49 -0
  43. package/src/commands/info.ts +42 -0
  44. package/src/commands/install.ts +73 -0
  45. package/src/commands/list.ts +47 -0
  46. package/src/commands/login.ts +80 -0
  47. package/src/commands/publish.ts +152 -0
  48. package/src/commands/search.ts +56 -0
  49. package/src/commands/whoami.ts +18 -0
  50. package/src/config.ts +14 -0
  51. package/src/index.ts +67 -0
  52. package/src/utils/api.ts +26 -0
  53. package/tsconfig.json +21 -0
package/README.md ADDED
@@ -0,0 +1,188 @@
1
+ # @upclaw/cli
2
+
3
+ Command-line interface for UpClaw marketplace - buy and sell OpenClaw agent skills.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install -g @upclaw/cli
9
+ ```
10
+
11
+ ## Quick Start
12
+
13
+ ```bash
14
+ # Login with your wallet
15
+ upclaw login
16
+
17
+ # Search for skills
18
+ upclaw search "web scraping"
19
+
20
+ # Install a skill
21
+ upclaw install skill-name
22
+
23
+ # Publish your own skill
24
+ cd my-skill-directory
25
+ upclaw publish
26
+ ```
27
+
28
+ ## Commands
29
+
30
+ ### `upclaw login`
31
+
32
+ Authenticate with your wallet private key.
33
+
34
+ ```bash
35
+ # Interactive prompt
36
+ upclaw login
37
+
38
+ # With private key
39
+ upclaw login --private-key 0x...
40
+
41
+ # With keystore file
42
+ upclaw login --keystore ./wallet.json
43
+ ```
44
+
45
+ ### `upclaw whoami`
46
+
47
+ Show current authentication status.
48
+
49
+ ```bash
50
+ upclaw whoami
51
+ ```
52
+
53
+ ### `upclaw search <query>`
54
+
55
+ Search the marketplace for skills.
56
+
57
+ ```bash
58
+ # Basic search
59
+ upclaw search "data analysis"
60
+
61
+ # With filters
62
+ upclaw search "automation" --category automation --max-price 50
63
+
64
+ # Limit results
65
+ upclaw search "web" --limit 10
66
+ ```
67
+
68
+ ### `upclaw info <skill-name>`
69
+
70
+ View detailed information about a skill.
71
+
72
+ ```bash
73
+ upclaw info web-scraper-pro
74
+ ```
75
+
76
+ ### `upclaw install <skill-id>`
77
+
78
+ Purchase and install a skill.
79
+
80
+ ```bash
81
+ # Install to default directory (~/.upclaw/skills)
82
+ upclaw install abc123
83
+
84
+ # Install to custom directory
85
+ upclaw install abc123 --output ./my-skills
86
+ ```
87
+
88
+ ### `upclaw list`
89
+
90
+ List your owned skills.
91
+
92
+ ```bash
93
+ # Table format
94
+ upclaw list
95
+
96
+ # JSON format
97
+ upclaw list --format json
98
+ ```
99
+
100
+ ### `upclaw publish`
101
+
102
+ Publish current directory as a skill.
103
+
104
+ ```bash
105
+ # Interactive mode
106
+ upclaw publish
107
+
108
+ # With options
109
+ upclaw publish \
110
+ --name "My Awesome Skill" \
111
+ --description "Does amazing things" \
112
+ --category automation \
113
+ --price 25.00 \
114
+ --version 1.0.0
115
+ ```
116
+
117
+ ## Skill Structure
118
+
119
+ Your skill directory must include:
120
+
121
+ ```
122
+ my-skill/
123
+ ├── SKILL.md # Documentation (required)
124
+ ├── package.json # Dependencies (required)
125
+ ├── src/
126
+ │ └── index.js # Main code
127
+ ├── tests/
128
+ │ └── test.spec.js
129
+ └── README.md # Overview
130
+ ```
131
+
132
+ ## Configuration
133
+
134
+ The CLI stores configuration in `~/.config/upclaw-cli/config.json`
135
+
136
+ To use a custom API endpoint:
137
+
138
+ ```bash
139
+ export UPCLAW_API_URL=http://localhost:3000/api
140
+ ```
141
+
142
+ ## Agent Integration
143
+
144
+ Use the CLI in your agent scripts:
145
+
146
+ ```javascript
147
+ import { spawn } from 'child_process';
148
+
149
+ async function installSkill(skillName) {
150
+ return new Promise((resolve, reject) => {
151
+ const proc = spawn('upclaw', ['install', skillName]);
152
+ proc.on('close', (code) => {
153
+ if (code === 0) resolve();
154
+ else reject();
155
+ });
156
+ });
157
+ }
158
+
159
+ // Install required skill
160
+ await installSkill('data-processor-v2');
161
+
162
+ // Load the skill
163
+ import(process.env.HOME + '/.upclaw/skills/data-processor-v2');
164
+ ```
165
+
166
+ ## Troubleshooting
167
+
168
+ ### "Not authenticated"
169
+
170
+ Run `upclaw login` to authenticate first.
171
+
172
+ ### "Skill not found"
173
+
174
+ Use `upclaw search` to find the correct skill ID.
175
+
176
+ ### "Access denied"
177
+
178
+ You must purchase the skill before installing it.
179
+
180
+ ## Support
181
+
182
+ - Documentation: https://upclaw.ai/docs
183
+ - Issues: https://github.com/upclaw/upclaw/issues
184
+ - Twitter: https://x.com/up_claw
185
+
186
+ ## License
187
+
188
+ MIT
@@ -0,0 +1,2 @@
1
+ export declare function infoCommand(skillName: string): Promise<void>;
2
+ //# sourceMappingURL=info.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"info.d.ts","sourceRoot":"","sources":["../../src/commands/info.ts"],"names":[],"mappings":"AAIA,wBAAsB,WAAW,CAAC,SAAS,EAAE,MAAM,iBAqClD"}
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.infoCommand = infoCommand;
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ const ora_1 = __importDefault(require("ora"));
9
+ const api_1 = require("../utils/api");
10
+ async function infoCommand(skillName) {
11
+ const spinner = (0, ora_1.default)("Fetching skill details...").start();
12
+ try {
13
+ const api = (0, api_1.createAPIClient)();
14
+ // First search for the skill by name
15
+ const searchResponse = await api.get(`/cli/skills/search?q=${encodeURIComponent(skillName)}&limit=1`);
16
+ const skills = searchResponse.data.skills;
17
+ if (skills.length === 0) {
18
+ spinner.fail(chalk_1.default.red(`Skill "${skillName}" not found`));
19
+ return;
20
+ }
21
+ const skill = skills[0];
22
+ spinner.stop();
23
+ console.log(chalk_1.default.bold.cyan(`\n📦 ${skill.name}\n`));
24
+ console.log(skill.description);
25
+ console.log();
26
+ console.log(`${chalk_1.default.gray("Category:")} ${skill.category}`);
27
+ console.log(`${chalk_1.default.gray("Version:")} ${skill.version}`);
28
+ console.log(`${chalk_1.default.gray("Price:")} ${chalk_1.default.green("$" + skill.price_usdc + " USDC")}`);
29
+ console.log(`${chalk_1.default.gray("Downloads:")} ${skill.downloads}`);
30
+ console.log(`${chalk_1.default.gray("Stars:")} ${"⭐".repeat(Math.min(skill.stars || 0, 5))}`);
31
+ console.log(`${chalk_1.default.gray("Seller:")} ${skill.seller_address}`);
32
+ console.log(`${chalk_1.default.gray("IPFS CID:")} ${skill.ipfs_cid}`);
33
+ console.log();
34
+ console.log(chalk_1.default.bold("Installation:"));
35
+ console.log(` ${chalk_1.default.cyan(`upclaw install ${skill.id}`)}`);
36
+ console.log();
37
+ }
38
+ catch (error) {
39
+ spinner.fail(chalk_1.default.red("Failed to fetch skill details"));
40
+ console.error(chalk_1.default.red(`Error: ${error.message}\n`));
41
+ process.exit(1);
42
+ }
43
+ }
44
+ //# sourceMappingURL=info.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"info.js","sourceRoot":"","sources":["../../src/commands/info.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare function installCommand(skillId: string, options: {
2
+ output: string;
3
+ }): Promise<void>;
4
+ //# sourceMappingURL=install.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AAQA,wBAAsB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,iBAgEhF"}
@@ -0,0 +1,100 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.installCommand = installCommand;
40
+ const chalk_1 = __importDefault(require("chalk"));
41
+ const ora_1 = __importDefault(require("ora"));
42
+ const fs = __importStar(require("fs-extra"));
43
+ const path = __importStar(require("path"));
44
+ const axios_1 = __importDefault(require("axios"));
45
+ const extract_zip_1 = __importDefault(require("extract-zip"));
46
+ const api_1 = require("../utils/api");
47
+ async function installCommand(skillId, options) {
48
+ (0, api_1.requireAuth)();
49
+ const spinner = (0, ora_1.default)("Installing skill...").start();
50
+ try {
51
+ const api = (0, api_1.createAPIClient)();
52
+ // Request download
53
+ spinner.text = "Verifying access...";
54
+ const response = await api.post("/cli/skills/install", { skillId });
55
+ const { skill } = response.data;
56
+ spinner.text = "Downloading from IPFS...";
57
+ // Download the skill bundle
58
+ const downloadResponse = await axios_1.default.get(skill.download_url, {
59
+ responseType: "arraybuffer",
60
+ });
61
+ // Create installation directory
62
+ const installDir = path.join(options.output, skill.name);
63
+ await fs.ensureDir(installDir);
64
+ // Save downloaded file
65
+ const tempFile = path.join(installDir, "download.zip");
66
+ await fs.writeFile(tempFile, downloadResponse.data);
67
+ spinner.text = "Extracting files...";
68
+ // Extract if it's a zip
69
+ try {
70
+ await (0, extract_zip_1.default)(tempFile, { dir: installDir });
71
+ await fs.remove(tempFile); // Clean up zip file
72
+ }
73
+ catch {
74
+ // If not a zip, just rename the file
75
+ const targetFile = path.join(installDir, "skill.tar.gz");
76
+ await fs.move(tempFile, targetFile);
77
+ }
78
+ spinner.succeed(chalk_1.default.green(`✓ Successfully installed ${chalk_1.default.bold(skill.name)} v${skill.version} to ${installDir}`));
79
+ // Show next steps
80
+ console.log(chalk_1.default.bold("\n📚 Next Steps:\n"));
81
+ console.log(` 1. Navigate to: ${chalk_1.default.cyan(installDir)}`);
82
+ console.log(` 2. Read SKILL.md for usage instructions`);
83
+ console.log(` 3. Install dependencies: ${chalk_1.default.cyan("npm install")}`);
84
+ console.log(` 4. Integrate into your agent\n`);
85
+ }
86
+ catch (error) {
87
+ spinner.fail(chalk_1.default.red("Installation failed"));
88
+ if (error.response?.status === 403) {
89
+ console.error(chalk_1.default.yellow("\n⚠️ You don't own this skill. Purchase it first at https://upclaw.ai\n"));
90
+ }
91
+ else if (error.response?.data?.error) {
92
+ console.error(chalk_1.default.red(`\nError: ${error.response.data.error}\n`));
93
+ }
94
+ else {
95
+ console.error(chalk_1.default.red(`\nError: ${error.message}\n`));
96
+ }
97
+ process.exit(1);
98
+ }
99
+ }
100
+ //# sourceMappingURL=install.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare function listCommand(options: {
2
+ format: string;
3
+ }): Promise<void>;
4
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAIA,wBAAsB,WAAW,CAAC,OAAO,EAAE;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,iBA0C5D"}
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.listCommand = listCommand;
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ const ora_1 = __importDefault(require("ora"));
9
+ const api_1 = require("../utils/api");
10
+ async function listCommand(options) {
11
+ (0, api_1.requireAuth)();
12
+ const spinner = (0, ora_1.default)("Fetching your skills...").start();
13
+ try {
14
+ const api = (0, api_1.createAPIClient)();
15
+ const response = await api.get("/cli/skills/owned");
16
+ const { skills, count } = response.data;
17
+ spinner.stop();
18
+ if (skills.length === 0) {
19
+ console.log(chalk_1.default.yellow("\n⚠️ You don't own any skills yet.\n"));
20
+ console.log(chalk_1.default.gray("Browse the marketplace: upclaw search <query>\n"));
21
+ return;
22
+ }
23
+ if (options.format === "json") {
24
+ console.log(JSON.stringify(skills, null, 2));
25
+ return;
26
+ }
27
+ // Table format
28
+ console.log(chalk_1.default.bold(`\n📚 Your Skills (${count} total)\n`));
29
+ skills.forEach((skill) => {
30
+ console.log(chalk_1.default.bold.cyan(`• ${skill.name} v${skill.version}`));
31
+ console.log(` ${skill.description}`);
32
+ console.log(` ${chalk_1.default.gray("Category:")} ${skill.category} ${chalk_1.default.gray("Price:")} ${chalk_1.default.green("$" + skill.price_usdc)}`);
33
+ console.log(` ${chalk_1.default.gray("Purchased:")} ${new Date(skill.purchased_at).toLocaleDateString()}`);
34
+ console.log(` ${chalk_1.default.gray("Install:")} upclaw install ${skill.id}\n`);
35
+ });
36
+ }
37
+ catch (error) {
38
+ spinner.fail(chalk_1.default.red("Failed to fetch skills"));
39
+ console.error(chalk_1.default.red(`Error: ${error.message}\n`));
40
+ process.exit(1);
41
+ }
42
+ }
43
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":";;;;;AAIA,kCA0CC;AA9CD,kDAA0B;AAC1B,8CAAsB;AACtB,sCAA4D;AAErD,KAAK,UAAU,WAAW,CAAC,OAA2B;IAC3D,IAAA,iBAAW,GAAE,CAAC;IAEd,MAAM,OAAO,GAAG,IAAA,aAAG,EAAC,yBAAyB,CAAC,CAAC,KAAK,EAAE,CAAC;IAEvD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAA,qBAAe,GAAE,CAAC;QAC9B,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;QACpD,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC;QAExC,OAAO,CAAC,IAAI,EAAE,CAAC;QAEf,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,uCAAuC,CAAC,CAAC,CAAC;YACnE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC,CAAC;YAC3E,OAAO;QACT,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC9B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC7C,OAAO;QACT,CAAC;QAED,eAAe;QACf,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,qBAAqB,KAAK,WAAW,CAAC,CAAC,CAAC;QAE/D,MAAM,CAAC,OAAO,CAAC,CAAC,KAAU,EAAE,EAAE;YAC5B,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YAClE,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;YACtC,OAAO,CAAC,GAAG,CACT,KAAK,eAAK,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC,QAAQ,KAAK,eAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,eAAK,CAAC,KAAK,CACpF,GAAG,GAAG,KAAK,CAAC,UAAU,CACvB,EAAE,CACJ,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,KAAK,eAAK,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;YAClG,OAAO,CAAC,GAAG,CAAC,KAAK,eAAK,CAAC,IAAI,CAAC,UAAU,CAAC,mBAAmB,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC;QAC1E,CAAC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO,CAAC,IAAI,CAAC,eAAK,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC,CAAC;QAClD,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,UAAU,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC;QACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare function loginCommand(options: {
2
+ privateKey?: string;
3
+ keystore?: string;
4
+ }): Promise<void>;
5
+ //# sourceMappingURL=login.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAUA,wBAAsB,YAAY,CAAC,OAAO,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,iBAqErF"}
@@ -0,0 +1,111 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.loginCommand = loginCommand;
40
+ const accounts_1 = require("viem/accounts");
41
+ const inquirer_1 = __importDefault(require("inquirer"));
42
+ const chalk_1 = __importDefault(require("chalk"));
43
+ const ora_1 = __importDefault(require("ora"));
44
+ const config_1 = require("../config");
45
+ const api_1 = require("../utils/api");
46
+ const fs = __importStar(require("fs-extra"));
47
+ async function loginCommand(options) {
48
+ let privateKey;
49
+ // Get private key from various sources
50
+ if (options.privateKey) {
51
+ privateKey = options.privateKey;
52
+ }
53
+ else if (options.keystore) {
54
+ // Load from keystore file
55
+ const keystoreData = await fs.readJSON(options.keystore);
56
+ privateKey = keystoreData.privateKey;
57
+ }
58
+ else {
59
+ // Prompt for private key
60
+ const answers = await inquirer_1.default.prompt([
61
+ {
62
+ type: "password",
63
+ name: "privateKey",
64
+ message: "Enter your wallet private key (0x...):",
65
+ validate: (input) => {
66
+ if (!input.startsWith("0x") || input.length !== 66) {
67
+ return "Invalid private key format. Must be 0x followed by 64 hex characters.";
68
+ }
69
+ return true;
70
+ },
71
+ },
72
+ ]);
73
+ privateKey = answers.privateKey;
74
+ }
75
+ const spinner = (0, ora_1.default)("Authenticating...").start();
76
+ try {
77
+ // Create account from private key
78
+ const account = (0, accounts_1.privateKeyToAccount)(privateKey);
79
+ const address = account.address;
80
+ // Sign a message to prove ownership
81
+ const message = `Sign in to UpClaw CLI\nTimestamp: ${Date.now()}`;
82
+ const signature = await account.signMessage({ message });
83
+ // Authenticate with API
84
+ const api = (0, api_1.createAPIClient)();
85
+ const response = await api.post("/cli/auth", {
86
+ address,
87
+ signature,
88
+ message,
89
+ });
90
+ const { token, user } = response.data;
91
+ // Store credentials
92
+ config_1.config.set("token", token);
93
+ config_1.config.set("address", user.address);
94
+ config_1.config.set("username", user.username);
95
+ spinner.succeed(chalk_1.default.green(`✓ Successfully logged in as ${chalk_1.default.bold(user.username)} (${user.address})`));
96
+ }
97
+ catch (error) {
98
+ spinner.fail(chalk_1.default.red("Authentication failed"));
99
+ if (error.response?.status === 404) {
100
+ console.error(chalk_1.default.yellow("\n⚠️ User not found. Please register at https://upclaw.ai first."));
101
+ }
102
+ else if (error.response?.data?.error) {
103
+ console.error(chalk_1.default.red(`\nError: ${error.response.data.error}`));
104
+ }
105
+ else {
106
+ console.error(chalk_1.default.red(`\nError: ${error.message}`));
107
+ }
108
+ process.exit(1);
109
+ }
110
+ }
111
+ //# sourceMappingURL=login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ interface PublishOptions {
2
+ name?: string;
3
+ description?: string;
4
+ category?: string;
5
+ price?: string;
6
+ version?: string;
7
+ }
8
+ export declare function publishCommand(options: PublishOptions): Promise<void>;
9
+ export {};
10
+ //# sourceMappingURL=publish.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publish.d.ts","sourceRoot":"","sources":["../../src/commands/publish.ts"],"names":[],"mappings":"AASA,UAAU,cAAc;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,cAAc,CAAC,OAAO,EAAE,cAAc,iBAsI3D"}