Hardcoded "Signer" roleName caused envelopes to send without tags. Now
fetches template recipients first and assigns test recipient to every role,
falling back to "Signer" only if the template fetch fails.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Backend returns "completed" but pollJob only checked "done"/"complete",
causing infinite polling and oscillating UI state.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
parts.slice(0,3) was returning the full path as base; should be slice(0,2)
so '#/templates/abc123' yields base='#/templates', param='abc123'.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
GET /api/auth/{adobe,docusign}/connect and /disconnect — not POST.
api.js was calling them with POST, causing 405 Method Not Allowed.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Three sections: Verification (test recipient name/email, auto-void timer),
Migration Defaults (overwrite toggle, include documents toggle), Connections
(read-only auth status + account IDs from /api/auth/status). Save writes to
localStorage key 'migrator_settings'. Values pre-read by migration options
modal and verification send dialog.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Filterable by template name, status (success/error/dry_run/skipped), and
date range. Sortable by all columns. Expandable rows show blockers/warnings.
Checksum displayed as first 8 chars with full hash on hover tooltip.
Client-side CSV export. 50 records per page with prev/next pagination.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Backend (web/routers/verify.py): POST /send (creates envelope from template),
GET /status/{id} (polls envelope state), POST /void/{id} (voids test envelope).
Registered in app.py. 7 tests passing.
Frontend (verification.js): table of migrated templates, Send Test button opens
dialog with pre-filled name/email from settings, polling every 5s, per-row
status updates (Sent → Delivered → Verified), Void button for cleanup.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Dedicated view surfacing all templates with blockers (migration will fail)
and warnings (migration with caveats). Each blocker item shows all error
messages; each warning item has a Migrate Anyway button and View Detail link.
Nav badge count driven by state.issueCount (updated when templates load).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Backend: add blockers[] and warnings[] to GET /api/templates/status. Calls
validate_template() on downloaded templates; returns empty lists if not
downloaded. 3 new tests (10 total, all passing).
Frontend (templates.js): filterable/sortable table with readiness badges
(Blocked/Caveats/Ready/Migrated/Needs Update), bulk-select toolbar,
per-row migrate/detail buttons, and template detail view with 3 tabs
(Overview, Issues, Migration History).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Projects stored in localStorage (key: migrator_projects). CRUD: create,
list, setActive, delete. Switcher modal opens automatically on first run
when no projects exist. Active project name displayed in nav footer and
project button. Deleting a project requires confirmation.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- GET /api/auth/adobe/connect: reads ADOBE_REFRESH_TOKEN from .env,
refreshes the access token, stores in session — no login required
- Falls back to OAuth dialog only if no .env credentials exist
- Restores DocuSign OAuth start/callback endpoints alongside JWT connect
- 33/33 tests passing
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replaces the DocuSign OAuth redirect flow with a direct JWT grant call
using credentials already in .env (same as the CLI). Clicking
"Connect DocuSign" now calls GET /api/auth/docusign/connect which calls
get_access_token() and stores the result in the session cookie.
No email sign-in required.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The Adobe Sign OAuth app has https://localhost:8080/callback registered
(same as CLI). The web UI now uses the same manual paste flow:
- GET /api/auth/adobe/url returns the auth URL for the frontend to open
- POST /api/auth/adobe/exchange accepts the full redirect URL the user
copies after authorizing, extracts the code, exchanges for tokens
- Dialog UI guides user through the 3-step process
DocuSign keeps its standard redirect callback flow unchanged.
31/31 tests passing.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>