Create Context Graph
Memory frameworkOfficial neo4j-labs project
Created by neo4j-labs
Published in neo4j-labs/create-context-graph. Publisher page
747 GitHub stars
What it is
AI agents with graph based reasoning memory, scaffolded in seconds
AutoGineer overview, from the brain’s own files
Create Context Graph is an interactive scaffolding tool designed to accelerate the development of AI agents that utilize graph-based memory. By walking developers through a wizard, it generates a complete, domain-specific application stack including a FastAPI backend, a Next.js frontend with interactive graph visualization, and a configured AI agent. The tool supports multiple agent frameworks and offers a choice between a hosted memory backend (NAMS) or a self-hosted Neo4j instance. It includes built-in support for importing data from various SaaS platforms, generating domain-specific ontologies, and creating MCP servers for integration with Claude Desktop.
How it works
Memory model: Hybrid
AutoGineer overview, from the brain’s own files
The tool operates as a CLI that uses Jinja2 templates to generate project code based on a selected industry domain and agent framework. It creates a FastAPI backend for agent logic and a Next.js frontend for visualization. Memory is managed either via the hosted NAMS service or a self-hosted Neo4j database. The system supports data ingestion from various connectors and can generate domain-specific ontologies, schemas, and agent tools automatically.
| Folder | Role | Files |
|---|---|---|
| .github | agent-config | 2 |
| docs | docs | 105 |
| scripts | scripts | 2 |
| src | source-code | 168 |
| tests | tests | 48 |
| .serena | folder | 1 |
| npm-wrapper | folder | 3 |
The agent reads
- get_entity_detail_nams evidence: CLAUDE.md
- list_traces evidence: CLAUDE.md
- list_documents_nams evidence: CLAUDE.md
- find_decisions evidence: CLAUDE.md
- search_sessions evidence: CLAUDE.md
- get_collector evidence: CLAUDE.md
The agent writes
- delete_entity evidence: CLAUDE.md
- add_relationship evidence: CLAUDE.md
- add_entity evidence: CLAUDE.md
Requirements
Runtimes: Python >=3.11
Databases: Neo4j
API keys (by name): ANTHROPIC_API_KEY, GOOGLE_API_KEY, LINEAR_API_KEY, MEMORY_API_KEY, OPENAI_API_KEY
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Google Antigravity, Kiro, OpenCode, Amp, Roo Code, Cline, JetBrains Junie, Devin (ex-Windsurf)
Set it up
This brain runs code automatically: 1 script. Review Makefile before opening the folder in Claude Code. No step below turns a hook on for you.
Makefile:uv venv && uv pip install -e ".[dev]"
- Not scanned by AutoGineerIts dependencies are installed by pip or uv when you run it and were not scanned by AutoGineer (7 declared). https://pypi.org/project/create-context-graph/
Created by neo4j-labs. Published in neo4j-labs/create-context-graph. Licence: Apache License 2.0.
Usage
AutoGineer overview, from the brain’s own files
- Scaffold a new project using the interactive CLI wizard.
- Generate a project with a specific domain and agent framework via CLI flags.
- Connect SaaS data sources like GitHub, Slack, or Notion to populate the graph.
- Configure the memory backend for either hosted NAMS or self-hosted Neo4j.
- Generate an MCP server configuration for Claude Desktop integration.
- Re-import data or seed the graph using generated make commands.
- “uvx create-context-graph my-app --domain healthcare --framework strands --nams-api-key sk-nams-...”
- Generates a healthcare-focused agent application using the Strands framework and hosted NAMS memory.
- “uvx create-context-graph my-app --domain personal-knowledge --framework pydanticai --self-hosted --connector github”
- Generates a personal knowledge application with self-hosted Neo4j, pre-populated with GitHub data.
Documentation by neo4j-labs
Create Context Graph
This is an experimental Neo4j Labs project and not part of Neo4j's supported product lineup. See the Neo4j Labs disclaimer.
Neo4j Labs Project — This project is part of Neo4j Labs. It is maintained by Neo4j staff and the community, but not officially supported. For help, use GitHub Issues or the Neo4j Community Forum.
Interactive CLI scaffolding tool that generates fully-functional, domain-specific context graph applications. Pick your industry domain, pick your agent framework, and get a complete full-stack app in under 5 minutes.
<p align="center"> <img src="docs/static/img/app-three-panel.png" alt="Generated app: chat interface, graph visualization, and document browser" width="800" /> </p>
# Python — NAMS-default (hosted memory)
uvx create-context-graph my-app --domain healthcare --framework strands --nams-api-key sk-nams-...
# Self-hosted Neo4j with full demo fixtures
uvx create-context-graph my-app --domain healthcare --framework pydanticai --self-hosted --demo
# Node.js / interactive wizard
npx create-context-graphWhat It Does
Create Context Graph walks you through an interactive wizard and generates a complete project:
FastAPI backend with an AI agent configured for your domain, powered by neo4j-agent-memory v0.4 for multi-turn conversations with automatic entity extraction. Memory backend is configurable: hosted NAMS (default) or self-hosted bolt Neo4j (
--self-hosted).LiteLLM provider injection for the memory layer — pick any LLM + embedding provider via
MEMORY_LLM/MEMORY_EMBEDDINGenv vars (Anthropic, OpenAI, Bedrock, Vertex AI, Ollama, Groq, Together, …). Native adapters resolve first; everything else routes through LiteLLM.Next.js + Chakra UI v3 frontend with streaming chat (Server-Sent Events), real-time tool call visualization (Timeline with live spinners), interactive graph visualization (schema view, double-click expand, drag/zoom, property panel), entity detail panel, document browser, and decision trace viewer
Neo4j schema with domain-specific constraints, indexes, and GDS projections (self-hosted mode)
Rich demo data — LLM-generated entities, relationships, professional documents (discharge summaries, trade confirmations, lab reports), and multi-step decision traces
SaaS data import — connect GitHub, Slack, Gmail, Jira, Notion, Google Calendar, Salesforce, Linear, Google Workspace, Claude Code, Claude AI, ChatGPT, or local files
Custom domains — describe your domain in plain English and the LLM generates a complete ontology
Domain-specific agent tools with Cypher queries tailored to your industry
MCP server for Claude Desktop — optionally generates an MCP server config so Claude Desktop can query the same knowledge graph (
--with-mcp)
Creating context graph application...
Domain: Wildlife Management
Framework: PydanticAI
Data: Demo (synthetic)
Neo4j: Docker (neo4j://localhost:7687)
[1/6] Generating domain ontology... ✓
[2/6] Creating project scaffold... ✓
[3/6] Configuring agent tools & system prompt... ✓
[4/6] Generating synthetic documents (25 docs)... ✓
[5/6] Writing fixture data... ✓
[6/6] Bundling project... ✓
Done! Your context graph app is ready.
cd my-app
make install && make startQuick Start
There are two flows depending on what you want:
NAMS (default) — hosted memory backend. No Neo4j to install or operate. Graph starts empty; the agent populates it as you chat.
Self-hosted (
--self-hosted) — bolt Neo4j you run yourself (Aura, Docker, neo4j-local). Full demo fixtures available viamake seed.
Prerequisites
Python 3.11+ (with uv recommended)
Node.js 18+ (for the frontend)
NAMS path: a NAMS API key from memory.neo4jlabs.com
Self-hosted path: Neo4j 5+ (Docker, Aura, or local install)
Either path:
ANTHROPIC_API_KEYfor the agent (orOPENAI_API_KEY/GOOGLE_API_KEYdepending on framework)
NAMS path (default, hosted memory)
uvx create-context-graph my-app \
--domain healthcare \
--framework strands \
--nams-api-key sk-nams-...
cd my-app
echo 'ANTHROPIC_API_KEY=sk-ant-...' >> .env # Strands needs Anthropic
make install
make startOpen http://localhost:3000. Graph starts empty — chat with the agent and entities populate via auto-extraction.
Self-hosted path (bolt Neo4j + full demo data)
uvx create-context-graph my-app \
--domain healthcare \
--framework pydanticai \
--self-hosted \
--demo
cd my-app
echo 'ANTHROPIC_API_KEY=sk-ant-...' >> .env
make install
make docker-up # or: make neo4j-start (for neo4j-local)
make seed
make startOpen http://localhost:3000. Pre-populated graph with ~85 entities, 180 relationships, 25 documents, and decision traces.
Other scaffold patterns
# Interactive wizard (asks 6 prompts, autocomplete domain picker)
uvx create-context-graph
# Custom domain from description
uvx create-context-graph my-app \
--custom-domain "veterinary clinic management" \
--framework pydanticai \
--self-hosted --demo \
--anthropic-api-key $ANTHROPIC_API_KEY
# Import real data from SaaS services
uvx create-context-graph my-app \
--domain personal-knowledge --framework pydanticai --self-hosted \
--connector github --connector slack
# With MCP server for Claude Desktop (works on either backend)
uvx create-context-graph my-app \
--domain healthcare --framework strands \
--nams-api-key sk-nams-... --with-mcp
# Pick a specific LiteLLM provider for memory entity extraction
uvx create-context-graph my-app \
--domain healthcare --framework strands --nams-api-key sk-nams-... \
--memory-llm bedrock/anthropic.claude-3-haiku-20240307-v1:0 \
--memory-embedding sentence-transformers/all-MiniLM-L6-v2Explore the running app
Frontend: http://localhost:3000 — Chat with the AI agent, explore the knowledge graph
Backend API: http://localhost:8000/docs — FastAPI auto-generated docs
Health endpoint: http://localhost:8000/health — reports the active memory backend
NAMS dashboard: memory.neo4jlabs.com (NAMS path only)
Neo4j Browser: http://localhost:7474 (self-hosted Docker / neo4j-local only)
NAMS write-path caveats (v0.4)
The NAMS REST API has a narrower write surface than bolt Cypher. The CLI and the generated import_data.py work around it with a hybrid write shape:
Relationships encoded as
ccg-edgesYAML blocks inside each source entity'sdescription. The frontend graph view parses them out and renders edges; a future migration replays them as native edges when NAMS addsadd_relationship.Entity properties collapse into
descriptionas a markdown block (NAMS REST accepts onlyname/type/description).Documents are dual-tracked —
long_term.add_entity(type=OBJECT)(queryable, matches bolt:Document) ANDshort_term.add_message(role="document")(extraction fuel).No preferences or facts via REST.
auto_preferencesforced off on NAMS.GDS endpoints and arbitrary Cypher writes return 501 on NAMS.
For native graph edges + GDS + arbitrary Cypher, use --self-hosted --demo.
Supported Domains
27 industry domains, each with a purpose-built ontology, sample data, agent tools, and demo scenarios:
| Domain | Key Entities | Domain | Key Entities |
|---|---|---|---|
| Financial Services | Account, Transaction, Decision, Policy | Real Estate | Property, Listing, Agent, Inspection |
| Healthcare | Patient, Provider, Diagnosis, Treatment | Vacation & Hospitality | Resort, Booking, Guest, Activity |
| Retail & E-Commerce | Customer, Product, Order, Review | Oil & Gas | Well, Reservoir, Equipment, Permit |
| Manufacturing | Machine, Part, WorkOrder, Supplier | Data Journalism | Source, Story, Claim, Investigation |
| Scientific Research | Researcher, Paper, Dataset, Grant | Trip Planning | Destination, Hotel, Activity, Itinerary |
| GenAI / LLM Ops | Model, Experiment, Prompt, Evaluation | GIS & Cartography | Feature, Layer, Survey, Boundary |
| Agent Memory | Agent, Conversation, Memory, ToolCall | Wildlife Management | Species, Sighting, Habitat, Camera |
| Gaming | Player, Character, Quest, Guild | Conservation | Site, Species, Program, Funding |
| Personal Knowledge | Note, Contact, Project, Topic | Golf & Sports Mgmt | Course, Player, Round, Tournament |
| Digital Twin | Asset, Sensor, Reading, Alert | Software Engineering | Repository, Issue, PR, Deployment |
| Product Management | Feature, Epic, UserPersona, Metric | Hospitality | Hotel, Room, Reservation, Service |
| Options Intelligence | Underlying, OptionsContract, Regime, KeyLevel | Legal | Case, Matter, Contract, Filing |
| Education | Student, Instructor, Course, Assessment | Cybersecurity | Asset, Vulnerability, Alert, Incident |
| Government | Agency, Program, Policy, Regulation |
# List all available domains
create-context-graph --list-domainsCustom domains: Don't see your industry? Select "Custom (describe your domain)" in the wizard or use --custom-domain "your description". The LLM generates a complete ontology with entity types, relationships, agent tools, and more.
SaaS Data Connectors
<p align="center"> <img src="docs/static/img/connector-data-flow.png" alt="SaaS connector data flow into Neo4j knowledge graph" width="700" /> </p>
Import real data from your existing tools instead of (or in addition to) synthetic demo data:
| Service | What's Imported | Auth |
|---|---|---|
| GitHub | Issues, PRs, commits, contributors | Personal access token |
| Notion | Pages, databases, users | Integration token |
| Jira | Issues, sprints, users | API token |
| Slack | Channel messages, threads, users | Bot OAuth token |
| Gmail | Emails (last 30 days) | Google Workspace CLI or OAuth2 |
| Google Calendar | Events, attendees (last 90 days) | Google Workspace CLI or OAuth2 |
| Salesforce | Accounts, contacts, opportunities | Username/password |
| Linear | Issues, projects, cycles, teams, users, labels, comments, milestones, initiatives, attachments + decision traces from history | Personal API key |
| Google Workspace | Drive files, comment threads (as decision traces), revisions, Drive Activity, Calendar events, Gmail metadata | Google OAuth 2.0 |
| Claude Code | Session history, messages, tool calls, files, decisions, preferences, errors | None (local files) |
| Claude AI | Conversations, messages, tool calls, thinking traces from Claude AI web/app export | None (local file) |
| ChatGPT | Conversations, messages, tool results from ChatGPT data export | None (local file) |
The Google Workspace connector extracts resolved comment threads from Google Docs as first-class decision traces — capturing the question, deliberation, resolution, and participants. Combined with Linear, it provides the full decision lifecycle: from meeting discussion to code execution.
The Claude Code connector reads your local session history from ~/.claude/projects/ — no API keys needed. It extracts decision traces from user corrections and error-resolution cycles, identifies developer preferences from explicit statements and behavioral patterns, and automatically redacts secrets before storage.
The Claude AI and ChatGPT connectors import your conversation exports directly from the official data export features. Export your data from Settings, pass the .zip file to the CLI with --import-type claude-ai or --import-type chatgpt, and get a fully populated context graph from your real conversations — no API keys needed.
Connectors run at scaffold time to populate initial data. They're also generated into your project so you can re-import with make import:
cd my-app
make import # Re-import from connected services
make import-and-seed # Import and seed into Neo4jAgent Frameworks
Select your preferred agent framework at project creation time:
| Framework | Description |
|---|---|
| PydanticAI | Structured tool definitions with Pydantic models and RunContext |
| Claude Agent SDK | Anthropic tool-use with agentic loop |
| OpenAI Agents SDK | @function_tool decorators with Runner.run() |
| LangGraph | Stateful graph-based agent workflow with create_react_agent() |
| CrewAI | Multi-agent crew with role-based tools |
| Strands | Tool-use agents with Anthropic model |
| Google ADK | Gemini agents with FunctionTool calling |
| Anthropic Tools | Modular tool registry with Anthropic API agentic loop |
All frameworks share the same FastAPI HTTP layer, Neo4j client, and frontend. Only the agent implementation differs. "Full streaming" means token-by-token text + real-time tool calls. "Tool streaming" means real-time tool calls with text delivered at the end.
Note on memory providers: Conversation memory uses local
sentence-transformers/all-MiniLM-L6-v2embeddings by default — no API key required. Override withMEMORY_EMBEDDING(LiteLLM provider string) for OpenAI, Vertex AI, Bedrock, or others. The entity-extraction LLM defaults toanthropic/claude-haiku-4-5whenANTHROPIC_API_KEYis set, oropenai/gpt-4o-miniif onlyOPENAI_API_KEYis set. Override withMEMORY_LLMfor full control. See Configure Memory Providers.
Generated Project Structure
<p align="center"> <img src="docs/static/img/ontology-pipeline.png" alt="From domain YAML through Jinja2 templates to generated code" width="750" /> </p>
A single domain YAML drives the entire generated application — schema, models, agent tools, and visualization — through the Jinja2 template engine.
my-app/
├── backend/
│ ├── app/
│ │ ├── main.py # FastAPI application
│ │ ├── agent.py # AI agent (framework-specific)
│ │ ├── config.py # Settings from .env
│ │ ├── routes.py # REST API endpoints
│ │ ├── models.py # Pydantic models (from ontology)
│ │ ├── context_graph_client.py # Neo4j CRUD operations
│ │ ├── memory.py # Memory integration (MemoryIntegration)
│ │ ├── gds_client.py # Graph Data Science algorithms
│ │ ├── vector_client.py # Vector search
│ │ └── connectors/ # SaaS connectors (if selected)
│ ├── scripts/
│ │ ├── generate_data.py # Data seeding script
│ │ └── import_data.py # SaaS import script (if connectors selected)
│ └── pyproject.toml
├── frontend/
│ ├── app/ # Next.js pages
│ ├── components/
│ │ ├── ChatInterface.tsx # Streaming AI chat (SSE) with real-time tool calls + graph data flow
│ │ ├── ContextGraphView.tsx # Interactive NVL graph (schema view, expand, drag/zoom, properties)
│ │ ├── DecisionTracePanel.tsx # Reasoning trace viewer with step details
│ │ ├── DocumentBrowser.tsx # Document browser with template filtering
│ │ └── Provider.tsx # Chakra UI v3 provider
│ ├── lib/config.ts # Domain configuration
│ ├── theme/index.ts # Chakra theme with domain colors
│ └── package.json
├── cypher/
│ ├── schema.cypher # Constraints & indexes
│ └── gds_projections.cypher # GDS algorithm config
├── data/
│ ├── ontology.yaml # Domain ontology definition
│ └── fixtures.json # Pre-generated sample data
├── .env # Neo4j + API key configuration
├── .env.example # Configuration template (tracked in git)
├── .dockerignore # Docker build context exclusions
├── docker-compose.yml # Local Neo4j instance (Docker mode only)
├── Makefile # start, seed, reset, install, test, test-connection, lint
├── mcp/ # MCP server config (only if --with-mcp)
└── README.md # Domain-specific documentation (with framework docs + troubleshooting)CLI Reference
create-context-graph [PROJECT_NAME] [OPTIONS]
Arguments:
PROJECT_NAME Project name (optional — auto-generated from domain+framework if omitted)
Options:
--domain TEXT Domain ID (e.g., healthcare, gaming)
--framework TEXT Agent framework (strands [default], pydanticai, claude-agent-sdk, openai-agents, langgraph, crewai, google-adk, anthropic-tools)
--self-hosted Use self-hosted Neo4j (bolt) instead of NAMS hosted memory
--nams-api-key TEXT NAMS API key [env: MEMORY_API_KEY] — obtain at https://memory.neo4jlabs.com
--nams-endpoint TEXT Override NAMS endpoint URL (default: https://memory.neo4jlabs.com/v1)
--memory-llm TEXT LiteLLM provider string for memory entity extraction (e.g. anthropic/claude-haiku-4-5)
--memory-embedding TEXT LiteLLM provider string for memory embeddings (e.g. sentence-transformers/all-MiniLM-L6-v2)
--demo-data Generate synthetic demo data
--custom-domain TEXT Generate custom domain from description (requires --anthropic-api-key)
--connector TEXT SaaS connector to enable; repeatable (github, slack, jira, notion, gmail, gcal, salesforce, linear, google-workspace, claude-code, claude-ai, chatgpt)
--import-type TEXT Chat history import: claude-ai or chatgpt (requires --import-file)
--import-file PATH Path to chat export file (.zip, .json, .jsonl)
--import-depth TEXT Import extraction depth: fast (default) or deep
--import-filter-after TEXT Only import conversations after this date (ISO 8601)
--import-filter-before TEXT Only import conversations before this date (ISO 8601)
--import-filter-title TEXT Only import conversations matching title pattern (regex)
--import-max-conversations INT Max conversations to import, 0=all (default: 0)
--linear-api-key TEXT Linear API key (required for --connector linear) [env: LINEAR_API_KEY]
--linear-team TEXT Linear team key to filter import (e.g., ENG) [env: LINEAR_TEAM]
--gws-folder-id TEXT Google Drive folder ID to scope import [env: GWS_FOLDER_ID]
--gws-include-comments / --gws-no-comments Import comment threads (default: on)
--gws-include-revisions / --gws-no-revisions Import revision history (default: on)
--gws-include-activity / --gws-no-activity Import Drive Activity (default: on)
--gws-include-calendar Import Calendar events (default: off)
--gws-include-gmail Import Gmail thread metadata (default: off)
--gws-since TEXT Import data since date (ISO format, default: 90 days ago)
--gws-mime-types TEXT MIME types to include (default: docs,sheets,slides)
--gws-max-files INT Maximum files to import (default: 500)
--claude-code-scope TEXT Import current project or all (default: current)
--claude-code-project TEXT Explicit project path to import sessions for
--claude-code-since TEXT Import sessions since date (ISO format)
--claude-code-max-sessions INT Max sessions to import, 0=all (default: 0)
--claude-code-content TEXT Content mode: truncated, full, none (default: truncated)
--with-mcp Generate MCP server configuration for Claude Desktop
--mcp-profile TEXT MCP tool profile: core (6 tools) or extended (16 tools, default)
--session-strategy TEXT Memory session strategy: per_conversation (default), per_day, persistent
--auto-extract/--no-auto-extract Auto-extract entities from messages (default: on)
--auto-preferences/--no-auto-preferences Auto-detect user preferences (default: on)
--ingest Ingest data into Neo4j after generation
--neo4j-uri TEXT Neo4j connection URI [env: NEO4J_URI] (--self-hosted only)
--neo4j-username TEXT Neo4j username [env: NEO4J_USERNAME] (--self-hosted only)
--neo4j-password TEXT Neo4j password [env: NEO4J_PASSWORD] (--self-hosted only)
--neo4j-aura-env PATH Path to Neo4j Aura .env file with credentials (--self-hosted only)
--neo4j-local Use @johnymontana/neo4j-local for local Neo4j (--self-hosted only)
--anthropic-api-key TEXT Anthropic API key for LLM generation [env: ANTHROPIC_API_KEY]
--openai-api-key TEXT OpenAI API key for LLM generation [env: OPENAI_API_KEY]
--google-api-key TEXT Google/Gemini API key (required for google-adk) [env: GOOGLE_API_KEY]
--output-dir PATH Output directory (default: ./<project-name>)
--demo Shortcut for --reset-database --demo-data --ingest
--reset-database Clear all Neo4j data before ingesting
--dry-run Preview what would be generated without creating files
--verbose Enable verbose debug output
--list-domains List available domains and exit
--version Show version and exit
--help Show help and exitContext Graph Architecture
<p align="center"> <img src="docs/static/img/architecture-overview.png" alt="Architecture: generation pipeline and runtime components" width="800" /> </p>
Every generated app demonstrates the three-memory-type architecture from neo4j-agent-memory:
<p align="center"> <img src="docs/static/img/memory-architecture.png" alt="Three memory types: short-term, long-term, and reasoning memory in Neo4j" width="700" /> </p>
Short-term memory — Conversation history and document content stored as messages
Long-term memory — Entity knowledge graph built on the POLE+O model (Person, Organization, Location, Event, Object)
Reasoning memory — Decision traces with full provenance: thought chains, tool calls, causal relationships
This is what makes context graphs different from simple RAG — the agent doesn't just retrieve text, it reasons over a structured knowledge graph with full decision traceability.
With --with-mcp, the generated project also includes an MCP server configuration that connects Claude Desktop to the same knowledge graph. This dual-interface architecture means the web app and Claude Desktop share one context graph — entities, conversations, and reasoning traces are available everywhere.
Development
# Clone and install
git clone https://github.com/neo4j-labs/create-context-graph.git
cd create-context-graph
uv venv && uv pip install -e ".[dev]"
# Run tests (no Neo4j or API keys required)
source .venv/bin/activate
pytest tests/ -v # Fast: 1,177 tests
pytest tests/ -v --slow # Full: 1,398 tests (includes domain x framework matrix + perf + generated project tests)
pytest tests/ --integration # Integration tests (requires running Neo4j)
# Test a specific scaffold
create-context-graph /tmp/test-app --domain software-engineering --framework pydanticai --demo-dataMakefile Targets
| Target | Description | Requirements |
|---|---|---|
make test | Run fast unit tests (1,177 tests) | None |
make test-slow | Full suite including matrix + perf + generated project tests (1,398 tests) | None |
make test-matrix | Domain × framework matrix only (176 combos) | None |
make test-coverage | Tests with HTML coverage report | None |
make smoke-test | E2E smoke tests for 3 key frameworks | Neo4j + LLM API keys |
make lint | Run ruff linter | ruff |
make scaffold | Scaffold a test project to /tmp/test-scaffold | None |
make build | Build Python package (sdist + wheel) | None |
make docs | Start Docusaurus dev server | Node.js |
E2E Smoke Tests
The smoke tests scaffold a real project, install dependencies, start the backend, and send chat prompts to verify the full pipeline works end-to-end. Pass --backend nams to test the hosted-memory path (requires MEMORY_API_KEY env); the default bolt exercises self-hosted Neo4j with full demo fixtures:
# Run all 3 smoke tests (requires Neo4j + at least one LLM API key)
make smoke-test
# Or run individual framework tests directly (default: --backend bolt)
python scripts/e2e_smoke_test.py --domain financial-services --framework pydanticai --quick
python scripts/e2e_smoke_test.py --domain real-estate --framework google-adk --quick
python scripts/e2e_smoke_test.py --domain trip-planning --framework strands --quick
# Test against NAMS hosted backend (requires MEMORY_API_KEY env)
python scripts/e2e_smoke_test.py --domain healthcare --framework strands --backend nams --quick
# Test all 27 domains with one framework
python scripts/e2e_smoke_test.py --all-domains --framework pydanticai --quick
# Full mode (all prompts per scenario, not just first)
python scripts/e2e_smoke_test.py --domain healthcare --framework claude-agent-sdkRequired environment variables:
NEO4J_URI,NEO4J_USERNAME,NEO4J_PASSWORD— Neo4j connection (Aura, Docker, or local) for--backend boltMEMORY_API_KEY— NAMS API key for--backend namsANTHROPIC_API_KEY— for Claude-based frameworks (PydanticAI, Claude Agent SDK, Anthropic Tools, Strands, CrewAI)OPENAI_API_KEY— for OpenAI-based frameworks (OpenAI Agents, LangGraph)GOOGLE_API_KEY— for Google ADK (Gemini)
CI Pipeline
GitHub Actions (.github/workflows/ci.yml) runs automatically:
| Job | Trigger | Description |
|---|---|---|
| test | All pushes + PRs | Unit tests on Python 3.11 and 3.12 (1,177 tests including security, doc snippets, frontend logic, NAMS adapter, wizard, route integration) |
| lint | All pushes + PRs | Ruff linter on src/ and tests/ |
| matrix | Push to main only | Full suite + 176 domain × framework matrix + perf + generated project tests (1,398 tests) |
| smoke-test | Push to main only | Neo4j integration tests + E2E for all 8 frameworks (scaffold → install → start → chat) |
The smoke-test CI job is gated behind a SMOKE_TESTS_ENABLED repository variable. To enable it:
Go to Settings → Variables → Repository variables and add
SMOKE_TESTS_ENABLED=trueGo to Settings → Secrets → Repository secrets and add:
NEO4J_URI— e.g.,neo4j+s://xxxxx.databases.neo4j.ioNEO4J_USERNAMENEO4J_PASSWORDANTHROPIC_API_KEYOPENAI_API_KEYGOOGLE_API_KEY
The smoke-test job uses fail-fast: false so one framework failure doesn't block the others, and it only runs after the unit test job passes.
The npm package is a thin wrapper that delegates to the Python CLI via uvx, pipx, or python3 -m. It requires Python 3.11+ to be installed.
Automated Publishing (GitHub Actions)
Both packages are published automatically when you push a version tag:
# 1. Update version in pyproject.toml and npm-wrapper/package.json
# 2. Commit the version bump (and any CHANGELOG.md update)
# 3. Tag and push
git tag v0.13.0
git push origin v0.13.0This triggers a GitHub Actions workflow, release.yml with jobs:
publish-pypi — Builds and publishes to PyPI
publish-npm — Publishes the npm wrapper to npmjs.com Both use trusted publishing/OIDC.
Version Bumping
Both packages must use the same version. Update in two places:
pyproject.toml→version = "X.Y.Z"npm-wrapper/package.json→"version": "X.Y.Z"
Note: a job called validate-version-consistency in release.yml ensures that the correct versions exist in both places.
License
Apache-2.0
ROADMAP.md
Roadmap — Create Context Graph
Last updated: March 22, 2026
Overview
Create Context Graph was built in 6 phases. The goal was to go from an empty repository to a published CLI tool that generates domain-specific context graph applications for 22 industry verticals with 8 agent framework options, powered by neo4j-agent-memory for multi-turn conversations.
Phase 1: Core CLI & Template Engine — COMPLETE
Timeline: Weeks 1–3 Status: Done
Built the foundational scaffolding tool: Python package structure, CLI, interactive wizard, template engine, and initial templates.
What was built
Python package (
src/create_context_graph/) withhatchlingbuild,srclayout, entry point viacreate-context-graphcommandClick CLI (
cli.py) with both interactive and non-interactive (flag-based) modesInteractive wizard (
wizard.py) — 7-step flow using Questionary + Rich: project name, data source, domain selection, agent framework, Neo4j connection, API keys, confirmationProjectConfig model (
config.py) — Pydantic model holding all wizard outputs, computed slug, framework display names and dependency mappings for all 8 planned frameworksDomain ontology system (
ontology.py) — YAML loader with two-layer inheritance (_base.yaml+ domain YAML), Pydantic validation models for all ontology sections, code generation helpers (Cypher schema, Pydantic models, NVL visualization config)Jinja2 template engine (
renderer.py) —PackageLoader-based renderer with custom filters (snake_case,camel_case,pascal_case,kebab_case), renders full project directory from templates + ontology context3 initial domain ontologies — Financial Services, Healthcare, Software Engineering (complete with entity types, relationships, document templates, decision traces, demo scenarios, agent tools, system prompts, visualization config)
Backend templates — FastAPI main, config, Neo4j client, GDS client, vector search client, Pydantic models, REST routes, pyproject.toml, data generation script, agent stub fallback
2 agent framework templates — PydanticAI (structured tool definitions with
RunContext) and Claude Agent SDK (Anthropic tool-use with agentic loop)Frontend templates — Next.js 15 + Chakra UI v3 + NVL: layout, page (3-panel), ChatInterface, ContextGraphView, DecisionTracePanel, Provider, domain config, theme
Base templates —
.env,Makefile,docker-compose.yml,README.md,.gitignoreCypher templates — Schema constraints/indexes from ontology, GDS graph projections
Neo4j connection validator (
neo4j_validator.py)
Key design decisions made
Templates are domain-agnostic, data-driven — no per-domain template directories; the ontology YAML drives all customization
Only
agent.pyvaries by framework; everything else is sharedJSX/Python dict literals in templates use
{% raw %}...{% endraw %}blocks to avoid Jinja2 conflictsPre-built fixtures are bundled and copied into every generated project
Phase 2: Domain Expansion & Document Generation — COMPLETE
Timeline: Weeks 4–6 Status: Done
Expanded from 3 domains to 22, built the synthetic data generation pipeline, and created the Neo4j ingestion system.
What was built
19 additional domain ontology YAMLs — All validated and scaffold-tested. Domains: Agent Memory, Conservation, Data Journalism, Digital Twin, Gaming, GenAI/LLM Ops, GIS & Cartography, Golf & Sports Mgmt, Hospitality, Manufacturing, Oil & Gas, Personal Knowledge, Product Management, Real Estate, Retail & E-Commerce, Scientific Research, Trip Planning, Vacation Industry, Wildlife Management
Synthetic data generation pipeline (
generator.py) — 4-stage pipeline:Entity seeding — LLM-powered or static fallback, generates 5+ entities per type with properties matching ontology schema
Relationship weaving — Connects entities based on ontology relationship definitions, avoids self-relationships
Document generation — Produces 25+ documents across all template types defined in the ontology (LLM-powered for realistic content, static fallback for offline use)
Decision trace injection — Creates reasoning traces from ontology scenarios with thought/action/observation steps
LLM client abstraction — Supports both Anthropic and OpenAI as generation providers, graceful fallback to static data when no API key is available
Data ingestion system (
ingest.py) — Dual-backend ingestion:Primary:
neo4j-agent-memoryMemoryClient (long-term entities, short-term documents, reasoning traces — all three memory types)Fallback: Direct
neo4jdriver when neo4j-agent-memory isn't installedSchema application from generated Cypher
Pre-generated fixture files — All 22 domains ship with static
fixtures/{domain-id}.jsonfiles so projects work immediately without an LLM API keyCLI integration —
--demo-dataflag triggers generation,--ingestflag triggers Neo4j ingestion,--anthropic-api-keyenables LLM-powered generation, pre-built fixtures always copied intodata/fixtures.jsonComprehensive test suite (85 tests, all passing):
test_config.py— 10 unit tests for ProjectConfigtest_ontology.py— 20 unit tests including parametric validation of all 22 domainstest_renderer.py— 18 unit tests for rendering, file structure, framework selection, Python compile verificationtest_generator.py— 14 unit tests for data generation across 6 domainstest_cli.py— 13 integration tests for CLI invocation, 6 domain/framework combinations
Verified
All 22 domains load and validate without errors
18/18 domain+framework combinations scaffold successfully (9 domains x 2 frameworks)
Generated Python files pass
compile()syntax check85/85 tests pass in 3.4 seconds
Phase 3: Framework Templates & Frontend — COMPLETE
Timeline: Weeks 7–8 Status: Done
Added all 8 agent framework templates, replaced NVL placeholder with real graph visualization, and expanded the test suite.
What was built
6 new agent framework templates — All in
templates/backend/agents/, each generating valid Python with domain-specific tools from ontology:OpenAI Agents SDK (
openai_agents/) —@function_tooldecorators +Runner.run()LangGraph (
langgraph/) —@tool+create_react_agent()withChatAnthropicCrewAI (
crewai/) —Agent+Task+Crewwith@tooldecoratorStrands (
strands/) —Agentwith@tool, Anthropic modelGoogle ADK (
google_adk/) —Agent+FunctionTool, Gemini model, async runnerMAF (
maf/) — Modular tool registry with decorator pattern
NVL graph visualization — Replaced placeholder in
ContextGraphView.tsxwith real@neo4j-nvl/reactInteractiveNvlWrappercomponent: force-directed layout, domain-colored nodes viaNODE_COLORS/NODE_SIZES, node click handler, color legendMakefile improvements — Added
make testandmake linttargetsExpanded test suite (103 tests, all passing in 3.78s):
TestAllFrameworksRender— 8 parametric tests verifying each framework's agent.py compiles and contains framework-specific importsTestAllFrameworksRender— 8 parametric tests verifying each framework's pyproject.toml contains correct dependenciesTestMultipleDomainScaffolds— Expanded from 6 to 8 domain/framework combinations covering all frameworks
Verified
All 8 frameworks scaffold, render, and compile without errors
All 8 frameworks produce correct
pyproject.tomldependenciesEach framework's agent.py contains the expected framework marker (import/class name)
103/103 tests pass in 3.78 seconds
Phase 4: SaaS Import & Custom Domains — COMPLETE
Timeline: Weeks 9–10 Status: Done
Implemented SaaS data connectors for 7 services and LLM-powered custom domain generation.
What was built
SaaS data connectors
Connectors package (
connectors/) —BaseConnectorABC,NormalizedDataPydantic model matching fixture schema, connector registry with@register_connectordecorator7 service connectors, each with
authenticate(),fetch(), andget_credential_prompts():
| Service | Connector | Auth Method | Dependencies |
|---|---|---|---|
| GitHub | github_connector.py | Personal access token | PyGithub |
| Notion | notion_connector.py | Integration token | notion-client |
| Jira | jira_connector.py | API token | atlassian-python-api |
| Slack | slack_connector.py | Bot OAuth token | slack-sdk |
| Gmail | gmail_connector.py | gws CLI or OAuth2 | google-api-python-client, google-auth-oauthlib |
| Google Calendar | gcal_connector.py | gws CLI or OAuth2 | google-api-python-client, google-auth-oauthlib |
| Salesforce | salesforce_connector.py | Username/password + security token | simple-salesforce |
Google Workspace CLI (
gws) integration — Gmail and Google Calendar connectors detectgwson PATH, offer to install via npm if missing, fall back to Python OAuth2OAuth2 local redirect flow (
oauth.py) — Temporary HTTP server on random port, browser consent, auth code capture, token exchangeDual-purpose connectors — Run at scaffold time to populate initial data AND generated into the scaffolded project for ongoing
make import/make import-and-seedusageConnector templates — 7 standalone connector
.py.j2templates +import_data.py.j2generated into scaffolded projects (only for selected connectors)Makefile targets —
make importandmake import-and-seedadded to generated projects when SaaS connectors are selectedWizard integration — Checkbox selection of connectors, credential prompts, gws CLI detection and install prompt
CLI flags —
--connector(multiple) for non-interactive connector selectionOptional dependencies — New
[connectors]extra in pyproject.toml
Custom domain generation
custom_domain.py— LLM-powered domain YAML generation:Loads
_base.yaml+ 2 reference domain YAMLs (healthcare, wildlife-management) as few-shot examplesBuilds prompt with complete YAML schema specification
Calls LLM (Anthropic/OpenAI) via existing
generator.pyabstractionParses YAML, validates against
DomainOntologyPydantic modelOn validation failure, retries with error feedback (up to 3 attempts)
Returns
(DomainOntology, raw_yaml_string)
ontology.pyextensions —load_domain_from_yaml_string(),load_domain_from_path(),list_available_domains()now scans~/.create-context-graph/custom-domains/Wizard integration — Description prompt → LLM generation with spinner → Rich summary table → accept/regenerate/edit → optional save for reuse
CLI flag —
--custom-domain "description"for non-interactive custom domain generationRenderer support — Custom domain YAML written directly to
data/ontology.yamlPersistence — Custom domains saved to
~/.create-context-graph/custom-domains/and appear in future wizard runs
Bug fixes
Fixed
cli.py:73—data_sourcewas always"demo"regardless of flags
Tests added (40 new tests)
test_custom_domain.py— 17 tests: YAML string loading, base merge, validation errors, prompt construction, mocked LLM generation (success, retry, max retries), display, save, custom domain listingtest_connectors.py— 23 tests: NormalizedData model, merge, registry (7 connectors), credential prompts, mocked fetch for GitHub/Notion/Jira/Slack/Gmail/GCal/Salesforce, OAuth helpers
Verified
All 7 connectors register and expose credential prompts
Mocked connector fetches return valid NormalizedData
Custom domain generation succeeds with mocked LLM
Custom domain retry loop works on validation failure
182/182 tests pass in 5.2 seconds
Phase 5: Polish, Testing & Launch — COMPLETE
Timeline: Weeks 11–12 Status: Done
Prepared for public release with Docusaurus documentation, Neo4j Labs compliance, enhanced testing, and version 0.2.0.
What was built
Docusaurus documentation site
Docusaurus 3.x site in
docs/with TypeScript config, Diataxis-organized sidebar11 documentation pages following the Diataxis framework:
Tutorials: Your First Context Graph App, Customizing Your Domain Ontology
How-To Guides: Import Data from SaaS Services, Add a Custom Domain, Switch Agent Frameworks
Reference: CLI Options & Flags, Ontology YAML Schema, Generated Project Structure
Explanation: How Domain Ontologies Work, Why Context Graphs Need All Three Memory Types
GitHub Pages deployment via
.github/workflows/deploy-docs.yml(triggers ondocs/changes to main)Site URL:
https://create-context-graph.vercel.app/
Neo4j Labs compliance
Apache-2.0 license headers added to all 32 Python source and test files
Labs badge added to
README.mdand generated project README templateCommunity support disclaimer updated to standard Neo4j Labs language
CONTRIBUTING.md — Getting started, adding domains/frameworks/connectors, testing, PR process
Testing improvements
Cypher syntax validation in
test_generated_project.py— validates statement keywords and semicolonsFrontend syntax validation — TSX files checked for imports and exports,
config.tsvalidated for required exportsTimed performance test (
test_performance.py) — all 22 domains must scaffold in < 120 seconds each (slow marker)
Publishing
Version bumped to 0.2.0 across
pyproject.toml,npm-wrapper/package.json, and__init__.pyPublishing workflows already in place from prior phases (PyPI + npm on version tags)
Success metrics achieved
| Metric | Target | Actual |
|---|---|---|
| Time to running app | < 5 minutes | ~2 minutes (scaffold + install + start) |
| Domain coverage | 22 domains | 22 domains |
| Framework coverage | 8 agent frameworks | 8 agent frameworks |
| Generation success rate | >= 95% | 100% (176/176 matrix combos pass) |
| Test suite | 100+ tests | 262 tests (460 with slow matrix) |
Post-Launch: Data Quality & UI Enhancements — COMPLETE
Status: Done
Fixture data quality overhaul
name_pools.py— Realistic name pools (25 person names, 20 org names, etc.) and contextual value generators (emails from names, realistic IDs, domain-appropriate ranges)Improved static fallback in
generator.py— produces passable data without an LLM (realistic names, structured documents, interpolated trace outcomes)scripts/regenerate_fixtures.py— One-time script to regenerate all 22 fixtures using Claude API with coherent cross-entity prompts, validation, and retry logicAll 22 fixtures regenerated with LLM-quality data: 80-90 entities, 160-280 relationships, 25+ documents (200-1600 words each), 3-5 decision traces with specific observations and outcomes
Fixture quality tests — 66 parametrized tests across all 22 domains verify no placeholder names, documents >= 200 chars, no uninterpolated template variables
Full fixture data utilization in generated apps
generate_data.py.j2updated —make seednow loads all 4 data types: entities, relationships, documents (as:Documentnodes with:MENTIONSentity links), and decision traces (as:DecisionTrace→:HAS_STEP→:TraceStepchains)4 new API endpoints in
routes.py.j2:GET /documents— list with template filter, previews, mentioned entitiesGET /documents/{title}— full document contentGET /traces— traces with full reasoning stepsGET /entities/{name}— all properties, labels, and connections
Document browser (
DocumentBrowser.tsx.j2) — template type filter badges, scrollable list with previews, full document viewer with mentioned entity badgesEntity detail panel in
ContextGraphView.tsx.j2— click any graph node to see all properties, labels, and connections with relationship types/directionsFixed DecisionTracePanel — uses new
/tracesendpoint, loads steps with observations (was previously broken: wrong node label, empty steps array)Tabbed right panel in
page.tsx.j2— Traces and Documents tabs using Chakra UI v3 compound Tabs componentsSchema indexes for
DocumentandDecisionTracenodes added togenerate_cypher_schema()
Graph Visualization & Agent Fixes — COMPLETE
Status: Done
Interactive graph visualization
Schema view on load — Graph starts by calling
db.schema.visualization()(via newGET /schema/visualizationendpoint), showing entity type labels as nodes and relationship types as edges. No data query on initial load.Agent-driven graph updates —
CypherResultCollectorincontext_graph_client.pycaptures all Cypher results from agent tool calls. The/chatendpoint drains collected results and attaches them asgraph_datain the response.ChatInterfacepassesgraph_datatopage.tsxviaonGraphUpdatecallback, which flows toContextGraphViewasexternalGraphData. Works for all 8 agent frameworks without modifying any agent template.Double-click to expand — Schema nodes load instances of that label (
MATCH (n:\Label`)-[r]-(m) RETURN n,r,m LIMIT 50). Data nodes call newPOST /expand` endpoint to fetch neighbors. Expanded data is merged with deduplication.NVL d3Force layout — Replaced
InteractiveNvlWrapperconfiguration: d3Force layout, zoom 0.1–5x, relationship thickness 2, dynamic import for SSR avoidance. UsesmouseEventCallbacksfor node click, double-click, relationship click, canvas click.Property details panel — Click any node to see labels (color badges), all properties (key-value list), and metadata. Click relationships to see type and properties. Canvas click deselects.
UI overlays — Color legend (top 6 node types), instructions overlay, loading spinner during expansion, back-to-schema button, schema/data mode indicator.
State management —
page.tsxliftsgraphDatastate withuseState/useCallback. Props flow down, callbacks flow up. No external state library.
Neo4j driver serialization fix
_serialize()function incontext_graph_client.py.j2— Replacedresult.data()(which strips metadata) with per-record iteration and custom serialization preserving Node (elementId,labels), Relationship (elementId,type,startNodeElementId,endNodeElementId), and Path objects.
MAF agent template fix
Bug: MAF agent used keyword-based tool dispatch (lines 75-114) that never called an LLM. Fallback echoed system prompt:
"I'm your {SYSTEM_PROMPT}... Available tools: ...".Fix: Rewrote
handle_message()with Anthropic API tool-use loop (matchingclaude_agent_sdkpattern). KeptTOOL_REGISTRY+@register_tooldecorator. Added_build_tool_definitions()that introspects registry viainspect.signatureto generate Anthropic tool schemas. Addedanthropic>=0.30to MAF framework dependencies.
New backend endpoints
GET /schema/visualization— Returns schema graph viadb.schema.visualization()(with fallback to basic labels/types)POST /expand(body:{element_id}) — Returns immediate neighbors with nodes and relationships for graph expansion
Files modified
config.py— Addedanthropic>=0.30to MAF depstemplates/backend/agents/maf/agent.py.j2— Full rewritetemplates/backend/shared/context_graph_client.py.j2—_serialize(),CypherResultCollector,get_schema_visualization(),expand_node()templates/backend/shared/routes.py.j2— New endpoints, collector integration in/chattemplates/frontend/components/ContextGraphView.tsx.j2— Complete rewrite (~480 lines)templates/frontend/components/ChatInterface.tsx.j2—onGraphUpdateproptemplates/frontend/app/page.tsx.j2— State liftingtemplates/frontend/lib/config.ts.j2—GraphDatatype, schema constants
Phase 6: Memory Integration, Multi-Turn & DX — COMPLETE
Status: Done (v0.3.0)
Addressed all critical and high-priority feedback from the v0.2.0 product review. Core theme: make the generated apps actually use neo4j-agent-memory and deliver a compelling multi-turn conversation experience.
Critical fixes
neo4j-agent-memory integration — Generated
context_graph_client.pynow initializesMemoryClientalongside the Neo4j driver (with ImportError fallback). Exposesget_conversation_history()andstore_message()functions used by all 8 agent frameworks for multi-turn conversation persistence.Multi-turn conversations — All 8 agent templates retrieve conversation history before each LLM call and store messages after. Frontend
ChatInterfacecapturessession_idfrom the first response and sends it in all subsequent requests. "New Conversation" button resets session state.CrewAI/Strands/Google ADK async fix — Added
nest_asyncioto preventasyncio.run()deadlocks inside FastAPI's async event loop. Added toFRAMEWORK_DEPENDENCIESfor all three frameworks.MAF → Anthropic Tools rebrand — Renamed framework from
maftoanthropic-tools. Template directory moved toanthropic_tools/. Oldmafkey supported as deprecated alias viaFRAMEWORK_ALIASES. Updated all tests.
High-priority fixes
GDS client — Changed default label from hardcoded
"Entity"to"*"(wildcard). ExposedENTITY_LABELSlist generated from domain ontology.Markdown rendering — Added
react-markdown+remark-gfmto frontend. Assistant messages render through ReactMarkdown with CSS styles for headings, lists, code blocks, tables, blockquotes..env.example — Generated alongside
.envwith placeholder values (your-password-here). Added to renderer and gitignore correctly.
Neo4j setup options (new)
Neo4j Aura import — New wizard option "Neo4j Aura (cloud — free tier available)" with signup instructions panel and
.envfile parser. CLI flag:--neo4j-aura-env PATH.neo4j-local — New wizard option "Local Neo4j via neo4j-local (no Docker required)". Generates
make neo4j-start/stop/statustargets usingnpx @johnymontana/neo4j-local. CLI flag:--neo4j-local.neo4j_typeexpanded — Config Literal from"docker" | "existing"to"docker" | "existing" | "aura" | "local". Makefile, README, docker-compose all render conditionally based on type.
Medium-priority fixes
Port configurability — CORS reads from
settings.frontend_port. Makefile usesinclude .env/exportwith$${BACKEND_PORT:-8000}and$${FRONTEND_PORT:-3000}defaults.Process management —
make startusestrap 'kill 0' EXITto clean up child processes on Ctrl+C.Docker version pin —
neo4j:5→neo4j:5.26.0in docker-compose template.README entity types — Split into "Base POLE+O Entities" and "Domain-Specific Entities" subsections.
Vector index creation —
create_vector_index()called in app lifespan startup (try/except for Neo4j < 5.13).
Enhancements
Tool call visualization —
CypherResultCollectorextended withtool_callstracking.ChatResponseincludestool_callsfield. Frontend renders inline tool call cards (badge + abbreviated inputs) above assistant messages.Test scaffold — Generated projects include
backend/tests/test_routes.pywithtest_health()andtest_scenarios()tests using mocked Neo4j.
Tests added (52 new tests → 314 total)
test_renderer.py (+18): .env.example, session_id, ReactMarkdown, memory functions, GDS labels, tool calls, README sections, CORS, vector index, docker pin, trap cleanup, neo4j-local/aura Makefile targets, markdown CSS
test_generated_project.py (+22): .env.example, ChatInterface features, memory integration, docker pin, neo4j type variations, test scaffold
test_config.py (+9): aura/local neo4j types, framework alias resolution (maf→anthropic-tools)
test_cli.py (+3): --neo4j-aura-env, --neo4j-local, maf alias backward compatibility
Files modified
config.py— SUPPORTED_FRAMEWORKS, FRAMEWORK_ALIASES, FRAMEWORK_DEPENDENCIES, neo4j_type Literal, resolved_framework propertycli.py— --neo4j-aura-env, --neo4j-local flags, alias resolutionwizard.py— 4 Neo4j options (Aura, local, Docker, existing), _parse_aura_env helperrenderer.py— .env.example rendering, base/domain entity type partition, test scaffold rendering, resolved_framework in contexttemplates/backend/shared/context_graph_client.py.j2— MemoryClient init, get_conversation_history(), store_message(), tool call collectortemplates/backend/shared/routes.py.j2— tool_calls in ChatResponsetemplates/backend/shared/main.py.j2— CORS from settings, vector index startuptemplates/backend/shared/gds_client.py.j2— wildcard label, ENTITY_LABELStemplates/backend/agents/*/agent.py.j2— all 8 frameworks: multi-turn history, tool_name trackingtemplates/backend/agents/maf/→templates/backend/agents/anthropic_tools/— renamedtemplates/frontend/components/ChatInterface.tsx.j2— session_id, ReactMarkdown, tool call cards, new conversation buttontemplates/frontend/package.json.j2— react-markdown, remark-gfmtemplates/frontend/app/globals.css.j2— .markdown-content stylestemplates/base/Makefile.j2— env vars, trap cleanup, neo4j-local targetstemplates/base/docker-compose.yml.j2— neo4j:5.26.0templates/base/dot_env_example.j2— new filetemplates/base/README.md.j2— entity sections, neo4j-type-aware instructions, .env.example docstemplates/backend/tests/test_routes.py.j2— new test scaffold template
Phase 7 — Hardening, Security & DX (v0.4.0)
Based on comprehensive QA testing of all 176 domain-framework combinations.
Bug Fixes
B-01 (Critical): Enum identifier sanitization —
A+,A-,3d_modelnow generate valid Python identifiers (A_PLUS,A_MINUS,_3D_MODEL) with value aliasesB-02 (Critical): Graceful degradation when Neo4j is unavailable — backend starts in degraded mode with
/healthendpoint reporting statusB-03 (High): Cypher injection prevention in
gds_client.py— label parameters validated against generatedENTITY_LABELSwhitelistB-04 (High): CrewAI async/sync fix — replaced bare
asyncio.run()with_run_sync()helper usingnest_asyncio, crew runs in thread viaasyncio.to_thread()B-05 (High): Claude Agent SDK model now configurable via
ANTHROPIC_MODELenvironment variableB-06 (Medium): Silent exception swallowing replaced with structured warnings in
ingest.pyandvector_client.pyB-07 (Medium): JSON parsing error handling added to all 8 agent framework templates
B-08 (Medium): Input validation (
max_length) on chat and search request modelsB-09/B-10 (Low): CLI validates empty project names, adds
--dry-runand--verboseflags
Security
CORS origins configurable via
CORS_ORIGINSenvironment variableCredential warnings in
.env.exampleQuery timeouts (30s default) on all Neo4j operations
Code Quality
Magic strings extracted to
constants.pymodule (index names, graph projections, embedding dimensions)Frontend error messages: parse HTTP error responses, show actionable guidance
Document browser pagination (page size 20)
Semantic HTML landmarks (
<main>,<section>,<aside>) and ARIA labels365 passing tests (51 new)
Phase 8 — Streaming Chat & Real-Time Tool Visualization (v0.5.0)
Streaming Architecture (SSE)
Event-driven CypherResultCollector — added
asyncio.Queue-based event system to the global collector. When a streaming session is active,tool_start,tool_end,text_delta, anddoneevents are pushed to the queue automatically as tools execute and text streams inPOST /chat/streamendpoint — new SSE endpoint alongside existing/chat(backward compatible). UsesStreamingResponsewithtext/event-streamcontent type. Emitssession_idfirst, then tool and text events, terminated bydoneorerrorexecute_cypher()emitstool_startbefore query execution whentool_nameis set — all 8 frameworks get real-time tool events with zero agent template changes
Text Streaming (5 of 8 frameworks)
Full streaming (
handle_message_stream()added): PydanticAI (agent.run_stream()), Claude Agent SDK (client.messages.stream()), OpenAI Agents SDK (Runner.run_streamed()), LangGraph (graph.astream_events()), Anthropic Tools (client.messages.stream())Tool-only streaming (no agent changes): CrewAI, Strands, Google ADK — tool call events fire in real-time via the collector; text arrives at the end. The
/chat/streamroute auto-detects and falls back gracefully
Frontend Streaming UI
SSE client —
fetch+ReadableStream+TextDecoderfor POST-based SSE (notEventSourcewhich only supports GET)Chakra UI Timeline — tool calls displayed as a vertical timeline with
Spinnerfor running tools, checkmarkCheckicon for complete toolsCollapsible tool details — expandable view of tool inputs and output preview
Skeleton loading —
Skeletonplaceholders while waiting for first contentThrottled ReactMarkdown — text deltas batched at ~50ms to avoid excessive re-renders
Incremental graph updates —
onGraphUpdatecalled on eachtool_endevent, so the NVL visualization updates after each tool completes rather than all at once
Tests added (23 new → 388 total)
TestStreamingEndpoint—/chat/streamendpoint,StreamingResponse, backward compatTestCollectorEventQueue— event queue methods on CypherResultCollectorTestStreamingAgentTemplates—handle_message_streampresence in 5 frameworks, absence in 3TestStreamingFrontend— Timeline, Skeleton, Collapsible, SSE parsing in ChatInterfaceEnd-to-end validation: 8 frameworks × 3 domains + all 22 domains = 46 scaffold validations
Files modified
templates/backend/shared/context_graph_client.py.j2— event queue on CypherResultCollectortemplates/backend/shared/routes.py.j2—/chat/streamSSE endpointtemplates/frontend/components/ChatInterface.tsx.j2— SSE client + Timeline/Collapsible/Skeleton UItemplates/backend/agents/anthropic_tools/agent.py.j2—handle_message_stream()templates/backend/agents/claude_agent_sdk/agent.py.j2—handle_message_stream()templates/backend/agents/pydanticai/agent.py.j2—handle_message_stream()templates/backend/agents/openai_agents/agent.py.j2—handle_message_stream()templates/backend/agents/langgraph/agent.py.j2—handle_message_stream()tests/test_generated_project.py— 23 new streaming tests
Phase 9 — QA Hardening & DX Polish (v0.5.0)
Comprehensive QA pass across all 176 domain/framework combinations. 15 bugs fixed, 3 false alarms identified, 21 new tests added (409 total).
Critical Fixes
Settings
extra: "ignore"— Neo4j Aura.envfiles with extra variables (NEO4J_DATABASE, AURA_INSTANCEID) no longer cause ValidationErroris_connected()state flag — replaced broken syncverify_connectivity()on AsyncDriver with tracked_connectedflag set duringconnect_neo4j()/close_neo4j()503 guards on all endpoints — added
_require_neo4j()guard to all 15 Neo4j-dependent routes (was only on/chatand/chat/stream);/cyphernow returns 503 for connection errors, 400 for syntax errors
Async Safety
Removed
nest_asynciofrom Strands and CrewAI templates — replaced withasyncio.to_thread()+ cleanasyncio.run()in worker threads. Google ADK keepsnest_asyncio(needed for sync tools within asyncrun_async())
Conversation History
Structured format — replaced flat
"Previous conversation:\n"string concatenation with<conversation_history>[ROLE]\ncontent</conversation_history>format in OpenAI Agents, Strands, CrewAI, and Google ADKADK session leverage — Google ADK skips history injection for existing sessions (ADK manages multi-turn internally), only injects persisted history for new sessions after server restart
Streaming
Google ADK full streaming — added
handle_message_stream()that emitstext_deltaevents fromrunner.run_async()events. Google ADK promoted from "tools only" to "full streaming" (6 of 8 frameworks now stream)
Frontend Fixes
Unique message IDs —
crypto.randomUUID()for React keys instead of array indicesLoading fallback —
Spinnercomponent in dynamicContextGraphViewimportStorage warning —
console.warn()on sessionStorage failures
Domain & Build Fixes
Color collision resolution — fixed 12 entity color collisions across 7 domains (entities sharing hex colors with base POLE+O types)
LIMIT clause — added
LIMIT 100to software-engineering default Cypher queryESLint dependencies — added
eslintandeslint-config-nextto frontend devDependencies.dockerignore— new template excluding node_modules, .venv, .git, pycache from Docker buildsCrewAI Python 3.11+ — conditional
requires-python = ">=3.11"in generated pyproject.toml
Developer Experience
make test-connection— Makefile target to validate Neo4j credentialsREADME troubleshooting — common issues with Neo4j connection, port conflicts, API keys (conditional on neo4j_type)
Framework-specific README — each generated README documents the chosen framework's architecture, streaming support, and required API keys
Tests added (21 new → 409 total)
TestQABugFixes— config extra ignore, connected flag, endpoint guards, cypher 503, message IDs, storage warning, loading fallback, ESLint deps, dockerignoreTestDeferredBugFixes— structured history format, ADK session reuse, ADK streaming, CrewAI Python version, strands depstest_no_color_collisions_with_base— validates all 22 domains have unique entity colorstest_all_domains_default_cypher_has_limit— validates LIMIT clause in all domains
Files modified
templates/backend/shared/config.py.j2—extra: "ignore"templates/backend/shared/context_graph_client.py.j2—_connectedflagtemplates/backend/shared/routes.py.j2—_require_neo4j()guardtemplates/backend/shared/pyproject.toml.j2— conditional Python versiontemplates/backend/agents/{strands,crewai,google_adk,openai_agents}/agent.py.j2— async safety, history format, streamingtemplates/frontend/components/ChatInterface.tsx.j2— message IDs, storage warningtemplates/frontend/app/page.tsx.j2— loading fallbacktemplates/frontend/package.json.j2— ESLint depstemplates/base/Makefile.j2—test-connectiontargettemplates/base/README.md.j2— troubleshooting, framework sectionstemplates/base/dockerignore.j2— new filesrc/create_context_graph/config.py— remove nest-asyncio from depssrc/create_context_graph/renderer.py— register dockerignore templatesrc/create_context_graph/domains/*.yaml— color fixes (7 domains), LIMIT clause (1 domain)tests/test_generated_project.py— 19 new teststests/test_ontology.py— 2 new tests
Phase 10 — Framework Reliability, Data Quality & UX (v0.5.1)
Comprehensive testing of v0.4.6 revealed that 6 of 9 agent frameworks were non-functional (hanging or not executing tools), plus frontend UX bugs and static data quality issues. This phase addresses all feedback.
Critical: Fix Hanging Frameworks
Thread-safe CypherResultCollector:
_push_event()now detects worker threads and usesloop.call_soon_threadsafe()instead of directput_nowait()on the asyncio.Queue. Capturesself._loopinset_event_queue().CrewAI/Strands async bridging: Replaced
asyncio.run()in_run_sync()withasyncio.run_coroutine_threadsafe(coro, _main_loop). Added_capture_loop()called beforeasyncio.to_thread()to capture the main event loop. 30s timeout per tool call.Google ADK async bridging: Improved
_run_sync()with cross-threadrun_coroutine_threadsafefallback alongside existingnest_asynciofor same-thread reentrant calls.Bounded agentic loops: Anthropic Tools and Claude Agent SDK
while True:loops replaced withfor _iteration in range(15):. Addedtimeout=60.0to API calls. Fallback message when max iterations exceeded.
Critical: Fix Tool Execution
Tool-use emphasis: All 8 agent templates now append "IMPORTANT: You MUST use the available tools to query the knowledge graph..." to the domain system prompt.
PydanticAI: Added
retries=2to Agent constructor for transient failure recovery.OpenAI Agents JSON leak: Streaming now filters
response.output_text.deltaevents only, skippingresponse.function_call_arguments.deltathat leaked raw JSON into the text stream.
Frontend Fixes
Chat history scoping:
STORAGE_KEYandSESSION_KEYnow includeDOMAIN.idto prevent cross-app pollution when running multiple domain apps.SSR hydration fix: Deferred
sessionStoragereads touseEffectinstead ofuseStateinitializer. Addedhydratedstate.Send button: Increased from
size="sm"tosize="md"withcolorPalette="blue".Timeout feedback: Added elapsed time counter (shown after 3s), reduced visible timeout from 120s to 60s.
Retry button: Error messages now include a "Retry" button that resends the original message.
Dependencies & CLI
neo4j-agent-memory[openai]: Added
[openai]extra to fix "OpenAI package not installed" error onstore_message().--reset-databaseflag: New CLI flag that runsMATCH (n) DETACH DELETE nbefore ingestion. Addedreset_neo4j()toingest.py.
Static Demo Data Quality
Domain-specific name pools: Added 200+ names across 50+ entity labels (medical diagnoses, financial instruments, software repos, gaming items, etc.) in
LABEL_NAMESdict inname_pools.py.Label-aware ID prefixes:
LABEL_ID_PREFIXESmaps labels to domain-appropriate prefixes (PAT-, DX-, ACT-, REPO-, etc.).get_names_for_label(): New function that checksLABEL_NAMESfirst, falls back to POLE+O pools.Generator updated:
_generate_static_entities()now usesget_names_for_label()instead ofget_names_for_pole_type().
Decision Traces Expansion
All 22 domains: Expanded from 3-5 to 8-12 decision traces each. Added ~130 new traces total with domain-specific multi-step reasoning scenarios.
Streaming Endpoint
Overall timeout: SSE endpoint now has a 300s overall timeout alongside the 120s per-event idle timeout.
Tests added (26 new → 435 total)
TestAsyncBridgingFixes— CrewAI/Strands userun_coroutine_threadsafe, no bareasyncio.run()TestMaxIterationGuards— Anthropic Tools/Claude Agent SDK have bounded iterationsTestOpenAIStreamFiltering— OpenAI agents filter tool argument deltasTestCollectorThreadSafety— Collector usescall_soon_threadsafeandthreadingTestToolPromptSuffix— All 8 frameworks include tool-use emphasisTestChatHistoryScoping— Storage keys includeDOMAIN.idTestHydrationFix— No directsessionStorageinuseState, hashydratedstateTestNeo4jAgentMemoryDeps— pyproject includes[openai]extraTestStreamingEndpointTimeout— Routes haveoverall_timeoutTestDomainSpecificNamePools— Label names exist and are used correctly
Files modified
src/create_context_graph/templates/backend/shared/context_graph_client.py.j2— thread-safe collectorsrc/create_context_graph/templates/backend/agents/crewai/agent.py.j2— async bridging + tool promptsrc/create_context_graph/templates/backend/agents/strands/agent.py.j2— async bridging + tool promptsrc/create_context_graph/templates/backend/agents/google_adk/agent.py.j2— async bridging + tool promptsrc/create_context_graph/templates/backend/agents/anthropic_tools/agent.py.j2— max iterations + tool promptsrc/create_context_graph/templates/backend/agents/claude_agent_sdk/agent.py.j2— max iterations + tool promptsrc/create_context_graph/templates/backend/agents/pydanticai/agent.py.j2— tool prompt + retriessrc/create_context_graph/templates/backend/agents/openai_agents/agent.py.j2— JSON leak fix + tool promptsrc/create_context_graph/templates/backend/agents/langgraph/agent.py.j2— tool promptsrc/create_context_graph/templates/frontend/components/ChatInterface.tsx.j2— history scoping, hydration, retry, timeout, send buttonsrc/create_context_graph/templates/backend/shared/pyproject.toml.j2— openai extrasrc/create_context_graph/templates/backend/shared/routes.py.j2— overall timeoutsrc/create_context_graph/name_pools.py— domain-specific name poolssrc/create_context_graph/generator.py— label-aware namingsrc/create_context_graph/cli.py—--reset-databaseflagsrc/create_context_graph/ingest.py—reset_neo4j()functionsrc/create_context_graph/domains/*.yaml— ~130 new decision traces across all 22 domainstests/test_generated_project.py— 26 new tests
Phase 11 — v0.5.1 Testing Feedback Fixes
Comprehensive end-to-end testing of v0.5.0 across all 9 framework/domain combinations revealed 3 critical framework bugs, data quality issues, and UX improvements. This phase addresses all actionable findings from the testing feedback.
Critical: Framework Bug Fixes
PydanticAI tool serialization: Changed all
@agent.toolreturn types fromlist[dict]tostrwithjson.dumps(result, default=str). PydanticAI was the only framework returning raw Neo4j objects, causing silent serialization failures that prevented the LLM from seeing tool results.Google ADK agent name sanitization: Added
| replace('-', '_')to the agent name template. Hyphenated domain IDs (e.g.,real-estate,financial-services) produced invalid Python identifiers likereal-estate_agent, crashing ADK'sLlmAgentvalidator.Strands max_tokens configuration: Added
max_tokens=4096toAnthropicModel()initialization. The Anthropic API requires this parameter; without it, Strands returned a'max_tokens'KeyError.
Cross-Domain Data Isolation
Domain property on entities: Both ingestion paths (MemoryClient and direct driver) now add
domain=ontology.domain.idto all entity nodes. Enables future domain-scoped queries when sharing a Neo4j instance.CLI ingestion tip: After
--ingest, prints "Tip: Use --reset-database if you previously ingested a different domain into this Neo4j instance."Conditional make seed messaging: Post-scaffold instructions now distinguish between "Seed sample data" (no
--ingest) and "Re-seed sample data (already ingested)" (with--ingest).
Static Data Quality Improvements
12 new property-specific value pools in
name_pools.py:_CURRENCY_POOL(USD, EUR, GBP...),_TICKER_POOL(AAPL, MSFT...),_DRUG_CLASS_POOL(Biguanide, ACE Inhibitor...),_STATUS_POOL,_SEVERITY_POOL,_LANGUAGE_POOL,_COUNTRY_POOL,_COMPLAINT_POOL,_DISPOSITION_POOL,_SPECIALTY_POOL, plus blood_type and gender handling.Float value clamping:
confidence/score/ratingfields clamped to 0.0-1.0 range.efficiency/accuracy/utilizationclamped to 60-99%. Prevents absurd values like confidence=552.92.Improved description templates: Replaced generic "X record for Y. Created as part of the Z management workflow." with varied, natural-sounding descriptions.
Frontend UX
Agent thinking text filter: New
splitThinkingAndResponse()function inChatInterface.tsx.j2detects "thinking" patterns (lines starting with "Let me", "I'll", "First, I need to", etc.) and renders them in a collapsible "Show reasoning"<Collapsible>section, keeping responses focused.
Developer Experience
HuggingFace warning suppression: Added
HF_HUB_DISABLE_TELEMETRY=1to.envand.env.exampletemplates to suppress unauthenticated Hub warnings on backend startup.
Tests added (75 new → 510 total)
TestCypherQueryValidation— 66 tests: validates node labels, relationship types, and deprecated syntax across all 22 domain YAMLs' agent_tools Cypher queriesTestV051Regressions— 9 tests: PydanticAI returnsstrnotlist[dict], Google ADK agent names have no hyphens, Strands has max_tokens, .env has HF telemetry setting, confidence/currency/ticker values are realistic, descriptions have no boilerplate, ChatInterface has thinking filter
Files modified
src/create_context_graph/templates/backend/agents/pydanticai/agent.py.j2— tool return typestr+json.dumps()src/create_context_graph/templates/backend/agents/google_adk/agent.py.j2— agent name hyphen sanitizationsrc/create_context_graph/templates/backend/agents/strands/agent.py.j2—max_tokens=4096src/create_context_graph/name_pools.py— 12 new property pools, float clamping, description improvementssrc/create_context_graph/ingest.py—domainproperty on all entities (both ingestion paths)src/create_context_graph/cli.py— post-ingest tip, conditionalmake seedmessagingsrc/create_context_graph/templates/frontend/components/ChatInterface.tsx.j2— thinking text filter with collapsible reasoningsrc/create_context_graph/templates/base/dot_env.j2—HF_HUB_DISABLE_TELEMETRY=1src/create_context_graph/templates/base/dot_env_example.j2— HF telemetry + token guidancetests/test_ontology.py—TestCypherQueryValidationclass (66 tests)tests/test_generated_project.py—TestV051Regressionsclass (9 tests)
Phase 12 — v0.6.0 Comprehensive Testing Feedback Fixes
End-to-end testing of v0.5.3 across 9 framework/domain combinations (6 working, 3 broken) revealed framework bugs, data ingestion issues, data quality gaps, and UI/UX improvements. This phase addresses all P0-P2 findings.
Critical: Framework Fixes
CrewAI hanging fix: Added explicit
llm="anthropic/claude-sonnet-4-20250514"toAgent()constructor — CrewAI was defaulting to OpenAI and hanging when noOPENAI_API_KEYwas set. AddedANTHROPIC_API_KEYenvironment setup, request-level logging, and reduced timeout from 90s to 60s.Strands serialization fix: Added
_extract_text()helper that tries.text,.message.content, andstr()fallbacks — handlesParsedTextBlockserialization issues from newer Anthropic SDK versions.Google ADK API key support: Added
google_api_keyfield toProjectConfig,--google-api-keyCLI flag withGOOGLE_API_KEYenv, wizard prompt when google-adk is selected, and warning when google-adk used without key.
Critical: Document & Trace Ingestion Fix
The Documents panel and Decision Traces panel appeared empty when using --ingest because the two ingestion paths created incompatible node structures:
Root cause:
_ingest_with_memory_client()stored documents as conversation messages (short-term memory) and traces via the reasoning API, creating different node structures than the:Documentand:DecisionTrace/:TraceStepnodes the frontend queries for.Fix: Both ingestion paths (
_ingest_with_memory_clientand_ingest_with_driver) now create:Documentand:DecisionTrace/:TraceStepnodes using direct Cypher, matching thegenerate_data.py.j2pattern.Entity MERGE fix: Direct driver path changed from
MERGE (n:Label {all_props})toMERGE (n:Label {name: $name}) SET ...to prevent duplicate nodes from property mismatches.
Data Quality
Domain-aware base entity pools: Added
DOMAIN_PERSON_NAMES,DOMAIN_ORGANIZATION_NAMES,DOMAIN_LOCATION_NAMES,DOMAIN_EVENT_NAMES,DOMAIN_OBJECT_NAMES, andDOMAIN_ROLE_POOLfor 6 domains (healthcare, financial-services, gaming, software-engineering, conservation, data-journalism).Fixed templated property values: Added property pools for
contraindications,dosage_form,allergies,sector,lead_reporter,manufacturer,mechanism_of_action,population_trend,habitat— replacing"{entity_name} - {PropertyName}"template pattern.Domain-aware role generation:
generate_property_value()forrole/titlenow checksDOMAIN_ROLE_POOLbefore falling back to generic roles.
Frontend UI Improvements
Chat input redesign: Bordered container with focus highlight, keyboard shortcut hint ("Enter to send, Shift+Enter for new line"), compact send button (Chakra UI Pro AI template pattern).
Suggested questions: Flat wrapped HStack of pill-shaped buttons with full text (no 60-char truncation), "Try these" label with Sparkles icon.
Message avatars: User/assistant Circle avatars with User/Bot lucide-react icons.
Tool progress counter: Shows "Running tool N of M..." instead of generic "Generating response..."
CLI
--democonvenience flag: Shortcut for--reset-database --demo-data --ingest--google-api-keyflag: New CLI flag withGOOGLE_API_KEYenv variable support
Tests added (35 new → 545 total)
TestV060GoogleApiKey— 2 tests: .env and .env.example include GOOGLE_API_KEYTestV060CrewAIFix— 2 tests: explicit LLM config, loggingTestV060StrandsFix— 1 test: _extract_text helperTestV060DomainAwareNamePools— 8 tests: healthcare person names, contraindications, dosage_form, allergies, sector, domain roles, population_trendTestV060ChatInterfaceUI— 5 tests: avatars, keyboard hints, no truncation, sparkles icon, tool progressTestGoogleApiKeyin test_config.py — 2 tests
Files modified
src/create_context_graph/config.py—google_api_keyfieldsrc/create_context_graph/cli.py—--google-api-key,--demoflags, google-adk warningsrc/create_context_graph/wizard.py— Google API key prompt, summary displaysrc/create_context_graph/renderer.py— passgoogle_api_keyto template contextsrc/create_context_graph/ingest.py— direct Cypher for documents/traces in both paths, entity MERGE fixsrc/create_context_graph/name_pools.py— domain-aware base pools, 9 new property pools, domain-aware rolessrc/create_context_graph/generator.py— passdomain_idto name pool functionssrc/create_context_graph/templates/backend/agents/strands/agent.py.j2—_extract_text()helpersrc/create_context_graph/templates/backend/agents/crewai/agent.py.j2— explicit LLM, env setup, loggingsrc/create_context_graph/templates/base/dot_env.j2—GOOGLE_API_KEYsrc/create_context_graph/templates/base/dot_env_example.j2—GOOGLE_API_KEYwith commentsrc/create_context_graph/templates/frontend/components/ChatInterface.tsx.j2— avatars, input redesign, suggested questions, progress countertests/test_config.py—TestGoogleApiKeytests/test_generated_project.py— 5 new test classes
Phase 13 — v0.6.1 Stability, Data Quality & Tool Coverage
Comprehensive v0.6.0 testing revealed dependency issues, data quality gaps, missing tool archetypes, and frontend UX improvements. This phase addresses all findings across v0.6.1 (bug fixes), v0.6.2 (data quality), and v0.7.0 (features + docs) in a single release.
Critical Bug Fixes
CrewAI
[anthropic]dependency: Changedcrewai>=0.1tocrewai[anthropic]>=0.1inconfig.pyFRAMEWORK_DEPENDENCIES. The crewai agent template uses Anthropic's Claude model, which requires the extra.CLI auto-slug without PROJECT_NAME: When
--domainand--frameworkflags are provided without a positional project name, the CLI now auto-generates a slug (e.g.,healthcare-pydanticai-app). Added TTY detection with helpful error messages for CI/CD.
Data Quality
Document Markdown format: Static document content now uses
## Headinginstead of RST===/---. DocumentBrowser renders with ReactMarkdown.Entity-derived document titles: Titles reference primary entities ("Discharge Summary: Maria Elena Gonzalez") instead of sequential numbers.
POLE-type-aware entity descriptions: Replaced "Comprehensive patient profile for..." with role/industry-specific descriptions using domain pools.
Domain-aware Organization.industry: Added
DOMAIN_INDUSTRY_POOLfor all 22 domains (healthcare → "Hospital Systems", not "Technology").Realistic decision trace observations: Now reference actual entity names and vary by action type.
Improved thinking text filter: Added
CONTINUATION_PATTERNSto catch multi-sentence thinking blocks.
Agent Tool Coverage
list_*andget_*_by_idtools for all 22 domains: Every domain now has aggregate listing and direct ID lookup tools alongside existing search/analysis tools. Each domain has 7-8+ tools (up from 5-6).Gaming
get_top_players: Domain-specific aggregate tool sorting by level.
Frontend Features
"Ask about this" button: Clicking a graph node shows a button that sends "Tell me about {entity}" to the chat. Wired via
externalInputprop from ContextGraphView → page.tsx → ChatInterface.Node hover tooltips: Full name, labels, and top 5 properties shown on hover.
Health polling 30s → 60s: Reduced unnecessary traffic.
Mobile-responsive hint text: Keyboard shortcut hint hidden on small screens.
Suggested question maxW: Pill buttons capped at 320px.
Scrollable label badges: Label filter badges scroll when they overflow (maxH 180px).
Seed constraint fix:
generate_data.py.j2usesON CREATE SET / ON MATCH SETto avoid constraint violations.
Documentation
4 new docs pages:
use-neo4j-aura.md,use-docker.md,why-context-graphs.md,framework-comparison.mdUpdated sidebars.ts: All new pages added to Docusaurus navigation.
Tests added (57 new → 602 total)
test_crewai_includes_anthropic_extra— verifies crewai dependency has anthropic extratest_no_project_name_auto_generates_slug— verifies CLI auto-slug generation
Files modified
src/create_context_graph/config.py— crewai[anthropic] dependencysrc/create_context_graph/cli.py— auto-slug generation, TTY detectionsrc/create_context_graph/generator.py— Markdown documents, entity-derived titles, realistic observationssrc/create_context_graph/name_pools.py— DOMAIN_INDUSTRY_POOL, _generate_description, _PERSON_LABELS, _ORGANIZATION_LABELSsrc/create_context_graph/templates/backend/shared/generate_data.py.j2— ON CREATE/MATCH SETsrc/create_context_graph/templates/frontend/components/ChatInterface.tsx.j2— thinking filter, externalInput, responsive hintsrc/create_context_graph/templates/frontend/components/ContextGraphView.tsx.j2— tooltips, ask-about button, scrollable badgessrc/create_context_graph/templates/frontend/components/DocumentBrowser.tsx.j2— ReactMarkdown renderingsrc/create_context_graph/templates/frontend/app/page.tsx.j2— askAbout wiring, 60s health pollingAll 22 domain YAML files — list_* and get_*_by_id tools added
docs/sidebars.ts— 4 new pagesdocs/docs/how-to/use-neo4j-aura.md— newdocs/docs/how-to/use-docker.md— newdocs/docs/explanation/why-context-graphs.md— newdocs/docs/reference/framework-comparison.md— new
Phase 14 — v0.7.1 Testing Feedback: Embedding Regression, Data Quality & Docs
Comprehensive v0.7.0 testing revealed 2 critical regressions, data quality gaps, missing documentation, and UX improvements. This phase addresses all findings.
Critical Fixes (P0)
neo4j-agent-memory embedding regression: Removed
[openai]extra from generatedpyproject.toml, addedsentence-transformers>=2.0dependency.MemorySettingsnow auto-detects: uses localsentence_transformers/all-MiniLM-L6-v2(384 dims) by default, upgrades to OpenAItext-embedding-3-small(1536 dims) ifOPENAI_API_KEYis set. Conversation memory works out of the box with no API key.openai-agents API key warning: CLI now warns when
--framework openai-agentsis used without--openai-api-key. Wizard prompt text updated to indicate "required" for this framework.
Data Quality (P1)
67 missing LABEL_NAMES: Added name pools for all 67 entity labels that were falling back to generic "Label 1" names.
LABEL_NAMESnow has 118 entries (up from 51) covering every entity type across all 22 domain YAMLs.Post-generation value clamping: Added
_validate_and_clamp()ingenerator.pywith 28 property range rules (price_per_night: $30-$2000, duration_hours: 0.25-24, etc.) and taxonomy class correction (species → correct class mapping).POLE-type entity descriptions: Added
_LOCATION_LABELS,_EVENT_LABELS,_OBJECT_LABELSsets (parallel to existing Person/Organization) plus 7 label-specific description overrides (Medication, Permit, Sensor, Equipment, Paper, Model, Species).digital-twin fixture fix: Fixed label casing (UPPERCASE → PascalCase) to match YAML schema.
Domain-scoped MERGE keys: Changed entity MERGE from
{name: $name}to{name: $name, domain: $domain}in bothgenerate_data.py.j2andingest.pyto prevent constraint violations when sharing a Neo4j instance across domains.
google-adk Error Guard (P2)
Added
try/except AttributeErroraroundrunner.run_async()in bothhandle_messageandhandle_message_streamto handle SDK cleanup errors when_async_httpx_clientwas never initialized.
Documentation
Quick-Start page (
docs/docs/quick-start.md): 5-step guide with sidebar link.use-neo4j-local guide (
docs/docs/how-to/use-neo4j-local.md): 3 setup options (npx, Desktop, Docker).switch-frameworks slug fix: Added
slug: switch-frameworksto fix 404.Domain catalog (
docs/docs/reference/domain-catalog.md): Auto-generated table of all 22 domains with entity types, tool counts, sample questions.Architecture diagram: Mermaid flowchart added to
docs/docs/intro.md.Updated sidebars.ts: Added quick-start, use-neo4j-local, domain-catalog to navigation.
Frontend UX
Status indicator: Enlarged from 8px to 12px, added text label ("Connected"/"Degraded"/"Offline").
Health check retry: Initial load retries 3 times with exponential backoff (1s/2s/4s) to prevent "Internal Server Error" on first page load.
Empty graph state: Larger icon, descriptive heading ("Your knowledge graph will appear here"), actionable guidance text.
Tests added (89 new → 691 total)
tests/test_fixtures.py(88 tests): Fixture schema alignment (required properties, agent tool property references, label coverage), data quality validation (numeric ranges)test_pyproject_has_sentence_transformers— verifies no[openai]extratest_context_graph_client_has_embedding_config— verifies embedding provider selection logic
Files modified
src/create_context_graph/templates/backend/shared/pyproject.toml.j2— removed[openai]extra, added sentence-transformerssrc/create_context_graph/templates/backend/shared/context_graph_client.py.j2— embedding provider auto-detectionsrc/create_context_graph/templates/base/dot_env_example.j2— clarified OPENAI_API_KEY is optionalsrc/create_context_graph/cli.py— openai-agents warningsrc/create_context_graph/wizard.py— framework-specific OpenAI key promptsrc/create_context_graph/name_pools.py— 67 new LABEL_NAMES, 3 new label sets, 7 description overridessrc/create_context_graph/generator.py—_validate_and_clamp(),_PROPERTY_CLAMP_RANGES,_TAXONOMY_CLASS_MAPsrc/create_context_graph/ingest.py— domain-scoped MERGE keyssrc/create_context_graph/templates/backend/shared/generate_data.py.j2— domain-scoped MERGE keyssrc/create_context_graph/templates/backend/agents/google_adk/agent.py.j2— AttributeError guardsrc/create_context_graph/templates/frontend/app/page.tsx.j2— health retry, larger status dotsrc/create_context_graph/templates/frontend/components/ContextGraphView.tsx.j2— improved empty statesrc/create_context_graph/fixtures/digital-twin.json— fixed label casingtests/test_generated_project.py— updated embedding teststests/test_fixtures.py— new cross-validation test suitedocs/docs/quick-start.md— newdocs/docs/how-to/use-neo4j-local.md— newdocs/docs/reference/domain-catalog.md— newdocs/docs/how-to/switch-agent-frameworks.md— slug fixdocs/docs/intro.md— architecture diagram, updated linksdocs/sidebars.ts— 3 new pages
Phase 15 — Linear Data Import Connector (v0.8.2)
Real-world project data import from Linear. First connector to import graph-native project management data (issues, projects, cycles, teams, users, labels, workflow states) with full relationship fidelity.
What was built
Linear connector
linear_connector.pyimplementingBaseConnectorABC with GraphQL clientCursor-based pagination against Linear's GraphQL API (
https://api.linear.app/graphql)Rate limiting via
X-RateLimit-Requests-Remainingheader with adaptive sleep8 entity types mapped to POLE+O model (Issue, Project, Cycle, Team, Person, Label, WorkflowState, Comment)
16 relationship types (ASSIGNED_TO, CREATED_BY, BELONGS_TO_PROJECT, BELONGS_TO_TEAM, IN_CYCLE, HAS_STATE, HAS_LABEL, CHILD_OF, HAS_COMMENT, AUTHORED_BY, MEMBER_OF, LEADS, CONTRIBUTED_BY, CYCLE_FOR, STATE_OF)
Issue descriptions exported as documents for RAG/vector search
Deduplication of users, labels, and workflow states across paginated issue responses
Optional comment import (gated behind
include_commentskwarg)Team key filtering (
--linear-team ENGimports only that team's data)No external dependency — uses
urllib.requestfrom stdlib
CLI integration
--connector linearflag (works with existing--connectormultiple=True pattern)--linear-api-keyflag (envvarLINEAR_API_KEY)--linear-teamflag (envvarLINEAR_TEAM) for team filteringWarning when
--connector linearis used without an API key
Generated project integration
linear_connector.py.j2Jinja2 template for standalone connector in generated projectsimport_data.py.j2updated with Linear credential wiring.envand.env.exampletemplates includeLINEAR_API_KEYandLINEAR_TEAM(conditional)config.py.j2includeslinear_api_keyandlinear_teamsettings fields (conditional)
Tests added (14 new → 705 total)
test_credential_prompts— verify api_key and team_key promptstest_authenticate_success/missing_key/invalid_key— auth validationtest_fetch_entity_mapping— verify all 7 entity labels presenttest_fetch_entity_counts— correct counts for mocked workspacetest_fetch_relationships— verify all relationship typestest_fetch_child_of_relationship— sub-issue hierarchytest_fetch_documents— issue descriptions as documentstest_fetch_deduplication— users/labels not duplicatedtest_fetch_team_filter/team_filter_not_found— team key filteringtest_issue_name_format—"ENG-101 Fix login bug"formattest_priority_labels— priority mapping (0-4 → human-readable)
Files created
src/create_context_graph/connectors/linear_connector.pysrc/create_context_graph/templates/backend/connectors/linear_connector.py.j2
Files modified
src/create_context_graph/connectors/__init__.py— register LinearConnectorsrc/create_context_graph/cli.py—--linear-api-key,--linear-teamflags + credential wiringsrc/create_context_graph/renderer.py— add linear to connector_templatessrc/create_context_graph/templates/backend/connectors/import_data.py.j2— Linear blocksrc/create_context_graph/templates/base/dot_env.j2— conditional Linear env varssrc/create_context_graph/templates/base/dot_env_example.j2— Linear env vars with docssrc/create_context_graph/templates/backend/shared/config.py.j2— Linear settings fieldstests/test_connectors.py— 14 new tests, registry counts 7→8
Phase 15b — Linear Deep Graph: Relations, History, Decisions & Full Schema (v0.8.3)
Schema introspection of Linear's GraphQL API (494 types) revealed significant additional data available beyond the initial v1 import. This phase adds issue relations (blocking/dependency graph), issue history transformed into decision traces, threaded comments with resolution tracking, project updates with health, milestones, initiatives, attachments, and Linear Docs.
Issue Relations — blocking/dependency graph (P0)
Import
issue.relationsconnection withtypefield (blocks, is-blocked-by, related, duplicate)New relationship types:
:BLOCKS,:BLOCKED_BY,:RELATED_TO,:DUPLICATE_OFbetween Issue nodesAlso import
inverseRelationsfor bidirectional coverageEnables "what's blocking X?" and dependency chain queries
Issue History → Decision Traces (P0)
Import
issue.historyconnection: state transitions, assignee changes, priority changes, label changes, cycle/project movesTransform history entries into
:DecisionTrace→:HAS_STEP→:TraceStepchainsEach issue with 2+ history entries generates a decision trace with:
task: "Lifecycle of {identifier} {title}"outcome: derived from final state (completed/canceled/current state)Steps: each history entry becomes a TraceStep with thought/action/observation derived from the transition fields
:TraceStepnodes linked to:Personvia:PERFORMED_BYfor actor attribution
Comment Threading & Resolution (P1)
Import comment
parentfield for thread hierarchy:(:Comment)-[:REPLY_TO]->(:Comment)Import
resolvedAtandresolvingUser:(:Comment)-[:RESOLVED_BY]->(:Person)Import comments on ProjectUpdates, not just Issues:
(:ProjectUpdate)-[:HAS_COMMENT]->(:Comment)Import
quotedTextfor context on repliesComments always imported (remove
include_commentsgate — comments are core to decision traces)
Project Updates & Health (P1)
New entity:
ProjectUpdatewithbody,health(onTrack/atRisk/offTrack),createdAtRelationships:
(:Project)-[:HAS_UPDATE]->(:ProjectUpdate),(:ProjectUpdate)-[:POSTED_BY]->(:Person)Project updates with health changes generate decision trace steps
Update bodies imported as documents for RAG
Project Milestones (P1)
New entity:
ProjectMilestonewithname,description,targetDate,status,progressRelationships:
(:Project)-[:HAS_MILESTONE]->(:ProjectMilestone),(:Issue)-[:IN_MILESTONE]->(:ProjectMilestone)Query
issue.projectMilestonefield for issue→milestone linking
Initiative Hierarchy (P2)
New entity:
Initiativewithname,description,status(Planned/Active/Completed),health,targetDate,ownerRelationships:
(:Initiative)-[:CONTAINS_PROJECT]->(:Project),(:Initiative)-[:OWNED_BY]->(:Person)Query
projects.initiativesconnection for initiative→project linking
Attachments — External Links (P2)
New entity:
Attachmentwithtitle,url,sourceType,metadataRelationship:
(:Issue)-[:HAS_ATTACHMENT]->(:Attachment)Enables cross-tool graph (GitHub PRs, Figma files, Slack messages linked to issues)
Linear Docs (P2)
Query
documentsconnection on Issue, Project, CycleImport as
:Documentnodes (same as our existing document model)Links:
(:Issue)-[:HAS_DOCUMENT]->(:Document),(:Project)-[:HAS_DOCUMENT]->(:Document)
Additional Issue Fields
Add
completedAt,canceledAt,startedAttimestamps for lifecycle trackingAdd
branchNamefor Git branch linkingAdd
number(team-scoped numeric ID)Add
trashedboolean for soft-delete awareness
Tests added (36 new → 741 total)
Unit tests in test_connectors.py (+22 Linear tests, 59 total)
History transform edge cases: priority changes, label changes, reassignment, system actor, combined changes
Pagination: multi-page cursor-based pagination verification
Error handling: HTTP 401 → ValueError, HTTP 500 → RuntimeError, empty workspace
Data integrity: all relationships have required keys, entity labels match relationship labels
Constants: RELATION_TYPE_MAP completeness, PRIORITY_LABELS completeness
Entity/relationship tests for all new types: relations, comments, threading, resolution, milestones, updates, initiatives, attachments, Linear Docs
CLI integration tests in test_cli.py (+12 tests, TestLinearConnectorCLI)
Dry-run, warning without key, file generation, .env vars, .env.example, config settings
import_data.py script content, API key flag, team flag, template compilation
Multi-connector combination (linear + github)
Files modified
src/create_context_graph/connectors/linear_connector.py— all new entities, relations, history→trace transformsrc/create_context_graph/templates/backend/connectors/linear_connector.py.j2— matching templatetests/test_connectors.py— 22 new Linear tests (59 total)tests/test_cli.py— 12 new Linear CLI integration tests
Phase 16 — Linear Connector Hardening & Test Suite Expansion (v0.8.3)
Linear connector improvements (10 improvements)
Named constants: 18 constants replacing hardcoded page sizes, rate limits, retry counts (
ISSUES_PAGE_SIZE,MAX_PAGES,RATE_LIMIT_THRESHOLD,MAX_RETRIES, etc.)Structured logging:
logging.getLogger(__name__)with info/debug/warning/error throughout (auth, fetch summary, rate limits, pagination, truncation)Error handling:
URLError(network),JSONDecodeError(malformed response), GraphQL-levelerrorsfield (logged as warning, data still returned)Pagination safety:
max_pagesparameter prevents infinite loops; null-safe data traversal with(x or {})patternRate limit 429:
_retry_on_rate_limit()method with exponential backoff up toMAX_RETRIESattemptsNull safety:
_safe_nodes()helper extracts connection nodes from fields that might beNone; applied throughout fetch()History/comment limits: Comments increased from 20 → 100, history from 15 → 50;
pageInfo { hasNextPage }with truncation warningsTeam key validation:
authenticate()validates team_key against available teams, lists available keys on mismatchIncremental sync:
fetch(updated_after="ISO8601")addsupdatedAt: { gt: ... }filter to issue queriesTemplate parity:
_describe_history_step()and decision trace generation ported tolinear_connector.py.j2
CLI fix
Optional credential prompts no longer abort the wizard when left blank (Linear team key)
Test suite expansion (5 new test files, 133 new tests → 874 passing, 1,084 collected)
tests/test_security.py (84 tests) — Cypher injection prevention
Agent tool Cypher parameterization across all 22 domains (
$paramplaceholders, no string literals in WHERE)Domain scoping verification (
$domainreference in queries)Generated code static analysis:
execute_cypheruses driver parameterization, no f-string user input, max_length on request models, GDS label validationrun_cyphertool safety across 4 frameworks: JSON parameter parsing, param passthrough, domain default
tests/test_doc_snippets.py (8 tests) — Documentation validation
YAML ontology examples from docs parse correctly (bookstore example, customizing tutorial)
CLI flags documented in
cli-options.mdexist in Click commandCypher snippets from Linear tutorial have valid structure (MATCH/RETURN)
Make targets referenced in docs exist in Makefile template
Environment variable names in docs match
.env.exampletemplate
tests/test_frontend_logic.py (23 tests) — SSE parsing & contract
Python SSE event parser: all 6 event types, multi-event streams, malformed JSON
Thinking/response splitting: THINKING_PATTERNS, CONTINUATION_PATTERNS, markdown breaks, error bypass
Backend/frontend event type contract: routes.py.j2 emits same events ChatInterface.tsx.j2 handles
Generated frontend structure: all event handlers, schema view mode, AbortController
tests/test_integration.py (7 tests, @pytest.mark.integration) — Neo4j database
Schema DDL execution: constraints and indexes apply without error
Fixture ingestion: entity counts, document nodes, relationships created
Agent tool queries execute against seeded data without errors
Domain scoping: two domains in same database, filter isolates correctly
tests/test_generated_tests.py (5 tests, @pytest.mark.slow) — Generated project tests
Scaffolded project test discovery:
pytest --collect-onlyfinds test_health and test_scenariosGenerated tests pass with mocked Neo4j for 4 frameworks (pydanticai, claude-agent-sdk, langgraph, anthropic-tools)
Linear connector tests (test_connectors.py +18, test_cli.py +1)
Error handling: URLError, JSONDecodeError, GraphQL errors logged
Team validation: valid key succeeds, invalid key lists available keys
Pagination safety: max_pages limit stops infinite loops
Null safety: all sub-objects
Nonedoesn't crashTruncation warnings: comments/history hasNextPage logged
Logging: auth success, fetch summary
Rate limit: 429 retry succeeds, 429 exhausts retries
Incremental sync: updated_after filter in query, absent when not provided
_safe_nodeshelperTemplate has decision traces
CI changes
Integration tests (
--integration) run in smoke-test job before E2E tests, using same Neo4j credentialspyproject.toml: addedintegrationmarkerconftest.py: added--integrationflag with auto-skip
Files created
tests/test_security.pytests/test_doc_snippets.pytests/test_frontend_logic.pytests/test_integration.pytests/test_generated_tests.py
Files modified
src/create_context_graph/connectors/linear_connector.py— all 10 improvementssrc/create_context_graph/templates/backend/connectors/linear_connector.py.j2— template paritysrc/create_context_graph/wizard.py— optional credential prompt fixtests/test_connectors.py— 18 new Linear tests (79 total)tests/test_cli.py— 1 new template test (34 total)tests/conftest.py— integration marker supportpyproject.toml— integration marker registration.github/workflows/ci.yml— integration tests in smoke-test job
Phase 16b — Google Workspace Connector: Decision Trace Extraction (v0.8.4)
What was built
Google Workspace connector (google-workspace)
New connector importing from 6 Google APIs: Drive Files, Drive Comments, Drive Revisions, Drive Activity, Calendar (optional), Gmail (optional)
Decision trace extraction: Resolved comment threads in Google Docs become
DecisionThreadgraph nodes with content, quotedContent, resolution, resolved status, and participant count — the core innovationEach resolved thread generates a decision trace (thought/action/observation steps) in the same format used by neo4j-agent-memory
Unresolved threads become queryable
DecisionThreadnodes withresolved: falsefor theopen_questionstoolReplyentities for each response in a thread, linked viaHAS_REPLYwithAUTHORED_BYRevisionentities tracking document evolution viaHAS_REVISIONandREVISED_BYActivityentities from Drive Activity API v2 with action type mapping (create, edit, move, rename, delete, etc.)Meetingentities from Calendar API (when--gws-include-calendar) withATTENDEE_OF,ORGANIZED_BY, andDISCUSSED_IN(document-meeting linking via Drive URL detection)EmailThreadentities from Gmail API (when--gws-include-gmail) with metadata only (no body text for privacy) andTHREAD_ABOUTlinkingCross-connector linking: Scans comment bodies, doc names, email subjects, meeting descriptions for Linear issue references (ENG-123 pattern) creating
RELATES_TO_ISSUErelationshipsOAuth2 authentication with dynamic scope building based on enabled features, gws CLI preferred with Python OAuth2 fallback
Rate limiting: 950 queries/100s sliding window with exponential backoff (5 retries, max 60s)
Person deduplication by email across all sub-fetchers
CLI integration
9 new
--gws-*CLI flags:--gws-folder-id,--gws-include-comments/--gws-no-comments,--gws-include-revisions/--gws-no-revisions,--gws-include-activity/--gws-no-activity,--gws-include-calendar,--gws-include-gmail,--gws-since,--gws-mime-types,--gws-max-filesCredential passing via
config.saas_credentials["google-workspace"]dictUpdated
--connectorhelp text to includegoogle-workspace
Agent tools
10 decision-focused tools injected via renderer when connector is active:
find_decisions,decision_context,who_decided,document_timeline,open_questions,meeting_decisions,knowledge_contributors,trace_decision_to_source,stale_documents,cross_referenceSystem prompt augmented with Google Workspace decision context description
Tools use Cypher queries traversing DecisionThread, Reply, Revision, Activity, Meeting, EmailThread nodes
Generated project integration
Scaffold template:
google_workspace_connector.py.j2with full parity — all 7 stages (Files, Comments/Decision Traces, Revisions, Activity, Calendar, Gmail, Cross-references) using OAuth2 only (no gws CLI fallback)import_data.py.j2updated with google-workspace dispatch case.envand.env.exampletemplates addGOOGLE_CLIENT_ID,GOOGLE_CLIENT_SECRET,GWS_FOLDER_IDRenderer
connector_templatesmapping updated
Documentation (3 new pages, 3 updated)
Tutorial: "Decision Traces from Google Workspace" — step-by-step OAuth setup, scaffold, seed, explore, 10 example agent questions, 7 Cypher queries, combining with Linear
Explanation: "How Decision Traces Are Extracted" — conceptual guide to comment thread classification, resolution detection, cross-connector linking, graph vs RAG comparison
Reference: "Google Workspace Graph Schema" — complete node labels, relationships, properties, agent tools, cross-connector patterns
Updated:
import-saas-data.md(how-to),cli-options.md(reference),sidebars.ts(navigation)
Tests added (36 new)
Unit tests in test_connectors.py (+28 Google Workspace tests)
Registration & metadata (3): connector registered, credential prompts with/without gws CLI
Authentication (3): missing creds, gws path, flag parsing
File fetching (3): basic files, relationships, documents
Comment threads (4): decision threads, replies, resolved→trace, unresolved→no trace
Comment relationships (1): HAS_COMMENT_THREAD, HAS_REPLY, AUTHORED_BY, RESOLVED_BY
Revisions (1): entities and relationships
Activity (1): entities, action types, relationships
Calendar (2): disabled by default, enabled with attendees/document linking
Gmail (2): disabled by default, enabled with participants/document linking
Cross-connector (2): Linear refs detected, no false positives
Integrity (2): person deduplication, relationship required keys
Integration (1): full pipeline with all features
Edge cases (2): empty workspace, comments disabled
CLI integration tests in test_cli.py (+8 tests, TestGoogleWorkspaceConnectorCLI)
Dry run output, generated files, .env vars, .env.example, import script, template compilation, all flags accepted, combined with Linear
Files created
src/create_context_graph/connectors/google_workspace_connector.py— core connector (~1,400 lines)src/create_context_graph/templates/backend/connectors/google_workspace_connector.py.j2— scaffold templatedocs/docs/tutorials/google-workspace-decisions.md— tutorialdocs/docs/explanation/how-decision-traces-work.md— conceptual explainerdocs/docs/reference/google-workspace-schema.md— schema reference
Files modified
src/create_context_graph/connectors/__init__.py— register GoogleWorkspaceConnectorsrc/create_context_graph/cli.py— 9 new--gws-*flags, credential passing blocksrc/create_context_graph/renderer.py— connector template mapping, 10 GWS agent tools, system prompt augmentationsrc/create_context_graph/templates/backend/connectors/import_data.py.j2— google-workspace dispatchsrc/create_context_graph/templates/base/dot_env.j2— GWS env varssrc/create_context_graph/templates/base/dot_env_example.j2— GWS env var docstests/test_connectors.py— 28 new tests, registry count updated to 9tests/test_cli.py— 8 new GWS CLI testsdocs/sidebars.ts— 3 new pages in navigationdocs/docs/how-to/import-saas-data.md— Google Workspace sectiondocs/docs/reference/cli-options.md— 9 new--gws-*flags
Phase 17 — Claude Code Session History Connector (v0.9.0)
What was built
Claude Code connector (claude-code)
New connector importing local Claude Code session JSONL files from
~/.claude/projects/— no authentication or API keys requiredParses user/assistant messages,
tool_use/tool_resultblocks, andprogressentries from session JSONL filesExtracts 7 entity types: Project, Session, Message, ToolCall, File, GitBranch, Error
10 relationship types: HAS_SESSION, HAS_MESSAGE, NEXT, USED_TOOL, MODIFIED_FILE, READ_FILE, PRECEDED_BY, ON_BRANCH, ENCOUNTERED_ERROR, RESOLVED_BY
Heuristic decision extraction (4 signal types):
User corrections ("no, instead use X") → Decision with rejected/chosen alternatives
Deliberation markers ("should we", "alternatively", "trade-off") → Decision with discussion context
Error-resolution cycles (tool error → corrective tool calls) → Decision with error context
Dependency changes (
pip install,npm install, etc.) → Dependency decisions
Preference extraction from explicit statements ("always use X", "prefer Y over Z") and package install frequency across sessions
Secret redaction by default: API keys (
sk-ant-*,ghp_*,xoxb-*,AKIA*), tokens, passwords, connection strings replaced with[REDACTED]Content truncation modes:
truncated(2000 chars, default),full,none(metadata only)Token usage tracking from assistant message
usagefieldsFile deduplication across sessions with modification/read counts
Implementation split into main connector +
_claude_code/subpackage (parser.py, redactor.py, decision_extractor.py, preference_extractor.py)
CLI integration
5 new
--claude-code-*CLI flags:--claude-code-scope(current/all),--claude-code-project,--claude-code-since,--claude-code-max-sessions,--claude-code-contentCredential passing via
config.saas_credentials["claude-code"]dictUpdated
--connectorhelp text to includeclaude-code
Agent tools
8 session intelligence tools injected via renderer when connector is active:
search_sessions,decision_history,file_timeline,error_patterns,tool_usage_stats,my_preferences,project_overview,reasoning_traceSystem prompt augmented with Claude Code session context description
Tools use Cypher queries traversing Session, Message, ToolCall, Decision, Preference, File, Error nodes
Generated project integration
Scaffold template:
claude_code_connector.py.j2— simplified standalone parser for re-importing sessions from generated projectsimport_data.py.j2updated with claude-code dispatch caseRenderer
connector_templatesmapping updated
Documentation (2 new pages, 4 updated)
Tutorial: "Build a Developer Knowledge Graph from Claude Code Sessions" — step-by-step guide: prerequisites, scaffold, seed, explore, decision extraction, preferences, Cypher queries, combining with other connectors, privacy/security
Reference: "Claude Code Session Schema" — complete entity types, relationships, decision categories, preference categories, agent tools, redaction patterns, example Cypher
Updated:
import-saas-data.md(how-to),cli-options.md(reference),intro.md,sidebars.ts(navigation)
Tests added (45 new → 955 passing, 1,165 collected)
Unit tests in test_connectors.py (+38 Claude Code tests)
Registration & metadata (4): connector registered, get_connector, empty credential prompts, listed in connectors
Parser / discovery (8): discover projects, empty projects, discover sessions, max sessions, parse basic, parse tool calls, files tracked, skips meta, progress counted, malformed lines
Connector fetch (8): returns NormalizedData, entity types, relationships, file relationships, file deduplication, git branch, documents, token usage
Content modes (3): truncation, mode none, mode full
Scope/filtering (3): scope all, project filter, empty directory
Secret redaction (6): redact API keys, GitHub tokens, passwords, connection strings, empty strings, fetch redacts content
Error extraction (1): errors from is_error tool_results
Decision extraction (2): user correction detected, error-resolution cycle detected
Preference extraction (1): explicit statement detected
CLI integration tests in test_cli.py (+7 tests, TestClaudeCodeConnectorCLI)
Dry run output, generated files, import data includes connector, scope flag, all flags accepted, combined with other connector, agent tools injected
Files created
src/create_context_graph/connectors/_claude_code/__init__.py— package initsrc/create_context_graph/connectors/_claude_code/parser.py— JSONL parsing, project/session discovery (~350 lines)src/create_context_graph/connectors/_claude_code/redactor.py— secret detection and redaction (~70 lines)src/create_context_graph/connectors/_claude_code/decision_extractor.py— heuristic decision extraction (~350 lines)src/create_context_graph/connectors/_claude_code/preference_extractor.py— preference pattern detection (~170 lines)src/create_context_graph/connectors/claude_code_connector.py— main connector (~380 lines)src/create_context_graph/templates/backend/connectors/claude_code_connector.py.j2— scaffold templatedocs/docs/tutorials/claude-code-sessions.md— tutorialdocs/docs/reference/claude-code-schema.md— schema reference
Files modified
src/create_context_graph/connectors/__init__.py— register ClaudeCodeConnector (10th connector)src/create_context_graph/cli.py— 5 new--claude-code-*flags, credential passing blocksrc/create_context_graph/renderer.py— connector template mapping, 8 Claude Code agent tools (_CLAUDE_CODE_AGENT_TOOLS), system prompt augmentationsrc/create_context_graph/templates/backend/connectors/import_data.py.j2— claude-code dispatchtests/test_connectors.py— 38 new tests, registry count updated to 10tests/test_cli.py— 7 new Claude Code CLI testsdocs/sidebars.ts— 2 new pages in navigationdocs/docs/intro.md— updated connector listdocs/docs/how-to/import-saas-data.md— Claude Code connector sectiondocs/docs/reference/cli-options.md— 5 new--claude-code-*flagsREADME.md— connector table, CLI reference, Claude Code descriptionCLAUDE.md— connector count, test counts, connector table, description
Phase 18 — Chat History Import: Claude AI & ChatGPT (v0.10.0)
What was built
Claude AI connector (claude-ai)
New connector importing conversations from Claude AI data exports (Settings > Account > Export Data)
Parses
conversations.jsonlfrom.zipor raw.jsonlfile — streaming line-by-line for memory efficiency on large exports (1GB+)Extracts content from structured content blocks:
text,tool_use,tool_result,thinkingNormalizes sender values (
human→user,assistant→assistant)Creates Conversation entities with title, UUID, timestamps, message count
Creates Message entities with role, content (truncated to 2000 chars), timestamps, tool call metadata
Generates Document per conversation with full concatenated text for search/RAG
Deep mode extracts DecisionTrace nodes from tool call sequences
All processing is local — no API keys required, no data sent externally
ChatGPT connector (chatgpt)
New connector importing conversations from ChatGPT data exports (Settings > Data Controls > Export Data)
Parses
conversations.jsonfrom.zipor raw.jsonfile — handles the tree-structuredmappingfieldTree walking algorithm: finds root nodes, traverses depth-first following last child at branch points to reconstruct linear conversation path
Filters out
systemrole messages and messages withis_visually_hidden_from_conversation: trueConverts Unix float timestamps to ISO 8601
Handles
content_typevariants:text,code,execution_output,multimodal_textTool-role messages (
author.role = "tool") captured withexecution_outputcontent as tool resultsSame entity schema as Claude AI: Conversation, Message, Document, DecisionTrace (deep mode)
Shared infrastructure (_chat_import/)
models.py—ParsedConversationandParsedMessagedataclasses shared by both parserszip_reader.py— Zip extraction, format auto-detection (looks forconversations.jsonlvsconversations.json), streaming JSONL reader, JSON array reader, malformed line handlingAll stdlib — no new dependencies (
json,zipfile,io,re)
CLI integration
7 new
--import-*CLI flags:--import-type(claude-ai/chatgpt),--import-file,--import-depth(fast/deep),--import-filter-after,--import-filter-before,--import-filter-title,--import-max-conversationsValidation:
--import-typeand--import-filemust be provided togetherAuto-adds import type to
config.saas_connectors— flows through existing connector pipelineCredential wiring: file path + filter options passed via
config.saas_credentials[import_type]
Documentation (2 new pages, 4 updated)
Tutorial: "Import Your AI Chat History into a Context Graph" — step-by-step: how to export from Claude AI and ChatGPT, scaffold with import flags, customize with filters, explore in frontend and Neo4j Browser, example Cypher queries, privacy notes, combining with other connectors
Reference: "Chat Import Schema" — complete entity types, relationships, platform differences, example Cypher queries
Updated:
import-saas-data.md(how-to),cli-options.md(reference),sidebars.ts(navigation)
Tests added (78 new → 1033 passing, 1243 collected)
tests/test_chat_import.py (78 tests)
Zip reader (13): format auto-detection for zip/jsonl/json, unknown extensions, missing known files, JSONL streaming from zip and raw files, malformed line skipping, empty line handling, JSON reading from zip and raw files, non-array JSON rejection
Claude AI parser (15): single/multi conversation, zip support, message parsing, sender normalization, content block extraction (text/tool_use/tool_result/thinking), timestamp parsing, date filtering (after/before), title filtering (regex), max conversations limit, malformed conversation skip, empty conversations, text fallback, metadata
ChatGPT parser (14): single conversation, zip support, system message filtering, message content, Unix timestamp conversion, branching (follows last child), hidden message filtering, tool-role messages, date filtering, title filtering, max conversations, null message nodes, empty mapping, model slug metadata, malformed skip
Claude AI connector (15): registration, service name, credential prompts, authenticate with file path, file not found, wrong extension, fetch returns NormalizedData, entity properties, relationships (HAS_MESSAGE/NEXT), documents, empty file, multiple conversations, filters, deep mode traces, fast mode no traces
ChatGPT connector (15): registration, service name, credential prompts, authenticate with file path, file not found, wrong extension, fetch returns NormalizedData, entity properties, relationships, documents, empty file, branching conversation, hidden messages excluded, tool messages, filters, deep mode traces, fast mode no traces
CLI (3): import-type without file fails, import-file without type fails, dry-run with import flags
Files created
src/create_context_graph/connectors/_chat_import/__init__.py— shared package initsrc/create_context_graph/connectors/_chat_import/models.py— ParsedConversation, ParsedMessage dataclassessrc/create_context_graph/connectors/_chat_import/zip_reader.py— zip extraction, format detection, streaming JSONL (~130 lines)src/create_context_graph/connectors/_claude_ai/__init__.py— parser package initsrc/create_context_graph/connectors/_claude_ai/parser.py— JSONL streaming parser with content block extraction (~180 lines)src/create_context_graph/connectors/_chatgpt/__init__.py— parser package initsrc/create_context_graph/connectors/_chatgpt/parser.py— JSON tree-walker parser (~200 lines)src/create_context_graph/connectors/claude_ai_connector.py— Claude AI connector (~220 lines)src/create_context_graph/connectors/chatgpt_connector.py— ChatGPT connector (~220 lines)tests/test_chat_import.py— 78 tests (~650 lines)docs/docs/tutorials/import-chat-history.md— tutorialdocs/docs/reference/chat-import-schema.md— schema reference
Files modified
src/create_context_graph/connectors/__init__.py— register ClaudeAIConnector, ChatGPTConnector (12 connectors total)src/create_context_graph/cli.py— 7 new--import-*flags, validation, credential wiringtests/test_connectors.py— registry count updated to 12, expected connectors set expandeddocs/sidebars.ts— 2 new pages in navigationdocs/docs/how-to/import-saas-data.md— Claude AI and ChatGPT connector sections, credential setupdocs/docs/reference/cli-options.md— 8 new--import-*flags documented, chat import example
Suggested improvements (future phases)
Phase 18b — Standard-depth entity extraction
LLM-powered entity extraction from conversation text (people, organizations, technologies, topics)
Batched extraction with configurable concurrency and rate limiting
Cross-conversation entity resolution (same entity mentioned in multiple conversations merged)
--import-depth standardlevel betweenfastanddeepImportBatch provenance nodes tracking import source, timestamp, conversation count
Progress bar with Rich showing conversations parsed, entities extracted, ETA
Phase 18c — Standalone import subcommand
Convert CLI from
@click.command()to@click.group()with backward-compatible defaultcreate-context-graph import claude-ai ~/Downloads/export.zip --neo4j-uri bolt://localhost:7687— import directly into existing Neo4j without scaffolding a project--dry-runon the import subcommand to preview what would be importedIncremental re-import: skip unchanged conversations, update modified, add new (via
originalPlatformIdmatching)
Phase 18d — Generated project templates & agent tools
claude_ai_connector.py.j2andchatgpt_connector.py.j2scaffold templatesimport_data.py.j2updated with claude-ai and chatgpt dispatch cases6-8 agent tools for querying imported chat history:
search_conversations,conversation_timeline,entity_mentions,topic_trends,tool_usage_history,conversation_summarySystem prompt augmented with chat history context
Phase 18e — Cross-platform entity resolution
When importing from both Claude AI and ChatGPT, entities mentioned across platforms are merged
Fuzzy name matching with configurable threshold (default 0.85 similarity)
Property overlap detection (same email, URL, employer → merge)
MERGED_FROMrelationship tracking provenance
Additional future improvements
Conversation branch import (ChatGPT): option to import all branches as separate conversation variants instead of just the main path
Thinking block storage: Claude AI thinking blocks stored as reasoning memory nodes (configurable: raw vs. summarized)
Privacy-preserving import: local entity extraction via spaCy/GLiNER instead of LLM, matching existing
neo4j-agent-memory[spacy,gliner]extrasMCP server surface: expose import capability through neo4j-agent-memory MCP server as an import tool
Additional platforms: Google Gemini, Perplexity AI, GitHub Copilot Chat export import
Import visualization: real-time graph building during import, before/after comparison, entity timeline view
Phase 19 — neo4j-agent-memory v0.1.0 Alignment: MemoryIntegration, MCP Server & Entity Extraction (v0.9.0)
MemoryIntegration migration
Replaced
MemoryClientwithMemoryIntegrationfrom neo4j-agent-memory v0.1.0New shared
memory.py.j2template generatesbackend/app/memory.pywithconnect_memory(),close_memory(),store_message(),get_context(),resolve_session_id()context_graph_client.py.j2stripped of inline MemoryClient init (~60 lines removed), delegates toapp.memoryAll 8 agent templates migrated from
get_conversation_history()/store_message()toget_context()/store_message()/resolve_session_id()fromapp.memoryget_context()returns rich context: messages + entities + preferences + traces (vs old simple message list)store_message()returns extraction results (entities, preferences) used for SSE eventsGraceful degradation preserved:
ImportErrorcatch if neo4j-agent-memory not installedpyproject.toml.j2bumped toneo4j-agent-memory[spacy,gliner]>=0.1.0
MCP server generation
New
--with-mcpCLI flag and wizard step generates MCP server configuration for Claude Desktopmcp/claude_desktop_config.json.j2— pre-configured with project Neo4j credentials and slugmcp/README.md.j2— setup instructions with tool lists for core (6) and extended (16) profilesmake mcp-serverMakefile target (conditional on--with-mcp)--mcp-profile core|extendedselects tool surface (default: extended with 16 tools)README.md.j2 conditionally includes MCP section
Entity extraction & preference detection
store_message()triggers automatic entity extraction and preference detection via MemoryIntegrationTwo new SSE event types:
entities_extracted,preferences_detectedCypherResultCollectorgainsemit_entities_extracted()andemit_preferences_detected()methodsFrontend
ChatInterface.tsx.j2handles new events with teal entity badges and orange preference badgesroutes.py.j2emits extraction events in non-streaming fallback path
Session strategies
--session-strategy per_conversation|per_day|persistentCLI flagSESSION_STRATEGYenv var in generated.env.exampleandconfig.pyresolve_session_id()delegates to MemoryIntegration's strategy-based resolution
CLI & wizard updates
5 new CLI flags:
--with-mcp,--mcp-profile,--session-strategy,--auto-extract/--no-auto-extract,--auto-preferences/--no-auto-preferencesNew wizard step 5b between Neo4j connection and API Keys: memory enhancement options (extraction, preferences, session strategy, MCP)
Dry-run output shows memory configuration and MCP profile
Success message shows
make mcp-serverwhen MCP enabled
Tests added (20 new → 1,053 passing, 1,259 collected)
tests/test_config.py (+4 tests)
test_memory_defaults— default values for all 5 new fieldstest_mcp_config— MCP fields set correctlytest_session_strategy_values— all 3 strategy values acceptedtest_auto_extract_disabled— extraction/preferences can be disabled
tests/test_renderer.py (+8 tests)
test_memory_py_generated— memory.py exists with MemoryIntegrationtest_mcp_files_generated_when_enabled— MCP files generated when with_mcp=Truetest_mcp_files_not_generated_by_default— no MCP files by defaulttest_pyproject_bumps_memory_version— >=0.1.0 in pyproject.tomltest_makefile_has_mcp_target_when_enabled— mcp-server target presenttest_makefile_no_mcp_target_by_default— no mcp-server by defaulttest_env_example_has_session_strategy— SESSION_STRATEGY in .env.exampletest_config_py_has_session_strategy— session_strategy in generated config.py
tests/test_cli.py (+6 tests)
test_with_mcp_flag— MCP files generated via CLI flagtest_session_strategy_flag— strategy flows to generated configtest_no_auto_extract_flag— extraction disabled in memory.pytest_mcp_profile_core_flag— core profile in MCP configtest_dry_run_shows_memory_config— memory info in dry-run output
tests/test_frontend_logic.py (+2 tests via updated assertions)
Updated SSE contract validation to include entities_extracted and preferences_detected
Updated event handler check to verify all 8 event types
tests/test_generated_project.py (+3 tests updated)
test_context_graph_client_delegates_to_memory— verifies app.memory importtest_memory_module_exists— verifies MemoryIntegration in memory.pytest_agent_uses_memory_module— verifies agent imports from app.memory
Files created
src/create_context_graph/templates/backend/shared/memory.py.j2src/create_context_graph/templates/base/mcp/claude_desktop_config.json.j2src/create_context_graph/templates/base/mcp/README.md.j2
Files modified
src/create_context_graph/config.py— 5 new ProjectConfig fields + constantssrc/create_context_graph/cli.py— 5 new Click options, dry-run output, success messagesrc/create_context_graph/wizard.py— new step 5b, summary table additionssrc/create_context_graph/renderer.py— context vars, conditional MCP, memory.py in sharedsrc/create_context_graph/templates/backend/shared/context_graph_client.py.j2— stripped MemoryClient, added emitterssrc/create_context_graph/templates/backend/shared/config.py.j2— session_strategy settingsrc/create_context_graph/templates/backend/shared/pyproject.toml.j2— bumped >=0.1.0src/create_context_graph/templates/backend/shared/routes.py.j2— extraction eventssrc/create_context_graph/templates/backend/agents/pydanticai/agent.py.j2src/create_context_graph/templates/backend/agents/claude_agent_sdk/agent.py.j2src/create_context_graph/templates/backend/agents/openai_agents/agent.py.j2src/create_context_graph/templates/backend/agents/langgraph/agent.py.j2src/create_context_graph/templates/backend/agents/crewai/agent.py.j2src/create_context_graph/templates/backend/agents/strands/agent.py.j2src/create_context_graph/templates/backend/agents/google_adk/agent.py.j2src/create_context_graph/templates/backend/agents/anthropic_tools/agent.py.j2src/create_context_graph/templates/base/Makefile.j2— mcp-server targetsrc/create_context_graph/templates/base/README.md.j2— MCP section, SESSION_STRATEGYsrc/create_context_graph/templates/base/dot_env_example.j2— SESSION_STRATEGYsrc/create_context_graph/templates/frontend/components/ChatInterface.tsx.j2— new SSE events, badgestests/conftest.py— mcp_config fixturetests/test_config.py,tests/test_renderer.py,tests/test_cli.pytests/test_frontend_logic.py,tests/test_generated_project.py
Summary
| Phase | Description | Status | Tests |
|---|---|---|---|
| 1 | Core CLI & Template Engine | Complete | 691 passing |
| 2 | Domain Expansion & Data Generation | Complete | (included above) |
| 3 | Framework Templates & Frontend | Complete | (included above) |
| 4 | SaaS Import & Custom Domains | Complete | (included above) |
| 5 | Polish, Testing & Launch | Complete | (included above) |
| — | Data Quality & UI Enhancements | Complete | (included above) |
| — | Graph Visualization & Agent Fixes | Complete | (included above) |
| 6 | Memory Integration, Multi-Turn & DX | Complete | (included above) |
| 7 | Hardening, Security & DX | Complete | (included above) |
| 8 | Streaming Chat & Real-Time Tool Viz | Complete | (included above) |
| 9 | QA Hardening & DX Polish | Complete | (included above) |
| 10 | Framework Reliability, Data Quality & UX | Complete | (included above) |
| 11 | v0.5.1 Testing Feedback Fixes | Complete | (included above) |
| 12 | v0.6.0 Comprehensive Testing Feedback | Complete | (included above) |
| 13 | v0.6.1 Stability, Data Quality & Tools | Complete | (included above) |
| 14 | v0.7.1 Embedding Regression, Data Quality & Docs | Complete | (included above) |
| 15 | Linear Data Import Connector | Complete | 705 passing |
| 15b | Linear Deep Graph: Relations, History, Decisions | Complete | 741 passing |
| 16 | Linear Connector Hardening & Test Suite Expansion | Complete | 874 passing (1,084 collected) |
| 16b | Google Workspace Connector: Decision Trace Extraction | Complete | 874+ passing |
| 17 | Claude Code Session History Connector | Complete | 955 passing (1,165 collected) |
| 18 | Chat History Import: Claude AI & ChatGPT | Complete | 1,033 passing (1,243 collected) |
| 19 | neo4j-agent-memory v0.1.0: MemoryIntegration, MCP, Entity Extraction | Complete | 1,053 passing (1,259 collected) |
344 files · 334 not served here
- .github/workflows/ci.yml (not served here)
- .github/workflows/release.yml (not served here)
- .gitignore (not served here)
- .serena/.gitignore (not served here)
- ATTRIBUTION.md
- AUTOGINEER-RUNS.md
- CHANGELOG.md
- CLAUDE.md
- CONTRIBUTING.md
- LABS_DISCLAIMER.txt (not served here)
- LICENSE
- Makefile (not served here)
- README.md
- ROADMAP.md
- docs/.gitignore (not served here)
- docs/README.md
- docs/docs/explanation/ccg-edges.md (not served here)
- docs/docs/explanation/how-decision-traces-work.md (not served here)
- docs/docs/explanation/how-domain-ontologies-work.md (not served here)
- docs/docs/explanation/memory-backends.md (not served here)
- docs/docs/explanation/three-memory-types.md (not served here)
- docs/docs/explanation/why-context-graphs.md (not served here)
- docs/docs/how-to/add-custom-domain.md (not served here)
- docs/docs/how-to/configure-memory-providers.md (not served here)
- docs/docs/how-to/connect-claude-desktop.md (not served here)
- docs/docs/how-to/import-local-files.md (not served here)
- docs/docs/how-to/import-saas-data.md (not served here)
- docs/docs/how-to/switch-agent-frameworks.md (not served here)
- docs/docs/how-to/use-docker.md (not served here)
- docs/docs/how-to/use-nams.md (not served here)
- docs/docs/how-to/use-neo4j-aura.md (not served here)
- docs/docs/how-to/use-neo4j-local.md (not served here)
- docs/docs/intro.md (not served here)
- docs/docs/quick-start.md (not served here)
- docs/docs/reference/chat-import-schema.md (not served here)
- docs/docs/reference/claude-code-schema.md (not served here)
- docs/docs/reference/cli-options.md (not served here)
- docs/docs/reference/domain-catalog.md (not served here)
- docs/docs/reference/framework-comparison.md (not served here)
- docs/docs/reference/generated-project-structure.md (not served here)
- docs/docs/reference/google-workspace-schema.md (not served here)
- docs/docs/reference/ontology-yaml-schema.md (not served here)
- docs/docs/tutorials/claude-code-sessions.md (not served here)
- docs/docs/tutorials/customizing-domain-ontology.md (not served here)
- docs/docs/tutorials/first-context-graph-app.md (not served here)
- docs/docs/tutorials/google-workspace-decisions.md (not served here)
- docs/docs/tutorials/import-chat-history.md (not served here)
- docs/docs/tutorials/linear-context-graph.md (not served here)
- docs/docs/whats-new.md (not served here)
- docs/docusaurus.config.ts (not served here)
- docs/package-lock.json (not served here)
- docs/package.json (not served here)
- docs/sidebars.ts (not served here)
- docs/src/components/animations/AppPreview.module.css (not served here)
- docs/src/components/animations/AppPreview.tsx (not served here)
- docs/src/components/animations/ContextGraphExplainer.module.css (not served here)
- docs/src/components/animations/ContextGraphExplainer.tsx (not served here)
- docs/src/components/animations/DomainCarousel.module.css (not served here)
- docs/src/components/animations/DomainCarousel.tsx (not served here)
- docs/src/components/animations/FrameworkGrid.module.css (not served here)
- docs/src/components/animations/FrameworkGrid.tsx (not served here)
- docs/src/components/animations/HowItWorks.module.css (not served here)
- docs/src/components/animations/HowItWorks.tsx (not served here)
- docs/src/components/animations/TerminalAnimation.module.css (not served here)
- docs/src/components/animations/TerminalAnimation.tsx (not served here)
- docs/src/components/animations/TrustBar.module.css (not served here)
- docs/src/components/animations/TrustBar.tsx (not served here)
- docs/src/components/ui/BrowserFrame.module.css (not served here)
- docs/src/components/ui/BrowserFrame.tsx (not served here)
- docs/src/components/ui/Terminal.module.css (not served here)
- docs/src/components/ui/Terminal.tsx (not served here)
- docs/src/css/custom.css (not served here)
- docs/src/data/animation-config.ts (not served here)
- docs/src/pages/404.tsx (not served here)
- docs/src/pages/index.module.css (not served here)
- docs/src/pages/index.tsx (not served here)
- docs/src/theme/Root.tsx (not served here)
- docs/static/.nojekyll (not served here)
- docs/static/img/app-three-panel.excalidraw (not served here)
- docs/static/img/app-three-panel.png (not served here)
- docs/static/img/architecture-overview.excalidraw (not served here)
- docs/static/img/architecture-overview.png (not served here)
- docs/static/img/claude-code-data-flow.excalidraw (not served here)
- docs/static/img/claude-code-data-flow.png (not served here)
- docs/static/img/claude-code-data-pipeline.excalidraw (not served here)
- docs/static/img/claude-code-data-pipeline.png (not served here)
- docs/static/img/claude-code-decision-extraction.excalidraw (not served here)
- docs/static/img/claude-code-decision-extraction.png (not served here)
- docs/static/img/claude-code-graph-schema.excalidraw (not served here)
- docs/static/img/claude-code-graph-schema.png (not served here)
- docs/static/img/connector-data-flow.excalidraw (not served here)
- docs/static/img/connector-data-flow.png (not served here)
- docs/static/img/decision-trace-structure.excalidraw (not served here)
- docs/static/img/decision-trace-structure.png (not served here)
- docs/static/img/docusaurus-social-card.jpg (not served here)
- docs/static/img/docusaurus.png (not served here)
- docs/static/img/favicon.ico (not served here)
- docs/static/img/graph-vs-flat.excalidraw (not served here)
- docs/static/img/graph-vs-flat.png (not served here)
- docs/static/img/gws-decision-flow.excalidraw (not served here)
- docs/static/img/gws-decision-flow.png (not served here)
- docs/static/img/gws-graph-schema.excalidraw (not served here)
- docs/static/img/gws-graph-schema.png (not served here)
- docs/static/img/gws-linear-combined.excalidraw (not served here)
- docs/static/img/gws-linear-combined.png (not served here)
- docs/static/img/linear-data-flow.excalidraw (not served here)
- docs/static/img/linear-data-flow.png (not served here)
- docs/static/img/linear-graph-schema.excalidraw (not served here)
- docs/static/img/linear-graph-schema.png (not served here)
- docs/static/img/logo.svg (not served here)
- docs/static/img/memory-architecture.excalidraw (not served here)
- docs/static/img/memory-architecture.png (not served here)
- docs/static/img/ontology-pipeline.excalidraw (not served here)
- docs/static/img/ontology-pipeline.png (not served here)
- docs/static/img/screenshot-frontend.png (not served here)
- docs/static/img/undraw_docusaurus_mountain.svg (not served here)
- docs/static/img/undraw_docusaurus_react.svg (not served here)
- docs/static/img/undraw_docusaurus_tree.svg (not served here)
- docs/tsconfig.json (not served here)
- document-parsing-libraries.md
- npm-wrapper/README.md (not served here)
- npm-wrapper/bin/create-context-graph (not served here)
- npm-wrapper/package.json (not served here)
- pyproject.toml (not served here)
- scripts/e2e_smoke_test.py (not served here)
- scripts/regenerate_fixtures.py (not served here)
- src/create_context_graph/__init__.py (not served here)
- src/create_context_graph/__main__.py (not served here)
- src/create_context_graph/cli.py (not served here)
- src/create_context_graph/config.py (not served here)
- src/create_context_graph/connectors/__init__.py (not served here)
- src/create_context_graph/connectors/_chat_import/__init__.py (not served here)
- src/create_context_graph/connectors/_chat_import/models.py (not served here)
- src/create_context_graph/connectors/_chat_import/zip_reader.py (not served here)
- src/create_context_graph/connectors/_chatgpt/__init__.py (not served here)
- src/create_context_graph/connectors/_chatgpt/parser.py (not served here)
- src/create_context_graph/connectors/_claude_ai/__init__.py (not served here)
- src/create_context_graph/connectors/_claude_ai/parser.py (not served here)
- src/create_context_graph/connectors/_claude_code/__init__.py (not served here)
- src/create_context_graph/connectors/_claude_code/decision_extractor.py (not served here)
- src/create_context_graph/connectors/_claude_code/parser.py (not served here)
- src/create_context_graph/connectors/_claude_code/preference_extractor.py (not served here)
- src/create_context_graph/connectors/_claude_code/redactor.py (not served here)
- src/create_context_graph/connectors/_local_file/__init__.py (not served here)
- src/create_context_graph/connectors/_local_file/mapper.py (not served here)
- src/create_context_graph/connectors/_local_file/parser.py (not served here)
- src/create_context_graph/connectors/_local_file/parsers/__init__.py (not served here)
- src/create_context_graph/connectors/_local_file/parsers/asciidoc.py (not served here)
- src/create_context_graph/connectors/_local_file/parsers/docx.py (not served here)
- src/create_context_graph/connectors/_local_file/parsers/html.py (not served here)
- src/create_context_graph/connectors/_local_file/parsers/markdown.py (not served here)
- src/create_context_graph/connectors/_local_file/parsers/pdf.py (not served here)
- src/create_context_graph/connectors/chatgpt_connector.py (not served here)
- src/create_context_graph/connectors/claude_ai_connector.py (not served here)
- src/create_context_graph/connectors/claude_code_connector.py (not served here)
- src/create_context_graph/connectors/gcal_connector.py (not served here)
- src/create_context_graph/connectors/github_connector.py (not served here)
- src/create_context_graph/connectors/gmail_connector.py (not served here)
- src/create_context_graph/connectors/google_workspace_connector.py (not served here)
- src/create_context_graph/connectors/jira_connector.py (not served here)
- src/create_context_graph/connectors/linear_connector.py (not served here)
- src/create_context_graph/connectors/local_file_connector.py (not served here)
- src/create_context_graph/connectors/notion_connector.py (not served here)
- src/create_context_graph/connectors/oauth.py (not served here)
- src/create_context_graph/connectors/salesforce_connector.py (not served here)
- src/create_context_graph/connectors/slack_connector.py (not served here)
- src/create_context_graph/custom_domain.py (not served here)
- src/create_context_graph/domains/_base.yaml (not served here)
- src/create_context_graph/domains/agent-memory.yaml (not served here)
- src/create_context_graph/domains/conservation.yaml (not served here)
- src/create_context_graph/domains/cybersecurity.yaml (not served here)
- src/create_context_graph/domains/data-journalism.yaml (not served here)
- src/create_context_graph/domains/digital-twin.yaml (not served here)
- src/create_context_graph/domains/education.yaml (not served here)
- src/create_context_graph/domains/financial-services.yaml (not served here)
- src/create_context_graph/domains/gaming.yaml (not served here)
- src/create_context_graph/domains/genai-llm-ops.yaml (not served here)
- src/create_context_graph/domains/gis-cartography.yaml (not served here)
- src/create_context_graph/domains/golf-sports.yaml (not served here)
- src/create_context_graph/domains/government.yaml (not served here)
- src/create_context_graph/domains/healthcare.yaml (not served here)
- src/create_context_graph/domains/hospitality.yaml (not served here)
- src/create_context_graph/domains/legal.yaml (not served here)
- src/create_context_graph/domains/manufacturing.yaml (not served here)
- src/create_context_graph/domains/oil-gas.yaml (not served here)
- src/create_context_graph/domains/options-intelligence.yaml (not served here)
- src/create_context_graph/domains/personal-knowledge.yaml (not served here)
- src/create_context_graph/domains/product-management.yaml (not served here)
- src/create_context_graph/domains/real-estate.yaml (not served here)
- src/create_context_graph/domains/retail-ecommerce.yaml (not served here)
- src/create_context_graph/domains/scientific-research.yaml (not served here)
- src/create_context_graph/domains/software-engineering.yaml (not served here)
- src/create_context_graph/domains/trip-planning.yaml (not served here)
- src/create_context_graph/domains/vacation-industry.yaml (not served here)
- src/create_context_graph/domains/wildlife-management.yaml (not served here)
- src/create_context_graph/fixtures/agent-memory.json (not served here)
- src/create_context_graph/fixtures/conservation.json (not served here)
- src/create_context_graph/fixtures/cybersecurity.json (not served here)
- src/create_context_graph/fixtures/data-journalism.json (not served here)
- src/create_context_graph/fixtures/digital-twin.json (not served here)
- src/create_context_graph/fixtures/education.json (not served here)
- src/create_context_graph/fixtures/financial-services.json (not served here)
- src/create_context_graph/fixtures/gaming.json (not served here)
- src/create_context_graph/fixtures/genai-llm-ops.json (not served here)
- src/create_context_graph/fixtures/gis-cartography.json (not served here)
- src/create_context_graph/fixtures/golf-sports.json (not served here)
- src/create_context_graph/fixtures/government.json (not served here)
- src/create_context_graph/fixtures/healthcare.json (not served here)
- src/create_context_graph/fixtures/hospitality.json (not served here)
- src/create_context_graph/fixtures/legal.json (not served here)
- src/create_context_graph/fixtures/manufacturing.json (not served here)
- src/create_context_graph/fixtures/oil-gas.json (not served here)
- src/create_context_graph/fixtures/options-intelligence.json (not served here)
- src/create_context_graph/fixtures/personal-knowledge.json (not served here)
- src/create_context_graph/fixtures/product-management.json (not served here)
- src/create_context_graph/fixtures/real-estate.json (not served here)
- src/create_context_graph/fixtures/retail-ecommerce.json (not served here)
- src/create_context_graph/fixtures/scientific-research.json (not served here)
- src/create_context_graph/fixtures/software-engineering.json (not served here)
- src/create_context_graph/fixtures/trip-planning.json (not served here)
- src/create_context_graph/fixtures/vacation-industry.json (not served here)
- src/create_context_graph/fixtures/wildlife-management.json (not served here)
- src/create_context_graph/generator.py (not served here)
- src/create_context_graph/ingest.py (not served here)
- src/create_context_graph/name_pools.py (not served here)
- src/create_context_graph/neo4j_validator.py (not served here)
- src/create_context_graph/ontology.py (not served here)
- src/create_context_graph/renderer.py (not served here)
- src/create_context_graph/templates/backend/agents/anthropic_tools/agent.py.j2 (not served here)
- src/create_context_graph/templates/backend/agents/claude_agent_sdk/agent.py.j2 (not served here)
- src/create_context_graph/templates/backend/agents/crewai/agent.py.j2 (not served here)
- src/create_context_graph/templates/backend/agents/google_adk/agent.py.j2 (not served here)
- src/create_context_graph/templates/backend/agents/langgraph/agent.py.j2 (not served here)
- src/create_context_graph/templates/backend/agents/openai_agents/agent.py.j2 (not served here)
- src/create_context_graph/templates/backend/agents/pydanticai/agent.py.j2 (not served here)
- src/create_context_graph/templates/backend/agents/strands/agent.py.j2 (not served here)
- src/create_context_graph/templates/backend/connectors/__init__.py.j2 (not served here)
- src/create_context_graph/templates/backend/connectors/claude_code_connector.py.j2 (not served here)
- src/create_context_graph/templates/backend/connectors/gcal_connector.py.j2 (not served here)
- src/create_context_graph/templates/backend/connectors/github_connector.py.j2 (not served here)
- src/create_context_graph/templates/backend/connectors/gmail_connector.py.j2 (not served here)
- src/create_context_graph/templates/backend/connectors/google_workspace_connector.py.j2 (not served here)
- src/create_context_graph/templates/backend/connectors/import_data.py.j2 (not served here)
- src/create_context_graph/templates/backend/connectors/jira_connector.py.j2 (not served here)
- src/create_context_graph/templates/backend/connectors/linear_connector.py.j2 (not served here)
- src/create_context_graph/templates/backend/connectors/local_file_connector.py.j2 (not served here)
- src/create_context_graph/templates/backend/connectors/notion_connector.py.j2 (not served here)
- src/create_context_graph/templates/backend/connectors/salesforce_connector.py.j2 (not served here)
- src/create_context_graph/templates/backend/connectors/slack_connector.py.j2 (not served here)
- src/create_context_graph/templates/backend/shared/agent_stub.py.j2 (not served here)
- src/create_context_graph/templates/backend/shared/config.py.j2 (not served here)
- src/create_context_graph/templates/backend/shared/constants.py.j2 (not served here)
- src/create_context_graph/templates/backend/shared/context_graph_client.py.j2 (not served here)
- src/create_context_graph/templates/backend/shared/gds_client.py.j2 (not served here)
- src/create_context_graph/templates/backend/shared/generate_data.py.j2 (not served here)
- src/create_context_graph/templates/backend/shared/main.py.j2 (not served here)
- src/create_context_graph/templates/backend/shared/memory.py.j2 (not served here)
- src/create_context_graph/templates/backend/shared/memory_adapter.py.j2 (not served here)
- src/create_context_graph/templates/backend/shared/models.py.j2 (not served here)
- src/create_context_graph/templates/backend/shared/pyproject.toml.j2 (not served here)
- src/create_context_graph/templates/backend/shared/routes.py.j2 (not served here)
- src/create_context_graph/templates/backend/shared/vector_client.py.j2 (not served here)
- src/create_context_graph/templates/backend/tests/test_routes.py.j2 (not served here)
- src/create_context_graph/templates/base/Dockerfile.backend.j2 (not served here)
- src/create_context_graph/templates/base/Dockerfile.frontend.j2 (not served here)
- src/create_context_graph/templates/base/Makefile.j2 (not served here)
- src/create_context_graph/templates/base/README.md.j2 (not served here)
- src/create_context_graph/templates/base/docker-compose.prod.yml.j2 (not served here)
- src/create_context_graph/templates/base/docker-compose.yml.j2 (not served here)
- src/create_context_graph/templates/base/dockerignore.j2 (not served here)
- src/create_context_graph/templates/base/dot_env.j2 (not served here)
- src/create_context_graph/templates/base/dot_env_example.j2 (not served here)
- src/create_context_graph/templates/base/gitignore.j2 (not served here)
- src/create_context_graph/templates/base/mcp/README.md.j2 (not served here)
- src/create_context_graph/templates/base/mcp/claude_desktop_config.json.j2 (not served here)
- src/create_context_graph/templates/cypher/gds_projections.cypher.j2 (not served here)
- src/create_context_graph/templates/cypher/schema.cypher.j2 (not served here)
- src/create_context_graph/templates/frontend/app/globals.css.j2 (not served here)
- src/create_context_graph/templates/frontend/app/layout.tsx.j2 (not served here)
- src/create_context_graph/templates/frontend/app/page.tsx.j2 (not served here)
- src/create_context_graph/templates/frontend/components/ChatInterface.tsx.j2 (not served here)
- src/create_context_graph/templates/frontend/components/ContextGraphView.tsx.j2 (not served here)
- src/create_context_graph/templates/frontend/components/DecisionTracePanel.tsx.j2 (not served here)
- src/create_context_graph/templates/frontend/components/DocumentBrowser.tsx.j2 (not served here)
- src/create_context_graph/templates/frontend/components/ErrorBoundary.tsx.j2 (not served here)
- src/create_context_graph/templates/frontend/components/Provider.tsx.j2 (not served here)
- src/create_context_graph/templates/frontend/e2e/app.spec.ts.j2 (not served here)
- src/create_context_graph/templates/frontend/lib/config.ts.j2 (not served here)
- src/create_context_graph/templates/frontend/next.config.ts.j2 (not served here)
- src/create_context_graph/templates/frontend/package.json.j2 (not served here)
- src/create_context_graph/templates/frontend/playwright.config.ts.j2 (not served here)
- src/create_context_graph/templates/frontend/theme/index.ts.j2 (not served here)
- src/create_context_graph/templates/frontend/tsconfig.json.j2 (not served here)
- src/create_context_graph/wizard.py (not served here)
- tests/__init__.py (not served here)
- tests/conftest.py (not served here)
- tests/fixtures/local_file_vault/README.md (not served here)
- tests/fixtures/local_file_vault/companies/acme-corp.md (not served here)
- tests/fixtures/local_file_vault/companies/betawidgets-inc.md (not served here)
- tests/fixtures/local_file_vault/daily-notes/2026-05-08.md (not served here)
- tests/fixtures/local_file_vault/daily-notes/2026-05-09.md (not served here)
- tests/fixtures/local_file_vault/decisions/2026-q2-thesis-call.md (not served here)
- tests/fixtures/local_file_vault/external/acme-10q-2026q1.pdf (not served here)
- tests/fixtures/local_file_vault/external/sector-report-q1-2026.html (not served here)
- tests/fixtures/local_file_vault/meetings/2026-05-07-portfolio-review.md (not served here)
- tests/fixtures/local_file_vault/memos/acme-investment-memo.docx (not served here)
- tests/fixtures/local_file_vault/methodology/dcf-framework.md (not served here)
- tests/fixtures/local_file_vault/methodology/dcf-spec.adoc (not served here)
- tests/fixtures/local_file_vault/people/dana-liu.md (not served here)
- tests/fixtures/local_file_vault/people/marcus-reyes.md (not served here)
- tests/fixtures/local_file_vault/people/sarah-chen.md (not served here)
- tests/fixtures/local_file_vault/people/tariq-osei.md (not served here)
- tests/fixtures/local_file_vault/people/yuki-tanaka.md (not served here)
- tests/fixtures/local_file_vault_TESTING.md (not served here)
- tests/test_bolt_ingest_parity.py (not served here)
- tests/test_chat_import.py (not served here)
- tests/test_cli.py (not served here)
- tests/test_config.py (not served here)
- tests/test_connectors.py (not served here)
- tests/test_custom_domain.py (not served here)
- tests/test_doc_snippets.py (not served here)
- tests/test_fixtures.py (not served here)
- tests/test_frontend_logic.py (not served here)
- tests/test_generated_client_runtime.py (not served here)
- tests/test_generated_project.py (not served here)
- tests/test_generated_tests.py (not served here)
- tests/test_generator.py (not served here)
- tests/test_ingest_nams.py (not served here)
- tests/test_integration.py (not served here)
- tests/test_local_file_connector.py (not served here)
- tests/test_local_file_vault.py (not served here)
- tests/test_matrix.py (not served here)
- tests/test_memory_adapter.py (not served here)
- tests/test_nams_adapter.py (not served here)
- tests/test_nams_ingest_parity.py (not served here)
- tests/test_neo4j_validator.py (not served here)
- tests/test_ontology.py (not served here)
- tests/test_performance.py (not served here)
- tests/test_renderer.py (not served here)
- tests/test_routes_integration.py (not served here)
- tests/test_security.py (not served here)
- tests/test_wizard.py (not served here)
- uv.lock (not served here)
- vercel.json (not served here)
Advantages
- Rapidly scaffolds full-stack applications with domain-specific ontologies and agent tools in under 5 minutes. evidence: README.md
- Provides flexible memory backend options, supporting both hosted NAMS and self-hosted Neo4j. evidence: README.md
Limitations
- The NAMS hosted memory backend has a narrower write surface compared to self-hosted Neo4j, limiting some Cypher-based operations. evidence: README.md
- Requires specific API keys and environment variables depending on the chosen agent framework and memory provider. evidence: README.md
Security
Risk level: Low risk
This brain runs
Agent instructions that run or fetch something (28)
CLAUDE.md:Invoked via `uvx create-context-graph` or `npx create-context-graph`.CLAUDE.md:(2) every document/body ingest write failed (`role="document"` rejected — only user/assistant/system allowed — plus the conversation-404), fixed across all three NAMS ingest implementations (`run_nams_ingest`, scaffolded `import_data.py`, `make seed`'s `ingest_fixtures_nams`) with `role …[+63 chars]CLAUDE.md:the old loop swallowed the AttributeError and printed "0 removed") — `--reset-database` and `make reset` now honestly report that no delete API exists and point at the NAMS dashboard.CLAUDE.md:**NAMS domain ontology activation (new)**: NAMS pre-registers a server-side ontology for every bundled domain but auto-binds workspaces to `nams-default` until one is activated — generated apps now bind on `connect_memory()` (activate catalog match by domain id, or create-from-`backend …[+359 chars]CLAUDE.md:**Carry-forward from v0.13.1 (feedback-report triage):** `create-context-graph --dry-run` no longer demands a NAMS API key (the credential gate is now scoped to non-dry-run flows in `cli.py:392`).CLAUDE.md:**Carry-forward from v0.13.0 (v0.12.0 feedback-report fixes):** Fixed the bolt async/sync mismatch in the scaffolded `import_data.py` (`_ingest_via_bolt()` is `async def` and both call sites wrap with `asyncio.run`);CLAUDE.md:uv venv && uv pip install -e ".[dev]"CLAUDE.md:# Run testsCLAUDE.md:**Data seeding** (`make seed`): Loads all four data types into Neo4j — entities, relationships, documents (as `:Document` nodes with `:MENTIONS` links to entities), and decision traces (as `:DecisionTrace` → `:HAS_STEP` → `:TraceStep` chains).CLAUDE.md:As tools execute, the collector emits `tool_start` and `tool_end` events (with graph data).CLAUDE.md:CrewAI and Strands are synchronous frameworks that run in worker threads via `asyncio.to_thread()`.CLAUDE.md:When `--with-mcp` is passed (or selected in the wizard), the scaffold generates `mcp/claude_desktop_config.json` (pre-configured for the project's Neo4j instance), `mcp/README.md` (setup instructions), and a `make mcp-server` Makefile target.CLAUDE.md:python-docx (Word).CLAUDE.md:Connectors run at scaffold time AND are generated into the project with `make import` / `make import-and-seed` targets.CLAUDE.md:pytest tests/test_generated_tests.py # Scaffold + install + run generated project test suite for 4 frameworks (slow, 5)CLAUDE.md:Full-stack integration tests that scaffold a project, install dependencies, start the backend, and send chat prompts.CLAUDE.md:make smoke-test # Run 3 key framework tests (pydanticai, google-adk, strands)CLAUDE.md:# Or run directly with more control:CLAUDE.md:python scripts/e2e_smoke_test.py --domain healthcare --framework pydanticai --quickCLAUDE.md:python scripts/e2e_smoke_test.py --all-domains --framework claude-agent-sdk --quickCLAUDE.md:python scripts/e2e_smoke_test.py --domain gaming --framework openai-agents # full mode (all prompts)CLAUDE.md:| Target | Description | |--------|-------------| | `make test` | Fast unit tests (1,454 passing, no external deps) | | `make test-slow` | Full suite including matrix + perf + generated project + connector/functional tests (1,866 passing with connectors extra) | | `make test-matrix` | …[+533 chars]CLAUDE.md:Generate fixture data: run the CLI with `--demo-data` or use `generator.py` directlyCLAUDE.md:| Framework | Directory | Pattern | Streaming | |-----------|-----------|---------|-----------| | PydanticAI | `pydanticai/` | `@agent.tool` decorator + `RunContext[AgentDeps]` | Full (`agent.run_stream()`) | | Claude Agent SDK | `claude_agent_sdk/` | Dict-based TOOLS list + bounded ag …[+787 chars]CLAUDE.md:| Job | Trigger | Description | |-----|---------|-------------| | **test** | All pushes + PRs | Fast unit tests on Python 3.11 and 3.12 (`fail-fast: false` so one version's failure doesn't cancel the other) | | **lint** | All pushes + PRs | Ruff on `src/` and `tests/` (rule set pinned …[+444 chars]CLAUDE.md:**Every job installs from `uv.lock` via `uv sync --locked --extra ...` and runs commands with `uv run --no-sync`.** Never mix `uv pip install` with a bare `uv run` in CI: `uv run` does an implicit lockfile sync that downgrades locked base deps underneath freshly-installed latest extras …[+94 chars]CLAUDE.md:If `--locked` fails, run `uv lock` locally and commit the refreshed lockfile — dependency changes in `pyproject.toml` must ship with a matching `uv.lock`.CLAUDE.md:The Makefile test/lint targets use `uv run --extra dev ...` so local runs resolve from the lock the same way.
Install scripts (1)
Makefile(make install):uv venv && uv pip install -e ".[dev]"
- Low risk: network-instructions (CLAUDE.md:15)
- Low risk: network-instructions (Makefile:10)
- Low risk: scripts-present (scripts/e2e_smoke_test.py)
- Low risk: scripts-present (scripts/regenerate_fixtures.py)
Attribution and licence
- Created by
- neo4j-labs
- Declared authors
- William Lyon (declared in pyproject.toml)
- Publisher
- neo4j-labs (Official neo4j-labs project)
- Source
- neo4j-labs/create-context-graph · commit 926e3b3
- Licence
- Apache License 2.0 (files served here)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by neo4j-labs.
Install from source
334 of its files are not served here, so there is no ZIP. neo4j-labs/create-context-graph at 926e3b3