claude-brain 0.14.1 → 0.14.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +191 -191
- package/VERSION +1 -1
- package/assets/CLAUDE-unified.md +11 -11
- package/assets/CLAUDE.md +11 -11
- package/bunfig.toml +8 -8
- package/package.json +80 -80
- package/packs/backend/node.json +173 -173
- package/packs/core/javascript.json +176 -176
- package/packs/core/typescript.json +222 -222
- package/packs/frontend/react.json +254 -254
- package/packs/meta/testing.json +172 -172
- package/src/automation/auto-context.ts +240 -240
- package/src/automation/decision-detector.ts +452 -452
- package/src/automation/index.ts +11 -11
- package/src/automation/phase12-manager.ts +456 -456
- package/src/automation/proactive-recall.ts +373 -373
- package/src/automation/project-detector.ts +310 -310
- package/src/automation/repo-scanner.ts +205 -205
- package/src/cli/auto-setup.ts +82 -82
- package/src/cli/bin.ts +202 -202
- package/src/cli/commands/chroma.ts +573 -573
- package/src/cli/commands/git-hook.ts +189 -189
- package/src/cli/commands/hooks.ts +213 -213
- package/src/cli/commands/init.ts +122 -122
- package/src/cli/commands/install-mcp.ts +92 -92
- package/src/cli/commands/pack.ts +197 -197
- package/src/cli/commands/serve.ts +167 -167
- package/src/cli/commands/start.ts +42 -42
- package/src/cli/commands/uninstall-mcp.ts +41 -41
- package/src/cli/commands/update.ts +121 -121
- package/src/cli/diagnose.ts +4 -4
- package/src/cli/health-check.ts +4 -4
- package/src/cli/migrate-chroma.ts +106 -106
- package/src/cli/setup.ts +4 -4
- package/src/cli/ui/animations.ts +80 -80
- package/src/cli/ui/components.ts +82 -82
- package/src/cli/ui/index.ts +4 -4
- package/src/cli/ui/logo.ts +36 -36
- package/src/cli/ui/theme.ts +55 -55
- package/src/config/defaults.ts +50 -50
- package/src/config/home.ts +55 -55
- package/src/config/index.ts +7 -7
- package/src/config/loader.ts +166 -166
- package/src/config/migration.ts +76 -76
- package/src/config/schema.ts +360 -360
- package/src/config/validator.ts +184 -184
- package/src/config/watcher.ts +86 -86
- package/src/context/assembler.ts +398 -398
- package/src/context/cache-manager.ts +101 -101
- package/src/context/formatter.ts +84 -84
- package/src/context/hierarchy.ts +85 -85
- package/src/context/index.ts +83 -83
- package/src/context/progress-tracker.ts +174 -174
- package/src/context/standards-manager.ts +287 -287
- package/src/context/types.ts +252 -252
- package/src/context/validator.ts +58 -58
- package/src/diagnostics/index.ts +123 -123
- package/src/health/index.ts +229 -229
- package/src/hooks/brain-hook.ts +112 -112
- package/src/hooks/capture.ts +168 -168
- package/src/hooks/deduplicator.ts +72 -72
- package/src/hooks/git-capture.ts +109 -109
- package/src/hooks/git-hook-installer.ts +207 -207
- package/src/hooks/index.ts +20 -20
- package/src/hooks/installer.ts +194 -191
- package/src/hooks/passive-classifier.ts +407 -366
- package/src/hooks/queue.ts +129 -129
- package/src/hooks/session-tracker.ts +275 -275
- package/src/hooks/types.ts +47 -47
- package/src/index.ts +7 -7
- package/src/intelligence/cross-project/affinity.ts +162 -162
- package/src/intelligence/cross-project/generalizer.ts +283 -283
- package/src/intelligence/cross-project/index.ts +13 -13
- package/src/intelligence/cross-project/transfer.ts +201 -201
- package/src/intelligence/index.ts +24 -24
- package/src/intelligence/optimization/index.ts +10 -10
- package/src/intelligence/optimization/precompute.ts +202 -202
- package/src/intelligence/optimization/semantic-cache.ts +207 -207
- package/src/intelligence/prediction/context-anticipator.ts +198 -198
- package/src/intelligence/prediction/decision-predictor.ts +184 -184
- package/src/intelligence/prediction/index.ts +13 -13
- package/src/intelligence/prediction/recommender.ts +268 -268
- package/src/intelligence/reasoning/chain-retrieval.ts +247 -247
- package/src/intelligence/reasoning/counterfactual.ts +248 -248
- package/src/intelligence/reasoning/index.ts +13 -13
- package/src/intelligence/reasoning/synthesizer.ts +169 -169
- package/src/intelligence/temporal/evolution.ts +197 -197
- package/src/intelligence/temporal/index.ts +16 -16
- package/src/intelligence/temporal/query-processor.ts +190 -190
- package/src/intelligence/temporal/timeline.ts +259 -259
- package/src/intelligence/temporal/trends.ts +263 -263
- package/src/knowledge/entity-extractor.ts +416 -416
- package/src/knowledge/graph/builder.ts +185 -185
- package/src/knowledge/graph/linker.ts +201 -201
- package/src/knowledge/graph/memory-graph.ts +359 -359
- package/src/knowledge/graph/schema.ts +99 -99
- package/src/knowledge/graph/search.ts +168 -168
- package/src/knowledge/relationship-extractor.ts +108 -108
- package/src/memory/chroma/client.ts +174 -174
- package/src/memory/chroma/collection-manager.ts +94 -94
- package/src/memory/chroma/config.ts +57 -57
- package/src/memory/chroma/embeddings.ts +153 -153
- package/src/memory/chroma/index.ts +82 -82
- package/src/memory/chroma/migration.ts +270 -270
- package/src/memory/chroma/schemas.ts +69 -69
- package/src/memory/chroma/search.ts +315 -315
- package/src/memory/chroma/store.ts +741 -741
- package/src/memory/consolidation/archiver.ts +164 -164
- package/src/memory/consolidation/merger.ts +186 -186
- package/src/memory/consolidation/scorer.ts +138 -138
- package/src/memory/context-builder.ts +236 -236
- package/src/memory/database.ts +169 -169
- package/src/memory/embedding-utils.ts +156 -156
- package/src/memory/embeddings.ts +226 -226
- package/src/memory/episodic/detector.ts +108 -108
- package/src/memory/episodic/manager.ts +351 -351
- package/src/memory/episodic/summarizer.ts +179 -179
- package/src/memory/episodic/types.ts +52 -52
- package/src/memory/index.ts +582 -582
- package/src/memory/knowledge-extractor.ts +455 -455
- package/src/memory/learning.ts +378 -378
- package/src/memory/patterns.ts +396 -396
- package/src/memory/schema.ts +88 -88
- package/src/memory/search.ts +309 -309
- package/src/memory/store.ts +787 -787
- package/src/memory/types.ts +121 -121
- package/src/orchestrator/coordinator.ts +272 -272
- package/src/orchestrator/decision-logger.ts +228 -228
- package/src/orchestrator/event-emitter.ts +198 -198
- package/src/orchestrator/event-queue.ts +184 -184
- package/src/orchestrator/handlers/base-handler.ts +70 -70
- package/src/orchestrator/handlers/context-handler.ts +73 -73
- package/src/orchestrator/handlers/decision-handler.ts +204 -204
- package/src/orchestrator/handlers/index.ts +10 -10
- package/src/orchestrator/handlers/status-handler.ts +131 -131
- package/src/orchestrator/handlers/task-handler.ts +171 -171
- package/src/orchestrator/index.ts +275 -275
- package/src/orchestrator/task-parser.ts +284 -284
- package/src/orchestrator/types.ts +98 -98
- package/src/packs/index.ts +9 -9
- package/src/packs/loader.ts +134 -134
- package/src/packs/manager.ts +204 -204
- package/src/packs/ranker.ts +78 -78
- package/src/packs/types.ts +81 -81
- package/src/phase12/index.ts +5 -5
- package/src/retrieval/bm25/index.ts +300 -300
- package/src/retrieval/bm25/tokenizer.ts +184 -184
- package/src/retrieval/feedback/adaptive.ts +223 -223
- package/src/retrieval/feedback/index.ts +16 -16
- package/src/retrieval/feedback/metrics.ts +223 -223
- package/src/retrieval/feedback/store.ts +283 -283
- package/src/retrieval/fusion/index.ts +194 -194
- package/src/retrieval/fusion/rrf.ts +163 -163
- package/src/retrieval/index.ts +12 -12
- package/src/retrieval/pipeline.ts +375 -375
- package/src/retrieval/query/expander.ts +198 -198
- package/src/retrieval/query/index.ts +27 -27
- package/src/retrieval/query/intent-classifier.ts +236 -236
- package/src/retrieval/query/temporal-parser.ts +295 -295
- package/src/retrieval/reranker/index.ts +188 -188
- package/src/retrieval/reranker/model.ts +95 -95
- package/src/retrieval/service.ts +125 -125
- package/src/retrieval/types.ts +162 -162
- package/src/routing/entity-extractor.ts +428 -428
- package/src/routing/intent-classifier.ts +436 -436
- package/src/routing/response-filter.ts +254 -254
- package/src/routing/router.ts +1314 -1314
- package/src/routing/search-engine.ts +475 -475
- package/src/routing/types.ts +84 -84
- package/src/scripts/health-check.ts +118 -118
- package/src/scripts/setup.ts +122 -122
- package/src/server/handlers/call-tool.ts +156 -156
- package/src/server/handlers/index.ts +9 -9
- package/src/server/handlers/list-tools.ts +35 -35
- package/src/server/handlers/tools/analyze-decision-evolution.ts +151 -151
- package/src/server/handlers/tools/auto-remember.ts +200 -200
- package/src/server/handlers/tools/brain.ts +85 -85
- package/src/server/handlers/tools/create-project.ts +135 -135
- package/src/server/handlers/tools/detect-trends.ts +144 -144
- package/src/server/handlers/tools/find-cross-project-patterns.ts +168 -168
- package/src/server/handlers/tools/get-activity-log.ts +194 -194
- package/src/server/handlers/tools/get-code-standards.ts +124 -124
- package/src/server/handlers/tools/get-corrections.ts +154 -154
- package/src/server/handlers/tools/get-decision-timeline.ts +172 -172
- package/src/server/handlers/tools/get-episode.ts +103 -103
- package/src/server/handlers/tools/get-patterns.ts +158 -158
- package/src/server/handlers/tools/get-phase12-status.ts +63 -63
- package/src/server/handlers/tools/get-project-context.ts +75 -75
- package/src/server/handlers/tools/get-recommendations.ts +145 -145
- package/src/server/handlers/tools/index.ts +31 -31
- package/src/server/handlers/tools/init-project.ts +757 -757
- package/src/server/handlers/tools/list-episodes.ts +90 -90
- package/src/server/handlers/tools/list-projects.ts +125 -125
- package/src/server/handlers/tools/rate-memory.ts +101 -101
- package/src/server/handlers/tools/recall-similar.ts +87 -87
- package/src/server/handlers/tools/recognize-pattern.ts +126 -126
- package/src/server/handlers/tools/record-correction.ts +125 -125
- package/src/server/handlers/tools/remember-decision.ts +153 -153
- package/src/server/handlers/tools/schemas.ts +253 -253
- package/src/server/handlers/tools/search-knowledge-graph.ts +102 -102
- package/src/server/handlers/tools/smart-context.ts +146 -146
- package/src/server/handlers/tools/update-progress.ts +131 -131
- package/src/server/handlers/tools/what-if-analysis.ts +135 -135
- package/src/server/http-api.ts +693 -693
- package/src/server/index.ts +40 -40
- package/src/server/mcp-server.ts +283 -283
- package/src/server/providers/index.ts +7 -7
- package/src/server/providers/prompts.ts +327 -327
- package/src/server/providers/resources.ts +622 -622
- package/src/server/services.ts +468 -468
- package/src/server/types.ts +39 -39
- package/src/server/utils/error-handler.ts +155 -155
- package/src/server/utils/index.ts +13 -13
- package/src/server/utils/memory-indicator.ts +83 -83
- package/src/server/utils/request-context.ts +122 -122
- package/src/server/utils/response-formatter.ts +124 -124
- package/src/server/utils/validators.ts +210 -210
- package/src/setup/index.ts +48 -48
- package/src/setup/wizard.ts +461 -461
- package/src/tools/index.ts +24 -24
- package/src/tools/registry.ts +115 -115
- package/src/tools/schemas.test.ts +30 -30
- package/src/tools/schemas.ts +617 -617
- package/src/tools/types.ts +412 -412
- package/src/utils/circuit-breaker.ts +130 -130
- package/src/utils/cleanup.ts +34 -34
- package/src/utils/error-handler.ts +132 -132
- package/src/utils/error-messages.ts +60 -60
- package/src/utils/fallback.ts +45 -45
- package/src/utils/index.ts +54 -54
- package/src/utils/logger-utils.ts +80 -80
- package/src/utils/logger.ts +88 -88
- package/src/utils/phase12-helper.ts +56 -56
- package/src/utils/retry.ts +94 -94
- package/src/utils/timing.ts +47 -47
- package/src/utils/transaction.ts +63 -63
- package/src/vault/frontmatter.ts +264 -264
- package/src/vault/index.ts +318 -318
- package/src/vault/paths.ts +106 -106
- package/src/vault/query.ts +422 -422
- package/src/vault/reader.ts +264 -264
- package/src/vault/templates.ts +186 -186
- package/src/vault/types.ts +73 -73
- package/src/vault/watcher.ts +277 -277
- package/src/vault/writer.ts +413 -413
- package/tsconfig.json +30 -30
package/README.md
CHANGED
|
@@ -1,191 +1,191 @@
|
|
|
1
|
-
# Claude Brain
|
|
2
|
-
|
|
3
|
-
A locally-running development assistant that bridges Obsidian knowledge vaults with Claude Code through the Model Context Protocol (MCP).
|
|
4
|
-
|
|
5
|
-
## Features
|
|
6
|
-
|
|
7
|
-
- Eliminates repetitive context explanations to Claude Code
|
|
8
|
-
- Maintains project memory across sessions using Obsidian vault
|
|
9
|
-
- Semantic memory system learns from past decisions (ChromaDB + SQLite)
|
|
10
|
-
- **25 MCP tools** for context retrieval, memory storage, and intelligence
|
|
11
|
-
- **Knowledge graph** connecting technologies, decisions, and concepts
|
|
12
|
-
- **Episodic memory** with session detection and extractive summarization
|
|
13
|
-
- **Hybrid retrieval** with BM25 + semantic fusion and cross-encoder reranking
|
|
14
|
-
- **Temporal intelligence** for decision timelines, evolution tracking, and trend detection
|
|
15
|
-
- **Multi-hop reasoning** with chain retrieval and what-if analysis
|
|
16
|
-
- **Predictive intelligence** with context-aware recommendations
|
|
17
|
-
- **Cross-project intelligence** for pattern discovery and knowledge transfer
|
|
18
|
-
- **Semantic caching** with cosine similarity matching for fast repeated queries
|
|
19
|
-
- **Event-driven orchestrator** for automatic file change handling
|
|
20
|
-
- **Automatic duplicate prevention** for decisions (>90% similarity detection)
|
|
21
|
-
- **Zod-validated tool inputs** for robust error handling
|
|
22
|
-
- Runs completely locally with zero cloud dependencies
|
|
23
|
-
- Compiles to single portable executable
|
|
24
|
-
|
|
25
|
-
## Quick Start
|
|
26
|
-
|
|
27
|
-
```bash
|
|
28
|
-
# Install globally (requires Bun)
|
|
29
|
-
bun install -g claude-brain
|
|
30
|
-
|
|
31
|
-
# Interactive setup (vault path, log level, installs ~/.claude/CLAUDE.md)
|
|
32
|
-
claude-brain setup
|
|
33
|
-
|
|
34
|
-
# Register with Claude Code
|
|
35
|
-
claude mcp add claude-brain -- bunx claude-brain@latest
|
|
36
|
-
```
|
|
37
|
-
|
|
38
|
-
That's it. Every Claude Code session now has 25 brain tools available.
|
|
39
|
-
|
|
40
|
-
## Zero-Install Alternative
|
|
41
|
-
|
|
42
|
-
Skip the global install — just register with Claude Code directly:
|
|
43
|
-
|
|
44
|
-
```bash
|
|
45
|
-
claude mcp add claude-brain -- bunx claude-brain@latest
|
|
46
|
-
```
|
|
47
|
-
|
|
48
|
-
On first run, `~/.claude-brain/` is auto-created with default config.
|
|
49
|
-
|
|
50
|
-
## Prerequisites
|
|
51
|
-
|
|
52
|
-
- [Bun](https://bun.sh) >= 1.0.0
|
|
53
|
-
- An Obsidian vault (or any markdown folder)
|
|
54
|
-
|
|
55
|
-
## CLI Commands
|
|
56
|
-
|
|
57
|
-
| Command | Description |
|
|
58
|
-
|---------|-------------|
|
|
59
|
-
| `claude-brain` | Start MCP server (default) |
|
|
60
|
-
| `claude-brain setup` | Interactive setup wizard (run once per machine) |
|
|
61
|
-
| `claude-brain install` | Register as MCP server in Claude Code |
|
|
62
|
-
| `claude-brain uninstall` | Remove MCP server from Claude Code |
|
|
63
|
-
| `claude-brain update` | Update package and refresh CLAUDE.md to latest |
|
|
64
|
-
| `claude-brain health` | Run health checks |
|
|
65
|
-
| `claude-brain diagnose` | Run diagnostics |
|
|
66
|
-
| `claude-brain version` | Show version |
|
|
67
|
-
| `claude-brain help` | Show help |
|
|
68
|
-
|
|
69
|
-
## Configuration
|
|
70
|
-
|
|
71
|
-
Configuration lives in `~/.claude-brain/.env`. Created automatically by `claude-brain setup`, or on first run with defaults.
|
|
72
|
-
|
|
73
|
-
| Variable | Description | Default |
|
|
74
|
-
|----------|-------------|---------|
|
|
75
|
-
| `VAULT_PATH` | Path to your Obsidian vault | `~/.claude-brain/vault` |
|
|
76
|
-
| `LOG_LEVEL` | Log level (debug/info/warn/error) | `info` |
|
|
77
|
-
| `NODE_ENV` | Environment | `production` |
|
|
78
|
-
| `CLAUDE_BRAIN_HOME` | Override home directory | `~/.claude-brain/` |
|
|
79
|
-
|
|
80
|
-
## Development
|
|
81
|
-
|
|
82
|
-
```bash
|
|
83
|
-
# Clone and install dependencies
|
|
84
|
-
git clone <repo-url>
|
|
85
|
-
cd claude-brain
|
|
86
|
-
bun install
|
|
87
|
-
|
|
88
|
-
# Start dev server (uses local ./data, ./logs)
|
|
89
|
-
bun run dev
|
|
90
|
-
|
|
91
|
-
# Run tests
|
|
92
|
-
bun test
|
|
93
|
-
|
|
94
|
-
# Run tests in watch mode
|
|
95
|
-
bun test --watch
|
|
96
|
-
```
|
|
97
|
-
|
|
98
|
-
The `dev` script sets `CLAUDE_BRAIN_HOME=.` so all data stays in the project directory.
|
|
99
|
-
|
|
100
|
-
## Building
|
|
101
|
-
|
|
102
|
-
```bash
|
|
103
|
-
# Build standalone executable for current platform
|
|
104
|
-
bun run build:binary
|
|
105
|
-
|
|
106
|
-
# Build for all platforms (Windows, macOS, Linux)
|
|
107
|
-
bun run build:all
|
|
108
|
-
```
|
|
109
|
-
|
|
110
|
-
## Project Structure
|
|
111
|
-
|
|
112
|
-
```
|
|
113
|
-
claude-brain/
|
|
114
|
-
├── src/
|
|
115
|
-
│ ├── index.ts # Entry point (thin wrapper)
|
|
116
|
-
│ ├── cli/
|
|
117
|
-
│ │ ├── bin.ts # CLI entry point (claude-brain command)
|
|
118
|
-
│ │ ├── auto-setup.ts # First-run home directory initialization
|
|
119
|
-
│ │ └── commands/ # serve, install-mcp, uninstall-mcp, update
|
|
120
|
-
│ ├── config/
|
|
121
|
-
│ │ ├── home.ts # ~/.claude-brain/ path resolution
|
|
122
|
-
│ │ ├── loader.ts # Config loading (defaults → file → env)
|
|
123
|
-
│ │ └── schema.ts # Zod config schemas
|
|
124
|
-
│ ├── server/ # MCP server code
|
|
125
|
-
│ │ └── handlers/tools/ # 25 tool handlers with Zod validation
|
|
126
|
-
│ ├── vault/ # Obsidian integration
|
|
127
|
-
│ ├── memory/ # Vector DB & embeddings
|
|
128
|
-
│ │ ├── chroma/ # ChromaDB integration with duplicate detection
|
|
129
|
-
│ │ ├── episodic/ # Session detection & episode management
|
|
130
|
-
│ │ └── consolidation/ # Memory importance scoring & archival
|
|
131
|
-
│ ├── knowledge/ # Knowledge graph & entity extraction
|
|
132
|
-
│ │ └── graph/ # In-memory graph with search & auto-population
|
|
133
|
-
│ ├── retrieval/ # Hybrid search (BM25 + semantic + reranking)
|
|
134
|
-
│ ├── temporal/ # Timeline construction & trend detection
|
|
135
|
-
│ ├── reasoning/ # Multi-hop chain retrieval & what-if analysis
|
|
136
|
-
│ ├── prediction/ # Decision prediction & recommendations
|
|
137
|
-
│ ├── cross-project/ # Cross-project pattern discovery & transfer
|
|
138
|
-
│ ├── optimization/ # Semantic caching & precomputation
|
|
139
|
-
│ ├── orchestrator/ # Event-driven coordination system
|
|
140
|
-
│ ├── setup/ # Interactive setup wizard
|
|
141
|
-
│ ├── context/ # Context assembly
|
|
142
|
-
│ ├── tools/ # MCP tool definitions & registry
|
|
143
|
-
│ └── utils/ # Shared utilities
|
|
144
|
-
├── assets/
|
|
145
|
-
│ └── CLAUDE.md # Protocol file (shipped with npm package)
|
|
146
|
-
├── tests/ # 750+ tests
|
|
147
|
-
└── ~/.claude-brain/ # User data (created at runtime)
|
|
148
|
-
├── .env # Configuration
|
|
149
|
-
├── data/ # SQLite + ChromaDB
|
|
150
|
-
├── logs/ # Log files
|
|
151
|
-
└── vault/ # Default vault location
|
|
152
|
-
```
|
|
153
|
-
|
|
154
|
-
## Architecture Highlights
|
|
155
|
-
|
|
156
|
-
### Event-Driven Orchestrator
|
|
157
|
-
The orchestrator automatically responds to file changes in your vault:
|
|
158
|
-
- Detects new decisions in `decisions.md` files
|
|
159
|
-
- Triggers automatic semantic indexing
|
|
160
|
-
- Coordinates between vault, memory, and context systems
|
|
161
|
-
|
|
162
|
-
### Duplicate Prevention
|
|
163
|
-
When storing decisions, the system:
|
|
164
|
-
- Searches for existing decisions with >90% semantic similarity
|
|
165
|
-
- Returns existing ID if duplicate found (prevents bloat)
|
|
166
|
-
- Logs skipped duplicates for transparency
|
|
167
|
-
|
|
168
|
-
### Input Validation
|
|
169
|
-
All tool inputs are validated using Zod schemas:
|
|
170
|
-
- Clear error messages for invalid parameters
|
|
171
|
-
- Type-safe extraction of validated inputs
|
|
172
|
-
- Consistent validation across all 25 tools
|
|
173
|
-
|
|
174
|
-
### Embedding Cache
|
|
175
|
-
Uses SHA-256 hashing for cache keys to prevent collisions (improved from simple hash).
|
|
176
|
-
|
|
177
|
-
### MCP Tools (25 total)
|
|
178
|
-
|
|
179
|
-
| Category | Tools |
|
|
180
|
-
|----------|-------|
|
|
181
|
-
| Context Retrieval | `get_project_context`, `smart_context`, `recall_similar`, `get_code_standards`, `get_phase12_status` |
|
|
182
|
-
| Memory Storage | `remember_decision`, `auto_remember`, `recognize_pattern`, `record_correction`, `update_progress` |
|
|
183
|
-
| Project Management | `list_projects`, `create_project`, `init_project` |
|
|
184
|
-
| Knowledge Graph | `search_knowledge_graph`, `get_episode`, `list_episodes` |
|
|
185
|
-
| Patterns & Corrections | `get_patterns`, `get_corrections` |
|
|
186
|
-
| Feedback | `rate_memory` |
|
|
187
|
-
| Advanced Intelligence | `get_decision_timeline`, `analyze_decision_evolution`, `detect_trends`, `what_if_analysis`, `get_recommendations`, `find_cross_project_patterns` |
|
|
188
|
-
|
|
189
|
-
## License
|
|
190
|
-
|
|
191
|
-
MIT
|
|
1
|
+
# Claude Brain
|
|
2
|
+
|
|
3
|
+
A locally-running development assistant that bridges Obsidian knowledge vaults with Claude Code through the Model Context Protocol (MCP).
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- Eliminates repetitive context explanations to Claude Code
|
|
8
|
+
- Maintains project memory across sessions using Obsidian vault
|
|
9
|
+
- Semantic memory system learns from past decisions (ChromaDB + SQLite)
|
|
10
|
+
- **25 MCP tools** for context retrieval, memory storage, and intelligence
|
|
11
|
+
- **Knowledge graph** connecting technologies, decisions, and concepts
|
|
12
|
+
- **Episodic memory** with session detection and extractive summarization
|
|
13
|
+
- **Hybrid retrieval** with BM25 + semantic fusion and cross-encoder reranking
|
|
14
|
+
- **Temporal intelligence** for decision timelines, evolution tracking, and trend detection
|
|
15
|
+
- **Multi-hop reasoning** with chain retrieval and what-if analysis
|
|
16
|
+
- **Predictive intelligence** with context-aware recommendations
|
|
17
|
+
- **Cross-project intelligence** for pattern discovery and knowledge transfer
|
|
18
|
+
- **Semantic caching** with cosine similarity matching for fast repeated queries
|
|
19
|
+
- **Event-driven orchestrator** for automatic file change handling
|
|
20
|
+
- **Automatic duplicate prevention** for decisions (>90% similarity detection)
|
|
21
|
+
- **Zod-validated tool inputs** for robust error handling
|
|
22
|
+
- Runs completely locally with zero cloud dependencies
|
|
23
|
+
- Compiles to single portable executable
|
|
24
|
+
|
|
25
|
+
## Quick Start
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
# Install globally (requires Bun)
|
|
29
|
+
bun install -g claude-brain
|
|
30
|
+
|
|
31
|
+
# Interactive setup (vault path, log level, installs ~/.claude/CLAUDE.md)
|
|
32
|
+
claude-brain setup
|
|
33
|
+
|
|
34
|
+
# Register with Claude Code
|
|
35
|
+
claude mcp add claude-brain -- bunx claude-brain@latest
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
That's it. Every Claude Code session now has 25 brain tools available.
|
|
39
|
+
|
|
40
|
+
## Zero-Install Alternative
|
|
41
|
+
|
|
42
|
+
Skip the global install — just register with Claude Code directly:
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
claude mcp add claude-brain -- bunx claude-brain@latest
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
On first run, `~/.claude-brain/` is auto-created with default config.
|
|
49
|
+
|
|
50
|
+
## Prerequisites
|
|
51
|
+
|
|
52
|
+
- [Bun](https://bun.sh) >= 1.0.0
|
|
53
|
+
- An Obsidian vault (or any markdown folder)
|
|
54
|
+
|
|
55
|
+
## CLI Commands
|
|
56
|
+
|
|
57
|
+
| Command | Description |
|
|
58
|
+
|---------|-------------|
|
|
59
|
+
| `claude-brain` | Start MCP server (default) |
|
|
60
|
+
| `claude-brain setup` | Interactive setup wizard (run once per machine) |
|
|
61
|
+
| `claude-brain install` | Register as MCP server in Claude Code |
|
|
62
|
+
| `claude-brain uninstall` | Remove MCP server from Claude Code |
|
|
63
|
+
| `claude-brain update` | Update package and refresh CLAUDE.md to latest |
|
|
64
|
+
| `claude-brain health` | Run health checks |
|
|
65
|
+
| `claude-brain diagnose` | Run diagnostics |
|
|
66
|
+
| `claude-brain version` | Show version |
|
|
67
|
+
| `claude-brain help` | Show help |
|
|
68
|
+
|
|
69
|
+
## Configuration
|
|
70
|
+
|
|
71
|
+
Configuration lives in `~/.claude-brain/.env`. Created automatically by `claude-brain setup`, or on first run with defaults.
|
|
72
|
+
|
|
73
|
+
| Variable | Description | Default |
|
|
74
|
+
|----------|-------------|---------|
|
|
75
|
+
| `VAULT_PATH` | Path to your Obsidian vault | `~/.claude-brain/vault` |
|
|
76
|
+
| `LOG_LEVEL` | Log level (debug/info/warn/error) | `info` |
|
|
77
|
+
| `NODE_ENV` | Environment | `production` |
|
|
78
|
+
| `CLAUDE_BRAIN_HOME` | Override home directory | `~/.claude-brain/` |
|
|
79
|
+
|
|
80
|
+
## Development
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
# Clone and install dependencies
|
|
84
|
+
git clone <repo-url>
|
|
85
|
+
cd claude-brain
|
|
86
|
+
bun install
|
|
87
|
+
|
|
88
|
+
# Start dev server (uses local ./data, ./logs)
|
|
89
|
+
bun run dev
|
|
90
|
+
|
|
91
|
+
# Run tests
|
|
92
|
+
bun test
|
|
93
|
+
|
|
94
|
+
# Run tests in watch mode
|
|
95
|
+
bun test --watch
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
The `dev` script sets `CLAUDE_BRAIN_HOME=.` so all data stays in the project directory.
|
|
99
|
+
|
|
100
|
+
## Building
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
# Build standalone executable for current platform
|
|
104
|
+
bun run build:binary
|
|
105
|
+
|
|
106
|
+
# Build for all platforms (Windows, macOS, Linux)
|
|
107
|
+
bun run build:all
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
## Project Structure
|
|
111
|
+
|
|
112
|
+
```
|
|
113
|
+
claude-brain/
|
|
114
|
+
├── src/
|
|
115
|
+
│ ├── index.ts # Entry point (thin wrapper)
|
|
116
|
+
│ ├── cli/
|
|
117
|
+
│ │ ├── bin.ts # CLI entry point (claude-brain command)
|
|
118
|
+
│ │ ├── auto-setup.ts # First-run home directory initialization
|
|
119
|
+
│ │ └── commands/ # serve, install-mcp, uninstall-mcp, update
|
|
120
|
+
│ ├── config/
|
|
121
|
+
│ │ ├── home.ts # ~/.claude-brain/ path resolution
|
|
122
|
+
│ │ ├── loader.ts # Config loading (defaults → file → env)
|
|
123
|
+
│ │ └── schema.ts # Zod config schemas
|
|
124
|
+
│ ├── server/ # MCP server code
|
|
125
|
+
│ │ └── handlers/tools/ # 25 tool handlers with Zod validation
|
|
126
|
+
│ ├── vault/ # Obsidian integration
|
|
127
|
+
│ ├── memory/ # Vector DB & embeddings
|
|
128
|
+
│ │ ├── chroma/ # ChromaDB integration with duplicate detection
|
|
129
|
+
│ │ ├── episodic/ # Session detection & episode management
|
|
130
|
+
│ │ └── consolidation/ # Memory importance scoring & archival
|
|
131
|
+
│ ├── knowledge/ # Knowledge graph & entity extraction
|
|
132
|
+
│ │ └── graph/ # In-memory graph with search & auto-population
|
|
133
|
+
│ ├── retrieval/ # Hybrid search (BM25 + semantic + reranking)
|
|
134
|
+
│ ├── temporal/ # Timeline construction & trend detection
|
|
135
|
+
│ ├── reasoning/ # Multi-hop chain retrieval & what-if analysis
|
|
136
|
+
│ ├── prediction/ # Decision prediction & recommendations
|
|
137
|
+
│ ├── cross-project/ # Cross-project pattern discovery & transfer
|
|
138
|
+
│ ├── optimization/ # Semantic caching & precomputation
|
|
139
|
+
│ ├── orchestrator/ # Event-driven coordination system
|
|
140
|
+
│ ├── setup/ # Interactive setup wizard
|
|
141
|
+
│ ├── context/ # Context assembly
|
|
142
|
+
│ ├── tools/ # MCP tool definitions & registry
|
|
143
|
+
│ └── utils/ # Shared utilities
|
|
144
|
+
├── assets/
|
|
145
|
+
│ └── CLAUDE.md # Protocol file (shipped with npm package)
|
|
146
|
+
├── tests/ # 750+ tests
|
|
147
|
+
└── ~/.claude-brain/ # User data (created at runtime)
|
|
148
|
+
├── .env # Configuration
|
|
149
|
+
├── data/ # SQLite + ChromaDB
|
|
150
|
+
├── logs/ # Log files
|
|
151
|
+
└── vault/ # Default vault location
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
## Architecture Highlights
|
|
155
|
+
|
|
156
|
+
### Event-Driven Orchestrator
|
|
157
|
+
The orchestrator automatically responds to file changes in your vault:
|
|
158
|
+
- Detects new decisions in `decisions.md` files
|
|
159
|
+
- Triggers automatic semantic indexing
|
|
160
|
+
- Coordinates between vault, memory, and context systems
|
|
161
|
+
|
|
162
|
+
### Duplicate Prevention
|
|
163
|
+
When storing decisions, the system:
|
|
164
|
+
- Searches for existing decisions with >90% semantic similarity
|
|
165
|
+
- Returns existing ID if duplicate found (prevents bloat)
|
|
166
|
+
- Logs skipped duplicates for transparency
|
|
167
|
+
|
|
168
|
+
### Input Validation
|
|
169
|
+
All tool inputs are validated using Zod schemas:
|
|
170
|
+
- Clear error messages for invalid parameters
|
|
171
|
+
- Type-safe extraction of validated inputs
|
|
172
|
+
- Consistent validation across all 25 tools
|
|
173
|
+
|
|
174
|
+
### Embedding Cache
|
|
175
|
+
Uses SHA-256 hashing for cache keys to prevent collisions (improved from simple hash).
|
|
176
|
+
|
|
177
|
+
### MCP Tools (25 total)
|
|
178
|
+
|
|
179
|
+
| Category | Tools |
|
|
180
|
+
|----------|-------|
|
|
181
|
+
| Context Retrieval | `get_project_context`, `smart_context`, `recall_similar`, `get_code_standards`, `get_phase12_status` |
|
|
182
|
+
| Memory Storage | `remember_decision`, `auto_remember`, `recognize_pattern`, `record_correction`, `update_progress` |
|
|
183
|
+
| Project Management | `list_projects`, `create_project`, `init_project` |
|
|
184
|
+
| Knowledge Graph | `search_knowledge_graph`, `get_episode`, `list_episodes` |
|
|
185
|
+
| Patterns & Corrections | `get_patterns`, `get_corrections` |
|
|
186
|
+
| Feedback | `rate_memory` |
|
|
187
|
+
| Advanced Intelligence | `get_decision_timeline`, `analyze_decision_evolution`, `detect_trends`, `what_if_analysis`, `get_recommendations`, `find_cross_project_patterns` |
|
|
188
|
+
|
|
189
|
+
## License
|
|
190
|
+
|
|
191
|
+
MIT
|
package/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
0.14.
|
|
1
|
+
0.14.3
|
package/assets/CLAUDE-unified.md
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
# Claude Brain
|
|
2
|
-
|
|
3
|
-
Call `brain()` with what you are doing. The server handles the rest.
|
|
4
|
-
|
|
5
|
-
Examples:
|
|
6
|
-
- brain("starting work on the auth system")
|
|
7
|
-
- brain("decided to use JWT because sessions don't scale")
|
|
8
|
-
- brain("finished the login page, next is the dashboard")
|
|
9
|
-
- brain("what auth patterns have we used?")
|
|
10
|
-
- brain("the bug was a race condition, fixed by adding a mutex")
|
|
11
|
-
- brain("React vs Vue for the new project?")
|
|
1
|
+
# Claude Brain
|
|
2
|
+
|
|
3
|
+
Call `brain()` with what you are doing. The server handles the rest.
|
|
4
|
+
|
|
5
|
+
Examples:
|
|
6
|
+
- brain("starting work on the auth system")
|
|
7
|
+
- brain("decided to use JWT because sessions don't scale")
|
|
8
|
+
- brain("finished the login page, next is the dashboard")
|
|
9
|
+
- brain("what auth patterns have we used?")
|
|
10
|
+
- brain("the bug was a race condition, fixed by adding a mutex")
|
|
11
|
+
- brain("React vs Vue for the new project?")
|
package/assets/CLAUDE.md
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
# Claude Brain
|
|
2
|
-
|
|
3
|
-
Brain works automatically in the background — you don't need to call it.
|
|
4
|
-
|
|
5
|
-
Use the `brain` tool ONLY when you want to:
|
|
6
|
-
- Explicitly store a decision: "I decided to use Redis for caching"
|
|
7
|
-
- Ask a specific question: "What did we decide about auth?"
|
|
8
|
-
- Update something: "Changed my mind, use Postgres instead"
|
|
9
|
-
- Delete something: "Remove the note about migrations"
|
|
10
|
-
|
|
11
|
-
Everything else (session tracking, file captures, git commits, context loading) happens automatically.
|
|
1
|
+
# Claude Brain
|
|
2
|
+
|
|
3
|
+
Brain works automatically in the background — you don't need to call it.
|
|
4
|
+
|
|
5
|
+
Use the `brain` tool ONLY when you want to:
|
|
6
|
+
- Explicitly store a decision: "I decided to use Redis for caching"
|
|
7
|
+
- Ask a specific question: "What did we decide about auth?"
|
|
8
|
+
- Update something: "Changed my mind, use Postgres instead"
|
|
9
|
+
- Delete something: "Remove the note about migrations"
|
|
10
|
+
|
|
11
|
+
Everything else (session tracking, file captures, git commits, context loading) happens automatically.
|
package/bunfig.toml
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
[install]
|
|
2
|
-
# Save exact versions in package.json
|
|
3
|
-
exact = true
|
|
4
|
-
|
|
5
|
-
[test]
|
|
6
|
-
# Test configuration
|
|
7
|
-
coverage = true
|
|
8
|
-
coverageDir = "./coverage"
|
|
1
|
+
[install]
|
|
2
|
+
# Save exact versions in package.json
|
|
3
|
+
exact = true
|
|
4
|
+
|
|
5
|
+
[test]
|
|
6
|
+
# Test configuration
|
|
7
|
+
coverage = true
|
|
8
|
+
coverageDir = "./coverage"
|
package/package.json
CHANGED
|
@@ -1,80 +1,80 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "claude-brain",
|
|
3
|
-
"version": "0.14.
|
|
4
|
-
"description": "Local development assistant bridging Obsidian vaults with Claude Code via MCP",
|
|
5
|
-
"type": "module",
|
|
6
|
-
"main": "src/index.ts",
|
|
7
|
-
"bin": {
|
|
8
|
-
"claude-brain": "src/cli/bin.ts"
|
|
9
|
-
},
|
|
10
|
-
"files": [
|
|
11
|
-
"src/**/*.ts",
|
|
12
|
-
"packs/",
|
|
13
|
-
"assets/",
|
|
14
|
-
"package.json",
|
|
15
|
-
"tsconfig.json",
|
|
16
|
-
"bunfig.toml",
|
|
17
|
-
"VERSION",
|
|
18
|
-
"README.md",
|
|
19
|
-
"LICENSE"
|
|
20
|
-
],
|
|
21
|
-
"scripts": {
|
|
22
|
-
"dev": "CLAUDE_BRAIN_HOME=. bun --watch src/index.ts",
|
|
23
|
-
"build": "bun build src/index.ts --outdir dist --target bun",
|
|
24
|
-
"build:binary": "bun build src/cli/bin.ts --compile --outfile claude-brain",
|
|
25
|
-
"build:all": "bun run build:windows && bun run build:linux && bun run build:macos",
|
|
26
|
-
"build:windows": "bun build src/cli/bin.ts --compile --target=bun-windows-x64 --outfile build/claude-brain-windows.exe",
|
|
27
|
-
"build:linux": "bun build src/cli/bin.ts --compile --target=bun-linux-x64 --outfile build/claude-brain-linux",
|
|
28
|
-
"build:macos": "bun build src/cli/bin.ts --compile --target=bun-darwin-arm64 --outfile build/claude-brain-macos",
|
|
29
|
-
"start": "bun src/cli/bin.ts serve",
|
|
30
|
-
"test": "bun test",
|
|
31
|
-
"test:watch": "bun test --watch",
|
|
32
|
-
"clean": "rm -rf dist build claude-brain claude-brain.exe",
|
|
33
|
-
"setup": "bun src/cli/bin.ts setup",
|
|
34
|
-
"setup:interactive": "bun src/cli/bin.ts setup",
|
|
35
|
-
"health-check": "bun src/cli/bin.ts health",
|
|
36
|
-
"diagnose": "bun src/cli/bin.ts diagnose",
|
|
37
|
-
"migrate:chroma": "bun run src/cli/migrate-chroma.ts"
|
|
38
|
-
},
|
|
39
|
-
"keywords": [
|
|
40
|
-
"mcp",
|
|
41
|
-
"claude",
|
|
42
|
-
"obsidian",
|
|
43
|
-
"ai",
|
|
44
|
-
"development-assistant"
|
|
45
|
-
],
|
|
46
|
-
"author": "",
|
|
47
|
-
"license": "MIT",
|
|
48
|
-
"publishConfig": {
|
|
49
|
-
"access": "public"
|
|
50
|
-
},
|
|
51
|
-
"devDependencies": {
|
|
52
|
-
"@types/bun": "latest",
|
|
53
|
-
"@types/node": "^20",
|
|
54
|
-
"@types/prompts": "2.4.9",
|
|
55
|
-
"daisyui": "^5.5.14"
|
|
56
|
-
},
|
|
57
|
-
"peerDependencies": {
|
|
58
|
-
"typescript": "^5"
|
|
59
|
-
},
|
|
60
|
-
"dependencies": {
|
|
61
|
-
"@chroma-core/default-embed": "0.1.9",
|
|
62
|
-
"@modelcontextprotocol/sdk": "^1.25.2",
|
|
63
|
-
"@xenova/transformers": "2.17.2",
|
|
64
|
-
"chalk": "5.6.2",
|
|
65
|
-
"chromadb": "3.2.2",
|
|
66
|
-
"chromadb-default-embed": "2.14.0",
|
|
67
|
-
"chrono-node": "2.9.0",
|
|
68
|
-
"compromise": "^14.10.0",
|
|
69
|
-
"dotenv": "^17.2.3",
|
|
70
|
-
"gray-matter": "^4.0.3",
|
|
71
|
-
"hono": "4.11.5",
|
|
72
|
-
"lru-cache": "11.2.5",
|
|
73
|
-
"minisearch": "^6.3.0",
|
|
74
|
-
"ora": "9.2.0",
|
|
75
|
-
"pino": "^10.1.1",
|
|
76
|
-
"pino-pretty": "^13.1.3",
|
|
77
|
-
"prompts": "2.4.2",
|
|
78
|
-
"zod": "^4.3.5"
|
|
79
|
-
}
|
|
80
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "claude-brain",
|
|
3
|
+
"version": "0.14.3",
|
|
4
|
+
"description": "Local development assistant bridging Obsidian vaults with Claude Code via MCP",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "src/index.ts",
|
|
7
|
+
"bin": {
|
|
8
|
+
"claude-brain": "src/cli/bin.ts"
|
|
9
|
+
},
|
|
10
|
+
"files": [
|
|
11
|
+
"src/**/*.ts",
|
|
12
|
+
"packs/",
|
|
13
|
+
"assets/",
|
|
14
|
+
"package.json",
|
|
15
|
+
"tsconfig.json",
|
|
16
|
+
"bunfig.toml",
|
|
17
|
+
"VERSION",
|
|
18
|
+
"README.md",
|
|
19
|
+
"LICENSE"
|
|
20
|
+
],
|
|
21
|
+
"scripts": {
|
|
22
|
+
"dev": "CLAUDE_BRAIN_HOME=. bun --watch src/index.ts",
|
|
23
|
+
"build": "bun build src/index.ts --outdir dist --target bun",
|
|
24
|
+
"build:binary": "bun build src/cli/bin.ts --compile --outfile claude-brain",
|
|
25
|
+
"build:all": "bun run build:windows && bun run build:linux && bun run build:macos",
|
|
26
|
+
"build:windows": "bun build src/cli/bin.ts --compile --target=bun-windows-x64 --outfile build/claude-brain-windows.exe",
|
|
27
|
+
"build:linux": "bun build src/cli/bin.ts --compile --target=bun-linux-x64 --outfile build/claude-brain-linux",
|
|
28
|
+
"build:macos": "bun build src/cli/bin.ts --compile --target=bun-darwin-arm64 --outfile build/claude-brain-macos",
|
|
29
|
+
"start": "bun src/cli/bin.ts serve",
|
|
30
|
+
"test": "bun test",
|
|
31
|
+
"test:watch": "bun test --watch",
|
|
32
|
+
"clean": "rm -rf dist build claude-brain claude-brain.exe",
|
|
33
|
+
"setup": "bun src/cli/bin.ts setup",
|
|
34
|
+
"setup:interactive": "bun src/cli/bin.ts setup",
|
|
35
|
+
"health-check": "bun src/cli/bin.ts health",
|
|
36
|
+
"diagnose": "bun src/cli/bin.ts diagnose",
|
|
37
|
+
"migrate:chroma": "bun run src/cli/migrate-chroma.ts"
|
|
38
|
+
},
|
|
39
|
+
"keywords": [
|
|
40
|
+
"mcp",
|
|
41
|
+
"claude",
|
|
42
|
+
"obsidian",
|
|
43
|
+
"ai",
|
|
44
|
+
"development-assistant"
|
|
45
|
+
],
|
|
46
|
+
"author": "",
|
|
47
|
+
"license": "MIT",
|
|
48
|
+
"publishConfig": {
|
|
49
|
+
"access": "public"
|
|
50
|
+
},
|
|
51
|
+
"devDependencies": {
|
|
52
|
+
"@types/bun": "latest",
|
|
53
|
+
"@types/node": "^20",
|
|
54
|
+
"@types/prompts": "2.4.9",
|
|
55
|
+
"daisyui": "^5.5.14"
|
|
56
|
+
},
|
|
57
|
+
"peerDependencies": {
|
|
58
|
+
"typescript": "^5"
|
|
59
|
+
},
|
|
60
|
+
"dependencies": {
|
|
61
|
+
"@chroma-core/default-embed": "0.1.9",
|
|
62
|
+
"@modelcontextprotocol/sdk": "^1.25.2",
|
|
63
|
+
"@xenova/transformers": "2.17.2",
|
|
64
|
+
"chalk": "5.6.2",
|
|
65
|
+
"chromadb": "3.2.2",
|
|
66
|
+
"chromadb-default-embed": "2.14.0",
|
|
67
|
+
"chrono-node": "2.9.0",
|
|
68
|
+
"compromise": "^14.10.0",
|
|
69
|
+
"dotenv": "^17.2.3",
|
|
70
|
+
"gray-matter": "^4.0.3",
|
|
71
|
+
"hono": "4.11.5",
|
|
72
|
+
"lru-cache": "11.2.5",
|
|
73
|
+
"minisearch": "^6.3.0",
|
|
74
|
+
"ora": "9.2.0",
|
|
75
|
+
"pino": "^10.1.1",
|
|
76
|
+
"pino-pretty": "^13.1.3",
|
|
77
|
+
"prompts": "2.4.2",
|
|
78
|
+
"zod": "^4.3.5"
|
|
79
|
+
}
|
|
80
|
+
}
|