jaspervault_cli 1.1.2 → 1.1.3
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/config/chains.json +10 -7
- package/config/chains.json.bak2 +102 -0
- package/dist/src/commands/connect.d.ts +26 -0
- package/dist/src/commands/connect.js +93 -0
- package/dist/src/commands/connect.js.map +1 -0
- package/dist/src/commands/init.d.ts +4 -0
- package/dist/src/commands/init.js +114 -0
- package/dist/src/commands/init.js.map +1 -0
- package/dist/src/commands/skill.d.ts +4 -0
- package/dist/src/commands/skill.js +117 -0
- package/dist/src/commands/skill.js.map +1 -0
- package/dist/src/utils/config.d.ts +1 -1
- package/dist/src/utils/config.js +1 -1
- package/package.json +1 -1
package/config/chains.json
CHANGED
|
@@ -25,23 +25,26 @@
|
|
|
25
25
|
"subgraphUrl": "https://subgraph.satsuma-prod.com/0981c2ab3685/garys-team/jaspervault-v2-base-uat/api"
|
|
26
26
|
},
|
|
27
27
|
"jaspervault": {
|
|
28
|
-
"name": "JasperVault",
|
|
28
|
+
"name": "JasperVault (jasper_dev override for AAPL test)",
|
|
29
29
|
"chainId": 55531,
|
|
30
30
|
"rpcUrl": "https://enterprise.onerpc.com/apikey/42b59vURnC9pSN2XWPunWiYWTeUOU6Mh/jasper_mainnet",
|
|
31
31
|
"contracts": {
|
|
32
|
-
"diamond": "
|
|
33
|
-
"vaultFactory": "
|
|
34
|
-
"perpsOptionModuleHandle": "
|
|
35
|
-
"optionModuleV2": "
|
|
32
|
+
"diamond": "0x38E24abfD6C513E275B4935b39F946015C598302",
|
|
33
|
+
"vaultFactory": "0xa822e6CE38F86a16384BB7A5376b66E672D3bFB2",
|
|
34
|
+
"perpsOptionModuleHandle": "0x48539901B3f4AF93833E345C9659d101583abf56",
|
|
35
|
+
"optionModuleV2": "0x25E0e464f41c343b2aB998721C18e92C711c1Cad"
|
|
36
36
|
},
|
|
37
37
|
"tokens": {
|
|
38
38
|
"JBTC": { "address": "0xCb9d5Ae34cc0476BD8Cb22Aa9C21545be4e38bf2", "decimals": 8 },
|
|
39
39
|
"JUSDC": { "address": "0x567717052247C5Fa302fb2E8DF681A07D63E9faF", "decimals": 6 },
|
|
40
|
-
"CBBTC": { "address": "0x821DF7b83c9FCba013B37490CFC4B5a0bDe36220", "decimals": 8 }
|
|
40
|
+
"CBBTC": { "address": "0x821DF7b83c9FCba013B37490CFC4B5a0bDe36220", "decimals": 8 },
|
|
41
|
+
"AAPL": { "address": "0x237bB769D7E6b1685D30d30fCbAa5B1488d1d74E", "decimals": 8 }
|
|
41
42
|
},
|
|
42
43
|
"marginAsset": { "symbol": "JUSDC", "address": "0x567717052247C5Fa302fb2E8DF681A07D63E9faF", "decimals": 6 },
|
|
43
44
|
"writers": {
|
|
44
|
-
"JBTC": { "long": "
|
|
45
|
+
"JBTC": { "long": "0x545443abfc58ED6a555C2dA8ACd8Cb715DD30e9A", "short": "0xc574443366332Be5b6bfAD7264e3CA216bE1164E" },
|
|
46
|
+
"CBBTC": { "long": "0xa6c517881ea3adC89c88b1d8db60236e92D930FE", "short": "0xFa41A8701e68e945eAF0BBB2cF996253199E8CF5" },
|
|
47
|
+
"AAPL": { "long": "0x8B1A2df17AB63aC7C57139C23CCCC362c153f3d1", "short": "0x8DB0160dF1d6A27479c7ffB17B19aDbbd6ab3086" }
|
|
45
48
|
},
|
|
46
49
|
"defaultLeverage": 50,
|
|
47
50
|
"quoteCenterUrl": "https://quotecenterv2.jaspervault.io",
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
{
|
|
2
|
+
"networks": {
|
|
3
|
+
"base_uat": {
|
|
4
|
+
"name": "Base UAT",
|
|
5
|
+
"chainId": 8453,
|
|
6
|
+
"contracts": {
|
|
7
|
+
"diamond": "0xB571399F2824424D4c15496406Ea7ACBc1a276AB",
|
|
8
|
+
"vaultFactory": "0x54d365E5E31472108e6AE5bdF89d85912d1A428E",
|
|
9
|
+
"perpsOptionModuleHandle": "0x2BB0319B622058F8090b6742705Eb80F8dcC3cdc",
|
|
10
|
+
"optionModuleV2": "0x4De345778a85Cf12aF49c423c75Fe02C5799d425"
|
|
11
|
+
},
|
|
12
|
+
"tokens": {
|
|
13
|
+
"JBTC": { "address": "0xf3cEe52BDa02DaE997D00A0Bf8d221C4f129ebaF", "decimals": 8 },
|
|
14
|
+
"CBBTC": { "address": "0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf", "decimals": 8 },
|
|
15
|
+
"JUSDC": { "address": "0x6e236176D1B473Bdb770CDDF4d257B877F2DA9db", "decimals": 6 },
|
|
16
|
+
"USDC": { "address": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", "decimals": 6 }
|
|
17
|
+
},
|
|
18
|
+
"marginAsset": { "symbol": "JUSDC", "address": "0x6e236176D1B473Bdb770CDDF4d257B877F2DA9db", "decimals": 6 },
|
|
19
|
+
"writers": {
|
|
20
|
+
"JBTC": { "long": "0x2D0640Bc9624fd3B66D07FE54C223F138B0391Aa", "short": "0x71c44CF5Ca04b1a2a1A5bA93081DA89183AAc0b6" },
|
|
21
|
+
"CBBTC": { "long": "0x97cDCF310653a2Cbefee479adE77AD8D3De99dF1", "short": "0x71c44CF5Ca04b1a2a1A5bA93081DA89183AAc0b6" }
|
|
22
|
+
},
|
|
23
|
+
"defaultLeverage": 50,
|
|
24
|
+
"quoteCenterUrl": "https://quotecenterv2-uat-gcx2x.ondigitalocean.app",
|
|
25
|
+
"subgraphUrl": "https://subgraph.satsuma-prod.com/0981c2ab3685/garys-team/jaspervault-v2-base-uat/api"
|
|
26
|
+
},
|
|
27
|
+
"jaspervault": {
|
|
28
|
+
"name": "JasperVault",
|
|
29
|
+
"chainId": 55531,
|
|
30
|
+
"rpcUrl": "https://enterprise.onerpc.com/apikey/42b59vURnC9pSN2XWPunWiYWTeUOU6Mh/jasper_mainnet",
|
|
31
|
+
"contracts": {
|
|
32
|
+
"diamond": "0xAfD11c2d9350B2080eD601Ba64ea9f1F532A093c",
|
|
33
|
+
"vaultFactory": "0x54d365E5E31472108e6AE5bdF89d85912d1A428E",
|
|
34
|
+
"perpsOptionModuleHandle": "0xcbCCf074E030CDfd907375B00449B4f10d7d475f",
|
|
35
|
+
"optionModuleV2": "0x0f487603edE93a5329023512B7dcdA632eD70Ed5"
|
|
36
|
+
},
|
|
37
|
+
"tokens": {
|
|
38
|
+
"JBTC": { "address": "0xCb9d5Ae34cc0476BD8Cb22Aa9C21545be4e38bf2", "decimals": 8 },
|
|
39
|
+
"JUSDC": { "address": "0x567717052247C5Fa302fb2E8DF681A07D63E9faF", "decimals": 6 },
|
|
40
|
+
"CBBTC": { "address": "0x821DF7b83c9FCba013B37490CFC4B5a0bDe36220", "decimals": 8 }
|
|
41
|
+
},
|
|
42
|
+
"marginAsset": { "symbol": "JUSDC", "address": "0x567717052247C5Fa302fb2E8DF681A07D63E9faF", "decimals": 6 },
|
|
43
|
+
"writers": {
|
|
44
|
+
"JBTC": { "long": "0xfe7fe5D5de9a8B0BcF39D8676d0C92065a3ca20f", "short": "0x7c7900E40652A9C2225cf6d1E96c38606407e5B0" }
|
|
45
|
+
},
|
|
46
|
+
"defaultLeverage": 50,
|
|
47
|
+
"quoteCenterUrl": "https://uat-jasperquotecenterv2.fly.dev",
|
|
48
|
+
"subgraphUrl": "https://subgraph.jaspervault.io"
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
"warpRoutes": {
|
|
52
|
+
"jbtc": {
|
|
53
|
+
"symbol": "jBTC",
|
|
54
|
+
"decimals": 8,
|
|
55
|
+
"base": {
|
|
56
|
+
"underlyingToken": "0xf3cEe52BDa02DaE997D00A0Bf8d221C4f129ebaF",
|
|
57
|
+
"warpRouter": "0xf29d79382d5d092193F0746671397410490e51fF"
|
|
58
|
+
},
|
|
59
|
+
"jaspervault": {
|
|
60
|
+
"domain": 55531,
|
|
61
|
+
"warpRouter": "0xCb9d5Ae34cc0476BD8Cb22Aa9C21545be4e38bf2"
|
|
62
|
+
}
|
|
63
|
+
},
|
|
64
|
+
"jusdc": {
|
|
65
|
+
"symbol": "jUSDC",
|
|
66
|
+
"decimals": 6,
|
|
67
|
+
"base": {
|
|
68
|
+
"underlyingToken": "0x6e236176D1B473Bdb770CDDF4d257B877F2DA9db",
|
|
69
|
+
"warpRouter": "0x7C475c87b8AA7609073e1be3d3CEB62BbbD5276a"
|
|
70
|
+
},
|
|
71
|
+
"jaspervault": {
|
|
72
|
+
"domain": 55531,
|
|
73
|
+
"warpRouter": "0x567717052247C5Fa302fb2E8DF681A07D63E9faF"
|
|
74
|
+
}
|
|
75
|
+
},
|
|
76
|
+
"cbbtc": {
|
|
77
|
+
"symbol": "cBBTC",
|
|
78
|
+
"decimals": 8,
|
|
79
|
+
"base": {
|
|
80
|
+
"underlyingToken": "0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf",
|
|
81
|
+
"warpRouter": "0xf08d7Be10E69BD5B7FfCb65612720a747C9B8Bed"
|
|
82
|
+
},
|
|
83
|
+
"jaspervault": {
|
|
84
|
+
"domain": 55531,
|
|
85
|
+
"warpRouter": "0x821DF7b83c9FCba013B37490CFC4B5a0bDe36220"
|
|
86
|
+
}
|
|
87
|
+
},
|
|
88
|
+
"usdc": {
|
|
89
|
+
"symbol": "USDC",
|
|
90
|
+
"decimals": 6,
|
|
91
|
+
"base": {
|
|
92
|
+
"underlyingToken": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
|
|
93
|
+
"warpRouter": "0xDe0f17681123CbE998E7896B74a197937123b3D9"
|
|
94
|
+
},
|
|
95
|
+
"jaspervault": {
|
|
96
|
+
"domain": 55531,
|
|
97
|
+
"warpRouter": "0x23559FcF18896ed3280c4d7106ca74fFda14bd79"
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
},
|
|
101
|
+
"defaultJaspervaultRpc": "https://enterprise.onerpc.com/apikey/42b59vURnC9pSN2XWPunWiYWTeUOU6Mh/jasper_mainnet"
|
|
102
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { SignClient } from '@walletconnect/sign-client';
|
|
2
|
+
export declare function startHeartbeat(phase: string, message: string): {
|
|
3
|
+
stop: () => void;
|
|
4
|
+
};
|
|
5
|
+
export interface InitWcResult {
|
|
6
|
+
client: InstanceType<typeof SignClient>;
|
|
7
|
+
session: {
|
|
8
|
+
topic: string;
|
|
9
|
+
pairingTopic: string;
|
|
10
|
+
namespaces: Record<string, {
|
|
11
|
+
accounts: string[];
|
|
12
|
+
}>;
|
|
13
|
+
};
|
|
14
|
+
walletAddress: string;
|
|
15
|
+
}
|
|
16
|
+
export interface QrCodeOutput {
|
|
17
|
+
qrCodeUrl: string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Initialize WalletConnect SignClient, connect, show QR, wait for approval.
|
|
21
|
+
* Returns client + session + walletAddress for further requests (e.g. eth_signTypedData_v4).
|
|
22
|
+
*/
|
|
23
|
+
export declare function initWcAndConnect(opts: {
|
|
24
|
+
timeoutS: number;
|
|
25
|
+
onAwaiting?: (uri: string, qrCodes: QrCodeOutput) => void;
|
|
26
|
+
}): Promise<InitWcResult>;
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import * as fs from 'node:fs/promises';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { SignClient } from '@walletconnect/sign-client';
|
|
4
|
+
import QRCode from 'qrcode';
|
|
5
|
+
import { exitWithError, EXIT_CODES } from '../utils/output.js';
|
|
6
|
+
const DEFAULT_TIMEOUT_S = 120;
|
|
7
|
+
const HEARTBEAT_INTERVAL_MS = 10_000;
|
|
8
|
+
export function startHeartbeat(phase, message) {
|
|
9
|
+
const start = Date.now();
|
|
10
|
+
const timer = setInterval(() => {
|
|
11
|
+
const elapsed = Math.round((Date.now() - start) / 1000);
|
|
12
|
+
process.stderr.write(JSON.stringify({ status: 'waiting', phase, elapsed, message }) + '\n');
|
|
13
|
+
}, HEARTBEAT_INTERVAL_MS);
|
|
14
|
+
return { stop: () => clearInterval(timer) };
|
|
15
|
+
}
|
|
16
|
+
// Embedded project ID — users can override with WC_PROJECT_ID env var
|
|
17
|
+
const DEFAULT_WC_PROJECT_ID = 'f47863c3ad29e5bae9cee8013ec05982';
|
|
18
|
+
const WC_METADATA = {
|
|
19
|
+
name: 'JasperVault CLI',
|
|
20
|
+
description: 'JasperVault perpetual trading CLI',
|
|
21
|
+
url: 'https://jaspervault.io',
|
|
22
|
+
icons: [],
|
|
23
|
+
};
|
|
24
|
+
function getJvDir() {
|
|
25
|
+
return join(process.env.HOME || process.env.USERPROFILE || '', '.jaspervault');
|
|
26
|
+
}
|
|
27
|
+
function getQrCodePath() {
|
|
28
|
+
return join(getJvDir(), 'wc-qrcode.png');
|
|
29
|
+
}
|
|
30
|
+
function buildQrCodeUrl(data) {
|
|
31
|
+
return `https://api.qrserver.com/v1/create-qr-code/?size=400x400&data=${encodeURIComponent(data)}`;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Initialize WalletConnect SignClient, connect, show QR, wait for approval.
|
|
35
|
+
* Returns client + session + walletAddress for further requests (e.g. eth_signTypedData_v4).
|
|
36
|
+
*/
|
|
37
|
+
export async function initWcAndConnect(opts) {
|
|
38
|
+
const projectId = process.env.WC_PROJECT_ID || DEFAULT_WC_PROJECT_ID;
|
|
39
|
+
let client;
|
|
40
|
+
try {
|
|
41
|
+
client = await SignClient.init({
|
|
42
|
+
projectId,
|
|
43
|
+
metadata: WC_METADATA,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
catch (err) {
|
|
47
|
+
exitWithError(`Failed to initialize WalletConnect: ${err.message}`, EXIT_CODES.HTTP_ERROR);
|
|
48
|
+
}
|
|
49
|
+
const { uri, approval } = await client.connect({
|
|
50
|
+
optionalNamespaces: {
|
|
51
|
+
eip155: {
|
|
52
|
+
chains: ['eip155:8453', 'eip155:55531'],
|
|
53
|
+
methods: ['eth_signTypedData_v4', 'eth_sendTransaction'],
|
|
54
|
+
events: ['accountsChanged', 'chainChanged'],
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
});
|
|
58
|
+
if (!uri) {
|
|
59
|
+
exitWithError('WalletConnect did not return a pairing URI', EXIT_CODES.HTTP_ERROR);
|
|
60
|
+
}
|
|
61
|
+
await fs.mkdir(getJvDir(), { recursive: true });
|
|
62
|
+
const qrPath = getQrCodePath();
|
|
63
|
+
await QRCode.toFile(qrPath, uri, { width: 400, errorCorrectionLevel: 'M' });
|
|
64
|
+
const qrCodeUrl = buildQrCodeUrl(uri);
|
|
65
|
+
opts.onAwaiting?.(uri, { qrCodeUrl });
|
|
66
|
+
const heartbeat = startHeartbeat('wallet_scan', 'Waiting for wallet connection...');
|
|
67
|
+
const timeoutMs = opts.timeoutS * 1000;
|
|
68
|
+
let session;
|
|
69
|
+
try {
|
|
70
|
+
session = await Promise.race([
|
|
71
|
+
approval(),
|
|
72
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error('timeout')), timeoutMs)),
|
|
73
|
+
]);
|
|
74
|
+
}
|
|
75
|
+
catch (err) {
|
|
76
|
+
heartbeat.stop();
|
|
77
|
+
const msg = err.message;
|
|
78
|
+
if (msg === 'timeout') {
|
|
79
|
+
throw new Error(`Connection timed out after ${opts.timeoutS}s`);
|
|
80
|
+
}
|
|
81
|
+
throw new Error(`Connection rejected or failed: ${msg}`);
|
|
82
|
+
}
|
|
83
|
+
heartbeat.stop();
|
|
84
|
+
const accounts = Object.values(session.namespaces).flatMap((ns) => ns.accounts);
|
|
85
|
+
const firstAccount = accounts[0];
|
|
86
|
+
if (!firstAccount) {
|
|
87
|
+
exitWithError('No accounts returned from wallet', EXIT_CODES.BUSINESS_ERROR);
|
|
88
|
+
}
|
|
89
|
+
const parts = firstAccount.split(':');
|
|
90
|
+
const walletAddress = parts[2];
|
|
91
|
+
return { client, session, walletAddress };
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=connect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connect.js","sourceRoot":"","sources":["../../../src/commands/connect.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import * as fs from 'node:fs/promises';
|
|
2
|
+
import * as path from 'node:path';
|
|
3
|
+
import { homedir } from 'node:os';
|
|
4
|
+
import { BANNER, buildSkillContent } from '../templates/skill-body.js';
|
|
5
|
+
export const PLATFORMS = ['openclaw', 'cursor', 'claude', 'all'];
|
|
6
|
+
const SKILL_DIR = 'jasper-vault-cli';
|
|
7
|
+
function getTargetPath(platform, global) {
|
|
8
|
+
const home = homedir();
|
|
9
|
+
const cwd = process.cwd();
|
|
10
|
+
switch (platform) {
|
|
11
|
+
case 'openclaw':
|
|
12
|
+
return [path.join(home, '.openclaw', 'skills', SKILL_DIR)];
|
|
13
|
+
case 'cursor':
|
|
14
|
+
return global
|
|
15
|
+
? [path.join(home, '.cursor', 'skills', SKILL_DIR)]
|
|
16
|
+
: [path.join(cwd, '.cursor', 'skills', SKILL_DIR)];
|
|
17
|
+
case 'claude':
|
|
18
|
+
return global
|
|
19
|
+
? [path.join(home, '.claude', 'skills', SKILL_DIR)]
|
|
20
|
+
: [path.join(cwd, '.claude', 'skills', SKILL_DIR)];
|
|
21
|
+
case 'all':
|
|
22
|
+
return [
|
|
23
|
+
path.join(home, '.openclaw', 'skills', SKILL_DIR),
|
|
24
|
+
path.join(cwd, '.cursor', 'skills', SKILL_DIR),
|
|
25
|
+
path.join(cwd, '.claude', 'skills', SKILL_DIR),
|
|
26
|
+
];
|
|
27
|
+
default:
|
|
28
|
+
throw new Error(`Unknown platform: ${platform}`);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
function getPlatformFromPath(pathStr) {
|
|
32
|
+
if (pathStr.includes('.openclaw'))
|
|
33
|
+
return 'openclaw';
|
|
34
|
+
if (pathStr.includes('.cursor'))
|
|
35
|
+
return 'cursor';
|
|
36
|
+
if (pathStr.includes('.claude'))
|
|
37
|
+
return 'claude';
|
|
38
|
+
throw new Error(`Cannot determine platform from path: ${pathStr}`);
|
|
39
|
+
}
|
|
40
|
+
function getPlatformDisplayName(p) {
|
|
41
|
+
return p === 'openclaw' ? 'OpenClaw' : p === 'cursor' ? 'Cursor' : 'Claude Code';
|
|
42
|
+
}
|
|
43
|
+
export function registerInitCommand(program) {
|
|
44
|
+
program
|
|
45
|
+
.command('init')
|
|
46
|
+
.description('Install JasperVault skill to AI platform (OpenClaw, Cursor, Claude Code)')
|
|
47
|
+
.requiredOption('--ai <platform>', `Target platform: ${PLATFORMS.join(', ')}`)
|
|
48
|
+
.option('--global', 'Install to user home directory (cursor/claude only)')
|
|
49
|
+
.option('--force', 'Overwrite existing skill files without prompting')
|
|
50
|
+
.action(async (opts) => {
|
|
51
|
+
const platform = opts.ai;
|
|
52
|
+
if (!PLATFORMS.includes(platform)) {
|
|
53
|
+
process.stderr.write(`Error: Invalid platform "${platform}". Use one of: ${PLATFORMS.join(', ')}\n`);
|
|
54
|
+
process.exit(1);
|
|
55
|
+
}
|
|
56
|
+
const globalFlag = opts.global ?? false;
|
|
57
|
+
const force = opts.force ?? false;
|
|
58
|
+
const targetPaths = getTargetPath(platform, globalFlag);
|
|
59
|
+
process.stdout.write(BANNER + '\n\n');
|
|
60
|
+
const results = [];
|
|
61
|
+
for (const targetDir of targetPaths) {
|
|
62
|
+
const skillPlatform = platform === 'all' ? getPlatformFromPath(targetDir) : platform;
|
|
63
|
+
const platDisplay = getPlatformDisplayName(skillPlatform);
|
|
64
|
+
try {
|
|
65
|
+
const skillMdPath = path.join(targetDir, 'SKILL.md');
|
|
66
|
+
const exists = await fs
|
|
67
|
+
.access(skillMdPath)
|
|
68
|
+
.then(() => true)
|
|
69
|
+
.catch(() => false);
|
|
70
|
+
if (exists && !force) {
|
|
71
|
+
process.stderr.write(`Error: Skill already exists at ${targetDir}\n` +
|
|
72
|
+
'Use --force to overwrite.\n');
|
|
73
|
+
process.exit(1);
|
|
74
|
+
}
|
|
75
|
+
const files = buildSkillContent(skillPlatform);
|
|
76
|
+
let fileCount = 0;
|
|
77
|
+
for (const [relPath, content] of Object.entries(files)) {
|
|
78
|
+
const filePath = path.join(targetDir, relPath);
|
|
79
|
+
await fs.mkdir(path.dirname(filePath), { recursive: true });
|
|
80
|
+
await fs.writeFile(filePath, content, 'utf8');
|
|
81
|
+
fileCount++;
|
|
82
|
+
}
|
|
83
|
+
// Make scripts executable
|
|
84
|
+
const scriptsDir = path.join(targetDir, 'scripts');
|
|
85
|
+
const scriptsDirExists = await fs
|
|
86
|
+
.access(scriptsDir)
|
|
87
|
+
.then(() => true)
|
|
88
|
+
.catch(() => false);
|
|
89
|
+
if (scriptsDirExists) {
|
|
90
|
+
const scriptFiles = await fs.readdir(scriptsDir);
|
|
91
|
+
for (const sf of scriptFiles) {
|
|
92
|
+
if (sf.endsWith('.sh')) {
|
|
93
|
+
await fs.chmod(path.join(scriptsDir, sf), 0o755);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
results.push({ path: targetDir, platform: platDisplay, fileCount });
|
|
98
|
+
}
|
|
99
|
+
catch (err) {
|
|
100
|
+
process.stderr.write(`Error installing to ${platDisplay}: ${err.message}\n`);
|
|
101
|
+
process.exit(1);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
process.stdout.write('\n ✓ Skill installed successfully!\n\n' +
|
|
105
|
+
results
|
|
106
|
+
.map((r) => ` Platform: ${r.platform}\n Location: ${r.path}\n Files: ${r.fileCount} (SKILL.md + references/ + scripts/)`)
|
|
107
|
+
.join('\n\n') +
|
|
108
|
+
'\n\n Next steps:\n' +
|
|
109
|
+
' 1. First-time setup: jv vault setup --network jaspervault\n' +
|
|
110
|
+
' 2. (Optional) Override API URL for local debugging: export JV_API_URL=http://localhost:3000\n' +
|
|
111
|
+
' 3. Start using jv commands or let your AI agent call them\n');
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import * as fs from 'node:fs/promises';
|
|
2
|
+
import * as path from 'node:path';
|
|
3
|
+
import { homedir } from 'node:os';
|
|
4
|
+
import { BANNER, buildSkillContent } from '../templates/skill-body.js';
|
|
5
|
+
export const PLATFORMS = ['openclaw', 'cursor', 'claude', 'all'];
|
|
6
|
+
const SKILL_DIR = 'jasper-vault-cli';
|
|
7
|
+
function getTargetPath(platform, global) {
|
|
8
|
+
const home = homedir();
|
|
9
|
+
const cwd = process.cwd();
|
|
10
|
+
switch (platform) {
|
|
11
|
+
case 'openclaw':
|
|
12
|
+
return [path.join(home, '.openclaw', 'skills', SKILL_DIR)];
|
|
13
|
+
case 'cursor':
|
|
14
|
+
return global
|
|
15
|
+
? [path.join(home, '.cursor', 'skills', SKILL_DIR)]
|
|
16
|
+
: [path.join(cwd, '.cursor', 'skills', SKILL_DIR)];
|
|
17
|
+
case 'claude':
|
|
18
|
+
return global
|
|
19
|
+
? [path.join(home, '.claude', 'skills', SKILL_DIR)]
|
|
20
|
+
: [path.join(cwd, '.claude', 'skills', SKILL_DIR)];
|
|
21
|
+
case 'all':
|
|
22
|
+
return [
|
|
23
|
+
path.join(home, '.openclaw', 'skills', SKILL_DIR),
|
|
24
|
+
path.join(cwd, '.cursor', 'skills', SKILL_DIR),
|
|
25
|
+
path.join(cwd, '.claude', 'skills', SKILL_DIR),
|
|
26
|
+
];
|
|
27
|
+
default:
|
|
28
|
+
throw new Error(`Unknown platform: ${platform}`);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
function getPlatformFromPath(pathStr) {
|
|
32
|
+
if (pathStr.includes('.openclaw'))
|
|
33
|
+
return 'openclaw';
|
|
34
|
+
if (pathStr.includes('.cursor'))
|
|
35
|
+
return 'cursor';
|
|
36
|
+
if (pathStr.includes('.claude'))
|
|
37
|
+
return 'claude';
|
|
38
|
+
throw new Error(`Cannot determine platform from path: ${pathStr}`);
|
|
39
|
+
}
|
|
40
|
+
function getPlatformDisplayName(p) {
|
|
41
|
+
return p === 'openclaw' ? 'OpenClaw' : p === 'cursor' ? 'Cursor' : 'Claude Code';
|
|
42
|
+
}
|
|
43
|
+
export function registerSkillCommand(program) {
|
|
44
|
+
const skill = program
|
|
45
|
+
.command('skill')
|
|
46
|
+
.description('Manage JasperVault AI skills');
|
|
47
|
+
skill
|
|
48
|
+
.command('install')
|
|
49
|
+
.description('Install JasperVault skill to AI platform (OpenClaw, Cursor, Claude Code)')
|
|
50
|
+
.requiredOption('--ai <platform>', `Target platform: ${PLATFORMS.join(', ')}`)
|
|
51
|
+
.option('--global', 'Install to user home directory (cursor/claude only)')
|
|
52
|
+
.option('--force', 'Overwrite existing skill files without prompting')
|
|
53
|
+
.action(async (opts) => {
|
|
54
|
+
const platform = opts.ai;
|
|
55
|
+
if (!PLATFORMS.includes(platform)) {
|
|
56
|
+
process.stderr.write(`Error: Invalid platform "${platform}". Use one of: ${PLATFORMS.join(', ')}\n`);
|
|
57
|
+
process.exit(1);
|
|
58
|
+
}
|
|
59
|
+
const globalFlag = opts.global ?? false;
|
|
60
|
+
const force = opts.force ?? false;
|
|
61
|
+
const targetPaths = getTargetPath(platform, globalFlag);
|
|
62
|
+
process.stdout.write(BANNER + '\n\n');
|
|
63
|
+
const results = [];
|
|
64
|
+
for (const targetDir of targetPaths) {
|
|
65
|
+
const skillPlatform = platform === 'all' ? getPlatformFromPath(targetDir) : platform;
|
|
66
|
+
const platDisplay = getPlatformDisplayName(skillPlatform);
|
|
67
|
+
try {
|
|
68
|
+
const skillMdPath = path.join(targetDir, 'SKILL.md');
|
|
69
|
+
const exists = await fs
|
|
70
|
+
.access(skillMdPath)
|
|
71
|
+
.then(() => true)
|
|
72
|
+
.catch(() => false);
|
|
73
|
+
if (exists && !force) {
|
|
74
|
+
process.stderr.write(`Error: Skill already exists at ${targetDir}\n` +
|
|
75
|
+
'Use --force to overwrite.\n');
|
|
76
|
+
process.exit(1);
|
|
77
|
+
}
|
|
78
|
+
const files = buildSkillContent(skillPlatform);
|
|
79
|
+
let fileCount = 0;
|
|
80
|
+
for (const [relPath, content] of Object.entries(files)) {
|
|
81
|
+
const filePath = path.join(targetDir, relPath);
|
|
82
|
+
await fs.mkdir(path.dirname(filePath), { recursive: true });
|
|
83
|
+
await fs.writeFile(filePath, content, 'utf8');
|
|
84
|
+
fileCount++;
|
|
85
|
+
}
|
|
86
|
+
// Make scripts executable
|
|
87
|
+
const scriptsDir = path.join(targetDir, 'scripts');
|
|
88
|
+
const scriptsDirExists = await fs
|
|
89
|
+
.access(scriptsDir)
|
|
90
|
+
.then(() => true)
|
|
91
|
+
.catch(() => false);
|
|
92
|
+
if (scriptsDirExists) {
|
|
93
|
+
const scriptFiles = await fs.readdir(scriptsDir);
|
|
94
|
+
for (const sf of scriptFiles) {
|
|
95
|
+
if (sf.endsWith('.sh')) {
|
|
96
|
+
await fs.chmod(path.join(scriptsDir, sf), 0o755);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
results.push({ path: targetDir, platform: platDisplay, fileCount });
|
|
101
|
+
}
|
|
102
|
+
catch (err) {
|
|
103
|
+
process.stderr.write(`Error installing to ${platDisplay}: ${err.message}\n`);
|
|
104
|
+
process.exit(1);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
process.stdout.write('\n ✓ Skill installed successfully!\n\n' +
|
|
108
|
+
results
|
|
109
|
+
.map((r) => ` Platform: ${r.platform}\n Location: ${r.path}\n Files: ${r.fileCount} (SKILL.md + references/ + scripts/)`)
|
|
110
|
+
.join('\n\n') +
|
|
111
|
+
'\n\n Next steps:\n' +
|
|
112
|
+
' 1. First-time setup: jv vault setup --network jaspervault\n' +
|
|
113
|
+
' 2. (Optional) Override API URL for local debugging: export JV_API_URL=http://localhost:3000\n' +
|
|
114
|
+
' 3. Start using jv commands or let your AI agent call them\n');
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=skill.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill.js","sourceRoot":"","sources":["../../../src/commands/skill.ts"],"names":[],"mappings":"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"}
|
package/dist/src/utils/config.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export const DEFAULT_API_URL = 'https://marketpalce-api-
|
|
1
|
+
export const DEFAULT_API_URL = 'https://marketpalce-api-beta-of8dk.ondigitalocean.app';
|
|
2
2
|
export function loadConfig() {
|
|
3
3
|
const apiUrl = process.env.JV_API_URL ?? DEFAULT_API_URL;
|
|
4
4
|
const normalizedUrl = apiUrl.endsWith('/') ? apiUrl.slice(0, -1) : apiUrl;
|