@firela/billclaw-cli 0.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/LICENSE +21 -0
- package/README.md +204 -0
- package/bin/billclaw.js +10 -0
- package/dist/commands/config.d.ts +11 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +112 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/export.d.ts +11 -0
- package/dist/commands/export.d.ts.map +1 -0
- package/dist/commands/export.js +106 -0
- package/dist/commands/export.js.map +1 -0
- package/dist/commands/index.d.ts +46 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +22 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/registry.d.ts +62 -0
- package/dist/commands/registry.d.ts.map +1 -0
- package/dist/commands/registry.js +77 -0
- package/dist/commands/registry.js.map +1 -0
- package/dist/commands/setup.d.ts +11 -0
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +214 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/commands/status.d.ts +11 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +187 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/sync.d.ts +11 -0
- package/dist/commands/sync.d.ts.map +1 -0
- package/dist/commands/sync.js +150 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +45 -0
- package/dist/index.js.map +1 -0
- package/dist/runtime/config.d.ts +32 -0
- package/dist/runtime/config.d.ts.map +1 -0
- package/dist/runtime/config.js +105 -0
- package/dist/runtime/config.js.map +1 -0
- package/dist/runtime/context.d.ts +33 -0
- package/dist/runtime/context.d.ts.map +1 -0
- package/dist/runtime/context.js +35 -0
- package/dist/runtime/context.js.map +1 -0
- package/dist/runtime/events.d.ts +24 -0
- package/dist/runtime/events.d.ts.map +1 -0
- package/dist/runtime/events.js +54 -0
- package/dist/runtime/events.js.map +1 -0
- package/dist/runtime/index.d.ts +10 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +10 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/logger.d.ts +41 -0
- package/dist/runtime/logger.d.ts.map +1 -0
- package/dist/runtime/logger.js +95 -0
- package/dist/runtime/logger.js.map +1 -0
- package/dist/utils/format.d.ts +62 -0
- package/dist/utils/format.d.ts.map +1 -0
- package/dist/utils/format.js +153 -0
- package/dist/utils/format.js.map +1 -0
- package/dist/utils/index.d.ts +6 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +6 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/progress.d.ts +38 -0
- package/dist/utils/progress.d.ts.map +1 -0
- package/dist/utils/progress.js +70 -0
- package/dist/utils/progress.js.map +1 -0
- package/package.json +72 -0
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI command framework
|
|
3
|
+
*
|
|
4
|
+
* Base command interface and utilities using Commander.js.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* CLI command registry
|
|
8
|
+
*/
|
|
9
|
+
export class CommandRegistry {
|
|
10
|
+
commands = new Map();
|
|
11
|
+
program;
|
|
12
|
+
constructor(program) {
|
|
13
|
+
this.program = program;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Register a command
|
|
17
|
+
*/
|
|
18
|
+
register(command) {
|
|
19
|
+
this.commands.set(command.name, command);
|
|
20
|
+
const cmd = this.program
|
|
21
|
+
.command(command.name)
|
|
22
|
+
.description(command.description);
|
|
23
|
+
if (command.aliases && command.aliases.length > 0) {
|
|
24
|
+
cmd.aliases(command.aliases);
|
|
25
|
+
}
|
|
26
|
+
if (command.arguments) {
|
|
27
|
+
cmd.arguments(command.arguments);
|
|
28
|
+
}
|
|
29
|
+
if (command.options) {
|
|
30
|
+
for (const opt of command.options) {
|
|
31
|
+
if (opt.default !== undefined) {
|
|
32
|
+
cmd.option(opt.flags, opt.description, opt.default);
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
cmd.option(opt.flags, opt.description);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
cmd.action(async (...args) => {
|
|
40
|
+
const { createRuntimeContext } = await import("../runtime/context.js");
|
|
41
|
+
const runtime = createRuntimeContext();
|
|
42
|
+
const context = {
|
|
43
|
+
runtime,
|
|
44
|
+
program: this.program,
|
|
45
|
+
};
|
|
46
|
+
try {
|
|
47
|
+
// Commander passes args and options as separate parameters
|
|
48
|
+
// The last parameter is always the options object
|
|
49
|
+
const options = (args.length > 0 ? args[args.length - 1] : {});
|
|
50
|
+
await command.handler(context, options);
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
runtime.logger.error("Command failed:", error);
|
|
54
|
+
process.exit(1);
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Get a registered command
|
|
60
|
+
*/
|
|
61
|
+
get(name) {
|
|
62
|
+
return this.commands.get(name);
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Get all registered commands
|
|
66
|
+
*/
|
|
67
|
+
getAll() {
|
|
68
|
+
return Array.from(this.commands.values());
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Check if a command exists
|
|
72
|
+
*/
|
|
73
|
+
has(name) {
|
|
74
|
+
return this.commands.has(name);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/commands/registry.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA2CH;;GAEG;AACH,MAAM,OAAO,eAAe;IAClB,QAAQ,GAAG,IAAI,GAAG,EAAsB,CAAA;IACxC,OAAO,CAAS;IAExB,YAAY,OAAgB;QAC1B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IACxB,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,OAAmB;QAC1B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;QAExC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO;aACrB,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;aACrB,WAAW,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;QAEnC,IAAI,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClD,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;QAC9B,CAAC;QAED,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;YACtB,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;QAClC,CAAC;QAED,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpB,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBAClC,IAAI,GAAG,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;oBAC9B,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,OAAO,CAAC,CAAA;gBACrD,CAAC;qBAAM,CAAC;oBACN,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,WAAW,CAAC,CAAA;gBACxC,CAAC;YACH,CAAC;QACH,CAAC;QAED,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,IAAe,EAAE,EAAE;YACtC,MAAM,EAAE,oBAAoB,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAA;YACtE,MAAM,OAAO,GAAG,oBAAoB,EAAE,CAAA;YAEtC,MAAM,OAAO,GAAe;gBAC1B,OAAO;gBACP,OAAO,EAAE,IAAI,CAAC,OAAO;aACtB,CAAA;YAED,IAAI,CAAC;gBACH,2DAA2D;gBAC3D,kDAAkD;gBAClD,MAAM,OAAO,GAAG,CACd,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAClB,CAAA;gBAC5B,MAAM,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;YACzC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAA;gBAC9C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACjB,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IAChC,CAAC;IAED;;OAEG;IACH,MAAM;QACJ,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAA;IAC3C,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IAChC,CAAC;CACF"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Setup command
|
|
3
|
+
*
|
|
4
|
+
* Interactive setup wizard for connecting accounts.
|
|
5
|
+
*/
|
|
6
|
+
import type { CliCommand } from "./registry.js";
|
|
7
|
+
/**
|
|
8
|
+
* Setup command definition
|
|
9
|
+
*/
|
|
10
|
+
export declare const setupCommand: CliCommand;
|
|
11
|
+
//# sourceMappingURL=setup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAc,MAAM,eAAe,CAAA;AAqS3D;;GAEG;AACH,eAAO,MAAM,YAAY,EAAE,UAK1B,CAAA"}
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Setup command
|
|
3
|
+
*
|
|
4
|
+
* Interactive setup wizard for connecting accounts.
|
|
5
|
+
*/
|
|
6
|
+
import inquirer from "inquirer";
|
|
7
|
+
import { success, error } from "../utils/format.js";
|
|
8
|
+
import { readAccountRegistry, writeAccountRegistry, getStorageDir, } from "@firela/billclaw-core";
|
|
9
|
+
import * as fs from "node:fs/promises";
|
|
10
|
+
import * as path from "node:path";
|
|
11
|
+
/**
|
|
12
|
+
* Run setup wizard
|
|
13
|
+
*/
|
|
14
|
+
async function runSetup(context) {
|
|
15
|
+
console.log("BillClaw Account Setup");
|
|
16
|
+
console.log("");
|
|
17
|
+
const { accountType } = await inquirer.prompt([
|
|
18
|
+
{
|
|
19
|
+
type: "list",
|
|
20
|
+
name: "accountType",
|
|
21
|
+
message: "What type of account would you like to add?",
|
|
22
|
+
choices: [
|
|
23
|
+
{ name: "Plaid (Bank accounts via Plaid Link)", value: "plaid" },
|
|
24
|
+
{ name: "Gmail (Email bills)", value: "gmail" },
|
|
25
|
+
{
|
|
26
|
+
name: "GoCardless (Bank accounts via open banking)",
|
|
27
|
+
value: "gocardless",
|
|
28
|
+
},
|
|
29
|
+
],
|
|
30
|
+
},
|
|
31
|
+
]);
|
|
32
|
+
try {
|
|
33
|
+
switch (accountType) {
|
|
34
|
+
case "plaid":
|
|
35
|
+
await setupPlaid(context);
|
|
36
|
+
break;
|
|
37
|
+
case "gmail":
|
|
38
|
+
await setupGmail(context);
|
|
39
|
+
break;
|
|
40
|
+
case "gocardless":
|
|
41
|
+
await setupGoCardless(context);
|
|
42
|
+
break;
|
|
43
|
+
}
|
|
44
|
+
success("Account added successfully!");
|
|
45
|
+
}
|
|
46
|
+
catch (err) {
|
|
47
|
+
error("Failed to add account: " + err.message);
|
|
48
|
+
throw err;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Setup Plaid account
|
|
53
|
+
*/
|
|
54
|
+
async function setupPlaid(context) {
|
|
55
|
+
const answers = await inquirer.prompt([
|
|
56
|
+
{
|
|
57
|
+
type: "input",
|
|
58
|
+
name: "clientId",
|
|
59
|
+
message: "Plaid Client ID:",
|
|
60
|
+
validate: (input) => input.length > 0 || "Client ID is required",
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
type: "password",
|
|
64
|
+
name: "secret",
|
|
65
|
+
message: "Plaid Secret:",
|
|
66
|
+
mask: "*",
|
|
67
|
+
validate: (input) => input.length > 0 || "Secret is required",
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
type: "list",
|
|
71
|
+
name: "environment",
|
|
72
|
+
message: "Plaid Environment:",
|
|
73
|
+
choices: [
|
|
74
|
+
{ name: "Sandbox (testing)", value: "sandbox" },
|
|
75
|
+
{ name: "Development (testing)", value: "development" },
|
|
76
|
+
{ name: "Production (live)", value: "production" },
|
|
77
|
+
],
|
|
78
|
+
default: "sandbox",
|
|
79
|
+
},
|
|
80
|
+
]);
|
|
81
|
+
const accountId = `plaid-${Date.now()}`;
|
|
82
|
+
// Get storage configuration
|
|
83
|
+
const storageConfig = await context.runtime.config.getStorageConfig();
|
|
84
|
+
// Read current account registry
|
|
85
|
+
const accounts = await readAccountRegistry(storageConfig);
|
|
86
|
+
// Add new account to registry
|
|
87
|
+
accounts.push({
|
|
88
|
+
id: accountId,
|
|
89
|
+
type: "plaid",
|
|
90
|
+
name: `Plaid Account ${accounts.length + 1}`,
|
|
91
|
+
createdAt: new Date().toISOString(),
|
|
92
|
+
});
|
|
93
|
+
await writeAccountRegistry(accounts, storageConfig);
|
|
94
|
+
// Store credentials to file
|
|
95
|
+
const accountPath = path.join(await getStorageDir(storageConfig), `accounts/${accountId}.json`);
|
|
96
|
+
await fs.mkdir(path.dirname(accountPath), { recursive: true });
|
|
97
|
+
await fs.writeFile(accountPath, JSON.stringify({
|
|
98
|
+
plaidAccessToken: null, // Will be populated by OAuth flow
|
|
99
|
+
clientId: answers.clientId,
|
|
100
|
+
secret: answers.secret,
|
|
101
|
+
environment: answers.environment,
|
|
102
|
+
}, null, 2));
|
|
103
|
+
context.runtime.logger.info("Plaid account configured:", accountId);
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Setup Gmail account
|
|
107
|
+
*/
|
|
108
|
+
async function setupGmail(context) {
|
|
109
|
+
const answers = await inquirer.prompt([
|
|
110
|
+
{
|
|
111
|
+
type: "input",
|
|
112
|
+
name: "credentialsPath",
|
|
113
|
+
message: "Path to Gmail credentials JSON:",
|
|
114
|
+
default: "~/.gmail-credentials.json",
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
type: "input",
|
|
118
|
+
name: "clientId",
|
|
119
|
+
message: "Gmail OAuth Client ID (optional):",
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
type: "password",
|
|
123
|
+
name: "clientSecret",
|
|
124
|
+
message: "Gmail OAuth Client Secret (optional):",
|
|
125
|
+
mask: "*",
|
|
126
|
+
},
|
|
127
|
+
]);
|
|
128
|
+
const accountId = `gmail-${Date.now()}`;
|
|
129
|
+
// Get storage configuration
|
|
130
|
+
const storageConfig = await context.runtime.config.getStorageConfig();
|
|
131
|
+
// Read current account registry
|
|
132
|
+
const accounts = await readAccountRegistry(storageConfig);
|
|
133
|
+
// Add new account to registry
|
|
134
|
+
accounts.push({
|
|
135
|
+
id: accountId,
|
|
136
|
+
type: "gmail",
|
|
137
|
+
name: `Gmail Account ${accounts.length + 1}`,
|
|
138
|
+
createdAt: new Date().toISOString(),
|
|
139
|
+
});
|
|
140
|
+
await writeAccountRegistry(accounts, storageConfig);
|
|
141
|
+
// Store credentials to file
|
|
142
|
+
const accountPath = path.join(await getStorageDir(storageConfig), `accounts/${accountId}.json`);
|
|
143
|
+
await fs.mkdir(path.dirname(accountPath), { recursive: true });
|
|
144
|
+
await fs.writeFile(accountPath, JSON.stringify({
|
|
145
|
+
gmailRefreshToken: null, // Will be populated by OAuth flow
|
|
146
|
+
credentialsPath: answers.credentialsPath,
|
|
147
|
+
clientId: answers.clientId || null,
|
|
148
|
+
clientSecret: answers.clientSecret || null,
|
|
149
|
+
}, null, 2));
|
|
150
|
+
context.runtime.logger.info("Gmail account configured:", accountId);
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Setup GoCardless account
|
|
154
|
+
*/
|
|
155
|
+
async function setupGoCardless(context) {
|
|
156
|
+
const answers = await inquirer.prompt([
|
|
157
|
+
{
|
|
158
|
+
type: "input",
|
|
159
|
+
name: "clientId",
|
|
160
|
+
message: "GoCardless Client ID:",
|
|
161
|
+
validate: (input) => input.length > 0 || "Client ID is required",
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
type: "password",
|
|
165
|
+
name: "secret",
|
|
166
|
+
message: "GoCardless Secret:",
|
|
167
|
+
mask: "*",
|
|
168
|
+
validate: (input) => input.length > 0 || "Secret is required",
|
|
169
|
+
},
|
|
170
|
+
{
|
|
171
|
+
type: "list",
|
|
172
|
+
name: "environment",
|
|
173
|
+
message: "GoCardless Environment:",
|
|
174
|
+
choices: [
|
|
175
|
+
{ name: "Sandbox (testing)", value: "sandbox" },
|
|
176
|
+
{ name: "Production (live)", value: "live" },
|
|
177
|
+
],
|
|
178
|
+
default: "sandbox",
|
|
179
|
+
},
|
|
180
|
+
]);
|
|
181
|
+
const accountId = `gocardless-${Date.now()}`;
|
|
182
|
+
// Get storage configuration
|
|
183
|
+
const storageConfig = await context.runtime.config.getStorageConfig();
|
|
184
|
+
// Read current account registry
|
|
185
|
+
const accounts = await readAccountRegistry(storageConfig);
|
|
186
|
+
// Add new account to registry
|
|
187
|
+
accounts.push({
|
|
188
|
+
id: accountId,
|
|
189
|
+
type: "gocardless",
|
|
190
|
+
name: `GoCardless Account ${accounts.length + 1}`,
|
|
191
|
+
createdAt: new Date().toISOString(),
|
|
192
|
+
});
|
|
193
|
+
await writeAccountRegistry(accounts, storageConfig);
|
|
194
|
+
// Store credentials to file
|
|
195
|
+
const accountPath = path.join(await getStorageDir(storageConfig), `accounts/${accountId}.json`);
|
|
196
|
+
await fs.mkdir(path.dirname(accountPath), { recursive: true });
|
|
197
|
+
await fs.writeFile(accountPath, JSON.stringify({
|
|
198
|
+
gocardlessAccessToken: null, // Will be populated by OAuth flow
|
|
199
|
+
clientId: answers.clientId,
|
|
200
|
+
secret: answers.secret,
|
|
201
|
+
environment: answers.environment,
|
|
202
|
+
}, null, 2));
|
|
203
|
+
context.runtime.logger.info("GoCardless account configured:", accountId);
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Setup command definition
|
|
207
|
+
*/
|
|
208
|
+
export const setupCommand = {
|
|
209
|
+
name: "setup",
|
|
210
|
+
description: "Interactive setup wizard for connecting accounts",
|
|
211
|
+
aliases: ["init"],
|
|
212
|
+
handler: runSetup,
|
|
213
|
+
};
|
|
214
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Status command
|
|
3
|
+
*
|
|
4
|
+
* Show connection status and recent sync results.
|
|
5
|
+
*/
|
|
6
|
+
import type { CliCommand } from "./registry.js";
|
|
7
|
+
/**
|
|
8
|
+
* Status command definition
|
|
9
|
+
*/
|
|
10
|
+
export declare const statusCommand: CliCommand;
|
|
11
|
+
//# sourceMappingURL=status.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAc,MAAM,eAAe,CAAA;AA8O3D;;GAEG;AACH,eAAO,MAAM,aAAa,EAAE,UAI3B,CAAA"}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Status command
|
|
3
|
+
*
|
|
4
|
+
* Show connection status and recent sync results.
|
|
5
|
+
*/
|
|
6
|
+
import { createTable, printTable, formatStatus, formatAccountType, formatDate, } from "../utils/format.js";
|
|
7
|
+
import { Billclaw, getStorageDir, } from "@firela/billclaw-core";
|
|
8
|
+
import * as fs from "node:fs/promises";
|
|
9
|
+
import * as path from "node:path";
|
|
10
|
+
/**
|
|
11
|
+
* Calculate storage statistics for an account
|
|
12
|
+
*/
|
|
13
|
+
async function getStorageStats(accountId, storagePath) {
|
|
14
|
+
const transactionsDir = path.join(storagePath, "transactions", accountId);
|
|
15
|
+
let totalTransactions = 0;
|
|
16
|
+
let firstTransaction = null;
|
|
17
|
+
let lastTransaction = null;
|
|
18
|
+
let totalSize = 0;
|
|
19
|
+
try {
|
|
20
|
+
const years = await fs.readdir(transactionsDir);
|
|
21
|
+
for (const year of years) {
|
|
22
|
+
const yearPath = path.join(transactionsDir, year);
|
|
23
|
+
const months = await fs.readdir(yearPath);
|
|
24
|
+
for (const month of months) {
|
|
25
|
+
const monthPath = path.join(yearPath, month);
|
|
26
|
+
const stats = await fs.stat(monthPath);
|
|
27
|
+
// Read and count transactions
|
|
28
|
+
const transactions = JSON.parse(await fs.readFile(monthPath, "utf-8"));
|
|
29
|
+
totalTransactions += transactions.length;
|
|
30
|
+
// Track dates
|
|
31
|
+
if (transactions.length > 0) {
|
|
32
|
+
const dates = transactions.map((t) => t.date).sort();
|
|
33
|
+
if (!firstTransaction || dates[0] < firstTransaction) {
|
|
34
|
+
firstTransaction = dates[0];
|
|
35
|
+
}
|
|
36
|
+
if (!lastTransaction || dates[dates.length - 1] > lastTransaction) {
|
|
37
|
+
lastTransaction = dates[dates.length - 1];
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
totalSize += stats.size;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
// Directory doesn't exist yet
|
|
46
|
+
}
|
|
47
|
+
return {
|
|
48
|
+
accountId,
|
|
49
|
+
totalTransactions,
|
|
50
|
+
storageSize: formatBytes(totalSize),
|
|
51
|
+
firstTransaction,
|
|
52
|
+
lastTransaction,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Format bytes to human-readable size
|
|
57
|
+
*/
|
|
58
|
+
function formatBytes(bytes) {
|
|
59
|
+
if (bytes === 0)
|
|
60
|
+
return "0 B";
|
|
61
|
+
const k = 1024;
|
|
62
|
+
const sizes = ["B", "KB", "MB", "GB"];
|
|
63
|
+
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
64
|
+
return `${parseFloat((bytes / Math.pow(k, i)).toFixed(1))} ${sizes[i]}`;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Get recent sync results for all accounts
|
|
68
|
+
*/
|
|
69
|
+
async function getRecentSyncResults(accounts, billclaw, limit = 5) {
|
|
70
|
+
const allSyncs = [];
|
|
71
|
+
for (const account of accounts) {
|
|
72
|
+
try {
|
|
73
|
+
const syncStates = await billclaw.getSyncStates(account.id);
|
|
74
|
+
const accountSyncs = syncStates
|
|
75
|
+
.sort((a, b) => new Date(b.startedAt).getTime() - new Date(a.startedAt).getTime())
|
|
76
|
+
.slice(0, limit)
|
|
77
|
+
.map((sync) => ({
|
|
78
|
+
...sync,
|
|
79
|
+
accountName: account.id,
|
|
80
|
+
}));
|
|
81
|
+
allSyncs.push(...accountSyncs);
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
// Skip accounts that don't have sync states yet
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return allSyncs
|
|
88
|
+
.sort((a, b) => new Date(b.startedAt).getTime() - new Date(a.startedAt).getTime())
|
|
89
|
+
.slice(0, limit);
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Run status command
|
|
93
|
+
*/
|
|
94
|
+
async function runStatus(context) {
|
|
95
|
+
const { runtime } = context;
|
|
96
|
+
const billclaw = new Billclaw(runtime);
|
|
97
|
+
const accounts = await billclaw.getAccounts();
|
|
98
|
+
if (accounts.length === 0) {
|
|
99
|
+
console.log("No accounts configured. Run 'billclaw setup' first.");
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
console.log("");
|
|
103
|
+
console.log("BillClaw Status");
|
|
104
|
+
console.log("");
|
|
105
|
+
// Accounts table
|
|
106
|
+
const accountsTable = createTable({
|
|
107
|
+
head: ["Account ID", "Type", "Status", "Last Sync"],
|
|
108
|
+
});
|
|
109
|
+
for (const account of accounts) {
|
|
110
|
+
accountsTable.push([
|
|
111
|
+
account.id,
|
|
112
|
+
formatAccountType(account.type),
|
|
113
|
+
formatStatus(account.lastStatus ?? "unknown"),
|
|
114
|
+
account.lastSync ? formatDate(account.lastSync) : "Never",
|
|
115
|
+
]);
|
|
116
|
+
}
|
|
117
|
+
printTable(accountsTable);
|
|
118
|
+
// Storage Statistics
|
|
119
|
+
console.log("");
|
|
120
|
+
console.log("Storage Statistics");
|
|
121
|
+
const storageConfig = await runtime.config.getStorageConfig();
|
|
122
|
+
const storagePath = await getStorageDir(storageConfig);
|
|
123
|
+
const statsTable = createTable({
|
|
124
|
+
head: ["Account", "Transactions", "Size", "First", "Last"],
|
|
125
|
+
});
|
|
126
|
+
let totalTransactions = 0;
|
|
127
|
+
let totalSize = 0;
|
|
128
|
+
for (const account of accounts) {
|
|
129
|
+
const stats = await getStorageStats(account.id, storagePath);
|
|
130
|
+
statsTable.push([
|
|
131
|
+
account.id,
|
|
132
|
+
stats.totalTransactions.toString(),
|
|
133
|
+
stats.storageSize,
|
|
134
|
+
stats.firstTransaction ? formatDate(stats.firstTransaction) : "N/A",
|
|
135
|
+
stats.lastTransaction ? formatDate(stats.lastTransaction) : "N/A",
|
|
136
|
+
]);
|
|
137
|
+
totalTransactions += stats.totalTransactions;
|
|
138
|
+
const sizeBytes = parseFloat(stats.storageSize);
|
|
139
|
+
const unit = stats.storageSize.split(" ")[1];
|
|
140
|
+
totalSize += sizeBytes;
|
|
141
|
+
}
|
|
142
|
+
printTable(statsTable);
|
|
143
|
+
// Totals row
|
|
144
|
+
console.log(`Total: ${totalTransactions} transactions, ${formatBytes(totalSize * 1024)}`);
|
|
145
|
+
// Recent Sync Results
|
|
146
|
+
console.log("");
|
|
147
|
+
console.log("Recent Sync Results");
|
|
148
|
+
const recentSyncs = await getRecentSyncResults(accounts, billclaw);
|
|
149
|
+
if (recentSyncs.length === 0) {
|
|
150
|
+
console.log("No sync history available.");
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
const syncTable = createTable({
|
|
154
|
+
head: ["Account", "Status", "Added", "Updated", "Time"],
|
|
155
|
+
});
|
|
156
|
+
for (const sync of recentSyncs) {
|
|
157
|
+
syncTable.push([
|
|
158
|
+
sync.accountName,
|
|
159
|
+
formatStatus(sync.status),
|
|
160
|
+
sync.transactionsAdded.toString(),
|
|
161
|
+
sync.transactionsUpdated.toString(),
|
|
162
|
+
formatDate(sync.startedAt),
|
|
163
|
+
]);
|
|
164
|
+
}
|
|
165
|
+
printTable(syncTable);
|
|
166
|
+
}
|
|
167
|
+
// Status summary
|
|
168
|
+
console.log("");
|
|
169
|
+
const enabledCount = accounts.filter((a) => a.enabled).length;
|
|
170
|
+
const disabledCount = accounts.length - enabledCount;
|
|
171
|
+
console.log("Summary:");
|
|
172
|
+
console.log(` Total accounts: ${accounts.length}`);
|
|
173
|
+
console.log(` Enabled: ${enabledCount}`);
|
|
174
|
+
console.log(` Disabled: ${disabledCount}`);
|
|
175
|
+
if (accounts.some((a) => a.requiresReauth)) {
|
|
176
|
+
console.log(" ⚠️ Some accounts require re-authentication");
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Status command definition
|
|
181
|
+
*/
|
|
182
|
+
export const statusCommand = {
|
|
183
|
+
name: "status",
|
|
184
|
+
description: "Show connection status and recent sync results",
|
|
185
|
+
handler: runStatus,
|
|
186
|
+
};
|
|
187
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sync command
|
|
3
|
+
*
|
|
4
|
+
* Manually trigger transaction sync from configured accounts.
|
|
5
|
+
*/
|
|
6
|
+
import type { CliCommand } from "./registry.js";
|
|
7
|
+
/**
|
|
8
|
+
* Sync command definition
|
|
9
|
+
*/
|
|
10
|
+
export declare const syncCommand: CliCommand;
|
|
11
|
+
//# sourceMappingURL=sync.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAc,MAAM,eAAe,CAAA;AA0J3D;;GAEG;AACH,eAAO,MAAM,WAAW,EAAE,UAgBzB,CAAA"}
|