isomorphic-jj 1.12.0 → 1.12.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,50 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.12.1 — 2026-09-27 — Conflict type shape + README status refresh
4
+
5
+ A cross-library documentation/typing audit flagged four things to verify
6
+ against current code; two turned out already fixed (`converge()`'s JSDoc
7
+ already documents N-way behavior as of #32/#35's 0.4.0 follow-up), one is
8
+ tracked as a design question instead of guessed at (see the "public,
9
+ untyped internal components" issue on `jj.graph` and its siblings), and
10
+ this release covers the two that were genuinely stale.
11
+
12
+ ### Fixed
13
+
14
+ - **`Conflict`/`ConflictType` in `src/types.d.ts` didn't match the shape
15
+ `ConflictModel` actually constructs.** `sides` was typed as `TreeRef[]`
16
+ (an array of tree hashes); every real `Conflict` object has `sides` as
17
+ an *object* — `{ left, right }`, `{ base, left, right }`, or (for
18
+ `converge()`'s N-way case, `ConflictModel.createNWayConflict()`)
19
+ `{ base, versions }` where `versions` is
20
+ `Array<{ commitId, content }>`. The interface was also missing
21
+ `message`, `timestamp`, and the optional `driverFailed`/`driverError`
22
+ fields that `_createConflict()` actually sets, and `ConflictType` was
23
+ missing the `'path'` and `'driver-conflict'` values `ConflictModel`
24
+ uses. Added a `ConflictSides` type covering both the two-way and N-way
25
+ shapes and corrected `Conflict` to match reality. Type-only change (the
26
+ `.d.ts` file has no runtime code), so nothing about the library's actual
27
+ behavior changes — this only fixes what TypeScript consumers see.
28
+ - **README's "Project Status" section was frozen at the pre-`@johnhenry`
29
+ rename numbering.** It read "Current Version: 0.3.0" (actual:
30
+ 1.12.0), cited "1823 tests" (actual: 1874), and its roadmap stopped at
31
+ 0.3.0 with no mention of 0.4.0's N-way `converge()` (#32/#35), the
32
+ 1.9.0 scoped/unscoped version-lineage merge (#36), or the 1.9.1–1.12.0
33
+ operation-log reliability pass (#37–#39, #41, #43, #45, #48). Also
34
+ corrected the provenance note's "reached v1.7.0 before the rename" to
35
+ the CHANGELOG's own recorded **v1.8.0** ceiling (see the 1.9.0 entry
36
+ below), and clarified that "Not yet 1.0" refers to API stability, not
37
+ the version number (which is already past 1.0 purely because merging
38
+ the two lineages forced it above the unscoped side's prior ceiling).
39
+ The Node 26 / `engines.node` note was checked too and was already
40
+ accurate — no change needed there.
41
+
42
+ ### Testing
43
+
44
+ 1874 tests passing, 0 skipped; lint (0 errors), format:check, typecheck,
45
+ and all 12 `examples/*.mjs` green; coverage 97.39% statements / 90.11%
46
+ branches / 99.08% functions / 97.63% lines (branch gate is 90%).
47
+
3
48
  ## 1.12.0 — 2026-09-27 — op-recording gaps left by #43/#45's fixes (#48)
4
49
 
5
50
  Follow-up to #43/#45 (below). Walking every op backward then forward now
package/README.md CHANGED
@@ -1020,10 +1020,10 @@ repo/
1020
1020
 
1021
1021
  ## Project Status
1022
1022
 
1023
- **Current Version**: 0.3.0 (`@johnhenry/isomorphic-jj`; same library/API lineage as the old `isomorphic-jj`, which reached v1.7.0 before the rename — see the provenance note at the top of this file)
1024
- **Test Coverage**: 1823 tests passing, ~97% statements / 91% branches
1023
+ **Current Version**: 1.12.0 (`@johnhenry/isomorphic-jj`; same library/API lineage as the old `isomorphic-jj`, which reached v1.8.0 before the rename — see the provenance note at the top of this file, and the CHANGELOG's `1.9.0` entry for how the scoped/unscoped version lineages were merged back together)
1024
+ **Test Coverage**: 1874 tests passing, ~97% statements / 90% branches
1025
1025
  **JJ CLI parity**: tracks Jujutsu through v0.45.1
1026
- **Status**: Actively developed; broad JJ CLI semantic parity, used in the examples/apps in this repo and in [JJHub](#family). Not yet 1.0 — API surface can still shift; pin a version and read the CHANGELOG before upgrading.
1026
+ **Status**: Actively developed; broad JJ CLI semantic parity, used in the examples/apps in this repo and in [JJHub](#family). Not yet 1.0 in the API-stability sense (the version number is past 1.0 only because merging the scoped/unscoped lineages forced it above the unscoped side's prior ceiling, not because the API is frozen) — API surface can still shift; pin a version and read the CHANGELOG before upgrading.
1027
1027
 
1028
1028
  **Completed:**
1029
1029
  - ✅ v0.1: Core JJ experience (stable IDs, undo, bookmarks, revsets)
@@ -1036,6 +1036,9 @@ repo/
1036
1036
  - ✅ 0.1.0 (post-rename): Parity refresh tracking jj through **v0.44** — `tag.track()`/`tag.untrack()`, the `builtin_log()` revset alias, and `file.search({ nameOnly: true })`; `git_refs()`/`git_head()` documented as deprecated (jj removed both in v0.43). See [CHANGELOG.md](./CHANGELOG.md) for what was deliberately left for a maintainer call (`jj run`, fetch-time remote tag/bookmark import).
1037
1037
  - ✅ 0.2.0: Storage-layer audit fixes — same-process storage locking, `undo()` reverting in-place graph/tag mutations, ambiguous change-id detection, categorized `push()` error codes, a conflict-marker newline fix, atomic protobuf writes, and open-ended revset ranges (`..b`, `a..`, `::`). See [CHANGELOG.md](./CHANGELOG.md).
1038
1038
  - ✅ 0.3.0: Parity refresh tracking jj through **v0.45.1** — a working `/browser` entry (async `createBrowserFS()`, bundle-safe protobuf schema loading, no stray Node-only imports), `undo()`/`operations.restore()` reverting graph rewrites with real progressive undo/redo, `squash()`/`abandon()`/`edit()`/`new()` fully syncing content instead of only metadata, `rebase()` performing a real three-way merge and recording conflicts, and the new `converge()` command (jj v0.45.0) to auto-resolve divergent commits. See [CHANGELOG.md](./CHANGELOG.md).
1039
+ - ✅ 0.4.0: `converge()` generalized from pairwise to N-way — any number of divergent copies of one change id resolve in a single call, matching how jj's own underlying engine already treats divergence internally (issue #32). See [CHANGELOG.md](./CHANGELOG.md).
1040
+ - ✅ 1.9.0: Scoped (`@johnhenry/isomorphic-jj`) and unscoped (`isomorphic-jj`) version lineages merged into one shared version going forward, with both names dual-published on every release.
1041
+ - ✅ 1.9.1 – 1.12.0: Operation-log reliability pass — `undo()`/`operations.restore()` correctness across write/snapshot/squash/rebase/abandon/edit, `log()` visibility fixes, and recording gaps in descendant rebases and conflict-resolution ops (issues #37–#39, #41, #43, #45, #48). See [CHANGELOG.md](./CHANGELOG.md) for the full per-fix breakdown.
1039
1042
 
1040
1043
  See [ROADMAP.md](./ROADMAP.md) for detailed plans, and [CHANGELOG.md](./CHANGELOG.md) for the release history.
1041
1044
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "isomorphic-jj",
3
- "version": "1.12.0",
3
+ "version": "1.12.1",
4
4
  "description": "Jujutsu (jj) version control semantics in pure JavaScript — stable change IDs, fearless undo, no staging area — for Node.js and browsers",
5
5
  "type": "module",
6
6
  "bin": {
package/src/types.d.ts CHANGED
@@ -144,9 +144,36 @@ export interface Bookmark {
144
144
  // ============================================================================
145
145
 
146
146
  /**
147
- * Types of conflicts
147
+ * Types of conflicts. `'driver-conflict'` is used when a registered merge
148
+ * driver (see `MergeDriverRegistry`) itself reports a conflict, instead of
149
+ * one of the built-in path-conflict categories.
150
+ */
151
+ export type ConflictType =
152
+ | 'content'
153
+ | 'path'
154
+ | 'add-add'
155
+ | 'delete-modify'
156
+ | 'modify-delete'
157
+ | 'driver-conflict';
158
+
159
+ /**
160
+ * The competing values a conflict is between. The common, two-way case
161
+ * (from `merge()`/`rebase()`) populates whichever of `base`/`left`/`right`
162
+ * actually exist for that path (e.g. `{ left, right }` for an add-add
163
+ * conflict, `{ base, left, right }` for a three-way content conflict).
164
+ *
165
+ * `converge()`'s N-way path (more than two divergent copies of one change,
166
+ * see `ConflictModel.createNWayConflict()`) instead populates `base` and
167
+ * `versions`: one entry per distinct value found across all copies that
168
+ * differs from `base`, each paired with (one of) the commitId(s) that has
169
+ * it.
148
170
  */
149
- export type ConflictType = 'content' | 'add-add' | 'delete-modify' | 'modify-delete';
171
+ export interface ConflictSides {
172
+ base?: string | Uint8Array;
173
+ left?: string | Uint8Array;
174
+ right?: string | Uint8Array;
175
+ versions?: Array<{ commitId: string; content: string | Uint8Array }>;
176
+ }
150
177
 
151
178
  /**
152
179
  * A conflict in the repository
@@ -155,9 +182,13 @@ export interface Conflict {
155
182
  conflictId: string;
156
183
  path: string;
157
184
  type: ConflictType;
158
- base?: TreeRef;
159
- sides: TreeRef[];
185
+ sides: ConflictSides;
186
+ message: string;
160
187
  resolved: boolean;
188
+ timestamp: string;
189
+ /** Present when a merge driver attempted and failed to resolve this conflict. */
190
+ driverFailed?: boolean;
191
+ driverError?: string;
161
192
  }
162
193
 
163
194
  /**