@mind-your-now/myn 0.8.2 → 0.8.4

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 (40) hide show
  1. package/README.md +105 -6
  2. package/dist/index.js +1 -1
  3. package/dist/src/tools/debrief.js +2 -2
  4. package/dist/src/tools/debrief.js.map +1 -1
  5. package/dist/src/tools/habits.js +2 -2
  6. package/dist/src/tools/habits.js.map +1 -1
  7. package/dist/src/tools/household.js +3 -3
  8. package/dist/src/tools/household.js.map +1 -1
  9. package/dist/src/tools/lists.js +2 -2
  10. package/dist/src/tools/lists.js.map +1 -1
  11. package/dist/src/tools/memory.js +1 -1
  12. package/dist/src/tools/memory.js.map +1 -1
  13. package/dist/src/tools/planning.js +1 -1
  14. package/dist/src/tools/planning.js.map +1 -1
  15. package/dist/src/tools/projects.js +4 -4
  16. package/dist/src/tools/projects.js.map +1 -1
  17. package/dist/src/tools/tasks.js +2 -2
  18. package/dist/src/tools/tasks.js.map +1 -1
  19. package/dist/src/tools/timers.js +1 -1
  20. package/dist/src/tools/timers.js.map +1 -1
  21. package/dist/src/validation.d.ts.map +1 -1
  22. package/dist/src/validation.js +3 -2
  23. package/dist/src/validation.js.map +1 -1
  24. package/openclaw.plugin.json +1 -1
  25. package/package.json +2 -2
  26. package/skills/myn/SKILL.md +12 -10
  27. package/skills/myn/references/briefing-api.md +11 -183
  28. package/skills/myn/references/calendar-api.md +177 -55
  29. package/skills/myn/references/debrief-api.md +182 -0
  30. package/skills/myn/references/habits-api.md +37 -55
  31. package/skills/myn/references/household-api.md +37 -14
  32. package/skills/myn/references/lists-api.md +80 -46
  33. package/skills/myn/references/memory-api.md +66 -34
  34. package/skills/myn/references/planning-api.md +58 -155
  35. package/skills/myn/references/profile-api.md +54 -61
  36. package/skills/myn/references/projects-api.md +13 -11
  37. package/skills/myn/references/search-api.md +20 -48
  38. package/skills/myn/references/tasks-api.md +47 -40
  39. package/skills/myn/references/timers-api.md +113 -52
  40. package/skills/myn/references/ynab-api.md +323 -0
@@ -6,6 +6,10 @@ Countdown timers, alarms, and Pomodoro sessions.
6
6
 
7
7
  `/api/v2/timers`
8
8
 
9
+ ## Actions
10
+
11
+ The `myn_timers` tool supports these actions: `create_countdown`, `create_alarm`, `list`, `cancel`, `snooze`, `pomodoro`.
12
+
9
13
  ## Endpoints
10
14
 
11
15
  ### List Active Timers
@@ -24,7 +28,7 @@ Returns all active timers for the current user.
24
28
  | `timers[].timerId` | UUID | Timer identifier |
25
29
  | `timers[].type` | string | `COUNTDOWN`, `ALARM`, or `POMODORO` |
26
30
  | `timers[].label` | string | User-defined label (nullable) |
27
- | `timers[].status` | string | Current status (e.g., `RUNNING`, `PAUSED`, `SNOOZED`, `RINGING`, `COMPLETED`) |
31
+ | `timers[].status` | string | Current status |
28
32
  | `timers[].duration` | number | Total duration in seconds (COUNTDOWN/POMODORO) |
29
33
  | `timers[].remaining` | number | Seconds remaining (COUNTDOWN/POMODORO) |
30
34
  | `timers[].endTime` | datetime | When the timer will fire (COUNTDOWN) |
@@ -40,15 +44,13 @@ curl -H "X-API-KEY: $MYN_API_KEY" \
40
44
  "$MYN_API_URL/api/v2/timers"
41
45
  ```
42
46
 
43
- ### Create Timer
47
+ ### Create Countdown Timer
44
48
 
45
49
  ```
46
- POST /api/v2/timers
50
+ POST /api/v2/timers/countdown
47
51
  ```
48
52
 
49
- Creates a new timer. The request body varies by timer type.
50
-
51
- #### Countdown Timer
53
+ **Body Parameters:**
52
54
 
53
55
  | Field | Type | Description |
54
56
  |-------|------|-------------|
@@ -56,9 +58,30 @@ Creates a new timer. The request body varies by timer type.
56
58
  | `duration` | number | **Required.** Duration in seconds |
57
59
  | `label` | string | Optional label |
58
60
 
61
+ **Tool Parameters:**
62
+
63
+ | Parameter | Type | Description |
64
+ |-----------|------|-------------|
65
+ | `duration` | number | Duration in seconds |
66
+ | `durationMinutes` | number | Duration in minutes (converted to seconds automatically) |
67
+ | `label` | string | Timer label/description |
68
+
69
+ One of `duration` or `durationMinutes` is required.
70
+
71
+ **Response Fields:**
72
+
73
+ | Field | Type | Description |
74
+ |-------|------|-------------|
75
+ | `timerId` | UUID | Timer identifier |
76
+ | `type` | string | `"COUNTDOWN"` |
77
+ | `duration` | number | Duration in seconds |
78
+ | `endTime` | datetime | When the timer will fire |
79
+ | `label` | string | Timer label (nullable) |
80
+ | `status` | string | `ACTIVE`, `PAUSED`, or `COMPLETED` |
81
+
59
82
  ```bash
60
83
  # 25-minute countdown
61
- curl -X POST "$MYN_API_URL/api/v2/timers" \
84
+ curl -X POST "$MYN_API_URL/api/v2/timers/countdown" \
62
85
  -H "X-API-KEY: $MYN_API_KEY" \
63
86
  -H "Content-Type: application/json" \
64
87
  -d '{
@@ -68,76 +91,67 @@ curl -X POST "$MYN_API_URL/api/v2/timers" \
68
91
  }'
69
92
  ```
70
93
 
71
- #### Alarm Timer
94
+ ### Create Alarm
95
+
96
+ ```
97
+ POST /api/v2/timers/alarm
98
+ ```
99
+
100
+ **Body Parameters:**
72
101
 
73
102
  | Field | Type | Description |
74
103
  |-------|------|-------------|
75
- | `type` | string | **Required.** `"ALARM"` |
104
+ | `name` | string | Alarm name (defaults to "Alarm" from label) |
76
105
  | `alarmTime` | datetime | **Required.** When the alarm should fire (ISO 8601) |
77
- | `label` | string | Optional label |
78
- | `recurrence` | string | Optional RRULE for repeating alarms |
79
- | `sound` | string | Optional alarm sound name |
106
+ | `recurrence` | string | Optional recurrence pattern (e.g., "daily", "weekdays") |
107
+ | `completionSound` | string | Optional alarm sound name |
108
+
109
+ **Response Fields:**
110
+
111
+ | Field | Type | Description |
112
+ |-------|------|-------------|
113
+ | `timerId` | UUID | Timer identifier |
114
+ | `type` | string | `"ALARM"` |
115
+ | `alarmTime` | datetime | When the alarm will fire |
116
+ | `label` | string | Alarm label (nullable) |
117
+ | `recurrence` | string | Recurrence pattern (nullable) |
118
+ | `status` | string | `ACTIVE`, `TRIGGERED`, or `SNOOZED` |
80
119
 
81
120
  ```bash
82
121
  # One-time alarm
83
- curl -X POST "$MYN_API_URL/api/v2/timers" \
122
+ curl -X POST "$MYN_API_URL/api/v2/timers/alarm" \
84
123
  -H "X-API-KEY: $MYN_API_KEY" \
85
124
  -H "Content-Type: application/json" \
86
125
  -d '{
87
- "type": "ALARM",
88
- "alarmTime": "2026-03-02T07:00:00Z",
89
- "label": "Morning wake-up"
126
+ "name": "Morning wake-up",
127
+ "alarmTime": "2026-03-02T07:00:00Z"
90
128
  }'
91
129
 
92
130
  # Recurring weekday alarm
93
- curl -X POST "$MYN_API_URL/api/v2/timers" \
131
+ curl -X POST "$MYN_API_URL/api/v2/timers/alarm" \
94
132
  -H "X-API-KEY: $MYN_API_KEY" \
95
133
  -H "Content-Type: application/json" \
96
134
  -d '{
97
- "type": "ALARM",
135
+ "name": "Standup reminder",
98
136
  "alarmTime": "2026-03-02T08:30:00Z",
99
- "label": "Standup reminder",
100
137
  "recurrence": "FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR"
101
138
  }'
102
139
  ```
103
140
 
104
- #### Pomodoro Timer
105
-
106
- | Field | Type | Description |
107
- |-------|------|-------------|
108
- | `type` | string | **Required.** `"POMODORO"` |
109
- | `workDuration` | number | **Required.** Work phase duration in seconds |
110
- | `breakDuration` | number | **Required.** Short break duration in seconds |
111
- | `longBreakDuration` | number | **Required.** Long break duration in seconds (after all sessions) |
112
- | `sessions` | number | Number of work sessions before long break (default: 4) |
113
- | `autoStart` | boolean | Auto-start next phase (default: false) |
114
- | `label` | string | Optional label |
115
-
116
- ```bash
117
- # Standard Pomodoro: 25min work, 5min break, 15min long break, 4 sessions
118
- curl -X POST "$MYN_API_URL/api/v2/timers" \
119
- -H "X-API-KEY: $MYN_API_KEY" \
120
- -H "Content-Type: application/json" \
121
- -d '{
122
- "type": "POMODORO",
123
- "workDuration": 1500,
124
- "breakDuration": 300,
125
- "longBreakDuration": 900,
126
- "sessions": 4,
127
- "autoStart": true,
128
- "label": "Deep work block"
129
- }'
130
- ```
131
-
132
141
  ### Cancel Timer
133
142
 
134
143
  ```
135
- DELETE /api/v2/timers/{timerId}
144
+ POST /api/v2/timers/{timerId}/cancel
136
145
  ```
137
146
 
147
+ **Uses read-before-write guard** -- reads timer state hash before cancelling.
148
+
149
+ **Response:** `{ timerId, status }`
150
+
138
151
  ```bash
139
- curl -X DELETE "$MYN_API_URL/api/v2/timers/550e8400-e29b-41d4-a716-446655440000" \
140
- -H "X-API-KEY: $MYN_API_KEY"
152
+ curl -X POST "$MYN_API_URL/api/v2/timers/TIMER_ID/cancel" \
153
+ -H "X-API-KEY: $MYN_API_KEY" \
154
+ -H "X-MYN-State-Hash: abc123"
141
155
  ```
142
156
 
143
157
  ### Snooze Timer
@@ -148,6 +162,8 @@ POST /api/v2/timers/{timerId}/snooze
148
162
 
149
163
  Snoozes a ringing alarm or timer.
150
164
 
165
+ **Uses read-before-write guard** -- reads timer state hash before snoozing.
166
+
151
167
  **Body Parameters:**
152
168
 
153
169
  | Field | Type | Description |
@@ -163,9 +179,54 @@ Snoozes a ringing alarm or timer.
163
179
  | `status` | string | `"SNOOZED"` |
164
180
 
165
181
  ```bash
166
- # Snooze for 10 minutes
167
- curl -X POST "$MYN_API_URL/api/v2/timers/550e8400-e29b-41d4-a716-446655440000/snooze" \
182
+ curl -X POST "$MYN_API_URL/api/v2/timers/TIMER_ID/snooze" \
168
183
  -H "X-API-KEY: $MYN_API_KEY" \
184
+ -H "X-MYN-State-Hash: abc123" \
169
185
  -H "Content-Type: application/json" \
170
186
  -d '{"snoozeMinutes": 10}'
171
187
  ```
188
+
189
+ ### Create Pomodoro Timer
190
+
191
+ ```
192
+ POST /api/v2/timers/countdown
193
+ ```
194
+
195
+ Creates a Pomodoro timer (uses the countdown endpoint with `type: "POMODORO"`).
196
+
197
+ **Body Parameters:**
198
+
199
+ | Field | Type | Description |
200
+ |-------|------|-------------|
201
+ | `type` | string | **Required.** `"POMODORO"` |
202
+ | `workDuration` | number | Work phase in seconds (tool accepts minutes, auto-converts) |
203
+ | `breakDuration` | number | Short break in seconds (tool accepts minutes, auto-converts) |
204
+ | `longBreakDuration` | number | Long break in seconds (tool accepts minutes, auto-converts) |
205
+ | `sessions` | number | Number of work sessions (default: 4) |
206
+ | `autoStart` | boolean | Auto-start next phase (default: false) |
207
+ | `label` | string | Optional label |
208
+
209
+ **Tool Parameters (in minutes):**
210
+
211
+ | Parameter | Type | Default | Description |
212
+ |-----------|------|---------|-------------|
213
+ | `workDuration` | number | 25 | Work duration in minutes |
214
+ | `breakDuration` | number | 5 | Break duration in minutes |
215
+ | `longBreakDuration` | number | 15 | Long break duration in minutes |
216
+ | `sessions` | number | 4 | Number of pomodoro sessions |
217
+ | `autoStart` | boolean | false | Auto-start next phase |
218
+
219
+ ```bash
220
+ curl -X POST "$MYN_API_URL/api/v2/timers/countdown" \
221
+ -H "X-API-KEY: $MYN_API_KEY" \
222
+ -H "Content-Type: application/json" \
223
+ -d '{
224
+ "type": "POMODORO",
225
+ "workDuration": 1500,
226
+ "breakDuration": 300,
227
+ "longBreakDuration": 900,
228
+ "sessions": 4,
229
+ "autoStart": true,
230
+ "label": "Deep work block"
231
+ }'
232
+ ```
@@ -0,0 +1,323 @@
1
+ # YNAB API
2
+
3
+ YNAB (You Need A Budget) integration for budget management, transactions, scheduled transactions, analytics, and category management.
4
+
5
+ ## Base Path
6
+
7
+ `/api/v1/ynab`
8
+
9
+ ## Endpoints
10
+
11
+ ### Budget & Accounts
12
+
13
+ #### Budget Overview
14
+
15
+ ```
16
+ GET /api/v1/ynab/budget/overview
17
+ ```
18
+
19
+ Returns the overall budget summary including ready-to-assign amount, total income, total budgeted, and total activity.
20
+
21
+ #### List Categories
22
+
23
+ ```
24
+ GET /api/v1/ynab/budget/categories
25
+ ```
26
+
27
+ Returns all category groups and their categories with balances, budgeted amounts, and goal information.
28
+
29
+ #### Category Balance (Search)
30
+
31
+ ```
32
+ GET /api/v1/ynab/budget/categories/search?query={categoryName}
33
+ ```
34
+
35
+ Fuzzy-searches for a category by name and returns its balance and details.
36
+
37
+ #### Account Balances
38
+
39
+ ```
40
+ GET /api/v1/ynab/budget/accounts
41
+ ```
42
+
43
+ Returns all accounts grouped by type (checking, savings, creditCards, loans) with balances and transfer payee IDs.
44
+
45
+ #### Set Budget Amount
46
+
47
+ ```
48
+ PATCH /api/v1/ynab/budget/categories/{categoryId}/budget
49
+ ```
50
+
51
+ **Body:**
52
+
53
+ | Field | Type | Description |
54
+ |-------|------|-------------|
55
+ | `budgetedDollars` | number | Amount in dollars to budget for the category |
56
+ | `month` | string | Budget month in YYYY-MM format (defaults to current month) |
57
+
58
+ #### Set Category Goal
59
+
60
+ ```
61
+ PATCH /api/v1/ynab/budget/categories/{categoryId}/goal
62
+ ```
63
+
64
+ **Body:**
65
+
66
+ | Field | Type | Description |
67
+ |-------|------|-------------|
68
+ | `goalType` | string | Goal type: `TB`, `TBD`, `MF`, `NEED` |
69
+ | `goalTargetDollars` | number | Goal target in dollars |
70
+ | `goalTargetMonth` | string | Target month YYYY-MM (for TBD goals, appends `-01` automatically) |
71
+
72
+ #### Goal Progress
73
+
74
+ ```
75
+ GET /api/v1/ynab/budget/categories
76
+ ```
77
+
78
+ Same as list_categories; goal progress fields are included in category data.
79
+
80
+ #### Budget Months
81
+
82
+ ```
83
+ GET /api/v1/ynab/budget/months
84
+ ```
85
+
86
+ Returns available budget months with summary data.
87
+
88
+ #### Search Payees
89
+
90
+ ```
91
+ GET /api/v1/ynab/budget/payees/search?query={payeeName}
92
+ GET /api/v1/ynab/budget/payees
93
+ ```
94
+
95
+ Search for payees by name (fuzzy match), or list all payees if no query is provided.
96
+
97
+ ### Transactions
98
+
99
+ #### Create Transaction
100
+
101
+ ```
102
+ POST /api/v1/ynab/transactions
103
+ ```
104
+
105
+ **Body:**
106
+
107
+ | Field | Type | Description |
108
+ |-------|------|-------------|
109
+ | `accountId` | string | **Required.** YNAB account ID |
110
+ | `amountMilliunits` | number | **Required.** Amount in milliunits (dollars * 1000, negative for expenses) |
111
+ | `date` | string | **Required.** Date YYYY-MM-DD (defaults to today) |
112
+ | `payeeName` | string | Payee name (required if no payeeId) |
113
+ | `payeeId` | string | Payee ID (for transfers, use target account's transferPayeeId) |
114
+ | `categoryId` | string | Category ID (resolved from categoryName by the tool) |
115
+ | `memo` | string | Optional memo |
116
+ | `cleared` | string | `cleared`, `uncleared`, or `reconciled` |
117
+
118
+ The tool automatically performs duplicate detection by checking for existing transactions with the same amount and date.
119
+
120
+ #### Create Transactions Bulk
121
+
122
+ ```
123
+ POST /api/v1/ynab/transactions/bulk
124
+ ```
125
+
126
+ **Body:** `{ transactions: [{ accountId, payeeName, amount, date, categoryId, memo? }] }`
127
+
128
+ Amounts are in milliunits. Bypasses the single-transaction duplicate check.
129
+
130
+ #### List Transactions
131
+
132
+ ```
133
+ GET /api/v1/ynab/transactions
134
+ GET /api/v1/ynab/transactions?sinceDate={YYYY-MM-DD}
135
+ ```
136
+
137
+ Returns transactions, optionally filtered by date.
138
+
139
+ #### Update Transaction
140
+
141
+ ```
142
+ PUT /api/v1/ynab/transactions/{transactionId}
143
+ ```
144
+
145
+ **Body:** Any combination of `accountId`, `payeeName`, `payeeId`, `amountMilliunits`, `date`, `memo`, `cleared`, `flagColor`, `categoryId`.
146
+
147
+ #### Delete Transaction
148
+
149
+ ```
150
+ DELETE /api/v1/ynab/transactions/{transactionId}
151
+ ```
152
+
153
+ #### Split Transaction
154
+
155
+ ```
156
+ PUT /api/v1/ynab/transactions/{transactionId}
157
+ ```
158
+
159
+ Updates a transaction with `subtransactions` to split it across multiple categories. The tool validates that split amounts sum to the original transaction amount.
160
+
161
+ **Body:** `{ subtransactions: [{ amount, categoryId, memo? }] }`
162
+
163
+ ### Scheduled Transactions & Subscriptions
164
+
165
+ #### List Scheduled Transactions
166
+
167
+ ```
168
+ GET /api/v1/ynab/scheduled-transactions
169
+ ```
170
+
171
+ #### Create Scheduled Transaction
172
+
173
+ ```
174
+ POST /api/v1/ynab/scheduled-transactions
175
+ ```
176
+
177
+ **Body:**
178
+
179
+ | Field | Type | Description |
180
+ |-------|------|-------------|
181
+ | `accountId` | string | **Required.** YNAB account ID |
182
+ | `payeeName` | string | **Required.** Payee name |
183
+ | `amountMilliunits` | number | **Required.** Amount in milliunits |
184
+ | `dateFirst` | string | **Required.** First occurrence date YYYY-MM-DD |
185
+ | `dateNext` | string | Next occurrence date (defaults to dateFirst) |
186
+ | `frequency` | string | **Required.** Recurrence: `never`, `daily`, `weekly`, `everyOtherWeek`, `twiceAMonth`, `every4Weeks`, `monthly`, `everyOtherMonth`, `every3Months`, `every4Months`, `twiceAYear`, `yearly`, `everyOtherYear` |
187
+ | `categoryId` | string | Category ID |
188
+ | `memo` | string | Optional memo |
189
+
190
+ #### Update Scheduled Transaction
191
+
192
+ ```
193
+ PUT /api/v1/ynab/scheduled-transactions/{transactionId}
194
+ ```
195
+
196
+ **Body:** Any combination of `payeeName`, `amountMilliunits`, `dateNext`, `frequency`, `memo`, `categoryId`.
197
+
198
+ #### Delete Scheduled Transaction
199
+
200
+ ```
201
+ DELETE /api/v1/ynab/scheduled-transactions/{transactionId}
202
+ ```
203
+
204
+ #### Subscriptions View
205
+
206
+ ```
207
+ GET /api/v1/ynab/subscriptions
208
+ ```
209
+
210
+ Returns a view of recurring scheduled transactions categorized as subscriptions.
211
+
212
+ #### Upcoming Bills
213
+
214
+ ```
215
+ GET /api/v1/ynab/scheduled?days={days}
216
+ ```
217
+
218
+ Returns scheduled transactions due within the specified number of days (default: 7).
219
+
220
+ ### Analytics
221
+
222
+ #### Spending Insights
223
+
224
+ ```
225
+ GET /api/v1/ynab/analytics/spending?months={months}&category={categoryName}
226
+ ```
227
+
228
+ Returns spending breakdown by category. Optional category filter for drilling into a specific category.
229
+
230
+ #### Payee Analysis
231
+
232
+ ```
233
+ GET /api/v1/ynab/analytics/payees?months={months}
234
+ ```
235
+
236
+ Returns spending analysis by payee.
237
+
238
+ #### Spending Trends
239
+
240
+ ```
241
+ GET /api/v1/ynab/analytics/trends?months={months}
242
+ ```
243
+
244
+ Returns month-over-month spending trends.
245
+
246
+ #### Net Worth
247
+
248
+ ```
249
+ GET /api/v1/ynab/analytics/net-worth
250
+ ```
251
+
252
+ Returns net worth calculation across all accounts.
253
+
254
+ #### Debt Tracking
255
+
256
+ ```
257
+ GET /api/v1/ynab/analytics/debt
258
+ ```
259
+
260
+ Returns debt tracking information for loan and credit card accounts.
261
+
262
+ ### Category Management
263
+
264
+ #### Create Category Group
265
+
266
+ ```
267
+ POST /api/v1/ynab/budget/category-groups
268
+ ```
269
+
270
+ **Body:** `{ name: "Group Name" }`
271
+
272
+ #### Create Category
273
+
274
+ ```
275
+ POST /api/v1/ynab/budget/categories
276
+ ```
277
+
278
+ **Body:** `{ name: "Category Name", categoryGroupId: "group-id", note?: "optional note" }`
279
+
280
+ The `categoryGroupId` can be resolved from `groupName` by fuzzy match against existing groups.
281
+
282
+ #### Rename Category
283
+
284
+ ```
285
+ PATCH /api/v1/ynab/budget/categories/{categoryId}/details
286
+ ```
287
+
288
+ **Body:** `{ name: "New Name" }`
289
+
290
+ #### Move Category
291
+
292
+ ```
293
+ PATCH /api/v1/ynab/budget/categories/{categoryId}/details
294
+ ```
295
+
296
+ **Body:** `{ categoryGroupId: "target-group-id" }`
297
+
298
+ Moves a category to a different category group.
299
+
300
+ #### Rename Category Group
301
+
302
+ ```
303
+ PATCH /api/v1/ynab/budget/category-groups/{groupId}
304
+ ```
305
+
306
+ **Body:** `{ name: "New Group Name" }`
307
+
308
+ ### Connection
309
+
310
+ #### Connection Status
311
+
312
+ ```
313
+ GET /api/v1/ynab/status
314
+ ```
315
+
316
+ Returns YNAB connection status.
317
+
318
+ ## Notes
319
+
320
+ - All monetary amounts from the YNAB API are in milliunits (divide by 1000 for dollars). The tool automatically converts these to formatted dollar strings in responses.
321
+ - The tool accepts amounts in dollars (e.g., `-45.50` for a $45.50 expense) and converts them to milliunits internally.
322
+ - Category names are resolved via fuzzy search against existing categories. Always use `list_categories` first to find the correct name.
323
+ - `categoryName` is required for all non-transfer transactions to prevent uncategorized entries in YNAB.