neutron-cli 0.1.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.
- package/README.md +124 -0
- package/dist/client.d.ts +3 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +37 -0
- package/dist/client.js.map +1 -0
- package/dist/commands/auth.d.ts +3 -0
- package/dist/commands/auth.d.ts.map +1 -0
- package/dist/commands/auth.js +33 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/balance.d.ts +3 -0
- package/dist/commands/balance.d.ts.map +1 -0
- package/dist/commands/balance.js +37 -0
- package/dist/commands/balance.js.map +1 -0
- package/dist/commands/config.d.ts +3 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +136 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/invoice.d.ts +3 -0
- package/dist/commands/invoice.d.ts.map +1 -0
- package/dist/commands/invoice.js +39 -0
- package/dist/commands/invoice.js.map +1 -0
- package/dist/commands/rate.d.ts +3 -0
- package/dist/commands/rate.d.ts.map +1 -0
- package/dist/commands/rate.js +35 -0
- package/dist/commands/rate.js.map +1 -0
- package/dist/commands/send.d.ts +3 -0
- package/dist/commands/send.d.ts.map +1 -0
- package/dist/commands/send.js +39 -0
- package/dist/commands/send.js.map +1 -0
- package/dist/commands/tx.d.ts +3 -0
- package/dist/commands/tx.d.ts.map +1 -0
- package/dist/commands/tx.js +67 -0
- package/dist/commands/tx.js.map +1 -0
- package/dist/commands/webhook.d.ts +3 -0
- package/dist/commands/webhook.d.ts.map +1 -0
- package/dist/commands/webhook.js +78 -0
- package/dist/commands/webhook.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +32 -0
- package/dist/index.js.map +1 -0
- package/dist/output.d.ts +8 -0
- package/dist/output.d.ts.map +1 -0
- package/dist/output.js +21 -0
- package/dist/output.js.map +1 -0
- package/package.json +32 -0
package/README.md
ADDED
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
# neutron-cli
|
|
2
|
+
|
|
3
|
+
CLI for [Neutron](https://neutron.me) Lightning wallet services — for developers and AI agents.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
# Run without installing
|
|
9
|
+
npx neutron-cli --help
|
|
10
|
+
|
|
11
|
+
# Or install globally
|
|
12
|
+
npm install -g neutron-cli
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Auth
|
|
16
|
+
|
|
17
|
+
Set your credentials as environment variables:
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
export NEUTRON_API_KEY=your_api_key
|
|
21
|
+
export NEUTRON_API_SECRET=your_api_secret
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
Or create `~/.neutron/config.json`:
|
|
25
|
+
|
|
26
|
+
```json
|
|
27
|
+
{
|
|
28
|
+
"apiKey": "your_api_key",
|
|
29
|
+
"apiSecret": "your_api_secret"
|
|
30
|
+
}
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Get your API key at [portal.neutron.me](https://portal.neutron.me).
|
|
34
|
+
|
|
35
|
+
## Commands
|
|
36
|
+
|
|
37
|
+
### Verify credentials
|
|
38
|
+
```bash
|
|
39
|
+
neutron-cli auth
|
|
40
|
+
neutron-cli auth --pretty
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### Check balances
|
|
44
|
+
```bash
|
|
45
|
+
neutron-cli balance
|
|
46
|
+
neutron-cli balance --pretty
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### Create a Lightning invoice
|
|
50
|
+
```bash
|
|
51
|
+
neutron-cli invoice --amount 5000
|
|
52
|
+
neutron-cli invoice --amount 5000 --memo "order #123"
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### Send a payment
|
|
56
|
+
```bash
|
|
57
|
+
neutron-cli send --to lnbc50u1p... --amount 5000
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### Transactions
|
|
61
|
+
```bash
|
|
62
|
+
neutron-cli tx get txn_abc123
|
|
63
|
+
neutron-cli tx list
|
|
64
|
+
neutron-cli tx list --limit 20 --from 2026-01-01 --to 2026-03-01
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### Exchange rate
|
|
68
|
+
```bash
|
|
69
|
+
neutron-cli rate
|
|
70
|
+
neutron-cli rate --currency thb
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### Webhooks
|
|
74
|
+
```bash
|
|
75
|
+
neutron-cli webhook create --url https://example.com/webhook
|
|
76
|
+
neutron-cli webhook list
|
|
77
|
+
neutron-cli webhook delete wh_abc123
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## Output
|
|
81
|
+
|
|
82
|
+
All commands output JSON by default (machine-readable):
|
|
83
|
+
|
|
84
|
+
```json
|
|
85
|
+
{"ok":true,"data":{...}}
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
Add `--pretty` for human-readable output:
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
neutron-cli balance --pretty
|
|
92
|
+
# ✅ Wallets
|
|
93
|
+
# BTC 50,000 sats (Main)
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
Errors go to stderr with exit code 1:
|
|
97
|
+
|
|
98
|
+
```json
|
|
99
|
+
{"error":"Missing credentials","code":"AUTH_MISSING"}
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
## For AI Agents
|
|
103
|
+
|
|
104
|
+
Any AI agent with bash/exec access can use Neutron immediately:
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
# Set credentials once
|
|
108
|
+
export NEUTRON_API_KEY=...
|
|
109
|
+
export NEUTRON_API_SECRET=...
|
|
110
|
+
|
|
111
|
+
# Then use in any bash tool
|
|
112
|
+
neutron-cli invoice --amount 1000 --memo "agent payment"
|
|
113
|
+
neutron-cli tx list --limit 5
|
|
114
|
+
neutron-cli rate --currency usd
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
No MCP setup required. Works with Claude Code, Codex, and any agent that can run shell commands.
|
|
118
|
+
|
|
119
|
+
## Links
|
|
120
|
+
|
|
121
|
+
- Docs: [docs.neutron.me](https://docs.neutron.me)
|
|
122
|
+
- Portal: [portal.neutron.me](https://portal.neutron.me)
|
|
123
|
+
- MCP package: [neutron-mcp](https://npmjs.com/package/neutron-mcp)
|
|
124
|
+
- SDK: [neutron-sdk](https://npmjs.com/package/neutron-sdk)
|
package/dist/client.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAiCtC,wBAAgB,SAAS,IAAI,OAAO,CAMnC"}
|
package/dist/client.js
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getClient = getClient;
|
|
4
|
+
const fs_1 = require("fs");
|
|
5
|
+
const os_1 = require("os");
|
|
6
|
+
const path_1 = require("path");
|
|
7
|
+
const neutron_sdk_1 = require("neutron-sdk");
|
|
8
|
+
const output_js_1 = require("./output.js");
|
|
9
|
+
function loadConfig() {
|
|
10
|
+
// 1. Env vars
|
|
11
|
+
const apiKey = process.env.NEUTRON_API_KEY;
|
|
12
|
+
const apiSecret = process.env.NEUTRON_API_SECRET;
|
|
13
|
+
if (apiKey && apiSecret)
|
|
14
|
+
return { apiKey, apiSecret };
|
|
15
|
+
// 2. ~/.neutron/config.json
|
|
16
|
+
try {
|
|
17
|
+
const cfgPath = (0, path_1.join)((0, os_1.homedir)(), ".neutron", "config.json");
|
|
18
|
+
const raw = (0, fs_1.readFileSync)(cfgPath, "utf8");
|
|
19
|
+
const cfg = JSON.parse(raw);
|
|
20
|
+
if (cfg.apiKey && cfg.apiSecret)
|
|
21
|
+
return cfg;
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
// file not found or malformed — fall through
|
|
25
|
+
}
|
|
26
|
+
(0, output_js_1.fail)("Missing credentials. Set NEUTRON_API_KEY and NEUTRON_API_SECRET env vars, " +
|
|
27
|
+
"or create ~/.neutron/config.json with { \"apiKey\": \"...\", \"apiSecret\": \"...\" }", "AUTH_MISSING");
|
|
28
|
+
}
|
|
29
|
+
let _client = null;
|
|
30
|
+
function getClient() {
|
|
31
|
+
if (!_client) {
|
|
32
|
+
const cfg = loadConfig();
|
|
33
|
+
_client = new neutron_sdk_1.Neutron({ apiKey: cfg.apiKey, apiSecret: cfg.apiSecret });
|
|
34
|
+
}
|
|
35
|
+
return _client;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":";;AAoCA,8BAMC;AA1CD,2BAAkC;AAClC,2BAA6B;AAC7B,+BAA4B;AAC5B,6CAAsC;AACtC,2CAAmC;AAOnC,SAAS,UAAU;IACjB,cAAc;IACd,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;IAC3C,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;IACjD,IAAI,MAAM,IAAI,SAAS;QAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAEtD,4BAA4B;IAC5B,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAA,WAAI,EAAC,IAAA,YAAO,GAAE,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;QAC3D,MAAM,GAAG,GAAG,IAAA,iBAAY,EAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAoB,CAAC;QAC/C,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,SAAS;YAAE,OAAO,GAAa,CAAC;IACxD,CAAC;IAAC,MAAM,CAAC;QACP,6CAA6C;IAC/C,CAAC;IAED,IAAA,gBAAI,EACF,4EAA4E;QAC1E,uFAAuF,EACzF,cAAc,CACf,CAAC;AACJ,CAAC;AAED,IAAI,OAAO,GAAmB,IAAI,CAAC;AAEnC,SAAgB,SAAS;IACvB,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;QACzB,OAAO,GAAG,IAAI,qBAAO,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;IAC1E,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAwBnD"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerAuth = registerAuth;
|
|
4
|
+
const client_js_1 = require("../client.js");
|
|
5
|
+
const output_js_1 = require("../output.js");
|
|
6
|
+
function registerAuth(program) {
|
|
7
|
+
program
|
|
8
|
+
.command("auth")
|
|
9
|
+
.description("Verify credentials and print account info")
|
|
10
|
+
.option("--pretty", "Human-readable output")
|
|
11
|
+
.action(async (opts) => {
|
|
12
|
+
try {
|
|
13
|
+
const client = (0, client_js_1.getClient)();
|
|
14
|
+
const account = await client.account.get();
|
|
15
|
+
if ((0, output_js_1.isPretty)(opts)) {
|
|
16
|
+
(0, output_js_1.pretty)([
|
|
17
|
+
"✅ Authenticated",
|
|
18
|
+
` Account ID: ${account.accountId ?? account.id ?? "—"}`,
|
|
19
|
+
` Name: ${account.displayName ?? account.name ?? "—"}`,
|
|
20
|
+
` Status: ${account.status ?? "—"}`,
|
|
21
|
+
` Country: ${account.country ?? "—"}`,
|
|
22
|
+
]);
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
(0, output_js_1.ok)(account);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
catch (e) {
|
|
29
|
+
(0, output_js_1.fail)(e?.message ?? "Auth check failed", "AUTH_ERROR");
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":";;AAIA,oCAwBC;AA3BD,4CAAyC;AACzC,4CAA0D;AAE1D,SAAgB,YAAY,CAAC,OAAgB;IAC3C,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,2CAA2C,CAAC;SACxD,MAAM,CAAC,UAAU,EAAE,uBAAuB,CAAC;SAC3C,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAA,qBAAS,GAAE,CAAC;YAC3B,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;YAC3C,IAAI,IAAA,oBAAQ,EAAC,IAAI,CAAC,EAAE,CAAC;gBACnB,IAAA,kBAAM,EAAC;oBACL,iBAAiB;oBACjB,mBAAoB,OAAe,CAAC,SAAS,IAAK,OAAe,CAAC,EAAE,IAAI,GAAG,EAAE;oBAC7E,mBAAoB,OAAe,CAAC,WAAW,IAAK,OAAe,CAAC,IAAI,IAAI,GAAG,EAAE;oBACjF,mBAAoB,OAAe,CAAC,MAAM,IAAI,GAAG,EAAE;oBACnD,mBAAoB,OAAe,CAAC,OAAO,IAAI,GAAG,EAAE;iBACrD,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,IAAA,cAAE,EAAC,OAAO,CAAC,CAAC;YACd,CAAC;QACH,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,IAAA,gBAAI,EAAC,CAAC,EAAE,OAAO,IAAI,mBAAmB,EAAE,YAAY,CAAC,CAAC;QACxD,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"balance.d.ts","sourceRoot":"","sources":["../../src/commands/balance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA6BtD"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerBalance = registerBalance;
|
|
4
|
+
const client_js_1 = require("../client.js");
|
|
5
|
+
const output_js_1 = require("../output.js");
|
|
6
|
+
function registerBalance(program) {
|
|
7
|
+
program
|
|
8
|
+
.command("balance")
|
|
9
|
+
.description("List all wallets and balances")
|
|
10
|
+
.option("--pretty", "Human-readable output")
|
|
11
|
+
.action(async (opts) => {
|
|
12
|
+
try {
|
|
13
|
+
const client = (0, client_js_1.getClient)();
|
|
14
|
+
const wallets = await client.account.wallets();
|
|
15
|
+
if ((0, output_js_1.isPretty)(opts)) {
|
|
16
|
+
const lines = ["✅ Wallets"];
|
|
17
|
+
for (const w of wallets) {
|
|
18
|
+
const ccy = w.ccy ?? w.currency ?? "?";
|
|
19
|
+
const bal = w.balance ?? w.amount ?? 0;
|
|
20
|
+
const label = w.label ?? w.name ?? "";
|
|
21
|
+
const display = ccy === "BTC"
|
|
22
|
+
? `${Number(bal * 1e8).toLocaleString()} sats`
|
|
23
|
+
: `${ccy} ${Number(bal).toLocaleString()}`;
|
|
24
|
+
lines.push(` ${ccy.padEnd(6)} ${display.padEnd(20)} ${label}`);
|
|
25
|
+
}
|
|
26
|
+
(0, output_js_1.pretty)(lines);
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
(0, output_js_1.ok)({ wallets });
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
catch (e) {
|
|
33
|
+
(0, output_js_1.fail)(e?.message ?? "Failed to fetch balance", "BALANCE_ERROR");
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=balance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"balance.js","sourceRoot":"","sources":["../../src/commands/balance.ts"],"names":[],"mappings":";;AAIA,0CA6BC;AAhCD,4CAAyC;AACzC,4CAA0D;AAE1D,SAAgB,eAAe,CAAC,OAAgB;IAC9C,OAAO;SACJ,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,+BAA+B,CAAC;SAC5C,MAAM,CAAC,UAAU,EAAE,uBAAuB,CAAC;SAC3C,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAA,qBAAS,GAAE,CAAC;YAC3B,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YAC/C,IAAI,IAAA,oBAAQ,EAAC,IAAI,CAAC,EAAE,CAAC;gBACnB,MAAM,KAAK,GAAG,CAAC,WAAW,CAAC,CAAC;gBAC5B,KAAK,MAAM,CAAC,IAAI,OAAgB,EAAE,CAAC;oBACjC,MAAM,GAAG,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,QAAQ,IAAI,GAAG,CAAC;oBACvC,MAAM,GAAG,GAAG,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC;oBACvC,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;oBACtC,MAAM,OAAO,GACX,GAAG,KAAK,KAAK;wBACX,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,cAAc,EAAE,OAAO;wBAC9C,CAAC,CAAC,GAAG,GAAG,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC;oBAC/C,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC;gBAClE,CAAC;gBACD,IAAA,kBAAM,EAAC,KAAK,CAAC,CAAC;YAChB,CAAC;iBAAM,CAAC;gBACN,IAAA,cAAE,EAAC,EAAE,OAAO,EAAE,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,IAAA,gBAAI,EAAC,CAAC,EAAE,OAAO,IAAI,yBAAyB,EAAE,eAAe,CAAC,CAAC;QACjE,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAuCpC,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA8GrD"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerConfig = registerConfig;
|
|
4
|
+
const fs_1 = require("fs");
|
|
5
|
+
const os_1 = require("os");
|
|
6
|
+
const path_1 = require("path");
|
|
7
|
+
const output_js_1 = require("../output.js");
|
|
8
|
+
const neutron_sdk_1 = require("neutron-sdk");
|
|
9
|
+
const CONFIG_DIR = (0, path_1.join)((0, os_1.homedir)(), ".neutron");
|
|
10
|
+
const CONFIG_PATH = (0, path_1.join)(CONFIG_DIR, "config.json");
|
|
11
|
+
function maskSecret(secret) {
|
|
12
|
+
if (secret.length <= 8)
|
|
13
|
+
return "****";
|
|
14
|
+
return secret.slice(0, 4) + "****" + secret.slice(-4);
|
|
15
|
+
}
|
|
16
|
+
function loadConfigFile() {
|
|
17
|
+
try {
|
|
18
|
+
if (!(0, fs_1.existsSync)(CONFIG_PATH))
|
|
19
|
+
return null;
|
|
20
|
+
const raw = (0, fs_1.readFileSync)(CONFIG_PATH, "utf8");
|
|
21
|
+
const cfg = JSON.parse(raw);
|
|
22
|
+
if (cfg.apiKey && cfg.apiSecret)
|
|
23
|
+
return cfg;
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
function saveConfigFile(cfg) {
|
|
31
|
+
if (!(0, fs_1.existsSync)(CONFIG_DIR)) {
|
|
32
|
+
(0, fs_1.mkdirSync)(CONFIG_DIR, { recursive: true });
|
|
33
|
+
}
|
|
34
|
+
(0, fs_1.writeFileSync)(CONFIG_PATH, JSON.stringify(cfg, null, 2), "utf8");
|
|
35
|
+
}
|
|
36
|
+
function registerConfig(program) {
|
|
37
|
+
const config = program.command("config").description("Manage CLI configuration");
|
|
38
|
+
config
|
|
39
|
+
.command("init")
|
|
40
|
+
.description("Initialize config from env vars or interactive input")
|
|
41
|
+
.option("--api-key <key>", "API key (or set NEUTRON_API_KEY env)")
|
|
42
|
+
.option("--api-secret <secret>", "API secret (or set NEUTRON_API_SECRET env)")
|
|
43
|
+
.option("--pretty", "Human-readable output")
|
|
44
|
+
.action(async (opts) => {
|
|
45
|
+
try {
|
|
46
|
+
const apiKey = opts.apiKey ?? process.env.NEUTRON_API_KEY;
|
|
47
|
+
const apiSecret = opts.apiSecret ?? process.env.NEUTRON_API_SECRET;
|
|
48
|
+
if (!apiKey || !apiSecret) {
|
|
49
|
+
(0, output_js_1.fail)("Missing credentials. Provide --api-key and --api-secret, or set NEUTRON_API_KEY and NEUTRON_API_SECRET env vars.", "CONFIG_MISSING");
|
|
50
|
+
}
|
|
51
|
+
saveConfigFile({ apiKey, apiSecret });
|
|
52
|
+
if ((0, output_js_1.isPretty)(opts)) {
|
|
53
|
+
(0, output_js_1.pretty)([
|
|
54
|
+
"✅ Config initialized",
|
|
55
|
+
` Path: ${CONFIG_PATH}`,
|
|
56
|
+
` API Key: ${maskSecret(apiKey)}`,
|
|
57
|
+
` API Secret: ${maskSecret(apiSecret)}`,
|
|
58
|
+
]);
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
(0, output_js_1.ok)({ path: CONFIG_PATH, apiKey: maskSecret(apiKey) });
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
catch (e) {
|
|
65
|
+
(0, output_js_1.fail)(e?.message ?? "Failed to init config", "CONFIG_INIT_ERROR");
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
config
|
|
69
|
+
.command("show")
|
|
70
|
+
.description("Show current config (masked)")
|
|
71
|
+
.option("--pretty", "Human-readable output")
|
|
72
|
+
.action(async (opts) => {
|
|
73
|
+
try {
|
|
74
|
+
const cfg = loadConfigFile();
|
|
75
|
+
const envKey = process.env.NEUTRON_API_KEY;
|
|
76
|
+
const envSecret = process.env.NEUTRON_API_SECRET;
|
|
77
|
+
const source = envKey && envSecret ? "env" : cfg ? "file" : "none";
|
|
78
|
+
if (source === "none") {
|
|
79
|
+
(0, output_js_1.fail)("No config found. Run `neutron-cli config init` first.", "CONFIG_NOT_FOUND");
|
|
80
|
+
}
|
|
81
|
+
const displayKey = envKey ?? cfg?.apiKey ?? "";
|
|
82
|
+
const displaySecret = envSecret ?? cfg?.apiSecret ?? "";
|
|
83
|
+
if ((0, output_js_1.isPretty)(opts)) {
|
|
84
|
+
(0, output_js_1.pretty)([
|
|
85
|
+
"✅ Current Config",
|
|
86
|
+
` Source: ${source === "env" ? "Environment variables" : `~/.neutron/config.json`}`,
|
|
87
|
+
` API Key: ${maskSecret(displayKey)}`,
|
|
88
|
+
` API Secret: ${maskSecret(displaySecret)}`,
|
|
89
|
+
]);
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
(0, output_js_1.ok)({
|
|
93
|
+
source,
|
|
94
|
+
apiKey: maskSecret(displayKey),
|
|
95
|
+
configPath: source === "file" ? CONFIG_PATH : null,
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
catch (e) {
|
|
100
|
+
(0, output_js_1.fail)(e?.message ?? "Failed to show config", "CONFIG_SHOW_ERROR");
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
config
|
|
104
|
+
.command("test")
|
|
105
|
+
.description("Test credentials by calling auth endpoint")
|
|
106
|
+
.option("--pretty", "Human-readable output")
|
|
107
|
+
.action(async (opts) => {
|
|
108
|
+
try {
|
|
109
|
+
const envKey = process.env.NEUTRON_API_KEY;
|
|
110
|
+
const envSecret = process.env.NEUTRON_API_SECRET;
|
|
111
|
+
const cfg = loadConfigFile();
|
|
112
|
+
const apiKey = envKey ?? cfg?.apiKey;
|
|
113
|
+
const apiSecret = envSecret ?? cfg?.apiSecret;
|
|
114
|
+
if (!apiKey || !apiSecret) {
|
|
115
|
+
(0, output_js_1.fail)("No credentials found. Run `neutron-cli config init` first.", "CONFIG_NOT_FOUND");
|
|
116
|
+
}
|
|
117
|
+
const client = new neutron_sdk_1.Neutron({ apiKey, apiSecret });
|
|
118
|
+
const account = await client.account.get();
|
|
119
|
+
if ((0, output_js_1.isPretty)(opts)) {
|
|
120
|
+
(0, output_js_1.pretty)([
|
|
121
|
+
"✅ Credentials valid",
|
|
122
|
+
` Account ID: ${account.accountId ?? account.id ?? "—"}`,
|
|
123
|
+
` Name: ${account.displayName ?? account.name ?? "—"}`,
|
|
124
|
+
` Status: ${account.status ?? "—"}`,
|
|
125
|
+
]);
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
(0, output_js_1.ok)({ valid: true, accountId: account.accountId ?? account.id });
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
catch (e) {
|
|
132
|
+
(0, output_js_1.fail)(e?.message ?? "Credential test failed", "CONFIG_TEST_ERROR");
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invoice.d.ts","sourceRoot":"","sources":["../../src/commands/invoice.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA+BtD"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerInvoice = registerInvoice;
|
|
4
|
+
const client_js_1 = require("../client.js");
|
|
5
|
+
const output_js_1 = require("../output.js");
|
|
6
|
+
function registerInvoice(program) {
|
|
7
|
+
program
|
|
8
|
+
.command("invoice")
|
|
9
|
+
.description("Create a Lightning invoice")
|
|
10
|
+
.requiredOption("--amount <sats>", "Amount in satoshis")
|
|
11
|
+
.option("--memo <text>", "Payment memo/description")
|
|
12
|
+
.option("--currency <currency>", "Currency (btc, usd, etc)", "btc")
|
|
13
|
+
.option("--pretty", "Human-readable output")
|
|
14
|
+
.action(async (opts) => {
|
|
15
|
+
try {
|
|
16
|
+
const client = (0, client_js_1.getClient)();
|
|
17
|
+
const result = await client.lightning.createInvoice({
|
|
18
|
+
amountSats: Number(opts.amount),
|
|
19
|
+
memo: opts.memo ?? "",
|
|
20
|
+
});
|
|
21
|
+
if ((0, output_js_1.isPretty)(opts)) {
|
|
22
|
+
(0, output_js_1.pretty)([
|
|
23
|
+
"✅ Invoice Created",
|
|
24
|
+
` ID: ${result.txnId ?? result.id ?? "—"}`,
|
|
25
|
+
` Amount: ${Number(opts.amount).toLocaleString()} sats`,
|
|
26
|
+
` Invoice: ${(result.paymentRequest ?? result.invoice ?? "—").slice(0, 60)}...`,
|
|
27
|
+
` Expires: ${result.expiresAt ?? result.expires_at ?? "—"}`,
|
|
28
|
+
]);
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
(0, output_js_1.ok)(result);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
catch (e) {
|
|
35
|
+
(0, output_js_1.fail)(e?.message ?? "Failed to create invoice", "INVOICE_ERROR");
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=invoice.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invoice.js","sourceRoot":"","sources":["../../src/commands/invoice.ts"],"names":[],"mappings":";;AAIA,0CA+BC;AAlCD,4CAAyC;AACzC,4CAA0D;AAE1D,SAAgB,eAAe,CAAC,OAAgB;IAC9C,OAAO;SACJ,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,4BAA4B,CAAC;SACzC,cAAc,CAAC,iBAAiB,EAAE,oBAAoB,CAAC;SACvD,MAAM,CAAC,eAAe,EAAE,0BAA0B,CAAC;SACnD,MAAM,CAAC,uBAAuB,EAAE,0BAA0B,EAAE,KAAK,CAAC;SAClE,MAAM,CAAC,UAAU,EAAE,uBAAuB,CAAC;SAC3C,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAA,qBAAS,GAAE,CAAC;YAC3B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,aAAa,CAAC;gBAClD,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;gBAC/B,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,EAAE;aACtB,CAAQ,CAAC;YAEV,IAAI,IAAA,oBAAQ,EAAC,IAAI,CAAC,EAAE,CAAC;gBACnB,IAAA,kBAAM,EAAC;oBACL,mBAAmB;oBACnB,iBAAiB,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,EAAE,IAAI,GAAG,EAAE;oBACnD,iBAAiB,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,cAAc,EAAE,OAAO;oBAC5D,iBAAiB,CAAC,MAAM,CAAC,cAAc,IAAI,MAAM,CAAC,OAAO,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK;oBACnF,iBAAiB,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,UAAU,IAAI,GAAG,EAAE;iBAChE,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,IAAA,cAAE,EAAC,MAAM,CAAC,CAAC;YACb,CAAC;QACH,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,IAAA,gBAAI,EAAC,CAAC,EAAE,OAAO,IAAI,0BAA0B,EAAE,eAAe,CAAC,CAAC;QAClE,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate.d.ts","sourceRoot":"","sources":["../../src/commands/rate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA0BnD"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerRate = registerRate;
|
|
4
|
+
const client_js_1 = require("../client.js");
|
|
5
|
+
const output_js_1 = require("../output.js");
|
|
6
|
+
function registerRate(program) {
|
|
7
|
+
program
|
|
8
|
+
.command("rate")
|
|
9
|
+
.description("Get BTC exchange rate")
|
|
10
|
+
.option("--currency <currency>", "Fiat currency code (usd, thb, sgd, etc)", "usd")
|
|
11
|
+
.option("--pretty", "Human-readable output")
|
|
12
|
+
.action(async (opts) => {
|
|
13
|
+
try {
|
|
14
|
+
const client = (0, client_js_1.getClient)();
|
|
15
|
+
const result = await client.rates.get();
|
|
16
|
+
const pair = `BTC${opts.currency.toUpperCase()}`;
|
|
17
|
+
const rate = result[pair] ?? result[pair.toLowerCase()] ?? null;
|
|
18
|
+
if ((0, output_js_1.isPretty)(opts)) {
|
|
19
|
+
(0, output_js_1.pretty)([
|
|
20
|
+
`✅ BTC/${opts.currency.toUpperCase()} Rate`,
|
|
21
|
+
rate != null
|
|
22
|
+
? ` Rate: ${Number(rate).toLocaleString()} ${opts.currency.toUpperCase()} per BTC`
|
|
23
|
+
: ` Available pairs: ${Object.keys(result).join(", ")}`,
|
|
24
|
+
]);
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
(0, output_js_1.ok)({ pair, rate, all: result });
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
catch (e) {
|
|
31
|
+
(0, output_js_1.fail)(e?.message ?? "Failed to get rate", "RATE_ERROR");
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=rate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate.js","sourceRoot":"","sources":["../../src/commands/rate.ts"],"names":[],"mappings":";;AAIA,oCA0BC;AA7BD,4CAAyC;AACzC,4CAA0D;AAE1D,SAAgB,YAAY,CAAC,OAAgB;IAC3C,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,uBAAuB,CAAC;SACpC,MAAM,CAAC,uBAAuB,EAAE,yCAAyC,EAAE,KAAK,CAAC;SACjF,MAAM,CAAC,UAAU,EAAE,uBAAuB,CAAC;SAC3C,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAA,qBAAS,GAAE,CAAC;YAC3B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,GAAG,EAAS,CAAC;YAC/C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC;YACjD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,IAAI,CAAC;YAChE,IAAI,IAAA,oBAAQ,EAAC,IAAI,CAAC,EAAE,CAAC;gBACnB,IAAA,kBAAM,EAAC;oBACL,SAAS,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,OAAO;oBAC3C,IAAI,IAAI,IAAI;wBACV,CAAC,CAAC,WAAW,MAAM,CAAC,IAAI,CAAC,CAAC,cAAc,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,UAAU;wBACnF,CAAC,CAAC,sBAAsB,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;iBAC3D,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,IAAA,cAAE,EAAC,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,IAAA,gBAAI,EAAC,CAAC,EAAE,OAAO,IAAI,oBAAoB,EAAE,YAAY,CAAC,CAAC;QACzD,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"send.d.ts","sourceRoot":"","sources":["../../src/commands/send.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAgCnD"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerSend = registerSend;
|
|
4
|
+
const client_js_1 = require("../client.js");
|
|
5
|
+
const output_js_1 = require("../output.js");
|
|
6
|
+
function registerSend(program) {
|
|
7
|
+
program
|
|
8
|
+
.command("send")
|
|
9
|
+
.description("Send a Lightning payment")
|
|
10
|
+
.requiredOption("--to <invoice>", "Lightning invoice (BOLT11)")
|
|
11
|
+
.requiredOption("--amount <sats>", "Amount in satoshis")
|
|
12
|
+
.option("--currency <currency>", "Source wallet currency (btc)", "btc")
|
|
13
|
+
.option("--pretty", "Human-readable output")
|
|
14
|
+
.action(async (opts) => {
|
|
15
|
+
try {
|
|
16
|
+
const client = (0, client_js_1.getClient)();
|
|
17
|
+
const txn = await client.transactions.create({
|
|
18
|
+
sourceReq: { ccy: opts.currency.toUpperCase(), method: "lightning", amtRequested: Number(opts.amount) },
|
|
19
|
+
destReq: { ccy: "BTC", method: "lightning", reqDetails: { paymentRequest: opts.to } },
|
|
20
|
+
});
|
|
21
|
+
const confirmed = await client.transactions.confirm(txn.txnId ?? txn.id);
|
|
22
|
+
if ((0, output_js_1.isPretty)(opts)) {
|
|
23
|
+
(0, output_js_1.pretty)([
|
|
24
|
+
"✅ Payment Sent",
|
|
25
|
+
` ID: ${confirmed.txnId ?? confirmed.id ?? "—"}`,
|
|
26
|
+
` Amount: ${Number(opts.amount).toLocaleString()} sats`,
|
|
27
|
+
` Status: ${confirmed.txnState ?? confirmed.status ?? "—"}`,
|
|
28
|
+
]);
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
(0, output_js_1.ok)(confirmed);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
catch (e) {
|
|
35
|
+
(0, output_js_1.fail)(e?.message ?? "Payment failed", "SEND_ERROR");
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=send.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"send.js","sourceRoot":"","sources":["../../src/commands/send.ts"],"names":[],"mappings":";;AAIA,oCAgCC;AAnCD,4CAAyC;AACzC,4CAA0D;AAE1D,SAAgB,YAAY,CAAC,OAAgB;IAC3C,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,0BAA0B,CAAC;SACvC,cAAc,CAAC,gBAAgB,EAAE,4BAA4B,CAAC;SAC9D,cAAc,CAAC,iBAAiB,EAAE,oBAAoB,CAAC;SACvD,MAAM,CAAC,uBAAuB,EAAE,8BAA8B,EAAE,KAAK,CAAC;SACtE,MAAM,CAAC,UAAU,EAAE,uBAAuB,CAAC;SAC3C,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAA,qBAAS,GAAE,CAAC;YAC3B,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC;gBAC3C,SAAS,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;gBACvG,OAAO,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,EAAE,cAAc,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE;aACtF,CAAQ,CAAC;YAEV,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,EAAE,CAAQ,CAAC;YAEhF,IAAI,IAAA,oBAAQ,EAAC,IAAI,CAAC,EAAE,CAAC;gBACnB,IAAA,kBAAM,EAAC;oBACL,gBAAgB;oBAChB,cAAc,SAAS,CAAC,KAAK,IAAI,SAAS,CAAC,EAAE,IAAI,GAAG,EAAE;oBACtD,cAAc,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,cAAc,EAAE,OAAO;oBACzD,cAAc,SAAS,CAAC,QAAQ,IAAI,SAAS,CAAC,MAAM,IAAI,GAAG,EAAE;iBAC9D,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,IAAA,cAAE,EAAC,SAAS,CAAC,CAAC;YAChB,CAAC;QACH,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,IAAA,gBAAI,EAAC,CAAC,EAAE,OAAO,IAAI,gBAAgB,EAAE,YAAY,CAAC,CAAC;QACrD,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tx.d.ts","sourceRoot":"","sources":["../../src/commands/tx.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAwDjD"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerTx = registerTx;
|
|
4
|
+
const client_js_1 = require("../client.js");
|
|
5
|
+
const output_js_1 = require("../output.js");
|
|
6
|
+
function registerTx(program) {
|
|
7
|
+
const tx = program.command("tx").description("Transaction commands");
|
|
8
|
+
tx.command("get <id>")
|
|
9
|
+
.description("Get a transaction by ID")
|
|
10
|
+
.option("--pretty", "Human-readable output")
|
|
11
|
+
.action(async (id, opts) => {
|
|
12
|
+
try {
|
|
13
|
+
const client = (0, client_js_1.getClient)();
|
|
14
|
+
const result = await client.transactions.get(id);
|
|
15
|
+
if ((0, output_js_1.isPretty)(opts)) {
|
|
16
|
+
(0, output_js_1.pretty)([
|
|
17
|
+
`✅ Transaction ${id}`,
|
|
18
|
+
` Status: ${result.txnState ?? result.status ?? "—"}`,
|
|
19
|
+
` Amount: ${result.amount?.toLocaleString() ?? "—"} sats`,
|
|
20
|
+
` Type: ${result.type ?? "—"}`,
|
|
21
|
+
` Created: ${result.createdAt ?? result.created_at ?? "—"}`,
|
|
22
|
+
]);
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
(0, output_js_1.ok)(result);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
catch (e) {
|
|
29
|
+
(0, output_js_1.fail)(e?.message ?? "Failed to get transaction", "TX_GET_ERROR");
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
tx.command("list")
|
|
33
|
+
.description("List recent transactions")
|
|
34
|
+
.option("--limit <n>", "Number of results", "10")
|
|
35
|
+
.option("--from <date>", "From date (YYYY-MM-DD)")
|
|
36
|
+
.option("--to <date>", "To date (YYYY-MM-DD)")
|
|
37
|
+
.option("--pretty", "Human-readable output")
|
|
38
|
+
.action(async (opts) => {
|
|
39
|
+
try {
|
|
40
|
+
const client = (0, client_js_1.getClient)();
|
|
41
|
+
const params = { limit: Number(opts.limit) };
|
|
42
|
+
if (opts.from)
|
|
43
|
+
params.fromDate = opts.from;
|
|
44
|
+
if (opts.to)
|
|
45
|
+
params.toDate = opts.to;
|
|
46
|
+
const result = await client.transactions.list(params);
|
|
47
|
+
const txns = result.data ?? result.transactions ?? result ?? [];
|
|
48
|
+
if ((0, output_js_1.isPretty)(opts)) {
|
|
49
|
+
const lines = [`✅ Transactions (${txns.length})`];
|
|
50
|
+
for (const t of txns) {
|
|
51
|
+
const id = (t.txnId ?? t.id ?? "—").slice(0, 20);
|
|
52
|
+
const state = (t.txnState ?? t.status ?? "—").padEnd(12);
|
|
53
|
+
const amt = `${(t.amount ?? 0).toLocaleString()} sats`.padEnd(16);
|
|
54
|
+
lines.push(` ${id} ${state} ${amt} ${t.createdAt ?? ""}`);
|
|
55
|
+
}
|
|
56
|
+
(0, output_js_1.pretty)(lines);
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
(0, output_js_1.ok)({ transactions: txns });
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
catch (e) {
|
|
63
|
+
(0, output_js_1.fail)(e?.message ?? "Failed to list transactions", "TX_LIST_ERROR");
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=tx.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tx.js","sourceRoot":"","sources":["../../src/commands/tx.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook.d.ts","sourceRoot":"","sources":["../../src/commands/webhook.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAoEtD"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerWebhook = registerWebhook;
|
|
4
|
+
const client_js_1 = require("../client.js");
|
|
5
|
+
const output_js_1 = require("../output.js");
|
|
6
|
+
function registerWebhook(program) {
|
|
7
|
+
const wh = program.command("webhook").description("Webhook management");
|
|
8
|
+
wh.command("create")
|
|
9
|
+
.description("Create a webhook")
|
|
10
|
+
.requiredOption("--url <url>", "Webhook endpoint URL")
|
|
11
|
+
.option("--events <events>", "Comma-separated event types (default: all)", "")
|
|
12
|
+
.option("--pretty", "Human-readable output")
|
|
13
|
+
.action(async (opts) => {
|
|
14
|
+
try {
|
|
15
|
+
const client = (0, client_js_1.getClient)();
|
|
16
|
+
const result = await client.webhooks.create({
|
|
17
|
+
callback: opts.url,
|
|
18
|
+
secret: process.env.NEUTRON_WEBHOOK_SECRET ?? crypto.randomUUID(),
|
|
19
|
+
});
|
|
20
|
+
if ((0, output_js_1.isPretty)(opts)) {
|
|
21
|
+
(0, output_js_1.pretty)([
|
|
22
|
+
"✅ Webhook Created",
|
|
23
|
+
` ID: ${result.webhookId ?? result.id ?? "—"}`,
|
|
24
|
+
` URL: ${opts.url}`,
|
|
25
|
+
` Secret: ${result.secret ?? "(none)"}`,
|
|
26
|
+
]);
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
(0, output_js_1.ok)(result);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
catch (e) {
|
|
33
|
+
(0, output_js_1.fail)(e?.message ?? "Failed to create webhook", "WEBHOOK_CREATE_ERROR");
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
wh.command("list")
|
|
37
|
+
.description("List all webhooks")
|
|
38
|
+
.option("--pretty", "Human-readable output")
|
|
39
|
+
.action(async (opts) => {
|
|
40
|
+
try {
|
|
41
|
+
const client = (0, client_js_1.getClient)();
|
|
42
|
+
const result = await client.webhooks.list();
|
|
43
|
+
const hooks = result.data ?? result.webhooks ?? result ?? [];
|
|
44
|
+
if ((0, output_js_1.isPretty)(opts)) {
|
|
45
|
+
const lines = [`✅ Webhooks (${hooks.length})`];
|
|
46
|
+
for (const h of hooks) {
|
|
47
|
+
lines.push(` ${(h.webhookId ?? h.id ?? "—").padEnd(24)} ${h.url ?? "—"}`);
|
|
48
|
+
}
|
|
49
|
+
(0, output_js_1.pretty)(lines);
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
(0, output_js_1.ok)({ webhooks: hooks });
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
catch (e) {
|
|
56
|
+
(0, output_js_1.fail)(e?.message ?? "Failed to list webhooks", "WEBHOOK_LIST_ERROR");
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
wh.command("delete <id>")
|
|
60
|
+
.description("Delete a webhook by ID")
|
|
61
|
+
.option("--pretty", "Human-readable output")
|
|
62
|
+
.action(async (id, opts) => {
|
|
63
|
+
try {
|
|
64
|
+
const client = (0, client_js_1.getClient)();
|
|
65
|
+
await client.webhooks.delete(id);
|
|
66
|
+
if ((0, output_js_1.isPretty)(opts)) {
|
|
67
|
+
(0, output_js_1.pretty)([`✅ Webhook ${id} deleted`]);
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
(0, output_js_1.ok)({ deleted: id });
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
catch (e) {
|
|
74
|
+
(0, output_js_1.fail)(e?.message ?? "Failed to delete webhook", "WEBHOOK_DELETE_ERROR");
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=webhook.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook.js","sourceRoot":"","sources":["../../src/commands/webhook.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
const commander_1 = require("commander");
|
|
5
|
+
const auth_js_1 = require("./commands/auth.js");
|
|
6
|
+
const balance_js_1 = require("./commands/balance.js");
|
|
7
|
+
const invoice_js_1 = require("./commands/invoice.js");
|
|
8
|
+
const send_js_1 = require("./commands/send.js");
|
|
9
|
+
const tx_js_1 = require("./commands/tx.js");
|
|
10
|
+
const rate_js_1 = require("./commands/rate.js");
|
|
11
|
+
const webhook_js_1 = require("./commands/webhook.js");
|
|
12
|
+
const config_js_1 = require("./commands/config.js");
|
|
13
|
+
const program = new commander_1.Command();
|
|
14
|
+
program
|
|
15
|
+
.name("neutron-cli")
|
|
16
|
+
.description("CLI for Neutron Lightning wallet — for developers and AI agents")
|
|
17
|
+
.version("0.1.0")
|
|
18
|
+
.option("--json", "Output as JSON (default; explicit flag for agent use)")
|
|
19
|
+
.option("--pretty", "Output as human-readable text");
|
|
20
|
+
(0, config_js_1.registerConfig)(program);
|
|
21
|
+
(0, auth_js_1.registerAuth)(program);
|
|
22
|
+
(0, balance_js_1.registerBalance)(program);
|
|
23
|
+
(0, invoice_js_1.registerInvoice)(program);
|
|
24
|
+
(0, send_js_1.registerSend)(program);
|
|
25
|
+
(0, tx_js_1.registerTx)(program);
|
|
26
|
+
(0, rate_js_1.registerRate)(program);
|
|
27
|
+
(0, webhook_js_1.registerWebhook)(program);
|
|
28
|
+
program.parseAsync(process.argv).catch((e) => {
|
|
29
|
+
process.stderr.write(JSON.stringify({ error: e?.message ?? "Unknown error", code: "FATAL" }) + "\n");
|
|
30
|
+
process.exit(1);
|
|
31
|
+
});
|
|
32
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AACA,yCAAoC;AACpC,gDAAkD;AAClD,sDAAwD;AACxD,sDAAwD;AACxD,gDAAkD;AAClD,4CAA8C;AAC9C,gDAAkD;AAClD,sDAAwD;AACxD,oDAAsD;AAEtD,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,aAAa,CAAC;KACnB,WAAW,CAAC,iEAAiE,CAAC;KAC9E,OAAO,CAAC,OAAO,CAAC;KAChB,MAAM,CAAC,QAAQ,EAAE,uDAAuD,CAAC;KACzE,MAAM,CAAC,UAAU,EAAE,+BAA+B,CAAC,CAAC;AAEvD,IAAA,0BAAc,EAAC,OAAO,CAAC,CAAC;AACxB,IAAA,sBAAY,EAAC,OAAO,CAAC,CAAC;AACtB,IAAA,4BAAe,EAAC,OAAO,CAAC,CAAC;AACzB,IAAA,4BAAe,EAAC,OAAO,CAAC,CAAC;AACzB,IAAA,sBAAY,EAAC,OAAO,CAAC,CAAC;AACtB,IAAA,kBAAU,EAAC,OAAO,CAAC,CAAC;AACpB,IAAA,sBAAY,EAAC,OAAO,CAAC,CAAC;AACtB,IAAA,4BAAe,EAAC,OAAO,CAAC,CAAC;AAEzB,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;IAC3C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,IAAI,eAAe,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;IACrG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/dist/output.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/** Output helpers — JSON (default) or pretty human-readable */
|
|
2
|
+
export declare function ok(data: unknown): void;
|
|
3
|
+
export declare function fail(message: string, code?: string, exitCode?: number): never;
|
|
4
|
+
export declare function isPretty(opts: {
|
|
5
|
+
pretty?: boolean;
|
|
6
|
+
}): boolean;
|
|
7
|
+
export declare function pretty(lines: string[]): void;
|
|
8
|
+
//# sourceMappingURL=output.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAE/D,wBAAgB,EAAE,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAEtC;AAED,wBAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,SAAU,EAAE,QAAQ,SAAI,GAAG,KAAK,CAGzE;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAE5D;AAED,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAE5C"}
|
package/dist/output.js
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/** Output helpers — JSON (default) or pretty human-readable */
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.ok = ok;
|
|
5
|
+
exports.fail = fail;
|
|
6
|
+
exports.isPretty = isPretty;
|
|
7
|
+
exports.pretty = pretty;
|
|
8
|
+
function ok(data) {
|
|
9
|
+
process.stdout.write(JSON.stringify({ ok: true, data }) + "\n");
|
|
10
|
+
}
|
|
11
|
+
function fail(message, code = "ERROR", exitCode = 1) {
|
|
12
|
+
process.stderr.write(JSON.stringify({ error: message, code }) + "\n");
|
|
13
|
+
process.exit(exitCode);
|
|
14
|
+
}
|
|
15
|
+
function isPretty(opts) {
|
|
16
|
+
return !!opts.pretty;
|
|
17
|
+
}
|
|
18
|
+
function pretty(lines) {
|
|
19
|
+
console.log(lines.join("\n"));
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":";AAAA,+DAA+D;;AAE/D,gBAEC;AAED,oBAGC;AAED,4BAEC;AAED,wBAEC;AAfD,SAAgB,EAAE,CAAC,IAAa;IAC9B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;AAClE,CAAC;AAED,SAAgB,IAAI,CAAC,OAAe,EAAE,IAAI,GAAG,OAAO,EAAE,QAAQ,GAAG,CAAC;IAChE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;IACtE,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AACzB,CAAC;AAED,SAAgB,QAAQ,CAAC,IAA0B;IACjD,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;AACvB,CAAC;AAED,SAAgB,MAAM,CAAC,KAAe;IACpC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAChC,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "neutron-cli",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "CLI for Neutron Lightning wallet services — for developers and AI agents",
|
|
5
|
+
"keywords": ["neutron", "lightning", "bitcoin", "cli", "payments"],
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"bin": {
|
|
8
|
+
"neutron-cli": "./dist/index.js"
|
|
9
|
+
},
|
|
10
|
+
"main": "./dist/index.js",
|
|
11
|
+
"files": ["dist/", "README.md"],
|
|
12
|
+
"scripts": {
|
|
13
|
+
"build": "tsc",
|
|
14
|
+
"dev": "tsc --watch"
|
|
15
|
+
},
|
|
16
|
+
"dependencies": {
|
|
17
|
+
"commander": "^12.0.0",
|
|
18
|
+
"neutron-sdk": "file:../neutron-sdk"
|
|
19
|
+
},
|
|
20
|
+
"devDependencies": {
|
|
21
|
+
"typescript": "^5.4.0",
|
|
22
|
+
"@types/node": "^20.0.0"
|
|
23
|
+
},
|
|
24
|
+
"engines": {
|
|
25
|
+
"node": ">=18"
|
|
26
|
+
},
|
|
27
|
+
"homepage": "https://docs.neutron.me",
|
|
28
|
+
"repository": {
|
|
29
|
+
"type": "git",
|
|
30
|
+
"url": "https://github.com/Neutronpay/neutron-cli"
|
|
31
|
+
}
|
|
32
|
+
}
|