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 +45 -0
- package/README.md +6 -3
- package/package.json +1 -1
- package/src/types.d.ts +35 -4
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**:
|
|
1024
|
-
**Test Coverage**:
|
|
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
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
|
|
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
|
-
|
|
159
|
-
|
|
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
|
/**
|