Skip to content

Commit fb8fe73

Browse files
committed
fix: rebrand Intelligent Context to Persistent Memory, fix license activation error masking
- Replace "Intelligent Context" with "Persistent Memory" as headline feature - Reorder features: Spec-Driven first, Persistent Memory last - Merge Built-in Rules and Coding Standards into single section - Compress hooks pipeline into 3-column grid on website - Remove QualifierSection from website - Rename Context7 to lib-docs in MCP servers display - Fix license activation: PILOT- keys no longer fall through to Gumroad on network errors, preventing misleading "Invalid license key" message - Add retry with 2s delay for Polar network errors - Fix installer reading JSON error from stdout instead of empty stderr
1 parent 47e6dd9 commit fb8fe73

14 files changed

Lines changed: 62 additions & 175 deletions

File tree

README.md

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -373,7 +373,7 @@ After **every single file edit**, these hooks fire:
373373
| ----------------- | -------- | ----------------------------------------------------------------------------------------------------- |
374374
| `session_end.py` | Blocking | Stops the worker daemon when no other Pilot sessions are active. Sends OS notification on completion. |
375375

376-
### Intelligent Context Management
376+
### Context Preservation
377377

378378
The context monitor tracks usage in real-time, and auto-compaction handles context limits transparently:
379379

@@ -383,9 +383,9 @@ The context monitor tracks usage in real-time, and auto-compaction handles conte
383383
- Multiple Pilot sessions can run in parallel on the same project without interference
384384
- Status line shows live context usage, memory status, active plan, and license info
385385

386-
### Built-in Rules
386+
### Built-in Rules & Standards
387387

388-
Production-tested best practices loaded into **every session**. These aren't suggestions — they're enforced standards.
388+
Production-tested best practices loaded into **every session**. These aren't suggestions — they're enforced standards. Coding standards activate conditionally by file type.
389389

390390
<details>
391391
<summary><b>Core Workflow (3 rules)</b></summary>
@@ -421,25 +421,26 @@ Production-tested best practices loaded into **every session**. These aren't sug
421421

422422
</details>
423423

424-
### Built-in Coding Standards
424+
<details>
425+
<summary><b>Coding Standards (5 standards, activated by file type)</b></summary>
425426

426-
Conditional rules activated by file type — loaded only when working with matching files:
427+
| Standard | Activates On | Coverage |
428+
| ---------- | ------------------------------------------------- | ----------------------------------------------------------- |
429+
| Python | `*.py` | uv, pytest, ruff, basedpyright, type hints |
430+
| TypeScript | `*.ts`, `*.tsx`, `*.js`, `*.jsx` | npm/pnpm, Jest, ESLint, Prettier, React patterns |
431+
| Go | `*.go` | Modules, testing, formatting, error handling |
432+
| Frontend | `*.tsx`, `*.jsx`, `*.html`, `*.vue`, `*.css` | Components, CSS, accessibility, responsive design |
433+
| Backend | `**/models/**`, `**/routes/**`, `**/api/**`, etc. | API design, data models, query optimization, migrations |
427434

428-
| Standard | Activates On | Coverage |
429-
| --------- | ------------------------------------------------ | --------------------------------------------------------------------------------- |
430-
| Python | `*.py` | uv, pytest, ruff, basedpyright, type hints, docstrings |
431-
| TypeScript| `*.ts`, `*.tsx`, `*.js`, `*.jsx` | npm/pnpm, Jest, ESLint, Prettier, React patterns |
432-
| Go | `*.go` | Modules, testing, formatting, error handling |
433-
| Frontend | `*.tsx`, `*.jsx`, `*.html`, `*.vue`, `*.css` | Components, CSS methodology, accessibility, responsive design, design principles |
434-
| Backend | `**/models/**`, `**/routes/**`, `**/api/**`, etc. | API design, data models, query optimization, migrations |
435+
</details>
435436

436437
### MCP Servers
437438

438439
External context always available to every session:
439440

440441
| Server | Purpose |
441442
| -------------- | ---------------------------------------------------------------- |
442-
| **Context7** | Library documentation lookup — get API docs for any dependency |
443+
| **lib-docs** | Library documentation lookup — get API docs for any dependency |
443444
| **mem-search** | Persistent memory search — recall context from past sessions |
444445
| **web-search** | Web search via DuckDuckGo, Bing, and Exa |
445446
| **grep-mcp** | GitHub code search — find real-world usage patterns across repos |

docs/site/index.html

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,8 +110,7 @@
110110
"Spec-Driven Development - Plan, approve, implement, verify workflow",
111111
"Quick Mode - Fast bug fixes and small changes",
112112
"Semantic Code Search - Find code by meaning with Vexor",
113-
"Persistent Memory - Context carries across sessions",
114-
"Intelligent Context - Seamless auto-compaction and persistent memory",
113+
"Persistent Memory - Context carries across sessions via Pilot Console",
115114
"Dev Container Support - Works with VS Code, Cursor, Windsurf",
116115
"Python & TypeScript - Quality hooks and linting tools"
117116
],

docs/site/src/components/DeepDiveSection.tsx

Lines changed: 23 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -109,20 +109,22 @@ const rulesCategories = [
109109
{
110110
icon: GitBranch,
111111
category: "Collaboration",
112-
rules: ["Team Vault asset sharing via sx"],
112+
rules: ["Team Vault asset sharing via sx", "Custom rules, commands & skills", "Shareable across teams via Git"],
113+
},
114+
{
115+
icon: Cpu,
116+
category: "Language Standards",
117+
rules: ["Python — uv, pytest, ruff, basedpyright", "TypeScript — npm/pnpm, Jest, ESLint, Prettier", "Go — Modules, testing, formatting, error handling"],
118+
},
119+
{
120+
icon: Layers,
121+
category: "Architecture Standards",
122+
rules: ["Frontend — Components, CSS, accessibility, responsive", "Backend — API design, data models, migrations", "Activated by file type — loaded only when needed"],
113123
},
114-
];
115-
116-
const standardsList = [
117-
{ name: "Python", desc: "uv, pytest, ruff, basedpyright, type hints", ext: "*.py" },
118-
{ name: "TypeScript", desc: "npm/pnpm, Jest, ESLint, Prettier, React", ext: "*.ts, *.tsx" },
119-
{ name: "Go", desc: "Modules, testing, formatting, error handling", ext: "*.go" },
120-
{ name: "Frontend", desc: "Components, CSS, accessibility, responsive, design", ext: "*.tsx, *.jsx, *.html, *.vue, *.css" },
121-
{ name: "Backend", desc: "API design, data models, queries, migrations", ext: "**/models/**, **/routes/**, **/api/**" },
122124
];
123125

124126
const mcpServers = [
125-
{ icon: BookOpen, name: "Context7", desc: "Library documentation lookup — get API docs for any dependency" },
127+
{ icon: BookOpen, name: "lib-docs", desc: "Library documentation lookup — get API docs for any dependency" },
126128
{ icon: Brain, name: "mem-search", desc: "Persistent memory search — recall context from past sessions" },
127129
{ icon: Globe, name: "web-search", desc: "Web search via DuckDuckGo, Bing, and Exa" },
128130
{ icon: Search, name: "grep-mcp", desc: "GitHub code search — find real-world usage patterns" },
@@ -133,7 +135,6 @@ const DeepDiveSection = () => {
133135
const [headerRef, headerInView] = useInView<HTMLDivElement>();
134136
const [hooksRef, hooksInView] = useInView<HTMLDivElement>();
135137
const [rulesRef, rulesInView] = useInView<HTMLDivElement>();
136-
const [standardsRef, standardsInView] = useInView<HTMLDivElement>();
137138
const [mcpRef, mcpInView] = useInView<HTMLDivElement>();
138139
const [contextRef, contextInView] = useInView<HTMLDivElement>();
139140

@@ -171,23 +172,23 @@ const DeepDiveSection = () => {
171172
</div>
172173
</div>
173174

174-
<div className="space-y-4">
175+
<div className="grid md:grid-cols-2 lg:grid-cols-3 gap-4">
175176
{hooksPipeline.map((stage) => (
176177
<div
177178
key={stage.trigger}
178-
className={`rounded-2xl p-5 sm:p-6 border ${stage.borderColor} bg-card/30 backdrop-blur-sm`}
179+
className={`rounded-2xl p-5 border ${stage.borderColor} bg-card/30 backdrop-blur-sm`}
179180
>
180-
<div className="flex flex-col sm:flex-row sm:items-center gap-3 mb-4">
181-
<div className={`${stage.bgColor} px-3 py-1.5 rounded-lg inline-flex items-center gap-2 w-fit`}>
181+
<div className="mb-3">
182+
<div className={`${stage.bgColor} px-3 py-1.5 rounded-lg inline-flex items-center gap-2 w-fit mb-2`}>
182183
<Terminal className={`h-4 w-4 ${stage.color}`} />
183184
<code className={`text-sm font-semibold ${stage.color}`}>{stage.trigger}</code>
184185
</div>
185-
<span className="text-sm text-muted-foreground">{stage.description}</span>
186+
<p className="text-xs text-muted-foreground">{stage.description}</p>
186187
</div>
187-
<div className="grid sm:grid-cols-2 lg:grid-cols-3 gap-2">
188+
<div className="space-y-1.5">
188189
{stage.hooks.map((hook) => (
189-
<div key={hook} className="flex items-start gap-2 text-sm text-muted-foreground">
190-
<CheckCircle2 className={`h-4 w-4 ${stage.color} flex-shrink-0 mt-0.5`} />
190+
<div key={hook} className="flex items-start gap-2 text-xs text-muted-foreground">
191+
<CheckCircle2 className={`h-3.5 w-3.5 ${stage.color} flex-shrink-0 mt-0.5`} />
191192
<span>{hook}</span>
192193
</div>
193194
))}
@@ -208,7 +209,7 @@ const DeepDiveSection = () => {
208209
</div>
209210
<div>
210211
<h3 className="text-2xl font-bold text-foreground">Context Monitor & Auto-Compaction</h3>
211-
<p className="text-sm text-muted-foreground">Intelligent context management with automatic session continuity</p>
212+
<p className="text-sm text-muted-foreground">Automatic context preservation with seamless session continuity</p>
212213
</div>
213214
</div>
214215

@@ -256,8 +257,8 @@ const DeepDiveSection = () => {
256257
<Layers className="h-5 w-5 text-primary" />
257258
</div>
258259
<div>
259-
<h3 className="text-2xl font-bold text-foreground">Built-in Rules</h3>
260-
<p className="text-sm text-muted-foreground">Loaded every session — production-tested best practices always in context</p>
260+
<h3 className="text-2xl font-bold text-foreground">Built-in Rules & Standards</h3>
261+
<p className="text-sm text-muted-foreground">Loaded every session — production-tested best practices and coding standards always in context</p>
261262
</div>
262263
</div>
263264

@@ -287,35 +288,6 @@ const DeepDiveSection = () => {
287288
</div>
288289
</div>
289290

290-
{/* Standards Grid */}
291-
<div
292-
ref={standardsRef}
293-
className={`mb-16 ${standardsInView ? "animate-fade-in-up" : "opacity-0"}`}
294-
>
295-
<div className="flex items-center gap-3 mb-8">
296-
<div className="w-10 h-10 bg-primary/10 rounded-xl flex items-center justify-center">
297-
<Cpu className="h-5 w-5 text-primary" />
298-
</div>
299-
<div>
300-
<h3 className="text-2xl font-bold text-foreground">Built-in Coding Standards</h3>
301-
<p className="text-sm text-muted-foreground">Conditional rules activated by file type — loaded only when working with matching files</p>
302-
</div>
303-
</div>
304-
305-
<div className="grid sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-3">
306-
{standardsList.map((standard) => (
307-
<div
308-
key={standard.name}
309-
className="rounded-xl p-4 border border-border/50 bg-card/30 backdrop-blur-sm hover:border-primary/30 transition-colors"
310-
>
311-
<h4 className="font-medium text-foreground text-sm mb-1">{standard.name}</h4>
312-
<p className="text-xs text-muted-foreground mb-2">{standard.desc}</p>
313-
<p className="text-[10px] text-muted-foreground/60 font-mono">{standard.ext}</p>
314-
</div>
315-
))}
316-
</div>
317-
</div>
318-
319291
{/* MCP Servers + LSP + Languages */}
320292
<div
321293
ref={mcpRef}

docs/site/src/components/HeroSection.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ const HeroSection = () => {
103103
Persistent Memory
104104
</Badge>
105105
<Badge variant="secondary" className="text-[10px] xs:text-xs">
106-
Intelligent Context
106+
Quality Hooks
107107
</Badge>
108108
<Badge variant="secondary" className="text-[10px] xs:text-xs">
109109
Team Vault

docs/site/src/components/PricingSection.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ const PricingSection = () => {
111111
</li>
112112
<li className="flex items-start gap-3">
113113
<Check className="h-5 w-5 text-primary flex-shrink-0 mt-0.5" />
114-
<span className="text-muted-foreground text-sm group-hover:text-foreground/80 transition-colors">Intelligent context management + persistent memory</span>
114+
<span className="text-muted-foreground text-sm group-hover:text-foreground/80 transition-colors">Context preservation + persistent memory</span>
115115
</li>
116116
<li className="flex items-start gap-3">
117117
<Check className="h-5 w-5 text-primary flex-shrink-0 mt-0.5" />

docs/site/src/components/QualifierSection.tsx

Lines changed: 0 additions & 91 deletions
This file was deleted.

docs/site/src/components/WhatsInside.tsx

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,6 @@ interface InsideItem {
2020
}
2121

2222
const insideItems: InsideItem[] = [
23-
{
24-
icon: InfinityIcon,
25-
title: "Intelligent Context",
26-
description: "Never lose context mid-task",
27-
summary: "Auto-compaction fires at ~83% context — hooks capture state before compaction and restore it after. No process restart, no lost context. Multiple sessions run in parallel without interference.",
28-
},
2923
{
3024
icon: Workflow,
3125
title: "Spec-Driven Development",
@@ -44,6 +38,12 @@ const insideItems: InsideItem[] = [
4438
description: "Rules · Commands · Standards",
4539
summary: "Production-tested best practices loaded every session. Coding standards activate by file type. Structured workflows via /spec, /sync, /vault, /learn. Custom rules survive updates.",
4640
},
41+
{
42+
icon: InfinityIcon,
43+
title: "Persistent Memory",
44+
description: "Context carries across sessions",
45+
summary: "Every decision, discovery, and debugging insight is captured to Pilot Console. Pick up any project after days or weeks — Claude already knows your architecture, patterns, and past work.",
46+
},
4747
{
4848
icon: Plug2,
4949
title: "Enhanced Context",

docs/site/src/content/blog/managing-context-long-sessions.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ This creates a ceiling on the complexity of work you can do with AI assistance.
9393

9494
What's needed is a way to make sessions **continuous** — to preserve the accumulated understanding across context boundaries, automatically, without manual intervention.
9595

96-
## Intelligent Context Management: Automatic Continuity
96+
## Context Preservation: Automatic Continuity
9797

9898
This is the problem that Claude Pilot's context management was designed to solve. Instead of treating the context limit as a hard wall that destroys your progress, auto-compaction turns it into a seamless checkpoint.
9999

docs/site/src/pages/Index.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import DeploymentFlow from "@/components/DeploymentFlow";
88
import WhatsInside from "@/components/WhatsInside";
99
import TechStack from "@/components/TechStack";
1010
import DeepDiveSection from "@/components/DeepDiveSection";
11-
import QualifierSection from "@/components/QualifierSection";
11+
1212
import PricingSection from "@/components/PricingSection";
1313
import TestimonialsSection from "@/components/TestimonialsSection";
1414
import FAQSection from "@/components/FAQSection";
@@ -89,7 +89,6 @@ const Index = () => {
8989
<WhatsInside />
9090
<TechStack />
9191
<DeepDiveSection />
92-
<QualifierSection />
9392
<PricingSection />
9493
<TestimonialsSection />
9594
<FAQSection />

installer/cli.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,9 +60,16 @@ def _validate_license_key(console: Console, project_dir: Path, license_key: str)
6060
return True
6161
else:
6262
console.print()
63-
console.error("License validation failed")
64-
if result.stderr:
65-
console.print(f" [dim]{result.stderr.strip()}[/dim]")
63+
error_msg = ""
64+
if result.stdout:
65+
try:
66+
data = json.loads(result.stdout.strip())
67+
error_msg = data.get("error", "")
68+
except (json.JSONDecodeError, ValueError):
69+
pass
70+
if not error_msg and result.stderr:
71+
error_msg = result.stderr.strip()
72+
console.error(f"License validation failed{': ' + error_msg if error_msg else ''}")
6673
console.print()
6774
return False
6875

0 commit comments

Comments
 (0)