diff --git a/.forgejo/workflows/check.yml b/.forgejo/workflows/check.yml deleted file mode 100644 index 6e13d91..0000000 --- a/.forgejo/workflows/check.yml +++ /dev/null @@ -1,74 +0,0 @@ -name: Check - -on: - push: - branches: ['main'] - pull_request: - branches: ['main'] - -env: - CARGO_TERM_COLOR: always - RUSTFLAGS: '-Dwarnings' - -jobs: - build: - runs-on: docker - - steps: - - uses: actions/checkout@v4 - - - name: Setup Node - uses: actions/setup-node@v4 - with: - node-version: '22.x' - check-latest: true - - - name: Cache Rust dependencies - uses: actions/cache@v4 - with: - path: | - ~/.cargo/bin/ - ~/.cargo/registry/index/ - ~/.cargo/registry/cache/ - ~/.cargo/git/db/ - target/ - key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} - restore-keys: | - ${{ runner.os }}-cargo- - - - name: Cache npm dependencies - uses: actions/cache@v4 - with: - path: | - reconcile-js/node_modules - examples/website/node_modules - ~/.npm - key: >- - ${{ runner.os }}-npm-${{ - hashFiles( - 'reconcile-js/package-lock.json', - 'examples/website/package-lock.json' - ) - }} - restore-keys: | - ${{ runner.os }}-npm- - - - name: Install Rust toolchain - run: | - curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs \ - | sh -s -- -y --default-toolchain none --profile minimal - echo "$HOME/.cargo/bin" >> "$GITHUB_PATH" - - - name: Install uv - run: | - curl --proto '=https' --tlsv1.2 -LsSf https://astral.sh/uv/install.sh | sh - echo "$HOME/.local/bin" >> "$GITHUB_PATH" - - - name: Lint - run: scripts/lint.sh - - - name: Test - run: scripts/test.sh - - - name: Build website - run: scripts/build-website.sh diff --git a/.forgejo/workflows/publish.yml b/.forgejo/workflows/publish.yml deleted file mode 100644 index d546361..0000000 --- a/.forgejo/workflows/publish.yml +++ /dev/null @@ -1,172 +0,0 @@ -name: Publish - -on: - push: - branches: ['main'] - tags: ['*'] - workflow_dispatch: - -env: - CARGO_TERM_COLOR: always - RUSTFLAGS: '-Dwarnings' - -concurrency: - group: 'pages' - cancel-in-progress: false - -jobs: - build: - runs-on: docker - - steps: - - uses: actions/checkout@v4 - - - name: Setup Node - uses: actions/setup-node@v4 - with: - node-version: '22.x' - check-latest: true - - - name: Cache Rust dependencies - uses: actions/cache@v4 - with: - path: | - ~/.cargo/bin/ - ~/.cargo/registry/index/ - ~/.cargo/registry/cache/ - ~/.cargo/git/db/ - target/ - key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} - restore-keys: | - ${{ runner.os }}-cargo- - - - name: Cache npm dependencies - uses: actions/cache@v4 - with: - path: | - reconcile-js/node_modules - examples/website/node_modules - ~/.npm - key: >- - ${{ runner.os }}-npm-${{ - hashFiles( - 'reconcile-js/package-lock.json', - 'examples/website/package-lock.json' - ) - }} - restore-keys: | - ${{ runner.os }}-npm- - - - name: Install Rust toolchain - run: | - curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs \ - | sh -s -- -y --default-toolchain none --profile minimal - echo "$HOME/.cargo/bin" >> "$GITHUB_PATH" - - - name: Install uv - run: | - curl --proto '=https' --tlsv1.2 -LsSf https://astral.sh/uv/install.sh | sh - echo "$HOME/.local/bin" >> "$GITHUB_PATH" - - - name: Lint - run: scripts/lint.sh - - - name: Test - run: scripts/test.sh - - - name: Build website - run: scripts/build-website.sh - - - name: Deploy to pages mount - if: github.event_name == 'push' && github.ref == 'refs/heads/main' - run: | - apt-get update && apt-get install -y rsync - rsync -a --delete examples/website/dist/ /pages/reconcile - - publish-crate: - needs: build - runs-on: docker - if: startsWith(github.ref, 'refs/tags/') - - steps: - - uses: actions/checkout@v4 - - - name: Cache Rust dependencies - uses: actions/cache@v4 - with: - path: | - ~/.cargo/bin/ - ~/.cargo/registry/index/ - ~/.cargo/registry/cache/ - ~/.cargo/git/db/ - target/ - key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} - restore-keys: | - ${{ runner.os }}-cargo- - - - name: Install Rust toolchain - run: | - curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs \ - | sh -s -- -y --default-toolchain none --profile minimal - echo "$HOME/.cargo/bin" >> "$GITHUB_PATH" - - - name: Publish to crates.io - run: cargo publish --token ${{ secrets.CRATES_IO_TOKEN }} - - publish-npm: - needs: build - runs-on: docker - if: startsWith(github.ref, 'refs/tags/') - - steps: - - uses: actions/checkout@v4 - - - name: Setup Node - uses: actions/setup-node@v4 - with: - node-version: '22.x' - check-latest: true - registry-url: 'https://registry.npmjs.org' - - - name: Cache Rust dependencies - uses: actions/cache@v4 - with: - path: | - ~/.cargo/bin/ - ~/.cargo/registry/index/ - ~/.cargo/registry/cache/ - ~/.cargo/git/db/ - target/ - key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} - restore-keys: | - ${{ runner.os }}-cargo- - - - name: Cache npm dependencies - uses: actions/cache@v4 - with: - path: | - reconcile-js/node_modules - ~/.npm - key: >- - ${{ runner.os }}-npm-${{ - hashFiles('reconcile-js/package-lock.json') - }} - restore-keys: | - ${{ runner.os }}-npm- - - - name: Install Rust toolchain - run: | - curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs \ - | sh -s -- -y --default-toolchain none --profile minimal - echo "$HOME/.cargo/bin" >> "$GITHUB_PATH" - - - name: Build website - run: scripts/build-website.sh - - - name: Publish reconcile-js to NPM - run: | - cd reconcile-js - cp ../README.md . - npm publish - env: - NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..f5af792 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,26 @@ +# To get started with Dependabot version updates, you'll need to specify which +# package ecosystems to update and where the package manifests are located. +# Please see the documentation for all configuration options: +# https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file + +version: 2 +updates: + - package-ecosystem: 'cargo' + directories: ['**'] + schedule: + interval: 'daily' + + - package-ecosystem: 'github-actions' + directories: ['**'] + schedule: + interval: 'daily' + + - package-ecosystem: 'npm' + directories: ['/reconcile-js', '/examples/website'] + schedule: + interval: 'daily' + + - package-ecosystem: 'pip' + directories: ['/reconcile-python'] + schedule: + interval: 'daily' diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml new file mode 100644 index 0000000..9e0b2bb --- /dev/null +++ b/.github/workflows/check.yml @@ -0,0 +1,197 @@ +name: Check & publish + +on: + push: + branches: ['main'] + tags: ['*'] + pull_request: + branches: ['main'] + +env: + CARGO_TERM_COLOR: always + RUSTFLAGS: '-Dwarnings' + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v6 + + - name: Setup Node.js environment + uses: actions/setup-node@v6.3.0 + with: + node-version: '22.x' + check-latest: true + + - name: Install uv + uses: astral-sh/setup-uv@v7 + + - name: Cache Rust dependencies + uses: actions/cache@v5 + with: + path: | + ~/.cargo/bin/ + ~/.cargo/registry/index/ + ~/.cargo/registry/cache/ + ~/.cargo/git/db/ + target/ + key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} + restore-keys: | + ${{ runner.os }}-cargo- + + - name: Lint + run: scripts/lint.sh + + - name: Test + run: scripts/test.sh + + publish-crate: + needs: build + runs-on: ubuntu-latest + if: startsWith(github.ref, 'refs/tags/') + + steps: + - uses: actions/checkout@v6 + + - name: Cache Rust dependencies + uses: actions/cache@v5 + with: + path: | + ~/.cargo/bin/ + ~/.cargo/registry/index/ + ~/.cargo/registry/cache/ + ~/.cargo/git/db/ + target/ + key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} + restore-keys: | + ${{ runner.os }}-cargo- + + - name: Publish to crates.io + run: cargo publish --token ${{ secrets.CRATES_IO_TOKEN }} + + publish-npm: + needs: build + runs-on: ubuntu-latest + if: startsWith(github.ref, 'refs/tags/') + permissions: + contents: read + id-token: write + + steps: + - uses: actions/checkout@v6 + + - name: Setup Node.js environment + uses: actions/setup-node@v6.3.0 + with: + node-version: '24.x' + check-latest: true + + - name: Cache Rust dependencies + uses: actions/cache@v5 + with: + path: | + ~/.cargo/bin/ + ~/.cargo/registry/index/ + ~/.cargo/registry/cache/ + ~/.cargo/git/db/ + target/ + key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} + restore-keys: | + ${{ runner.os }}-cargo- + + - name: Cache npm dependencies + uses: actions/cache@v5 + with: + path: | + reconcile-js/node_modules + ~/.npm + key: ${{ runner.os }}-npm-${{ hashFiles('reconcile-js/package-lock.json') }} + restore-keys: | + ${{ runner.os }}-npm- + + - name: Build website + run: scripts/build-website.sh + + - name: Publish reconcile-js to NPM + run: | + cd reconcile-js + cp ../README.md . + npm publish --access public + + build-python-wheels: + needs: build + if: startsWith(github.ref, 'refs/tags/') + strategy: + matrix: + include: + - os: ubuntu-latest + target: x86_64 + - os: ubuntu-latest + target: aarch64 + - os: macos-latest + target: x86_64 + - os: macos-latest + target: aarch64 + - os: windows-latest + target: x86_64 + runs-on: ${{ matrix.os }} + + steps: + - uses: actions/checkout@v6 + + - uses: actions/setup-python@v6 + with: + python-version: '3.x' + + - name: Copy README + run: cp README.md reconcile-python/ + + - uses: PyO3/maturin-action@v1 + with: + target: ${{ matrix.target }} + args: --release --out dist --find-interpreter + manylinux: auto + working-directory: reconcile-python + + - uses: actions/upload-artifact@v7 + with: + name: wheels-${{ matrix.os }}-${{ matrix.target }} + path: reconcile-python/dist/*.whl + + build-python-sdist: + needs: build + if: startsWith(github.ref, 'refs/tags/') + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v6 + + - name: Copy README + run: cp README.md reconcile-python/ + + - uses: PyO3/maturin-action@v1 + with: + command: sdist + args: --out dist + working-directory: reconcile-python + + - uses: actions/upload-artifact@v7 + with: + name: sdist + path: reconcile-python/dist/*.tar.gz + + publish-pypi: + needs: [build-python-wheels, build-python-sdist] + runs-on: ubuntu-latest + permissions: + id-token: write + + steps: + - uses: actions/download-artifact@v8 + with: + pattern: '{wheels-*,sdist}' + merge-multiple: true + path: dist + + - uses: pypa/gh-action-pypi-publish@release/v1 diff --git a/.github/workflows/gh-pages.yml b/.github/workflows/gh-pages.yml new file mode 100644 index 0000000..7ac04ea --- /dev/null +++ b/.github/workflows/gh-pages.yml @@ -0,0 +1,72 @@ +name: Deploy Website to GitHub Pages + +on: + push: + branches: + - main + workflow_dispatch: + +# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages +permissions: + contents: read + pages: write + id-token: write + +# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. +# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. +concurrency: + group: 'pages' + cancel-in-progress: false + +jobs: + build: + runs-on: ubuntu-latest + permissions: + contents: write + steps: + - name: Checkout repository + uses: actions/checkout@v6 + + - name: Cache Rust dependencies + uses: actions/cache@v5 + with: + path: | + ~/.cargo/bin/ + ~/.cargo/registry/index/ + ~/.cargo/registry/cache/ + ~/.cargo/git/db/ + target/ + key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} + restore-keys: | + ${{ runner.os }}-cargo- + + - name: Cache npm dependencies + uses: actions/cache@v5 + with: + path: | + reconcile-js/node_modules + ~/.npm + key: ${{ runner.os }}-npm-${{ hashFiles('reconcile-js/package-lock.json') }} + restore-keys: | + ${{ runner.os }}-npm- + + - name: Build wasm + run: | + which wasm-pack || cargo install wasm-pack + scripts/build-website.sh + + - name: Upload artifact + uses: actions/upload-pages-artifact@v4 + with: + path: examples/website/dist + + deploy: + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: ubuntu-latest + needs: build + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 diff --git a/Cargo.lock b/Cargo.lock index 3253830..a71f727 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -428,7 +428,7 @@ checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" [[package]] name = "reconcile-text" -version = "0.11.0" +version = "0.10.0" dependencies = [ "console_error_panic_hook", "diff-match-patch-rs", diff --git a/Cargo.toml b/Cargo.toml index a3e7c63..3d88a02 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "reconcile-text" description = "Intelligent 3-way text merging with automated conflict resolution" -version = "0.11.0" +version = "0.10.0" rust-version = "1.94" authors = ["Andras Schmelczer "] edition = "2024" diff --git a/docs/advanced-ts.md b/docs/advanced-ts.md index dd1633d..7e53bf5 100644 --- a/docs/advanced-ts.md +++ b/docs/advanced-ts.md @@ -2,65 +2,40 @@ ## Edit Provenance -Track which changes came from where using `reconcileWithHistory`. The result's -`history` field is typed as `SpanWithHistory[]`, and each span's `history` is a -`History` string-literal union. +Track which changes came from where using `reconcileWithHistory`: -```typescript -import { reconcileWithHistory, type History, type SpanWithHistory } from 'reconcile-text'; +```javascript +const result = reconcileWithHistory( + 'Hello world', + 'Hello beautiful world', + 'Hi world' +); -const result = reconcileWithHistory('Hello world', 'Hello beautiful world', 'Hi world'); - -console.log(result.text); // "Hi beautiful world" - -const history: SpanWithHistory[] = result.history; -console.log(history); -// [ -// { text: "Hello", history: "RemovedFromRight" }, -// { text: "Hi", history: "AddedFromRight" }, -// { text: " beautiful", history: "AddedFromLeft" }, -// { text: " ", history: "Unchanged" }, -// { text: "world", history: "Unchanged" }, -// ] - -const classByHistory = { - Unchanged: 'merge-unchanged', - AddedFromLeft: 'merge-added-left', - AddedFromRight: 'merge-added-right', - RemovedFromLeft: 'merge-removed-left', - RemovedFromRight: 'merge-removed-right', -} satisfies Record; -``` - -Using `satisfies Record` keeps the object literal's values -narrow while forcing every history case to be handled. If a future version adds -another `History` value, TypeScript will point at this mapping. - -For control flow, use the same union as an exhaustiveness check: - -```typescript -import type { History } from 'reconcile-text'; - -function historyLabel(history: History): string { - switch (history) { - case 'Unchanged': - return 'unchanged'; - case 'AddedFromLeft': - return 'added by left'; - case 'AddedFromRight': - return 'added by right'; - case 'RemovedFromLeft': - return 'removed from left'; - case 'RemovedFromRight': - return 'removed from right'; - default: - return assertNever(history); +console.log(result.text); // "Hi beautiful world" +console.log(result.history); /* +[ + { + "text": "Hello", + "history": "RemovedFromRight" + }, + { + "text": "Hi", + "history": "AddedFromRight" + }, + { + "text": " beautiful", + "history": "AddedFromLeft" + }, + { + "text": " ", + "history": "Unchanged" + }, + { + "text": "world", + "history": "Unchanged" } -} - -function assertNever(value: never): never { - throw new Error(`Unhandled history value: ${value}`); -} +] +*/ ``` ## Tokenisation Strategies @@ -70,162 +45,26 @@ function assertNever(value: never): never { - **Word tokeniser** (`"Word"`) - Splits on word boundaries (recommended for prose) - **Character tokeniser** (`"Character"`) - Individual characters (fine-grained control) - **Line tokeniser** (`"Line"`) - Line-by-line (similar to `git merge` or more precisely [`git merge-file`](https://git-scm.com/docs/git-merge-file)) -- **Markdown tokeniser** (`"Markdown"`) - Splits on Markdown structural boundaries (headings, list items, paragraphs) - -```typescript -import { reconcile, type BuiltinTokenizer } from 'reconcile-text'; - -const tokenizers = [ - 'Word', - 'Character', - 'Line', - 'Markdown', -] as const satisfies readonly BuiltinTokenizer[]; - -const result = reconcile('abc', 'axc', 'abyc', 'Character'); -console.log(result.text); // "axyc" - -for (const tokenizer of tokenizers) { - const merged = reconcile( - '# Title\n\n- old item\n', - '# Title\n\n- old item\n- left item\n', - '# New title\n\n- old item\n', - tokenizer - ); - - console.log(tokenizer, merged.text); -} -``` ## Cursor Tracking -`reconcile-text` automatically tracks cursor positions through merges, which is -useful for collaborative editors. Selections can be tracked by providing them as -a pair of cursors. +`reconcile-text` automatically tracks cursor positions through merges, which is useful for collaborative editors. Selections can be tracked by providing them as a pair of cursors. -```typescript -import { reconcile, type TextWithOptionalCursors } from 'reconcile-text'; - -const left = { - text: 'Hello beautiful world', - cursors: [{ id: 1, position: 6 }], // After "Hello " -} satisfies TextWithOptionalCursors; - -const right = { - text: 'Hi world', - cursors: [{ id: 2, position: 0 }], // At the beginning -} satisfies TextWithOptionalCursors; - -const result = reconcile('Hello world', left, right); +```javascript +const result = reconcile( + 'Hello world', + { + text: 'Hello beautiful world', + cursors: [{ id: 1, position: 6 }], // After "Hello " + }, + { + text: 'Hi world', + cursors: [{ id: 2, position: 0 }], // At the beginning + } +); // Result: "Hi beautiful world" with repositioned cursors -console.log(result.text); // "Hi beautiful world" +console.log(result.text); // "Hi beautiful world" console.log(result.cursors); // [{ id: 2, position: 0 }, { id: 1, position: 3 }] ``` - > The `cursors` list is sorted by character position (not IDs). - -## Generic Helpers and Inference - -The exported merge functions are intentionally small: they merge strings, or -strings plus cursor metadata. In TypeScript applications, keep domain-specific -metadata in your own typed wrappers and let inference preserve the surrounding -shape. - -```typescript -import { reconcile, type BuiltinTokenizer } from 'reconcile-text'; - -type ReconciledText = Omit & { - text: string; -}; - -function reconcileDraft( - parent: TDraft, - left: TDraft, - right: TDraft, - tokenizer?: BuiltinTokenizer -): ReconciledText { - return { - ...right, - text: reconcile(parent.text, left.text, right.text, tokenizer).text, - }; -} - -interface MarkdownDraft { - id: string; - text: string; - updatedAt: Date; -} - -const parent: MarkdownDraft = { - id: 'intro', - text: '# Title\n\nOld text\n', - updatedAt: new Date('2026-01-01T00:00:00Z'), -}; - -const left: MarkdownDraft = { - ...parent, - text: '# Title\n\nOld text\n\n- left note\n', -}; - -const right: MarkdownDraft = { - ...parent, - text: '# New title\n\nOld text\n', -}; - -const merged = reconcileDraft(parent, left, right, 'Markdown'); -// merged is inferred as { id: string; updatedAt: Date; text: string } -``` - -Use `satisfies` for configuration objects and cursor payloads when you want -compile-time checking without widening everything to the library interface. - -```typescript -import type { BuiltinTokenizer, TextWithOptionalCursors } from 'reconcile-text'; - -const mergeOptions = { - tokenizer: 'Markdown', - renderDeletedSpans: true, -} satisfies { - tokenizer: BuiltinTokenizer; - renderDeletedSpans: boolean; -}; - -const documentWithSelection = { - text: 'Hello beautiful world', - cursors: [ - { id: 1, position: 6 }, - { id: 2, position: 15 }, - ], -} satisfies TextWithOptionalCursors; -``` - -## Compact Diffs - -Generate and apply compact diff representations. The TypeScript type is -`Array` for `diff()` and `Array` for -`undiff()`, because the underlying WebAssembly layer may represent integer -entries as `bigint`. - -```typescript -import { diff, undiff } from 'reconcile-text'; - -const original = 'Hello world'; -const changed = 'Hello beautiful world'; - -// Generate a compact diff -const changes = diff(original, changed); -console.log(changes); // [5, " beautiful world"] - -// Reconstruct the changed text from the diff -const reconstructed = undiff(original, changes); -console.assert(reconstructed === changed); -``` - -Diff entries are positive integers (retain N characters), negative integers -(delete N characters), and strings (insert text). - -## Complete Example - -For a complete browser example that renders `SpanWithHistory` values and cursor -selections, see the [example website source](../examples/website/src/index.ts). diff --git a/examples/website/package-lock.json b/examples/website/package-lock.json index 3f5c201..4b144eb 100644 --- a/examples/website/package-lock.json +++ b/examples/website/package-lock.json @@ -28,7 +28,7 @@ }, "../../reconcile-js": { "name": "reconcile-text", - "version": "0.11.0", + "version": "0.10.0", "dev": true, "license": "MIT", "devDependencies": { diff --git a/reconcile-js/package-lock.json b/reconcile-js/package-lock.json index 18ad46b..5a91ef7 100644 --- a/reconcile-js/package-lock.json +++ b/reconcile-js/package-lock.json @@ -1,12 +1,12 @@ { "name": "reconcile-text", - "version": "0.11.0", + "version": "0.10.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "reconcile-text", - "version": "0.11.0", + "version": "0.10.0", "license": "MIT", "devDependencies": { "@types/jest": "^30.0.0", @@ -24,7 +24,7 @@ }, "../pkg": { "name": "reconcile-text", - "version": "0.11.0", + "version": "0.10.0", "dev": true, "license": "MIT" }, diff --git a/reconcile-js/package.json b/reconcile-js/package.json index 42b92df..e9a5908 100644 --- a/reconcile-js/package.json +++ b/reconcile-js/package.json @@ -1,6 +1,6 @@ { "name": "reconcile-text", - "version": "0.11.0", + "version": "0.10.0", "description": "Intelligent 3-way text merging with automated conflict resolution", "main": "dist/reconcile.node.js", "browser": "dist/reconcile.web.js", diff --git a/reconcile-python/Cargo.lock b/reconcile-python/Cargo.lock index 2dbb233..40e2016 100644 --- a/reconcile-python/Cargo.lock +++ b/reconcile-python/Cargo.lock @@ -104,14 +104,14 @@ dependencies = [ [[package]] name = "reconcile-text" -version = "0.11.0" +version = "0.10.0" dependencies = [ "thiserror", ] [[package]] name = "reconcile-text-python" -version = "0.11.0" +version = "0.10.0" dependencies = [ "pyo3", "reconcile-text", diff --git a/reconcile-python/Cargo.toml b/reconcile-python/Cargo.toml index fb6d55e..deff079 100644 --- a/reconcile-python/Cargo.toml +++ b/reconcile-python/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "reconcile-text-python" -version = "0.11.0" +version = "0.10.0" edition = "2024" rust-version = "1.94" authors = ["Andras Schmelczer "] diff --git a/reconcile-python/pyproject.toml b/reconcile-python/pyproject.toml index f2b5d5a..43bf934 100644 --- a/reconcile-python/pyproject.toml +++ b/reconcile-python/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "maturin" [project] name = "reconcile-text" -version = "0.11.0" +version = "0.10.0" description = "Intelligent 3-way text merging with automated conflict resolution" readme = "README.md" license = { text = "MIT" } diff --git a/reconcile-python/uv.lock b/reconcile-python/uv.lock index 6871ac5..81642d1 100644 --- a/reconcile-python/uv.lock +++ b/reconcile-python/uv.lock @@ -168,7 +168,7 @@ wheels = [ [[package]] name = "reconcile-text" -version = "0.11.0" +version = "0.10.0" source = { editable = "." } [package.dev-dependencies] diff --git a/scripts/lint.sh b/scripts/lint.sh index 6ae4f66..c46991d 100755 --- a/scripts/lint.sh +++ b/scripts/lint.sh @@ -5,6 +5,9 @@ set -e which cargo-machete || cargo install cargo-machete cargo machete +which lychee || cargo install lychee +lychee --verbose --exclude npmjs.com README.md + cargo clippy --all-targets --all-features --fix --allow-dirty --allow-staged cargo fmt --all