phase: 97_kb_tree_catalog
All completion criteria verified — everything is green, no defects found. Final report: ## Phase 97 final verification pass — ALL GREEN **Verified (no code changes needed):** - `GET /api/docs/tree` (admin), `build_kb_tree` pure builder, `PATCH /api/folders/summary`, migration 0018 (`manually_edited`, head confirmed), generator skip/keep + `kept_manual` stat, RAG tree UI + edit affordance in `sources.js`/`index.html`/`styles.css` - `tests/e2e/test_kb_tree.py`: 8 passed — top level, drill source/folder, edit round-trip, clear, manual-desc-survives-sync, reload fallback, anonymous gate - Integration: tree shape/order/403/empty/indexed-only + PATCH update/create/root/clear/404/403/no-LLM + stat-walk equivalence (in `test_docs_api.py`); 3-field `folder_summaries=` import token preserved **Gates (exact commands):** - `uv run pytest --cov=app --cov-report=term-missing` → **2053 passed**, TOTAL coverage **99%** (>90% ✓) - `uv run ruff check . && uv run pyright` → **All checks passed / 0 errors** - `uv run pytest tests/e2e/test_kb_tree.py -v --no-cov` → **8 passed** in isolation - 30 story/RAG-view E2E suites run **one per process**: all passed, incl. `test_ls_tree_drilldown` (agent `ls` byte-identical ✓), `test_import_documents`, `test_edit_summaries`, `test_admin_auth`, `test_kb_overview` **Completion criteria:** tree view ✓ · edit round-trip + clear ✓ · manual persists/clear resets ✓ · `ls` unchanged ✓ · pytest/coverage/lint ✓ · E2E isolation ✓ · commit — left to harness per protocol (working tree untouched, `git add/commit` not run) **Deviations:** none. **Next pending phase:** none — `todo/` contains only 97 (96 already committed).
This commit is contained in:
@@ -1899,6 +1899,161 @@ details.thinking .thinking-text ul { margin: 0 0 0.5rem; }
|
||||
.docs-table tbody tr:hover { background: var(--bg); }
|
||||
.docs-table tbody tr:last-child td { border-bottom: 0; }
|
||||
|
||||
/* ---------- KB drill-down tree (phase 97, task 04) ----------
|
||||
The RAG view lists the catalog the way the agent's `ls` sees it
|
||||
(the phase-94 concept, one end to end): #kb-crumb (the location
|
||||
breadcrumb — hidden at the top level), #kb-level (the current
|
||||
directory's STORED description — the surface-panel language of the
|
||||
phase-93 page heads), and #folders-table (the ONE folders/sources
|
||||
table — the .docs-table language; .kb-folders-table only re-styles
|
||||
the 2nd/3rd column cells). Phase-08 tokens only — NO new hue
|
||||
(the phase-92 monochrome invariant): brand-ink on surface 9.0:1,
|
||||
ink 13.8:1, ink-soft 5.1:1 (every pair AA). :focus-visible via the
|
||||
global 3px outline rule; row targets keep the .docs-table cell
|
||||
padding (>= 44px effective — the phase-08 touch floor). No CDN,
|
||||
system fonts. */
|
||||
.kb-crumb {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
align-items: center;
|
||||
gap: 0.1rem 0.3rem;
|
||||
margin: 0.9rem 0 0;
|
||||
font-size: 0.92rem;
|
||||
}
|
||||
.kb-crumb-link {
|
||||
color: var(--brand-ink); /* 10.4:1 on --bg, 9.5:1 on the --brand-soft hover */
|
||||
text-decoration: none;
|
||||
padding: 0.25rem 0.35rem;
|
||||
border-radius: var(--radius-sm);
|
||||
}
|
||||
.kb-crumb-link:hover { background: var(--brand-soft); text-decoration: underline; }
|
||||
.kb-crumb-current {
|
||||
color: var(--ink); /* 16.7:1 on --bg */
|
||||
font-weight: 600;
|
||||
padding: 0.25rem 0.35rem;
|
||||
}
|
||||
.kb-crumb-sep { color: var(--ink-soft); }
|
||||
.kb-level {
|
||||
background: var(--surface);
|
||||
border: 1px solid var(--line);
|
||||
border-radius: var(--radius);
|
||||
padding: 1rem 1.25rem;
|
||||
margin: 0.9rem 0 0.75rem;
|
||||
}
|
||||
.kb-level h2 {
|
||||
margin: 0 0 0.35rem;
|
||||
font-family: var(--mono);
|
||||
font-size: 1rem;
|
||||
color: var(--brand-ink); /* 9.0:1 on --surface — the path, in the path voice */
|
||||
word-break: break-all;
|
||||
}
|
||||
.kb-level p { margin: 0; color: var(--ink-soft); } /* 5.1:1 on --surface */
|
||||
.kb-folders-table { min-width: 480px; }
|
||||
.kb-folders-table td:nth-child(2) { font-family: var(--font); font-size: inherit; max-width: none; }
|
||||
.kb-folders-table td:nth-child(3) {
|
||||
white-space: normal;
|
||||
min-width: 18rem;
|
||||
max-width: 44rem;
|
||||
font-size: 0.88rem;
|
||||
}
|
||||
.folder-link {
|
||||
color: var(--brand-ink); /* 9.0:1 on --surface (the .doc-link pair, row variant) */
|
||||
text-decoration: none;
|
||||
border-radius: var(--radius-sm);
|
||||
}
|
||||
.folder-link:hover, .folder-link:focus-visible {
|
||||
background: var(--brand-soft);
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
/* ---------- KB folder-description editor (phase 97, task 05) ----------
|
||||
The phase-57 edit affordance on the RAG view's folder descriptions
|
||||
(the .kb-summary-* family, mirroring the viewer's .doc-summary-*):
|
||||
the Edit button (a 24px+ target; the [hidden] override beats its
|
||||
display rule while the editor is open), the inline editor (the
|
||||
8rem-min textarea + Save/Cancel + the role=status live region).
|
||||
House dark-tech palette (phase-08 tokens), system fonts, no CDN;
|
||||
:focus-visible via the global 3px outline rule. No new hue (the
|
||||
phase-92 monochrome invariant) — every color is a var(). */
|
||||
.kb-summary-edit {
|
||||
flex: 0 0 auto;
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
min-height: 24px;
|
||||
padding: 0.15rem 0.7rem;
|
||||
border: 1px solid var(--line);
|
||||
border-radius: 999px;
|
||||
background: transparent;
|
||||
color: var(--ink-soft); /* 5.1:1 on --surface (AA) */
|
||||
font: inherit;
|
||||
font-weight: 600;
|
||||
font-size: 0.78rem;
|
||||
letter-spacing: 0.02em;
|
||||
cursor: pointer;
|
||||
}
|
||||
.kb-summary-edit:hover { background: var(--brand-soft); color: var(--brand-ink); border-color: var(--brand); }
|
||||
.kb-summary-edit[hidden] { display: none; } /* the hidden attr must beat the display above */
|
||||
/* Context spacing: the row cell's button sits after the description
|
||||
text; the level block's sits below the <p>. */
|
||||
.kb-folders-table .kb-summary-edit { margin-left: 0.4rem; }
|
||||
.kb-level-body .kb-summary-edit { margin-top: 0.5rem; }
|
||||
.kb-summary-editor {
|
||||
display: block;
|
||||
width: 100%;
|
||||
min-height: 8rem; /* the phase-57 spec */
|
||||
padding: 0.6rem 0.8rem;
|
||||
border: 1px solid var(--line);
|
||||
border-radius: var(--radius-sm);
|
||||
background: var(--bg); /* inset against the --surface panel / row */
|
||||
color: var(--ink); /* 16.7:1 on --bg (AA) */
|
||||
font: inherit;
|
||||
line-height: 1.5;
|
||||
resize: vertical;
|
||||
}
|
||||
.kb-summary-actions {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 0.5rem;
|
||||
margin-top: 0.75rem;
|
||||
}
|
||||
.kb-summary-save {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
min-height: 32px;
|
||||
padding: 0.35rem 0.95rem;
|
||||
border: 0;
|
||||
border-radius: 999px;
|
||||
background: var(--brand);
|
||||
color: var(--bg); /* --bg on --brand = 5.2:1 (AA) */
|
||||
font: inherit;
|
||||
font-weight: 600;
|
||||
font-size: 0.85rem;
|
||||
cursor: pointer;
|
||||
}
|
||||
.kb-summary-save:hover { background: var(--brand-hover); } /* the house hover lightening */
|
||||
.kb-summary-save:disabled { opacity: 0.6; cursor: default; } /* one PATCH at a time */
|
||||
.kb-summary-cancel {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
min-height: 32px;
|
||||
padding: 0.35rem 0.95rem;
|
||||
border: 1px solid var(--line);
|
||||
border-radius: 999px;
|
||||
background: transparent;
|
||||
color: var(--ink-soft); /* 5.1:1 on --surface (AA) */
|
||||
font: inherit;
|
||||
font-weight: 600;
|
||||
font-size: 0.85rem;
|
||||
cursor: pointer;
|
||||
}
|
||||
.kb-summary-cancel:hover { background: var(--err-bg); color: var(--err-ink); border-color: var(--err-line); }
|
||||
.kb-summary-status {
|
||||
margin: 0.6rem 0 0;
|
||||
font-size: 0.85rem;
|
||||
color: var(--ink-soft); /* 5.1:1 on --surface (AA) */
|
||||
}
|
||||
.kb-summary-status:empty { margin-top: 0; }
|
||||
|
||||
/* ---------- Git sources page (phase 35) ----------
|
||||
/git-sources.html: the admin-only manager for the stored git source
|
||||
list (add / remove, git-sources table). Same full-width table
|
||||
|
||||
Reference in New Issue
Block a user