@arbidocs/cli 0.3.139 → 0.3.141

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,5 +1,53 @@
1
1
  # Changelog
2
2
 
3
+ ## v0.3.141
4
+
5
+ [compare changes](https://github.com/arbicity/ARBI-frontend/compare/v0.3.140...HEAD)
6
+
7
+ ### 🚀 Enhancements
8
+
9
+ - **auth:** Split registration into verify-then-complete ([0cb104a7](https://github.com/arbicity/ARBI-frontend/commit/0cb104a7))
10
+ - **auth:** Add an "I already have my code" path, drop the address from the preface ([a4ec99eb](https://github.com/arbicity/ARBI-frontend/commit/a4ec99eb))
11
+ - **auth:** One reset control, format hint on the code, plainer password label ([565b4136](https://github.com/arbicity/ARBI-frontend/commit/565b4136))
12
+ - **auth:** Reduce the save-password dialog to three choices ([8fb16d2e](https://github.com/arbicity/ARBI-frontend/commit/8fb16d2e))
13
+ - **auth:** Put the zero-knowledge explanation behind an info icon ([a368d1d9](https://github.com/arbicity/ARBI-frontend/commit/a368d1d9))
14
+ - **auth:** State the acknowledgement above an Agree and Continue button ([1092832f](https://github.com/arbicity/ARBI-frontend/commit/1092832f))
15
+ - **contacts:** Show what actually happened to each invited address ([#1153](https://github.com/arbicity/ARBI-frontend/pull/1153))
16
+ - **notes:** Timeline support — dated notes, spans, reminders ([b24f15ea](https://github.com/arbicity/ARBI-frontend/commit/b24f15ea))
17
+
18
+ ### 🩹 Fixes
19
+
20
+ - **ci:** Pass ARBI_TEST_DEPLOYMENT_DOMAIN to the CLI integration step ([00124268](https://github.com/arbicity/ARBI-frontend/commit/00124268))
21
+ - **ui:** Recover from a dismissed modal that leaves the page unclickable ([cb41c32f](https://github.com/arbicity/ARBI-frontend/commit/cb41c32f))
22
+ - **a11y:** Repair leaked aria-hidden left by a dismissed modal ([a1511115](https://github.com/arbicity/ARBI-frontend/commit/a1511115))
23
+ - **input:** Flush a pending edit on blur instead of discarding it ([1d894b7d](https://github.com/arbicity/ARBI-frontend/commit/1d894b7d))
24
+ - **input:** Commit a queued edit on unmount as well as blur ([41733b8b](https://github.com/arbicity/ARBI-frontend/commit/41733b8b))
25
+ - **input:** Stop a background refetch eating what the user is typing ([0890921e](https://github.com/arbicity/ARBI-frontend/commit/0890921e))
26
+ - **auth:** Score password strength by entropy, and stop shouting the verdict ([e846477b](https://github.com/arbicity/ARBI-frontend/commit/e846477b))
27
+ - **auth:** One status line for the password, with advice you can click ([3796bb81](https://github.com/arbicity/ARBI-frontend/commit/3796bb81))
28
+ - **auth:** One primary action in the save-password dialog ([09b7b379](https://github.com/arbicity/ARBI-frontend/commit/09b7b379))
29
+ - Canonicalize folder paths so drive-synced folders with padded names are navigable ([#1147](https://github.com/arbicity/ARBI-frontend/pull/1147))
30
+
31
+ ### ✅ Tests
32
+
33
+ - **e2e:** Adapt the upload helpers and assertions to the current UI ([c134f591](https://github.com/arbicity/ARBI-frontend/commit/c134f591))
34
+ - **e2e:** Fix the multi-file upload label assertion too ([75685a83](https://github.com/arbicity/ARBI-frontend/commit/75685a83))
35
+ - **e2e:** Reset row height to INITIAL, match the real view label, wait for interactivity ([547203e9](https://github.com/arbicity/ARBI-frontend/commit/547203e9))
36
+ - **e2e:** Allow for the field-edit round trip in value assertions ([ae5eae87](https://github.com/arbicity/ARBI-frontend/commit/ae5eae87))
37
+
38
+ ### 🤖 CI
39
+
40
+ - **e2e:** Don't fail the job on an artifact upload ([153c6c97](https://github.com/arbicity/ARBI-frontend/commit/153c6c97))
41
+ - **e2e:** Reclaim images and build cache, not just containers ([a7cba1d1](https://github.com/arbicity/ARBI-frontend/commit/a7cba1d1))
42
+
43
+ ## v0.3.140
44
+
45
+ [compare changes](https://github.com/arbicity/ARBI-frontend/compare/v0.3.139...HEAD)
46
+
47
+ ### 🚀 Enhancements
48
+
49
+ - **messages:** Live per-turn AI credit usage in MessageInput + per-step trace cost ([#1144](https://github.com/arbicity/ARBI-frontend/pull/1144))
50
+
3
51
  ## v0.3.139
4
52
 
5
53
  [compare changes](https://github.com/arbicity/ARBI-frontend/compare/v0.3.138...HEAD)
package/dist/index.js CHANGED
@@ -3694,7 +3694,7 @@ function getLatestVersion(skipCache = false) {
3694
3694
  }
3695
3695
  }
3696
3696
  function getCurrentVersion() {
3697
- return "0.3.139";
3697
+ return "0.3.141";
3698
3698
  }
3699
3699
  function readChangelog(fromVersion, toVersion) {
3700
3700
  try {
@@ -3747,17 +3747,17 @@ function showChangelog(fromVersion, toVersion) {
3747
3747
  async function checkForUpdates(autoUpdate) {
3748
3748
  try {
3749
3749
  const latest = getLatestVersion();
3750
- if (!latest || latest === "0.3.139") return;
3750
+ if (!latest || latest === "0.3.141") return;
3751
3751
  if (autoUpdate) {
3752
3752
  warn(`
3753
- Your arbi version is out of date (${"0.3.139"} \u2192 ${latest}). Updating...`);
3753
+ Your arbi version is out of date (${"0.3.141"} \u2192 ${latest}). Updating...`);
3754
3754
  child_process.execSync("npm install -g @arbidocs/cli@latest", { stdio: "inherit" });
3755
- showChangelog("0.3.139", latest);
3755
+ showChangelog("0.3.141", latest);
3756
3756
  console.log(`Updated to ${latest}.`);
3757
3757
  } else {
3758
3758
  warn(
3759
3759
  `
3760
- Your arbi version is out of date (${"0.3.139"} \u2192 ${latest}).
3760
+ Your arbi version is out of date (${"0.3.141"} \u2192 ${latest}).
3761
3761
  Run "arbi update" to upgrade, or "arbi update auto" to always stay up to date.`
3762
3762
  );
3763
3763
  }
@@ -3789,10 +3789,10 @@ function markNagShown(latest) {
3789
3789
  function hintUpdateOnError() {
3790
3790
  try {
3791
3791
  const cached = readCache();
3792
- if (!cached || cached.latest === "0.3.139") return;
3792
+ if (!cached || cached.latest === "0.3.141") return;
3793
3793
  if (!shouldShowNag(cached.latest)) return;
3794
3794
  warn(
3795
- `Your arbi version is out of date (${"0.3.139"} \u2192 ${cached.latest}). Run "arbi update".`
3795
+ `Your arbi version is out of date (${"0.3.141"} \u2192 ${cached.latest}). Run "arbi update".`
3796
3796
  );
3797
3797
  markNagShown(cached.latest);
3798
3798
  } catch {
@@ -8188,6 +8188,162 @@ function registerContactsCommand(program2) {
8188
8188
  });
8189
8189
  }
8190
8190
  init_prompts();
8191
+ function formatSpan(startIso, endIso) {
8192
+ const start = new Date(startIso);
8193
+ const end = new Date(endIso);
8194
+ if (startIso === endIso) {
8195
+ return start.toISOString().replace("T", " ").slice(0, 19) + "Z";
8196
+ }
8197
+ const wholeDays = start.getUTCHours() === 0 && start.getUTCMinutes() === 0 && end.getUTCHours() === 23 && end.getUTCMinutes() === 59;
8198
+ if (wholeDays) {
8199
+ const sameDay = start.toISOString().slice(0, 10) === end.toISOString().slice(0, 10);
8200
+ if (sameDay) return start.toISOString().slice(0, 10);
8201
+ const firstOfMonth = start.getUTCDate() === 1;
8202
+ const sameMonth = start.toISOString().slice(0, 7) === end.toISOString().slice(0, 7);
8203
+ if (firstOfMonth && sameMonth) return start.toISOString().slice(0, 7);
8204
+ const wholeYear = firstOfMonth && start.getUTCMonth() === 0 && end.getUTCMonth() === 11;
8205
+ if (wholeYear) return String(start.getUTCFullYear());
8206
+ return `${start.toISOString().slice(0, 10)} \u2192 ${end.toISOString().slice(0, 10)}`;
8207
+ }
8208
+ return `${start.toISOString().slice(0, 16)}Z \u2192 ${end.toISOString().slice(0, 16)}Z`;
8209
+ }
8210
+ async function fetchDatedNoteChoices(arbi) {
8211
+ const data = await sdk.notes.listNotes(arbi, { datedOnly: true });
8212
+ if (data.length === 0) {
8213
+ process.stderr.write("No dated notes found.\n");
8214
+ process.exit(0);
8215
+ }
8216
+ return {
8217
+ data,
8218
+ choices: data.map((e) => ({
8219
+ name: `${formatSpan(e.date_start, e.date_end)} \u2014 ${e.text}`,
8220
+ value: e.external_id,
8221
+ description: e.external_id
8222
+ }))
8223
+ };
8224
+ }
8225
+ function registerTimelineCommand(program2) {
8226
+ const timeline = program2.command("timeline").description("Timeline of dated notes: list, add, update, remind, delete");
8227
+ timeline.command("list", { isDefault: true }).description("Dated notes in the active workspace, soonest first").option("-w, --workspace <id>", "Workspace ID (defaults to selected workspace)").option("--from <date>", "Range start, any precision (2019, 2019-10, 2019-10-14)").option("--to <date>", "Range end, any precision").option("--json", "Output as JSON").action(
8228
+ (opts) => runAction(async () => {
8229
+ const { arbi } = await resolveWorkspace(opts.workspace);
8230
+ const data = await sdk.notes.listNotes(arbi, {
8231
+ from: opts.from,
8232
+ to: opts.to,
8233
+ // Without this the server has no reason to treat the request as a
8234
+ // timeline and falls back to newest-written first.
8235
+ datedOnly: true
8236
+ });
8237
+ if (opts.json) {
8238
+ printJson(data);
8239
+ return;
8240
+ }
8241
+ if (data.length === 0) {
8242
+ process.stderr.write("No dated notes found.\n");
8243
+ return;
8244
+ }
8245
+ printTable(
8246
+ [
8247
+ {
8248
+ header: "WHEN",
8249
+ width: 24,
8250
+ value: (r) => formatSpan(r.date_start, r.date_end)
8251
+ },
8252
+ { header: "NOTE", width: 52, value: (r) => r.text },
8253
+ {
8254
+ header: "TAGS",
8255
+ width: 20,
8256
+ value: (r) => r.tags.map((t) => t.name).join(", ")
8257
+ },
8258
+ { header: "ID", width: 14, value: (r) => r.external_id }
8259
+ ],
8260
+ data
8261
+ );
8262
+ })()
8263
+ );
8264
+ timeline.command("add [description...]").description("Add a dated note (prompts if arguments are omitted)").option("-w, --workspace <id>", "Workspace ID (defaults to selected workspace)").option("-d, --date <date>", "Date, any precision (2019, 2019-10, 2019-10-14, or a timestamp)").option("--end <date>", "End of a custom range (takes the end of its own precision)").option("--timezone <iana>", "IANA zone for a real appointment, e.g. America/New_York").option("--shared", "Visible to all workspace collaborators").option("--json", "Output as JSON").action(
8265
+ (words, opts) => runAction(async () => {
8266
+ const { arbi } = await resolveWorkspace(opts.workspace);
8267
+ const description = words.join(" ").trim() || await promptInput("What happened?");
8268
+ const date = opts.date ?? await promptInput("When? (2019, 2019-10, 2019-10-14, or a timestamp)");
8269
+ const created = await sdk.notes.createNote(arbi, {
8270
+ text: description,
8271
+ date,
8272
+ date_end: opts.end ?? null,
8273
+ timezone: opts.timezone ?? null,
8274
+ pinned: false,
8275
+ source: "manual",
8276
+ shared: Boolean(opts.shared),
8277
+ tag_ext_ids: [],
8278
+ citations: null
8279
+ });
8280
+ if (opts.json) {
8281
+ printJson(created);
8282
+ return;
8283
+ }
8284
+ success(
8285
+ `Added ${ref(created.external_id)} \u2014 ${formatSpan(created.date_start, created.date_end)}`
8286
+ );
8287
+ })()
8288
+ );
8289
+ timeline.command("update [id] [json]").description("Patch a dated note (picker + form if arguments are omitted)").option("-w, --workspace <id>", "Workspace ID (defaults to selected workspace)").option("--json", "Output as JSON").action(
8290
+ (id, json, opts) => runAction(async () => {
8291
+ const { arbi } = await resolveWorkspace(opts.workspace);
8292
+ let eventId = id;
8293
+ if (!eventId) {
8294
+ const { choices } = await fetchDatedNoteChoices(arbi);
8295
+ eventId = await promptSelect("Which note?", choices);
8296
+ }
8297
+ const body = json ? parseJsonArg(json, '{"description":"Hearing moved","date":"2025-09-08"}') : {
8298
+ text: await promptInput("Text (blank to keep)", false) || void 0,
8299
+ date: await promptInput("Date (blank to keep)", false) || void 0
8300
+ };
8301
+ const updated = await sdk.notes.updateNote(arbi, eventId, body);
8302
+ if (opts.json) {
8303
+ printJson(updated);
8304
+ return;
8305
+ }
8306
+ success(`Updated ${ref(updated.external_id)}`);
8307
+ })()
8308
+ );
8309
+ timeline.command("remind [id]").description("Set a one-off reminder for a dated note").option("-w, --workspace <id>", "Workspace ID (defaults to selected workspace)").option("--at <when>", "Explicit reminder time (any precision)").option("--lead <minutes>", "Minutes before the event starts", (v) => Number.parseInt(v, 10)).option("--json", "Output as JSON").action(
8310
+ (id, opts) => runAction(async () => {
8311
+ const { arbi } = await resolveWorkspace(opts.workspace);
8312
+ let eventId = id;
8313
+ if (!eventId) {
8314
+ const { choices } = await fetchDatedNoteChoices(arbi);
8315
+ eventId = await promptSelect("Remind me about which note?", choices);
8316
+ }
8317
+ const reminded = await sdk.notes.remindNote(arbi, eventId, {
8318
+ remindAt: opts.at,
8319
+ leadMinutes: opts.lead
8320
+ });
8321
+ if (opts.json) {
8322
+ printJson(reminded);
8323
+ return;
8324
+ }
8325
+ success(`Reminder set on ${ref(reminded.external_id)} (${ref(reminded.task_ext_id ?? "")})`);
8326
+ })()
8327
+ );
8328
+ timeline.command("delete [id]").description("Delete a note (picker if no ID)").option("-w, --workspace <id>", "Workspace ID (defaults to selected workspace)").option("-y, --yes", "Skip confirmation").action(
8329
+ (id, opts) => runAction(async () => {
8330
+ const { arbi } = await resolveWorkspace(opts.workspace);
8331
+ let eventId = id;
8332
+ if (!eventId) {
8333
+ const { choices } = await fetchDatedNoteChoices(arbi);
8334
+ eventId = await promptSelect("Delete which note?", choices);
8335
+ }
8336
+ if (!eventId) return;
8337
+ if (!opts.yes && !await promptConfirm(`Delete ${eventId}?`, false)) {
8338
+ process.stderr.write("Cancelled.\n");
8339
+ return;
8340
+ }
8341
+ await sdk.notes.deleteNote(arbi, eventId);
8342
+ success(`Deleted ${ref(eventId)}`);
8343
+ })()
8344
+ );
8345
+ }
8346
+ init_prompts();
8191
8347
  async function fetchTagChoices(arbi) {
8192
8348
  const data = await sdk.tags.listTags(arbi);
8193
8349
  if (data.length === 0) {
@@ -10488,7 +10644,7 @@ console.info = (...args) => {
10488
10644
  _origInfo(...args);
10489
10645
  };
10490
10646
  var program = new commander.Command();
10491
- program.name("arbi").description("ARBI CLI \u2014 interact with ARBI from the terminal").version("0.3.139").showHelpAfterError(true).showSuggestionAfterError(true);
10647
+ program.name("arbi").description("ARBI CLI \u2014 interact with ARBI from the terminal").version("0.3.141").showHelpAfterError(true).showSuggestionAfterError(true);
10492
10648
  registerConfigCommand(program);
10493
10649
  registerLoginCommand(program);
10494
10650
  registerRegisterCommand(program);
@@ -10505,6 +10661,7 @@ registerWatchCommand(program);
10505
10661
  registerContactsCommand(program);
10506
10662
  registerDmCommand(program);
10507
10663
  registerTagsCommand(program);
10664
+ registerTimelineCommand(program);
10508
10665
  registerDoctagsCommand(program);
10509
10666
  registerConversationsCommand(program);
10510
10667
  registerSettingsCommand(program);