actual-jev 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/.env.example +7 -0
- package/LICENSE +21 -0
- package/README.md +42 -0
- package/dist/actual-jev.test.d.ts +1 -0
- package/dist/actual-jev.test.js +111 -0
- package/dist/actual.d.ts +47 -0
- package/dist/actual.js +148 -0
- package/dist/actual.test.d.ts +1 -0
- package/dist/actual.test.js +139 -0
- package/dist/args.d.ts +9 -0
- package/dist/args.js +90 -0
- package/dist/args.test.d.ts +1 -0
- package/dist/args.test.js +84 -0
- package/dist/choices.d.ts +8 -0
- package/dist/choices.js +26 -0
- package/dist/choices.test.d.ts +1 -0
- package/dist/choices.test.js +29 -0
- package/dist/classifier.d.ts +56 -0
- package/dist/classifier.js +147 -0
- package/dist/classifier.test.d.ts +1 -0
- package/dist/classifier.test.js +257 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +169 -0
- package/dist/cli.test.d.ts +1 -0
- package/dist/cli.test.js +130 -0
- package/dist/config.d.ts +28 -0
- package/dist/config.js +135 -0
- package/dist/config.test.d.ts +1 -0
- package/dist/config.test.js +98 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +1 -0
- package/dist/output.d.ts +4 -0
- package/dist/output.js +36 -0
- package/dist/setup.d.ts +30 -0
- package/dist/setup.js +84 -0
- package/dist/setup.test.d.ts +1 -0
- package/dist/setup.test.js +138 -0
- package/dist/workflow.d.ts +38 -0
- package/dist/workflow.js +102 -0
- package/dist/workflow.test.d.ts +1 -0
- package/dist/workflow.test.js +284 -0
- package/docs/library.md +44 -0
- package/package.json +51 -0
package/docs/library.md
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# Library usage
|
|
2
|
+
|
|
3
|
+
Install `actual-jev`, `@actual-app/api`, and `@typesafe-ai/sdk` in your project. Initialize both clients in your script, then give them to `ActualJev`. Its first classification loads categories and relevant history from the open Actual budget; call `refresh()` after the budget changes.
|
|
4
|
+
|
|
5
|
+
```ts
|
|
6
|
+
import * as actual from '@actual-app/api';
|
|
7
|
+
import { TypeSafeClient } from '@typesafe-ai/sdk';
|
|
8
|
+
import { ActualJev } from 'actual-jev';
|
|
9
|
+
|
|
10
|
+
await actual.init({
|
|
11
|
+
serverURL: process.env.ACTUAL_SERVER_URL!,
|
|
12
|
+
password: process.env.ACTUAL_PASSWORD!,
|
|
13
|
+
dataDir: '.actual-data',
|
|
14
|
+
});
|
|
15
|
+
await actual.downloadBudget(process.env.ACTUAL_SYNC_ID!, {
|
|
16
|
+
password: process.env.ACTUAL_ENCRYPTION_PASSWORD,
|
|
17
|
+
});
|
|
18
|
+
const jev = new TypeSafeClient();
|
|
19
|
+
|
|
20
|
+
try {
|
|
21
|
+
const classifier = new ActualJev({ actual, jev });
|
|
22
|
+
const result = await classifier.classify({ payee_name: 'Fresh Market', amount: -2350 });
|
|
23
|
+
console.log(result.categoryId, result.confidence);
|
|
24
|
+
} finally {
|
|
25
|
+
await actual.shutdown();
|
|
26
|
+
}
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
You can instead supply categories and examples without an Actual client:
|
|
30
|
+
|
|
31
|
+
```ts
|
|
32
|
+
import { TypeSafeClient } from '@typesafe-ai/sdk';
|
|
33
|
+
import { ActualJev } from 'actual-jev';
|
|
34
|
+
|
|
35
|
+
const jev = new TypeSafeClient();
|
|
36
|
+
const classifier = new ActualJev({
|
|
37
|
+
jev,
|
|
38
|
+
categories: [{ id: 'groceries', name: 'Groceries', groupName: 'Food' }],
|
|
39
|
+
examples: [{ categoryId: 'groceries', payeeName: 'Fresh Market' }],
|
|
40
|
+
});
|
|
41
|
+
const result = await classifier.classify({ importedPayee: 'Fresh Market', amount: -2350 });
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Classification returns a suggestion and never updates Actual.
|
package/package.json
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "actual-jev",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Categorize Actual Budget transactions with TypeSafe Jev",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"packageManager": "pnpm@12.1.0",
|
|
7
|
+
"engines": {
|
|
8
|
+
"node": ">=24.10 <25"
|
|
9
|
+
},
|
|
10
|
+
"main": "./dist/index.js",
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"exports": {
|
|
13
|
+
".": {
|
|
14
|
+
"types": "./dist/index.d.ts",
|
|
15
|
+
"import": "./dist/index.js"
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
"bin": {
|
|
19
|
+
"actual-jev": "./dist/cli.js"
|
|
20
|
+
},
|
|
21
|
+
"files": [
|
|
22
|
+
"dist",
|
|
23
|
+
"README.md",
|
|
24
|
+
"docs",
|
|
25
|
+
".env.example"
|
|
26
|
+
],
|
|
27
|
+
"scripts": {
|
|
28
|
+
"build": "tsc -p tsconfig.json",
|
|
29
|
+
"prepack": "pnpm build",
|
|
30
|
+
"start": "node --import tsx src/cli.ts",
|
|
31
|
+
"test": "node --import tsx --test src/*.test.ts",
|
|
32
|
+
"lint": "eslint src",
|
|
33
|
+
"format": "prettier --write ."
|
|
34
|
+
},
|
|
35
|
+
"dependencies": {
|
|
36
|
+
"@actual-app/api": "^26.9.0",
|
|
37
|
+
"@inquirer/prompts": "^8.7.2",
|
|
38
|
+
"@inquirer/search": "^4.3.3",
|
|
39
|
+
"@typesafe-ai/sdk": "^0.6.0"
|
|
40
|
+
},
|
|
41
|
+
"devDependencies": {
|
|
42
|
+
"@eslint/js": "^10.0.1",
|
|
43
|
+
"@types/node": "^24.13.6",
|
|
44
|
+
"@typescript/native": "npm:typescript@^7.0.2",
|
|
45
|
+
"eslint": "^10.11.0",
|
|
46
|
+
"prettier": "^3.9.9",
|
|
47
|
+
"tsx": "^4.23.15",
|
|
48
|
+
"typescript": "npm:@typescript/typescript6@^6.0.2",
|
|
49
|
+
"typescript-eslint": "^8.70.1"
|
|
50
|
+
}
|
|
51
|
+
}
|