feat: add title and description fields to capture grammar

Implement | prefix for titles and // separator for descriptions
across the full stack: parser, schema, API, CLI, and web frontend.

- Parser: line-aware extraction for |title, |title // desc,
  // leading desc, body // inline desc. URL-safe (skips :// lines).
  Modifiers (#tag, @time, ^card) extracted from all segments.
- Schema: ALTER TABLE migration adds title, description columns
- DB: Entity/EntityUpdate structs, all CRUD queries updated
- API: title/description on create/update/response, body validation
  relaxed (title-only entries valid)
- CLI: shows title as scan label when present
- Web: parseInput mirrors Go parser, list shows title, detail pane
  renders title + description with double-click inline editing
- Tests: 10 new cases (grammar, entity, API) — 71 total, all pass
This commit is contained in:
2026-05-15 20:52:58 -04:00
parent e708ea5c13
commit f5b46585c3
11 changed files with 683 additions and 159 deletions
+61
View File
@@ -309,6 +309,25 @@ main {
.glyph-decision { color: var(--note); }
.glyph-link { color: var(--danger); }
.entity-title {
font-family: var(--sans);
font-size: 12px;
font-weight: 500;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.entity-preview {
font-family: var(--mono);
font-size: 11px;
color: var(--muted);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
margin-left: 8px;
}
.entity-body {
flex: 1;
font-family: var(--mono);
@@ -385,6 +404,48 @@ main {
color: var(--dim);
}
.detail-desc {
font-family: var(--sans);
font-size: 11px;
color: var(--muted);
margin-bottom: 4px;
cursor: text;
padding: 2px 6px;
margin-left: -6px;
border-radius: var(--r2);
transition: background var(--t-fast);
}
.detail-desc:hover { background: var(--raised); }
.detail-title {
font-family: var(--sans);
font-size: 16px;
font-weight: 500;
margin-bottom: 12px;
cursor: text;
padding: 2px 6px;
margin-left: -6px;
border-radius: var(--r2);
transition: background var(--t-fast);
}
.detail-title:hover { background: var(--raised); }
.detail-field-edit {
display: block;
width: 100%;
font-family: var(--sans);
font-size: 14px;
margin-bottom: 12px;
padding: 4px 8px;
background: var(--bg);
color: var(--text);
border: 1px solid var(--accent);
border-radius: var(--r2);
outline: none;
}
.detail-body {
font-family: var(--mono);
font-size: 13px;