@squirreljetpack/im-dynamic 0.3.0 β 0.3.1
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/CHANGELOG.md +23 -321
- package/README.md +186 -65
- package/npm-shrinkwrap.json +2 -2
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,321 +1,23 @@
|
|
|
1
|
-
## [0.3.
|
|
2
|
-
|
|
3
|
-
### π Features
|
|
4
|
-
|
|
5
|
-
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
-
|
|
16
|
-
`
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
- `sync_once` lands the outbox, the domain rows, the cursor and the
|
|
25
|
-
verdict reconciliation in one transaction, so an interrupted push
|
|
26
|
-
cannot leave a half-applied batch.
|
|
27
|
-
- The existence cell folds monotonically: a stale create can no longer
|
|
28
|
-
resurrect an entity another device deleted, and a create the server
|
|
29
|
-
rejected leaves no cells behind in the log.
|
|
30
|
-
- `clock_ahead` restamps the device forward against the server clock and
|
|
31
|
-
resets its last emitted stamp, so later edits from that device keep
|
|
32
|
-
winning last-writer-wins.
|
|
33
|
-
- Editing a mood's body or a tracker's mood link queues only the cells
|
|
34
|
-
that changed.
|
|
35
|
-
- Pull is bounded and reports `has_more`, so a long log pages instead of
|
|
36
|
-
arriving in one response.
|
|
37
|
-
|
|
38
|
-
### π₯ Breaking changes
|
|
39
|
-
|
|
40
|
-
- `tracker.time` is required: a create without it is rejected as
|
|
41
|
-
`shape`.
|
|
42
|
-
- `_sync_events` carries its coalescing uniqueness in the table
|
|
43
|
-
definition and no longer stores `image`. Databases from earlier builds
|
|
44
|
-
are not migrated: delete the database file and sign in to rebuild from
|
|
45
|
-
the log.
|
|
46
|
-
|
|
47
|
-
## [0.2.11] - 2026-11-02
|
|
48
|
-
|
|
49
|
-
### π Features
|
|
50
|
-
|
|
51
|
-
- `im :c mm` opens the matchmaker render config (`mm.toml`) in
|
|
52
|
-
`$VISUAL`/`$EDITOR`, alongside the config, `moods` and `colors` targets.
|
|
53
|
-
- Log entries (moods, trackers, todo completions) store the UTC offset and
|
|
54
|
-
the location string (the system IANA name, or empty when it has none) in
|
|
55
|
-
effect where they were written. The today view groups log entities by their
|
|
56
|
-
recorded **civil day** and renders their recorded civil time; ordering stays
|
|
57
|
-
absolute. Mood/tracker previews show the differing location and wall-clock
|
|
58
|
-
shift under the timestamp; task previews append the same parts inline to
|
|
59
|
-
`last:` as `prev:`.
|
|
60
|
-
- Tracker interval anchors are unzoned civil datetimes resolved in the current
|
|
61
|
-
local zone. Replace-mode slots and cumulative sums assign foreign logs by
|
|
62
|
-
their recorded wall clock, so an entry stays in the same civil slot when
|
|
63
|
-
viewed from another zone.
|
|
64
|
-
- Replace-mode null trackers store their absolute seconds from the interval
|
|
65
|
-
start in the entry payload; color and the strict when-zone use that stored
|
|
66
|
-
position.
|
|
67
|
-
- Explicit todo completions join the today view on their civil completion day.
|
|
68
|
-
`B` now merges explicitly completed scheduled tasks on that day instead of on
|
|
69
|
-
an overlapping availability window.
|
|
70
|
-
|
|
71
|
-
### π₯ Breaking changes
|
|
72
|
-
|
|
73
|
-
- Sync vocabulary is version 4: `tz_offset` (required int) and `location`
|
|
74
|
-
(required text; empty when the system has no name) on mood, tracker and
|
|
75
|
-
completion. Pre-v4 creates lack the
|
|
76
|
-
location or offset and are intentionally unbuildable; reset the sync log
|
|
77
|
-
when replaying one.
|
|
78
|
-
- Databases from earlier builds are not migrated. Delete the database file and
|
|
79
|
-
sign in to rebuild from the log. Tracker configs must drop the `Z`/numeric
|
|
80
|
-
offset from interval anchors.
|
|
81
|
-
|
|
82
|
-
## [0.2.10] - 2026-10-31
|
|
83
|
-
|
|
84
|
-
### π Features
|
|
85
|
-
|
|
86
|
-
- `im :sync --reset` asks before it discards local changes the server never
|
|
87
|
-
received; `--force` skips the question, and an idle database rebuilds without
|
|
88
|
-
a prompt.
|
|
89
|
-
- Sync is versioned end to end. A cursor names the log it indexes, and the
|
|
90
|
-
client and worker exchange the envelope `protocol` and cell `version` on
|
|
91
|
-
every round: a cursor minted by another log, one past the end of this log, or
|
|
92
|
-
a peer that speaks another version is refused instead of merging unrelated
|
|
93
|
-
histories or skipping what it cannot read. `im :sync status` prints the log,
|
|
94
|
-
cursor version and both protocol numbers.
|
|
95
|
-
|
|
96
|
-
### π Bug Fixes
|
|
97
|
-
|
|
98
|
-
- A task's start time is required, and an edit can no longer clear the column
|
|
99
|
-
that defines a task's kind. A scheduled task's window opens at that start, a
|
|
100
|
-
recurring task's intervals tile from it, and a oneshot is stamped with it at
|
|
101
|
-
creation; clearing the duration or interval that goes with it is refused
|
|
102
|
-
instead of silently reclassifying the task (and with it its availability,
|
|
103
|
-
view membership and completion scope).
|
|
104
|
-
- An end time is cleared by a blank answer (or `never`/`none`) in both the
|
|
105
|
-
create and edit menus; a blank previously kept the old value.
|
|
106
|
-
|
|
107
|
-
### π₯ Breaking changes
|
|
108
|
-
|
|
109
|
-
- A task create must carry `start_time`, so the cell vocabulary is now version
|
|
110
|
-
2. A peer that speaks another version refuses the round rather than skip the
|
|
111
|
-
cell, and v0.2.9 and earlier clients send no version at all: redeploy the
|
|
112
|
-
worker and upgrade the client together.
|
|
113
|
-
- Databases from earlier builds are not migrated: a schema change means
|
|
114
|
-
deleting the database file, then signing in to rebuild from the log.
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
## [0.2.9] - 2026-10-30
|
|
118
|
-
|
|
119
|
-
### π Features
|
|
120
|
-
|
|
121
|
-
- The recurring creation menu can edit start time, interval, and available
|
|
122
|
-
duration, and the scheduled menu start time and available duration, so a
|
|
123
|
-
value typed on the way in is corrected without cancelling. A duration at or
|
|
124
|
-
beyond the interval means unbounded availability (`always`) instead of a
|
|
125
|
-
validation error, editing the interval re-clamps the duration, and a blank
|
|
126
|
-
answer keeps a scheduled task's current duration.
|
|
127
|
-
|
|
128
|
-
### π Bug Fixes
|
|
129
|
-
|
|
130
|
-
- Today view: completed-on rows merge per interval instead of per task, so a
|
|
131
|
-
completion logged in an interval without an availability window β before a
|
|
132
|
-
moved-forward `start_time`, say β is no longer dropped when the task also
|
|
133
|
-
has window rows. Each row's sum, `last:` and time label are scoped to its
|
|
134
|
-
own interval.
|
|
135
|
-
|
|
136
|
-
### π₯ Breaking changes
|
|
137
|
-
|
|
138
|
-
- Utility commands moved under `:tool` (`:tool config|embed|mood|clear`) and
|
|
139
|
-
account commands under `:sync` (`:sync register|login|status|logout`).
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
## [0.2.8] - 2026-10-30
|
|
143
|
-
|
|
144
|
-
### π Bug Fixes
|
|
145
|
-
|
|
146
|
-
- *(macos)* Link compiler-rt explicitly under fat LTO, fixing a startup
|
|
147
|
-
segfault in ONNX Runtime environment creation (`im :embed`, `im :color`).
|
|
148
|
-
|
|
149
|
-
## [0.2.7] - 2026-10-30
|
|
150
|
-
|
|
151
|
-
### π Features
|
|
152
|
-
|
|
153
|
-
- `im :color` without a mood lists every anchor mood of the moods file with
|
|
154
|
-
a swatch of its color, one per line; `im :color <mood>` keeps the full
|
|
155
|
-
pipeline diagnostic.
|
|
156
|
-
- Today view: `[today_view] swap_all_and_due_recurring_task_views` trades the
|
|
157
|
-
`All` and `Due` recurring-task displays. `Due` is anchored at now (earliest
|
|
158
|
-
window intersecting the horizon, skipping closed windows), and previews are
|
|
159
|
-
scoped to the row's window instead of sharing the whole day.
|
|
160
|
-
- No phantom availability windows past a recurring task's expiry, and
|
|
161
|
-
today-view `ends` shows the task's real expiry again.
|
|
162
|
-
|
|
163
|
-
### π Bug Fixes
|
|
164
|
-
|
|
165
|
-
- *(embedding)* Pin the CPU EP on macOS
|
|
166
|
-
|
|
167
|
-
## [0.2.6] - 2026-10-29
|
|
168
|
-
|
|
169
|
-
### π Features (sync)
|
|
170
|
-
|
|
171
|
-
- `im :auth register|login|status|logout` and `im :sync` (plus
|
|
172
|
-
`im :sync --reset`) sync a database against a Cloudflare Worker
|
|
173
|
-
(`sync-server/`): a per-user Durable Object holds the log, D1 the accounts.
|
|
174
|
-
- Concurrent edits merge per field (last write wins) instead of per entity; a
|
|
175
|
-
push breaks at entity boundaries, so a create carries all of its cells.
|
|
176
|
-
- Deletes are terminal and slot losers become tombstones, so two devices that
|
|
177
|
-
edit the same field converge instead of duplicating rows.
|
|
178
|
-
- Entity ids are UUIDv7, so a row created on any device is unique without a
|
|
179
|
-
round trip; local `short_id`s stay a per-device projection.
|
|
180
|
-
- The server address comes from `[sync] server` in the client config
|
|
181
|
-
(`IM_SYNC_URL` overrides it for one command); the account is stored apart
|
|
182
|
-
from the sync state, so `im :sync --reset` does not sign you out.
|
|
183
|
-
- A database from an older version (INTEGER keys) is copied aside and
|
|
184
|
-
recreated empty instead of being written with the wrong key type; an
|
|
185
|
-
unreadable file is quarantined the same way.
|
|
186
|
-
|
|
187
|
-
### π₯ Breaking changes (tracker rework)
|
|
188
|
-
|
|
189
|
-
- `min`/`max` renamed to `low`/`high`; `kind = "number"` renamed to
|
|
190
|
-
`"integer"`; new `kind = "duration"` (duration-string values stored as
|
|
191
|
-
seconds, displayed like `6m 30s`).
|
|
192
|
-
- `interval` now takes a table `{ anchor, span, cumulative = false }`
|
|
193
|
-
- Value and bound forms are strict per kind/mode: `float` takes plain
|
|
194
|
-
numbers, `integer` plain whole numbers, `duration` duration strings only,
|
|
195
|
-
`null` no value at all; `low`/`high` mirror the value form of the kind
|
|
196
|
-
(duration strings for `duration` and `null`+replace, whole numbers for
|
|
197
|
-
`text` and `null`+cumulative). Invalid bound forms are dropped with a
|
|
198
|
-
warning at config load.
|
|
199
|
-
- New `strict` setting gates logging/updating: numeric kinds gate the value
|
|
200
|
-
against the inclusive `low`..`high` span (inverted bounds gate the span
|
|
201
|
-
between them), `text` gates the message length in characters, `null`
|
|
202
|
-
trackers gate *when* they may be logged (the circular `low`/`high` time
|
|
203
|
-
offset zone; requires both bounds, replace mode only).
|
|
204
|
-
- `null` trackers require an interval (dropped with a warning otherwise) and
|
|
205
|
-
store score 0 in every mode β the payload column is unused and today-view
|
|
206
|
-
rows show no payload (the count lives in the grid, the timestamp in the
|
|
207
|
-
entry's own time). Negative durations are rejected at log time.
|
|
208
|
-
- Replace-mode insertion is one shared strategy for all kinds: a CLI log in
|
|
209
|
-
an occupied slot drops the slot's previous rows (including rows logged
|
|
210
|
-
with a mood β the mood row itself survives) and inserts the new one.
|
|
211
|
-
- The TUI update action on a `null` row only moves its timestamp to now,
|
|
212
|
-
within its current interval slot (cross-slot moves are rejected, the
|
|
213
|
-
strict zone still applies); on value-bearing kinds it runs the same strict
|
|
214
|
-
pipeline as the CLI.
|
|
215
|
-
- `:db doctor` prunes any nonzero row of a `null` tracker (all modes).
|
|
216
|
-
|
|
217
|
-
## [0.2.5] - 2026-08-14
|
|
218
|
-
|
|
219
|
-
### π Features
|
|
220
|
-
|
|
221
|
-
- Editor no longer opens automatically for interactive flows.
|
|
222
|
-
- Config adjustments
|
|
223
|
-
- Body templates
|
|
224
|
-
- Adjust today view filters
|
|
225
|
-
- Config.tasks.overdue_color + badge::task_label_color
|
|
226
|
-
- Today-view preview polish + overdue date column + task children
|
|
227
|
-
- Link actions in the today view (Ctrl+L)
|
|
228
|
-
- Improve jiff-english robustness
|
|
229
|
-
- TUI migration to matchmaker
|
|
230
|
-
|
|
231
|
-
## [0.2.4] - 2026-08-07
|
|
232
|
-
|
|
233
|
-
### π Features
|
|
234
|
-
|
|
235
|
-
- Db :doctor
|
|
236
|
-
- Jiff-english
|
|
237
|
-
- Duration trackers
|
|
238
|
-
- Tui interaction for trackers
|
|
239
|
-
|
|
240
|
-
## [Unreleased]
|
|
241
|
-
|
|
242
|
-
### π Features
|
|
243
|
-
|
|
244
|
-
- `[badges]` config section: journal badge (glyph and/or color β a bare
|
|
245
|
-
char, a color string, or `{ badge = 'Β·', color = "red" }`; color defaults
|
|
246
|
-
to `Reset`), plus `tracker` and `mood` glyph overrides for the today
|
|
247
|
-
view and previews. `journal_badge` moved from `[today_view]`.
|
|
248
|
-
- Today view task filter: `TasksFilter` (`none` / `all` / `overdue` /
|
|
249
|
-
`pending` / `horizon`) replaces `config.today_view.include_overdue` as
|
|
250
|
-
`initial_tasks_filter`, bound to the view variant β `All` uses the
|
|
251
|
-
configured filter, `A` pins `Horizon`, `B` pins `Overdue`; `none` hides
|
|
252
|
-
the whole task section (journal-only view). Undated
|
|
253
|
-
oneshots created before today are no longer dropped from the `All`
|
|
254
|
-
variant. `CycleShow` renamed `CycleFilter`; TUI headers label the
|
|
255
|
-
variants per app (`all | journal | tasks` in the today view,
|
|
256
|
-
`all | oneshot | other` in the tasks view).
|
|
257
|
-
|
|
258
|
-
- Renamed: the binary is now `im` (previously `feeling`), and the logged
|
|
259
|
-
mood entries are consistently called moods β DB schema (`mood` table,
|
|
260
|
-
`tracker.mood`, `task_moods.mood_id`), code identifiers, CLI usage
|
|
261
|
-
strings, and docs. Data paths moved to `~/.config/im` / `im.db`;
|
|
262
|
-
existing `feeling` databases and config dirs are not migrated and must
|
|
263
|
-
be moved/deleted by hand.
|
|
264
|
-
- Taskβmood links: `im <mood> -<short id>` records a link; the task
|
|
265
|
-
preview shows a `moods:` field with colored badges
|
|
266
|
-
- `:db` command replaces `:prune` β `:db prune` (old behavior) and
|
|
267
|
-
`:db backfill` (persist missing mood embeddings/scores)
|
|
268
|
-
- `:db doctor` β checks tracker entries against their configured kinds and
|
|
269
|
-
prunes entries whose storage class no longer matches (orphaned tracker
|
|
270
|
-
types and stale nonzero time-marker entries included), after an
|
|
271
|
-
interactive confirm
|
|
272
|
-
- Tracker intervals are calendar-aware (`interval = ["2020-01-01 00:00", "1 day"]`)
|
|
273
|
-
- New `null` tracker kind: valueless timestamp markers with time-of-day
|
|
274
|
-
coloring (e.g. sleep start) or per-interval counting
|
|
275
|
-
|
|
276
|
-
### π Bug Fixes
|
|
277
|
-
|
|
278
|
-
- Recurring-task and tracker intervals are calendar-based (jiff): DST and
|
|
279
|
-
variable month lengths no longer drift interval boundaries
|
|
280
|
-
- Interval storage switched from seconds to packed jiff spans
|
|
281
|
-
|
|
282
|
-
## [0.2.3] - 2026-08-07
|
|
283
|
-
|
|
284
|
-
### π Bug Fixes
|
|
285
|
-
|
|
286
|
-
- Reorganize parse, fix overflow
|
|
287
|
-
|
|
288
|
-
## [0.2.2] - 2026-08-07
|
|
289
|
-
|
|
290
|
-
### π Features
|
|
291
|
-
|
|
292
|
-
- Show name of attached parent during interactive task creation
|
|
293
|
-
|
|
294
|
-
## [0.2.1] - 2026-08-06
|
|
295
|
-
|
|
296
|
-
- Release pipeline updates
|
|
297
|
-
- misc
|
|
298
|
-
|
|
299
|
-
## [0.2.0] - 2026-08-06
|
|
300
|
-
|
|
301
|
-
### π Features
|
|
302
|
-
|
|
303
|
-
- Nomic embedder, ort runtime
|
|
304
|
-
- Reorganize views
|
|
305
|
-
- Reorganize config
|
|
306
|
-
|
|
307
|
-
### πΌ Other
|
|
308
|
-
|
|
309
|
-
- CliOpts flag counts threaded into handlers
|
|
310
|
-
- ColorAxesSettings flattened into MoodConfig; :color verbose axes dump
|
|
311
|
-
- Scheduled task syntax β ':' description, '@' duration markers
|
|
312
|
-
- Lock invalid-timestamp behavior with regression tests
|
|
313
|
-
- Task creation confirmation polish
|
|
314
|
-
- Cliclack intro for task flows; prefill fields logged
|
|
315
|
-
- 'feeling @<date>' β today view anchored to arbitrary days
|
|
316
|
-
- Grid titles + verbose gating; text-tracker entry timestamps
|
|
317
|
-
- Shared Enter-action across both TUIs
|
|
318
|
-
|
|
319
|
-
## [0.1.0] - 2026-08-01
|
|
320
|
-
|
|
321
|
-
Initial commit
|
|
1
|
+
## [0.3.1] - 2026-11-07
|
|
2
|
+
|
|
3
|
+
### π Features
|
|
4
|
+
|
|
5
|
+
- `im -V` / `im --version` prints the version.
|
|
6
|
+
- Task creation uses `+`: `im +`, `im + <name>`, `im +<ref> <name>`,
|
|
7
|
+
`im + %`, and `im + @`; recurring names require the `:<name>` marker.
|
|
8
|
+
- Trackers, at most one task reference, and task updates can be freely mixed
|
|
9
|
+
in one entry, and `--quiet` works as a long flag.
|
|
10
|
+
- Sessions show a countdown chosen by `[session] countdown` (`timer`, `bar`,
|
|
11
|
+
`dots`, `percent`, `minimal`); `bar` is the default.
|
|
12
|
+
- Text trackers take a configurable badge color
|
|
13
|
+
(`badges.default_text_tracker_color`, `dark_grey` by default) instead of
|
|
14
|
+
inheriting the darkest bin of the default ramp.
|
|
15
|
+
- New `notify` crate and CLI: cross-platform toasts and dialogs with bundled
|
|
16
|
+
`bell`, `bowl` and `chime` sounds played through rodio.
|
|
17
|
+
- `im :tool datetime [expr]` resolves a date expression and prints it in a
|
|
18
|
+
chosen format. `--format` accepts presets (`civil`, `utc`, `short`, `unix`,
|
|
19
|
+
`iso`, `date`, `time`, `dmy`, `mdy`), a time zone (IANA name, unique case-insensitive
|
|
20
|
+
fragment, or fixed offset such as `+08:00`), or a custom `strftime`
|
|
21
|
+
pattern. A resolved zone reports its name and offset on stderr unless
|
|
22
|
+
quiet.
|
|
23
|
+
- Bundled mood palette variants: earth, nordic, jewel, bloom, and pastel.
|
package/README.md
CHANGED
|
@@ -2,52 +2,118 @@
|
|
|
2
2
|
|
|
3
3
|
`im` is a CLI tool for recording all the small moments, feelings, thoughts and setbacks and accomplishments that make up your day[^1].
|
|
4
4
|
|
|
5
|
-
```
|
|
6
|
-
# record moods and notes
|
|
7
|
-
|
|
8
|
-
im
|
|
9
|
-
im .
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
#
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
im
|
|
36
|
-
im
|
|
37
|
-
|
|
38
|
-
#
|
|
39
|
-
im
|
|
40
|
-
|
|
41
|
-
im
|
|
5
|
+
```console
|
|
6
|
+
# --- record moods and notes ---
|
|
7
|
+
|
|
8
|
+
> im worried about school tomorrow # mood
|
|
9
|
+
> im sad . that my dog ate my bones # mood with note
|
|
10
|
+
> im . and my cat just ate my dog # journal entry (pure note)
|
|
11
|
+
|
|
12
|
+
# --- create tasks ---
|
|
13
|
+
|
|
14
|
+
> im + # create a task (interactive)
|
|
15
|
+
β Create oneshot task
|
|
16
|
+
β
|
|
17
|
+
β Task name:
|
|
18
|
+
β recover bones
|
|
19
|
+
β
|
|
20
|
+
β Edit fields:
|
|
21
|
+
β Times to complete
|
|
22
|
+
β
|
|
23
|
+
β Times to complete:
|
|
24
|
+
β 10
|
|
25
|
+
β
|
|
26
|
+
β Edit fields:
|
|
27
|
+
β Finish
|
|
28
|
+
β
|
|
29
|
+
β Created task #1: recover bones
|
|
30
|
+
|
|
31
|
+
> im +bones defeat cat @tomorrow noon # create a subtask (under the last task)
|
|
32
|
+
|
|
33
|
+
# --- log habits, events and trends ---
|
|
34
|
+
|
|
35
|
+
> im going to bed first # (think before you act)
|
|
36
|
+
> im -sleep # log sleep time
|
|
37
|
+
> im -sleep . still up # update logged time
|
|
38
|
+
> im a boneless sleepless wretch . \ # (keep up with mental health by
|
|
39
|
+
> im not ready for tomorrow # being honest with your feelings)
|
|
40
|
+
> im -sheep 1 # log a sheep
|
|
41
|
+
> im -sheep 1 # log another sheep
|
|
42
|
+
> im -sheep 1 # continue to log sheep
|
|
43
|
+
> im -sheep 1 # btw: this is a different tracker than the
|
|
44
|
+
> # first, it accumulates entries in an interval.
|
|
45
|
+
> # There 5 types in all. Additionally, specifying whether a tracker has an interval, has bounds, is strict, or is cumulative also changes its behavior. The first tracker can be found in the default configuration file, defined as a null tracker with a bounded interval, while the second can be assumed to be a standard integer tracker.
|
|
46
|
+
> im -sleep .. zzZzz
|
|
47
|
+
|
|
48
|
+
# --- check agendas & complete tasks ---
|
|
49
|
+
|
|
50
|
+
> im ready for a new day!
|
|
51
|
+
> im @due | cat # give the cat its due (displays tasks due today)
|
|
52
|
+
23:59 β defeat cat
|
|
53
|
+
|
|
54
|
+
> im alive but in pain +cat # log mood + complete task
|
|
55
|
+
> im become +bones .. destroyer of cat # update task
|
|
56
|
+
> im +bones 9 # collect bones (complete task)
|
|
57
|
+
|
|
58
|
+
> im happy I found all of my bones :)
|
|
59
|
+
bash: syntax error near unexpected token `)'
|
|
60
|
+
|
|
61
|
+
> im . # write note in $EDITOR (a trailing . opens it)
|
|
62
|
+
---
|
|
63
|
+
happy i found all of my bones
|
|
64
|
+
10 on my fingers and 10 on my toes :)
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
> im ... # (the No. of dots can be used to select from configured templates)
|
|
68
|
+
---
|
|
69
|
+
%% Template #3 %%
|
|
70
|
+
that's all of them right?
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
> im -thought oh no . # text tracker entry
|
|
74
|
+
---
|
|
75
|
+
I got Reese's Puffs in my bowl,
|
|
76
|
+
Now my days on cruise control,
|
|
77
|
+
I got Reese's Puffs in my bowl
|
|
78
|
+
and just like that Im on a roll,
|
|
79
|
+
[REDACTED],[REDACTED],[REDACTED],[REDACTED]
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
# --- set goals ---
|
|
83
|
+
|
|
84
|
+
> im + %1 day :regrow bones =1 # Create a recurring task with a (exceedable) target
|
|
85
|
+
> im @186 days from now :return to school # Schedule future events
|
|
86
|
+
> im + shop: bone meal, bonebons, Skele-Gro, 99% milk # Shopping list
|
|
87
|
+
|
|
88
|
+
> im # Check today's journal
|
|
89
|
+
[UNDER CONSTRUCTION]
|
|
90
|
+
|
|
91
|
+
# --- visualize your success with a grid ---
|
|
92
|
+
|
|
93
|
+
> im : # (the dots are colored according to the aggregate mood of your entries from that day)
|
|
94
|
+
β― β β β― β β
|
|
95
|
+
|
|
96
|
+
> im :month bones # recurring task progress can also be graphed
|
|
97
|
+
β β β β β― β β
|
|
98
|
+
β β β― β β― β― β
|
|
99
|
+
β β β β β β β
|
|
100
|
+
β β β― β β β
|
|
101
|
+
|
|
102
|
+
> im :month cats_defeated # (5 cats were harmed in the making of this transcript)
|
|
103
|
+
β― β― β― β― β β― β―
|
|
104
|
+
β― β― β β― β β β―
|
|
105
|
+
β― β― β― β― β― β― β―
|
|
106
|
+
β― β― β β― β― β―
|
|
42
107
|
|
|
43
108
|
# reflect and repeat
|
|
44
|
-
|
|
109
|
+
|
|
110
|
+
im still alive . im glad
|
|
45
111
|
```
|
|
46
112
|
|
|
47
113
|
## Features
|
|
48
114
|
|
|
49
115
|
- Log moods and journal entries in simple, natural syntax.
|
|
50
|
-
- Today view: show a ordered summary of all that you have logged and planned today -- an interactive, auto-
|
|
116
|
+
- Today view: show a ordered summary of all that you have logged and planned today -- an interactive, auto-collated daily note.
|
|
51
117
|
- Grid view: Display your mood, task and tracker histories as dots.
|
|
52
118
|
- Moods are colored by how much they match to various emotions or topics you have configured.
|
|
53
119
|
- Change the topics, timespans, and filters, and watch as interesting patterns emerge.
|
|
@@ -58,10 +124,9 @@ im still alive . i think
|
|
|
58
124
|
|
|
59
125
|
## Gallery
|
|
60
126
|
|
|
61
|
-

|
|
63
128
|
|
|
64
|
-
|
|
129
|
+

|
|
65
130
|
|
|
66
131
|
## Usage
|
|
67
132
|
|
|
@@ -71,41 +136,44 @@ im β immediate mood, journal, and task tracker
|
|
|
71
136
|
|
|
72
137
|
Usage:
|
|
73
138
|
im <mood> [. [body]] log a mood (with an optional body)
|
|
74
|
-
im
|
|
75
|
-
im
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
im
|
|
139
|
+
im [-<tracker> [value]].. add one or more custom tracker records
|
|
140
|
+
im <mood> [+task] [-trackers..] log a mood linked with an existing task
|
|
141
|
+
or new tracker records
|
|
142
|
+
im %<duration> [purpose..] start a timed session
|
|
143
|
+
(trackers, task & body supported)
|
|
144
|
+
|
|
145
|
+
im + create a task
|
|
146
|
+
im +[parent] <name> [@<time>] create a task (non-interactive)
|
|
147
|
+
im + %[interval] [:<name>] create a recurring task (interactive)
|
|
148
|
+
im + @[time] [:<name>] [%<duration>] schedule a task (interactive if partial)
|
|
81
149
|
im +[task] [count] edit or update a task by its reference
|
|
82
|
-
(see `im -vh`)
|
|
150
|
+
(see `im -vh` for reference)
|
|
83
151
|
|
|
84
152
|
Views:
|
|
85
153
|
im @[date] today view
|
|
86
154
|
im @due[:t|:w] due view
|
|
87
155
|
(today / tomorrow / this week)
|
|
88
156
|
im @[:o|:O] pending tasks
|
|
157
|
+
(all / oneshot / recurring&scheduled)
|
|
89
158
|
im @done[:o|:O] completed tasks
|
|
90
|
-
(all / oneshot / recurring
|
|
159
|
+
(all / oneshot / recurring&scheduled)
|
|
91
160
|
|
|
92
161
|
Trackers and grids:
|
|
162
|
+
im - browse trackers
|
|
93
163
|
im :[week|month|year] [ids] dot-sequence tracker grid
|
|
94
164
|
ids: <tracker> or @<recurring name>
|
|
95
165
|
period defaults to "week"
|
|
96
166
|
|
|
97
167
|
Other:
|
|
98
|
-
im :
|
|
99
|
-
im :tool
|
|
100
|
-
im - browse trackers
|
|
101
|
-
im :db prune|backfill|doctor database utilities
|
|
102
|
-
|
|
168
|
+
im :c [moods|colors|mm] open the config in $VISUAL / $EDITOR
|
|
169
|
+
im :tool db|mood|clear|.. (see `im :tool --help`)
|
|
103
170
|
im :sync [register|login|status|logout] setup/authenticate/run sync
|
|
104
171
|
|
|
105
172
|
|
|
106
173
|
Flags:
|
|
107
174
|
im -q | -v <command> quiet / verbose; flags go first
|
|
108
175
|
im --help | -h show this help (-v applies)
|
|
176
|
+
im --version | -V show version
|
|
109
177
|
```
|
|
110
178
|
<!-- HELP_END -->
|
|
111
179
|
|
|
@@ -143,6 +211,18 @@ The default locations are in order:
|
|
|
143
211
|
- tasks: oneshot, recurring, or scheduled.
|
|
144
212
|
- trackers: defined in your configuration.
|
|
145
213
|
|
|
214
|
+
|
|
215
|
+
|
|
216
|
+
##### Moods
|
|
217
|
+
|
|
218
|
+
The most basic use of `im` for a kind of offhand journaling where you logging any moods that come to you throughout the day, such as `im happy` or `im cold`, or thoughts such as `im . maybe i should put on some pants`. They are collected in the [Today view](#views) together with other task and tracker entries from the day, and im collates them into a interactive daily journal.
|
|
219
|
+
|
|
220
|
+
Also, every mood is assigned a color, by determining its weighted semantic alignment to a set of configured _mood anchors_ (color, mood pairs), yielding pretty, meaningful dots on the interface and in the grid view[^4] that provide users with a sense of pride and accomplishment.
|
|
221
|
+
|
|
222
|
+
Finally, `im %<duration>` starts a Pomodoro session -- idk why. Personally, I find the Pomodoro method a depressing concept. Anyways, start a session, link it to a tracker or task if you want, and when time is up it will prompt you about how it went; don't answer if you don't feel like it. If you just want to create timed notifications, that's available through `im :tool notify`.
|
|
223
|
+
|
|
224
|
+
[^4]: `im :[week|month|year]`
|
|
225
|
+
|
|
146
226
|
##### Trackers
|
|
147
227
|
|
|
148
228
|
Trackers are defined in your configuration (`im :tool config`); each `[tracker.<name>]`
|
|
@@ -150,19 +230,55 @@ section is logged through `im -<name> <value>` (no value for `null` trackers):
|
|
|
150
230
|
|
|
151
231
|
- Kinds: `text`, `integer`, `float`, `duration` (strings like `6m 30s`), `null` (timestamp/count markers β requires an interval).
|
|
152
232
|
- `interval = { anchor = "2026-01-01T00:00:00", span = "1 day" }` bins
|
|
153
|
-
entries into calendar slots. The anchor is an unzoned civil datetime
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
233
|
+
entries into calendar slots. The anchor is an unzoned civil datetime resolved
|
|
234
|
+
in your current local zone. By default, a new log in a slot replaces the slot's previous entry;
|
|
235
|
+
`interval.cumulative = true` keeps every log and the slot's grid dot shows the aggregate.
|
|
236
|
+
Logs record the UTC offset and location string they were written in, so that although tracker intervals shift with your zone's offset (keeping the civil time of their availability fixed), logs stay in the same interval slot.
|
|
237
|
+
|
|
238
|
+
|
|
239
|
+
|
|
240
|
+
##### Tasks
|
|
241
|
+
|
|
242
|
+
The three types of tasks share an underlying data-type, distinguished only by the presence of specific fields. _Recurring_ tasks have an interval, _scheduled_ tasks have a duration but no interval, and _oneshot_ tasks have neither.
|
|
243
|
+
|
|
244
|
+
- The interval of recurrence is a calendar-aware span (i.e. 1 day or 1 week) anchored at an absolute `start_time` [^3].
|
|
245
|
+
- Scheduled tasks are surfaced on such views as the Today or Due views when they are upcoming, and are completed automatically once their availability window passes. They can also be completed or cancelled early.
|
|
246
|
+
- Oneshot tasks and recurring tasks can both specify a (exceedable) target count.
|
|
247
|
+
- Tasks carry fields such as priority, parent tasks, due dates (for oneshot tasks), & task body etc. They can be specified (or edited) at creation or afterwards, through an interactive menu-style CLI prompt flow.
|
|
248
|
+
|
|
249
|
+
|
|
250
|
+
|
|
251
|
+
##### Views
|
|
252
|
+
|
|
253
|
+
The app includes 3 [TUI](https://en.wikipedia.org/wiki/Text-based_user_interface)s:
|
|
254
|
+
|
|
255
|
+
- The _Today view_ (`im`), which aggregates tasks, trackers and mood/journal entries to provide a itinery + recap of the current horizon (Today, Today + Tomorrow, This Week) -- a kind of live journal. It can be filtered to just events or upcoming due tasks.
|
|
256
|
+
- The _Tasks view_ (`im @`), which lists *(drum roll)* all the tasks. It can be filtered to just oneshots, or just recurring/scheduled, or to future/past/completed/incomplete etc.
|
|
257
|
+
- The _Tracker view_ (`im -`), from where you can select a tracker type and log an entry for it.
|
|
258
|
+
|
|
259
|
+
For a comprehensive SPEC of the rules which determine which entities make it into a specific view, see the [docs](./docs/VIEWS.md).
|
|
260
|
+
|
|
261
|
+
|
|
262
|
+
|
|
263
|
+
##### Sync
|
|
264
|
+
|
|
265
|
+
`im` stores your data in a local sqlite db. But it also supports cross-device sync by way of a central server that maintains an event log. Updates are per-field conflicts are resolved via LWW, meaning if two edits are made on the same field and afterwards synced, the one whose recorded time *as measured on-device* is later is agreed upon as the field's value. Such conflicts are surfaced in the output when running `im: sync` but *never prompt and thus erase data*. The one exception is *deletes*: deletes are final, meaning that *any* edit to a field made after a deletion of the source has been recorded in the log is ignored. For this reason, when a client contains a field update which would be dropped by pulling this event, they are prompted with the option to *resurrect* the entity as it currently exists in their local database as a safeguard.
|
|
266
|
+
|
|
267
|
+
To enable syncing, run `im :sync register` on Device A, `im :sync login` on Device B, then `im :sync` on one or both devices. Syncing does not run automatically.
|
|
268
|
+
|
|
269
|
+
|
|
160
270
|
|
|
161
271
|
## FAQ
|
|
162
272
|
|
|
163
273
|
### Why is the binary size so large?
|
|
164
274
|
|
|
165
|
-
`im` bundles a quant of `nomic-ai/nomic-embed-text-v1.5` to categorize your entries. This was the most effective, reasonably sized approach tested out of several options. The size is a bit abnormal, but was pleasantly surprised with how much better it worked compared to my other attempts.
|
|
275
|
+
`im` bundles a quant of `nomic-ai/nomic-embed-text-v1.5` to categorize your entries. This was the most effective, reasonably sized approach tested out of several options. The size is a bit abnormal, but was pleasantly surprised with how much better it worked compared to my other attempts.
|
|
276
|
+
|
|
277
|
+
If you are particularly idle, it can be a source of amusement or annoyance depending on your temperament. For example, `im :tool mood` scores `im a consummate wretch` with: `humble: 0.6668, vengeful: 0.2732, disgusted: 0.0281, smitten: 0.0175, frustrated: 0.0144`, while `im a little teapot` gets: `regression weights (rescaled) : hungry: 0.5459, nostalgic: 0.2902, thoughtful: 0.0736, smitten: 0.0490, purposeful: 0.0412`. So yeah, the tiny LM has some pretty good intuition into emotional psychology I'd say (also, the saliency scores are `0.9946` vs `0.0079` so it's wise to that trick too).
|
|
278
|
+
|
|
279
|
+
|
|
280
|
+
|
|
281
|
+
If you have any interesting uses for an embedding model that `im` can help with, `im` open to them!
|
|
166
282
|
|
|
167
283
|
### What does im stand for?
|
|
168
284
|
|
|
@@ -171,6 +287,10 @@ What it stands for is immaterial[^2].
|
|
|
171
287
|
### How can I contribute?
|
|
172
288
|
Open to suggestions. Helping implement more filters, or a sensible configurable spec for exporting to markdown would be helpful. Documentation, always.
|
|
173
289
|
|
|
290
|
+
|
|
291
|
+
|
|
292
|
+
|
|
293
|
+
|
|
174
294
|
## See also
|
|
175
295
|
|
|
176
296
|
- https://github.com/qiz-li/im
|
|
@@ -184,4 +304,5 @@ Open to suggestions. Helping implement more filters, or a sensible configurable
|
|
|
184
304
|
- rationalize bad decisions
|
|
185
305
|
- realize that you don't actually have any thoughts interesting enough to write down.
|
|
186
306
|
|
|
187
|
-
[^2]: important, immense, immaculate, importune, imagine all the people .. immolatedβ«
|
|
307
|
+
[^2]: important, immense, immaculate, importune, imagine all the people .. immolatedβ«
|
|
308
|
+
[^3]: This differs from trackers, whose intervals shift to follow your timezone offset: while recurring tasks with intervals in the units of days will be robust to DST, changing time-zones will likely cause their availability windows to shift in time of day.
|
package/npm-shrinkwrap.json
CHANGED
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
},
|
|
19
19
|
"hasInstallScript": true,
|
|
20
20
|
"name": "@squirreljetpack/im-dynamic",
|
|
21
|
-
"version": "0.3.
|
|
21
|
+
"version": "0.3.1"
|
|
22
22
|
},
|
|
23
23
|
"node_modules/detect-libc": {
|
|
24
24
|
"engines": {
|
|
@@ -47,5 +47,5 @@
|
|
|
47
47
|
}
|
|
48
48
|
},
|
|
49
49
|
"requires": true,
|
|
50
|
-
"version": "0.3.
|
|
50
|
+
"version": "0.3.1"
|
|
51
51
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"artifactDownloadUrls": [
|
|
3
|
-
"https://github.com/Squirreljetpack/im/releases/download/v0.3.
|
|
3
|
+
"https://github.com/Squirreljetpack/im/releases/download/v0.3.1"
|
|
4
4
|
],
|
|
5
5
|
"bin": {
|
|
6
6
|
"im-dynamic": "run-im-dynamic.js"
|
|
@@ -87,7 +87,7 @@
|
|
|
87
87
|
"zipExt": ".tar.xz"
|
|
88
88
|
}
|
|
89
89
|
},
|
|
90
|
-
"version": "0.3.
|
|
90
|
+
"version": "0.3.1",
|
|
91
91
|
"volta": {
|
|
92
92
|
"node": "18.14.1",
|
|
93
93
|
"npm": "9.5.0"
|