From 520429760c902f4833fa97585b5dd6b9cc8aba22 Mon Sep 17 00:00:00 2001 From: Robert Talamantez Date: Tue, 3 Dec 2024 22:15:26 +0000 Subject: [PATCH] remove all trial, payment, and pro functions and references --- CHANGELOG.md | 5 ++ EULA.md | 65 --------------- LICENSE.md | 13 +-- PRIVACY.md | 14 +--- README.md | 25 +----- package.json | 8 +- src/ClaudeExtension.ts | 20 +---- src/services/license-service.ts | 135 -------------------------------- test/suite/extension.test.ts | 9 +-- test/suite/license.test.ts | 50 ------------ 10 files changed, 19 insertions(+), 325 deletions(-) delete mode 100644 EULA.md delete mode 100644 src/services/license-service.ts delete mode 100644 test/suite/license.test.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 5f3f9ae..4d6e287 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,11 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [2.1.8] - 2024-12-03 +### Changed +- Removed trial and payment requirements +- Made extension freely available for all users + ## [2.1.7] - 2024-11-29 ### Added - Support for all Claude 3 and 3.5 models diff --git a/EULA.md b/EULA.md deleted file mode 100644 index 7739d46..0000000 --- a/EULA.md +++ /dev/null @@ -1,65 +0,0 @@ -# End User License Agreement -## Claude AI Assistant Pro VSCode Extension - -**Last Updated:** November 24, 2024 - -This End User License Agreement ("Agreement") is between you and Conscious Robot LLC ("Company", "we", "us") for the Claude AI Assistant Pro VSCode Extension ("Software"). - -### 1. License Grant -Subject to your payment and compliance with this Agreement, we grant you a non-exclusive, non-transferable license to use the Software. - -### 2. Payment and Trial -- One-time payment of $9.99 USD -- 7-day free trial for new users -- No refunds after 30 days -- Payment processed through Visual Studio Marketplace - -### 3. User Rights and Restrictions -You may: -- Install and use the Software on any device you own -- Use for personal or commercial purposes -- Access all 2.x version updates - -You may not: -- Redistribute or resell the Software -- Modify or create derivative works -- Transfer your license to another user -- Reverse engineer the Software - -### 4. Trial Version -- Full functionality for 7 days -- Automatic expiration after trial period -- One trial per user -- No credit card required for trial - -### 5. Data and Privacy -- We don't collect your code or queries -- API keys stored locally and encrypted -- No cloud storage of your data -- See PRIVACY.md for full details - -### 6. Updates and Support -Included in purchase: -- Bug fixes and security updates -- All 2.x version features -- GitHub issue support -- Email support: support@consciousrobot.ai - -### 7. Disclaimer of Warranty -THE SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED. - -### 8. Limitation of Liability -IN NO EVENT SHALL CONSCIOUS ROBOT LLC BE LIABLE FOR ANY SPECIAL, INCIDENTAL, INDIRECT, OR CONSEQUENTIAL DAMAGES. - -### 9. Termination -This license automatically terminates if you fail to comply with its terms. Upon termination, you must cease all use of the Software. - -### 10. Agreement -BY INSTALLING OR USING THE SOFTWARE, YOU AGREE TO BE BOUND BY THE TERMS OF THIS AGREEMENT. - -### Contact -- Website: https://consciousrobot.com -- Support: info@consciousrobot.com -- GitHub: https://github.com/Talamantez/claude-vscode - -ยฉ 2024 Conscious Robot LLC. All rights reserved. \ No newline at end of file diff --git a/LICENSE.md b/LICENSE.md index ce584d5..0ad97aa 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,6 +1,6 @@ # License -## Source Code - MIT License +## MIT License Copyright (c) 2024 Conscious Robot @@ -22,15 +22,4 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -## Marketplace Distribution - -While the source code is MIT licensed, this VS Code extension is distributed as a paid product through the Visual Studio Code Marketplace. The following terms apply to the marketplace distribution: - -1. Early adopters who installed the extension before 11/23/2024 retain free access -2. New users must purchase a license through the VS Code Marketplace -3. Each purchase is for a single user -4. Users must maintain their own Claude API key from Anthropic -5. No warranty or guarantee of service is provided -6. Support is provided through GitHub issues - For questions or support, please visit: https://github.com/talamantez/claude-vscode/issues \ No newline at end of file diff --git a/PRIVACY.md b/PRIVACY.md index 887fd2e..d60451a 100644 --- a/PRIVACY.md +++ b/PRIVACY.md @@ -1,23 +1,21 @@ # Privacy Policy -## Claude AI Assistant Pro VSCode Extension +## Claude AI Assistant VSCode Extension -**Effective Date:** November 24, 2024 +**Effective Date:** December 03, 2024 ### Overview -Your privacy is important to us. This policy explains how Conscious Robot LLC ("we", "our", "us") collects and protects your information when using the Claude AI Assistant Pro VSCode Extension. +Your privacy is important to us. This policy explains how Conscious Robot LLC ("we", "our", "us") collects and protects your information when using the Claude AI Assistant VSCode Extension. ### Information We Collect #### Essential Information -- VSCode Marketplace account details (for license validation) - Claude API keys (stored locally and encrypted) - Basic usage statistics for diagnostics #### Local Storage Only - Configuration settings - API keys (stored securely in VSCode's built-in secure storage) -- License status #### We Do Not Collect - Your code or queries to Claude @@ -33,26 +31,22 @@ Your privacy is important to us. This policy explains how Conscious Robot LLC (" ### Third-Party Services We integrate with: -- Visual Studio Marketplace (for license management) - Anthropic's Claude API (using your provided API key) - GitHub (optional, for issue tracking) ### Your Controls You can: - Delete all local data by uninstalling the extension -- Reset your license information - Manage your own API keys - Opt out of error reporting ### Updates & Communication - Critical security updates via VSCode -- License status notifications - No marketing emails or promotions ### Contact - GitHub Issues: https://github.com/talamantez/claude-vscode - Email: info@consciousrobot.com -- Website: https://consciousrobot.com ### Changes to This Policy We'll notify you of significant changes through: @@ -60,4 +54,4 @@ We'll notify you of significant changes through: - GitHub repository notices - Extension changelog -_Last updated: November 24, 2024_ \ No newline at end of file +_Last updated: December 03, 2024_ \ No newline at end of file diff --git a/README.md b/README.md index 2a5525c..358df7e 100644 --- a/README.md +++ b/README.md @@ -1,21 +1,12 @@ -# ๐ŸŽ‰ Note for Early Adopters ๐ŸŽ‰ - -If you installed this extension before v2.0, please simply upgrade to continue using at no cost. Thank you for your support! The update will happen automatically through VSCode, or you can trigger it manually. - -_Not affected if you installed after v2.0._ - ---- - -# Claude AI Assistant Pro +# Claude AI Assistant The reliable, polished VS Code extension for Claude AI integration. Ask questions, generate documentation, and get AI assistance - all without leaving your editor. -## Why Pro? +## Key Features - **Rock-solid Stability**: Extensively tested window management, reliable response handling, and proper state preservation - **Full Model Support**: Validated with all Claude 3 and 3.5 models for maximum flexibility - **Clean Interface**: Responses appear exactly where they should, every time - **Thoughtful Design**: Cancel operations cleanly, preserve your source code state, no unwanted prompts -- **7-Day Free Trial**: Experience the reliability for yourself ## Supported Models @@ -45,7 +36,6 @@ Help AI see the full context! That's how you get the most accurate results. Easi - ๐Ÿ“š Generate code documentation - ๐Ÿ’ซ Smart response window management - โšก Proper cancellation support -- ๐Ÿ›Ÿ Priority support for Pro users - ๐Ÿ”ฎ More exciting features coming in v2.x series! ## It Just Works @@ -58,22 +48,13 @@ No complex setup. No unexpected behaviors. Select text, right-click, and get you 4. Select code or text 5. Right-click and choose "Ask Claude" or "Document Code" -## Pricing -- One-time purchase: $9.99 -- 7-day free trial for new users -- Includes all future updates in 2.x series - -## Coming Soon from Conscious Robot ๐Ÿš€ -- **[Flash-Hydrate](https://github.com/Talamantez/flash-hydrate-vscode)**: Hydrate Claude AI responses into Code Repositories - ## Resources - [Anthropic Claude Models Documentation](https://docs.anthropic.com/en/docs/about-claude/models) - [GitHub Issues & Support](https://github.com/talamantez/claude-vscode/issues) - Email: info@conscious-robot.com -- Priority response for Pro users --- Made with โค๏ธ by Conscious Robot. Crafted for developers who value reliability and clean design. -[Buy us a coffee](https://buymeacoffee.com/conscious.robot) | [GitHub](https://github.com/talamantez/claude-vscode) \ No newline at end of file +[GitHub](https://github.com/talamantez/claude-vscode) \ No newline at end of file diff --git a/package.json b/package.json index 45bcd14..21e6242 100644 --- a/package.json +++ b/package.json @@ -1,16 +1,16 @@ { "name": "claude-vscode-assistant", "displayName": "Claude AI Assistant", - "version": "2.1.7", + "version": "2.1.8", "description": "Claude AI assistant for Visual Studio Code - Seamlessly integrate Claude's capabilities into your development workflow", "publisher": "conscious-robot", - "pricing": "Trial", + "pricing": "Free", "preview": false, "repository": { "type": "git", "url": "https://github.com/talamantez/claude-vscode" }, - "license": "SEE LICENSE IN LICENSE.md", + "license": "MIT", "qna": "https://github.com/talamantez/claude-vscode/issues", "bugs": { "url": "https://github.com/talamantez/claude-vscode/issues" @@ -77,7 +77,7 @@ } ], "configuration": { - "title": "Claude AI Assistant Pro", + "title": "Claude AI Assistant", "properties": { "claude-vscode.model": { "type": "string", diff --git a/src/ClaudeExtension.ts b/src/ClaudeExtension.ts index 3057bd8..e14ba5a 100644 --- a/src/ClaudeExtension.ts +++ b/src/ClaudeExtension.ts @@ -1,18 +1,15 @@ -// File: src/ClaudeExtension.ts import * as vscode from 'vscode'; import { ClaudeApiService, DefaultClaudeApiService } from './services/claude-api'; import { ClaudeResponse } from './api'; import { ResponsePanelManager } from './ResponsePanelManager'; import { CommandManager } from './CommandManager'; import { Timeouts } from './config'; -import { LicenseService } from './services/license-service'; export class ClaudeExtension { private readonly _disposables: vscode.Disposable[] = []; private readonly _apiService: ClaudeApiService; private readonly _panelManager: ResponsePanelManager; private readonly _commandManager: CommandManager; - private readonly _licenseService: LicenseService; constructor( private readonly _context: vscode.ExtensionContext, @@ -21,43 +18,28 @@ export class ClaudeExtension { this._apiService = apiService || new DefaultClaudeApiService(); this._panelManager = new ResponsePanelManager(_context); this._commandManager = new CommandManager(_context); - this._licenseService = new LicenseService(_context); // Track these managers for disposal this._disposables.push(this._panelManager); this._disposables.push(this._commandManager); } + public async activate(): Promise { // Ensure clean state await this.dispose(); - // Initialize license - await this._licenseService.initializeLicense(); - await this._licenseService.showLicenseStatus(); - // Register commands await this._commandManager.registerCommands({ 'claude-vscode.askClaude': async () => { - const isLicenseValid = await this._licenseService.validateLicense(); - if (!isLicenseValid) { - await this._licenseService.showLicenseStatus(); - return; - } await this._handleClaudeRequest('general'); }, 'claude-vscode.documentCode': async () => { - const isLicenseValid = await this._licenseService.validateLicense(); - if (!isLicenseValid) { - await this._licenseService.showLicenseStatus(); - return; - } await this._handleClaudeRequest('document'); } }); } public async dispose(): Promise { - // Dispose all disposables await Promise.all(this._disposables.map(d => { try { return Promise.resolve(d.dispose()); diff --git a/src/services/license-service.ts b/src/services/license-service.ts deleted file mode 100644 index 085961f..0000000 --- a/src/services/license-service.ts +++ /dev/null @@ -1,135 +0,0 @@ -import * as vscode from 'vscode'; - -export interface LicenseInfo { - isValid: boolean; - isTrial: boolean; - trialEndsAt?: Date; - purchaseDate?: Date; -} - -export class LicenseService { - private static readonly LICENSE_KEY = 'claude-vscode.license'; - private static readonly TRIAL_KEY = 'claude-vscode.trial'; - - constructor(private readonly context: vscode.ExtensionContext) { } - - public async initializeLicense(): Promise { - const license = await this.getLicenseInfo(); - - if (!license) { - // New installation - start trial - await this.startTrial(); - } else if (license.isTrial && license.trialEndsAt) { - // Check if trial has expired - if (new Date() > license.trialEndsAt) { - await this.expireTrial(); - } - } - } - - public async getLicenseInfo(): Promise { - const licenseData = await this.context.globalState.get(LicenseService.LICENSE_KEY); - if (!licenseData) { - return undefined; - } - - try { - const parsed = JSON.parse(licenseData); - // Convert date strings back to Date objects - if (parsed.trialEndsAt) { - parsed.trialEndsAt = new Date(parsed.trialEndsAt); - } - if (parsed.purchaseDate) { - parsed.purchaseDate = new Date(parsed.purchaseDate); - } - return parsed as LicenseInfo; - } catch { - return undefined; - } - } - - private async startTrial(): Promise { - const trialInfo: LicenseInfo = { - isValid: true, - isTrial: true, - trialEndsAt: new Date(Date.now() + 7 * 24 * 60 * 60 * 1000), // 7 days - }; - - await this.context.globalState.update(LicenseService.LICENSE_KEY, JSON.stringify(trialInfo)); - await this.context.globalState.update(LicenseService.TRIAL_KEY, true); - } - - private async expireTrial(): Promise { - const expiredInfo: LicenseInfo = { - isValid: false, - isTrial: true, - trialEndsAt: new Date() - }; - - await this.context.globalState.update(LicenseService.LICENSE_KEY, JSON.stringify(expiredInfo)); - } - - public async activateFullLicense(): Promise { - const licenseInfo: LicenseInfo = { - isValid: true, - isTrial: false, - purchaseDate: new Date() - }; - - await this.context.globalState.update(LicenseService.LICENSE_KEY, JSON.stringify(licenseInfo)); - await this.context.globalState.update(LicenseService.TRIAL_KEY, false); - } - - public async showLicenseStatus(): Promise { - const license = await this.getLicenseInfo(); - - if (!license) { - vscode.window.showInformationMessage( - 'Welcome to Claude AI Assistant Pro! Starting your 7-day free trial.' - ); - return; - } - - if (license.isTrial && license.trialEndsAt) { - const daysLeft = Math.max(0, Math.ceil((license.trialEndsAt.getTime() - Date.now()) / (1000 * 60 * 60 * 24))); - - if (daysLeft > 0) { - vscode.window.showInformationMessage( - `Trial Version: ${daysLeft} days remaining. Purchase to unlock full version.`, - 'Purchase Now' - ).then(selection => { - if (selection === 'Purchase Now') { - vscode.env.openExternal(vscode.Uri.parse( - 'https://marketplace.visualstudio.com/items?itemName=conscious-robot.claude-vscode-assistant' - )); - } - }); - } else { - vscode.window.showWarningMessage( - 'Your trial has expired. Please purchase to continue using Claude AI Assistant Pro.', - 'Purchase Now' - ).then(selection => { - if (selection === 'Purchase Now') { - vscode.env.openExternal(vscode.Uri.parse( - 'https://marketplace.visualstudio.com/items?itemName=conscious-robot.claude-vscode-assistant' - )); - } - }); - } - } - } - - public async validateLicense(): Promise { - const license = await this.getLicenseInfo(); - - if (!license) { - return false; - } - - if (license.isTrial && license.trialEndsAt) { - return new Date() <= license.trialEndsAt; - } - - return license.isValid; - } -} \ No newline at end of file diff --git a/test/suite/extension.test.ts b/test/suite/extension.test.ts index eefba42..f3f51f7 100644 --- a/test/suite/extension.test.ts +++ b/test/suite/extension.test.ts @@ -126,6 +126,7 @@ suite('Claude Extension Test Suite', () => { await thoroughCleanup(); console.log('โœ… Test setup complete!'); }); + teardown(async () => { console.log('\n๐Ÿงน Starting test cleanup...'); @@ -154,7 +155,6 @@ suite('Claude Extension Test Suite', () => { async function forceUnregisterAllCommands() { const ourCommands = [ - 'claude-vscode.support', 'claude-vscode.askClaude', 'claude-vscode.documentCode' ]; @@ -212,7 +212,6 @@ suite('Claude Extension Test Suite', () => { console.log('โœ… Response panel test complete!'); }); - test('Extension handles errors gracefully', async function () { this.timeout(45000); console.log('\n๐Ÿงช Testing error handling...'); @@ -233,7 +232,6 @@ suite('Claude Extension Test Suite', () => { console.log('โœ… Error handling test complete!'); }); - test('Extension respects VS Code lifecycle events', async function () { this.timeout(10000); console.log('\n๐Ÿงช Testing VS Code lifecycle handling...'); @@ -245,24 +243,19 @@ suite('Claude Extension Test Suite', () => { testExtension = new ClaudeExtension(mockContext, mockApiService); await testExtension.activate(); - // Get initial command count const initialCommandCount = registeredCommands.size; console.log('๐Ÿ“Š Initial command count:', initialCommandCount); - // Simulate window state change windowStateChangeEvent.fire(); await waitForExtensionReady(500); - // Verify commands are still registered assert.strictEqual( registeredCommands.size, initialCommandCount, 'Commands should remain registered after window state change' ); - // Log current commands for debugging console.log('๐Ÿ“‹ Current commands:', Array.from(registeredCommands.keys())); - console.log('โœ… Lifecycle handling test complete!'); }); diff --git a/test/suite/license.test.ts b/test/suite/license.test.ts deleted file mode 100644 index 626f612..0000000 --- a/test/suite/license.test.ts +++ /dev/null @@ -1,50 +0,0 @@ -import * as assert from 'assert'; -import { LicenseService } from '../../src/services/license-service'; -import * as vscode from 'vscode'; - -suite('License Service Test Suite', () => { - let mockContext: vscode.ExtensionContext; - let licenseService: LicenseService; - let globalState: Map; - - setup(() => { - globalState = new Map(); - mockContext = { - globalState: { - get: async (key: string) => globalState.get(key), - update: async (key: string, value: any) => { globalState.set(key, value); return Promise.resolve(); } - } - } as any as vscode.ExtensionContext; - - licenseService = new LicenseService(mockContext); - }); - - test('New installation starts trial', async () => { - await licenseService.initializeLicense(); - const license = await licenseService.getLicenseInfo(); - - assert.ok(license, 'License should be created'); - assert.strictEqual(license?.isValid, true); - assert.strictEqual(license?.isTrial, true); - assert.ok(license?.trialEndsAt instanceof Date); - }); - - test('Trial expiration calculation', async () => { - await licenseService.initializeLicense(); - const license = await licenseService.getLicenseInfo(); - - assert.ok(license?.trialEndsAt); - const daysUntilExpiry = Math.ceil((license!.trialEndsAt!.getTime() - Date.now()) / (1000 * 60 * 60 * 24)); - assert.strictEqual(daysUntilExpiry, 7); - }); - - test('Full license activation', async () => { - await licenseService.activateFullLicense(); - const license = await licenseService.getLicenseInfo(); - - assert.ok(license); - assert.strictEqual(license?.isValid, true); - assert.strictEqual(license?.isTrial, false); - assert.ok(license?.purchaseDate instanceof Date); - }); -}); \ No newline at end of file