claude_memory 0.1.0 → 0.2.0
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.
- checksums.yaml +4 -4
- data/.claude/.mind.mv2.aLCUZd +0 -0
- data/.claude/memory.sqlite3 +0 -0
- data/.claude/rules/claude_memory.generated.md +7 -1
- data/.claude/settings.json +0 -4
- data/.claude/settings.local.json +4 -1
- data/.claude-plugin/plugin.json +1 -1
- data/.claude.json +11 -0
- data/.ruby-version +1 -0
- data/CHANGELOG.md +62 -11
- data/CLAUDE.md +87 -24
- data/README.md +76 -159
- data/docs/EXAMPLES.md +436 -0
- data/docs/RELEASE_NOTES_v0.2.0.md +179 -0
- data/docs/RUBY_COMMUNITY_POST_v0.2.0.md +582 -0
- data/docs/SOCIAL_MEDIA_v0.2.0.md +420 -0
- data/docs/architecture.md +360 -0
- data/docs/expert_review.md +1718 -0
- data/docs/feature_adoption_plan.md +1241 -0
- data/docs/feature_adoption_plan_revised.md +2374 -0
- data/docs/improvements.md +1325 -0
- data/docs/quality_review.md +1544 -0
- data/docs/review_summary.md +480 -0
- data/lefthook.yml +10 -0
- data/lib/claude_memory/cli.rb +16 -844
- data/lib/claude_memory/commands/base_command.rb +95 -0
- data/lib/claude_memory/commands/changes_command.rb +39 -0
- data/lib/claude_memory/commands/conflicts_command.rb +37 -0
- data/lib/claude_memory/commands/db_init_command.rb +40 -0
- data/lib/claude_memory/commands/doctor_command.rb +147 -0
- data/lib/claude_memory/commands/explain_command.rb +65 -0
- data/lib/claude_memory/commands/help_command.rb +37 -0
- data/lib/claude_memory/commands/hook_command.rb +106 -0
- data/lib/claude_memory/commands/ingest_command.rb +47 -0
- data/lib/claude_memory/commands/init_command.rb +218 -0
- data/lib/claude_memory/commands/promote_command.rb +30 -0
- data/lib/claude_memory/commands/publish_command.rb +36 -0
- data/lib/claude_memory/commands/recall_command.rb +61 -0
- data/lib/claude_memory/commands/registry.rb +55 -0
- data/lib/claude_memory/commands/search_command.rb +43 -0
- data/lib/claude_memory/commands/serve_mcp_command.rb +16 -0
- data/lib/claude_memory/commands/sweep_command.rb +36 -0
- data/lib/claude_memory/commands/version_command.rb +13 -0
- data/lib/claude_memory/configuration.rb +38 -0
- data/lib/claude_memory/core/fact_id.rb +41 -0
- data/lib/claude_memory/core/null_explanation.rb +47 -0
- data/lib/claude_memory/core/null_fact.rb +30 -0
- data/lib/claude_memory/core/result.rb +143 -0
- data/lib/claude_memory/core/session_id.rb +37 -0
- data/lib/claude_memory/core/token_estimator.rb +33 -0
- data/lib/claude_memory/core/transcript_path.rb +37 -0
- data/lib/claude_memory/domain/conflict.rb +51 -0
- data/lib/claude_memory/domain/entity.rb +51 -0
- data/lib/claude_memory/domain/fact.rb +70 -0
- data/lib/claude_memory/domain/provenance.rb +48 -0
- data/lib/claude_memory/hook/exit_codes.rb +18 -0
- data/lib/claude_memory/hook/handler.rb +7 -2
- data/lib/claude_memory/index/index_query.rb +89 -0
- data/lib/claude_memory/index/index_query_logic.rb +41 -0
- data/lib/claude_memory/index/query_options.rb +67 -0
- data/lib/claude_memory/infrastructure/file_system.rb +29 -0
- data/lib/claude_memory/infrastructure/in_memory_file_system.rb +32 -0
- data/lib/claude_memory/ingest/content_sanitizer.rb +42 -0
- data/lib/claude_memory/ingest/ingester.rb +3 -0
- data/lib/claude_memory/ingest/privacy_tag.rb +48 -0
- data/lib/claude_memory/mcp/tools.rb +174 -1
- data/lib/claude_memory/publish.rb +29 -20
- data/lib/claude_memory/recall.rb +164 -16
- data/lib/claude_memory/resolve/resolver.rb +41 -37
- data/lib/claude_memory/shortcuts.rb +56 -0
- data/lib/claude_memory/store/store_manager.rb +35 -32
- data/lib/claude_memory/templates/hooks.example.json +0 -4
- data/lib/claude_memory/version.rb +1 -1
- data/lib/claude_memory.rb +59 -21
- metadata +55 -1
|
@@ -0,0 +1,582 @@
|
|
|
1
|
+
# Ruby Community Posts for ClaudeMemory v0.2.0
|
|
2
|
+
|
|
3
|
+
## Ruby Weekly Submission
|
|
4
|
+
|
|
5
|
+
### Email Template
|
|
6
|
+
|
|
7
|
+
**To:** editor@rubyweekly.com
|
|
8
|
+
**Subject:** [Submission] ClaudeMemory v0.2.0 - Long-term memory for Claude Code
|
|
9
|
+
|
|
10
|
+
```
|
|
11
|
+
Hi Ruby Weekly team,
|
|
12
|
+
|
|
13
|
+
I'd like to submit ClaudeMemory v0.2.0 for consideration.
|
|
14
|
+
|
|
15
|
+
**Title:** ClaudeMemory v0.2.0 – Privacy-first long-term memory for Claude Code
|
|
16
|
+
|
|
17
|
+
**Short Description:**
|
|
18
|
+
A Ruby gem providing persistent memory for Claude Code. V0.2.0 adds privacy tags for sensitive data, progressive disclosure (10x token reduction), and semantic shortcuts. Built with Ruby 3.2+, Sequel, and SQLite. 583 test examples, zero external dependencies.
|
|
19
|
+
|
|
20
|
+
**Link:** https://github.com/codenamev/claude_memory
|
|
21
|
+
|
|
22
|
+
**Release Notes:** https://github.com/codenamev/claude_memory/blob/main/docs/RELEASE_NOTES_v0.2.0.md
|
|
23
|
+
|
|
24
|
+
**Why interesting for Ruby developers:**
|
|
25
|
+
- Clean Ruby architecture with DDD principles
|
|
26
|
+
- Sequel ORM usage patterns
|
|
27
|
+
- SQLite FTS5 for full-text search
|
|
28
|
+
- Value objects and null objects in Ruby
|
|
29
|
+
- 583 RSpec examples with 100% critical path coverage
|
|
30
|
+
|
|
31
|
+
Thanks for your consideration!
|
|
32
|
+
|
|
33
|
+
Valentino Stoll
|
|
34
|
+
https://github.com/codenamev
|
|
35
|
+
valentino@hanamirb.org
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## Reddit r/ruby Post
|
|
41
|
+
|
|
42
|
+
### Title
|
|
43
|
+
```
|
|
44
|
+
[Release] ClaudeMemory v0.2.0 - Privacy-first long-term memory for Claude Code
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### Post Body
|
|
48
|
+
|
|
49
|
+
```markdown
|
|
50
|
+
Hi r/ruby!
|
|
51
|
+
|
|
52
|
+
I'm excited to share **ClaudeMemory v0.2.0**, a Ruby gem that gives Claude Code persistent memory across conversations.
|
|
53
|
+
|
|
54
|
+
## What Problem Does It Solve?
|
|
55
|
+
|
|
56
|
+
Claude Code (and most AI coding assistants) forget everything after each session. You have to repeatedly explain your tech stack, preferences, and decisions. ClaudeMemory solves this by automatically extracting and storing durable facts.
|
|
57
|
+
|
|
58
|
+
## Example Workflow
|
|
59
|
+
|
|
60
|
+
**Session 1:**
|
|
61
|
+
```ruby
|
|
62
|
+
You: "I'm building a Rails 7 app with PostgreSQL, deploying to Heroku"
|
|
63
|
+
Claude: [helps with setup]
|
|
64
|
+
# Behind the scenes: facts stored automatically
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
**Session 2 (weeks later):**
|
|
68
|
+
```ruby
|
|
69
|
+
You: "Help me add a background job"
|
|
70
|
+
Claude: "Based on my memory, you're using Rails 7 with PostgreSQL..."
|
|
71
|
+
# Claude recalls context automatically
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
## What's New in v0.2.0
|
|
75
|
+
|
|
76
|
+
### 🔒 Privacy Tag System
|
|
77
|
+
|
|
78
|
+
Exclude sensitive data from memory:
|
|
79
|
+
|
|
80
|
+
```ruby
|
|
81
|
+
"API key is <private>sk-abc123</private>"
|
|
82
|
+
# Sanitized to: "API key is "
|
|
83
|
+
# The key is NEVER stored or indexed
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
Implementation uses a comprehensive `ContentSanitizer` module with:
|
|
87
|
+
- Support for `<private>`, `<no-memory>`, `<secret>` tags
|
|
88
|
+
- ReDoS protection (100-tag limit)
|
|
89
|
+
- 100% test coverage for security-critical code
|
|
90
|
+
- Safe handling of malformed/nested tags
|
|
91
|
+
|
|
92
|
+
### ⚡ Progressive Disclosure (10x Performance)
|
|
93
|
+
|
|
94
|
+
Two-phase query system reduces token usage:
|
|
95
|
+
|
|
96
|
+
```ruby
|
|
97
|
+
# Phase 1: Lightweight index
|
|
98
|
+
recall_index(query: "database")
|
|
99
|
+
# Returns: ~50 tokens per fact (preview only)
|
|
100
|
+
|
|
101
|
+
# Phase 2: Full details on demand
|
|
102
|
+
recall_details(fact_id: 42)
|
|
103
|
+
# Returns: Complete provenance, quotes, relationships
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
**Token savings:**
|
|
107
|
+
- Before: 2,500 tokens (5 facts × 500 tokens)
|
|
108
|
+
- After: 250 tokens (5 facts × 50 tokens)
|
|
109
|
+
- **10x reduction!**
|
|
110
|
+
|
|
111
|
+
### 🎯 Semantic Shortcuts
|
|
112
|
+
|
|
113
|
+
Pre-configured queries for common use cases:
|
|
114
|
+
|
|
115
|
+
```ruby
|
|
116
|
+
memory.decisions # Architectural decisions
|
|
117
|
+
memory.conventions # Coding standards
|
|
118
|
+
memory.architecture # Framework choices
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
Implemented with a centralized `Shortcuts` query builder using predicate-based configuration.
|
|
122
|
+
|
|
123
|
+
## Technical Details
|
|
124
|
+
|
|
125
|
+
### Architecture
|
|
126
|
+
|
|
127
|
+
Clean Ruby architecture following Domain-Driven Design:
|
|
128
|
+
|
|
129
|
+
```
|
|
130
|
+
Application Layer (CLI + Commands)
|
|
131
|
+
↓
|
|
132
|
+
Core Domain Layer (Fact, Entity, Provenance, Conflict)
|
|
133
|
+
↓
|
|
134
|
+
Business Logic Layer (Recall, Resolve, Distill)
|
|
135
|
+
↓
|
|
136
|
+
Infrastructure Layer (SQLiteStore, FileSystem, Index)
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
### Tech Stack
|
|
140
|
+
|
|
141
|
+
- **Ruby:** 3.2+ with `frozen_string_literal: true`
|
|
142
|
+
- **Database:** SQLite3 (~> 2.0)
|
|
143
|
+
- **ORM:** Sequel (~> 5.0)
|
|
144
|
+
- **Testing:** RSpec with 583 examples
|
|
145
|
+
- **Linting:** Standard Ruby
|
|
146
|
+
- **FTS:** SQLite FTS5 (no vector embeddings needed)
|
|
147
|
+
|
|
148
|
+
### Code Quality
|
|
149
|
+
|
|
150
|
+
- **Value Objects:** `SessionId`, `TranscriptPath`, `FactId`, `PrivacyTag`, `QueryOptions`
|
|
151
|
+
- **Null Objects:** `NullFact`, `NullExplanation`
|
|
152
|
+
- **Command Pattern:** 16 focused command classes (CLI is 41 lines)
|
|
153
|
+
- **Query Optimization:** N+1 elimination (2N+1 → 3 queries via batch loading)
|
|
154
|
+
- **Test Coverage:** 100% for `ContentSanitizer` and `TokenEstimator`
|
|
155
|
+
|
|
156
|
+
## Installation
|
|
157
|
+
|
|
158
|
+
```bash
|
|
159
|
+
gem install claude_memory
|
|
160
|
+
claude-memory init --global
|
|
161
|
+
claude-memory doctor
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
Or add to Gemfile:
|
|
165
|
+
|
|
166
|
+
```ruby
|
|
167
|
+
gem 'claude_memory'
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
## Integration with Claude Code
|
|
171
|
+
|
|
172
|
+
ClaudeMemory integrates via:
|
|
173
|
+
|
|
174
|
+
1. **MCP Tools** - Memory operations exposed to Claude
|
|
175
|
+
2. **Hooks** - Automatic ingestion on session stop
|
|
176
|
+
3. **Skills** - `/memory` command for manual interaction
|
|
177
|
+
|
|
178
|
+
No API keys required! Uses Claude Code's own session for fact extraction.
|
|
179
|
+
|
|
180
|
+
## Example Usage
|
|
181
|
+
|
|
182
|
+
### CLI
|
|
183
|
+
|
|
184
|
+
```bash
|
|
185
|
+
# Initialize
|
|
186
|
+
claude-memory init
|
|
187
|
+
|
|
188
|
+
# Ingest content
|
|
189
|
+
claude-memory ingest --source claude_code \
|
|
190
|
+
--session-id sess-123 \
|
|
191
|
+
--transcript-path ~/.claude/projects/myproject/latest.jsonl
|
|
192
|
+
|
|
193
|
+
# Recall facts
|
|
194
|
+
claude-memory recall "database"
|
|
195
|
+
|
|
196
|
+
# Explain with provenance
|
|
197
|
+
claude-memory explain 42
|
|
198
|
+
|
|
199
|
+
# Check health
|
|
200
|
+
claude-memory doctor
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
### MCP Tools (in Claude Code)
|
|
204
|
+
|
|
205
|
+
```ruby
|
|
206
|
+
memory.recall(query: "database", scope: "project")
|
|
207
|
+
memory.store_extraction(facts: [...], entities: [...])
|
|
208
|
+
memory.promote(fact_id: 42) # Promote to global scope
|
|
209
|
+
memory.decisions # Semantic shortcut
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
## Code Examples
|
|
213
|
+
|
|
214
|
+
### Privacy Sanitization
|
|
215
|
+
|
|
216
|
+
```ruby
|
|
217
|
+
module ClaudeMemory
|
|
218
|
+
class ContentSanitizer
|
|
219
|
+
PRIVACY_TAGS = %w[private no-memory secret].freeze
|
|
220
|
+
MAX_TAGS = 100
|
|
221
|
+
|
|
222
|
+
def self.sanitize(content)
|
|
223
|
+
tag_count = 0
|
|
224
|
+
content.gsub(/<(#{PRIVACY_TAGS.join("|")})>.*?<\/\1>/mi) do
|
|
225
|
+
tag_count += 1
|
|
226
|
+
raise ReDoSError if tag_count > MAX_TAGS
|
|
227
|
+
""
|
|
228
|
+
end
|
|
229
|
+
end
|
|
230
|
+
end
|
|
231
|
+
end
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
### Progressive Disclosure
|
|
235
|
+
|
|
236
|
+
```ruby
|
|
237
|
+
module ClaudeMemory
|
|
238
|
+
class Recall
|
|
239
|
+
def recall_index(query:, limit: 10)
|
|
240
|
+
# Lightweight preview
|
|
241
|
+
facts = search_fts(query).limit(limit)
|
|
242
|
+
facts.map do |fact|
|
|
243
|
+
{
|
|
244
|
+
id: fact.id,
|
|
245
|
+
preview: "#{fact.subject} #{fact.predicate} #{fact.object}",
|
|
246
|
+
confidence: fact.confidence,
|
|
247
|
+
scope: fact.scope,
|
|
248
|
+
tokens: TokenEstimator.estimate_preview(fact) # ~50 tokens
|
|
249
|
+
}
|
|
250
|
+
end
|
|
251
|
+
end
|
|
252
|
+
|
|
253
|
+
def recall_details(fact_id:)
|
|
254
|
+
# Full details with provenance
|
|
255
|
+
fact = find_fact(fact_id)
|
|
256
|
+
{
|
|
257
|
+
**fact.to_h,
|
|
258
|
+
provenance: load_provenance(fact), # Batch query
|
|
259
|
+
relationships: load_relationships(fact), # Batch query
|
|
260
|
+
tokens: TokenEstimator.estimate_full(fact) # ~500 tokens
|
|
261
|
+
}
|
|
262
|
+
end
|
|
263
|
+
end
|
|
264
|
+
end
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
### Semantic Shortcuts
|
|
268
|
+
|
|
269
|
+
```ruby
|
|
270
|
+
module ClaudeMemory
|
|
271
|
+
class Shortcuts
|
|
272
|
+
PREDICATES = {
|
|
273
|
+
decisions: %w[decision architectural_choice],
|
|
274
|
+
conventions: %w[convention coding_standard],
|
|
275
|
+
architecture: %w[uses_framework uses_database deployment_platform]
|
|
276
|
+
}.freeze
|
|
277
|
+
|
|
278
|
+
def self.build(shortcut)
|
|
279
|
+
predicates = PREDICATES[shortcut]
|
|
280
|
+
Recall.new.where(predicate: predicates)
|
|
281
|
+
end
|
|
282
|
+
end
|
|
283
|
+
end
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
## Testing
|
|
287
|
+
|
|
288
|
+
583 RSpec examples covering:
|
|
289
|
+
|
|
290
|
+
- **Unit Tests:** Domain models, value objects, query builders
|
|
291
|
+
- **Integration Tests:** Full pipeline (ingest → distill → resolve → store)
|
|
292
|
+
- **Hook Tests:** All event types with exit code verification
|
|
293
|
+
- **Security Tests:** ReDoS protection, malformed tags
|
|
294
|
+
- **Performance Tests:** N+1 query elimination, batch loading
|
|
295
|
+
|
|
296
|
+
```bash
|
|
297
|
+
bundle exec rspec
|
|
298
|
+
# 583 examples, 0 failures
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
## Performance Characteristics
|
|
302
|
+
|
|
303
|
+
- **Ingestion:** O(n) where n = transcript length
|
|
304
|
+
- **FTS Indexing:** O(n log n) via SQLite FTS5
|
|
305
|
+
- **Recall Queries:** O(log n) with FTS5 + batch loading
|
|
306
|
+
- **Memory Usage:** Minimal (SQLite memory-mapped I/O)
|
|
307
|
+
- **Disk Usage:** ~1-5MB per project (typical)
|
|
308
|
+
|
|
309
|
+
## Why SQLite and Not Vector Embeddings?
|
|
310
|
+
|
|
311
|
+
1. **Zero Dependencies** - No external services or API keys
|
|
312
|
+
2. **FTS5 Is Fast** - Full-text search is sufficient for fact recall
|
|
313
|
+
3. **Simpler Model** - Exact match > approximate semantic similarity for facts
|
|
314
|
+
4. **Local First** - Everything stored locally, no network calls
|
|
315
|
+
5. **Proven Tech** - SQLite is battle-tested and embedded everywhere
|
|
316
|
+
|
|
317
|
+
Future versions may add optional vector search for semantic similarity, but FTS5 covers 95% of use cases.
|
|
318
|
+
|
|
319
|
+
## Roadmap
|
|
320
|
+
|
|
321
|
+
### v0.3.0 (Planned)
|
|
322
|
+
- Optional vector embeddings for semantic search
|
|
323
|
+
- Multi-project memory sharing
|
|
324
|
+
- Memory export/import utilities
|
|
325
|
+
- Web dashboard for visualization
|
|
326
|
+
|
|
327
|
+
### Long-term
|
|
328
|
+
- Team collaboration features
|
|
329
|
+
- Memory analytics and insights
|
|
330
|
+
- Plugin marketplace integration
|
|
331
|
+
|
|
332
|
+
## Contributing
|
|
333
|
+
|
|
334
|
+
Contributions welcome! The codebase uses:
|
|
335
|
+
|
|
336
|
+
- **SOLID principles** throughout
|
|
337
|
+
- **Domain-Driven Design** with rich models
|
|
338
|
+
- **Dependency injection** for testability
|
|
339
|
+
- **Standard Ruby** for linting
|
|
340
|
+
|
|
341
|
+
See [CLAUDE.md](https://github.com/codenamev/claude_memory/blob/main/CLAUDE.md) for development setup and architecture docs.
|
|
342
|
+
|
|
343
|
+
## Links
|
|
344
|
+
|
|
345
|
+
- **GitHub:** https://github.com/codenamev/claude_memory
|
|
346
|
+
- **RubyGems:** https://rubygems.org/gems/claude_memory
|
|
347
|
+
- **Examples:** https://github.com/codenamev/claude_memory/blob/main/docs/EXAMPLES.md
|
|
348
|
+
- **Architecture:** https://github.com/codenamev/claude_memory/blob/main/docs/architecture.md
|
|
349
|
+
- **Changelog:** https://github.com/codenamev/claude_memory/blob/main/CHANGELOG.md
|
|
350
|
+
|
|
351
|
+
## Questions?
|
|
352
|
+
|
|
353
|
+
Happy to answer questions about:
|
|
354
|
+
- Implementation details
|
|
355
|
+
- Architecture decisions (why DDD, why Sequel, etc.)
|
|
356
|
+
- Performance optimizations
|
|
357
|
+
- Security considerations
|
|
358
|
+
- Claude Code integration
|
|
359
|
+
|
|
360
|
+
Feel free to ask here or open a GitHub discussion!
|
|
361
|
+
|
|
362
|
+
---
|
|
363
|
+
|
|
364
|
+
**Built with ❤️ by [Valentino Stoll](https://github.com/codenamev)**
|
|
365
|
+
```
|
|
366
|
+
|
|
367
|
+
---
|
|
368
|
+
|
|
369
|
+
## Ruby Flow Post
|
|
370
|
+
|
|
371
|
+
### Title
|
|
372
|
+
```
|
|
373
|
+
ClaudeMemory v0.2.0: Privacy-First Memory System for Claude Code
|
|
374
|
+
```
|
|
375
|
+
|
|
376
|
+
### Body
|
|
377
|
+
|
|
378
|
+
```markdown
|
|
379
|
+
Just released ClaudeMemory v0.2.0! 🚀
|
|
380
|
+
|
|
381
|
+
A Ruby gem providing long-term memory for Claude Code with privacy tags, progressive disclosure, and semantic shortcuts.
|
|
382
|
+
|
|
383
|
+
**Tech Stack:**
|
|
384
|
+
- Ruby 3.2+
|
|
385
|
+
- Sequel ORM
|
|
386
|
+
- SQLite3 + FTS5
|
|
387
|
+
- RSpec (583 examples)
|
|
388
|
+
- Standard Ruby linting
|
|
389
|
+
|
|
390
|
+
**New in v0.2.0:**
|
|
391
|
+
🔒 Privacy tags: `<private>secret</private>` never stored
|
|
392
|
+
⚡ 10x token reduction with progressive disclosure
|
|
393
|
+
🎯 Semantic shortcuts (decisions, conventions, architecture)
|
|
394
|
+
✅ 100% coverage for security-critical modules
|
|
395
|
+
|
|
396
|
+
**Architecture Highlights:**
|
|
397
|
+
- Domain-Driven Design with value objects
|
|
398
|
+
- N+1 query elimination (2N+1 → 3 queries)
|
|
399
|
+
- Command Pattern (CLI: 41 lines → 16 command classes)
|
|
400
|
+
- Null Object Pattern for clean code
|
|
401
|
+
|
|
402
|
+
```bash
|
|
403
|
+
gem install claude_memory
|
|
404
|
+
claude-memory init --global
|
|
405
|
+
```
|
|
406
|
+
|
|
407
|
+
GitHub: https://github.com/codenamev/claude_memory
|
|
408
|
+
|
|
409
|
+
Ask me anything about the implementation!
|
|
410
|
+
```
|
|
411
|
+
|
|
412
|
+
---
|
|
413
|
+
|
|
414
|
+
## Ruby Rogues Podcast Pitch (Optional)
|
|
415
|
+
|
|
416
|
+
### Email Template
|
|
417
|
+
|
|
418
|
+
**To:** rubyrogues@devchat.tv
|
|
419
|
+
**Subject:** Podcast Topic Idea: Building AI Memory Systems with Ruby
|
|
420
|
+
|
|
421
|
+
```
|
|
422
|
+
Hi Ruby Rogues team,
|
|
423
|
+
|
|
424
|
+
I'd love to discuss a potential podcast topic: building production-ready AI memory systems using Ruby.
|
|
425
|
+
|
|
426
|
+
I recently released ClaudeMemory v0.2.0, a Ruby gem that provides persistent memory for Claude Code. The project showcases several interesting Ruby patterns:
|
|
427
|
+
|
|
428
|
+
**Technical Topics:**
|
|
429
|
+
- Domain-Driven Design in Ruby (value objects, domain models)
|
|
430
|
+
- SQLite FTS5 for full-text search (no vector embeddings needed)
|
|
431
|
+
- Sequel ORM patterns and query optimization
|
|
432
|
+
- Security considerations (ReDoS protection, content sanitization)
|
|
433
|
+
- Testing strategy (583 examples, 100% critical path coverage)
|
|
434
|
+
- Command Pattern for CLI design (881 → 41 lines)
|
|
435
|
+
|
|
436
|
+
**Broader Themes:**
|
|
437
|
+
- Building AI tools with Ruby (why Ruby is great for this)
|
|
438
|
+
- Privacy-first design in AI systems
|
|
439
|
+
- Token economics and performance optimization
|
|
440
|
+
- Local-first software architecture
|
|
441
|
+
- Integration patterns (MCP, hooks, skills)
|
|
442
|
+
|
|
443
|
+
**Project Stats:**
|
|
444
|
+
- Ruby 3.2+, Sequel, SQLite3
|
|
445
|
+
- 583 RSpec examples
|
|
446
|
+
- Zero external dependencies
|
|
447
|
+
- GitHub: https://github.com/codenamev/claude_memory
|
|
448
|
+
|
|
449
|
+
Would this be a good fit for an upcoming episode? Happy to discuss the technical details and lessons learned from building this system.
|
|
450
|
+
|
|
451
|
+
Thanks for your consideration!
|
|
452
|
+
|
|
453
|
+
Valentino Stoll
|
|
454
|
+
valentino@hanamirb.org
|
|
455
|
+
https://github.com/codenamev
|
|
456
|
+
```
|
|
457
|
+
|
|
458
|
+
---
|
|
459
|
+
|
|
460
|
+
## Ruby Together Announcement (Optional)
|
|
461
|
+
|
|
462
|
+
### Template
|
|
463
|
+
|
|
464
|
+
```markdown
|
|
465
|
+
# ClaudeMemory: A Ruby Gem for AI Memory
|
|
466
|
+
|
|
467
|
+
The Ruby community has a new tool for working with AI coding assistants: ClaudeMemory v0.2.0.
|
|
468
|
+
|
|
469
|
+
## What It Does
|
|
470
|
+
|
|
471
|
+
ClaudeMemory provides persistent memory for Claude Code, automatically extracting and storing facts about your projects, preferences, and decisions. Built entirely in Ruby with SQLite.
|
|
472
|
+
|
|
473
|
+
## Why It Matters for Ruby
|
|
474
|
+
|
|
475
|
+
1. **Showcases Ruby's Strengths:** Domain-Driven Design, clean OOP, expressive DSLs
|
|
476
|
+
2. **Zero Dependencies:** Pure Ruby with SQLite (no external services)
|
|
477
|
+
3. **Production Ready:** 583 test examples, 100% critical path coverage
|
|
478
|
+
4. **Open Source:** MIT licensed, contributions welcome
|
|
479
|
+
|
|
480
|
+
## Technical Highlights
|
|
481
|
+
|
|
482
|
+
- Sequel ORM for database access
|
|
483
|
+
- SQLite FTS5 for full-text search
|
|
484
|
+
- Value objects and null objects
|
|
485
|
+
- Command Pattern for CLI
|
|
486
|
+
- Progressive disclosure for performance
|
|
487
|
+
|
|
488
|
+
## Links
|
|
489
|
+
|
|
490
|
+
- GitHub: https://github.com/codenamev/claude_memory
|
|
491
|
+
- RubyGems: https://rubygems.org/gems/claude_memory
|
|
492
|
+
- Architecture Docs: https://github.com/codenamev/claude_memory/blob/main/docs/architecture.md
|
|
493
|
+
|
|
494
|
+
Built by Valentino Stoll ([@codenamev](https://github.com/codenamev))
|
|
495
|
+
```
|
|
496
|
+
|
|
497
|
+
---
|
|
498
|
+
|
|
499
|
+
## Usage Recommendations
|
|
500
|
+
|
|
501
|
+
### Timing
|
|
502
|
+
1. **Ruby Weekly:** Submit immediately after GitHub release
|
|
503
|
+
2. **Reddit r/ruby:** Post 1-2 days after release
|
|
504
|
+
3. **Ruby Flow:** Cross-post same day as Reddit
|
|
505
|
+
4. **Ruby Rogues:** Reach out 1-2 weeks after release (after gathering feedback)
|
|
506
|
+
5. **Ruby Together:** Optional announcement if project gains traction
|
|
507
|
+
|
|
508
|
+
### Engagement Tips
|
|
509
|
+
1. **Be Active:** Respond to comments and questions within 24 hours
|
|
510
|
+
2. **Show Code:** Include implementation details when asked
|
|
511
|
+
3. **Be Humble:** Acknowledge limitations and areas for improvement
|
|
512
|
+
4. **Credit Others:** Mention Ruby gems and tools that inspired you
|
|
513
|
+
5. **Link Generously:** Point to docs, examples, and architecture details
|
|
514
|
+
|
|
515
|
+
### Follow-up Ideas
|
|
516
|
+
1. **Blog Post:** "Building a Privacy-First AI Memory System with Ruby"
|
|
517
|
+
2. **Conference Talk:** Submit to RubyConf or regional Ruby conferences
|
|
518
|
+
3. **Screencast:** Record a 10-minute demo for YouTube
|
|
519
|
+
4. **Podcast:** Reach out to Ruby on Rails Podcast or Bike Shed
|
|
520
|
+
5. **Tutorial:** Write a step-by-step guide for Ruby developers
|
|
521
|
+
|
|
522
|
+
---
|
|
523
|
+
|
|
524
|
+
## Community Engagement Script
|
|
525
|
+
|
|
526
|
+
When people ask questions, use this framework:
|
|
527
|
+
|
|
528
|
+
### For Architecture Questions
|
|
529
|
+
```
|
|
530
|
+
Great question! ClaudeMemory uses [concept] because [reason].
|
|
531
|
+
|
|
532
|
+
The specific implementation is in [file]:
|
|
533
|
+
[code snippet]
|
|
534
|
+
|
|
535
|
+
More details in the architecture doc: [link]
|
|
536
|
+
```
|
|
537
|
+
|
|
538
|
+
### For Performance Questions
|
|
539
|
+
```
|
|
540
|
+
Performance was a key focus for v0.2.0. Here's what we did:
|
|
541
|
+
|
|
542
|
+
1. [Optimization 1] - [Result]
|
|
543
|
+
2. [Optimization 2] - [Result]
|
|
544
|
+
|
|
545
|
+
Benchmarks show [metric].
|
|
546
|
+
|
|
547
|
+
Implementation details: [link]
|
|
548
|
+
```
|
|
549
|
+
|
|
550
|
+
### For Comparison Questions
|
|
551
|
+
```
|
|
552
|
+
Good question! Here's how ClaudeMemory compares to [alternative]:
|
|
553
|
+
|
|
554
|
+
ClaudeMemory:
|
|
555
|
+
- Pro: [advantages]
|
|
556
|
+
- Con: [tradeoffs]
|
|
557
|
+
|
|
558
|
+
[Alternative]:
|
|
559
|
+
- Pro: [advantages]
|
|
560
|
+
- Con: [tradeoffs]
|
|
561
|
+
|
|
562
|
+
The right choice depends on [use case].
|
|
563
|
+
```
|
|
564
|
+
|
|
565
|
+
### For Contributing Questions
|
|
566
|
+
```
|
|
567
|
+
Thanks for your interest in contributing!
|
|
568
|
+
|
|
569
|
+
The best places to start:
|
|
570
|
+
1. [Easy issue or area]
|
|
571
|
+
2. [Medium complexity area]
|
|
572
|
+
|
|
573
|
+
Development setup:
|
|
574
|
+
```bash
|
|
575
|
+
git clone https://github.com/codenamev/claude_memory
|
|
576
|
+
cd claude_memory
|
|
577
|
+
bin/setup
|
|
578
|
+
bundle exec rspec
|
|
579
|
+
```
|
|
580
|
+
|
|
581
|
+
See CLAUDE.md for architecture details: [link]
|
|
582
|
+
```
|