Brain status
Persistent memory for Claude using a dedicated Logseq graph. Save and load project context, decisions, and progress across sessions and devices.
npx -y skills add jame581/LogseqBrain --skill brain-statusAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 13 stars13 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Show a dashboard of all projects in the Claude Brain graph, or graph analytics. Dashboard triggers: "brain status", "show projects", "show brain", "what's in my brain", "project dashboard", "brain overview", "list projects", "summary". Analytics triggers: "brain stats", "graph analytics", "graph activity over time". Don't fire for loads (use brain-load) or saves (use brain-save).
SKILL.md
8.7 KB, as published. Nobody here has run it
Brain Status
Display a quick dashboard of all projects in the Claude Brain graph — status, last activity, current focus, blockers.
Modes
- Dashboard (default, "brain status" / "show projects" / …): the per-project overview in "Dashboard Generation" below.
- Analytics ("brain stats" / "graph analytics" / "graph activity over time"): the aggregate counts in "Analytics (brain stats)" below.
Both resolve the graph path first (Prerequisites). Pick the mode from the trigger phrase; if ambiguous, default to Dashboard.
Prerequisites
Resolve the graph path per skills/_shared/path-resolution.md.
Dashboard Generation
-
Census first — this decides what appears. Glob (or
ls)pages/Projects___*.mdandpages/Tasks___*.md— one free call. This file list, not the ripgrep in step 2, is authoritative for "what's in my brain": a page belongs on the dashboard because it exists, not because a later grep happened to match its content. At census time you have filenames only, so apply only the exclusion a filename can decide: drop pages ending___SessionArchive.md. Do not try to filter ontype::here — that requires reading each file, which would turn one free call into 45, and step 2's ripgrep already returnstype::for every page. The census is therefore a candidate list; step 2 narrows it. -
Collect every census page's state in one call. Digest properties make the whole dashboard greppable:
rg "^(type|status|last-updated|focus|next|open|digest-updated):: " pages/ \ -g "Projects___*.md" -g "Tasks___*.md"One result set gives, per page with a readable property block: its type, status, freshness, current focus, next action, and any open blocker. This is where
type::becomes available, so this is where the type-based exclusions happen — the census (step 1) could not make them. Drop from the candidate list: any page withtype:: session-archive, and anyProjects___*.mdwhosetype::is notproject— e.g.type:: task-index(a project's task inventory, likeProjects___Unicorn-Globus___Tasks.md) ortype:: project-note(a standalone note, likeProjects___Unicorn-Globus___ClaudeCodeAutomation.md). Both match the glob but are not projects; counting them would inflate the dashboard and the "N projects have no digest" line with pages that were never supposed to carry one (skills/_shared/digest.md's scope rule). A census page with notype::at all is not excluded here — it has a damaged or missing property block, and step 3 surfaces it rather than dropping it. -
Reconcile the census against the grep. The grep is a content search, not the page list — a page whose property block is damaged or absent produces zero hits and would otherwise vanish from the dashboard entirely, which for a memory tool reads as "the project isn't there." Match every census file (step 1) against the hits (step 2); any census file with zero hits is listed explicitly — "ProjectName — no properties, run brain-doctor" — never silently dropped. The census, not the grep, decides what is listed.
-
Fall back per project, not wholesale. A project page that has some properties but no
focus::/next::has not been backfilled with a digest yet (distinct from step 3's zero-hit pages, which have no readable properties at all). For those pages only, use the section-targeted reads inskills/_shared/section-locator.md— property block, first bullet of## Current Plan, last entry of## Session Log— exactly as before. A partially-backfilled graph therefore degrades one page at a time, never all at once. Mention the count once at the end: "<N> projects have no digest — run brain-doctor to backfill." Report the real count; never a placeholder digit. -
Apply staleness rules. Use
skills/_shared/staleness.mdto flag stale or abandoned projects. Also flag digest drift: step 2's results already carry bothdigest-updated::andlast-updated::for every page with a digest, so the comparison costs no extra reads. Where the gap exceeds 30 days, the digest may be describing older content (e.g. another device still on v0.9.x saved without refreshing it, or a Logseq hand-edit) — flag it the same way stale projects are flagged, and mention the count once: "<N> projects have a stale digest — seeskills/_shared/digest.mdto rebuild." Report the real count; never a placeholder digit. -
Read cross-project decisions. Check
pages/Decisions.mdfor entries from the last 30 days. -
Read Meta date. Check
pages/Meta.mdlast-updated::only — don't read the whole file. -
Task summary — no extra reads. The single ripgrep in step 2 already covered
pages/Tasks___*.md. Group from those results: active and blocked tasks listed by ID with their status; done tasks collapsed to one count line ("N done"); tasks with nostatus::listed as "legacy — run brain-doctor to backfill". Where a task has afocus::, show it; otherwise show the ID alone. -
Present the dashboard. For each project: name, status, staleness annotation (if any), digest-drift annotation (if any), current focus, open questions/blockers. Then: task summary (from step 8), recent cross-project decisions, total counts.
-
Write a journey-log entry per
skills/_shared/journey-log.mdwith activity line:viewed dashboard.
Example Output
Here's your brain status:
**LogseqBrain** (active, last updated <yyyy-MM-dd>)
Currently: <first bullet of Current Plan>
No blockers.
**ChivalricQuest** (active, last updated <yyyy-MM-dd>)
Currently: No active plan yet.
No blockers.
Tasks: CRMGM-2002 (active), CRMGM-1994 (blocked) · 31 done
2 projects tracked (2 active). No recent cross-project decisions.
Analytics (brain stats)
Read-only aggregate view. Writes nothing except the journey-log entry. Stay token-frugal — use skills/_shared/section-locator.md for targeted reads; never full-read project pages.
When counting, exclude template placeholder stubs — the italic markers a fresh brain-init page seeds, e.g. _Project-specific decisions._ under ## Decisions, _Session entries are added by brain-save._ under ## Session Log, and _No active plan yet._ under ## Current Plan. They denote an empty section, so a section that contains only its stub counts as 0, not 1.
-
Projects. Glob
pages/Projects___*.md. Count total. Applyskills/_shared/staleness.md, then collapse its four levels into two buckets for the count: active =fresh+aging, stale =stale+abandoned. Exclude session-archive pages from the project count, and exclude pages whosetype::isn'tproject(task-index,project-note, etc. — same exclusion as Dashboard step 1) — they match the glob but aren't projects. -
Decisions. Count two distinct figures, because cross-project decisions are intentionally duplicated in both places (so never sum them): (a) cross-project decisions in
pages/Decisions.md, and (b) decisions recorded on project pages (in their## Decisionssections; this includes the project-page copy of any cross-project decision). Break each down bystatus::value (e.g. accepted, superseded). -
Sessions. For each project page, count real entries under
## Session Log(section-targeted read; skip the placeholder stub). Sum across projects. -
Activity (recent window). Glob
journals/*.md. For journals dated within the last 30 days (filenameyyyy_MM_dd.md), count bullets under## Activity. Report the total as the recent activity signal. -
Present a compact block. The Tasks line is computed as in Dashboard step 8 — grouped from the same single ripgrep as step 2, which already covers
pages/Tasks___*.md; no per-task reads. legacy = task pages with nostatus::.Brain stats: Projects: <N> (<active> active, <stale> stale) Tasks: <N> (<a> active, <b> blocked, <d> done, <l> legacy) Decisions: <P> on project pages, <X> cross-project (by status: <accepted> accepted, <superseded> superseded) Sessions logged: <S> Activity (last 30 days): <A> entries -
Write a journey-log entry per
skills/_shared/journey-log.mdwith activity line:viewed brain stats.
Important Notes
- Concise overview, not a deep load — bias toward fewer reads.
- If no projects yet: "Your brain is empty. Use 'init brain project [name]' to add your first project."