@leemour/max-cli 0.2.0 → 0.3.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/README.md +3 -3
- package/dist/cache/index.d.ts.map +1 -1
- package/dist/cache/index.js +3 -0
- package/dist/cache/index.js.map +1 -1
- package/dist/cache/schema.d.ts +4 -1
- package/dist/cache/schema.d.ts.map +1 -1
- package/dist/cache/schema.js +89 -2
- package/dist/cache/schema.js.map +1 -1
- package/dist/cache/store.d.ts +37 -7
- package/dist/cache/store.d.ts.map +1 -1
- package/dist/cache/store.js +105 -14
- package/dist/cache/store.js.map +1 -1
- package/dist/client.d.ts +24 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +96 -13
- package/dist/client.js.map +1 -1
- package/dist/commands/chats.d.ts.map +1 -1
- package/dist/commands/chats.js +24 -3
- package/dist/commands/chats.js.map +1 -1
- package/dist/commands/contacts.d.ts.map +1 -1
- package/dist/commands/contacts.js +6 -1
- package/dist/commands/contacts.js.map +1 -1
- package/dist/commands/context.d.ts +4 -1
- package/dist/commands/context.d.ts.map +1 -1
- package/dist/commands/context.js +4 -2
- package/dist/commands/context.js.map +1 -1
- package/dist/commands/messages.d.ts.map +1 -1
- package/dist/commands/messages.js +65 -1
- package/dist/commands/messages.js.map +1 -1
- package/dist/commands/paging.d.ts +6 -3
- package/dist/commands/paging.d.ts.map +1 -1
- package/dist/commands/paging.js +14 -3
- package/dist/commands/paging.js.map +1 -1
- package/dist/config.d.ts +10 -2
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +5 -1
- package/dist/config.js.map +1 -1
- package/dist/domain/map.d.ts.map +1 -1
- package/dist/domain/map.js +42 -3
- package/dist/domain/map.js.map +1 -1
- package/dist/domain/models.d.ts +36 -0
- package/dist/domain/models.d.ts.map +1 -1
- package/dist/output.d.ts +7 -4
- package/dist/output.d.ts.map +1 -1
- package/dist/output.js +8 -11
- package/dist/output.js.map +1 -1
- package/dist/program.d.ts.map +1 -1
- package/dist/program.js +4 -2
- package/dist/program.js.map +1 -1
- package/dist/protocol/connection.d.ts +10 -0
- package/dist/protocol/connection.d.ts.map +1 -1
- package/dist/protocol/connection.js +11 -3
- package/dist/protocol/connection.js.map +1 -1
- package/dist/rendering/messages.d.ts +19 -0
- package/dist/rendering/messages.d.ts.map +1 -0
- package/dist/rendering/messages.js +137 -0
- package/dist/rendering/messages.js.map +1 -0
- package/dist/runs/events.d.ts +1 -1
- package/dist/runs/recording.d.ts +2 -2
- package/dist/runs/recording.d.ts.map +1 -1
- package/dist/runs/recording.js +3 -3
- package/dist/runs/recording.js.map +1 -1
- package/dist/testing/sandbox.d.ts +2 -0
- package/dist/testing/sandbox.d.ts.map +1 -0
- package/dist/testing/sandbox.js +24 -0
- package/dist/testing/sandbox.js.map +1 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +6 -3
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { styleText } from "node:util";
|
|
2
|
+
import stringWidth from "string-width";
|
|
3
|
+
import wrapAnsi from "wrap-ansi";
|
|
4
|
+
const TIME_WIDTH = 8;
|
|
5
|
+
const INDENT = " ".repeat(TIME_WIDTH + 2);
|
|
6
|
+
const MIN_WIDTH = 40;
|
|
7
|
+
const SENDER_COLOURS = ["green", "yellow", "magenta", "blue", "red"];
|
|
8
|
+
export const renderMessages = (messages, options = {}) => {
|
|
9
|
+
if (messages.length === 0)
|
|
10
|
+
return "(nothing)";
|
|
11
|
+
const day = dayFormatter(options);
|
|
12
|
+
const paint = painter(options);
|
|
13
|
+
let previous;
|
|
14
|
+
const blocks = [];
|
|
15
|
+
for (const message of messages) {
|
|
16
|
+
const date = day(message.timestamp);
|
|
17
|
+
if (date !== previous)
|
|
18
|
+
blocks.push(paint("dim", `── ${date} ──`));
|
|
19
|
+
previous = date;
|
|
20
|
+
blocks.push(renderMessage(message, options));
|
|
21
|
+
}
|
|
22
|
+
return blocks.join("\n\n");
|
|
23
|
+
};
|
|
24
|
+
export const renderMessage = (message, options = {}) => {
|
|
25
|
+
const paint = painter(options);
|
|
26
|
+
const width = Math.max(MIN_WIDTH, options.width ?? 80);
|
|
27
|
+
const room = width - INDENT.length;
|
|
28
|
+
const time = timeFormatter(options);
|
|
29
|
+
const verbosity = options.verbosity ?? 0;
|
|
30
|
+
const chat = "chatTitle" in message ? paint("dim", ` · ${message.chatTitle ?? message.chatId}`) : "";
|
|
31
|
+
const lines = [`${paint("dim", time(message.timestamp))} ${senderOf(message, options)}${chat}`];
|
|
32
|
+
const body = (text) => wrapAnsi(text, room, { hard: true }).split("\n");
|
|
33
|
+
if (message.replyTo)
|
|
34
|
+
lines.push(paint("dim", preview("↳", message.replyTo, room)));
|
|
35
|
+
if (message.forwardedFrom) {
|
|
36
|
+
lines.push(paint("dim", `↪ ${nameOf(message.forwardedFrom)}`));
|
|
37
|
+
if (message.forwardedFrom.text)
|
|
38
|
+
lines.push(...body(message.forwardedFrom.text));
|
|
39
|
+
lines.push(...attachmentLines(message.forwardedFrom.attachments, paint, options));
|
|
40
|
+
}
|
|
41
|
+
if (message.text)
|
|
42
|
+
lines.push(...body(message.text));
|
|
43
|
+
lines.push(...attachmentLines(message.attachments, paint, options));
|
|
44
|
+
if (message.editedAt)
|
|
45
|
+
lines.push(paint("dim", `edited ${editedAt(message, options)}`));
|
|
46
|
+
if (verbosity >= 1) {
|
|
47
|
+
const fields = [
|
|
48
|
+
["message", message.id],
|
|
49
|
+
["sender", message.senderId],
|
|
50
|
+
["chat", message.chatId],
|
|
51
|
+
["reply to", message.replyTo?.id],
|
|
52
|
+
["forward of", message.forwardedFrom?.id],
|
|
53
|
+
...message.attachments.map((a) => ["link", a.url]),
|
|
54
|
+
];
|
|
55
|
+
if (verbosity >= 2) {
|
|
56
|
+
fields.push(["provider", "max"], ["profile", options.profile], ["sent", message.timestamp], ["edited", message.editedAt], ["outgoing", message.outgoing === null ? "unknown" : String(message.outgoing)], ...message.attachments.map((a) => ["attachment", JSON.stringify(a)]));
|
|
57
|
+
}
|
|
58
|
+
const shown = fields.filter((field) => typeof field[1] === "string");
|
|
59
|
+
const label = Math.max(...shown.map(([key]) => key.length));
|
|
60
|
+
lines.push("", ...shown.map(([key, value]) => paint("dim", `${key.padEnd(label)} ${value}`)));
|
|
61
|
+
}
|
|
62
|
+
return lines.map((line, index) => (index === 0 || line === "" ? line : `${INDENT}${line}`)).join("\n");
|
|
63
|
+
};
|
|
64
|
+
const painter = ({ color = false }) => (style, text) => color ? styleText(style, text, { validateStream: false }) : text;
|
|
65
|
+
const senderOf = (message, options) => {
|
|
66
|
+
const paint = painter(options);
|
|
67
|
+
if (message.outgoing === true)
|
|
68
|
+
return paint(["bold", "cyan"], "вы");
|
|
69
|
+
const name = nameOf(message);
|
|
70
|
+
if (!options.senderColors)
|
|
71
|
+
return paint("bold", name);
|
|
72
|
+
const colour = SENDER_COLOURS[hash(message.senderId ?? name) % SENDER_COLOURS.length] ?? "green";
|
|
73
|
+
return paint(["bold", colour], name);
|
|
74
|
+
};
|
|
75
|
+
const nameOf = ({ senderName, senderId, outgoing }) => outgoing === true ? "вы" : (senderName ?? senderId ?? "unknown");
|
|
76
|
+
const hash = (value) => [...value].reduce((sum, char) => (sum * 31 + char.charCodeAt(0)) >>> 0, 7);
|
|
77
|
+
/** One line: it is a pointer to the other message, not a second copy of it. */
|
|
78
|
+
const preview = (mark, quoted, room) => {
|
|
79
|
+
const text = quoted.text.split("\n")[0] || (quoted.attachments[0] ? `📎 ${quoted.attachments[0].kind}` : "");
|
|
80
|
+
const line = text ? `${mark} ${nameOf(quoted)}: ${text}` : `${mark} message ${quoted.id}`;
|
|
81
|
+
if (stringWidth(line) <= room)
|
|
82
|
+
return line;
|
|
83
|
+
return `${wrapAnsi(line, room - 1, { hard: true }).split("\n")[0]}…`;
|
|
84
|
+
};
|
|
85
|
+
/**
|
|
86
|
+
* Compact, and each one a link: `📎 photo`, `📎 photo ×3 1 2 3`, `📎 report.pdf · 24 MB`. The link
|
|
87
|
+
* is an OSC 8 hyperlink where there is colour; without it the address is printed, so it is never
|
|
88
|
+
* out of reach.
|
|
89
|
+
*/
|
|
90
|
+
const attachmentLines = (attachments, paint, options) => {
|
|
91
|
+
const link = (label, url) => url === undefined ? label : options.color ? `\u001b]8;;${url}\u0007${label}\u001b]8;;\u0007` : `${label} ${url}`;
|
|
92
|
+
const groups = new Map();
|
|
93
|
+
for (const attachment of attachments) {
|
|
94
|
+
const key = attachment.name ?? attachment.title ?? attachment.kind;
|
|
95
|
+
groups.set(key, [...(groups.get(key) ?? []), attachment]);
|
|
96
|
+
}
|
|
97
|
+
return [...groups].map(([label, same]) => {
|
|
98
|
+
const first = same[0];
|
|
99
|
+
const size = first?.size === undefined ? "" : ` · ${megabytes(first.size)}`;
|
|
100
|
+
if (same.length === 1)
|
|
101
|
+
return paint("dim", `📎 ${link(`${label}${size}`, first?.url)}`);
|
|
102
|
+
const each = same.map((attachment, index) => link(String(index + 1), attachment.url)).join(" ");
|
|
103
|
+
return paint("dim", `📎 ${label} ×${same.length} ${each}`);
|
|
104
|
+
});
|
|
105
|
+
};
|
|
106
|
+
const megabytes = (bytes) => bytes >= 1_000_000 ? `${Math.round(bytes / 1_000_000)} MB` : `${Math.max(1, Math.round(bytes / 1_000))} KB`;
|
|
107
|
+
const parts = (format, iso) => Object.fromEntries(format.formatToParts(new Date(iso)).map(({ type, value }) => [type, value]));
|
|
108
|
+
const timeFormatter = ({ timeZone }) => {
|
|
109
|
+
const format = new Intl.DateTimeFormat("en-GB", {
|
|
110
|
+
hour: "2-digit",
|
|
111
|
+
minute: "2-digit",
|
|
112
|
+
second: "2-digit",
|
|
113
|
+
hourCycle: "h23",
|
|
114
|
+
...(timeZone ? { timeZone } : {}),
|
|
115
|
+
});
|
|
116
|
+
return (iso) => {
|
|
117
|
+
const { hour, minute, second } = parts(format, iso);
|
|
118
|
+
return `${hour}:${minute}:${second}`;
|
|
119
|
+
};
|
|
120
|
+
};
|
|
121
|
+
/** `3 января 2026` — the `г.` Intl adds for Russian is dropped; the line is a heading, not a date field. */
|
|
122
|
+
const dayFormatter = ({ locale = "ru-RU", timeZone }) => {
|
|
123
|
+
const format = new Intl.DateTimeFormat(locale, {
|
|
124
|
+
day: "numeric",
|
|
125
|
+
month: "long",
|
|
126
|
+
year: "numeric",
|
|
127
|
+
...(timeZone ? { timeZone } : {}),
|
|
128
|
+
});
|
|
129
|
+
return (iso) => format.format(new Date(iso)).replace(/\s*г\.$/, "");
|
|
130
|
+
};
|
|
131
|
+
const editedAt = (message, options) => {
|
|
132
|
+
const edited = message.editedAt ?? message.timestamp;
|
|
133
|
+
const time = timeFormatter(options)(edited);
|
|
134
|
+
const day = dayFormatter(options);
|
|
135
|
+
return day(edited) === day(message.timestamp) ? time : `${day(edited)} ${time}`;
|
|
136
|
+
};
|
|
137
|
+
//# sourceMappingURL=messages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messages.js","sourceRoot":"","sources":["../../src/rendering/messages.ts"],"names":[],"mappings":"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"}
|
package/dist/runs/events.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { Payload } from "../protocol/frame.js";
|
|
2
2
|
/**
|
|
3
|
-
* One request, as both sinks see it: `--
|
|
3
|
+
* One request, as both sinks see it: `--trace` renders it, the run log writes it as a line of
|
|
4
4
|
* JSON. **One object, two sinks** — a second shape for one of them is how the two start disagreeing
|
|
5
5
|
* about what happened.
|
|
6
6
|
*
|
package/dist/runs/recording.d.ts
CHANGED
|
@@ -10,7 +10,7 @@ export interface RecordingOptions {
|
|
|
10
10
|
*/
|
|
11
11
|
options: {
|
|
12
12
|
record?: boolean | undefined;
|
|
13
|
-
|
|
13
|
+
trace?: boolean | undefined;
|
|
14
14
|
};
|
|
15
15
|
/** What `resolveOutput` decided for the data stream. Diagnostics follow it (`NEED-53`). */
|
|
16
16
|
format: RenderFormat;
|
|
@@ -23,7 +23,7 @@ export interface RecordingOptions {
|
|
|
23
23
|
/**
|
|
24
24
|
* Runs one command with the diagnostics turned on, and **finalizes on every path**.
|
|
25
25
|
*
|
|
26
|
-
* Two sinks, one event object (plan §3.1, §3.7): `--
|
|
26
|
+
* Two sinks, one event object (plan §3.1, §3.7): `--trace` shows it as it happens and keeps
|
|
27
27
|
* nothing, `--record` keeps it and shows nothing. Either, both, or — by default — neither, in
|
|
28
28
|
* which case this costs a counter.
|
|
29
29
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recording.d.ts","sourceRoot":"","sources":["../../src/runs/recording.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,KAAK,YAAY,EAAE,KAAK,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAE7F,OAAO,EAAE,KAAK,eAAe,EAAe,MAAM,aAAa,CAAA;AAG/D,MAAM,WAAW,gBAAgB;IAC/B,iFAAiF;IACjF,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf;;;OAGG;IACH,OAAO,EAAE;QAAE,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;QAAC,
|
|
1
|
+
{"version":3,"file":"recording.d.ts","sourceRoot":"","sources":["../../src/runs/recording.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,KAAK,YAAY,EAAE,KAAK,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAE7F,OAAO,EAAE,KAAK,eAAe,EAAe,MAAM,aAAa,CAAA;AAG/D,MAAM,WAAW,gBAAgB;IAC/B,iFAAiF;IACjF,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf;;;OAGG;IACH,OAAO,EAAE;QAAE,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;KAAE,CAAA;IACtE,2FAA2F;IAC3F,MAAM,EAAE,YAAY,CAAA;IACpB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,iDAAiD;IACjD,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,GAAG,CAAC,EAAE,MAAM,IAAI,CAAA;CACjB;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,QAAQ,GAAU,CAAC,EAC9B,SAAS,gBAAgB,EACzB,MAAM,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,KAC7D,OAAO,CAAC,CAAC,CAsCX,CAAA"}
|
package/dist/runs/recording.js
CHANGED
|
@@ -5,7 +5,7 @@ import { runsDirFor, startRun } from "./run.js";
|
|
|
5
5
|
/**
|
|
6
6
|
* Runs one command with the diagnostics turned on, and **finalizes on every path**.
|
|
7
7
|
*
|
|
8
|
-
* Two sinks, one event object (plan §3.1, §3.7): `--
|
|
8
|
+
* Two sinks, one event object (plan §3.1, §3.7): `--trace` shows it as it happens and keeps
|
|
9
9
|
* nothing, `--record` keeps it and shows nothing. Either, both, or — by default — neither, in
|
|
10
10
|
* which case this costs a counter.
|
|
11
11
|
*
|
|
@@ -15,7 +15,7 @@ import { runsDirFor, startRun } from "./run.js";
|
|
|
15
15
|
*/
|
|
16
16
|
export const recorded = async (options, body) => {
|
|
17
17
|
const streams = options.streams ?? processStreams;
|
|
18
|
-
const
|
|
18
|
+
const trace = options.options.trace === true;
|
|
19
19
|
const run = options.options.record === true
|
|
20
20
|
? startRun({
|
|
21
21
|
runsDir: options.runsDir ?? runsDirFor(),
|
|
@@ -32,7 +32,7 @@ export const recorded = async (options, body) => {
|
|
|
32
32
|
requests += 1;
|
|
33
33
|
// Text for a person, one JSON object per line for anything else — the rule `resolveOutput`
|
|
34
34
|
// already applies to the data stream (`NEED-53`). Never stdout, in any mode.
|
|
35
|
-
if (
|
|
35
|
+
if (trace)
|
|
36
36
|
streams.diagnostic(options.format === "pretty" ? renderEvent(event) : JSON.stringify(event));
|
|
37
37
|
run?.logger.info(event);
|
|
38
38
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recording.js","sourceRoot":"","sources":["../../src/runs/recording.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAmC,MAAM,mBAAmB,CAAA;AAC7F,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EAAwB,WAAW,EAAE,MAAM,aAAa,CAAA;AAC/D,OAAO,EAAY,UAAU,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAoBzD;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,EAC3B,OAAyB,EACzB,IAA8D,EAClD,EAAE;IACd,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,cAAc,CAAA;IACjD,MAAM,
|
|
1
|
+
{"version":3,"file":"recording.js","sourceRoot":"","sources":["../../src/runs/recording.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAmC,MAAM,mBAAmB,CAAA;AAC7F,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EAAwB,WAAW,EAAE,MAAM,aAAa,CAAA;AAC/D,OAAO,EAAY,UAAU,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAoBzD;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,EAC3B,OAAyB,EACzB,IAA8D,EAClD,EAAE;IACd,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,cAAc,CAAA;IACjD,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,KAAK,IAAI,CAAA;IAE5C,MAAM,GAAG,GACP,OAAO,CAAC,OAAO,CAAC,MAAM,KAAK,IAAI;QAC7B,CAAC,CAAC,QAAQ,CAAC;YACP,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,UAAU,EAAE;YACxC,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,UAAU,EAAE,OAAO;YACnB,GAAG,CAAC,OAAO,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC;YACzE,GAAG,CAAC,OAAO,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;SAC3D,CAAC;QACJ,CAAC,CAAC,SAAS,CAAA;IAEf,IAAI,QAAQ,GAAG,CAAC,CAAA;IAEhB,MAAM,MAAM,GAAG,CAAC,KAAsB,EAAQ,EAAE;QAC9C,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS;YAAE,QAAQ,IAAI,CAAC,CAAA;QAC5C,2FAA2F;QAC3F,6EAA6E;QAC7E,IAAI,KAAK;YAAE,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAA;QACvG,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACzB,CAAC,CAAA;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,CAAA;QACjC,MAAM,GAAG,EAAE,MAAM,CAAC,SAAS,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAA;QAC1C,OAAO,MAAM,CAAA;IACf,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,GAAG,EAAE,MAAM,CAAC,QAAQ,EAAE;YAC1B,QAAQ;YACR,4FAA4F;YAC5F,GAAG,CAAC,KAAK,YAAY,QAAQ,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAChE,CAAC,CAAA;QACF,MAAM,KAAK,CAAA;IACb,CAAC;AACH,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sandbox.d.ts","sourceRoot":"","sources":["../../src/testing/sandbox.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { mkdtempSync } from "node:fs";
|
|
2
|
+
import { tmpdir } from "node:os";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
/**
|
|
5
|
+
* **Moves the whole installation into a temporary directory, for every test file.**
|
|
6
|
+
*
|
|
7
|
+
* A test that drives a command reads the real configuration file and opens the real cache — and
|
|
8
|
+
* opening the cache migrates it, which on a schema change means rebuilding it and throwing away
|
|
9
|
+
* what the owner had. That is not a hypothetical: on 2026-09-22 a test run did exactly that to a
|
|
10
|
+
* real machine, and the only reason it was noticed was a timestamp.
|
|
11
|
+
*
|
|
12
|
+
* It is a setup file rather than a hook in one test because the hazard belongs to any test that
|
|
13
|
+
* reaches a command, not to the file that happened to find it. **`pnpm test` must not be able to
|
|
14
|
+
* write anything a person owns**, and that has to be true of the next test file as well as this
|
|
15
|
+
* one.
|
|
16
|
+
*
|
|
17
|
+
* The three variables move config, state and cache together. They also scope the keyring entry
|
|
18
|
+
* (`ARCHITECTURE.md` §14) — the documented trap, which here is precisely the isolation wanted.
|
|
19
|
+
*/
|
|
20
|
+
const sandbox = mkdtempSync(join(tmpdir(), "max-test-"));
|
|
21
|
+
process.env.MAX_CONFIG_DIR = join(sandbox, "config");
|
|
22
|
+
process.env.MAX_STATE_DIR = join(sandbox, "state");
|
|
23
|
+
process.env.MAX_CACHE_DIR = join(sandbox, "cache");
|
|
24
|
+
//# sourceMappingURL=sandbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sandbox.js","sourceRoot":"","sources":["../../src/testing/sandbox.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEhC;;;;;;;;;;;;;;;GAeG;AACH,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,WAAW,CAAC,CAAC,CAAA;AAExD,OAAO,CAAC,GAAG,CAAC,cAAc,GAAG,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;AACpD,OAAO,CAAC,GAAG,CAAC,aAAa,GAAG,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;AAClD,OAAO,CAAC,GAAG,CAAC,aAAa,GAAG,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA"}
|
package/dist/version.d.ts
CHANGED
package/dist/version.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@leemour/max-cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "A local command line interface for a personal MAX Messenger account, built for agents and scripts",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Viacheslav Ptsarev",
|
|
@@ -24,16 +24,18 @@
|
|
|
24
24
|
"@leemour/cli-core": "^0.1.0",
|
|
25
25
|
"commander": "^15.0.0",
|
|
26
26
|
"lossless-json": "^4.3.1",
|
|
27
|
+
"string-width": "^8.2.2",
|
|
27
28
|
"valibot": "^1.5.0",
|
|
29
|
+
"wrap-ansi": "^10.0.2",
|
|
28
30
|
"ws": "^8.19.0"
|
|
29
31
|
},
|
|
30
32
|
"devDependencies": {
|
|
31
33
|
"@biomejs/biome": "^2.3.14",
|
|
32
34
|
"@types/node": "^22.10.2",
|
|
33
35
|
"@types/ws": "^8.18.1",
|
|
36
|
+
"lefthook": "^2.1.8",
|
|
34
37
|
"typescript": "^5.9.3",
|
|
35
|
-
"vitest": "^3.2.4"
|
|
36
|
-
"lefthook": "^2.1.8"
|
|
38
|
+
"vitest": "^3.2.4"
|
|
37
39
|
},
|
|
38
40
|
"publishConfig": {
|
|
39
41
|
"access": "public"
|
|
@@ -51,6 +53,7 @@
|
|
|
51
53
|
"version:sync": "node --experimental-strip-types scripts/version.ts --sync",
|
|
52
54
|
"probe:ids": "pnpm build && node --experimental-strip-types scripts/id-shape.ts",
|
|
53
55
|
"probe:edits": "pnpm build && node --experimental-strip-types scripts/probe-edits.ts",
|
|
56
|
+
"probe:attachments": "pnpm build && node --experimental-strip-types scripts/probe-attachments.ts",
|
|
54
57
|
"verify:live": "pnpm build && node --experimental-strip-types scripts/verify-commands.ts",
|
|
55
58
|
"secrets:scan": "gitleaks git --no-banner --redact .",
|
|
56
59
|
"probe:contacts": "pnpm build && node --experimental-strip-types scripts/probe-contacts.ts",
|