@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 +81 -0
- package/README.md +12 -8
- package/npm-shrinkwrap.json +2 -2
- package/package.json +2 -2
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 ! %[
|
|
80
|
-
im ! @[
|
|
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]
|
|
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/
|
|
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
|
|
153
|
-
entries into calendar slots.
|
|
154
|
-
|
|
155
|
-
the slot's
|
|
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
|
|
package/npm-shrinkwrap.json
CHANGED
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
},
|
|
19
19
|
"hasInstallScript": true,
|
|
20
20
|
"name": "@squirreljetpack/im-dynamic",
|
|
21
|
-
"version": "0.
|
|
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.
|
|
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.
|
|
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.
|
|
90
|
+
"version": "0.3.0",
|
|
91
91
|
"volta": {
|
|
92
92
|
"node": "18.14.1",
|
|
93
93
|
"npm": "9.5.0"
|