@plinth-music/cli 0.10.0 → 0.10.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 +11 -0
- package/dist/build-stamp.json +2 -2
- package/dist/cli.js +45 -11
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,17 @@
|
|
|
2
2
|
|
|
3
3
|
Notable changes to `@plinth-music/cli`. Grouped by what a user notices, not by PR.
|
|
4
4
|
|
|
5
|
+
## 0.10.1 - 2026-08-26
|
|
6
|
+
|
|
7
|
+
One PR since `0.10.0` (`v0.10.0..82441a1`, #121). Generated command text and its tests only, so a patch. Every mirror receives it on its next sync; there is no server prerequisite.
|
|
8
|
+
|
|
9
|
+
### `/plinth:close` banks the session where a teammate can open it
|
|
10
|
+
|
|
11
|
+
- **The session record goes into the artist's own page.** Closing a session writes a dated section under `## Session log` at the bottom of `artists/<slug>/_artist.md` - the synced body the app renders in the Knowledge Base context pane - for each artist the session touched. A session that touched no artist writes one dated note under `documents/`. It used to go to `artists/<slug>/daily-log.md`, a local file nothing synced and no teammate could open; one artist's had reached 35 KB.
|
|
12
|
+
- **Five sections are kept per artist.** Before an older one drops off, anything still true is lifted into that artist's `memory.md`. The close re-reads the page immediately before writing and appends only its own section; another session's section may be dropped by the cap, never reworded. There is no server limit on an artist body, so this prose bound is the only bound.
|
|
13
|
+
- **The shared-memory step only proposes rules you stated** - "always", "never", "from now on", "our policy is", or a confirmation to that effect in the conversation. Session detail is in the record and is not proposed, and zero candidates is the normal outcome. Measured on one live workspace before this change: of 33 proposals, 23 were rejected, the last six in a row.
|
|
14
|
+
- `/plinth:start` briefs from the `## Session log`. `daily-log.md` is named as older local history on every generated surface and as a destination on none; a new artist's stub says so as well.
|
|
15
|
+
|
|
5
16
|
## 0.10.0 — 2026-08-26
|
|
6
17
|
|
|
7
18
|
Eleven PRs since `0.9.1` (`v0.9.1..9e27349`, #106 and #108–#117; #107 was superseded
|
package/dist/build-stamp.json
CHANGED
package/dist/cli.js
CHANGED
|
@@ -7584,7 +7584,7 @@ function _getBuiltinFlags(long, short, userNames, userAliases) {
|
|
|
7584
7584
|
// package.json
|
|
7585
7585
|
var package_default = {
|
|
7586
7586
|
name: "@plinth-music/cli",
|
|
7587
|
-
version: "0.10.
|
|
7587
|
+
version: "0.10.1",
|
|
7588
7588
|
description: "Plinth capstone sync daemon and CLI",
|
|
7589
7589
|
type: "module",
|
|
7590
7590
|
private: false,
|
|
@@ -27878,7 +27878,7 @@ function buildBody(input) {
|
|
|
27878
27878
|
lines.push(`- Closed/archived, meetings & full lists: \`mcp__plinth__list_projects\` / \`mcp__plinth__list_tasks\`${artistIdHint(uuid3)}`);
|
|
27879
27879
|
lines.push(`- Schema: ${MCP_INTROSPECTION_POINTER}`);
|
|
27880
27880
|
lines.push(`- Long-term facts → \`./memory.md\`, which syncs to this artist's Plinth record. Most artists have none yet: the file appears once the record carries memory, and creating it here is how you start one. One line per fact with its source and an absolute date; when a fact goes wrong, edit that line rather than adding a second`);
|
|
27881
|
-
lines.push(`-
|
|
27881
|
+
lines.push(`- What a session did → a dated section under \`## Session log\` at the bottom of \`./_artist.md\` but ABOVE any \`<!-- BEGIN: contacts -->\` block, which is rendered from Plinth and overwrites anything inside it on the next sync. That body syncs, so a teammate opens the record in the app. Keep the five most recent; a fact that outlives them belongs in \`./memory.md\` above. \`./daily-log.md\` is local scratch, never synced; an older one may hold real history, and nothing writes there now`);
|
|
27882
27882
|
lines.push("");
|
|
27883
27883
|
lines.push(USER_BLOCK_BEGIN);
|
|
27884
27884
|
lines.push(USER_BLOCK_PLACEHOLDER);
|
|
@@ -28479,8 +28479,8 @@ function ensureStub(workspaceSlug, relativePath, content) {
|
|
|
28479
28479
|
function dailyLogStub(name) {
|
|
28480
28480
|
return `# ${name} - Daily log
|
|
28481
28481
|
|
|
28482
|
-
` + `<!--
|
|
28483
|
-
` + `<!--
|
|
28482
|
+
` + `<!-- Your own scratch notes; edit freely, Plinth never overwrites this file. -->
|
|
28483
|
+
` + `<!-- Nothing writes here now: a session's record goes under ## Session log in ./_artist.md, and durable facts in ./memory.md. Both sync; this file does not. -->
|
|
28484
28484
|
`;
|
|
28485
28485
|
}
|
|
28486
28486
|
function backupStamp(d) {
|
|
@@ -28572,7 +28572,7 @@ function buildStartCommandMd(rosterIsEmpty2) {
|
|
|
28572
28572
|
"",
|
|
28573
28573
|
"## Loading area context",
|
|
28574
28574
|
"",
|
|
28575
|
-
"Once the user names something, resolve it against the workspace before answering: search the Plinth MCP, or read the roster in `CLAUDE.md`. **Never answer from name recognition alone.** Then read the surfaces that carry it. An artist's master context is `artists/<slug>/_artist.md`, their durable facts are `artists/<slug>/memory.md
|
|
28575
|
+
"Once the user names something, resolve it against the workspace before answering: search the Plinth MCP, or read the roster in `CLAUDE.md`. **Never answer from name recognition alone.** Then read the surfaces that carry it. An artist's master context is `artists/<slug>/_artist.md`, whose `## Session log` carries what recent sessions did; their durable facts are `artists/<slug>/memory.md`. Older local history may sit in `artists/<slug>/daily-log.md`, which nothing writes to any more. Brief on what is live, not on what you opened.",
|
|
28576
28576
|
"",
|
|
28577
28577
|
"If nothing resolves, say so plainly and ask. Do not invent an entity.",
|
|
28578
28578
|
"",
|
|
@@ -28628,7 +28628,23 @@ function buildCloseCommandMd(workspaceSlug) {
|
|
|
28628
28628
|
"",
|
|
28629
28629
|
"- **Something to do** goes to a Plinth task, scoped to its artist or project, with an owner and a real due date where one exists. Fold it into the existing umbrella task rather than adding a second.",
|
|
28630
28630
|
"- **State or context that changed** goes to the artist's master context, the body of `artists/<slug>/_artist.md`, or to the project's summary. Prose goes through the mirror file.",
|
|
28631
|
-
"- **What happened
|
|
28631
|
+
"- **What happened this session** goes to the artist's own record: a dated section in the body of `artists/<slug>/_artist.md`, one per artist touched. Prose, the way a hub carries it - what was discussed, what was decided, what was done, what is still open. **This is the half a teammate can open.** That body syncs to the artist's Plinth record and the app renders it in the Knowledge Base context pane, so a session banked here is one somebody else can pick up cold. **It is a record of a session, not a statement of where things stand**: current state belongs in the prose above it, edited in place, which is the bullet before this one. A log that accumulates live state rots, and that is the failure this step was moved to escape.",
|
|
28632
|
+
"",
|
|
28633
|
+
"**Where the record goes in the file, and it is not the top.** One `## Session log` heading at the **bottom** of the body, newest section first beneath it. The pane renders the whole body, so the master context has to read first and the log sits under it. If the file carries a `<!-- BEGIN: contacts -->` block, the log goes **above** that marker: everything between the contacts markers is rendered from Plinth and is overwritten on the next sync.",
|
|
28634
|
+
"",
|
|
28635
|
+
"```md",
|
|
28636
|
+
"## Session log",
|
|
28637
|
+
"",
|
|
28638
|
+
"### 2026-03-14",
|
|
28639
|
+
"",
|
|
28640
|
+
"<what was discussed, what was decided, what was done, what is still open>",
|
|
28641
|
+
"```",
|
|
28642
|
+
"",
|
|
28643
|
+
"**Re-read `_artist.md` at the moment you write it, and add only your own dated section.** Other people close sessions in this workspace too, and this file syncs: when two closes touch one artist at once the cloud copy wins and the other edit is set aside, seconds after you wrote it. **Step 2's conflicts read cannot catch that: it ran before this write.** Step 6 re-reads it, and that is the check covering what you write here. So read the file now rather than trusting what it said earlier in the session, and never reword a section another session wrote.",
|
|
28644
|
+
"",
|
|
28645
|
+
"**Keep the five most recent dated sections.** Adding a sixth means dropping the oldest - but first take anything in it that is still true and write it into `artists/<slug>/memory.md`, where durable facts live. If nothing in it survives that test it was not durable, and dropping it costs nothing. **Removing an old section is the one edit you may make to someone else's: you may drop it, never reword it.** Without this bound the record grows without limit on a synced column, and every teammate loads the whole of it on every session.",
|
|
28646
|
+
"",
|
|
28647
|
+
"**A session that touched no artist writes one dated note under `documents/` instead**, with the same content. That is a new file rather than an edit to a tracked one, so it reaches the cloud only with the sync running - Step 2 is where you already saw whether it is.",
|
|
28632
28648
|
"",
|
|
28633
28649
|
"## Step 4: bank what was learned, by type first and scope second",
|
|
28634
28650
|
"",
|
|
@@ -28673,10 +28689,10 @@ function buildCloseCommandMd(workspaceSlug) {
|
|
|
28673
28689
|
"<!-- Durable facts about <Artist> that hold across sessions. One line per fact, with",
|
|
28674
28690
|
" provenance and an absolute date. SUPERSEDE, do not accumulate - when a fact here",
|
|
28675
28691
|
" becomes wrong, edit that line in place rather than adding a contradicting one.",
|
|
28676
|
-
" Live state does NOT belong here - that goes in
|
|
28692
|
+
" Live state does NOT belong here - that goes in the body of `_artist.md`. -->",
|
|
28677
28693
|
"```",
|
|
28678
28694
|
"",
|
|
28679
|
-
"**Live state does not go here.** This week's open threads, one show's logistics, where a release has got to: that is Step 3's business, and it goes
|
|
28695
|
+
"**Live state does not go here.** This week's open threads, one show's logistics, where a release has got to: that is Step 3's business, and it goes in the body of `artists/<slug>/_artist.md`. This file is for what stays true after the session that taught it.",
|
|
28680
28696
|
"",
|
|
28681
28697
|
"#### True of this member: `user-memory.md` at the mirror root. Write it directly.",
|
|
28682
28698
|
"",
|
|
@@ -28688,7 +28704,13 @@ function buildCloseCommandMd(workspaceSlug) {
|
|
|
28688
28704
|
"",
|
|
28689
28705
|
"#### True of the whole workspace: `workspace-memory.md` at the mirror root. Propose. Never write unasked.",
|
|
28690
28706
|
"",
|
|
28691
|
-
"**This is the only gated pile**, and a fact that names a single artist is almost never in it.
|
|
28707
|
+
"**This is the only gated pile**, and a fact that names a single artist is almost never in it.",
|
|
28708
|
+
"",
|
|
28709
|
+
`**The test is what the user SAID, not what you concluded.** A line belongs here only if they stated it as how this workspace operates - "always", "never", "from now on", "our policy is", or a confirmation in the transcript that amounts to one. Something you inferred from a single event is not that, however durable it looks: it is this session's detail, Step 3 has already banked it in the record, and it is not proposed here.`,
|
|
28710
|
+
"",
|
|
28711
|
+
"**Most sessions have nothing for this pile, and that is the expected outcome rather than a failure to look.** Proposing nothing is a clean close: log it with `--nothing-proposed` below, which is this step's ordinary line and not an exception to it. A gate that finds a candidate every session is not discriminating, it is manufacturing them out of what happened.",
|
|
28712
|
+
"",
|
|
28713
|
+
"For anything that does pass, draft the candidate lines first.",
|
|
28692
28714
|
"",
|
|
28693
28715
|
"**Each line has a required shape, and it is the file's own, not this command's.** `workspace-memory.md` is an INDEX, and the grounding block tells every future session that each line is a one-line hook pointing via a `[[wikilink]]` to the warm store where the full detail lives. So a line carries: the hook, a `[[wikilink]]` to where the detail actually is, an **absolute** date (turn \"last week\" into a real one), and what taught you it. **A line with no warm store behind it makes the grounding block lie to every session that loads it.** Read the file's header comment and follow the conventions there; where it and this command disagree, the file wins.",
|
|
28694
28716
|
"",
|
|
@@ -28738,7 +28760,19 @@ function buildCloseCommandMd(workspaceSlug) {
|
|
|
28738
28760
|
"",
|
|
28739
28761
|
"## Step 6: summarise, then end the session",
|
|
28740
28762
|
"",
|
|
28741
|
-
"**
|
|
28763
|
+
"**First, re-read the conflicts list.** Everything this close wrote - the session record in Step 3, the memory files in Step 4, the accepted lines at the end of Step 5 - landed AFTER Step 2 looked, and a losing write is set aside within seconds of being made. Step 2 therefore cannot have seen it. Read the list again now:",
|
|
28764
|
+
"",
|
|
28765
|
+
"```sh",
|
|
28766
|
+
`plinth status ${ws}`,
|
|
28767
|
+
"```",
|
|
28768
|
+
"",
|
|
28769
|
+
`And \`${CONFLICTS_VIEW_REL_PATH}\` beside it, which carries a restore command per file.`,
|
|
28770
|
+
"",
|
|
28771
|
+
"**Where those two disagree here, believe the command.** Its Conflicts line is read straight off the folder on disk at the moment you run it. The file is a projection the sync rewrites at the end of a pull, so at this point in a close - seconds after your own write, possibly before the next poll - it can still be showing the list from before. That is the one moment in this ritual where the file is the more likely of the two to be stale, which is the opposite of Step 2.",
|
|
28772
|
+
"",
|
|
28773
|
+
"**Anything named there was NOT banked, whatever the write appeared to return.** Say so plainly, name the file, and point the user at the restore command rather than reporting the work as done. A close that reports a stashed session record as banked is the one failure this step exists to prevent, because the record was the point of the close.",
|
|
28774
|
+
"",
|
|
28775
|
+
"**Five to seven lines**, and no file-by-file dump: **where the session record went, named per artist**, what now lives on a durable surface, what is still in flight and on whom, **what was banked to memory and to which of the three piles**, anything you named as having no home yet, any date you handed to a person, and the obvious next move.",
|
|
28742
28776
|
"",
|
|
28743
28777
|
"Then, as the **very last step**:",
|
|
28744
28778
|
"",
|
|
@@ -28970,7 +29004,7 @@ function buildWorkspaceClaudeMd(input) {
|
|
|
28970
29004
|
`- Each artist's **master context** (stable profile + current state) → \`artists/<slug>/_artist.md\`; edit its body and the daemon syncs both ways. Blocks labelled "rendered from Plinth" are the exception: they are overwritten on the next sync`,
|
|
28971
29005
|
`- **Contracts, executed agreements & any PDF** → \`files/\` (search here first; \`documents/\` holds markdown bodies, not attachments)`,
|
|
28972
29006
|
`- Workspace-wide **notes, briefs, bios & context docs** → \`documents/\` (one markdown file per doc, shared across artists)`,
|
|
28973
|
-
`- Per-artist long-term facts → \`artists/<slug>/memory.md\`, which syncs to that artist's Plinth record; most have none yet, and creating the file is how you start one ·
|
|
29007
|
+
`- Per-artist long-term facts → \`artists/<slug>/memory.md\`, which syncs to that artist's Plinth record; most have none yet, and creating the file is how you start one · what a session did → a dated section under \`## Session log\` in \`artists/<slug>/_artist.md\`, which syncs too · \`artists/<slug>/daily-log.md\` is local scratch, never synced; an older one may hold real history, and nothing writes there now`,
|
|
28974
29008
|
`- ${MCP_AVAILABILITY_POINTER}`,
|
|
28975
29009
|
``,
|
|
28976
29010
|
`## Navigating the corpus`,
|