@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,150 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sync command
|
|
3
|
+
*
|
|
4
|
+
* Manually trigger transaction sync from configured accounts.
|
|
5
|
+
*/
|
|
6
|
+
import { Spinner } from "../utils/progress.js";
|
|
7
|
+
import { success, formatStatus } from "../utils/format.js";
|
|
8
|
+
import { Billclaw } from "@firela/billclaw-core";
|
|
9
|
+
/**
|
|
10
|
+
* Run sync command
|
|
11
|
+
*/
|
|
12
|
+
async function runSync(context, args) {
|
|
13
|
+
const { runtime } = context;
|
|
14
|
+
const billclaw = new Billclaw(runtime);
|
|
15
|
+
const accountId = args.account;
|
|
16
|
+
const syncAll = args.all ?? false;
|
|
17
|
+
if (syncAll || !accountId) {
|
|
18
|
+
await syncAllAccounts(billclaw);
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
await syncSingleAccount(billclaw, accountId);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Sync all configured accounts
|
|
26
|
+
*/
|
|
27
|
+
async function syncAllAccounts(billclaw) {
|
|
28
|
+
const spinner = new Spinner({ text: "Getting accounts..." }).start();
|
|
29
|
+
try {
|
|
30
|
+
const accounts = await billclaw.getAccounts();
|
|
31
|
+
spinner.succeed(`Found ${accounts.length} account(s)`);
|
|
32
|
+
if (accounts.length === 0) {
|
|
33
|
+
console.log("No accounts configured. Run 'billclaw setup' first.");
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
let totalAdded = 0;
|
|
37
|
+
let totalUpdated = 0;
|
|
38
|
+
const errors = [];
|
|
39
|
+
for (const account of accounts) {
|
|
40
|
+
const accountSpinner = new Spinner({
|
|
41
|
+
text: `Syncing ${account.id}...`,
|
|
42
|
+
}).start();
|
|
43
|
+
try {
|
|
44
|
+
let results;
|
|
45
|
+
switch (account.type) {
|
|
46
|
+
case "plaid":
|
|
47
|
+
results = await billclaw.syncPlaid([account.id]);
|
|
48
|
+
break;
|
|
49
|
+
case "gmail":
|
|
50
|
+
results = await billclaw.syncGmail([account.id]);
|
|
51
|
+
break;
|
|
52
|
+
default:
|
|
53
|
+
throw new Error(`Unknown account type: ${account.type}`);
|
|
54
|
+
}
|
|
55
|
+
const added = results.reduce((sum, r) => sum + r.transactionsAdded, 0);
|
|
56
|
+
const updated = results.reduce((sum, r) => sum + r.transactionsUpdated, 0);
|
|
57
|
+
totalAdded += added;
|
|
58
|
+
totalUpdated += updated;
|
|
59
|
+
accountSpinner.succeed(`${account.id}: ${formatStatus("success")} (+${added}, ~${updated})`);
|
|
60
|
+
for (const result of results) {
|
|
61
|
+
if (result.errors) {
|
|
62
|
+
errors.push(...result.errors);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
catch (err) {
|
|
67
|
+
accountSpinner.fail(`${account.id}: ${err.message}`);
|
|
68
|
+
errors.push(`${account.id}: ${err.message}`);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
console.log("");
|
|
72
|
+
console.log("Sync Summary:");
|
|
73
|
+
console.log(` Transactions added: ${totalAdded}`);
|
|
74
|
+
console.log(` Transactions updated: ${totalUpdated}`);
|
|
75
|
+
if (errors.length > 0) {
|
|
76
|
+
console.log(` Errors: ${errors.length}`);
|
|
77
|
+
for (const err of errors) {
|
|
78
|
+
console.log(` - ${err}`);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
success("All accounts synced successfully!");
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
catch (err) {
|
|
86
|
+
spinner.fail("Sync failed");
|
|
87
|
+
throw err;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Sync a single account
|
|
92
|
+
*/
|
|
93
|
+
async function syncSingleAccount(billclaw, accountId) {
|
|
94
|
+
const spinner = new Spinner({
|
|
95
|
+
text: `Syncing account ${accountId}...`,
|
|
96
|
+
}).start();
|
|
97
|
+
try {
|
|
98
|
+
const accounts = await billclaw.getAccounts();
|
|
99
|
+
const account = accounts.find((a) => a.id === accountId);
|
|
100
|
+
if (!account) {
|
|
101
|
+
spinner.fail(`Account ${accountId} not found`);
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
let results;
|
|
105
|
+
switch (account.type) {
|
|
106
|
+
case "plaid":
|
|
107
|
+
results = await billclaw.syncPlaid([accountId]);
|
|
108
|
+
break;
|
|
109
|
+
case "gmail":
|
|
110
|
+
results = await billclaw.syncGmail([accountId]);
|
|
111
|
+
break;
|
|
112
|
+
default:
|
|
113
|
+
throw new Error(`Unknown account type: ${account.type}`);
|
|
114
|
+
}
|
|
115
|
+
const added = results.reduce((sum, r) => sum + r.transactionsAdded, 0);
|
|
116
|
+
const updated = results.reduce((sum, r) => sum + r.transactionsUpdated, 0);
|
|
117
|
+
spinner.succeed(`Synced ${accountId}: +${added} new, ${updated} updated`);
|
|
118
|
+
const errors = results.flatMap((r) => r.errors || []);
|
|
119
|
+
if (errors.length > 0) {
|
|
120
|
+
console.log("Errors:");
|
|
121
|
+
for (const err of errors) {
|
|
122
|
+
console.log(` - ${err}`);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
catch (err) {
|
|
127
|
+
spinner.fail(`Sync failed: ${err.message}`);
|
|
128
|
+
throw err;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Sync command definition
|
|
133
|
+
*/
|
|
134
|
+
export const syncCommand = {
|
|
135
|
+
name: "sync",
|
|
136
|
+
description: "Manually trigger transaction sync",
|
|
137
|
+
aliases: ["pull"],
|
|
138
|
+
options: [
|
|
139
|
+
{
|
|
140
|
+
flags: "-a, --account <id>",
|
|
141
|
+
description: "Specific account ID to sync",
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
flags: "--all",
|
|
145
|
+
description: "Sync all accounts (default)",
|
|
146
|
+
},
|
|
147
|
+
],
|
|
148
|
+
handler: (context, args) => runSync(context, args),
|
|
149
|
+
};
|
|
150
|
+
//# sourceMappingURL=sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BillClaw CLI
|
|
3
|
+
*
|
|
4
|
+
* Standalone command-line interface for financial data management.
|
|
5
|
+
*/
|
|
6
|
+
import { Command } from "commander";
|
|
7
|
+
/**
|
|
8
|
+
* Create and configure the CLI program
|
|
9
|
+
*/
|
|
10
|
+
export declare function createProgram(): Promise<Command>;
|
|
11
|
+
/**
|
|
12
|
+
* Main entry point
|
|
13
|
+
*/
|
|
14
|
+
export declare function main(args?: string[]): Promise<void>;
|
|
15
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AASnC;;GAEG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC,CAqBtD;AAED;;GAEG;AACH,wBAAsB,IAAI,CAAC,IAAI,GAAE,MAAM,EAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAQvE"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BillClaw CLI
|
|
3
|
+
*
|
|
4
|
+
* Standalone command-line interface for financial data management.
|
|
5
|
+
*/
|
|
6
|
+
import { Command } from "commander";
|
|
7
|
+
import { CommandRegistry } from "./commands/registry.js";
|
|
8
|
+
import { allCommands } from "./commands/index.js";
|
|
9
|
+
/**
|
|
10
|
+
* CLI version
|
|
11
|
+
*/
|
|
12
|
+
const VERSION = "0.0.1";
|
|
13
|
+
/**
|
|
14
|
+
* Create and configure the CLI program
|
|
15
|
+
*/
|
|
16
|
+
export async function createProgram() {
|
|
17
|
+
const program = new Command();
|
|
18
|
+
program
|
|
19
|
+
.name("billclaw")
|
|
20
|
+
.description("BillClaw - Financial data sovereignty with multi-platform support")
|
|
21
|
+
.version(VERSION);
|
|
22
|
+
const registry = new CommandRegistry(program);
|
|
23
|
+
// Register all commands
|
|
24
|
+
for (const commandLoader of allCommands) {
|
|
25
|
+
const commandName = Object.keys(commandLoader)[0];
|
|
26
|
+
const loadCommand = Object.values(commandLoader)[0];
|
|
27
|
+
const command = await loadCommand();
|
|
28
|
+
registry.register(command);
|
|
29
|
+
}
|
|
30
|
+
return program;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Main entry point
|
|
34
|
+
*/
|
|
35
|
+
export async function main(args = process.argv) {
|
|
36
|
+
try {
|
|
37
|
+
const program = await createProgram();
|
|
38
|
+
await program.parseAsync(args);
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
console.error("CLI error:", error);
|
|
42
|
+
process.exit(1);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAEjD;;GAEG;AACH,MAAM,OAAO,GAAG,OAAO,CAAA;AAEvB;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAA;IAE7B,OAAO;SACJ,IAAI,CAAC,UAAU,CAAC;SAChB,WAAW,CACV,mEAAmE,CACpE;SACA,OAAO,CAAC,OAAO,CAAC,CAAA;IAEnB,MAAM,QAAQ,GAAG,IAAI,eAAe,CAAC,OAAO,CAAC,CAAA;IAE7C,wBAAwB;IACxB,KAAK,MAAM,aAAa,IAAI,WAAW,EAAE,CAAC;QACxC,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAA;QACjD,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAuB,CAAA;QACzE,MAAM,OAAO,GAAG,MAAM,WAAW,EAAE,CAAA;QACnC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;IAC5B,CAAC;IAED,OAAO,OAAO,CAAA;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,OAAiB,OAAO,CAAC,IAAI;IACtD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,aAAa,EAAE,CAAA;QACrC,MAAM,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;IAChC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,CAAA;QAClC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI config provider implementation
|
|
3
|
+
*
|
|
4
|
+
* File-based configuration provider for standalone CLI usage.
|
|
5
|
+
*/
|
|
6
|
+
import type { ConfigProvider, BillclawConfig } from "@firela/billclaw-core";
|
|
7
|
+
/**
|
|
8
|
+
* CLI config provider options
|
|
9
|
+
*/
|
|
10
|
+
export interface CliConfigOptions {
|
|
11
|
+
configDir?: string;
|
|
12
|
+
configPath?: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* CLI config provider implementation
|
|
16
|
+
*/
|
|
17
|
+
export declare class CliConfigProvider implements ConfigProvider {
|
|
18
|
+
private configPath;
|
|
19
|
+
private cachedConfig?;
|
|
20
|
+
constructor(options?: CliConfigOptions);
|
|
21
|
+
getConfig(): Promise<BillclawConfig>;
|
|
22
|
+
getStorageConfig(): Promise<any>;
|
|
23
|
+
updateAccount(accountId: string, updates: Partial<any>): Promise<void>;
|
|
24
|
+
getAccount(accountId: string): Promise<any | null>;
|
|
25
|
+
saveConfig(config: BillclawConfig): Promise<void>;
|
|
26
|
+
private getDefaultConfig;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Create a default CLI config provider
|
|
30
|
+
*/
|
|
31
|
+
export declare function createConfigProvider(options?: CliConfigOptions): CliConfigProvider;
|
|
32
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/runtime/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAE3E;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAUD;;GAEG;AACH,qBAAa,iBAAkB,YAAW,cAAc;IACtD,OAAO,CAAC,UAAU,CAAQ;IAC1B,OAAO,CAAC,YAAY,CAAC,CAAgB;gBAEzB,OAAO,GAAE,gBAAqB;IAKpC,SAAS,IAAI,OAAO,CAAC,cAAc,CAAC;IAmBpC,gBAAgB,IAAI,OAAO,CAAC,GAAG,CAAC;IAWhC,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBtE,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC;IAKlD,UAAU,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBvD,OAAO,CAAC,gBAAgB;CAmBzB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,CAAC,EAAE,gBAAgB,GACzB,iBAAiB,CAEnB"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI config provider implementation
|
|
3
|
+
*
|
|
4
|
+
* File-based configuration provider for standalone CLI usage.
|
|
5
|
+
*/
|
|
6
|
+
import * as fs from "node:fs";
|
|
7
|
+
import * as path from "node:path";
|
|
8
|
+
import * as os from "node:os";
|
|
9
|
+
/**
|
|
10
|
+
* Default config directory path
|
|
11
|
+
*/
|
|
12
|
+
function getDefaultConfigDir() {
|
|
13
|
+
const home = os.homedir();
|
|
14
|
+
return path.join(home, ".billclaw");
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* CLI config provider implementation
|
|
18
|
+
*/
|
|
19
|
+
export class CliConfigProvider {
|
|
20
|
+
configPath;
|
|
21
|
+
cachedConfig;
|
|
22
|
+
constructor(options = {}) {
|
|
23
|
+
const configDir = options.configDir ?? getDefaultConfigDir();
|
|
24
|
+
this.configPath = options.configPath ?? path.join(configDir, "config.json");
|
|
25
|
+
}
|
|
26
|
+
async getConfig() {
|
|
27
|
+
if (this.cachedConfig) {
|
|
28
|
+
return this.cachedConfig;
|
|
29
|
+
}
|
|
30
|
+
try {
|
|
31
|
+
const content = await fs.promises.readFile(this.configPath, "utf-8");
|
|
32
|
+
this.cachedConfig = JSON.parse(content);
|
|
33
|
+
return this.cachedConfig;
|
|
34
|
+
}
|
|
35
|
+
catch (err) {
|
|
36
|
+
if (err.code === "ENOENT") {
|
|
37
|
+
// Return default config if file doesn't exist
|
|
38
|
+
this.cachedConfig = this.getDefaultConfig();
|
|
39
|
+
return this.cachedConfig;
|
|
40
|
+
}
|
|
41
|
+
throw err;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
async getStorageConfig() {
|
|
45
|
+
const config = await this.getConfig();
|
|
46
|
+
return (config.storage || {
|
|
47
|
+
path: "~/.billclaw/data",
|
|
48
|
+
format: "json",
|
|
49
|
+
encryption: { enabled: false },
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
async updateAccount(accountId, updates) {
|
|
53
|
+
const config = await this.getConfig();
|
|
54
|
+
const accountIndex = config.accounts.findIndex((a) => a.id === accountId);
|
|
55
|
+
if (accountIndex === -1) {
|
|
56
|
+
throw new Error(`Account ${accountId} not found`);
|
|
57
|
+
}
|
|
58
|
+
config.accounts[accountIndex] = {
|
|
59
|
+
...config.accounts[accountIndex],
|
|
60
|
+
...updates,
|
|
61
|
+
};
|
|
62
|
+
await this.saveConfig(config);
|
|
63
|
+
this.cachedConfig = config;
|
|
64
|
+
}
|
|
65
|
+
async getAccount(accountId) {
|
|
66
|
+
const config = await this.getConfig();
|
|
67
|
+
return config.accounts.find((a) => a.id === accountId) || null;
|
|
68
|
+
}
|
|
69
|
+
async saveConfig(config) {
|
|
70
|
+
const configDir = path.dirname(this.configPath);
|
|
71
|
+
// Ensure config directory exists
|
|
72
|
+
await fs.promises.mkdir(configDir, { recursive: true });
|
|
73
|
+
// Write config atomically
|
|
74
|
+
const tmpPath = `${this.configPath}.tmp`;
|
|
75
|
+
await fs.promises.writeFile(tmpPath, JSON.stringify(config, null, 2), "utf-8");
|
|
76
|
+
await fs.promises.rename(tmpPath, this.configPath);
|
|
77
|
+
this.cachedConfig = config;
|
|
78
|
+
}
|
|
79
|
+
getDefaultConfig() {
|
|
80
|
+
return {
|
|
81
|
+
accounts: [],
|
|
82
|
+
webhooks: [],
|
|
83
|
+
storage: {
|
|
84
|
+
path: path.join(os.homedir(), ".billclaw"),
|
|
85
|
+
format: "json",
|
|
86
|
+
encryption: { enabled: false },
|
|
87
|
+
},
|
|
88
|
+
sync: {
|
|
89
|
+
defaultFrequency: "manual",
|
|
90
|
+
maxRetries: 3,
|
|
91
|
+
retryOnFailure: true,
|
|
92
|
+
},
|
|
93
|
+
plaid: {
|
|
94
|
+
environment: "sandbox",
|
|
95
|
+
},
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Create a default CLI config provider
|
|
101
|
+
*/
|
|
102
|
+
export function createConfigProvider(options) {
|
|
103
|
+
return new CliConfigProvider(options);
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/runtime/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI runtime context
|
|
3
|
+
*
|
|
4
|
+
* Combines logger, config provider, and event emitter for CLI usage.
|
|
5
|
+
*/
|
|
6
|
+
import type { RuntimeContext } from "@firela/billclaw-core";
|
|
7
|
+
import { CliLogger, LogLevel } from "./logger.js";
|
|
8
|
+
import { CliConfigProvider } from "./config.js";
|
|
9
|
+
import { CliEventEmitter } from "./events.js";
|
|
10
|
+
/**
|
|
11
|
+
* CLI runtime context options
|
|
12
|
+
*/
|
|
13
|
+
export interface CliRuntimeOptions {
|
|
14
|
+
logLevel?: LogLevel;
|
|
15
|
+
colors?: boolean;
|
|
16
|
+
timestamps?: boolean;
|
|
17
|
+
configDir?: string;
|
|
18
|
+
configPath?: string;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* CLI runtime context
|
|
22
|
+
*/
|
|
23
|
+
export declare class CliRuntimeContext implements RuntimeContext {
|
|
24
|
+
readonly logger: CliLogger;
|
|
25
|
+
readonly config: CliConfigProvider;
|
|
26
|
+
readonly events: CliEventEmitter;
|
|
27
|
+
constructor(options?: CliRuntimeOptions);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Create a default CLI runtime context
|
|
31
|
+
*/
|
|
32
|
+
export declare function createRuntimeContext(options?: CliRuntimeOptions): CliRuntimeContext;
|
|
33
|
+
//# sourceMappingURL=context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/runtime/context.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAC3D,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAgB,MAAM,aAAa,CAAA;AAC/D,OAAO,EAAE,iBAAiB,EAAwB,MAAM,aAAa,CAAA;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAE7C;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,QAAQ,CAAA;IACnB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED;;GAEG;AACH,qBAAa,iBAAkB,YAAW,cAAc;IACtD,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAA;IAC1B,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAA;IAClC,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAA;gBAEpB,OAAO,GAAE,iBAAsB;CAY5C;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,CAAC,EAAE,iBAAiB,GAC1B,iBAAiB,CAEnB"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI runtime context
|
|
3
|
+
*
|
|
4
|
+
* Combines logger, config provider, and event emitter for CLI usage.
|
|
5
|
+
*/
|
|
6
|
+
import { createLogger } from "./logger.js";
|
|
7
|
+
import { createConfigProvider } from "./config.js";
|
|
8
|
+
import { CliEventEmitter } from "./events.js";
|
|
9
|
+
/**
|
|
10
|
+
* CLI runtime context
|
|
11
|
+
*/
|
|
12
|
+
export class CliRuntimeContext {
|
|
13
|
+
logger;
|
|
14
|
+
config;
|
|
15
|
+
events;
|
|
16
|
+
constructor(options = {}) {
|
|
17
|
+
this.logger = createLogger({
|
|
18
|
+
level: options.logLevel,
|
|
19
|
+
colors: options.colors,
|
|
20
|
+
timestamps: options.timestamps,
|
|
21
|
+
});
|
|
22
|
+
this.config = createConfigProvider({
|
|
23
|
+
configDir: options.configDir,
|
|
24
|
+
configPath: options.configPath,
|
|
25
|
+
});
|
|
26
|
+
this.events = new CliEventEmitter();
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Create a default CLI runtime context
|
|
31
|
+
*/
|
|
32
|
+
export function createRuntimeContext(options) {
|
|
33
|
+
return new CliRuntimeContext(options);
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/runtime/context.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAuB,YAAY,EAAE,MAAM,aAAa,CAAA;AAC/D,OAAO,EAAqB,oBAAoB,EAAE,MAAM,aAAa,CAAA;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAa7C;;GAEG;AACH,MAAM,OAAO,iBAAiB;IACnB,MAAM,CAAW;IACjB,MAAM,CAAmB;IACzB,MAAM,CAAiB;IAEhC,YAAY,UAA6B,EAAE;QACzC,IAAI,CAAC,MAAM,GAAG,YAAY,CAAC;YACzB,KAAK,EAAE,OAAO,CAAC,QAAQ;YACvB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,UAAU,EAAE,OAAO,CAAC,UAAU;SAC/B,CAAC,CAAA;QACF,IAAI,CAAC,MAAM,GAAG,oBAAoB,CAAC;YACjC,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,UAAU,EAAE,OAAO,CAAC,UAAU;SAC/B,CAAC,CAAA;QACF,IAAI,CAAC,MAAM,GAAG,IAAI,eAAe,EAAE,CAAA;IACrC,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAClC,OAA2B;IAE3B,OAAO,IAAI,iBAAiB,CAAC,OAAO,CAAC,CAAA;AACvC,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI event emitter implementation
|
|
3
|
+
*
|
|
4
|
+
* Simple in-memory event emitter for CLI usage.
|
|
5
|
+
*/
|
|
6
|
+
import type { EventEmitter } from "@firela/billclaw-core";
|
|
7
|
+
/**
|
|
8
|
+
* CLI event emitter implementation
|
|
9
|
+
*/
|
|
10
|
+
export declare class CliEventEmitter implements EventEmitter {
|
|
11
|
+
private listeners;
|
|
12
|
+
emit(event: string, data?: unknown): void;
|
|
13
|
+
on(event: string, handler: (...args: any[]) => void): void;
|
|
14
|
+
off(event: string, handler: (...args: any[]) => void): void;
|
|
15
|
+
/**
|
|
16
|
+
* Remove all listeners for an event or all events
|
|
17
|
+
*/
|
|
18
|
+
removeAll(event?: string): void;
|
|
19
|
+
/**
|
|
20
|
+
* Get the count of listeners for an event
|
|
21
|
+
*/
|
|
22
|
+
listenerCount(event: string): number;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=events.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/runtime/events.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AAEzD;;GAEG;AACH,qBAAa,eAAgB,YAAW,YAAY;IAClD,OAAO,CAAC,SAAS,CAAmD;IAEpE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI;IAazC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,GAAG,IAAI;IAO1D,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,GAAG,IAAI;IAO3D;;OAEG;IACH,SAAS,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI;IAQ/B;;OAEG;IACH,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;CAGrC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI event emitter implementation
|
|
3
|
+
*
|
|
4
|
+
* Simple in-memory event emitter for CLI usage.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* CLI event emitter implementation
|
|
8
|
+
*/
|
|
9
|
+
export class CliEventEmitter {
|
|
10
|
+
listeners = new Map();
|
|
11
|
+
emit(event, data) {
|
|
12
|
+
const handlers = this.listeners.get(event);
|
|
13
|
+
if (handlers) {
|
|
14
|
+
for (const handler of handlers) {
|
|
15
|
+
try {
|
|
16
|
+
handler(data);
|
|
17
|
+
}
|
|
18
|
+
catch (error) {
|
|
19
|
+
console.error(`Error in event handler for ${event}:`, error);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
on(event, handler) {
|
|
25
|
+
if (!this.listeners.has(event)) {
|
|
26
|
+
this.listeners.set(event, new Set());
|
|
27
|
+
}
|
|
28
|
+
this.listeners.get(event).add(handler);
|
|
29
|
+
}
|
|
30
|
+
off(event, handler) {
|
|
31
|
+
const handlers = this.listeners.get(event);
|
|
32
|
+
if (handlers) {
|
|
33
|
+
handlers.delete(handler);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Remove all listeners for an event or all events
|
|
38
|
+
*/
|
|
39
|
+
removeAll(event) {
|
|
40
|
+
if (event) {
|
|
41
|
+
this.listeners.delete(event);
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
this.listeners.clear();
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Get the count of listeners for an event
|
|
49
|
+
*/
|
|
50
|
+
listenerCount(event) {
|
|
51
|
+
return this.listeners.get(event)?.size ?? 0;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/runtime/events.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH;;GAEG;AACH,MAAM,OAAO,eAAe;IAClB,SAAS,GAAG,IAAI,GAAG,EAAyC,CAAA;IAEpE,IAAI,CAAC,KAAa,EAAE,IAAc;QAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;QAC1C,IAAI,QAAQ,EAAE,CAAC;YACb,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;gBAC/B,IAAI,CAAC;oBACH,OAAO,CAAC,IAAI,CAAC,CAAA;gBACf,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,OAAO,CAAC,KAAK,CAAC,8BAA8B,KAAK,GAAG,EAAE,KAAK,CAAC,CAAA;gBAC9D,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,EAAE,CAAC,KAAa,EAAE,OAAiC;QACjD,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,GAAG,EAAE,CAAC,CAAA;QACtC,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;IACzC,CAAC;IAED,GAAG,CAAC,KAAa,EAAE,OAAiC;QAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;QAC1C,IAAI,QAAQ,EAAE,CAAC;YACb,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QAC1B,CAAC;IACH,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,KAAc;QACtB,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QAC9B,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAA;QACxB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,KAAa;QACzB,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,IAAI,IAAI,CAAC,CAAA;IAC7C,CAAC;CACF"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI runtime module
|
|
3
|
+
*
|
|
4
|
+
* Runtime abstractions for standalone CLI usage.
|
|
5
|
+
*/
|
|
6
|
+
export { CliLogger, LogLevel, createLogger } from "./logger.js";
|
|
7
|
+
export { CliConfigProvider, createConfigProvider } from "./config.js";
|
|
8
|
+
export { CliEventEmitter } from "./events.js";
|
|
9
|
+
export { CliRuntimeContext, createRuntimeContext } from "./context.js";
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC/D,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAC7C,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAA"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI runtime module
|
|
3
|
+
*
|
|
4
|
+
* Runtime abstractions for standalone CLI usage.
|
|
5
|
+
*/
|
|
6
|
+
export { CliLogger, LogLevel, createLogger } from "./logger.js";
|
|
7
|
+
export { CliConfigProvider, createConfigProvider } from "./config.js";
|
|
8
|
+
export { CliEventEmitter } from "./events.js";
|
|
9
|
+
export { CliRuntimeContext, createRuntimeContext } from "./context.js";
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC/D,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAC7C,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAA"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI logger implementation
|
|
3
|
+
*
|
|
4
|
+
* Console-based logger with colored output and severity levels.
|
|
5
|
+
*/
|
|
6
|
+
import type { Logger } from "@firela/billclaw-core";
|
|
7
|
+
/**
|
|
8
|
+
* Log level enum
|
|
9
|
+
*/
|
|
10
|
+
export declare enum LogLevel {
|
|
11
|
+
DEBUG = 0,
|
|
12
|
+
INFO = 1,
|
|
13
|
+
WARN = 2,
|
|
14
|
+
ERROR = 3
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* CLI logger configuration
|
|
18
|
+
*/
|
|
19
|
+
export interface CliLoggerConfig {
|
|
20
|
+
level: LogLevel;
|
|
21
|
+
colors: boolean;
|
|
22
|
+
timestamps: boolean;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* CLI logger implementation
|
|
26
|
+
*/
|
|
27
|
+
export declare class CliLogger implements Logger {
|
|
28
|
+
private config;
|
|
29
|
+
constructor(config?: Partial<CliLoggerConfig>);
|
|
30
|
+
setLevel(level: LogLevel): void;
|
|
31
|
+
debug(...args: unknown[]): void;
|
|
32
|
+
info(...args: unknown[]): void;
|
|
33
|
+
warn(...args: unknown[]): void;
|
|
34
|
+
error(...args: unknown[]): void;
|
|
35
|
+
private log;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Create a default CLI logger instance
|
|
39
|
+
*/
|
|
40
|
+
export declare function createLogger(config?: Partial<CliLoggerConfig>): CliLogger;
|
|
41
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/runtime/logger.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAA;AAEnD;;GAEG;AACH,oBAAY,QAAQ;IAClB,KAAK,IAAI;IACT,IAAI,IAAI;IACR,IAAI,IAAI;IACR,KAAK,IAAI;CACV;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,QAAQ,CAAA;IACf,MAAM,EAAE,OAAO,CAAA;IACf,UAAU,EAAE,OAAO,CAAA;CACpB;AAuBD;;GAEG;AACH,qBAAa,SAAU,YAAW,MAAM;IACtC,OAAO,CAAC,MAAM,CAAiB;gBAEnB,MAAM,GAAE,OAAO,CAAC,eAAe,CAAM;IAIjD,QAAQ,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI;IAI/B,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI;IAM/B,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI;IAM9B,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI;IAM9B,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI;IAM/B,OAAO,CAAC,GAAG;CAuBZ;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,SAAS,CAEzE"}
|