Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions .github/workflows/pages.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
name: Pages
on: { push: { branches: [master], paths: [docs/**, .github/workflows/pages.yml, bun.lock, package.json] }, workflow_dispatch: {} }
permissions: { contents: read, pages: write, id-token: write }
Comment thread
coderabbitai[bot] marked this conversation as resolved.
concurrency: { group: pages, cancel-in-progress: false }
jobs:
pages:
Comment thread
coderabbitai[bot] marked this conversation as resolved.
environment: { name: github-pages, url: "${{ steps.deploy.outputs.page_url }}" }
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
- uses: kjanat/runner@master
- uses: oven-sh/setup-bun@v2
- run: runner --dir=docs install build
env: { BASE_PATH: "/${{ github.event.repository.name }}", RUNNER_PM: bun }
- uses: actions/upload-pages-artifact@v5
with: { path: docs/build }
- id: deploy
uses: actions/deploy-pages@v5
Comment thread
coderabbitai[bot] marked this conversation as resolved.
4 changes: 2 additions & 2 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,8 @@ dist/
downloads/
eggs/
.eggs/
lib/
lib64/
/lib/
/lib64/
parts/
sdist/
var/
Expand Down
8 changes: 8 additions & 0 deletions .mcp.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"mcpServers": {
"svelte": {
"type": "http",
"url": "https://mcp.svelte.dev/mcp"
}
}
}
1 change: 1 addition & 0 deletions .npmrc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
engine-strict=true
6 changes: 6 additions & 0 deletions .opencode/opencode.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"$schema": "https://opencode.ai/config.json",
"plugin": [
"@sveltejs/opencode"
]
}
3 changes: 3 additions & 0 deletions .opencode/svelte.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"$schema": "https://svelte.dev/opencode/schema.json"
}
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -210,7 +210,7 @@ See [TROUBLESHOOTING].
to a `.txt` file attachment instead of dropping it, so you don't lose data. This applies to long notes as well as
custom fields.

["🧪 Test this PR"]: https://github.com/kjanat/kp2bw/pull/25#issuecomment-4661427123 "Example"
["🧪 Test this PR"]: https://github.com/kjanat/kp2bw/pull/34#issuecomment-4763225590 "Example"
[Bitwarden CLI]: https://bitwarden.com/help/cli/
[TROUBLESHOOTING]: ./TROUBLESHOOTING.md
[`.env.example`]: ./.env.example
Expand Down
531 changes: 493 additions & 38 deletions bun.lock

Large diffs are not rendered by default.

23 changes: 23 additions & 0 deletions docs/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
node_modules

# Output
.output
.vercel
.netlify
.wrangler
/.svelte-kit
/build

# OS
.DS_Store
Thumbs.db

# Env
.env
.env.*
!.env.example
!.env.test

# Vite
vite.config.js.timestamp-*
vite.config.ts.timestamp-*
34 changes: 34 additions & 0 deletions docs/AGENTS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
## Project Configuration

- **Language**: TypeScript
- **Package Manager**: bun
- **Add-ons**: mcp, vitest, eslint

---

You are able to use the Svelte MCP server, where you have access to comprehensive Svelte 5 and SvelteKit documentation.
Here's how to use the available tools effectively:

## Available Svelte MCP Tools:

### 1. list-sections

Use this FIRST to discover all available documentation sections. Returns a structured list with titles, use_cases, and
paths. When asked about Svelte or SvelteKit topics, ALWAYS use this tool at the start of the chat to find relevant
sections.

### 2. get-documentation

Retrieves full documentation content for specific sections. Accepts single or multiple sections. After calling the
list-sections tool, you MUST analyze the returned documentation sections (especially the use_cases field) and then use
the get-documentation tool to fetch ALL documentation sections that are relevant for the user's task.

### 3. svelte-autofixer

Analyzes Svelte code and returns issues and suggestions. You MUST use this tool whenever writing Svelte code before
sending it to the user. Keep calling it until no issues or suggestions are returned.

### 4. playground-link

Generates a Svelte Playground link with the provided code. After completing the code, ask the user if they want a
playground link. Only call this tool after user confirmation and NEVER if code was written to files in their project.
32 changes: 32 additions & 0 deletions docs/README.md
Comment thread
kjanat marked this conversation as resolved.
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# kp2bw Migration Planner

This docs site helps you choose the safest KeePass-to-Bitwarden migration shape before running `kp2bw`.

Open these pages in the docs site:

- [Migration planner](https://kjanat.github.io/kp2bw/): choose options, preview the trees, copy the command.
- [Detailed option guide](https://kjanat.github.io/kp2bw/docs/): learn what each choice means before running it.
Comment thread
coderabbitai[bot] marked this conversation as resolved.

Source routes:

- [Planner route](./src/routes/+page.svelte)
- [Details route](./src/routes/docs/+page.svelte)

The planner shows the source KeePass tree beside the Bitwarden result tree and turns your choices into the exact `.env`
values and `kp2bw` command to run.

## What It Helps Decide

- Personal vault import with folders, or a flat personal import.
- Organization import into nested collections, top-level collections, one fixed collection, or no generated hierarchy.
- Whether an organization import should also create personal folders with `--folder`.
- Whether a rerun should protect Bitwarden edits, skip updates, or force KeePass to win.
- Which tags, expired entries, and Recycle Bin entries are included.

## Important Defaults

- Personal vault is the no-flag default: `kp2bw vault.kdbx`.
- Organization imports default to collections only; personal folders stay off unless `--folder` is selected.
- Expired entries are included unless `--skip-expired` is selected.
- Recycle Bin entries are excluded unless `--include-recycle-bin` is selected.
- Tag-filtered commands include `--` before the KeePass file so the file path is not parsed as another tag.
38 changes: 38 additions & 0 deletions docs/eslint.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import js from '@eslint/js';
import svelte from 'eslint-plugin-svelte';
import { defineConfig, includeIgnoreFile } from 'eslint/config';
import globals from 'globals';
import path from 'node:path';
import ts from 'typescript-eslint';

const gitignorePath = path.resolve(import.meta.dirname, '.gitignore');

export default defineConfig(
includeIgnoreFile(gitignorePath),
js.configs.recommended,
ts.configs.recommended,
svelte.configs.recommended,
{
languageOptions: { globals: { ...globals.browser, ...globals.node } },
rules: {
// typescript-eslint strongly recommend that you do not use the no-undef lint rule on TypeScript projects.
// see: https://typescript-eslint.io/troubleshooting/faqs/eslint/#i-get-errors-from-the-no-undef-rule-about-global-variables-not-being-defined-even-though-there-are-no-typescript-errors
'no-undef': 'off',
},
},
{
files: ['**/*.svelte', '**/*.svelte.ts', '**/*.svelte.js'],
languageOptions: {
parserOptions: {
projectService: true,
extraFileExtensions: ['.svelte'],
parser: ts.parser,
},
},
},
{
// Override or add rule settings here, such as:
// 'svelte/button-has-type': 'error'
rules: {},
},
);
37 changes: 37 additions & 0 deletions docs/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
{
"name": "docs",
"private": true,
"version": "0.0.1",
"type": "module",
"scripts": {
"dev": "vite dev",
"build": "vite build",
"preview": "vite preview",
"prepare": "svelte-kit sync 2>&1",
"check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
"check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
"test:unit": "vitest",
"test": "run test:unit run",
Comment thread
kjanat marked this conversation as resolved.
"lint": "eslint"
},
"devDependencies": {
"@eslint/js": "^10.0.1",
"@sveltejs/adapter-static": "^3.0.10",
"@sveltejs/kit": "^2.63.0",
"@sveltejs/vite-plugin-svelte": "^7.1.2",
"@types/node": "^24",
"@vitest/browser-playwright": "^4.1.8",
"eslint": "^10.4.1",
"eslint-plugin-svelte": "^3.19.0",
"globals": "^17.6.0",
"playwright": "^1.60.0",
"runner-run": "catalog:",
"svelte": "^5.56.1",
"svelte-check": "^4.6.0",
"typescript": "^6.0.3",
"typescript-eslint": "^8.60.1",
"vite": "^8.0.16",
"vitest": "^4.1.8",
"vitest-browser-svelte": "^2.1.1"
}
}
13 changes: 13 additions & 0 deletions docs/src/app.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
// See https://svelte.dev/docs/kit/types#app.d.ts
// for information about these interfaces
declare global {
namespace App {
// interface Error {}
// interface Locals {}
// interface PageData {}
// interface PageState {}
// interface Platform {}
}
}

export {};
12 changes: 12 additions & 0 deletions docs/src/app.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="text-scale" content="scale">
Comment thread
coderabbitai[bot] marked this conversation as resolved.
%sveltekit.head%
</head>
<body data-sveltekit-preload-data="hover">
<div style="display: contents">%sveltekit.body%</div>
</body>
</html>
8 changes: 8 additions & 0 deletions docs/src/lib/assets/favicon.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading