ynabro 1.0.0 → 2.0.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ynabro",
3
- "version": "1.0.0",
3
+ "version": "2.0.0",
4
4
  "description": "A clean, agent-friendly YNAB client library for LLMs and coding agents",
5
5
  "type": "module",
6
6
  "exports": {
@@ -15,18 +15,10 @@
15
15
  "dist",
16
16
  "assets"
17
17
  ],
18
- "workspaces": [
19
- "packages/*"
20
- ],
21
18
  "scripts": {
22
19
  "build": "tsc -p tsconfig.build.json",
23
20
  "test": "vitest run",
24
- "test:watch": "vitest",
25
- "lint": "biome check .",
26
- "lint:fix": "biome check --write .",
27
- "format": "biome format --write .",
28
- "typecheck": "tsc --noEmit",
29
- "check": "npm run lint && npm run typecheck && npm run test"
21
+ "typecheck": "tsc --noEmit"
30
22
  },
31
23
  "keywords": [
32
24
  "ynab",
@@ -38,17 +30,14 @@
38
30
  "license": "MIT",
39
31
  "repository": {
40
32
  "type": "git",
41
- "url": "https://github.com/jmcombs/ynabro"
33
+ "url": "https://github.com/jmcombs/ynabro",
34
+ "directory": "packages/ynabro"
42
35
  },
43
36
  "homepage": "https://github.com/jmcombs/ynabro#readme",
44
37
  "engines": {
45
38
  "node": ">=22.0.0"
46
39
  },
47
40
  "devDependencies": {
48
- "@biomejs/biome": "^2.4.15",
49
- "@types/node": "^25.8.0",
50
- "typescript": "^6.0.3",
51
- "vitest": "^4.1.6",
52
41
  "ynab": "^4.1.0"
53
42
  }
54
43
  }
@@ -1,20 +0,0 @@
1
- export interface TransactionModuleState {
2
- last_knowledge_of_server: number | null;
3
- auto_approve_enabled: boolean;
4
- successful_reviews: number;
5
- notes: string[];
6
- patterns: {
7
- frequent_mismatches: Array<{
8
- local_payee: string;
9
- matched_payee: string;
10
- count: number;
11
- last_seen: string;
12
- }>;
13
- amount_tolerance_cents: number;
14
- };
15
- }
16
- export declare function getTransactionModuleState(): TransactionModuleState;
17
- export declare function updateTransactionModuleState(updates: Partial<TransactionModuleState>): void;
18
- export declare function addFrequentMismatch(localPayee: string, matchedPayee: string): void;
19
- export declare function recordSuccessfulReview(): void;
20
- //# sourceMappingURL=transactionState.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"transactionState.d.ts","sourceRoot":"","sources":["../../src/state/transactionState.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,sBAAsB;IACrC,wBAAwB,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,oBAAoB,EAAE,OAAO,CAAC;IAC9B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,EAAE;QACR,mBAAmB,EAAE,KAAK,CAAC;YACzB,WAAW,EAAE,MAAM,CAAC;YACpB,aAAa,EAAE,MAAM,CAAC;YACtB,KAAK,EAAE,MAAM,CAAC;YACd,SAAS,EAAE,MAAM,CAAC;SACnB,CAAC,CAAC;QACH,sBAAsB,EAAE,MAAM,CAAC;KAChC,CAAC;CACH;AAmBD,wBAAgB,yBAAyB,IAAI,sBAAsB,CAQlE;AAED,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,OAAO,CAAC,sBAAsB,CAAC,QAMzC;AAED,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,QAoB3E;AAED,wBAAgB,sBAAsB,SAIrC"}
@@ -1,58 +0,0 @@
1
- import fs from "node:fs";
2
- import path from "node:path";
3
- const STATE_DIR = ".ynabro";
4
- const STATE_FILE = path.join(STATE_DIR, "transactions-state.json");
5
- const DEFAULT_STATE = {
6
- last_knowledge_of_server: null,
7
- auto_approve_enabled: false,
8
- successful_reviews: 0,
9
- notes: [],
10
- patterns: {
11
- frequent_mismatches: [],
12
- amount_tolerance_cents: 50,
13
- },
14
- };
15
- function ensureStateDir() {
16
- if (!fs.existsSync(STATE_DIR)) {
17
- fs.mkdirSync(STATE_DIR, { recursive: true });
18
- }
19
- }
20
- export function getTransactionModuleState() {
21
- ensureStateDir();
22
- if (!fs.existsSync(STATE_FILE)) {
23
- fs.writeFileSync(STATE_FILE, JSON.stringify(DEFAULT_STATE, null, 2));
24
- return { ...DEFAULT_STATE };
25
- }
26
- const raw = fs.readFileSync(STATE_FILE, "utf-8");
27
- return JSON.parse(raw);
28
- }
29
- export function updateTransactionModuleState(updates) {
30
- const current = getTransactionModuleState();
31
- const newState = { ...current, ...updates };
32
- ensureStateDir();
33
- fs.writeFileSync(STATE_FILE, JSON.stringify(newState, null, 2));
34
- }
35
- export function addFrequentMismatch(localPayee, matchedPayee) {
36
- const state = getTransactionModuleState();
37
- const existing = state.patterns.frequent_mismatches.find((m) => m.local_payee.toLowerCase() === localPayee.toLowerCase());
38
- if (existing) {
39
- existing.count += 1;
40
- existing.last_seen = new Date().toISOString().split("T")[0];
41
- existing.matched_payee = matchedPayee; // update in case it changed
42
- }
43
- else {
44
- state.patterns.frequent_mismatches.push({
45
- local_payee: localPayee,
46
- matched_payee: matchedPayee,
47
- count: 1,
48
- last_seen: new Date().toISOString().split("T")[0],
49
- });
50
- }
51
- updateTransactionModuleState(state);
52
- }
53
- export function recordSuccessfulReview() {
54
- const state = getTransactionModuleState();
55
- state.successful_reviews += 1;
56
- updateTransactionModuleState(state);
57
- }
58
- //# sourceMappingURL=transactionState.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"transactionState.js","sourceRoot":"","sources":["../../src/state/transactionState.ts"],"names":[],"mappings":"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"}
@@ -1,7 +0,0 @@
1
- /**
2
- * Records a repeated mismatch between a local payee and a matched payee.
3
- */
4
- export declare function addFrequentMismatch(localPayee: string, matchedPayee: string): Promise<{
5
- success: boolean;
6
- }>;
7
- //# sourceMappingURL=addFrequentMismatch.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"addFrequentMismatch.d.ts","sourceRoot":"","sources":["../../src/tools/addFrequentMismatch.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM;;GAIrB"}
@@ -1,9 +0,0 @@
1
- import { addFrequentMismatch as add } from "../state/transactionState.js";
2
- /**
3
- * Records a repeated mismatch between a local payee and a matched payee.
4
- */
5
- export async function addFrequentMismatch(localPayee, matchedPayee) {
6
- add(localPayee, matchedPayee);
7
- return { success: true };
8
- }
9
- //# sourceMappingURL=addFrequentMismatch.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"addFrequentMismatch.js","sourceRoot":"","sources":["../../src/tools/addFrequentMismatch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,IAAI,GAAG,EAAE,MAAM,8BAA8B,CAAC;AAE1E;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,UAAkB,EAClB,YAAoB;IAEpB,GAAG,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;IAC9B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC3B,CAAC"}
@@ -1,10 +0,0 @@
1
- /**
2
- * Returns known frequent mismatches.
3
- */
4
- export declare function getFrequentMismatches(): Promise<{
5
- local_payee: string;
6
- matched_payee: string;
7
- count: number;
8
- last_seen: string;
9
- }[]>;
10
- //# sourceMappingURL=getFrequentMismatches.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"getFrequentMismatches.d.ts","sourceRoot":"","sources":["../../src/tools/getFrequentMismatches.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,wBAAsB,qBAAqB;;;;;KAG1C"}
@@ -1,9 +0,0 @@
1
- import { getTransactionModuleState } from "../state/transactionState.js";
2
- /**
3
- * Returns known frequent mismatches.
4
- */
5
- export async function getFrequentMismatches() {
6
- const state = getTransactionModuleState();
7
- return state.patterns.frequent_mismatches;
8
- }
9
- //# sourceMappingURL=getFrequentMismatches.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"getFrequentMismatches.js","sourceRoot":"","sources":["../../src/tools/getFrequentMismatches.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,8BAA8B,CAAC;AAEzE;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB;IACzC,MAAM,KAAK,GAAG,yBAAyB,EAAE,CAAC;IAC1C,OAAO,KAAK,CAAC,QAAQ,CAAC,mBAAmB,CAAC;AAC5C,CAAC"}
@@ -1,5 +0,0 @@
1
- /**
2
- * Returns the current state of the transactions module.
3
- */
4
- export declare function getTransactionModuleState(): Promise<import("../state/transactionState.js").TransactionModuleState>;
5
- //# sourceMappingURL=getTransactionModuleState.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"getTransactionModuleState.d.ts","sourceRoot":"","sources":["../../src/tools/getTransactionModuleState.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,wBAAsB,yBAAyB,2EAE9C"}
@@ -1,8 +0,0 @@
1
- import { getTransactionModuleState as getState } from "../state/transactionState.js";
2
- /**
3
- * Returns the current state of the transactions module.
4
- */
5
- export async function getTransactionModuleState() {
6
- return getState();
7
- }
8
- //# sourceMappingURL=getTransactionModuleState.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"getTransactionModuleState.js","sourceRoot":"","sources":["../../src/tools/getTransactionModuleState.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,IAAI,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAErF;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,yBAAyB;IAC7C,OAAO,QAAQ,EAAE,CAAC;AACpB,CAAC"}
@@ -1,7 +0,0 @@
1
- /**
2
- * Records a successful manual review (used to track when to suggest auto-approval).
3
- */
4
- export declare function recordSuccessfulReview(): Promise<{
5
- success: boolean;
6
- }>;
7
- //# sourceMappingURL=recordSuccessfulReview.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"recordSuccessfulReview.d.ts","sourceRoot":"","sources":["../../src/tools/recordSuccessfulReview.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,wBAAsB,sBAAsB;;GAG3C"}
@@ -1,9 +0,0 @@
1
- import { recordSuccessfulReview as record } from "../state/transactionState.js";
2
- /**
3
- * Records a successful manual review (used to track when to suggest auto-approval).
4
- */
5
- export async function recordSuccessfulReview() {
6
- record();
7
- return { success: true };
8
- }
9
- //# sourceMappingURL=recordSuccessfulReview.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"recordSuccessfulReview.js","sourceRoot":"","sources":["../../src/tools/recordSuccessfulReview.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,IAAI,MAAM,EAAE,MAAM,8BAA8B,CAAC;AAEhF;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB;IAC1C,MAAM,EAAE,CAAC;IACT,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC3B,CAAC"}
@@ -1,8 +0,0 @@
1
- /**
2
- * Enables or disables automatic approval of confident matches.
3
- */
4
- export declare function setAutoApproveEnabled(enabled: boolean): Promise<{
5
- success: boolean;
6
- auto_approve_enabled: boolean;
7
- }>;
8
- //# sourceMappingURL=setAutoApproveEnabled.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"setAutoApproveEnabled.d.ts","sourceRoot":"","sources":["../../src/tools/setAutoApproveEnabled.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,OAAO;;;GAG3D"}
@@ -1,9 +0,0 @@
1
- import { updateTransactionModuleState } from "../state/transactionState.js";
2
- /**
3
- * Enables or disables automatic approval of confident matches.
4
- */
5
- export async function setAutoApproveEnabled(enabled) {
6
- updateTransactionModuleState({ auto_approve_enabled: enabled });
7
- return { success: true, auto_approve_enabled: enabled };
8
- }
9
- //# sourceMappingURL=setAutoApproveEnabled.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"setAutoApproveEnabled.js","sourceRoot":"","sources":["../../src/tools/setAutoApproveEnabled.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,4BAA4B,EAAE,MAAM,8BAA8B,CAAC;AAE5E;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,OAAgB;IAC1D,4BAA4B,CAAC,EAAE,oBAAoB,EAAE,OAAO,EAAE,CAAC,CAAC;IAChE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,oBAAoB,EAAE,OAAO,EAAE,CAAC;AAC1D,CAAC"}