| Age | Commit message (Collapse) | Author |
|
- Add initial line break to preserve terminal prompt - Change format
to [✓]/[x]/[~] Namespace: output - Add colors: green for success,
red for failure - Fix extra lines by adding newlines in releaseLine -
Fix currentLine initialization to 0 instead of maxLines
Amp-Thread-ID:
https://ampcode.com/threads/T-39671965-c412-4a2e-8084-9d09128fd865
Co-authored-by: Amp <amp@ampcode.com>
|
|
- Add ansi-terminal to ghcPackageSetBild dependencies - Add
Omni/Log/Concurrent.hs to source fileset - Fix unused mLineNum warning
in buildTarget - Alphabetize deps list (hostname moved up)
Parallel builds now fully functional with proper Nix dependencies.
|
|
Updated PARALLEL_BUILDS_PLAN.md with: - Implementation status (all
phases complete) - Global state approach details - Testing results -
Future enhancement ideas
Task: t-1a1ELGl, Epic: t-19ZF6A8 (complete)
|
|
- Fix BuildStatus to use newtype with single field - Clean up unused
imports and fields - logs function now uses updateCurrentLine
for LineManager support - Fallback to single-line output when no
LineManager
All tests passing. Ready to test with different terminal types.
Tasks: t-1a1Eiay
|
|
- Add global IORef for currentLineManager and namespaceLines
mapping - Update logs function to use LogC.updateCurrentLine -
Add updateCurrentLine and releaseCurrentLine helpers - Fallback to
normal printing when no LineManager active - Simplify buildTarget to
use global helpers instead of threading
Tasks: t-1a1EaJy
|
|
- Reserve line for each concurrent build - Release line on completion
with success/failed state - Fix hlint eta reduce warning
Task: t-1a1E3j1
|
|
- Implement LineManager abstraction with IORef state - Line
reservation/update/release functions - ANSI cursor positioning for
concurrent updates - Terminal capability detection (ANSI vs dumb) -
Graceful fallback for non-ANSI terminals
Tasks: t-1a1DzES, t-1a1DGY0, t-1a1DOev, t-1a1DVM5
|
|
- Add mapConcurrentlyBounded using QSemN for bounded parallelism -
Refactor build function to extract buildTarget worker - Build up to
--jobs targets concurrently - Preserves all existing functionality -
Output will be interleaved (will fix with LineManager next)
Related tasks: - t-1a0OVBs: mapConcurrentlyBounded helper - t-1a16ame:
refactor build function - t-1a1DdSB: replace forM with concurrent map
|
|
Replaced the old slow depth-first search with a breadth-first search
for detecting imports. This should be way faster when building a
single namespace because it doesn't have to visit the same file
multiple times.
The ghc-pkg caching means we only have to run ghc-pkg once per bild
invocation.
|
|
|
|
detectPythonImports now recursively analyzes imported modules to find
transitive dependencies, matching the behavior of detectHaskellImports.
Previously it only detected direct imports, which caused build failures
when Python modules had nested dependencies.
- Changed signature from [Text] -> IO (Set FilePath)
to Analysis -> [Text] -> IO (Set FilePath)
- Added filepaths, findDeps, and onlyPython helper functions -
Recursively calls analyze() on imported modules to find transitive
deps - Updated tests to pass empty Analysis map
|
|
- Created reusable PageLayout component in UI.py with consistent
header/navbar - Added Home link and Admin dropdown menu (Queue
Status, Manage Users) - Updated all pages to use PageLayout: home,
account, admin queue, admin users - Added demo@example.com to admin
whitelist for testing - Added dark mode styling for table headers -
Fixed component children syntax for Ludic framework - Proper type
annotations instead of type: ignore comments
|
|
Change 'Manage Subscription' from HTMX link to regular form POST.
HTMX AJAX requests can't follow redirects to external domains like
Stripe.
|
|
- Remove user-facing error messages for portal configuration -
Just log the error server-side and return 500 status - Use Bootstrap
card-header class for proper padding on section headers - This fixes
icons touching the card borders
Portal errors will now be logged but won't break the UI.
Amp-Thread-ID:
https://ampcode.com/threads/T-8edacbeb-b343-49ca-b524-1c999272acb6
Co-authored-by: Amp <amp@ampcode.com>
|
|
- Catch Stripe exceptions when portal not configured - Redirect to
account page with user-friendly error message - Display error alert
on account page when present - Change portal return URL to /account
instead of /
Fixes issue when Stripe billing portal settings haven't been configured
in test/production dashboard.
Amp-Thread-ID:
https://ampcode.com/threads/T-8edacbeb-b343-49ca-b524-1c999272acb6
Co-authored-by: Amp <amp@ampcode.com>
|
|
- Display account information (email, creation date) - Show
subscription details (plan, status, features) - Display cancellation
warning if subscription ending - Add Upgrade button for free users -
Add Manage Subscription button for paid users (goes to Stripe portal) -
Add logout button in Actions section - Replace Coming Soon placeholder
with functional UI
Addresses account management epic tasks.
Amp-Thread-ID:
https://ampcode.com/threads/T-8edacbeb-b343-49ca-b524-1c999272acb6
Co-authored-by: Amp <amp@ampcode.com>
|
|
- Add 'Remove' button for non-pending queue items (error, processing,
cancelled) - Keep 'Cancel' button for pending items - Update
delete_queue_item to check referer and return appropriate response -
Use HX-Trigger for queue updates from user page, HX-Redirect for admin
- Add confirmation dialog for remove action - Allow admins to delete
any job, users can only delete their own
Amp-Thread-ID:
https://ampcode.com/threads/T-8edacbeb-b343-49ca-b524-1c999272acb6
Co-authored-by: Amp <amp@ampcode.com>
|
|
- Remove 'Logged in as' user email display - Convert button-styled
links to standard Bootstrap nav-link style - Left-align navigation
links (removed me-auto from wrapper) - Remove logout button from navbar
(will be in account page) - Use proper ul/li structure for navbar items
The navbar is now cleaner and follows Bootstrap navbar conventions.
Amp-Thread-ID:
https://ampcode.com/threads/T-8edacbeb-b343-49ca-b524-1c999272acb6
Co-authored-by: Amp <amp@ampcode.com>
|
|
- Add mx-1 (horizontal margin) to code element for better text spacing
- Pre-fill email input with demo@example.com in dev/test mode -
Makes it faster to test login flow in development
Amp-Thread-ID:
https://ampcode.com/threads/T-8edacbeb-b343-49ca-b524-1c999272acb6
Co-authored-by: Amp <amp@ampcode.com>
|
|
|
|
- Add explicit type annotations to TIER_LIMITS dict - Add type
annotation to tier_info dict in get_tier_info - Remove unnecessary
type: ignore comments - Use .get() consistently for dict access
Improves type safety and removes 3 type: ignore suppressions.
Amp-Thread-ID:
https://ampcode.com/threads/T-8edacbeb-b343-49ca-b524-1c999272acb6
Co-authored-by: Amp <amp@ampcode.com>
|
|
Moved format_duration function from Web.py to UI.py for better code
organization. This is a UI utility function used for displaying
episode durations, so it belongs in the shared UI module rather than
the web-specific module.
Amp-Thread-ID:
https://ampcode.com/threads/T-8edacbeb-b343-49ca-b524-1c999272acb6
Co-authored-by: Amp <amp@ampcode.com>
|
|
- Replace Exception with httpx.HTTPError, httpx.TimeoutException,
re.error in extract_og_metadata - Replace Exception with ValueError,
KeyError in auth verification - Replace Exception with httpx errors
and ValueError in submit_article - Replace Exception with ValueError,
KeyError, AttributeError in RSS feed generation - Replace Exception
with ValueError, KeyError in cancel/retry/delete job handlers
Improves error handling specificity and removes BLE001 linter
suppressions.
Amp-Thread-ID:
https://ampcode.com/threads/T-8edacbeb-b343-49ca-b524-1c999272acb6
Co-authored-by: Amp <amp@ampcode.com>
|
|
|
|
- Remove /billing page and BillingPage component - Add callout box
on home page showing articles remaining for free users - Upgrade Now
button goes directly to Stripe checkout - Change tier from 'pro'
to 'paid' throughout - Update redirect URLs to go to / instead of
/billing - Remove Billing button from navbar, add Manage Account
link for all users - Add /account route with coming soon page -
Hide payment banner for paid users
Amp-Thread-ID:
https://ampcode.com/threads/T-7de89e42-947c-4243-be19-0cb75be607e7
Co-authored-by: Amp <amp@ampcode.com>
|
|
I don't need the complexity of multiple plans, just one for now
to test.
|
|
amp worked on this overnight, and I cleaned it up a bit this morning. I
think its all correct now.
|
|
This is a big test, and probably over-dependencied, but it's nice to
have an end-to-end test as an overall bug-catcher.
|
|
I think the calls to Log.setup() were accidentally creating multiple
loggers, hopefully this fixes the problem.
|
|
|
|
Add to AGENTS.md: - SQLite migration limitations (no UNIQUE
constraints via ALTER TABLE) - Migration logging best practices -
Testing external API integrations (Stripe pattern) - Mock webhook
testing approach - Local webhook testing with CLI tools - Handling API
version differences with fallback field names - Database inspection
for debugging integrations
These patterns emerged from implementing and debugging the Stripe
billing integration.
|
|
- Use billing_cycle_anchor instead of current_period_start/end in test
- Reflects actual Stripe API v2025-10-29 subscription structure -
Test validates upgrade flow works with newer API versions - Removes
debug logging (list of available keys)
|
|
- Use billing_cycle_anchor or start_date as fallback for period start -
Calculate period end by adding 1 month if not provided - Handles newer
Stripe API versions that don't include current_period_* fields - Fixes
issue where subscription.created webhook couldn't update user plan -
Works with Stripe API Version 2025-10-29.clover and newer
|
|
Log available keys when period dates are missing to help debug why
subscription webhooks fail to update user plan.
|
|
- Test simulates complete Stripe checkout flow end-to-end -
Step 1: checkout.session.completed with client_reference_id -
Step 2: customer.subscription.created with subscription details -
Verifies customer linking and plan upgrade to pro tier - Tests ensure
webhook flow works without calling real Stripe API - Validates that
client_reference_id properly links session to user
|
|
- Handle case where client_reference_id is None or missing - Fall back
to checking metadata.user_id if client_reference_id not available -
Add try/except for int() conversion with proper error logging - Use
safe .get() for session ID in error messages - Prevents TypeError:
int() argument must be a string when webhook has None value
|
|
- Skip signature verification if STRIPE_WEBHOOK_SECRET is not set -
Add warning log when verification is skipped - Parse webhook payload
as JSON directly in test mode - Enables local testing with 'stripe
trigger' without configuring webhook secret - Production still requires
proper webhook secret for security
|
|
- Remove UNIQUE constraints from ALTER TABLE statements
(SQLite doesn't support adding constraints via ALTER TABLE)
- Add better logging for migration failures (debug level) - Rely on
application logic to ensure uniqueness instead of DB constraint -
This fixes the silent failure where stripe_customer_id and
stripe_subscription_id columns weren't being added
|
|
- Add TestWebhookHandling class with tests for subscription webhooks -
Test normal subscription creation flow with mock data - Test handling
of incomplete webhook data (missing fields) - Add STRIPE_TESTING.md
with comprehensive testing guide:
- How to use Stripe test mode and test cards - How to use Stripe
CLI to trigger test webhooks - Instructions for running unit tests -
Database migration instructions for production - End-to-end testing
workflow - Common troubleshooting issues
Tests verify webhook handling works without calling real Stripe API.
|
|
- Replace direct dict key access with .get() for all subscription
fields - Add validation and early return for missing required fields -
Add logging warnings when subscription data is incomplete - Handles
both dict and Stripe object access patterns safely - Fixes KeyError:
'current_period_start' when processing webhooks
|
|
- Add hamburger toggle button positioned on right side - Navbar
collapses on small screens (< lg breakpoint) - Mobile view shows
vertically stacked elements:
- Logged in as: email - Free: X articles left [Upgrade Now] (free
users) - Billing (paid users only) - Admin Queue (admins only)
- Logout
- Remove 'Plan: Pro' text for paid users (just show Billing button)
- Add rounded corners to navbar with 'rounded' class - Remove 1px
bottom border in dark mode - Toggle controlled by Bootstrap's collapse
component
|
|
- Navbar now uses dark background (#2b3035) in dark mode - Add
border-bottom to separate navbar from content in dark mode - Ensure
navbar-text elements have proper light color (#dee2e6) in dark mode -
Maintains light mode appearance with bg-body-tertiary
|
|
- Change Upgrade Now button from btn-warning to btn-success -
Convert user info card to Bootstrap navbar with horizontal layout -
Free tier: quota text and Upgrade Now button inline with navbar-text
styling - Paid tier: plan name displayed inline as navbar-text -
Email, plan info, and action buttons all in single horizontal bar -
Uses bg-body-tertiary for automatic light/dark mode compatibility
|
|
- Replace '[Upgrade Now]' text link with proper btn-warning button -
Add arrow-up-circle icon to Upgrade Now button - Hide Billing button
for free tier users (they now have Upgrade Now) - Keep Billing button
visible for paid tier users
|
|
- Create shared UI module (Biz/PodcastItLater/UI.py) with:
- create_bootstrap_styles() - create_auto_dark_mode_style() -
create_htmx_script() - create_bootstrap_js()
- Update Admin.py to use shared UI module and add dark mode support -
Update Web.py to use shared UI module - Admin Queue and User Management
pages now support automatic dark mode
|
|
Subscribe link now appears inline next to label. Click copies URL to
clipboard and shows 'Copied!' feedback for 2 seconds. Link truncates
if too long to fit in bounding box.
|
|
Free tier users now see 'Free: X articles left [Upgrade Now]' banner.
Paid users see plan name with icon as before. Banner replaces the
old plan display in user info card.
|
|
Simplified pricing to two tiers: - Free: 10 articles total (lifetime)
- Pro: $29/month unlimited articles
Removed STRIPE_PRICE_ID_PERSONAL from configuration.
|
|
Free tier now has 10 articles total (lifetime) instead of 10 per month.
Period boundaries for free users now span from account creation to
far future.
|
|
New accounts now default to 'active' status instead of 'pending'.
Users can start using the service immediately after signup.
|