@bli-cockpit/cli 0.2.248 → 0.2.249

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.
@@ -69,7 +69,7 @@ export function printSyncDetail(door, ref, body) {
69
69
  }
70
70
  return 0;
71
71
  }
72
- /** ticket 22178: who owns a stuck page, what was decided, which ticket carries it. Labels only; nothing is unlinked or resolved. */
72
+ /** ticket 22178: who owns a stuck page, what was decided, which ticket carries it. `unlink` unlinks in the call; `keep_tower`/`take_notion` apply on the next pass (the door's `note` says so). */
73
73
  export async function syncTriage(command, door) {
74
74
  const ref = command.docRef ?? "";
75
75
  const answer = await askAgentDoor(door, {
@@ -88,7 +88,7 @@ export async function syncTriage(command, door) {
88
88
  const changed = Array.isArray(body["changed"]) ? body["changed"].map(str) : [];
89
89
  writeLine(door.io.stdout, str(body["outcome"]) === "unchanged"
90
90
  ? "Nothing changed: those labels were already set."
91
- : `Saved ${changed.join(", ")}. Owner ${str(body["owner"]) || "unowned"}, decision ${str(body["decision"]) || "none"}, ticket ${str(body["ticket"]) || "none"}. Nothing was unlinked or resolved.`);
91
+ : `Saved ${changed.join(", ")}. Owner ${str(body["owner"]) || "unowned"}, decision ${str(body["decision"]) || "none"}, ticket ${str(body["ticket"]) || "none"}. ${str(body["note"]) || "Nothing else changed."}`);
92
92
  return 0;
93
93
  }
94
94
  async function syncResolve(command, door) {
@@ -3,7 +3,7 @@
3
3
  * from `local-help-commands-tower.ts` to keep that file under the readability ratchet.
4
4
  */
5
5
  export const DOCS_SYNC_HELP = [
6
- "sync-status <id|slug> — one linked page's Notion sync, from what the last push and pull passes RECORDED (Tower never asks Notion from a request): the state sentence, the newest push and pull receipt each with its reason label and age, what could not be carried (\"1 file kept only as a link\", blocks missing, content Tower cannot write back), the conflicts (versions a sync kept, open or resolved, newest 50 with a total) and the decisions made. A page Notion no longer shares reads \"Notion no longer shares this page\", not synced. A document that is not synced also says WHY (stuck_reason: the reason Notion gave, archived, in_trash, object_not_found, restricted or http_<code>, or the reason the last push refused it, e.g. notion_has_blocks_tower_cannot_write), its owner (or \"unowned\"), the decision and the ticket. Set them with `sync-status <id|slug> --owner me|<team member uuid>|none --decision unlink|take_notion|keep_tower|reshare|investigate|none --ticket <id>|none` (any one or more; labels only, nothing is unlinked or resolved; page editors only). --json adds { detail: { can_edit, state_sentence, last_receipt: { push, pull }, losses, conflicts: { total, open, shown, items: [{ version_id, version_number, origin, status, sentence, resolution }] }, resolutions, resolve_note, incomplete, as_of } }.",
6
+ "sync-status <id|slug> — one linked page's Notion sync, from what the last push and pull passes RECORDED (Tower never asks Notion from a request): the state sentence, the newest push and pull receipt each with its reason label and age, what could not be carried (\"1 file kept only as a link\", blocks missing, content Tower cannot write back), the conflicts (versions a sync kept, open or resolved, newest 50 with a total) and the decisions made. A page Notion no longer shares reads \"Notion no longer shares this page\", not synced. A document that is not synced also says WHY (stuck_reason: the reason Notion gave, archived, in_trash, object_not_found, restricted or http_<code>, or the reason the last push refused it, e.g. notion_has_blocks_tower_cannot_write), its owner (or \"unowned\"), the decision and the ticket. Set them with `sync-status <id|slug> --owner me|<team member uuid>|none --decision unlink|take_notion|keep_tower|reshare|investigate|none --ticket <id>|none` (any one or more; page editors only). A decision takes effect: unlink unlinks in that call; keep_tower is applied by the next push pass (Tower's edits go to Notion, the Notion content Tower cannot write stays in place, or the push refuses by name and the page stays stuck); take_notion is applied by the next pull pass (Notion's text becomes the page's text, Tower's kept as a version); reshare and investigate are notes. A Notion database folder (todo-list, daily-stand-ups) refuses a decision (database_folder_not_decidable). --json adds { detail: { can_edit, state_sentence, last_receipt: { push, pull }, losses, conflicts: { total, open, shown, items: [{ version_id, version_number, origin, status, sentence, resolution }] }, resolutions, resolve_note, incomplete, as_of } }.",
7
7
  "sync-resolve <id|slug> --version <id> --keep-current|--use-kept [--expected-revision <n>] [--request-id <uuid>] — decide one conflict; you choose, Tower never picks. --keep-current records the decision and writes no text. --use-kept makes the kept version the page's current text through a version restore (a new history row, revision +1) over your --expected-revision (the page revision you read; stale = revision_conflict, nothing is written or recorded), then records the decision. One decision per kept version: a repeat answers already_resolved with the stored one and writes nothing. Refusals: resolution_write_refused (not a page editor), not_a_sync_conflict (an ordinary version), version_not_found, invalid_resolution. The next push sends the restored text to Notion through the same checks as any push; a page Notion holds content on that Tower cannot write stays protected. --json shape: { ok, outcome: resolved|already_resolved, document_id, resolution: { version_id, choice, resolved_by, resolved_at, resulting_revision }, revision, body_written, note }.",
8
8
  "manifest [--under <id|slug>] [--cursor <c>] [--all] [--out <file>] — the library export manifest for a Notion cutover review: readiness facts only, no cutover verdict and no Notion turn-off. Per page you can read (another person's private page never appears): id, slug, title, parent, visibility, author, revision, body_sha256, body_chars, Notion link, editor ids (\"not_visible\" when you may not see them), files (id, name, type, byte size, state; no URLs, no bytes) and no body. 2,000 pages per call with next_cursor; --all walks every call (at most 100) and reports requested, returned, unique and coverage exhausted|capped|failed_partial (a failed call keeps the pages already read and prints the cursor to resume). --out writes the full JSON to a new file (never overwrites). --json shape: { ok, entries, requested, returned, unique, coverage: { status, calls, reason? }, coverage_text, failures: [{ stage, reason, count, document_ids }], next_cursor, under, generated_at }.",
9
9
  ];
@@ -21,7 +21,7 @@ export async function runCockpitCli(argv, io) {
21
21
  }
22
22
 
23
23
  if (command === "--version" || command === "-V" || command === "version") {
24
- writeLine(io?.stdout ?? process.stdout, "0.2.248");
24
+ writeLine(io?.stdout ?? process.stdout, "0.2.249");
25
25
  return 0;
26
26
  }
27
27
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bli-cockpit/cli",
3
- "version": "0.2.248",
3
+ "version": "0.2.249",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "bin": {
@@ -28,7 +28,7 @@
28
28
  },
29
29
  "dependencies": {
30
30
  "@bli-cockpit/memory-mcp": "0.1.73",
31
- "@bli-cockpit/mcp": "0.1.152",
31
+ "@bli-cockpit/mcp": "0.1.153",
32
32
  "@bli-cockpit/telemetry-core": "0.1.80"
33
33
  },
34
34
  "repository": {