farnsworth-planetexpress 1.0.0 → 1.0.2
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 +6 -6
- package/SKILL.md +7 -7
- package/dist/client.js +20 -21
- package/dist/mcp/credentials.js +7 -6
- package/dist/mcp/index.mjs +9 -8
- package/dist/mcp/setup.js +14 -9
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -104,7 +104,7 @@ const listing = await client.list({
|
|
|
104
104
|
|
|
105
105
|
## Credentials
|
|
106
106
|
|
|
107
|
-
Credentials are stored in `~/.planetexpress/vault.
|
|
107
|
+
Credentials are stored in `~/.planetexpress/vault.json`.
|
|
108
108
|
|
|
109
109
|
```bash
|
|
110
110
|
npx farnsworth-planetexpress setup # Interactive setup
|
|
@@ -115,16 +115,16 @@ npx farnsworth-planetexpress revoke # Securely erase credentials
|
|
|
115
115
|
Or use environment variables:
|
|
116
116
|
```bash
|
|
117
117
|
export PLANETEXPRESS_API_KEY=pe_...
|
|
118
|
-
export PLANETEXPRESS_GATEWAY=https://
|
|
118
|
+
export PLANETEXPRESS_GATEWAY=https://dropclaw.cloud
|
|
119
119
|
```
|
|
120
120
|
|
|
121
121
|
## Ecosystem
|
|
122
122
|
|
|
123
123
|
PlanetExpress is part of the Farnsworth ecosystem:
|
|
124
124
|
|
|
125
|
-
- **[Syntek](https://github.com/timowhite88/farnsworth-syntek)** — Agent memory engine ($100/90 days, includes
|
|
126
|
-
- **[DropClaw](https://github.com/timowhite88/dropclaw)** — Encrypted on-chain storage ($30 + gas,
|
|
127
|
-
- **PlanetExpress** — Agent marketplace ($30 to list)
|
|
125
|
+
- **[Syntek](https://github.com/timowhite88/farnsworth-syntek)** — Agent memory engine ($100/90 days, includes DropClaw for Syntek uploads — gas only)
|
|
126
|
+
- **[DropClaw](https://github.com/timowhite88/dropclaw)** — Encrypted on-chain storage ($30 + gas, Syntek subscribers pay gas only for Syntek uploads)
|
|
127
|
+
- **PlanetExpress** — Agent marketplace ($30 to list, $15 for Syntek subscribers)
|
|
128
128
|
|
|
129
129
|
## License
|
|
130
130
|
|
|
@@ -132,4 +132,4 @@ Proprietary — Farnsworth Labs. All rights reserved.
|
|
|
132
132
|
|
|
133
133
|
---
|
|
134
134
|
|
|
135
|
-
[ai.farnsworth.cloud/marketplace](https://
|
|
135
|
+
[ai.farnsworth.cloud/marketplace](https://dropclaw.cloud/marketplace)
|
package/SKILL.md
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
## Endpoint
|
|
6
6
|
|
|
7
|
-
`https://
|
|
7
|
+
`https://dropclaw.cloud/marketplace`
|
|
8
8
|
|
|
9
9
|
## Authentication
|
|
10
10
|
|
|
@@ -74,7 +74,7 @@ claude mcp add planetexpress -- npx farnsworth-planetexpress-mcp
|
|
|
74
74
|
|
|
75
75
|
- **Listing fee:** $30 USD
|
|
76
76
|
- **Browsing:** Always free
|
|
77
|
-
- **Syntek subscribers:**
|
|
77
|
+
- **Syntek subscribers:** $15 listing fee — active Syntek subscription ($100/90 days) gets 50% discount
|
|
78
78
|
- **50% of fees** go to FARNS token buybacks
|
|
79
79
|
|
|
80
80
|
## Categories
|
|
@@ -89,17 +89,17 @@ claude mcp add planetexpress -- npx farnsworth-planetexpress-mcp
|
|
|
89
89
|
|
|
90
90
|
```bash
|
|
91
91
|
# Browse marketplace
|
|
92
|
-
curl https://
|
|
92
|
+
curl https://dropclaw.cloud/marketplace/browse?query=trading
|
|
93
93
|
|
|
94
94
|
# Get featured services
|
|
95
|
-
curl https://
|
|
95
|
+
curl https://dropclaw.cloud/marketplace/featured
|
|
96
96
|
|
|
97
97
|
# Get listing pricing
|
|
98
|
-
curl https://
|
|
98
|
+
curl https://dropclaw.cloud/marketplace/pricing
|
|
99
99
|
|
|
100
100
|
# Get categories
|
|
101
|
-
curl https://
|
|
101
|
+
curl https://dropclaw.cloud/marketplace/categories
|
|
102
102
|
|
|
103
103
|
# Get skill file
|
|
104
|
-
curl https://
|
|
104
|
+
curl https://dropclaw.cloud/marketplace/skill
|
|
105
105
|
```
|
package/dist/client.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* PlanetExpress v1.0.
|
|
2
|
+
* PlanetExpress v1.0.2
|
|
3
3
|
* (c) 2026 Farnsworth Labs — All rights reserved.
|
|
4
4
|
* PROPRIETARY AND CONFIDENTIAL. Unauthorized copying prohibited.
|
|
5
5
|
* This software is protected by international copyright law.
|
|
@@ -8,8 +8,8 @@
|
|
|
8
8
|
const fs = require("fs");
|
|
9
9
|
const path = require("path");
|
|
10
10
|
|
|
11
|
-
const DEFAULT_GATEWAY = "https://
|
|
12
|
-
const VERSION = "1.0.
|
|
11
|
+
const DEFAULT_GATEWAY = "https://dropclaw.cloud";
|
|
12
|
+
const VERSION = "1.0.2";
|
|
13
13
|
|
|
14
14
|
class PlanetExpressClient {
|
|
15
15
|
constructor(opts = {}) {
|
|
@@ -33,7 +33,9 @@ class PlanetExpressClient {
|
|
|
33
33
|
|
|
34
34
|
_loadVaultKey() {
|
|
35
35
|
try {
|
|
36
|
-
const
|
|
36
|
+
const primary = path.join(this._vaultDir, "vault.json");
|
|
37
|
+
const legacy = path.join(this._vaultDir, "vault.enc");
|
|
38
|
+
const vaultPath = fs.existsSync(primary) ? primary : legacy;
|
|
37
39
|
if (fs.existsSync(vaultPath)) {
|
|
38
40
|
const data = JSON.parse(fs.readFileSync(vaultPath, "utf8"));
|
|
39
41
|
if (data.apiKey) this.apiKey = data.apiKey;
|
|
@@ -55,7 +57,7 @@ class PlanetExpressClient {
|
|
|
55
57
|
const body = await resp.text();
|
|
56
58
|
let msg;
|
|
57
59
|
try { msg = JSON.parse(body).error || body; } catch { msg = body; }
|
|
58
|
-
throw new Error(msg);
|
|
60
|
+
throw new Error(`${resp.status}: ${msg}`);
|
|
59
61
|
}
|
|
60
62
|
return resp.json();
|
|
61
63
|
}
|
|
@@ -82,15 +84,13 @@ class PlanetExpressClient {
|
|
|
82
84
|
const params = new URLSearchParams();
|
|
83
85
|
if (query) params.set("query", query);
|
|
84
86
|
if (category) params.set("category", category);
|
|
85
|
-
if (page) params.set("page", String(page));
|
|
87
|
+
if (page !== undefined) params.set("page", String(page));
|
|
86
88
|
const qs = params.toString();
|
|
87
|
-
|
|
88
|
-
return resp.json();
|
|
89
|
+
return this._get(`/marketplace/browse${qs ? "?" + qs : ""}`);
|
|
89
90
|
}
|
|
90
91
|
|
|
91
92
|
async getService(serviceId) {
|
|
92
|
-
|
|
93
|
-
return resp.json();
|
|
93
|
+
return this._get(`/marketplace/service/${serviceId}`);
|
|
94
94
|
}
|
|
95
95
|
|
|
96
96
|
async list(opts = {}) {
|
|
@@ -107,25 +107,23 @@ class PlanetExpressClient {
|
|
|
107
107
|
payment_network: opts.paymentNetwork || "eip155:143",
|
|
108
108
|
});
|
|
109
109
|
|
|
110
|
-
|
|
111
|
-
|
|
110
|
+
if (result.serviceId) {
|
|
111
|
+
this._saveListing(result.serviceId, opts.name);
|
|
112
|
+
}
|
|
112
113
|
|
|
113
114
|
return result;
|
|
114
115
|
}
|
|
115
116
|
|
|
116
117
|
async pricing() {
|
|
117
|
-
|
|
118
|
-
return resp.json();
|
|
118
|
+
return this._get("/marketplace/pricing");
|
|
119
119
|
}
|
|
120
120
|
|
|
121
121
|
async featured() {
|
|
122
|
-
|
|
123
|
-
return resp.json();
|
|
122
|
+
return this._get("/marketplace/featured");
|
|
124
123
|
}
|
|
125
124
|
|
|
126
125
|
async categories() {
|
|
127
|
-
|
|
128
|
-
return resp.json();
|
|
126
|
+
return this._get("/marketplace/categories");
|
|
129
127
|
}
|
|
130
128
|
|
|
131
129
|
_saveListing(serviceId, name) {
|
|
@@ -142,12 +140,13 @@ class PlanetExpressClient {
|
|
|
142
140
|
listedAt: new Date().toISOString(),
|
|
143
141
|
});
|
|
144
142
|
fs.writeFileSync(listingsPath, JSON.stringify(listings, null, 2));
|
|
145
|
-
} catch {
|
|
143
|
+
} catch (e) {
|
|
144
|
+
console.warn(`Warning: Could not save listing locally: ${e.message}`);
|
|
145
|
+
}
|
|
146
146
|
}
|
|
147
147
|
|
|
148
148
|
async x402Discovery() {
|
|
149
|
-
|
|
150
|
-
return resp.json();
|
|
149
|
+
return this._get("/.well-known/x402");
|
|
151
150
|
}
|
|
152
151
|
}
|
|
153
152
|
|
package/dist/mcp/credentials.js
CHANGED
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* PlanetExpress Credential Manager v1.0.
|
|
2
|
+
* PlanetExpress Credential Manager v1.0.2
|
|
3
3
|
* (c) 2026 Farnsworth Labs — All rights reserved.
|
|
4
4
|
* PROPRIETARY AND CONFIDENTIAL. Unauthorized copying prohibited.
|
|
5
5
|
*/
|
|
6
|
-
const fs=require("fs"),path=require("path")
|
|
6
|
+
const fs=require("fs"),path=require("path");
|
|
7
7
|
const VD=path.join(process.env.HOME||process.env.USERPROFILE||"/tmp",".planetexpress");
|
|
8
|
-
const VP=path.join(VD,"vault.
|
|
9
|
-
|
|
8
|
+
const VP=path.join(VD,"vault.json");
|
|
9
|
+
const VP_LEGACY=path.join(VD,"vault.enc");
|
|
10
|
+
function load(){try{const p=fs.existsSync(VP)?VP:(fs.existsSync(VP_LEGACY)?VP_LEGACY:null);if(p)return JSON.parse(fs.readFileSync(p,"utf8"));return null}catch{return null}}
|
|
10
11
|
function save(data){if(!fs.existsSync(VD))fs.mkdirSync(VD,{recursive:true});fs.writeFileSync(VP,JSON.stringify(data,null,2))}
|
|
11
12
|
function getApiKey(){const v=load();return v?.apiKey||process.env.PLANETEXPRESS_API_KEY||null}
|
|
12
13
|
function getGateway(){const v=load();return v?.gateway||process.env.PLANETEXPRESS_GATEWAY||"https://ai.farnsworth.cloud"}
|
|
13
|
-
function saveListing(serviceId,name){const lp=path.join(VD,"listings.json");let ls=[];try{ls=JSON.parse(fs.readFileSync(lp,"utf8"))}catch{}ls.push({serviceId,name,listedAt:new Date().toISOString()});
|
|
14
|
+
function saveListing(serviceId,name){if(!fs.existsSync(VD))fs.mkdirSync(VD,{recursive:true});const lp=path.join(VD,"listings.json");let ls=[];try{ls=JSON.parse(fs.readFileSync(lp,"utf8"))}catch{}ls.push({serviceId,name,listedAt:new Date().toISOString()});fs.writeFileSync(lp,JSON.stringify(ls,null,2))}
|
|
14
15
|
function getListings(){const lp=path.join(VD,"listings.json");try{return JSON.parse(fs.readFileSync(lp,"utf8"))}catch{return[]}}
|
|
15
|
-
function revoke(){
|
|
16
|
+
function revoke(){const files=[VP,VP_LEGACY,path.join(VD,"listings.json")];for(const f of files){if(fs.existsSync(f))fs.unlinkSync(f)}}
|
|
16
17
|
module.exports={load,save,getApiKey,getGateway,saveListing,getListings,revoke};
|
package/dist/mcp/index.mjs
CHANGED
|
@@ -1,26 +1,27 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
|
-
* PlanetExpress MCP Server v1.0.
|
|
3
|
+
* PlanetExpress MCP Server v1.0.2
|
|
4
4
|
* (c) 2026 Farnsworth Labs — All rights reserved.
|
|
5
5
|
* PROPRIETARY AND CONFIDENTIAL. Unauthorized copying prohibited.
|
|
6
6
|
*/
|
|
7
7
|
import{Server}from"@modelcontextprotocol/sdk/server/index.js";import{StdioServerTransport}from"@modelcontextprotocol/sdk/server/stdio.js";import{CallToolRequestSchema,ListToolsRequestSchema}from"@modelcontextprotocol/sdk/types.js";import fs from"fs";import path from"path";
|
|
8
|
-
const G=process.env.PLANETEXPRESS_GATEWAY||"https://
|
|
9
|
-
|
|
8
|
+
const G=process.env.PLANETEXPRESS_GATEWAY||"https://dropclaw.cloud";const V="1.0.2";
|
|
9
|
+
const VD=path.join(process.env.HOME||process.env.USERPROFILE||"/tmp",".planetexpress");
|
|
10
|
+
function lk(){try{const p=path.join(VD,"vault.json");if(fs.existsSync(p)){return JSON.parse(fs.readFileSync(p,"utf8"))}const p2=path.join(VD,"vault.enc");if(fs.existsSync(p2)){return JSON.parse(fs.readFileSync(p2,"utf8"))}}catch{}return{}}
|
|
10
11
|
function hd(){const v=lk();const h={"Content-Type":"application/json","X-Client-Version":V};if(v.apiKey)h["Authorization"]=`Bearer ${v.apiKey}`;if(process.env.PLANETEXPRESS_API_KEY)h["Authorization"]=`Bearer ${process.env.PLANETEXPRESS_API_KEY}`;return h}
|
|
11
|
-
async function api(m,p,b){const u=`${G}${p}`;const o={method:m,headers:
|
|
12
|
+
async function api(m,p,b){const u=`${G}${p}`;const h=hd();if(m==="GET")delete h["Content-Type"];const o={method:m,headers:h};if(b)o.body=JSON.stringify(b);const r=await fetch(u,o);if(!r.ok){const t=await r.text();let msg;try{msg=JSON.parse(t).error||t}catch{msg=t}throw new Error(`${r.status}: ${msg}`)}return r.json()}
|
|
12
13
|
const server=new Server({name:"planetexpress-mcp",version:V},{capabilities:{tools:{}}});
|
|
13
14
|
server.setRequestHandler(ListToolsRequestSchema,async()=>({tools:[
|
|
14
15
|
{name:"planetexpress_browse",description:"Search the AI agent marketplace. Browse available services by query string or category. Returns matching services with names, descriptions, and endpoints.",inputSchema:{type:"object",properties:{query:{type:"string",description:"Search query (e.g. 'trading bot', 'image generation')"},category:{type:"string",enum:["Memory & Storage","Trading & Analytics","Content & Media","Infrastructure","Custom Agents"],description:"Filter by category"},page:{type:"number",description:"Page number for pagination",default:1}}}},
|
|
15
16
|
{name:"planetexpress_get",description:"Get detailed information about a specific service listed on the marketplace. Returns full manifest, endpoint, pricing, and contact info.",inputSchema:{type:"object",properties:{service_id:{type:"string",description:"Service ID (e.g. svc_abc123)"}},required:["service_id"]}},
|
|
16
|
-
{name:"planetexpress_list",description:"List a new AI service on the marketplace. Requires $30
|
|
17
|
-
{name:"planetexpress_pricing",description:"Get listing costs and x402 payment options. Returns $30 listing fee with payment addresses for MON, SOL, and USDC.",inputSchema:{type:"object",properties:{}}},
|
|
17
|
+
{name:"planetexpress_list",description:"List a new AI service on the marketplace. Requires x402 payment first ($30, or $15 for Syntek subscribers). Call planetexpress_pricing to get payment addresses, send payment on-chain, then call this with the tx hash.",inputSchema:{type:"object",properties:{name:{type:"string",description:"Service name"},description:{type:"string",description:"Service description (what it does, capabilities)"},category:{type:"string",enum:["Memory & Storage","Trading & Analytics","Content & Media","Infrastructure","Custom Agents"],description:"Service category"},endpoint_url:{type:"string",description:"Service endpoint URL"},payment_tx_hash:{type:"string",description:"Transaction hash of on-chain payment"},payment_network:{type:"string",enum:["eip155:143","solana","eip155:8453"],description:"Payment network",default:"eip155:143"}},required:["name","description","category","endpoint_url","payment_tx_hash","payment_network"]}},
|
|
18
|
+
{name:"planetexpress_pricing",description:"Get listing costs and x402 payment options. Returns $30 listing fee ($15 for Syntek subscribers) with payment addresses for MON, SOL, and USDC.",inputSchema:{type:"object",properties:{}}},
|
|
18
19
|
{name:"planetexpress_featured",description:"Get featured and trending AI services on the marketplace. Returns top-ranked and recently popular services.",inputSchema:{type:"object",properties:{}}}
|
|
19
20
|
]}));
|
|
20
21
|
server.setRequestHandler(CallToolRequestSchema,async(req)=>{const{name,arguments:args}=req.params;try{
|
|
21
|
-
if(name==="planetexpress_browse"){const params=new URLSearchParams();if(args.query)params.set("query",args.query);if(args.category)params.set("category",args.category);if(args.page)params.set("page",String(args.page));const qs=params.toString();const r=await api("GET",`/marketplace/browse${qs?"?"+qs:""}`);return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}
|
|
22
|
+
if(name==="planetexpress_browse"){const params=new URLSearchParams();if(args.query)params.set("query",args.query);if(args.category)params.set("category",args.category);if(args.page!==undefined)params.set("page",String(args.page));const qs=params.toString();const r=await api("GET",`/marketplace/browse${qs?"?"+qs:""}`);return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}
|
|
22
23
|
if(name==="planetexpress_get"){const r=await api("GET",`/marketplace/service/${args.service_id}`);return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}
|
|
23
|
-
if(name==="planetexpress_list"){const r=await api("POST","/marketplace/list",{name:args.name,description:args.description,category:args.category,endpoint_url:args.endpoint_url,payment_tx_hash:args.payment_tx_hash,payment_network:args.payment_network||"eip155:143"});if(r.serviceId){
|
|
24
|
+
if(name==="planetexpress_list"){const r=await api("POST","/marketplace/list",{name:args.name,description:args.description,category:args.category,endpoint_url:args.endpoint_url,payment_tx_hash:args.payment_tx_hash,payment_network:args.payment_network||"eip155:143"});if(r.serviceId){if(!fs.existsSync(VD))fs.mkdirSync(VD,{recursive:true});const lp=path.join(VD,"listings.json");let ls=[];try{ls=JSON.parse(fs.readFileSync(lp,"utf8"))}catch{}ls.push({serviceId:r.serviceId,name:args.name,listedAt:new Date().toISOString()});fs.writeFileSync(lp,JSON.stringify(ls,null,2))}return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}
|
|
24
25
|
if(name==="planetexpress_pricing"){const r=await api("GET","/marketplace/pricing");return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}
|
|
25
26
|
if(name==="planetexpress_featured"){const r=await api("GET","/marketplace/featured");return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}
|
|
26
27
|
return{content:[{type:"text",text:`Unknown tool: ${name}`}],isError:true}}catch(e){return{content:[{type:"text",text:`Error: ${e.message}`}],isError:true}}});
|
package/dist/mcp/setup.js
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
|
-
* PlanetExpress Setup CLI v1.0.
|
|
3
|
+
* PlanetExpress Setup CLI v1.0.2
|
|
4
4
|
* (c) 2026 Farnsworth Labs — All rights reserved.
|
|
5
5
|
* PROPRIETARY AND CONFIDENTIAL. Unauthorized copying prohibited.
|
|
6
6
|
*/
|
|
7
|
-
const fs=require("fs"),path=require("path"),
|
|
8
|
-
const V="1.0.
|
|
7
|
+
const fs=require("fs"),path=require("path"),readline=require("readline");
|
|
8
|
+
const V="1.0.2",G="https://dropclaw.cloud";
|
|
9
9
|
const VD=path.join(process.env.HOME||process.env.USERPROFILE||"/tmp",".planetexpress");
|
|
10
|
-
const VP=path.join(VD,"vault.
|
|
10
|
+
const VP=path.join(VD,"vault.json");
|
|
11
|
+
const VP_LEGACY=path.join(VD,"vault.enc");
|
|
11
12
|
function rl(){return readline.createInterface({input:process.stdin,output:process.stdout})}
|
|
12
13
|
function ask(r,q){return new Promise(res=>{r.question(q,ans=>{res(ans.trim())})})}
|
|
13
14
|
async function setup(){
|
|
@@ -26,11 +27,12 @@ try{const resp=await fetch(`${gw}/marketplace/pricing`);const d=await resp.json(
|
|
|
26
27
|
}
|
|
27
28
|
async function status(){
|
|
28
29
|
console.log(`\n PlanetExpress Status v${V}\n ${"─".repeat(30)}\n`);
|
|
29
|
-
if(!fs.existsSync(VP)){console.log(" No credentials found. Run: npx farnsworth-planetexpress setup\n");return}
|
|
30
|
-
|
|
30
|
+
if(!fs.existsSync(VP)&&!fs.existsSync(VP_LEGACY)){console.log(" No credentials found. Run: npx farnsworth-planetexpress setup\n");return}
|
|
31
|
+
let vault;
|
|
32
|
+
try{vault=JSON.parse(fs.readFileSync(fs.existsSync(VP)?VP:VP_LEGACY,"utf8"))}catch(e){console.log(` Error reading credentials: ${e.message}\n`);return}
|
|
31
33
|
const gw=vault.gateway||G;
|
|
32
34
|
console.log(` Gateway: ${gw}`);
|
|
33
|
-
console.log(` API Key: ${vault.apiKey?.slice(0,
|
|
35
|
+
console.log(` API Key: ${vault.apiKey?.slice(0,6)}...`);
|
|
34
36
|
console.log(` Created: ${vault.createdAt||"unknown"}`);
|
|
35
37
|
try{const resp=await fetch(`${gw}/marketplace/pricing`);const d=await resp.json();console.log(` Service: Online`);console.log(` Listing Fee: $${d.listingFeeUSD}`);console.log(` Chains: MON, SOL, USDC`)}catch(e){console.log(` Service: Offline (${e.message})`)}
|
|
36
38
|
const lp=path.join(VD,"listings.json");
|
|
@@ -38,8 +40,11 @@ try{const ls=JSON.parse(fs.readFileSync(lp,"utf8"));console.log(` Local listing
|
|
|
38
40
|
console.log();
|
|
39
41
|
}
|
|
40
42
|
async function revoke(){
|
|
41
|
-
|
|
42
|
-
|
|
43
|
+
const files=[VP,VP_LEGACY,path.join(VD,"listings.json")];
|
|
44
|
+
let erased=false;
|
|
45
|
+
for(const f of files){if(fs.existsSync(f)){fs.unlinkSync(f);erased=true}}
|
|
46
|
+
if(erased)console.log("\n Local credentials removed.\n");
|
|
47
|
+
else console.log("\n No credentials found.\n");
|
|
43
48
|
}
|
|
44
49
|
const cmd=process.argv[2]||"setup";
|
|
45
50
|
if(cmd==="setup")setup().catch(e=>console.error(e.message));
|
package/package.json
CHANGED