@plinth-music/cli 0.6.0 → 0.8.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
@@ -2,6 +2,70 @@
2
2
 
3
3
  Notable changes to `@plinth-music/cli`. Grouped by what a user notices, not by PR.
4
4
 
5
+ ## 0.8.0 — 2026-08-23
6
+
7
+ Two PRs and two direct commits since `0.7.0` (`v0.7.0..af83c59`). The daemon
8
+ survives a failed confirm gate, and the map it writes tells an agent which
9
+ command answers which question. No server prerequisite: both changes are
10
+ client-side, and a 0.7.0 client is unaffected.
11
+
12
+ ### A failing confirm gate no longer takes the daemon down with it
13
+
14
+ Both destructive gates fire their settle window fire-and-forget, so a rejecting
15
+ `onSettle` surfaced as an unhandled rejection and **terminated the long-running
16
+ daemon** — with the batch already lifted out of the gate's pending buffer, so its
17
+ remaining operations were neither pushed nor quarantined. Work disappeared behind
18
+ a process that had simply stopped.
19
+
20
+ Three layers now catch it. The gate reports a settle failure through a new
21
+ `onError` callback instead of rejecting into the void. The under-threshold flush
22
+ catches per-operation failures, logs the same `[PUSH_FAILED]` / `[FILE_PUSH_FAILED]`
23
+ lines the watch path already used, and hands recordable ones to the unsynced net
24
+ so the poll tick re-drives them — one operation failing no longer skips its
25
+ siblings. And a failed quarantine write warns on the banner rather than rejecting.
26
+
27
+ ### Every mirror's `CLAUDE.md` says how to traverse the corpus
28
+
29
+ A new **Navigating the corpus** section: three lookup lines mapping a traversal
30
+ question to the surface that answers it — what points at X (`plinth backlinks`),
31
+ what this file links to (grep `[[`), and how to find a file by name, text inside a
32
+ PDF, or an entity by field.
33
+
34
+ `plinth backlinks` shipped in `0.6.0` and appeared in no generated context.
35
+ Measured on the live mirror, the generated text carried no `backlinks`, no
36
+ `wikilink` and no `[[`, while the command answered a real query with 7 files and
37
+ 16 occurrences. A/B on the live mirror, same question in two fresh sessions: with
38
+ the section, the first tool call was `plinth backlinks`; without it, `grep -ril`.
39
+
40
+ The generated file's line bound moves 51 → 56. Its schema-version stamp does not —
41
+ the section is inline literal text, and none of the five constants the stamp hashes
42
+ changed.
43
+
44
+ ## 0.7.0 — 2026-08-23
45
+
46
+ One PR and one docs commit since `0.6.0` (`v0.6.0..71c775c`). The mirror gains a
47
+ calendar the agent can read without opening one.
48
+
49
+ ### Each artist's calendar is projected into the mirror
50
+
51
+ `plinth start` now runs a second loop on its own 15-minute timer
52
+ (`PLINTH_CALENDAR_INTERVAL_MS`, one run at boot), writing `views/calendar/` into the
53
+ mirror: a file per mapped artist plus an `upcoming.md` across all of them.
54
+ Deliberately not the 15-second pull loop — one tick fans out to one Google call per
55
+ mapped calendar, which would breach the server route's 20/min limit inside a minute.
56
+
57
+ `/plinth:start` gains a step that reads one of those files. It still does not open a
58
+ calendar, and the generated text says so.
59
+
60
+ **An empty cache and a clear diary are not allowed to look alike.** `events: []` means
61
+ exactly one thing and is refused on any row that did not actually fetch; a failed
62
+ refresh keeps every body and rewrites only the header, so a stale view says it is
63
+ stale rather than saying nothing is on; an artist with no mapped calendar is named in
64
+ `upcoming.md` rather than silently absent.
65
+
66
+ **Requires the server's `GET /api/sync/calendar`** (`plinth` #257), live in
67
+ production. A 0.6.0 client is unaffected: it never calls it.
68
+
5
69
  ## 0.6.0 — 2026-08-20
6
70
 
7
71
  Eleven PRs since `0.5.0` (`v0.5.0..af8c7df`). A session in a mirror now opens and
package/README.md CHANGED
@@ -24,7 +24,7 @@ plinth start # run the daemon: continuous pull + watch + pu
24
24
 
25
25
  - `plinth login --workspace <slug>` — issue a personal access token in the browser, paste it back, store it in the OS keychain (macOS Keychain / Linux Secret Service / Windows Credential Manager).
26
26
  - `plinth sync [--workspace <slug>]` — one-shot pull into `~/Plinth/<workspace>/`. Also generates the workspace-root `CLAUDE.md` (a thin TOC + entity model + skill pointers), an empty `CLAUDE.local.md` stub on first sync, and the two session-boundary commands (below), and silently refreshes `CLAUDE.md` on a schema-version change. Defaults to the active workspace if `--workspace` is omitted.
27
- - `plinth start` — run the long-running sync daemon: pull the latest, then watch the mirror for local edits and push them. Logs to `~/.plinth/daemon.log`.
27
+ - `plinth start` — run the long-running sync daemon: pull the latest, then watch the mirror for local edits and push them. It also projects each mapped artist's Google calendar into `views/calendar/` in the mirror — a file per artist plus an `upcoming.md` — on its own 15-minute timer (`PLINTH_CALENDAR_INTERVAL_MS`), with one run at boot. That is deliberately not the 15-second pull cadence: one tick makes a Google call per mapped calendar, which would breach the server route's rate limit inside a minute. A refresh that fails keeps the last known bodies and rewrites only the header, so a stale view says it is stale rather than reading as an empty diary. Logs to `~/.plinth/daemon.log`.
28
28
  - `plinth status` — local sync state: daemon liveness, last sync and per-type counts, and any destructive batches being held. Warns when a source install's `dist/` is behind its checkout.
29
29
  - `plinth confirm` — review and release destructive batches the daemon has quarantined (apply, or `--discard`).
30
30
  - `plinth refresh-context [--workspace <slug>]` — force-regenerate the workspace-root `CLAUDE.md` **and the two generated commands** from the current Plinth schema + workspace. The user-customisable block between the `<!-- BEGIN: user-customisable -->` / `<!-- END -->` markers is always preserved verbatim in every generated file; `CLAUDE.local.md` is never touched.
@@ -1,5 +1,5 @@
1
1
  {
2
- "sha": "8ae75780594f0715a00b4ee07af7d49ec055c3fd",
2
+ "sha": "4a3be5d977539351a0cc5c0adc5617cb706b676b",
3
3
  "dirty": false,
4
- "built_at": "2026-08-20T17:35:39.314Z"
4
+ "built_at": "2026-08-23T20:04:35.148Z"
5
5
  }