style: drop em-dashes from the prose added in this branch

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Codeman maintainer
2026-08-10 03:15:13 +02:00
parent 053a6d238d
commit c13b3c55d3
14 changed files with 54 additions and 54 deletions
+8 -8
View File
@@ -1,5 +1,5 @@
/**
* @fileoverview Issue #260 — the home screen's "Resume Conversation" list.
* @fileoverview Issue #260, the home screen's "Resume Conversation" list.
*
* With ~35 past sessions the list showed 4 rows, then a button that dumped every
* remaining row into a fixed 240px box, with no way to sort or filter. The fix
@@ -7,12 +7,12 @@
* worth pinning is the model, not the pixels:
* 1. the collapsed page is _HISTORY_INITIAL_COUNT rows, not 4,
* 2. "Show more" expands the LIST and marks the box expanded (the CSS cap is
* class-driven — without the class, expanding just deepens a scroll well),
* class-driven, without the class, expanding just deepens a scroll well),
* 3. filtering matches name / folder / case label / prompt, and implies
* expansion (hiding matches behind "Show more" defeats typing a filter),
* 4. sorting is alphabetical by name or folder, with pinned rows still on top.
*
* Loaded via `vm` against a stub CodemanApp with a fake DOM — same harness as
* Loaded via `vm` against a stub CodemanApp with a fake DOM, same harness as
* resume-name.test.ts. `_buildHistoryItem` is stubbed: this pins WHICH rows get
* rendered and in what order, not how one row looks.
*/
@@ -71,7 +71,7 @@ function fakeEl(id: string): FakeEl {
/**
* The element map the vm's `document.getElementById` resolves against. Swapped
* per test — the closure is defined in THIS realm, so the shipping code inside
* per test, the closure is defined in THIS realm, so the shipping code inside
* the vm reads whatever the current test installed.
*/
let currentEls: Record<string, FakeEl> = {};
@@ -162,7 +162,7 @@ function rows(n: number, overrides: Partial<Row> = {}): Row[] {
}));
}
describe('issue #260 — collapsed page size', () => {
describe('issue #260: collapsed page size', () => {
it('shows more than the old 4 rows before "Show more"', () => {
expect(proto._HISTORY_INITIAL_COUNT).toBeGreaterThanOrEqual(8);
});
@@ -181,7 +181,7 @@ describe('issue #260 — collapsed page size', () => {
app._render();
expect(app.renderedIds()).toHaveLength(35);
// Without this class the CSS max-height stays at the collapsed cap and the
// extra rows land in a four-row scroll well — the original bug.
// extra rows land in a four-row scroll well, the original bug.
expect(app.els.historyList.classList.contains('expanded')).toBe(true);
expect(app.button()?.textContent).toBe('Show less');
});
@@ -194,7 +194,7 @@ describe('issue #260 — collapsed page size', () => {
});
});
describe('issue #260 — filter', () => {
describe('issue #260: filter', () => {
it('matches on folder name and shows every match without expanding first', () => {
const app = makeApp([
...rows(30),
@@ -240,7 +240,7 @@ describe('issue #260 — filter', () => {
});
});
describe('issue #260 — sort', () => {
describe('issue #260: sort', () => {
const unsorted: Row[] = [
{ sessionId: 'b', name: 'beta', workingDir: '/home/u/zeta', lastActivityAt: 300 },
{ sessionId: 'a', name: 'alpha', workingDir: '/home/u/yankee', lastActivityAt: 200 },
+3 -3
View File
@@ -209,9 +209,9 @@ describe('GET /api/search — caps & filters', () => {
});
// Issue #261: with 3 live sessions and ~35 past ones, searching a past project's
// folder name matched nothing — the corpus was the live session map alone. Past
// folder name matched nothing, the corpus was the live session map alone. Past
// sessions now arrive from the out-of-band history index snapshot.
describe('GET /api/search — past sessions (history index)', () => {
describe('GET /api/search: past sessions (history index)', () => {
beforeEach(() => {
resetHistorySessionIndex();
});
@@ -291,7 +291,7 @@ describe('GET /api/search — past sessions (history index)', () => {
owner: 'alice',
live: false,
},
// Host-wide transcript row: no owning session, so admin-only — the same
// Host-wide transcript row: no owning session, so admin-only, the same
// rule GET /api/sessions/unified applies when it drops history for non-admins.
{ sessionId: 'hostwide', name: 'needle-host', workingDir: '/srv/needle-host', timestamp: 1, live: false },
]);
+3 -3
View File
@@ -236,9 +236,9 @@ describe('searchSources — result card shape & path safety', () => {
// Past sessions (issue #261). The corpus used to be the live session map alone,
// so a folder in the home screen's Resume list matched nothing. History rows now
// arrive marked, and a card for one has to RESUME the conversation — selecting a
// arrive marked, and a card for one has to RESUME the conversation, selecting a
// tab that no longer exists is a no-op the user reads as a broken result.
describe('searchSources — past (history) sessions', () => {
describe('searchSources: past (history) sessions', () => {
it('matches a past session by folder name and returns a resume jump target', () => {
const data = sources({
sessions: [
@@ -276,7 +276,7 @@ describe('searchSources — past (history) sessions', () => {
const data = sources({
sessions: [{ sessionId: 'cod-2', sessionName: 'needle-run', workingDir: '', timestamp: 1, history: true }],
});
// Nothing to resume INTO — a resume card here would always fail.
// Nothing to resume INTO, a resume card here would always fail.
expect(searchSources('needle', data).groups[0].results[0].jumpTo.kind).toBe('session');
});
+2 -2
View File
@@ -5,7 +5,7 @@
* longer running WITHOUT doing disk I/O per keystroke. Three properties matter
* and are pinned here: the snapshot stays bounded, the refresh never happens on
* the caller's timeline (fire-and-forget, single-flight, TTL-guarded), and the
* stored rows carry the owner needed to re-apply multi-user scoping on read —
* stored rows carry the owner needed to re-apply multi-user scoping on read,
* the snapshot is written unscoped, so losing that field would leak one user's
* folders into another user's search.
*/
@@ -92,7 +92,7 @@ describe('snapshot storage', () => {
});
describe('ensureHistorySessionIndexFresh', () => {
it('returns synchronously — the rebuild must never be on the request path', async () => {
it('returns synchronously, the rebuild must never be on the request path', async () => {
let resolveRefresh: () => void = () => {};
const refresher = vi.fn(
() =>