@squirreljetpack/im-dynamic 0.2.10 → 0.3.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/CHANGELOG.md CHANGED
@@ -1,3 +1,84 @@
1
+ ## [0.3.0] - 2026-11-03
2
+
3
+ ### 🚀 Features
4
+
5
+ - Sync creates are driven by `sync_schema.json`: a push that creates an
6
+ entity carries every field of its kind, so no peer ever builds a
7
+ half-filled row.
8
+ - The outbox coalesces per cell (`UNIQUE(entity_id, field)`): repeated
9
+ offline edits to the same field update the queued row in place instead
10
+ of queueing a chain of writes.
11
+ - The server pre-validates each create (existence cell, required fields
12
+ and links, timestamp) and reports the failures as per-event verdicts
13
+ with a typed reason. `target_deleted` is new; a reason this build does
14
+ not know deserializes as `unknown` instead of failing the response.
15
+ - Deleting a mood keeps the tracker entries logged against it: their
16
+ `mood` link is cleared and the rows stay, matching the sync cascade.
17
+ Deleting a task still deletes its completions.
18
+ - `im :sync` offers to re-create content another device deleted from a
19
+ snapshot taken before the row was removed, and asks once per entity
20
+ after every push of the run.
21
+
22
+ ### 🐛 Bug Fixes
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
+
1
82
  ## [0.2.10] - 2026-10-31
2
83
 
3
84
  ### 🚀 Features
package/README.md CHANGED
@@ -76,8 +76,8 @@ Usage:
76
76
  (optionally attached to a mood)
77
77
 
78
78
  im ! [name] [@<time>] create a task (interactive without a name)
79
- im ! %[<interval>] [[:]name] create a recurring task (interactive)
80
- im ! @[<time>] [:<name>] [%<duration>] scheduled a task (interactive if partial)
79
+ im ! %[interval] [[:]name] create a recurring task (interactive)
80
+ im ! @[time] [:<name>] [%<duration>] scheduled a task (interactive if partial)
81
81
  im +[task] [count] edit or update a task by its reference
82
82
  (see `im -vh`)
83
83
 
@@ -96,11 +96,11 @@ Trackers and grids:
96
96
 
97
97
  Other:
98
98
  im :tool embed|mood|clear|.. (see `im :tool --help`)
99
- im :tool config | :c [moods|colors] open the config in $VISUAL / $EDITOR
99
+ im :tool config | :c [moods|colors|mm] open the config in $VISUAL / $EDITOR
100
100
  im - browse trackers
101
101
  im :db prune|backfill|doctor database utilities
102
102
 
103
- im :sync [register|login|status|logout] setup/manage/run sync
103
+ im :sync [register|login|status|logout] setup/authenticate/run sync
104
104
 
105
105
 
106
106
  Flags:
@@ -149,10 +149,14 @@ Trackers are defined in your configuration (`im :tool config`); each `[tracker.<
149
149
  section is logged through `im -<name> <value>` (no value for `null` trackers):
150
150
 
151
151
  - Kinds: `text`, `integer`, `float`, `duration` (strings like `6m 30s`), `null` (timestamp/count markers — requires an interval).
152
- - `interval = { anchor = "2026-01-01T00:00:00-04:00", span = "1 day" }` bins
153
- entries into calendar slots. By default, a new log in a slot
154
- replaces the slot's previous entry; `interval.cumulative = true` keeps every log and
155
- the slot's grid dot shows the aggregate.
152
+ - `interval = { anchor = "2026-01-01T00:00:00", span = "1 day" }` bins
153
+ entries into calendar slots. The anchor is an unzoned civil datetime (no `Z`
154
+ or numeric offset) resolved in your current local zone. By default, a new log
155
+ in a slot replaces the slot's previous entry; `interval.cumulative = true`
156
+ keeps every log and the slot's grid dot shows the aggregate. Logs record the
157
+ UTC offset and location string (the system IANA name, or empty) they were
158
+ written in, so they stay on their recorded civil day and interval slot when
159
+ viewed from another zone.
156
160
 
157
161
  ## FAQ
158
162
 
@@ -18,7 +18,7 @@
18
18
  },
19
19
  "hasInstallScript": true,
20
20
  "name": "@squirreljetpack/im-dynamic",
21
- "version": "0.2.10"
21
+ "version": "0.3.0"
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.2.10"
50
+ "version": "0.3.0"
51
51
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "artifactDownloadUrls": [
3
- "https://github.com/Squirreljetpack/im/releases/download/v0.2.10"
3
+ "https://github.com/Squirreljetpack/im/releases/download/v0.3.0"
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.2.10",
90
+ "version": "0.3.0",
91
91
  "volta": {
92
92
  "node": "18.14.1",
93
93
  "npm": "9.5.0"