@paxnax/berliner 0.10.1 → 0.10.2
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 +18 -0
- package/dist/tests/check.js +4 -3
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -132,3 +132,21 @@ Other commands:
|
|
|
132
132
|
- `berliner hook <tool>`: run by the hooks setup installs, with the tool's payload on stdin. It never fails and never makes the agent wait, and prints only the reminder when a session starts; errors go to `${XDG_STATE_HOME:-~/.local/state}/berliner/hook.log`.
|
|
133
133
|
|
|
134
134
|
`report` and `update` exit 0 even when something fails, printing a warning that starts with `berliner:` to stderr, so reporting never breaks an agent's pipeline. Pass `--strict` to make them exit 1 on failure, including a file that could not be uploaded or made public; the session is still saved. The other commands exit 1 on failure.
|
|
135
|
+
|
|
136
|
+
## Export format
|
|
137
|
+
|
|
138
|
+
**Download your data** in Settings saves everything Berliner holds about your account as one JSON file, `berliner-export-<login>-<date>.json`. The same file comes from `GET /v1/me/export` with a token: `curl -H "Authorization: Bearer $BERLINER_TOKEN" https://berliner.app/v1/me/export`. A team's owner gets the team's file, `berliner-team-<name>-<date>.json`, from **Download team data** on the team's settings.
|
|
139
|
+
|
|
140
|
+
Your file, `"format": "berliner-export/1"`:
|
|
141
|
+
|
|
142
|
+
- `account`: GitHub id and login, email, avatar, plan, when you signed up and last signed in, review cards on or off, and how you found Berliner.
|
|
143
|
+
- `billing`: your Berliner plan's interval, status and renewal or trial end; `null` without one.
|
|
144
|
+
- `subscriptions`, `api_tokens` (name, prefix and dates, never the secret), `installations`, `repository_projects`, `repository_card_costs`.
|
|
145
|
+
- `teams` and `team_invites`: the teams you own or belong to, and invites waiting for you.
|
|
146
|
+
- `sessions`: every session you reported, personal and team, in the shape `GET /v1/sessions` returns, with its pull requests.
|
|
147
|
+
- `evidence`: one entry per screenshot or video, with its `session_id`, file details, `sha256`, and a `url` that downloads it while you are signed in or send your token.
|
|
148
|
+
- `refusals` and `events`: reports Berliner refused, and your account's sign-up and plan events.
|
|
149
|
+
|
|
150
|
+
A team's file, `"format": "berliner-team-export/1"`, has `team`, `members`, `invites`, `sessions` (each with the reporting `member`) and `evidence` (with `member`), the same shapes as above. Members' personal work is not in it.
|
|
151
|
+
|
|
152
|
+
The files leave out token secrets and hashes, sign-in sessions and internal storage ids. Payment details stay with Link and Stripe.
|
package/dist/tests/check.js
CHANGED
|
@@ -5,7 +5,8 @@ import { promisify } from "node:util";
|
|
|
5
5
|
import { testCommand } from "./command.js";
|
|
6
6
|
import { claudeRuns, codexRuns } from "./runs.js";
|
|
7
7
|
const run = promisify(execFile);
|
|
8
|
-
|
|
8
|
+
// Files that can't change a test result: docs, hidden tool folders (.playwright-mcp, .agent-run), media, fonts, archives and logs.
|
|
9
|
+
const SKIPPED = /^(?:docs|\.[^/]+)\/|\.(?:md|mdx|txt|log|err|jsonl|sha256|png|jpe?g|gif|webp|svg|ico|mp4|webm|wav|mp3|woff2?|ttf|otf|eot|zip|tar|gz|pdf)$/i;
|
|
9
10
|
// Best effort like git.ts, within what is left of the budget: a git error or no time left gives null.
|
|
10
11
|
async function git(cwd, args, deadline) {
|
|
11
12
|
const timeout = deadline - Date.now();
|
|
@@ -56,13 +57,13 @@ async function changedFiles(root, startedAt, start, deadline) {
|
|
|
56
57
|
}
|
|
57
58
|
const files = [];
|
|
58
59
|
for (const file of new Set([...uncommitted, ...committed.keys()])) {
|
|
59
|
-
if (
|
|
60
|
+
if (SKIPPED.test(file))
|
|
60
61
|
continue;
|
|
61
62
|
const at = mtime(path.join(root, file)) ?? (uncommitted.has(file) ? removedAt(root, file) : committed.get(file));
|
|
62
63
|
if (at !== undefined && at >= start)
|
|
63
64
|
files.push({ path: file, at });
|
|
64
65
|
}
|
|
65
|
-
return { files: files.sort((a, b) => b.at - a.at), dirty: [...uncommitted].some((f) => !
|
|
66
|
+
return { files: files.sort((a, b) => b.at - a.at), dirty: [...uncommitted].some((f) => !SKIPPED.test(f)) };
|
|
66
67
|
}
|
|
67
68
|
// The session's test runs against its changes, or null when there is nothing to say. Quick mode reads only the runs since
|
|
68
69
|
// the newest change, so a pass before it gives unchecked, not stale.
|