@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.
Files changed (68) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +204 -0
  3. package/bin/billclaw.js +10 -0
  4. package/dist/commands/config.d.ts +11 -0
  5. package/dist/commands/config.d.ts.map +1 -0
  6. package/dist/commands/config.js +112 -0
  7. package/dist/commands/config.js.map +1 -0
  8. package/dist/commands/export.d.ts +11 -0
  9. package/dist/commands/export.d.ts.map +1 -0
  10. package/dist/commands/export.js +106 -0
  11. package/dist/commands/export.js.map +1 -0
  12. package/dist/commands/index.d.ts +46 -0
  13. package/dist/commands/index.d.ts.map +1 -0
  14. package/dist/commands/index.js +22 -0
  15. package/dist/commands/index.js.map +1 -0
  16. package/dist/commands/registry.d.ts +62 -0
  17. package/dist/commands/registry.d.ts.map +1 -0
  18. package/dist/commands/registry.js +77 -0
  19. package/dist/commands/registry.js.map +1 -0
  20. package/dist/commands/setup.d.ts +11 -0
  21. package/dist/commands/setup.d.ts.map +1 -0
  22. package/dist/commands/setup.js +214 -0
  23. package/dist/commands/setup.js.map +1 -0
  24. package/dist/commands/status.d.ts +11 -0
  25. package/dist/commands/status.d.ts.map +1 -0
  26. package/dist/commands/status.js +187 -0
  27. package/dist/commands/status.js.map +1 -0
  28. package/dist/commands/sync.d.ts +11 -0
  29. package/dist/commands/sync.d.ts.map +1 -0
  30. package/dist/commands/sync.js +150 -0
  31. package/dist/commands/sync.js.map +1 -0
  32. package/dist/index.d.ts +15 -0
  33. package/dist/index.d.ts.map +1 -0
  34. package/dist/index.js +45 -0
  35. package/dist/index.js.map +1 -0
  36. package/dist/runtime/config.d.ts +32 -0
  37. package/dist/runtime/config.d.ts.map +1 -0
  38. package/dist/runtime/config.js +105 -0
  39. package/dist/runtime/config.js.map +1 -0
  40. package/dist/runtime/context.d.ts +33 -0
  41. package/dist/runtime/context.d.ts.map +1 -0
  42. package/dist/runtime/context.js +35 -0
  43. package/dist/runtime/context.js.map +1 -0
  44. package/dist/runtime/events.d.ts +24 -0
  45. package/dist/runtime/events.d.ts.map +1 -0
  46. package/dist/runtime/events.js +54 -0
  47. package/dist/runtime/events.js.map +1 -0
  48. package/dist/runtime/index.d.ts +10 -0
  49. package/dist/runtime/index.d.ts.map +1 -0
  50. package/dist/runtime/index.js +10 -0
  51. package/dist/runtime/index.js.map +1 -0
  52. package/dist/runtime/logger.d.ts +41 -0
  53. package/dist/runtime/logger.d.ts.map +1 -0
  54. package/dist/runtime/logger.js +95 -0
  55. package/dist/runtime/logger.js.map +1 -0
  56. package/dist/utils/format.d.ts +62 -0
  57. package/dist/utils/format.d.ts.map +1 -0
  58. package/dist/utils/format.js +153 -0
  59. package/dist/utils/format.js.map +1 -0
  60. package/dist/utils/index.d.ts +6 -0
  61. package/dist/utils/index.d.ts.map +1 -0
  62. package/dist/utils/index.js +6 -0
  63. package/dist/utils/index.js.map +1 -0
  64. package/dist/utils/progress.d.ts +38 -0
  65. package/dist/utils/progress.d.ts.map +1 -0
  66. package/dist/utils/progress.js +70 -0
  67. package/dist/utils/progress.js.map +1 -0
  68. 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"}