Skip to content

Commit 084d325

Browse files
authored
Replace seats with activations, refactor hooks and spec workflow (#48)
* fix: correct seat display for solo/team licenses and enrich activation output Solo licenses no longer show device activation limit as seats. Team licenses display actual seat count in banner, statusline, and Console badge. Activation command now shows tier, activations used/limit, and start date. Polar verify_license extracts seats_used from activations array. pilot status --json includes seats_total for Console propagation. * fix: replace seats with activations, refactor hooks and spec workflow - Replace seats_total/seats_used with activations_used/activations_limit across CLI, banner, console, statusline, and Gumroad verifier - Add interactive license key prompt in wrapper and installer when trial fails or license is invalid (3-attempt loop with activation) - Refactor file checker hooks into modular _checkers package with shared _util module (Python, TypeScript, Go) and add comprehensive tests - Remove parallel spec-implementer agent and wave-based execution in favor of sequential TDD in main context with full hook access - Add spec_plan_validator and spec_verify_validator Stop hooks - Add FAQ section to website and README - Strengthen /spec invocation guard: never auto-invoke, user must type it - Resolve plan paths to absolute in session.register_plan - Add vexor timeout and no-background rules - Lower default retention max count from 10000 to 5000 - Rebuild viewer and worker bundles * fix: prevent incremental review from overwriting initial PR analysis Incremental code reviews (on push) were using use_sticky_comment: true, which replaced the full initial review comment. Changed to false so each push creates a separate comment and the initial analysis is preserved.
1 parent abf0c24 commit 084d325

77 files changed

Lines changed: 2990 additions & 1817 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/claude.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ jobs:
9797
uses: anthropics/claude-code-action@v1
9898
with:
9999
claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
100-
use_sticky_comment: true
100+
use_sticky_comment: false
101101
track_progress: true
102102
plugin_marketplaces: 'https://github.com/anthropics/claude-code.git'
103103
plugins: 'code-review@claude-code-plugins'

README.md

Lines changed: 101 additions & 57 deletions
Large diffs are not rendered by default.

console/src/services/worker-service.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -624,7 +624,7 @@ async function main() {
624624
logger.error("SYSTEM", "License verification failed");
625625
exitWithStatus(
626626
"error",
627-
"UNLICENSED: Using Claude Pilot without a valid license is not permitted. Subscribe at https://www.claude-pilot.com then run: pilot activate <LICENSE_KEY>",
627+
"UNLICENSED: Using Claude Pilot without a valid license is not permitted. Subscribe at https://claude-pilot.com then run: pilot activate <LICENSE_KEY>",
628628
);
629629
}
630630

console/src/shared/SettingsDefaultsManager.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ export class SettingsDefaultsManager {
8787
CLAUDE_PILOT_REMOTE_TOKEN: "",
8888
CLAUDE_PILOT_RETENTION_ENABLED: true,
8989
CLAUDE_PILOT_RETENTION_MAX_AGE_DAYS: "31",
90-
CLAUDE_PILOT_RETENTION_MAX_COUNT: "10000",
90+
CLAUDE_PILOT_RETENTION_MAX_COUNT: "5000",
9191
CLAUDE_PILOT_RETENTION_EXCLUDE_TYPES: '["summary"]',
9292
CLAUDE_PILOT_RETENTION_SOFT_DELETE: false,
9393
CLAUDE_PILOT_BATCH_SIZE: "5",

console/src/ui/viewer/components/LicenseBadge.tsx

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,10 @@ export function LicenseBadge({ license, isLoading }: LicenseBadgeProps) {
4848
return null;
4949
}
5050

51-
const label = license.tier === 'trial' && license.daysRemaining != null
52-
? `${config.label} · ${license.daysRemaining}d left`
53-
: config.label;
51+
let label = config.label;
52+
if (license.tier === 'trial' && license.daysRemaining != null) {
53+
label = `${config.label} · ${license.daysRemaining}d left`;
54+
}
5455

5556
return (
5657
<Tooltip text={buildTooltipText(license)} position="bottom">

console/src/ui/viewer/layouts/Topbar/index.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ export function Topbar({ theme, onToggleTheme, onToggleLogs }: TopbarProps) {
1919
<span>
2020
&copy; {new Date().getFullYear()}{' '}
2121
<a
22-
href="https://www.claude-pilot.com"
22+
href="https://claude-pilot.com"
2323
target="_blank"
2424
rel="noopener noreferrer"
2525
className="text-primary/70 hover:text-primary transition-colors"

console/tests/retention/auto-retention.test.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,13 @@
88
import { describe, it, expect, beforeEach, afterEach, mock, spyOn } from "bun:test";
99

1010
describe("Auto-Retention", () => {
11-
describe("maxCount default updated to 10000", () => {
12-
it("has CLAUDE_PILOT_RETENTION_MAX_COUNT set to 10000", async () => {
11+
describe("maxCount default updated to 5000", () => {
12+
it("has CLAUDE_PILOT_RETENTION_MAX_COUNT set to 5000", async () => {
1313
const { SettingsDefaultsManager } = await import(
1414
"../../src/shared/SettingsDefaultsManager.js"
1515
);
1616
const defaults = SettingsDefaultsManager.getAllDefaults();
17-
expect(defaults.CLAUDE_PILOT_RETENTION_MAX_COUNT).toBe("10000");
17+
expect(defaults.CLAUDE_PILOT_RETENTION_MAX_COUNT).toBe("5000");
1818
});
1919
});
2020

console/tests/ui/license-badge.test.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,4 +120,5 @@ describe("LicenseBadge", () => {
120120

121121
expect(html).toContain("5 days remaining");
122122
});
123+
123124
});

docs/site/index.html

Lines changed: 70 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -7,89 +7,104 @@
77
<!-- Primary Meta Tags -->
88
<title>Claude Pilot - Claude Code is powerful. Pilot makes it reliable.</title>
99
<meta name="title" content="Claude Pilot - Claude Code is powerful. Pilot makes it reliable." />
10-
<meta name="description" content="Claude is powerful but inconsistent. Pilot adds the structure it needs. Tests enforced, context preserved, quality automated.">
11-
<meta name="keywords" content="Claude Pilot, Claude Code, AI coding assistant, AI pair programming, TDD enforcement, Test-Driven Development, code quality automation, linting, formatting, type checking, spec-driven development, dev containers, VS Code, Cursor, Windsurf, Claude API, Anthropic, AI development tools, automated testing, code review, persistent memory, semantic code search">
10+
<meta
11+
name="description"
12+
content="Claude is powerful but inconsistent. Pilot adds the structure it needs. Tests enforced, context preserved, quality automated."
13+
/>
14+
<meta
15+
name="keywords"
16+
content="Claude Pilot, Claude Code, AI coding assistant, AI pair programming, TDD enforcement, Test-Driven Development, code quality automation, linting, formatting, type checking, spec-driven development, dev containers, VS Code, Cursor, Windsurf, Claude API, Anthropic, AI development tools, automated testing, code review, persistent memory, semantic code search"
17+
/>
1218
<meta name="author" content="Max Ritter" />
1319
<meta name="robots" content="index, follow" />
1420
<meta name="language" content="English" />
1521
<meta name="revisit-after" content="7 days" />
1622

1723
<!-- Canonical URL -->
18-
<link rel="canonical" href="https://www.claude-pilot.com" />
24+
<link rel="canonical" href="https://claude-pilot.com" />
1925

2026
<!-- Fonts -->
21-
<link rel="preconnect" href="https://fonts.googleapis.com">
22-
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
23-
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Space+Mono:wght@400;700&display=swap" rel="stylesheet">
27+
<link rel="preconnect" href="https://fonts.googleapis.com" />
28+
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
29+
<link
30+
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Space+Mono:wght@400;700&display=swap"
31+
rel="stylesheet"
32+
/>
2433

2534
<!-- Favicon (blue circle emoji, same as console) -->
26-
<link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><text y='.9em' font-size='90'>🔵</text></svg>">
27-
<link rel="apple-touch-icon" href="/favicon.png">
35+
<link
36+
rel="icon"
37+
href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><text y='.9em' font-size='90'>🔵</text></svg>"
38+
/>
39+
<link rel="apple-touch-icon" href="/favicon.png" />
2840

2941
<!-- Web App Manifest -->
30-
<link rel="manifest" href="/manifest.json">
31-
<meta name="theme-color" content="#6366f1">
42+
<link rel="manifest" href="/manifest.json" />
43+
<meta name="theme-color" content="#6366f1" />
3244

3345
<!-- Open Graph / Facebook -->
3446
<meta property="og:type" content="website" />
35-
<meta property="og:url" content="https://www.claude-pilot.com" />
47+
<meta property="og:url" content="https://claude-pilot.com" />
3648
<meta property="og:title" content="Claude Pilot - Claude Code is powerful. Pilot makes it reliable." />
37-
<meta property="og:description" content="Claude is powerful but inconsistent. Pilot adds the structure it needs. Tests enforced, context preserved, quality automated." />
38-
<meta property="og:image" content="https://www.claude-pilot.com/logo.png">
49+
<meta
50+
property="og:description"
51+
content="Claude is powerful but inconsistent. Pilot adds the structure it needs. Tests enforced, context preserved, quality automated."
52+
/>
53+
<meta property="og:image" content="https://claude-pilot.com/logo.png" />
3954
<meta property="og:image:width" content="1200" />
4055
<meta property="og:image:height" content="630" />
4156
<meta property="og:site_name" content="Claude Pilot" />
4257
<meta property="og:locale" content="en_US" />
4358

4459
<!-- Twitter -->
4560
<meta name="twitter:card" content="summary_large_image" />
46-
<meta name="twitter:url" content="https://www.claude-pilot.com" />
61+
<meta name="twitter:url" content="https://claude-pilot.com" />
4762
<meta name="twitter:title" content="Claude Pilot - Claude Code is powerful. Pilot makes it reliable." />
48-
<meta name="twitter:description" content="Claude is powerful but inconsistent. Pilot adds the structure it needs. Tests enforced, context preserved, quality automated." />
49-
<meta name="twitter:image" content="https://www.claude-pilot.com/logo.png">
63+
<meta
64+
name="twitter:description"
65+
content="Claude is powerful but inconsistent. Pilot adds the structure it needs. Tests enforced, context preserved, quality automated."
66+
/>
67+
<meta name="twitter:image" content="https://claude-pilot.com/logo.png" />
5068

5169
<!-- Schema.org JSON-LD -->
5270
<script type="application/ld+json">
53-
{
54-
"@context": "https://schema.org",
55-
"@type": "SoftwareApplication",
56-
"name": "Claude Pilot",
57-
"alternateName": "Claude Code Pilot",
58-
"description": "Claude is powerful but inconsistent. Pilot adds the structure it needs. Tests enforced, context preserved, quality automated.",
59-
"applicationCategory": "DeveloperApplication",
60-
"applicationSubCategory": "AI Development Tools",
61-
"operatingSystem": "Windows, macOS, Linux",
62-
"softwareRequirements": "Claude Code CLI, Docker (optional)",
63-
"releaseNotes": "https://github.com/maxritter/claude-pilot/releases",
64-
"screenshot": "https://www.claude-pilot.com/logo.png",
65-
"author": {
66-
"@type": "Person",
67-
"name": "Max Ritter",
68-
"url": "https://www.linkedin.com/in/rittermax/"
69-
},
70-
"provider": {
71-
"@type": "Organization",
71+
{
72+
"@context": "https://schema.org",
73+
"@type": "SoftwareApplication",
7274
"name": "Claude Pilot",
73-
"url": "https://www.claude-pilot.com",
74-
"logo": "https://www.claude-pilot.com/favicon.png",
75-
"sameAs": [
76-
"https://github.com/maxritter/claude-pilot",
77-
"https://www.linkedin.com/in/rittermax/"
78-
]
79-
},
80-
"featureList": [
81-
"TDD Enforcement - Tests first, then implementation",
82-
"Quality Hooks - Auto-format, lint, type-check on every edit",
83-
"Spec-Driven Development - Plan, approve, implement, verify workflow",
84-
"Quick Mode - Fast bug fixes and small changes",
85-
"Semantic Code Search - Find code by meaning with Vexor",
86-
"Persistent Memory - Context carries across sessions",
87-
"Endless Mode - Seamless session continuity",
88-
"Dev Container Support - Works with VS Code, Cursor, Windsurf",
89-
"Python & TypeScript - Quality hooks and linting tools"
90-
],
91-
"keywords": "Claude Code, AI coding, TDD, quality automation, spec-driven development"
92-
}
75+
"alternateName": "Claude Code Pilot",
76+
"description": "Claude is powerful but inconsistent. Pilot adds the structure it needs. Tests enforced, context preserved, quality automated.",
77+
"applicationCategory": "DeveloperApplication",
78+
"applicationSubCategory": "AI Development Tools",
79+
"operatingSystem": "Windows, macOS, Linux",
80+
"softwareRequirements": "Claude Code CLI, Docker (optional)",
81+
"releaseNotes": "https://github.com/maxritter/claude-pilot/releases",
82+
"screenshot": "https://claude-pilot.com/logo.png",
83+
"author": {
84+
"@type": "Person",
85+
"name": "Max Ritter",
86+
"url": "https://www.linkedin.com/in/rittermax/"
87+
},
88+
"provider": {
89+
"@type": "Organization",
90+
"name": "Claude Pilot",
91+
"url": "https://claude-pilot.com",
92+
"logo": "https://claude-pilot.com/favicon.png",
93+
"sameAs": ["https://github.com/maxritter/claude-pilot", "https://www.linkedin.com/in/rittermax/"]
94+
},
95+
"featureList": [
96+
"TDD Enforcement - Tests first, then implementation",
97+
"Quality Hooks - Auto-format, lint, type-check on every edit",
98+
"Spec-Driven Development - Plan, approve, implement, verify workflow",
99+
"Quick Mode - Fast bug fixes and small changes",
100+
"Semantic Code Search - Find code by meaning with Vexor",
101+
"Persistent Memory - Context carries across sessions",
102+
"Endless Mode - Seamless session continuity",
103+
"Dev Container Support - Works with VS Code, Cursor, Windsurf",
104+
"Python & TypeScript - Quality hooks and linting tools"
105+
],
106+
"keywords": "Claude Code, AI coding, TDD, quality automation, spec-driven development"
107+
}
93108
</script>
94109
</head>
95110

docs/site/public/robots.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,4 @@ User-agent: *
1414
Allow: /
1515

1616
# Sitemap location
17-
Sitemap: https://www.claude-pilot.com/sitemap.xml
17+
Sitemap: https://claude-pilot.com/sitemap.xml

0 commit comments

Comments
 (0)