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": [
|
"plugins": [
|
||||||
{
|
{
|
||||||
"name": "claude-mem",
|
"name": "claude-mem",
|
||||||
"version": "6.5.0",
|
"version": "6.5.1",
|
||||||
"source": "./plugin",
|
"source": "./plugin",
|
||||||
"description": "Persistent memory system for Claude Code - context compression across sessions"
|
"description": "Persistent memory system for Claude Code - context compression across sessions"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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.
|
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
|
## Architecture
|
||||||
|
|
||||||
|
|||||||
@@ -201,33 +201,110 @@ module.exports = {
|
|||||||
|
|
||||||
## Context Injection Configuration
|
## 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**:
|
1. Click the **gear icon** in the header
|
||||||
- Fetches the most recent N observations from the database
|
2. Adjust settings in the right panel
|
||||||
- Injects them as context at SessionStart
|
3. See changes reflected live in the **Terminal Preview** on the left
|
||||||
- Allows Claude to maintain awareness of recent work across sessions
|
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
|
### Loading Settings
|
||||||
{
|
|
||||||
"env": {
|
Control how many observations are injected:
|
||||||
"CLAUDE_MEM_CONTEXT_OBSERVATIONS": "100"
|
|
||||||
}
|
| 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**:
|
**Considerations**:
|
||||||
- **Higher values** = More context but slower SessionStart and more tokens used
|
- **Higher values** = More context but slower SessionStart and more tokens used
|
||||||
- **Lower values** = Faster SessionStart but less historical awareness
|
- **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
|
## Customization
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "claude-mem",
|
"name": "claude-mem",
|
||||||
"version": "6.5.0",
|
"version": "6.5.1",
|
||||||
"description": "Memory compression system for Claude Code - persist context across sessions",
|
"description": "Memory compression system for Claude Code - persist context across sessions",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"claude",
|
"claude",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "claude-mem",
|
"name": "claude-mem",
|
||||||
"version": "6.5.0",
|
"version": "6.5.1",
|
||||||
"description": "Persistent memory system for Claude Code - seamlessly preserve context across sessions",
|
"description": "Persistent memory system for Claude Code - seamlessly preserve context across sessions",
|
||||||
"author": {
|
"author": {
|
||||||
"name": "Alex Newman"
|
"name": "Alex Newman"
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
#!/usr/bin/env node
|
#!/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
|
\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.
|
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!
|
Thank you for installing Claude-Mem!
|
||||||
|
|
||||||
This message was not added to your startup context, so you can continue working as normal.
|
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
|
\u{1F534} LIVE NOW: AMA w/ Dev (@thedotmack) until 7pm EST
|
||||||
`:i=`
|
`:i=`
|
||||||
\u2013 LIVE AMA w/ Dev (@thedotmack) Dec 1st\u20135th, 5pm to 7pm EST
|
\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{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}/
|
\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 now = new Date();
|
||||||
const amaEndDate = new Date('2025-12-06T00:00:00Z'); // Dec 5, 2025 7pm EST
|
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 = "";
|
let amaAnnouncement = "";
|
||||||
if (now < amaEndDate) {
|
if (now < amaEndDate) {
|
||||||
// Check if we're during the live event (Dec 1-5, 5pm-7pm EST daily)
|
// Check if we're during the live event (Dec 1-5, 5pm-7pm EST daily)
|
||||||
@@ -79,6 +96,7 @@ try {
|
|||||||
output +
|
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\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" +
|
"\n💬 Community https://discord.gg/J4wttp9vDu" +
|
||||||
|
productHuntAnnouncement +
|
||||||
amaAnnouncement +
|
amaAnnouncement +
|
||||||
`\n📺 Watch live in browser http://localhost:${port}/\n`
|
`\n📺 Watch live in browser http://localhost:${port}/\n`
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -26,6 +26,12 @@ export function Header({
|
|||||||
onThemeChange,
|
onThemeChange,
|
||||||
onContextPreviewToggle
|
onContextPreviewToggle
|
||||||
}: HeaderProps) {
|
}: 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 (
|
return (
|
||||||
<div className="header">
|
<div className="header">
|
||||||
<h1>
|
<h1>
|
||||||
@@ -40,6 +46,20 @@ export function Header({
|
|||||||
<span className="logo-text">claude-mem</span>
|
<span className="logo-text">claude-mem</span>
|
||||||
</h1>
|
</h1>
|
||||||
<div className="status">
|
<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" />
|
<GitHubStarsButton username="thedotmack" repo="claude-mem" />
|
||||||
<a
|
<a
|
||||||
href="https://discord.gg/J4wttp9vDu"
|
href="https://discord.gg/J4wttp9vDu"
|
||||||
|
|||||||
Reference in New Issue
Block a user