@ikenga/pkg-research
v0.3.0
Published
Research — Reports (list+detail), Sources (monitored register), Personas (ICP grid) over the research_notes + research_sources schema. Multi-file iframe pkg; deterministic CSS vendoring build.
Readme
@ikenga/pkg-research — com.ikenga.research
The Research domain pkg — Ikenga's knowledge surface. A no-build srcdoc
iframe pkg built on the atelier app-kit (the same pattern as com.ikenga.tasks
and com.ikenga.content).
Three views, all driven by the shell side-menu (not in-pane tabs):
| View | Shape | Data |
|------|-------|------|
| Reports | list + detail split (.ip-split, --ip-list-w: 380px) | research_notes |
| Sources | dense monitored-source register table | research_sources |
| Personas | 2-up ICP card grid (.rs-persona-*) | local fixture (ICP grid) |
Architecture (the 8-step recipe)
See plans/atelier-design-system/08-pkg-retrofit-recipe.md and
plans/atelier-design-system/parts/screens/research.md.
- Manifest —
capabilities.sqlite.db: "ikenga.local";permissions.sqlite.tables: [research_notes, research_sources, sales_deals](research readsresearch_notes+research_sources;sales_dealsis the write target for the cross-domain "Hand to sales" link). - CSS vendoring —
scripts/build.mjscopiestokens-css.js+app-kit-css.jsfrom@ikenga/tokensand codegensresearch-css.jsfromdist/research.css. - Inject order —
tokens → app-kit → research(inline<style>;<link>/@importfail inside the shell'sabout:srcdoc). - Appearance mirror —
setupTheme()copied verbatim fromtasks; mirrors the four parent<html>attrs.data-workspace="agents"static (teal tint). - Kit primitives + slim residue — kit classes from the start; only
.rs-*residue (persona grid, source register, freshness pill, cross-domain badge, Fit bar) + the.ux-dot.ux-*mode-dot colours live inresearch.css. - Data —
host.dbQuery/host.dbExeconly; TanStack Query; refresh ondb-updated. - Side-menu publish —
setMenu()keyed on[activeView, reports]. The "By type" filter group dims (disabled) on Sources / Personas (R23 list-only). - Migration —
0053_research_domain.sql(registered by the shell migration runner): extendsresearch_notes(next_action,next_action_target,agent_cycle_id,is_stale,word_count,owner), createsresearch_sources, addssales_deals.research_item_id(soft TEXT link, no FK).
Provisional fallback (before 0053 lands)
The pane renders against real research_notes from day one:
word_countderives frombodylength when the column is absent/empty.research_sourcesreads fall back to the canonical fixture register.- Hand-to-sales prefers
UPDATE sales_deals SET research_item_id = ?; falls back to appending the link intosales_deals.noteswhen the column doesn't exist yet.
Build
node scripts/build.mjs # vendors tokens + app-kit, regenerates research-css.jsdist/lib/tokens-css.js and dist/lib/app-kit-css.js are git-ignored (vendored
from @ikenga/tokens@^0.3.0); dist/lib/research-css.js is regenerated from
dist/research.css (the source of truth).
License
Apache-2.0 (per ADR-009).
