Feat: export and import JSONs - #15
Conversation
…ion how inner CV model maps to exported JSON files
…rder styles for improved interactivity
…roved URL handling
…rations for improved clarity and functionality
… clarity and consistency
… type generation and validator creation, update package dependencies, and enhance JSON Resume compatibility tests
… generation, outlining decision rationale and versioning strategy
…SE_URL for improved configuration and flexibility
…ove ESM compatibility and streamline standalone code generation
…sync-drawer component for cleaner production code
… in dashboard and hero sections, replacing NewCvButton and enhancing import functionality
|
Warning Review limit reached
More reviews will be available in 28 minutes and 4 seconds. Learn how PR review limits work. Your organization has run out of usage credits. Purchase more in the billing tab. ⌛ How to resolve this issue?After more reviews become available, a review can be triggered using the We recommend that you space out your commits to avoid hitting the rate limit. 🚦 How do rate limits work?CodeRabbit enforces hourly rate limits for each developer per organization. Our paid plans include higher PR review limits than trial, open-source, and free plans. In all cases, reviews become available again over time. During sustained high-volume PR review activity, CodeRabbit may temporarily slow when the next review becomes available. Please see our Fair Usage Limits Policy for further information. ℹ️ Review info⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Run ID: ⛔ Files ignored due to path filters (12)
📒 Files selected for processing (11)
📝 WalkthroughWalkthroughThis PR adds CV export/import with JSON Resume interoperability, introduces a self-contained JSON schema with generated types and validators, renames the test bridge infrastructure to dev bridge for clearer E2E semantics, expands the UI component library, and updates documentation with architectural decision records and feature guides. ChangesExport/Import and Serialization Feature
Test Bridge to Dev Bridge Infrastructure Rename
UI Component Library Expansion
Documentation, Configuration, and Supporting Changes
Estimated code review effort🎯 4 (Complex) | ⏱️ ~60 minutes Possibly related PRs
Poem
✨ Finishing Touches🧪 Generate unit tests (beta)
|
There was a problem hiding this comment.
Actionable comments posted: 13
🧹 Nitpick comments (8)
src/lib/components/ui/alert/alert.svelte (1)
4-16: 💤 Low valueConsider formatting the long base class string for readability.
The
baseclass string on line 5 is over 400 characters long and difficult to read. Consider splitting it across multiple lines for better maintainability.♻️ Proposed formatting
export const alertVariants = tv({ - base: "grid gap-0.5 rounded-lg border px-2.5 py-2 text-left text-sm has-data-[slot=alert-action]:relative has-data-[slot=alert-action]:pr-18 has-[>svg]:grid-cols-[auto_1fr] has-[>svg]:gap-x-2 *:[svg]:row-span-2 *:[svg]:translate-y-0.5 *:[svg]:text-current *:[svg:not([class*='size-'])]:size-4 group/alert relative w-full", + base: [ + "grid gap-0.5 rounded-lg border px-2.5 py-2 text-left text-sm", + "has-data-[slot=alert-action]:relative has-data-[slot=alert-action]:pr-18", + "has-[>svg]:grid-cols-[auto_1fr] has-[>svg]:gap-x-2", + "*:[svg]:row-span-2 *:[svg]:translate-y-0.5 *:[svg]:text-current", + "*:[svg:not([class*='size-'])]:size-4", + "group/alert relative w-full" + ].join(' '), variants: {🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/lib/components/ui/alert/alert.svelte` around lines 4 - 16, The long single-line class string in alertVariants (the base property passed to tv) is hard to read; refactor base by splitting it across multiple lines—either as an array of individual class segments joined with ' ' or as a multiline template literal concatenated into one string—and update the tv(...) call to use that assembled string so the final value remains identical; reference alertVariants and the base property to locate the change.src/lib/components/ui/button-group/button-group.svelte (1)
4-17: 💤 Low valueConsider formatting the long class strings for readability.
The
base,horizontal, andverticalclass strings are very long (200-400+ characters each) and difficult to read. Consider splitting them across multiple lines for better maintainability.♻️ Example formatting for base classes
export const buttonGroupVariants = tv({ - base: "has-[>[data-slot=button-group]]:gap-2 has-[select[aria-hidden=true]:last-child]:[&>[data-slot=select-trigger]:last-of-type]:rounded-r-lg flex w-fit items-stretch [&>*]:focus-visible:relative [&>*]:focus-visible:z-10 [&>[data-slot=select-trigger]:not([class*='w-'])]:w-fit [&>input]:flex-1", + base: [ + "has-[>[data-slot=button-group]]:gap-2", + "has-[select[aria-hidden=true]:last-child]:[&>[data-slot=select-trigger]:last-of-type]:rounded-r-lg", + "flex w-fit items-stretch", + "[&>*]:focus-visible:relative [&>*]:focus-visible:z-10", + "[&>[data-slot=select-trigger]:not([class*='w-'])]:w-fit", + "[&>input]:flex-1" + ].join(' '), variants: {🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/lib/components/ui/button-group/button-group.svelte` around lines 4 - 17, The long class strings in buttonGroupVariants (specifically the base property and variants.orientation.horizontal and .vertical) should be broken into smaller, readable fragments: replace each giant string with either an array of class segments joined by ' ' or a multi-line template literal that trims whitespace, keeping the same final class string; update the definitions for base, horizontal and vertical to build the class string from these fragments so the tv(...) call uses the identical combined string but with the source split across multiple lines for readability.src/lib/components/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte (1)
42-42: ⚡ Quick winConsider forwarding state parameters to the children snippet.
This component renders
childrenPropwithout parameters, whiledropdown-menu-radio-item.svelte(line 32) forwards{ checked }. For API consistency and to enable consumers to accesschecked/indeterminatestate, consider passing these values.See the related comment on
dropdown-menu-radio-item.sveltefor alignment options.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/lib/components/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte` at line 42, The childrenProp render call in dropdown-menu-checkbox-item.svelte should forward the checkbox state so consumers can access it; update the usage of childrenProp (the same prop used in the component) to be invoked with an object containing checked and indeterminate (the internal state variables) similar to how dropdown-menu-radio-item.svelte forwards { checked } so the API is consistent and callers can read both checked and indeterminate.src/lib/components/ui/dropdown-menu/dropdown-menu-radio-item.svelte (1)
32-32: ⚡ Quick winInconsistent snippet parameter passing with checkbox-item.
This component passes
{ checked }tochildrenProp(line 32), butdropdown-menu-checkbox-item.svelte(line 42) renders itschildrenPropwith no parameters. This creates an inconsistent API surface.Either both components should forward state to the consumer's snippet, or neither should. Forwarding state enables consumers to conditionally style or render based on checked/indeterminate state.
🔄 Suggested alignment options
Option 1: Forward state in both components (recommended)
Update
dropdown-menu-checkbox-item.svelteline 42:- {`@render` childrenProp?.()} + {`@render` childrenProp?.({ checked, indeterminate })}And update its type signature (lines 15-17):
}: WithoutChildrenOrChild<DropdownMenuPrimitive.CheckboxItemProps> & { - children?: Snippet; + children?: Snippet<[{ checked: boolean; indeterminate: boolean }]>; } = $props();Option 2: Remove params from radio-item
In this file, line 32:
- {`@render` childrenProp?.({ checked })} + {`@render` childrenProp?.()}🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/lib/components/ui/dropdown-menu/dropdown-menu-radio-item.svelte` at line 32, The radio-item component is passing a `{ checked }` object into the render prop (`childrenProp`) while the checkbox-item does not, causing an inconsistent API; fix by aligning both components — recommended: update `dropdown-menu-checkbox-item.svelte` to call its `childrenProp` with the same state object (e.g., `{ checked, indeterminate }` as applicable) and update that component's prop/type signature to accept the state object, or alternatively remove the `{ checked }` argument from `dropdown-menu-radio-item.svelte` so neither forwards state; ensure the symbol names `childrenProp`, `checked`, and `indeterminate` (if used) are used consistently across both components.scripts/gen-schema.mjs (2)
13-27: ⚡ Quick winAdd error handling for file write operations.
If
writeFileSyncfails (e.g., permission denied, disk full), the script will crash without a clear error message. Consider wrapping file operations in try-catch blocks to provide better diagnostics.🛡️ Proposed error handling
writeFile(filename, content) { + try { this.written.push(join(this.outDir, filename)); writeFileSync(join(this.outDir, filename), content); + } catch (error) { + console.error(`Failed to write ${filename}:`, error); + throw error; + } }🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@scripts/gen-schema.mjs` around lines 13 - 27, The TracedFileWriter.writeFile currently calls writeFileSync without error handling; wrap the writeFileSync call in a try-catch inside TracedFileWriter.writeFile (and only push to this.written after a successful write) and in the catch produce a clear, contextual error (include filename, outDir and the original error) either by rethrowing a new Error with that context or by logging via the same error-handling mechanism used elsewhere; ensure files() remains unchanged and constructor behavior is preserved.
29-33: ⚡ Quick winAdd error handling for schema file loading.
If the schema file is missing or contains invalid JSON,
readFileSyncorJSON.parsewill throw with a potentially unclear error. Consider adding try-catch with a helpful message.🛡️ Proposed error handling
+try { const schema = JSON.parse(readFileSync(schemaPath, 'utf8')); +} catch (error) { + console.error(`Failed to load schema from ${schemaPath}:`, error); + process.exit(1); +}🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@scripts/gen-schema.mjs` around lines 29 - 33, The current loading of the schema (variables root, schemaPath, outDir and the const schema = JSON.parse(readFileSync(schemaPath, 'utf8')) line) lacks error handling; wrap the readFileSync/JSON.parse in a try-catch, catch and log a clear error that includes schemaPath and the original error message, and exit with a non-zero code (or rethrow) so failure is explicit; ensure the catch references readFileSync/JSON.parse and schemaPath so it's easy to locate and diagnose missing file or invalid JSON issues.src/lib/features/serialization/validator.generated.d.ts (1)
1-9: 💤 Low valueGenerated file has inconsistent indentation.
Lines 2-8 have leading tabs while line 1 doesn't. This is a cosmetic issue in the generated output. Consider updating the generator script (lines 63-74 in
scripts/gen-schema.mjs) to use consistent formatting.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/lib/features/serialization/validator.generated.d.ts` around lines 1 - 9, The generated file validator.generated.d.ts has mixed tabs/spaces indentation; update the schema generator (the gen-schema script that emits the ValidateFn and validate declarations) to produce consistent indentation (e.g., replace tabs with two spaces or use a single indent strategy / pass a consistent formatter) so the emitted block containing ValidateFn, the validate declaration, and export default validate uses the same spacing; regenerate the file after changing the generator.src/lib/components/export/export-button.svelte (1)
54-55: ⚡ Quick winLog error before displaying toast.
The catch block swallows the error without logging, making debugging export failures difficult.
📝 Proposed fix to add error logging
- } catch { + } catch (error) { + console.error('Export failed:', error); toast.error('Export failed. Please try again.'); } finally {🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/lib/components/export/export-button.svelte` around lines 54 - 55, The catch block in export-button.svelte is swallowing errors; change it to capture the exception (e.g., catch (err)) and log the error before showing the toast in the export handler (the export button's export function / click handler). Use the project's logger if available (or console.error) to emit a descriptive message like "Export failed" along with the error object, then keep the existing toast.error('Export failed. Please try again.').
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@docs/agents/domain.md`:
- Line 38: Change the header "Writing ADRs" from Title Case to sentence case to
match the ADR guidance rule below: update the heading text "Writing ADRs" so it
uses sentence case (capitalize only the first word and proper nouns/acronyms
like "ADRs") to become "Writing ADRs" (first word capitalized, rest lowercase
except "ADRs").
In `@docs/decisions/ADR-001-indexeddb-dexie.md`:
- Around line 25-28: The fenced code block showing the IndexedDB structure (the
block containing "humblehire (IndexedDB database) └── cvs { id, updatedAt,
sourceId }") is missing a language identifier and triggers markdownlint MD040;
add a language tag (e.g., ```text) at the start of that fenced block in
ADR-001-indexeddb-dexie.md so the block becomes fenced with a language
identifier and closes as before.
In `@src/lib/components/export/export-button.svelte`:
- Around line 29-36: In triggerDownload, revoking the object URL immediately
after a.click() can abort some browser downloads; change the logic to defer
URL.revokeObjectURL(url) (for example by using a short setTimeout or listening
for the download to start) so the browser has time to begin the download before
revocation; update the function that creates the anchor (triggerDownload) to
revoke the URL asynchronously while keeping createObjectURL and a.download
intact.
In `@src/lib/components/ui/dropdown-menu/dropdown-menu-group-heading.svelte`:
- Around line 19-20: The rendered attribute data-inset={inset} outputs
data-inset="false" when inset is false, causing Tailwind's data-[inset]:ps-8 to
still match; change the attribute so it is only present when inset is truthy
(e.g., replace data-inset={inset} with data-inset={inset ? true : undefined} or
spread an object only when inset is true) in the DropdownMenuGroupHeading Svelte
component, leaving the cn('px-2 py-1.5 text-sm font-semibold data-[inset]:ps-8',
className) class usage unchanged.
In `@src/lib/components/ui/dropdown-menu/dropdown-menu-item.svelte`:
- Line 23: The class list in the DropdownMenuItem component contains duplicate
inset padding tokens (`data-inset:pl-7` and `data-[inset]:pl-8`) so remove the
redundant one (keep the intended padding, e.g., remove `data-inset:pl-7`) from
the class attribute in
src/lib/components/ui/dropdown-menu/dropdown-menu-item.svelte so only a single
`data-[inset]`/`data-inset` padding class remains.
In `@src/lib/components/ui/dropdown-menu/dropdown-menu-label.svelte`:
- Line 21: In DropdownMenuLabel
(src/lib/components/ui/dropdown-menu/dropdown-menu-label.svelte) the class list
contains duplicate inset padding directives ('data-inset:pl-7' and
'data-[inset]:pl-8') causing redundancy and conflict; remove the
lesser/incorrect one (keep only the intended inset padding syntax, e.g.,
'data-[inset]:pl-8' or standardize to 'data-inset:pl-8') from the class string
so only a single inset padding class remains.
In `@src/lib/components/ui/dropdown-menu/dropdown-menu-sub-trigger.svelte`:
- Around line 17-29: The class list on DropdownMenuPrimitive.SubTrigger contains
conflicting inset padding variants data-inset:pl-7 and data-[inset]:pl-8; remove
one so only a single data-inset variant remains (pick the desired padding, e.g.,
keep data-inset:pl-7 or data-[inset]:pl-8) in the class expression inside the cn
call to eliminate the conflicting CSS rules.
In `@src/lib/features/serialization/__fixtures__/complete-cv.ts`:
- Around line 84-93: The fixture currently computes blockHashes from the local
blocks variable before applying overrides, which can lead to mismatches when
overrides.blocks is provided; change the return construction so blockHashes is
computed from the effective blocks after merging overrides (e.g., determine
finalBlocks = overrides.blocks ?? blocks or merge overrides into the base
blocks, then call computeBlockHashes(finalBlocks)) and use that finalBlocks for
the blocks and blockHashes properties so they always stay consistent (refer to
computeBlockHashes, blocks, blockHashes, and overrides).
In `@src/lib/features/serialization/import.ts`:
- Around line 12-20: The importDocument function currently calls db.cvs.add(cv)
which can throw IndexedDB/write errors and those exceptions are not translated
into the ImportResult contract; wrap the persistence step (the await
db.cvs.add(cv) call inside importDocument) in a try/catch, and on failure return
{ ok: false, error: <meaningful Error or message> } instead of letting the
promise reject; keep the existing behavior for parsing failures (parsed.ok) and
ensure you still compute block hashes (computeBlockHashes), unmappedSections,
and convert with fromDocument before attempting to persist so callers always
receive an ImportResult object on error or success.
In `@src/lib/features/serialization/serialize.ts`:
- Around line 166-167: The export logic omits the explicit current flag which
causes entries with current:true and no dates to round-trip incorrectly; for
each place building the serialized object (the blocks using endDate: j.current ?
undefined : formatDate(j.endDate) and similar for startDate), include the
explicit current property (e.g., add current: j.current) so the exported JSON
preserves the current boolean even when startDate/endDate are absent; apply this
change to the other similar spots referenced (the blocks around the alternative
occurrences noted) so all serialized objects retain current explicitly.
- Around line 193-199: The current serialization for doc.projects uses
projects.map and sets keywords with p.stack.map(...).filter(Boolean) ||
undefined which always produces an array (possibly empty) and thus serializes
empty stacks as keywords: []; update the mapping for each ProjectEntry in the
projects.map callback to compute keywords first (e.g., from
p.stack?.map(...).filter(Boolean) or similar) and then assign keywords:
keywords.length ? keywords : undefined so the keywords field is omitted when
there are no non-empty tokens; modify the project mapping in serialize.ts (the
doc.projects assignment / projects.map callback) accordingly.
In `@src/routes/`+layout.svelte:
- Around line 21-25: The env checks use string-valued import.meta.env flags and
currently test truthiness; update all uses of VITE_DEV_BRIDGE, VITE_DEV_NO_SW,
and VITE_DEV_TOOLBOX to compare explicitly to the string "true" (e.g., use
import.meta.env.VITE_DEV_BRIDGE === 'true', import.meta.env.VITE_DEV_NO_SW !==
'true' for the negated case, and import.meta.env.VITE_DEV_TOOLBOX === 'true'
inside the Svelte {`#if` ...} block) so that values like "false" behave correctly.
In `@static/schema/resume/v0.0.1.json`:
- Around line 7-10: The "iso8601" schema's "pattern" currently allows invalid
months/days; update the regex for the "iso8601" property's "pattern" so the
month uses (0[1-9]|1[0-2]) and the day uses (0[1-9]|[12][0-9]|3[01]) while
preserving the existing alternatives for year-only and year-month forms in the
"iso8601" entry; locate the "iso8601" object and replace the overly-permissive
month/day character classes in its "pattern" value accordingly.
---
Nitpick comments:
In `@scripts/gen-schema.mjs`:
- Around line 13-27: The TracedFileWriter.writeFile currently calls
writeFileSync without error handling; wrap the writeFileSync call in a try-catch
inside TracedFileWriter.writeFile (and only push to this.written after a
successful write) and in the catch produce a clear, contextual error (include
filename, outDir and the original error) either by rethrowing a new Error with
that context or by logging via the same error-handling mechanism used elsewhere;
ensure files() remains unchanged and constructor behavior is preserved.
- Around line 29-33: The current loading of the schema (variables root,
schemaPath, outDir and the const schema = JSON.parse(readFileSync(schemaPath,
'utf8')) line) lacks error handling; wrap the readFileSync/JSON.parse in a
try-catch, catch and log a clear error that includes schemaPath and the original
error message, and exit with a non-zero code (or rethrow) so failure is
explicit; ensure the catch references readFileSync/JSON.parse and schemaPath so
it's easy to locate and diagnose missing file or invalid JSON issues.
In `@src/lib/components/export/export-button.svelte`:
- Around line 54-55: The catch block in export-button.svelte is swallowing
errors; change it to capture the exception (e.g., catch (err)) and log the error
before showing the toast in the export handler (the export button's export
function / click handler). Use the project's logger if available (or
console.error) to emit a descriptive message like "Export failed" along with the
error object, then keep the existing toast.error('Export failed. Please try
again.').
In `@src/lib/components/ui/alert/alert.svelte`:
- Around line 4-16: The long single-line class string in alertVariants (the base
property passed to tv) is hard to read; refactor base by splitting it across
multiple lines—either as an array of individual class segments joined with ' '
or as a multiline template literal concatenated into one string—and update the
tv(...) call to use that assembled string so the final value remains identical;
reference alertVariants and the base property to locate the change.
In `@src/lib/components/ui/button-group/button-group.svelte`:
- Around line 4-17: The long class strings in buttonGroupVariants (specifically
the base property and variants.orientation.horizontal and .vertical) should be
broken into smaller, readable fragments: replace each giant string with either
an array of class segments joined by ' ' or a multi-line template literal that
trims whitespace, keeping the same final class string; update the definitions
for base, horizontal and vertical to build the class string from these fragments
so the tv(...) call uses the identical combined string but with the source split
across multiple lines for readability.
In `@src/lib/components/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte`:
- Line 42: The childrenProp render call in dropdown-menu-checkbox-item.svelte
should forward the checkbox state so consumers can access it; update the usage
of childrenProp (the same prop used in the component) to be invoked with an
object containing checked and indeterminate (the internal state variables)
similar to how dropdown-menu-radio-item.svelte forwards { checked } so the API
is consistent and callers can read both checked and indeterminate.
In `@src/lib/components/ui/dropdown-menu/dropdown-menu-radio-item.svelte`:
- Line 32: The radio-item component is passing a `{ checked }` object into the
render prop (`childrenProp`) while the checkbox-item does not, causing an
inconsistent API; fix by aligning both components — recommended: update
`dropdown-menu-checkbox-item.svelte` to call its `childrenProp` with the same
state object (e.g., `{ checked, indeterminate }` as applicable) and update that
component's prop/type signature to accept the state object, or alternatively
remove the `{ checked }` argument from `dropdown-menu-radio-item.svelte` so
neither forwards state; ensure the symbol names `childrenProp`, `checked`, and
`indeterminate` (if used) are used consistently across both components.
In `@src/lib/features/serialization/validator.generated.d.ts`:
- Around line 1-9: The generated file validator.generated.d.ts has mixed
tabs/spaces indentation; update the schema generator (the gen-schema script that
emits the ValidateFn and validate declarations) to produce consistent
indentation (e.g., replace tabs with two spaces or use a single indent strategy
/ pass a consistent formatter) so the emitted block containing ValidateFn, the
validate declaration, and export default validate uses the same spacing;
regenerate the file after changing the generator.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: 37325419-b09e-40e2-9b4b-32d26827c3f3
⛔ Files ignored due to path filters (1)
pnpm-lock.yamlis excluded by!**/pnpm-lock.yaml
📒 Files selected for processing (105)
.prettierignoreCONTEXT.mdREADME.mdassets-cli/package.jsonassets-cli/src/helpers/dwight.tsassets-cli/src/recipes/dashboard-search.tsassets-cli/src/recipes/dashboard.tsassets-cli/src/recipes/editor.tsassets-cli/src/recipes/export.tsassets-cli/src/recipes/tailoring.tsassets-cli/src/server.tsdev-bridge/package.jsondev-bridge/src/index.tsdev-bridge/tsconfig.jsondocs/agents/domain.mddocs/decisions/ADR-001-indexeddb-dexie.mddocs/decisions/ADR-002-client-side-pdf-generation.mddocs/decisions/ADR-003-dashboard-search.mddocs/decisions/ADR-004-e2e-test-strategy.mddocs/decisions/ADR-005-pwa-and-durable-storage.mddocs/decisions/ADR-006-export-import-schema-as-dto.mddocs/decisions/ADR-007-pdf-js-preview.mddocs/decisions/ADR-008-self-contained-schema.mddocs/decisions/ADR-009-generated-types-from-schema.mddocs/features/export/OVERVIEW.mddocs/features/import/OVERVIEW.mddocs/reference/serialization-schema.mde2e/dashboard.spec.tse2e/editor.spec.tse2e/export.spec.tse2e/tailoring.spec.tse2e/tsconfig.jsoneslint.config.jspackage.jsonplaywright.config.tspnpm-workspace.yamlscripts/gen-schema.mjssrc/app.d.tssrc/lib/analytics.tssrc/lib/components/cv/create-cv-actions.sveltesrc/lib/components/cv/index.tssrc/lib/components/dashboard/dashboard.sveltesrc/lib/components/dashboard/index.tssrc/lib/components/dashboard/master-group.sveltesrc/lib/components/dashboard/new-cv-button.sveltesrc/lib/components/dashboard/tailored-row.sveltesrc/lib/components/editor/cv-editor-toolbar.sveltesrc/lib/components/editor/export-button.sveltesrc/lib/components/editor/index.tssrc/lib/components/export/export-button.sveltesrc/lib/components/export/index.tssrc/lib/components/import/import-button.sveltesrc/lib/components/import/import-dialog.sveltesrc/lib/components/import/index.tssrc/lib/components/landing/about.sveltesrc/lib/components/landing/hero.sveltesrc/lib/components/tailoring/sync-drawer.sveltesrc/lib/components/ui/alert/alert-action.sveltesrc/lib/components/ui/alert/alert-description.sveltesrc/lib/components/ui/alert/alert-title.sveltesrc/lib/components/ui/alert/alert.sveltesrc/lib/components/ui/alert/index.tssrc/lib/components/ui/button-group/button-group-separator.sveltesrc/lib/components/ui/button-group/button-group-text.sveltesrc/lib/components/ui/button-group/button-group.sveltesrc/lib/components/ui/button-group/index.tssrc/lib/components/ui/dropdown-menu/dropdown-menu-checkbox-group.sveltesrc/lib/components/ui/dropdown-menu/dropdown-menu-checkbox-item.sveltesrc/lib/components/ui/dropdown-menu/dropdown-menu-content.sveltesrc/lib/components/ui/dropdown-menu/dropdown-menu-group-heading.sveltesrc/lib/components/ui/dropdown-menu/dropdown-menu-group.sveltesrc/lib/components/ui/dropdown-menu/dropdown-menu-item.sveltesrc/lib/components/ui/dropdown-menu/dropdown-menu-label.sveltesrc/lib/components/ui/dropdown-menu/dropdown-menu-portal.sveltesrc/lib/components/ui/dropdown-menu/dropdown-menu-radio-group.sveltesrc/lib/components/ui/dropdown-menu/dropdown-menu-radio-item.sveltesrc/lib/components/ui/dropdown-menu/dropdown-menu-separator.sveltesrc/lib/components/ui/dropdown-menu/dropdown-menu-shortcut.sveltesrc/lib/components/ui/dropdown-menu/dropdown-menu-sub-content.sveltesrc/lib/components/ui/dropdown-menu/dropdown-menu-sub-trigger.sveltesrc/lib/components/ui/dropdown-menu/dropdown-menu-sub.sveltesrc/lib/components/ui/dropdown-menu/dropdown-menu-trigger.sveltesrc/lib/components/ui/dropdown-menu/dropdown-menu.sveltesrc/lib/components/ui/dropdown-menu/index.tssrc/lib/components/ui/separator/separator.sveltesrc/lib/config.tssrc/lib/dev-bridge.tssrc/lib/features/serialization/__fixtures__/complete-cv.tssrc/lib/features/serialization/document.generated.tssrc/lib/features/serialization/import.tssrc/lib/features/serialization/jsonresume-compat.test.tssrc/lib/features/serialization/jsonresume-schema-shims.d.tssrc/lib/features/serialization/parse.test.tssrc/lib/features/serialization/parse.tssrc/lib/features/serialization/serialize.test.tssrc/lib/features/serialization/serialize.tssrc/lib/features/serialization/validator.generated.d.tssrc/lib/features/serialization/validator.generated.jssrc/lib/pwa/sw-router.test.tssrc/lib/services/cv/add-blank-cv.tssrc/routes/+layout.sveltesrc/routes/+page.sveltesrc/stories/blocks/helpers/ProjectsWrapper.sveltestatic/schema/resume/v0.0.1.jsonsvelte.config.js
💤 Files with no reviewable changes (6)
- src/lib/components/editor/export-button.svelte
- src/lib/components/tailoring/sync-drawer.svelte
- src/lib/analytics.ts
- src/lib/components/editor/index.ts
- src/lib/components/dashboard/new-cv-button.svelte
- src/lib/components/dashboard/index.ts
…pdate import dialog for better error messaging
Summary by CodeRabbit
Release Notes
New Features
Documentation