From skillful-alhazen
Provides TypeDB-backed ontological memory with schema-driven retrieval, dynamic TypeQL queries, graph traversal, and Qdrant semantic search for agentic three-stage retrieval (plan-execute-organize).
npx claudepluginhub sciknow-io/skillful-alhazen --plugin tech-reconThis skill uses the workspace's default tool permissions.
Ontological memory for Alhazen: the agent understands the schema, composes queries dynamically, and navigates the full knowledge graph across all skill namespaces.
Provides UI/UX resources: 50+ styles, color palettes, font pairings, guidelines, charts for web/mobile across React, Next.js, Vue, Svelte, Tailwind, React Native, Flutter. Aids planning, building, reviewing interfaces.
Fetches up-to-date documentation from Context7 for libraries and frameworks like React, Next.js, Prisma. Use for setup questions, API references, and code examples.
Guides Payload CMS config (payload.config.ts), collections, fields, hooks, access control, APIs. Debugs validation errors, security, relationships, queries, transactions, hook behavior.
Share bugs, ideas, or general feedback.
Ontological memory for Alhazen: the agent understands the schema, composes queries dynamically, and navigates the full knowledge graph across all skill namespaces.
Core capability: Three-stage retrieval — plan queries from schema understanding, execute multi-step graph + vector searches, organize results with provenance.
Write-side entities:
# Understand the schema
uv run python .claude/skills/agentic-memory/agentic_memory.py describe-schema 2>/dev/null
# Run any TypeQL query
uv run python .claude/skills/agentic-memory/agentic_memory.py query \
--typeql 'match $p isa person, has name $n; $n contains "Burns"; fetch { "id": $p.id, "name": $n };' 2>/dev/null
# Semantic search across all embedded collections
uv run python .claude/skills/agentic-memory/agentic_memory.py search \
--query "CRISPR delivery mechanisms" --limit 5 2>/dev/null
# Create operator profile
uv run python .claude/skills/agentic-memory/agentic_memory.py create-operator \
--name "Gully Burns" --identity "Principal AI Architect" --role "Building knowledge graphs" 2>/dev/null
# Consolidate a fact into long-term memory
uv run python .claude/skills/agentic-memory/agentic_memory.py consolidate \
--content "TypeDB 3.x sub! operator returns direct parent only" \
--subject <entity-id> --fact-type knowledge --confidence 0.9 2>/dev/null
# Create episode with operation tracking
uv run python .claude/skills/agentic-memory/agentic_memory.py create-episode \
--skill agentic-memory --summary "Fixed schema hierarchy" 2>/dev/null
uv run python .claude/skills/agentic-memory/agentic_memory.py link-episode \
--episode <ep-id> --entities <id1>,<id2> \
--operation-type created --rationale "Created during schema fix session" 2>/dev/null
When answering questions about the knowledge graph, follow this three-stage pattern:
describe-schema to see what entity types, relations, and embedding indexes existperson, organization, works-at)Compose and execute queries dynamically using query and search commands:
search --query "..." [--collection <name>]
query --typeql 'match $e isa <type>, has id "<id>"; fetch { ... };'match (employee: $p, employer: $o) isa works-at; $o has name "Altos Labs";
fetch { "person": $p.name, "person-id": $p.id };
match (note: $n, subject: $e) isa aboutness; $e has id "<id>"; fetch { "content": $n.content };match (session: $ep, subject: $e) isa episode-mention; $e has id "<id>"; fetch { "episode": $ep.content };entity-alias for cross-skill duplicatesSynthesize results into a structured answer:
describe-schema returns the full entity/relation hierarchy with:
TypeDB's subtype polymorphism is key: match $p isa person returns ALL person subtypes (operator-user, author, jobhunt-contact, etc.). Use the broadest useful supertype for queries.
describe-schema)match $e isa person, has id "<id>"; (employee: $e, employer: $o) isa works-at;
fetch { "org-id": $o.id, "org-name": $o.name };
aboutness relationepisode-mention relationcollection-membership relationThe same real-world entity may exist as different TypeDB types across skills. Use entity-alias to link them, and check aliases when building unified views.
-- Polymorphic match (catches all subtypes)
match $p isa person; fetch { "id": $p.id, "name": $p.name };
-- Relation traversal
match (employee: $p, employer: $o) isa works-at;
fetch { "person": $p.name, "org": $o.name };
-- Multi-hop: person -> org -> collection
match
(employee: $p, employer: $o) isa works-at;
(collection: $c, member: $o) isa collection-membership;
fetch { "person": $p.name, "collection": $c.name };
-- Notes about an entity
match
$e isa identifiable-entity, has id "<id>";
(note: $n, subject: $e) isa aboutness;
fetch { "note-id": $n.id, "content": $n.content, "confidence": $n.confidence };
-- Text search (substring match)
match $e isa person, has name $n; $n contains "Burns";
fetch { "id": $e.id, "name": $n };
-- Temporal filtering
match $r (employee: $p, employer: $o) isa works-at, has valid-from $vf;
fetch { "person": $p.name, "org": $o.name, "since": $vf };
The search command embeds query text with Voyage AI and searches Qdrant collections.
Available collections (check describe-schema for current list + point counts):
alhazen_papers — scientific papers (title + abstract)apt-notes — disease mechanism evidence notesjobhunt-opportunities — job positions with sensemaking notesdismech_benchmark — disease mechanism corpus (25K+ points)Cross-collection search (omit --collection) searches ALL collections and merges results by score. This is the "search everything" capability.
Results include entity IDs that bridge back to TypeDB for graph follow-up.
# Consolidate a fact
agentic_memory.py consolidate --content "..." --subject <entity-id> --fact-type knowledge --confidence 0.9
# Recall claims about an entity
agentic_memory.py recall --subject <entity-id>
# Invalidate (soft delete with timestamp)
agentic_memory.py invalidate <claim-id>
# Create with skill attribution
agentic_memory.py create-episode --skill <name> --summary "What happened"
# Link entities with operation tracking
agentic_memory.py link-episode --episode <ep-id> --entities <id1>,<id2> \
--operation-type created --rationale "Why this was done"
# View structured session history
agentic_memory.py show-episode <ep-id>
# Link two entities as the same real-world thing
agentic_memory.py merge-entities --canonical <id1> --alias <id2> --description "Same person"
# Remove alias
agentic_memory.py unmerge-entities --canonical <id1> --alias <id2>
# List all aliases (or for a specific entity)
agentic_memory.py list-aliases [--id <entity-id>]
agentic_memory.py create-operator --name "..." --identity "..." --role "..."
agentic_memory.py update-context-domain --person <id> --domain goals --content "..."
agentic_memory.py get-context --person <id>
agentic_memory.py link-project --person <id> --collection <id>
agentic_memory.py link-tool --person <id> --entity <id>
agentic_memory.py link-person --from-person <id> --to-person <id> --context "..."
All commands return JSON to stdout. uv run emits a VIRTUAL_ENV warning to stderr. Always use 2>/dev/null when piping to a JSON parser.
Read USAGE.md for full command reference.