@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 +48 -0
- package/dist/index.js +165 -8
- package/dist/index.js.map +1 -1
- package/package.json +4 -4
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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);
|