Sync 3 Inkeep OSS Changes#811
Merged
Merged
Conversation
* [US-001] link suggestions: match bare-name queries and demote dot-dir paths in browse order Core matcher no longer requires a leading slash to produce suggestions, and ties (the empty/browse case) rank real content paths ahead of dot-directory files so .github/.changeset entries no longer monopolize the capped list. * [US-002] link suggestions: open the panel for any path target, suppress URLs The link-target field now opens name suggestions as you type (Cmd+K parity), not only for a leading-slash path. Trigger classification is self-contained in the component via isExternalHref + a leading-# check, so external URLs and bare in-doc anchors do not pop a page list. Shared across the internal-link dialog, the wiki-link panel, and the bubble-menu link popover. * [chore] changeset for link-target name suggestions * [review] gate empty-state to strong path signal; browse-only dot-demotion Local review follow-ups: - Only surface the 'No matching paths' empty-state on an empty browse or an explicit leading slash, so typing/pasting a scheme-less URL (example.com) into the dual-purpose field no longer flashes an empty page list. Bare-name matches still surface. Reuses isSlashPathSuggestionValue (no longer dead). - Only compute suggestions when a panel could show, keeping URL input out of the matcher and off the per-keystroke scoring path. - Apply dot-directory demotion to browse ordering only; on a scored query it could push an exact-matched dotfile past the result cap. - Test: a bare name with no match stays silent (no empty-state). * [review] pin AC2 basename ranking for the bare-name form too * [docs] spec for link-target name suggestions * [polish] show full link path as a hover tooltip when the row is truncated The suggestion row truncates long paths with an ellipsis; add a native title tooltip carrying the full /path so a clipped row is still readable on hover. --------- GitOrigin-RevId: d9d51b4d407486b1770ae249e31653e089699ec5
* spec: pull-only sync mode (approved; audit-corrected)
Adds the finalized spec, evidence trail, and meta artifacts for the
pull-only (one-directional) sync mode: config mode knob, engine mode,
B/B1 follower posture, one-shot pull contract, consent surfaces,
substrate build items S1-S6. Decision log D1-D15; overnight decision
journal included for morning review.
* [US-001] Add autoSync.mode single sync knob with legacy-enabled derive
Introduce autoSync.mode ('off' | 'pull' | 'full' | null) as the canonical
per-machine sync knob and the single source of truth for whether a project
pushes (only 'full' pushes). A config with no mode key derives its mode from
the legacy enabled boolean (true becomes full, false becomes off), so old and
new config shapes coexist with no migration. Widen the committed
autoSync.default seed to the same vocabulary while keeping the legacy boolean
seed valid.
- New packages/core/src/config/auto-sync-mode.ts holds the mode vocabulary and
the layer-resolution rules: legacy derive, committed-default translate,
per-machine precedence, and effective-mode composition.
- schema.ts registers the mode enum leaf and the widened default union with
.register before the nullable/default wrappers; the exhaustive field-registry
coverage test picks up the new leaf, proving the ordering.
- server-factory boot resolution resolves the effective mode and returns
mode === 'full', byte-identical for legacy enabled/default configs; pull
resolves to off until the engine grows a real mode.
- Widen the onboarding-gate input type to accept the mode vocabulary; gate
behavior is unchanged.
Tests cover parse of mode/default/enabled, the derive and precedence truth
tables, the cross-version pin (an old mode-unaware schema reads a mode-only
config as sync-off and never pushes), and unknown-key write-back preservation.
* [US-002] Engine sync-mode enum, single push gate, mode-aware denied handling
Replace the SyncEngine's syncEnabled boolean with a mode enum
(off/pull/full) as the single source of truth. setMode is the primary
API; setEnabled stays as a back-compat adapter (true maps to full, false
to off) with the idempotent same-value early-return preserved.
Push is suppressed by one authoritative gate at the runPushCycle
entrance, plus an early-return in schedulePush so a pull-only project
never even schedules a push cycle. A denied push probe now pauses only
full mode; a pull-only follower treats denial as its normal condition
and keeps fetching.
Add an additive syncMode field to SyncStatusSchema (optional for
version-skew safety), the engine status interface, and getStatus, with
syncEnabled derived as mode not equal to off. server-factory resolves
the effective mode and threads it into the engine constructor and the
config-reapply path. The app status hook mirrors the new optional field.
* [US-003] Add sync-wired test harness with real origin and engine
Give the integration harness a way to boot a server whose SyncEngine is
attached to a real remote, so downstream stories can drive the composed
fetch, fast-forward, CRDT-import, status chain in-process instead of
against a stubbed engine.
createSyncWiredTestServer builds a bare origin repo, a persistent author
clone that seeds and pushes origin/main, and a follower clone (the server
content dir) carrying the origin remote plus a project-local autoSync.mode.
The engine picks up that mode through the existing config-to-engine boot
path, so the real resolution chain is exercised. The helper returns the
attached engine, a pushToOrigin authoring helper, and the origin path, and
wraps cleanup to remove every scratch directory.
ServerOptions gains optional pullIntervalSeconds and pushIntervalSeconds,
forwarded to the SyncEngine constructor. These are additive test-tuning
knobs, matching the existing debounce and commitDebounceMs pattern; the
engine keeps its 30s and 60s defaults when they are omitted, so no existing
consumer changes behavior. The sync-wired harness parks them far out so a
background cadence never races the scenario a test drives explicitly.
A new smoke test proves the composed chain end to end: an upstream commit
fast-forwards onto disk, loads into a connecting client's live document,
and settles the engine status. A second test proves pull-only mode attaches
to the remote and fast-forwards without a push side.
* [US-004] Pull-only B1 fast-forward cycle with document-layer overlay
In pull mode the pull cycle now fast-forwards to origin tip without ever committing, merging, stashing, or leaving a MERGE_HEAD. Local uncommitted edits ride as a working-tree overlay: non-overlapping files pass through the FF, byte-identical overlays converge silently, overlapping edits are restored then re-applied keep-mine on the new tip, and an uncommitted deletion the tip modifies is re-applied (not resurrected). Diverged local history pauses instead of merging. A direct-exec fast-forward exposes git's exit code so refusals classify as divergence vs overlay-overlap, pinned against real git.
* [US-005] B1 conflict substrate: working-tree variant, auto-combine, no-commit resolution
Reconcile a pull-only overlay against the fast-forwarded tip per content file:
different-line edits auto-combine into a new overlay, same-line collisions keep
the local edit and raise a working-tree conflict the existing resolver serves,
and every path never commits on the user's behalf.
- core: add tryLineLevelCombine, reusing the diff3Merge primitive but reporting
same-line collisions instead of character-merging them.
- conflict-storage: add ConflictEntry.variant 'working-tree' and a parallel
resolveWorkingTreeConflict that writes the chosen bytes without any git
checkout/add/commit; the merge-native path is unchanged.
- sync-engine: doPullCycleB1 plans overlap reconciliation (content-gated
auto-combine vs collision with pinned theirs/base blobs), stays idle so the
rest of the repo keeps fast-forwarding, re-pins or auto-dissolves existing
conflicts each pull, and fires a resolved callback on resolution.
- api-extension: conflict-content serves theirs/base from the pinned blobs and
ours from the live doc or disk for working-tree entries.
- server-factory: clear the doc conflict lifecycle when a working-tree conflict
resolves or auto-dissolves (keep-mine changes no disk bytes).
- boot + engine reconciliation tolerate working-tree entries: a no-MERGE_HEAD
reconcile clears only merge-native conflicts and never pauses the engine.
* [US-006] One-shot pull with bounded outcome observability
Add a one-shot pull (trigger op 'pull') that runs in every mode and
reports a bounded outcome, the primitive spec B's receive surfaces
consume.
- doPullCycle and doPullCycleB1 now return a PullOutcome at every exit
(succeeded, up-to-date, conflict, refused, error-class). A single
recordPullOutcome writes additive lastPullUtc + lastPullOutcome and
fires the sync-status CC1 signal at every pull completion, background
or one-shot, so lastPullUtc changes each time (change-detection
contract).
- New pullOnce() runs in every mode: it refuses (recording 'refused')
only for single-flight, a pending conflict, or no remote, and for an
off/null project restores its resting state so a one-shot never leaves
the project enabled or starts a background loop. trigger('pull') routes
through it. The full-mode merge path stays byte-identical.
- PullOutcomeSchema in core sync-seed plus additive lastPullUtc and
lastPullOutcome on SyncStatusSchema and the app GitSyncStatus mirror,
both optional and nullable for version skew.
- Tests: core schema coverage, eight engine one-shot scenarios on real
bare-origin clones (mode-off no-enable, up-to-date, conflict,
single-flight refused, unreachable-remote, change-detection, no-remote),
and a composed HTTP test that POSTs trigger op 'pull' and polls status
for the outcome.
* [US-007] Mode transitions: stranded-commit overlay conversion and upgrades
Entering pull-only with local commits ahead of origin now folds those
commits into a working-tree overlay and realigns the branch, instead of
parking on a diverged-local-commits pause. A --mixed reset to the merge
base moves the branch ref and index without touching the working tree, so
on-screen docs are byte-identical: ahead-only lands directly on origin's
tip, a diverged branch lands on the common ancestor with the local edits
as overlay and the next fast-forward cycle carries it the rest of the way
per the existing B1 reconciliation. The pre-conversion tree is checkpointed
to the recoverable timeline before the ref moves.
Full->pull downgrades drain an in-flight push first (soft-disable
semantics); full mode keeps stranded commits to push and skips conversion;
pull->full needs nothing special (the overlay is uncommitted content the
push cycle commits and pushes). Adds a public probeUnpushedCommitCount for
the downgrade-confirm stranded count, and wires the checkpoint callback to
a shadow-repo safety checkpoint in server-factory.
* [US-008] Pull-only consent surfaces: onboarding fork + mode writers
Fork the auto-sync onboarding prompt on the push-permission probe:
allowed keeps today's full-sync prompt, denied gets a truthful pull-only
variant, unknown/pending suppress. The gate now resolves the answered
state from autoSync.mode (falling back to the legacy enabled boolean) and
returns the prompt variant instead of a boolean.
Add useSyncModeWriter that writes autoSync.mode on the project-local
binding; the onboarding dialog uses it (pull, full, or off). The legacy
useSyncEnabledWriter stays as-is so the share-receive surfaces and their
tests are untouched; the engine still honors the legacy key.
Give AutoSyncEnableWarning, the onboarding dialog, and the enable-confirm
dialog a pull-only variant with truthful copy (updates flow in, edits
stay local, overlapping edits pick a side). The confirm dialog gains a
stranded-commit disclosure for the full to pull downgrade.
Disclose silent enablement: a committed default of pull fires a one-time
notice on a never-asked machine (full and off stay silent), and a new
worktree inherits the parent's mode with the existing one-time notice.
Regenerate the en and pseudo Lingui catalogs.
* [US-009] Settings three-way sync mode control and paused-notice switch action
* [US-010] Badge: pull-only always visible with distinct following states
* [US-011] Auth-conditional pull cadence for pull-only followers
Anonymous pull-only followers now schedule background pulls at a gentler
floor (>=180s) while signed-in followers keep the responsive interval;
full sync cadence is unchanged. The engine resolves its credential tier
from the same gh, token-store, anonymous order the push probe uses, refreshed
before each pull-mode schedule. Jitter and counted backoff are unchanged in
both branches; cadence values stay hard-coded.
* [US-012] Bounded telemetry for sync mode, one-shot outcomes, and overlay stock
Add structured pino telemetry across the pull-only sync surfaces, all
bounded enums or numbers so nothing blows up log cardinality:
- setMode logs the mode change with a bounded source (config,
committed-default, worktree-inherit). The prompt, Settings, and
paused-notice surfaces all write the same per-machine mode, so the
server cannot tell them apart and they collapse to config.
- pullOnce logs its mode and outcome, so one-shot pulls are observable
without the noise of a per-background-cycle log.
- The pull-only fast-forward log carries the conflict-lifecycle counts
(created, auto-combined, auto-dissolved) plus an overlay-stock gauge
(docs carrying a standing overlay), which the per-pull rates miss.
- Working-tree conflict resolution logs the chosen strategy.
- Boot logs the active mode and its source so committed-default
activations show up alongside runtime changes.
- The desktop worktree seed logs the inherited mode under the
worktree-inherit source, the only site that knows that origin.
The overlay-stock read is best-effort so a transient git failure never
turns a completed pull into an error.
* [US-013] Corrigendum, changeset, and i18n sweep for pull-only sync
Append the post-ship corrigendum breadcrumb to every NG3 occurrence in the
2026-05-26 read-only-mode spec, plus its Future Work entry for the same
deferral, recording that NG3 read-only-fetch shipped as pull-only sync mode.
Add the pull-only sync mode changeset (minor per the pre-1.0 convention).
Confirm the en and pseudo Lingui catalogs are current (no diff; pseudo carries
the new pull-only strings).
Fix two latent defects the first full pnpm check surfaced (prior iterations ran
tiers in isolation and never hit md-conformance or the integration meta-tests):
- Regenerate the md-audit ng-anchors catalog, whose testFileCount was stale
after the feature added a test file under the audit's test globs.
- Convert SettingsDialogBody.sync-mode.dom.test.tsx from a dynamic
@testing-library/react import to a static one so it satisfies the Tier-3
filename contract; it is a genuine DOM mount test.
* test: structural guard confining legacy autoSync.enabled reads to the derive path
* qa: keep conflict lifecycle set while the engine still holds the conflict
A B1 pull-only conflict pull fast-forwards the working tree via a raw git
write (outside writeTracker), which the file-watcher re-emits as an 'update'.
That reconcile computes noop (base==ours==theirs, conflict content already
applied) and clearLifecycleConflict wiped the lifecycle.status the pull had
just set — desyncing the editor->resolver swap from the ConflictStore. The
resolver appeared briefly then vanished on the next pull and never returned on
reopen, while conflictCount stayed > 0.
Guard clearLifecycleConflict so it never clears while the engine still holds a
standing conflict for that doc; clearing is correct only once the engine agrees
the conflict is gone (resolve / auto-dissolve). No commit is ever created, so
D5 holds. Exports entryMatchesDocName from conflict-lifecycle-seed for reuse.
Also stabilizes the previously-flaky sync-wired-harness same-line-collision
integration test (same root cause).
* qa: fix lint in the autoSync.enabled confinement guard test
* fixup! local-review: baseline (pre-review state)
* fixup! local-review: address findings (pass 1)
* fixup! local-review: address findings (pass 1)
* spec: overnight ship journal and changelog for pull-only sync mode
* spec: close A1 wired-token cell after owner verification of denied-push pull
* fix(app): follower sync surfaces state the mode, not the push verdict
Two follower-facing UX corrections surfaced in review of the shipped
Settings/badge surfaces:
- Badge popover: a pull-only project now reads "Pull-only sync — updates
flow in from your remote…" instead of "You don't have permission to
push to this repo." A follower never pushes, so the push-permission
verdict is irrelevant; the signed-out reconnect line is likewise
suppressed for followers (push-framed).
- Settings mode control: the Full option is disabled for a genuine
read-only denial (selecting it would only enable, fail to push, and
pause). Signed-out denial keeps Full enabled — that user may have push
access once authenticated. Off and Pull-only stay reachable in both.
* fix(app): tooltip on the disabled Full sync option explains the push denial
A native title on a disabled button is suppressed by most browsers
(no pointer events), so hovering the greyed-out Full option showed
nothing. Wrap it in the shadcn Tooltip via a wrapper span that still
receives hover, surfacing "You don't have permission to push to this
repo." Keyboard users get the same reason from the read-only hint text.
* feat(app): drop the committed-default activation toast (D15 reopened)
Owner reopened D15 and chose symmetric silence: a committed
autoSync.default is silently effective for every mode with no
one-time notice. The toast disclosed only the safe mode (pull-only,
which never egresses local edits) while a committed 'full' default —
which auto-commits and pushes local edits — stayed silent, so the
disclosure ran the wrong way round. Rather than extend it to full,
remove it: the committed default is the maintainer's call and simply
takes effect (still suppresses the onboarding prompt; gate unchanged).
Deletes use-committed-default-autosync-notice + its test and the
EditorPane mount; the committedDefaultNoticeShown loose key is no
longer written. Worktree-inheritance notice is untouched. Spec FR9/D15
corrigendum'd; changeset + catalogs updated.
* fix(server): checkpoint the overlay before a B1 fast-forward reset
Closes the pull-only crash window the spec's failure-mode table calls
out as mandatory: when a background pull finds an overlapping
uncommitted edit, it resets that path to HEAD before the fast-forward,
so between the reset and the overlay re-write the bytes live only in
memory. A hard crash there would lose them for a doc with no live
client (an open doc is covered by client CRDT persistence).
New checkpointBeforeOverlayRestore engine seam fires before the reset,
only on overlap pulls, best-effort (mirrors convertStrandedCommitsToOverlay);
server-factory wires it to the shadow-repo safetyCheckpoint so the
pre-reset bytes survive on the shadow timeline. 3 engine tests incl. an
ordering proof that the checkpoint sees the overlay still on disk.
* feat(server): pull-only follows upstream on delete/modify
In pull-only mode a locally-deleted content doc that origin modified is
now restored from origin rather than surfaced as a delete/modify
conflict — the follower tracks upstream and a deletion has no authored
content to lose, so the deletion intent yields to the remote's change.
This deliberately reverses the 'never silently resurrect a deletion'
guard for pull-only content docs (owner directive).
Scope: the B1 planOverlapReconciliation deletion branch only. Non-content
(config/asset) deletions still stay deleted; full-sync's merge-native
delete/modify conflict is unchanged. Adds a bounded autoRestored count to
the pull telemetry. 2 engine tests flipped, 1 added; SPEC FR3/Q6
corrigendum'd.
* feat(app): redesign the sync badge popover — active/paused switch + mode toggle
The header Switch now means active-vs-paused, and a separate Full/Follow
control (shown only for push-capable users) sets the mode. Turning the
Switch off pauses instead of hiding the badge: the popover shows a paused
state and the mode stays editable. Pausing persists as mode:'off' plus a
new additive autoSync.resumeMode memory, so an older app reads a paused
project as not-syncing and never pushes for it. Entering Full always
confirms; resuming/staying on Follow never pushes. The manual action is a
single 'Sync' label (op pushes only when full+active) and is hidden only
for a never-enabled project. Behind-arrow dropped in the paused state (no
fetch while paused).
Adds core helpers (isSyncPaused/hasEverEnabledSync/displayActiveMode/
resumeModeOf + SYNC_ACTIVE_MODES) and useBadgeSyncControls. 36 badge dom
tests (6 rewritten, 3 added); full app dom tier green (2253).
* feat(app): rename the user-facing sync mode 'Pull-only' to 'Follow'
Non-git users read 'Follow' more clearly than 'Pull-only'. Sweeps the
visible strings across Settings, onboarding, the enable/confirm dialogs,
and the worktree-inheritance notice; dom-test assertions updated to match.
Internal identifiers and the config value are renamed in a follow-up.
* refactor: rename the sync mode value 'pull' to 'follow'
Completes the Pull-only -> Follow rename by renaming the internal
config/wire value and code identifiers to 'follow', so the codebase
matches the user-facing label (and the existing 'following' naming).
SYNC_MODES is now ['off','follow','full']. The earlier 'pull' value is a
permanently-accepted read alias (normalizeStoredMode + STORED_SYNC_MODES),
so on-disk configs — including local test projects — keep working with no
migration. The git operation 'pull' (trigger op, doPullCycle, git pull,
PullOutcome) is deliberately unchanged — it's a git verb, not the mode.
Docs, changeset, and configuration reference 'follow'; the spec keeps its
'pull-only' design-record terminology with a top corrigendum. Core config
348, server sync suites, app dom 2253, integration harness all green.
* test: wire SyncModeSchema accepts 'follow' (mode value rename)
* test: onboarding gate returns the 'follow' variant (mode rename)
* fix(desktop): normalize legacy 'pull' mode in worktree autosync inheritance
asModeOrBool/resolveRootAutoSyncMode used isSyncMode, which no longer
matches the legacy 'pull' value after the mode rename — a root config
carrying mode:'pull' would have failed to inherit. Route through
normalizeStoredMode so a stored 'pull' resolves to 'follow' (the tests now
seed 'pull' and assert 'follow', exercising the alias).
* fix(app): add a divider above the sync popover metadata and widen it
Matches the mockup: a separator line between the mode description and the
Repository/Last update/Mode rows, and w-64 -> w-80 so the description
reads on two lines instead of wrapping tight.
* fix(ok): address pull-only sync review findings
- Surface a conflict-store persist failure after fast-forward as an error
outcome instead of a clean conflict (save/addConflict/removeConflict now
report success; doPullCycleB1 backs off when a persist fails).
- Wrap planOverlapReconciliation so a thrown cat-file failure routes through
handleError and backs off instead of re-firing at the base interval.
- Re-assert realpath containment before the working-tree 'theirs' write after
the cat-file await, and add the realpath guard plus traced write to the
merge-native 'content' resolution.
- Guard the working-tree conflict invariant: skip a collision whose theirs blob
cannot be pinned, and reject a blob-less working-tree entry at addConflict.
- Rename the lastPullOutcome value 'error-class' to 'error'.
- Broaden the enabled-read confinement regex to catch bracket-indexed access
and document the destructuring blind spot.
- Add tests for the onContentConflictsResolved auto-dissolve callback and the
mineRestore overlay-restore after a fast-forward refusal.
* chore(ok): clean up pull->follow rename leftovers
Follow-up to the mode rename: update stale JSDoc/comments that still cited the
legacy 'pull' value (sync-seed SyncModeSchema + SyncDefaultWriter docs, core
barrel comment, useSyncModeWriter doc, EnableSyncConfirmDialog docs) and rename
the four settings-sync-*-pull data-testids to -follow so Settings matches the
badge popover's 'follow' selectors. Test selectors updated in lock-step.
* fix(app): sync badge popover polish and resume-flicker fix
- keep the badge mounted while a resume-from-paused is in flight: the local
config flips to an active mode before the server status catches up, so the
popover no longer closes and the icon no longer flickers on resume
- switch the Full/Follow mode toggle to the shared segmented control
- move the last-sync timestamp into the footer (bottom-left) beside the Sync
button (bottom-right); label it Synced (full) / Updated (follow)
- right-align the repository link to match the mode and footer rows
* udpate docs
* update docs sync section
---------
GitOrigin-RevId: 4209e45c1b9773df592d213bc077554970000b80
…don't fall back to chokidar (#760) (#2906) * fix(desktop): bundle @parcel/watcher into the CLI so packaged builds don't degrade to chokidar (#760) The packaged app spawns `ok start` from `Resources/cli/`, whose module resolver walks `cli/dist → cli → Resources → …` and never reaches the app's own `app.asar.unpacked` copy of @parcel/watcher (the same resolver-scope wall keyring + native-config already work around). So at server boot `import('@parcel/watcher')` throws "Cannot find package", the file watcher degrades to chokidar, and external edits to docs in subfolders stop reaching the server until a restart — the packaged-build trigger for #760. Add `scripts/stage-parcel-watcher.mjs`: it resolves the wrapper, its runtime deps (picomatch, is-glob, is-extglob, detect-libc), and the present per-arch binary the way Node's require() does — from @parcel/watcher's own package dir, NOT a `.npmrc` hoist, because the tree carries both picomatch v2 and v4 and a static copy could ship the wrong major — and stages them under `build/parcel-watcher-staging/node_modules/`. A single electron-builder `extraResources` rule copies that tree onto the CLI's path. Wired into build:mac/mac:unsigned/win/linux; the mac arm64-only DMG is complete, win/linux stage the host-arch binary and lean on the (now subfolder-correct) chokidar fallback for the other arch — full cross-arch parcel prebuilds are a follow-up. The existing packaging guard test gains a suite that runs the staging script and asserts the staged tree is CLI-resolvable at picomatch v4 with a real .node binary. * fix(desktop): run stage-parcel-watcher in CI + review polish (#760) Critical: the three desktop workflows invoke electron-builder directly (not the build:<os> npm scripts, which run the staging step), so the published DMG and the win/linux packages would have shipped WITHOUT @parcel/watcher on the CLI path — green CI, passing QA, users still on the chokidar fallback. Add an explicit `Stage @parcel/watcher for the bundled CLI` step after each `prepare-*` and before electron-builder in desktop-release.yml, desktop-build.yml, and both jobs of desktop-build-win-linux.yml. Review polish: the guard test now also asserts detect-libc resolves from the staged tree (Linux regression coverage) and surfaces the staging script's stderr on failure. Clarify in the script why the musl / 32-bit linux-arm binary variants are intentionally omitted (Electron is glibc-only; no 32-bit-arm artifact). * fix(desktop): windows-safe staging filter + retire stale parcel allowlist (#760) Review polish: - stage-parcel-watcher.mjs: cpSync hands the filter native-separator paths, so split on both `/` and `\` — otherwise the src/build/gyp exclusion silently no-ops on Windows and the wrapper's C++ sources ship into the app. - electron-builder-cli-native-deps.test.ts: @parcel/watcher is no longer a KNOWN_UNCOVERED "degrades to chokidar" exemption — this PR ships it. Recognize the staged-tree rule (build/parcel-watcher-staging/node_modules → cli/node_modules) so that older guard ALSO fails if the staging rule is dropped (defense in depth), and drop the stale allowlist entry. --------- GitOrigin-RevId: e80a4c736e2cb7583b51c15ca28ba57aba549b3c
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Copybara-translated 3 Inkeep OSS changes. Rebase-merge this PR so the prepared commits land directly on public main.
Commits: