feat(license): add Lite SKU; remove user-facing free trial
Two coupled changes:
1. Lite tier
- New Tier.LITE in src/license/schema.py.
- FEATURES_BY_TIER[Tier.LITE] = {Deduplicator, Text Cleaner,
Format Standardizer}. The three universally-useful tools that
cover the most common bookkeeping / RevOps / Klaviyo prep
workflows. Other six tools require Core.
- i18n: license.tier_lite, license.feature_locked_title,
license.feature_locked_body, license.upgrade_link,
license.status_locked (en + es).
- Per-tool feature gate at every GUI tool page
(require_feature_or_render_upgrade) and every tool CLI
(guard(feature=...)). A locked tool renders an upgrade
prompt + Manage-license button (GUI) or exits with code 2
(CLI).
- Home grid: tool cards the user's tier doesn't unlock get a
red 🔒 Locked badge in place of green Ready.
2. Trial removed
- Activation form's "Start 1-year trial" button removed.
- license_cli's `trial` subcommand removed.
- activation.trial_button / activation.trial_help i18n keys
dropped (pack parity test stays green).
- Tier.TRIAL stays in the enum (back-compat with any field-
tested trial licenses); LicenseManager._mint stays internal
for tests and the seller's key generator.
- Decision logged in DECISIONS §9b: a 1-year all-features
trial undercuts paid Lite; paid-only keeps tier economics
clean.
Tests (+29 net): +17 Lite-tier unit/guard tests + 13 Lite-tier
GUI tests + 1 trial-absent assertion - 2 trial CLI tests - 1
trial GUI button test. Total: 1995 → 2024.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -68,8 +68,6 @@
|
||||
"blob_help": "Begins with `DTLIC1:` — paste the entire string.",
|
||||
"activate_button": "Activate",
|
||||
"renew_button": "Apply renewal",
|
||||
"trial_button": "Start 1-year trial",
|
||||
"trial_help": "Skips the paid blob and self-issues a 1-year license tied to your name and email. Useful for evaluating before purchase.",
|
||||
"or_separator": "— or —",
|
||||
"success": "Activated! Welcome, {name}. Your license is valid until {expires}.",
|
||||
"renewed": "License renewed. New expiry: {expires}.",
|
||||
@@ -86,13 +84,18 @@
|
||||
"renewal_warning_30": "⚠️ License expires in {days} days. Renew soon to avoid interruption.",
|
||||
"renewal_warning_expired": "🛑 License expired on {date}. Renew to continue using DataTools.",
|
||||
"tier_trial": "Trial",
|
||||
"tier_lite": "Lite",
|
||||
"tier_core": "Core",
|
||||
"tier_pro": "Pro",
|
||||
"tier_enterprise": "Enterprise",
|
||||
"registered_to": "Registered to {name} · {email}",
|
||||
"expires_on": "Expires on {date}",
|
||||
"issued_on": "Issued on {date}",
|
||||
"view_details": "License details"
|
||||
"view_details": "License details",
|
||||
"feature_locked_title": "🔒 This tool isn't on your {tier} license",
|
||||
"feature_locked_body": "Your current license unlocks: {features}. Upgrade to access this tool.",
|
||||
"upgrade_link": "Manage license",
|
||||
"status_locked": "Locked"
|
||||
},
|
||||
"tools": {
|
||||
"01_deduplicator": {
|
||||
|
||||
Reference in New Issue
Block a user