plasalid 0.2.0 → 0.3.2
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 +4 -4
- package/dist/cli/index.js +41 -9
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -11,13 +11,13 @@
|
|
|
11
11
|
|
|
12
12
|
<br />
|
|
13
13
|
|
|
14
|
-
Plasalid lets you actually *talk* to your money. Drop
|
|
14
|
+
Plasalid lets you actually *talk* to your money. Drop your bank and credit-card statement PDFs into a folder. Plasalid scans every transaction, every balance, every late fee into a double-entry database on your own machine. Then you chat with it — an AI that's read every line and tells you, sharply and proactively, what's going on. Local, private, yours.
|
|
15
15
|
|
|
16
|
-
Plasalid exists because in markets like Thailand there's no Plaid
|
|
16
|
+
Plasalid exists because in markets like Thailand there's no Plaid. In the US, a single API gives apps a live view of every balance and transaction across all your accounts — one complete picture of your money. In Thailand, knowing where you stand means logging into five different bank apps in sequence and opening password-protected statement PDFs one by one. Most people just don't bother. And most people can't afford a financial advisor to do it for them either.
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
Personal finance isn't taught well in Thai schools. Fee-based advisors are out of reach for most households. The loudest "advice" channels are bank salespeople pitching their employer's products. The result: over **5 million Thais** are already flagged as non-performing borrowers, and a generation that wants to manage money better has nowhere accessible to learn how. Plasalid's bet is that capable AI changes that. The same intelligence that reads your statements can explain what the numbers mean. It flags what's about to go wrong. It coaches you through real decisions — debt, budget, savings.
|
|
19
19
|
|
|
20
|
-
|
|
20
|
+
And when survival isn't the question anymore, the same Plasalid can scales up with you. Saving for a trip. Building an emergency fund. Choosing investments. Planning a down payment or retirement. Working toward the freedom to walk away from a bad job. From getting out of debt to financial freedom, Plasalid grows with you.
|
|
21
21
|
|
|
22
22
|
## Features
|
|
23
23
|
|
package/dist/cli/index.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { Command } from "commander";
|
|
3
3
|
import { createRequire } from "module";
|
|
4
|
+
import chalk from "chalk";
|
|
4
5
|
import { config, isConfigured } from "../config.js";
|
|
5
6
|
import { helpScreen } from "./format.js";
|
|
6
7
|
const require = createRequire(import.meta.url);
|
|
@@ -17,6 +18,7 @@ program
|
|
|
17
18
|
.description("The local-first data layer for personal finance")
|
|
18
19
|
.version(version)
|
|
19
20
|
.addHelpCommand(false)
|
|
21
|
+
.showHelpAfterError(`Run ${chalk.cyan("plasalid --help")} for the list of commands.`)
|
|
20
22
|
.action(async () => {
|
|
21
23
|
if (!isConfigured()) {
|
|
22
24
|
console.log("Plasalid is not configured yet. Running setup...\n");
|
|
@@ -36,6 +38,7 @@ program
|
|
|
36
38
|
});
|
|
37
39
|
program
|
|
38
40
|
.command("data")
|
|
41
|
+
.alias("open")
|
|
39
42
|
.description("Open the Plasalid data folder in your OS file explorer")
|
|
40
43
|
.action(async () => {
|
|
41
44
|
const { runDataCommand } = await import("./commands/data.js");
|
|
@@ -77,13 +80,24 @@ program
|
|
|
77
80
|
});
|
|
78
81
|
});
|
|
79
82
|
program
|
|
80
|
-
.command("scan [regex]")
|
|
83
|
+
.command("scan [regex...]")
|
|
81
84
|
.description("Scan every new PDF under ~/.plasalid/data (optionally filtered by regex)")
|
|
82
85
|
.option("-f, --force", "Re-scan matching files (cascade-deletes prior records)")
|
|
83
|
-
.action(async (
|
|
86
|
+
.action(async (regexes, opts) => {
|
|
84
87
|
ensureConfigured();
|
|
88
|
+
if (regexes.length > 1) {
|
|
89
|
+
console.error(chalk.red(`scan takes a single regex (or none). got ${regexes.length} arguments — your shell likely expanded a glob like '*' to filenames.`));
|
|
90
|
+
console.error("");
|
|
91
|
+
console.error("To scan everything in the data dir:");
|
|
92
|
+
console.error(` ${chalk.cyan("plasalid scan")}`);
|
|
93
|
+
console.error("");
|
|
94
|
+
console.error("To filter with a regex, quote it:");
|
|
95
|
+
console.error(` ${chalk.cyan("plasalid scan '.*'")}`);
|
|
96
|
+
console.error(` ${chalk.cyan("plasalid scan 'KBank|SCB'")}`);
|
|
97
|
+
process.exit(1);
|
|
98
|
+
}
|
|
85
99
|
const { runScanCommand } = await import("./commands/scan.js");
|
|
86
|
-
await runScanCommand({ regex, force: !!opts.force });
|
|
100
|
+
await runScanCommand({ regex: regexes[0], force: !!opts.force });
|
|
87
101
|
});
|
|
88
102
|
program
|
|
89
103
|
.command("reconcile")
|
|
@@ -112,14 +126,32 @@ program
|
|
|
112
126
|
});
|
|
113
127
|
program.configureHelp({
|
|
114
128
|
formatHelp: () => helpScreen([
|
|
115
|
-
{
|
|
116
|
-
|
|
129
|
+
{
|
|
130
|
+
name: "setup",
|
|
131
|
+
desc: "Configure Plasalid (API key, encryption, data dir)",
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
name: "data",
|
|
135
|
+
desc: "Open the data folder in your OS file explorer (alias: open)",
|
|
136
|
+
},
|
|
117
137
|
{ name: "accounts", desc: "Show the chart of accounts with balances" },
|
|
118
138
|
{ name: "status", desc: "Show net worth and this-month totals" },
|
|
119
|
-
{
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
139
|
+
{
|
|
140
|
+
name: "transactions",
|
|
141
|
+
desc: "List journal lines (filter by account/date/text)",
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
name: "scan",
|
|
145
|
+
desc: "Scan new PDFs (optionally by regex; --force to re-scan)",
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
name: "reconcile",
|
|
149
|
+
desc: "Review and fix existing journal entries / accounts",
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
name: "revert",
|
|
153
|
+
desc: "Delete scanned files matching <regex> and their journal entries",
|
|
154
|
+
},
|
|
123
155
|
]),
|
|
124
156
|
});
|
|
125
157
|
void config; // keep config import live so dotenv loads
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "plasalid",
|
|
3
|
-
"version": "0.2
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.3.2",
|
|
4
|
+
"description": "A local-first AI that reads every line of your transactions and coaches you the best move.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"finance",
|
|
7
7
|
"personal-finance",
|