Skip to content

Commit 773f962

Browse files
Claudeclaude
authored andcommitted
feat: add ripple brand mark ((●)) to CLI output
Adds the ripple symbol as GitMem's ASCII brand mark — a memory node radiating outward. Prepended to every productLine() output via exported RIPPLE constant. Dim outer ring, red inner ring, bold center dot. Documents the mark in cli-ux-guidelines.md. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent f048cfa commit 773f962

File tree

3 files changed

+46
-21
lines changed

3 files changed

+46
-21
lines changed

docs/cli-ux-guidelines.md

Lines changed: 33 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -150,21 +150,35 @@ The severity brackets (`[!!]`, `[!]`, `[~]`, `[-]`) are 4 chars wide including b
150150

151151
## Layout Structure
152152

153+
### Brand Mark (Ripple)
154+
155+
The **ripple** `((●))` is GitMem's brand mark — a memory node radiating outward. It precedes the product name on every product line.
156+
157+
```
158+
{dim}({/}{red}({/}{bold}●{/}{red}){/}{dim}){/}
159+
```
160+
161+
- **Bold ``** — the core memory (center dot, U+25CF)
162+
- **Red `()`** — the inner ring (brand accent)
163+
- **Dim `()`** — the outer ring (fading outward)
164+
165+
The gradient (bold → red → dim) evokes knowledge radiating from a single point — recall, rippling through sessions. The `` is a Tier 1 safe character (U+25CF, BMP, single-width in all terminals).
166+
153167
### Product Line
154168

155-
Every display output starts with a **product line** — the tool identity. The word `gitmem` is always red:
169+
Every display output starts with a **product line** — the ripple mark, product name, and tool identity:
156170

157171
```
158-
{red}gitmem{/} ── <tool> [· <count/context>] [· <scope>]
172+
{dim}({/}{red}({/}{bold}●{/}{red}){/}{dim}){/} {red}gitmem{/} ── <tool> [· <count/context>] [· <scope>]
159173
```
160174

161175
Examples:
162176
```
163-
gitmem ── active
164-
gitmem ── log · 10 most recent · orchestra_dev
165-
gitmem ── search · 5 results · "deployment"
166-
gitmem ── threads · 12 open · 3 resolved
167-
gitmem ── recall · 3 scars · "deploy edge function"
177+
((●)) gitmem ── active
178+
((●)) gitmem ── log · 10 most recent · orchestra_dev
179+
((●)) gitmem ── search · 5 results · "deployment"
180+
((●)) gitmem ── threads · 12 open · 3 resolved
181+
((●)) gitmem ── recall · 3 scars · "deploy edge function"
168182
```
169183

170184
The `──` (U+2500 box-drawing) is the product separator. It appears in exactly one place: the product line.
@@ -228,8 +242,8 @@ In actual code these are ANSI escape sequences. Shown as tokens here for readabi
228242
### session_start
229243

230244
```
231-
{red}gitmem{/} ── active
232-
{dim}8970e043 · cli · orchestra_dev{/}
245+
{dim}({/}{red}({/}{bold}●{/}{red}){/}{dim}){/} {red}gitmem{/} ── active
246+
{dim}8970e043 · cli · orchestra_dev{/}
233247
234248
{bold}Threads (16){/}
235249
Publish "The Static LLM That Learns" blog post…
@@ -420,12 +434,12 @@ Found 3 relevant scars for your plan: ← chatbot voice
420434
**Do this instead:**
421435

422436
```
423-
gitmem ── recall · 3 scars · "your plan" ← red product name, clean layout
424-
← whitespace
425-
[!!] Title (critical, 0.87) ← red text severity
426-
← breathing room
427-
gitmem ── confirm · 3 scars addressed ← green confirmation
428-
gitmem ── confirm · REJECTED ← red rejection
437+
((●)) gitmem ── recall · 3 scars · "your plan" ← ripple + red product name
438+
← whitespace
439+
[!!] Title (critical, 0.87) ← red text severity
440+
← breathing room
441+
((●)) gitmem ── confirm · 3 scars addressed ← green confirmation
442+
((●)) gitmem ── confirm · REJECTED ← red rejection
429443
```
430444

431445
## Implementation
@@ -460,9 +474,12 @@ const TYPE = {
460474
decision: "dec",
461475
};
462476

477+
// Brand mark (ripple)
478+
const RIPPLE = `${D}(${X}${R}(${X}${B}●${X}${R})${X}${D})${X}`;
479+
463480
// Product line
464481
function productLine(tool: string, detail?: string): string {
465-
const parts = [`${R}gitmem${X} ── ${tool}`];
482+
const parts = [`${RIPPLE} ${R}gitmem${X} ── ${tool}`];
466483
if (detail) parts[0] += ` · ${detail}`;
467484
return parts[0];
468485
}

src/server.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ import {
5858
startBackgroundInit,
5959
} from "./services/startup.js";
6060
import { getEffectTracker } from "./services/effect-tracker.js";
61+
import { RIPPLE, ANSI } from "./services/display-protocol.js";
6162
import { getProject } from "./services/session-state.js";
6263
import { checkEnforcement } from "./services/enforcement.js";
6364
import {
@@ -313,8 +314,8 @@ export function createServer(): Server {
313314
const cmdLines = visibleCommands.map(c => ` ${c.alias.padEnd(22)} ${c.description}`).join("\n");
314315

315316
const display = [
316-
`gitmem v${pkg.version} · ${tier} · ${registeredTools.length} tools · ${hasSupabase() ? "supabase" : "local (.gitmem/)"}`,
317-
"Memory that compounds.",
317+
`${RIPPLE} ${ANSI.red}gitmem${ANSI.reset} v${pkg.version} · ${tier} · ${registeredTools.length} tools · ${hasSupabase() ? "supabase" : "local (.gitmem/)"}`,
318+
" Memory that compounds.",
318319
"",
319320
cmdLines,
320321
"",

src/services/display-protocol.ts

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,16 +60,23 @@ export function wrapDisplay(content: string): string {
6060
return content + DISPLAY_SUFFIX;
6161
}
6262

63+
// ---------------------------------------------------------------------------
64+
// Brand mark — ripple icon preceding product name
65+
// ---------------------------------------------------------------------------
66+
67+
/** Ripple mark: dim outer ring, red inner ring, bold center dot. */
68+
export const RIPPLE = `${dim}(${reset}${red}(${reset}${bold}${reset}${red})${reset}${dim})${reset}`;
69+
6370
// ---------------------------------------------------------------------------
6471
// Product line — first line of every tool output
6572
// ---------------------------------------------------------------------------
6673

6774
/**
68-
* Build the product line: `gitmem ── <tool> [· detail]`
69-
* The word "gitmem" is always red (brand accent).
75+
* Build the product line: `((●)) gitmem ── <tool> [· detail]`
76+
* The ripple mark + red "gitmem" form the brand identity.
7077
*/
7178
export function productLine(tool: string, detail?: string): string {
72-
let line = `${red}gitmem${reset} ── ${tool}`;
79+
let line = `${RIPPLE} ${red}gitmem${reset} ── ${tool}`;
7380
if (detail) line += ` · ${detail}`;
7481
return line;
7582
}

0 commit comments

Comments
 (0)