mirror of
https://github.com/thedotmack/claude-mem
synced 2026-04-25 17:15:04 +02:00
Release v6.5.1: Product Hunt Launch Day UI Updates
- Decorative Product Hunt announcement in terminal with rocket borders - Product Hunt badge in viewer header with theme-aware switching - Badge uses separate tracking URL for analytics 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -10,7 +10,7 @@
|
||||
"plugins": [
|
||||
{
|
||||
"name": "claude-mem",
|
||||
"version": "6.5.0",
|
||||
"version": "6.5.1",
|
||||
"source": "./plugin",
|
||||
"description": "Persistent memory system for Claude Code - context compression across sessions"
|
||||
}
|
||||
|
||||
14
.mcp.json
Normal file
14
.mcp.json
Normal file
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"mcpServers": {
|
||||
"old-claude-mem": {
|
||||
"command": "uvx",
|
||||
"args": [
|
||||
"chroma-mcp",
|
||||
"--client-type",
|
||||
"persistent",
|
||||
"--data-dir",
|
||||
"/Users/alexnewman/.claude-mem/backups/chroma-backup-20251005-222403"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -6,7 +6,7 @@
|
||||
|
||||
Claude-mem is a Claude Code plugin providing persistent memory across sessions. It captures tool usage, compresses observations using the Claude Agent SDK, and injects relevant context into future sessions.
|
||||
|
||||
**Current Version**: 6.5.0
|
||||
**Current Version**: 6.5.1
|
||||
|
||||
## Architecture
|
||||
|
||||
|
||||
@@ -201,33 +201,110 @@ module.exports = {
|
||||
|
||||
## Context Injection Configuration
|
||||
|
||||
### CLAUDE_MEM_CONTEXT_OBSERVATIONS
|
||||
Claude-Mem injects past observations into each new session, giving Claude awareness of recent work. You can configure exactly what gets injected using the **Context Settings Modal**.
|
||||
|
||||
Controls how many observations are injected into each new session for context continuity.
|
||||
### Context Settings Modal
|
||||
|
||||
**Default**: 50 observations
|
||||
Access the settings modal from the web viewer at http://localhost:37777:
|
||||
|
||||
**What it does**:
|
||||
- Fetches the most recent N observations from the database
|
||||
- Injects them as context at SessionStart
|
||||
- Allows Claude to maintain awareness of recent work across sessions
|
||||
1. Click the **gear icon** in the header
|
||||
2. Adjust settings in the right panel
|
||||
3. See changes reflected live in the **Terminal Preview** on the left
|
||||
4. Settings auto-save as you change them
|
||||
|
||||
**Configuration** in `~/.claude/settings.json`:
|
||||
The Terminal Preview shows exactly what will be injected at the start of your next Claude Code session for the selected project.
|
||||
|
||||
```json
|
||||
{
|
||||
"env": {
|
||||
"CLAUDE_MEM_CONTEXT_OBSERVATIONS": "100"
|
||||
}
|
||||
}
|
||||
```
|
||||
### Loading Settings
|
||||
|
||||
Control how many observations are injected:
|
||||
|
||||
| Setting | Default | Range | Description |
|
||||
|---------|---------|-------|-------------|
|
||||
| **Observations** | 50 | 1-200 | Total number of recent observations to include |
|
||||
| **Sessions** | 10 | 1-50 | Number of recent sessions to pull observations from |
|
||||
|
||||
**Considerations**:
|
||||
- **Higher values** = More context but slower SessionStart and more tokens used
|
||||
- **Lower values** = Faster SessionStart but less historical awareness
|
||||
- Default of 50 balances context richness with performance
|
||||
- Default of 50 observations from 10 sessions balances context richness with performance
|
||||
|
||||
**Note**: This injects individual observations, not entire sessions. Each observation represents a single tool execution (Read, Write, Edit, etc.) that was compressed into a semantic learning.
|
||||
### Filter Settings
|
||||
|
||||
Control which observation types and concepts are included:
|
||||
|
||||
**Types** (select any combination):
|
||||
- `bugfix` - Bug fixes and error resolutions
|
||||
- `feature` - New functionality additions
|
||||
- `refactor` - Code restructuring
|
||||
- `discovery` - Learnings about how code works
|
||||
- `decision` - Architectural or design decisions
|
||||
- `change` - General code changes
|
||||
|
||||
**Concepts** (select any combination):
|
||||
- `how-it-works` - System behavior explanations
|
||||
- `why-it-exists` - Rationale for code/design
|
||||
- `what-changed` - Change summaries
|
||||
- `problem-solution` - Problem/solution pairs
|
||||
- `gotcha` - Edge cases and pitfalls
|
||||
- `pattern` - Recurring patterns
|
||||
- `trade-off` - Design trade-offs
|
||||
|
||||
Use "All" or "None" buttons to quickly select/deselect all options.
|
||||
|
||||
### Display Settings
|
||||
|
||||
Control how observations appear in the context:
|
||||
|
||||
**Full Observations**:
|
||||
| Setting | Default | Options | Description |
|
||||
|---------|---------|---------|-------------|
|
||||
| **Count** | 5 | 0-20 | How many observations show expanded details |
|
||||
| **Field** | narrative | narrative, facts | Which field to expand |
|
||||
|
||||
The most recent N observations (set by Count) show their full narrative or facts. Remaining observations show only title, type, and token counts in a compact table format.
|
||||
|
||||
**Token Economics** (toggles):
|
||||
| Setting | Default | Description |
|
||||
|---------|---------|-------------|
|
||||
| **Read cost** | true | Show tokens to read each observation |
|
||||
| **Work investment** | true | Show tokens spent creating the observation |
|
||||
| **Savings** | true | Show total tokens saved by reusing context |
|
||||
|
||||
Token economics help you understand the value of cached observations vs. re-reading files.
|
||||
|
||||
### Advanced Settings
|
||||
|
||||
| Setting | Default | Description |
|
||||
|---------|---------|-------------|
|
||||
| **Model** | claude-haiku-4-5 | AI model for generating observations |
|
||||
| **Worker Port** | 37777 | Port for background worker service |
|
||||
| **MCP search server** | true | Enable Model Context Protocol search tools |
|
||||
| **Include last summary** | false | Add previous session's summary to context |
|
||||
| **Include last message** | false | Add previous session's final message |
|
||||
|
||||
### Manual Configuration
|
||||
|
||||
Settings are stored in `~/.claude-mem/settings.json`. You can also configure via environment variables in `~/.claude/settings.json`:
|
||||
|
||||
```json
|
||||
{
|
||||
"env": {
|
||||
"CLAUDE_MEM_CONTEXT_OBSERVATIONS": "100",
|
||||
"CLAUDE_MEM_CONTEXT_SESSION_COUNT": "20",
|
||||
"CLAUDE_MEM_CONTEXT_OBSERVATION_TYPES": "bugfix,decision,discovery",
|
||||
"CLAUDE_MEM_CONTEXT_OBSERVATION_CONCEPTS": "how-it-works,gotcha",
|
||||
"CLAUDE_MEM_CONTEXT_FULL_COUNT": "10",
|
||||
"CLAUDE_MEM_CONTEXT_FULL_FIELD": "narrative",
|
||||
"CLAUDE_MEM_CONTEXT_SHOW_READ_TOKENS": "true",
|
||||
"CLAUDE_MEM_CONTEXT_SHOW_WORK_TOKENS": "true",
|
||||
"CLAUDE_MEM_CONTEXT_SHOW_SAVINGS_AMOUNT": "true",
|
||||
"CLAUDE_MEM_CONTEXT_SHOW_LAST_SUMMARY": "false",
|
||||
"CLAUDE_MEM_CONTEXT_SHOW_LAST_MESSAGE": "false"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**Note**: The Context Settings Modal is the recommended way to configure these settings, as it provides live preview of changes.
|
||||
|
||||
## Customization
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "claude-mem",
|
||||
"version": "6.5.0",
|
||||
"version": "6.5.1",
|
||||
"description": "Memory compression system for Claude Code - persist context across sessions",
|
||||
"keywords": [
|
||||
"claude",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "claude-mem",
|
||||
"version": "6.5.0",
|
||||
"version": "6.5.1",
|
||||
"description": "Persistent memory system for Claude Code - seamlessly preserve context across sessions",
|
||||
"author": {
|
||||
"name": "Alex Newman"
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#!/usr/bin/env node
|
||||
import{execSync as A}from"child_process";import{join as c}from"path";import{homedir as d}from"os";import{existsSync as C}from"fs";import x from"path";import{homedir as E}from"os";import{existsSync as k,readFileSync as R}from"fs";import{join as t,dirname as T,basename as U}from"path";import{homedir as u}from"os";import{fileURLToPath as y}from"url";function w(){return typeof __dirname<"u"?__dirname:T(y(import.meta.url))}var H=w(),e=process.env.CLAUDE_MEM_DATA_DIR||t(u(),".claude-mem"),a=process.env.CLAUDE_CONFIG_DIR||t(u(),".claude"),W=t(e,"archives"),j=t(e,"logs"),N=t(e,"trash"),$=t(e,"backups"),F=t(e,"settings.json"),K=t(e,"claude-mem.db"),B=t(e,"vector-db"),G=t(a,"settings.json"),V=t(a,"commands"),J=t(a,"CLAUDE.md");function l(){try{let o=x.join(E(),".claude-mem","settings.json");if(k(o)){let s=JSON.parse(R(o,"utf-8")),n=parseInt(s.env?.CLAUDE_MEM_WORKER_PORT,10);if(!isNaN(n))return n}}catch{}return parseInt(process.env.CLAUDE_MEM_WORKER_PORT||"37777",10)}var P=c(d(),".claude","plugins","marketplaces","thedotmack"),S=c(P,"node_modules");C(S)||(console.error(`
|
||||
import{execSync as P}from"child_process";import{join as a}from"path";import{homedir as f}from"os";import{existsSync as S}from"fs";import k from"path";import{homedir as A}from"os";import{existsSync as R,readFileSync as C}from"fs";import{join as t,dirname as w,basename as L}from"path";import{homedir as l}from"os";import{fileURLToPath as x}from"url";function E(){return typeof __dirname<"u"?__dirname:w(x(import.meta.url))}var j=E(),o=process.env.CLAUDE_MEM_DATA_DIR||t(l(),".claude-mem"),c=process.env.CLAUDE_CONFIG_DIR||t(l(),".claude"),N=t(o,"archives"),$=t(o,"logs"),F=t(o,"trash"),K=t(o,"backups"),B=t(o,"settings.json"),G=t(o,"claude-mem.db"),V=t(o,"vector-db"),J=t(c,"settings.json"),Y=t(c,"commands"),Z=t(c,"CLAUDE.md");function d(){try{let r=k.join(A(),".claude-mem","settings.json");if(R(r)){let s=JSON.parse(C(r,"utf-8")),n=parseInt(s.env?.CLAUDE_MEM_WORKER_PORT,10);if(!isNaN(n))return n}}catch{}return parseInt(process.env.CLAUDE_MEM_WORKER_PORT||"37777",10)}var v=a(f(),".claude","plugins","marketplaces","thedotmack"),I=a(v,"node_modules");S(I)||(console.error(`
|
||||
---
|
||||
\u{1F389} Note: This appears under Plugin Hook Error, but it's not an error. That's the only option for
|
||||
user messages in Claude Code UI until a better method is provided.
|
||||
@@ -17,7 +17,17 @@ Dependencies have been installed in the background. This only happens once.
|
||||
Thank you for installing Claude-Mem!
|
||||
|
||||
This message was not added to your startup context, so you can continue working as normal.
|
||||
`),process.exit(3));try{let o=c(d(),".claude","plugins","marketplaces","thedotmack","plugin","scripts","context-hook.js"),s=A(`node "${o}" --colors`,{encoding:"utf8"}),n=l(),r=new Date,f=new Date("2025-12-06T00:00:00Z"),i="";if(r<f){let g=r.getUTCHours()*60+r.getUTCMinutes(),m=Math.floor((g-300+1440)%1440/60),p=r.getUTCDate(),h=r.getUTCMonth(),D=r.getUTCFullYear()===2025&&h===11&&p>=1&&p<=5,_=m>=17&&m<19;D&&_?i=`
|
||||
`),process.exit(3));try{let r=a(f(),".claude","plugins","marketplaces","thedotmack","plugin","scripts","context-hook.js"),s=P(`node "${r}" --colors`,{encoding:"utf8"}),n=d(),e=new Date,g=new Date("2025-12-06T00:00:00Z"),h=new Date("2025-12-05T05:00:00Z"),m="";e<h&&(m=`
|
||||
|
||||
\u{1F680} \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 \u{1F680}
|
||||
|
||||
We launched on Product Hunt!
|
||||
https://tinyurl.com/claude-mem-ph
|
||||
|
||||
\u2B50 Your upvote means the world - thank you!
|
||||
|
||||
\u{1F680} \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 \u{1F680}
|
||||
`);let i="";if(e<g){let D=e.getUTCHours()*60+e.getUTCMinutes(),p=Math.floor((D-300+1440)%1440/60),u=e.getUTCDate(),y=e.getUTCMonth(),T=e.getUTCFullYear()===2025&&y===11&&u>=1&&u<=5,_=p>=17&&p<19;T&&_?i=`
|
||||
\u{1F534} LIVE NOW: AMA w/ Dev (@thedotmack) until 7pm EST
|
||||
`:i=`
|
||||
\u2013 LIVE AMA w/ Dev (@thedotmack) Dec 1st\u20135th, 5pm to 7pm EST
|
||||
@@ -30,6 +40,6 @@ This message was not added to your startup context, so you can continue working
|
||||
|
||||
\u{1F4A1} New! Wrap all or part of any message with <private> ... </private> to prevent storing sensitive information in your observation history.
|
||||
|
||||
\u{1F4AC} Community https://discord.gg/J4wttp9vDu`+i+`
|
||||
\u{1F4AC} Community https://discord.gg/J4wttp9vDu`+m+i+`
|
||||
\u{1F4FA} Watch live in browser http://localhost:${n}/
|
||||
`)}catch(o){console.error(`\u274C Failed to load context display: ${o}`)}process.exit(3);
|
||||
`)}catch(r){console.error(`\u274C Failed to load context display: ${r}`)}process.exit(3);
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -53,6 +53,23 @@ try {
|
||||
const now = new Date();
|
||||
const amaEndDate = new Date('2025-12-06T00:00:00Z'); // Dec 5, 2025 7pm EST
|
||||
|
||||
// Product Hunt launch announcement - expires Dec 5, 2025 12am EST (05:00 UTC)
|
||||
const phLaunchEndDate = new Date('2025-12-05T05:00:00Z');
|
||||
let productHuntAnnouncement = "";
|
||||
if (now < phLaunchEndDate) {
|
||||
productHuntAnnouncement = `
|
||||
|
||||
🚀 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 🚀
|
||||
|
||||
We launched on Product Hunt!
|
||||
https://tinyurl.com/claude-mem-ph
|
||||
|
||||
⭐ Your upvote means the world - thank you!
|
||||
|
||||
🚀 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 🚀
|
||||
`;
|
||||
}
|
||||
|
||||
let amaAnnouncement = "";
|
||||
if (now < amaEndDate) {
|
||||
// Check if we're during the live event (Dec 1-5, 5pm-7pm EST daily)
|
||||
@@ -79,6 +96,7 @@ try {
|
||||
output +
|
||||
"\n\n💡 New! Wrap all or part of any message with <private> ... </private> to prevent storing sensitive information in your observation history.\n" +
|
||||
"\n💬 Community https://discord.gg/J4wttp9vDu" +
|
||||
productHuntAnnouncement +
|
||||
amaAnnouncement +
|
||||
`\n📺 Watch live in browser http://localhost:${port}/\n`
|
||||
);
|
||||
|
||||
@@ -26,6 +26,12 @@ export function Header({
|
||||
onThemeChange,
|
||||
onContextPreviewToggle
|
||||
}: HeaderProps) {
|
||||
// Resolve effective theme for Product Hunt badge
|
||||
const isDark = themePreference === 'dark' ||
|
||||
(themePreference === 'system' && window.matchMedia('(prefers-color-scheme: dark)').matches);
|
||||
const phBadgeTheme = isDark ? 'dark' : 'light';
|
||||
const phBadgeUrl = `https://api.producthunt.com/widgets/embed-image/v1/featured.svg?post_id=1045833&theme=${phBadgeTheme}`;
|
||||
|
||||
return (
|
||||
<div className="header">
|
||||
<h1>
|
||||
@@ -40,6 +46,20 @@ export function Header({
|
||||
<span className="logo-text">claude-mem</span>
|
||||
</h1>
|
||||
<div className="status">
|
||||
<a
|
||||
href="https://www.producthunt.com/products/claude-mem?embed=true&utm_source=badge-featured&utm_medium=badge&utm_source=badge-claude-mem"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
style={{ display: 'flex', alignItems: 'center' }}
|
||||
>
|
||||
<img
|
||||
src={phBadgeUrl}
|
||||
alt="Claude-Mem on Product Hunt"
|
||||
style={{ width: '180px', height: '40px' }}
|
||||
width="180"
|
||||
height="40"
|
||||
/>
|
||||
</a>
|
||||
<GitHubStarsButton username="thedotmack" repo="claude-mem" />
|
||||
<a
|
||||
href="https://discord.gg/J4wttp9vDu"
|
||||
|
||||
Reference in New Issue
Block a user