-
Notifications
You must be signed in to change notification settings - Fork 1
feat(mcp): base-to-base sync, idle park Chromium, multiSelect updates #19
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
ARHAEEM
wants to merge
246
commits into
main
Choose a base branch
from
feat/base-to-base-sync
base: main
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Changes from all commits
Commits
Show all changes
246 commits
Select commit
Hold shift + click to select a range
4265e89
feat(mcp): add AirtableClient.createRecords (internal-API row create)
ARHAEEM 3e063d9
refactor(mcp): validate optional viewId + clarify error in createRecords
ARHAEEM 8b4f1cd
feat(mcp): add AirtableClient.updateRecords + deleteRecords
ARHAEEM 0a0e85d
fix(mcp): updateRecords per-row isolation + flag empty cell updates
ARHAEEM f901277
feat(mcp): add AirtableClient.uploadAttachment (5-step multipart)
ARHAEEM eaf149b
refactor(mcp): guard columnId + presignedUrl in uploadAttachment; ass…
ARHAEEM 1834221
feat(mcp): expose create_records / update_records / delete_records tools
ARHAEEM 52f1a87
refactor(mcp): correct update_records idempotency hint + clarify reco…
ARHAEEM 3ac79e5
chore(tool-sync): register record-write tools across mirror + counts
ARHAEEM 8d2b2b9
feat(mcp): gate record deletes behind new record-destructive category…
ARHAEEM 66268f8
test(mcp): cover viewId fallback, id guards, and attachment soft-fail…
ARHAEEM eec14e8
feat(sync): add schema snapshot/normalize for plan engine
ARHAEEM 71900d5
feat(sync): add idmap name-matching + sync-state persistence
ARHAEEM cf01096
feat(sync): add computed-field canonicalization for ref-stable diffing
ARHAEEM 0f4ff23
chore(mcp): recurse test glob to include test/sync suites
ARHAEEM 019e24c
feat(sync): add schema diff -> ordered plan (create/update/orphan, re…
ARHAEEM 0a9444b
fix(sync): canonical typeOptions diff for computed fields + ordering …
ARHAEEM 168ce62
feat(sync): add plan report + orchestrator with dest fingerprint
ARHAEEM 679868b
feat(mcp): add sync_base tool (mode=plan) in new sync category
ARHAEEM b645f2c
chore(tool-sync): register sync category + sync_base across mirror + …
ARHAEEM 0532e5b
feat(sync): capture link foreign-table deps + document source-id cont…
ARHAEEM a72b4ac
feat(sync): carry sourcePrimaryFieldId + field description in plan ac…
ARHAEEM 9b2faa9
feat(sync): add remapRefs source->dest rewrite + writable computed op…
ARHAEEM dc141ef
test(sync): lock brace-aware remapRefs (string-literal safety)
ARHAEEM dad6371
feat(sync): add resumable apply journal + loadPlan
ARHAEEM e4b9388
test(sync): add deterministic stateful mock client for apply tests
ARHAEEM 17686d0
feat(sync): apply skeleton -- createTable (scaffolding-delete) + prim…
ARHAEEM 8e69e3f
feat(sync): apply scalar createField with existence-skip idempotency
ARHAEEM b64fec8
feat(sync): apply computed createField -- writable shape, validate, s…
ARHAEEM 1d0dd90
feat(sync): apply foreignKey link createField with reciprocal-once ad…
ARHAEEM 87fccdb
feat(sync): apply updateField -- safe changes, select-merge, retype d…
ARHAEEM a91a538
test(sync): prove apply journal-resume + run-twice idempotency
ARHAEEM f3f364c
feat(sync): apply orchestrator with drift guard + journal/idmap persi…
ARHAEEM 384b0e6
feat(mcp): sync_base mode=apply (execute saved plan, drift-guarded)
ARHAEEM f9e666a
docs(sync): document sync_base mode=apply across CLAUDE.md, CHANGELOG…
ARHAEEM a6ba2a4
fix(sync): skip computed field with unresolvable refs instead of halt…
ARHAEEM 4fac816
fix(sync): apply updateField computed writable shape + continue-on-fa…
ARHAEEM cc7e7d9
fix(sync): converge plan — select choices are superset-equal, skip em…
ARHAEEM 0c3ed54
feat(sync): add remapViewConfig + canonicalizeViewConfig for view sync
ARHAEEM e9bd5b2
feat(sync): snapshot collaborative views + live config (sortSet unwra…
ARHAEEM 2596d41
feat(sync): match collaborative views by name in idmap
ARHAEEM c420b3b
feat(sync): diff emits createView + applyViewConfig (convergent, afte…
ARHAEEM 9f2b909
feat(sync): apply createView (adopt-by-name) + mock view state
ARHAEEM 9a85799
fix(sync): createTable index entry includes viewsByName so same-run c…
ARHAEEM 4d17b2d
feat(sync): apply applyViewConfig -- facets, anchor validation (kanba…
ARHAEEM a5bbc73
feat(sync): view-aware fingerprint + count view actions in plan report
ARHAEEM ba4179a
docs(sync): document collaborative view sync in sync_base
ARHAEEM 814e61a
fix(client): setViewColumns verify-readback + retry (bulk under-apply…
ARHAEEM f434620
fix(sync): converge view columns -- canonical compares visible order …
ARHAEEM fe9b032
fix(sync): converge view columns on visible/hidden SET, not order (or…
ARHAEEM a0172af
fix(sync): exclude record-based colorConfig (colorDefinitions) from v…
ARHAEEM 5295e49
fix(sync): clear stray dest view facets source lacks (filters/sorts/g…
ARHAEEM c96e192
fix(sync): strip+report record-referencing view filters (no dangling …
ARHAEEM 7bb4974
feat(sync): record snapshot via queryRecords summary.rows
ARHAEEM 7977d00
feat(sync): persist records map in idmap
ARHAEEM 695e041
feat(sync): cells.js pass-1 scalar/select coercion + writable gate
ARHAEEM 9d75144
feat(sync): cells.js link partition (resolved/unresolved)
ARHAEEM a0f14fa
feat(sync): ratelimit token-bucket + transient retry
ARHAEEM 0ec4768
feat(sync): records journal file (distinct from schema journal)
ARHAEEM d1d9f2b
fix(test): expand records-journal test — distinct filename, env clean…
ARHAEEM 3283b80
feat(sync): records Pass 1 (scalar/select upsert + fill record map)
ARHAEEM 90009f4
feat(sync): records Pass 2 link cells via addLinkItems (idempotent)
ARHAEEM 0290dc0
fix(sync): harden link-cell shape handling in records Pass 1 & 2
ARHAEEM 02ce8f1
feat(sync): record attachments (download/upload/verify/dedupe, non-bl…
ARHAEEM ecab2db
feat(sync): reapplyViewFilters — remap record-ref filters once record…
ARHAEEM 950db47
feat(sync): wire records phase into apply + reconcile mode + pre-flight
ARHAEEM 96d21f9
feat(sync): sync_base mode=reconcile; apply now syncs records; record…
ARHAEEM b7d5788
fix(auth): bound session init/recovery with a timeout (records apply …
ARHAEEM 78a254d
perf(sync): records phase uses schema-only snapshot (eliminate getVie…
ARHAEEM 9a46f27
feat(sync): run the records phase as a background job (non-blocking a…
ARHAEEM 0038d4a
docs(sync): document M3-records (background record sync, mode=status,…
ARHAEEM 6c191e1
fix(sync): final-review fixes — preserve records map across applies (…
ARHAEEM 88a0c19
feat(sync): server-side cross-base attachment copy (fast-path)
ARHAEEM 8a55c9d
fix(auth): circuit-breaker for a dead session (stop the 403→recover→4…
ARHAEEM 9dca92b
fix(auth): back off on 403/429 (don't relaunch) — stop amplifying the…
ARHAEEM 44e5248
feat(sync): fold resolvable links into row/create (kills most of Pass 2)
ARHAEEM cd15864
feat(sync): proactively pace the records phase under ~5 req/s
ARHAEEM 8c81b55
fix(sync): pace records POSTs via a phase-local gate, not the shared …
ARHAEEM 8934a05
feat(sync): AIRTABLE_SYNC_RPS knob for the records-phase limiter
ARHAEEM dce82e2
feat(sync): capture view sections in normalizeSchema (no extra API call)
ARHAEEM 1111950
feat(sync): compare.js classification map
ARHAEEM 0275d26
feat(sync): compareFields with drift + best-effort field order
ARHAEEM 18f3647
fix(sync): compareFields — guard choices on type-match; track matched…
ARHAEEM 63ea942
feat(sync): compareTable/Views incl. sections + order
ARHAEEM 77ae232
test(sync): pin frozen/rowHeight DiffEntry contract; document sort-or…
ARHAEEM ec22fe4
feat(sync): top-level compare() + identical/converged verdicts
ARHAEEM e69f2d3
fix(sync): converged must account for onlyInSource (missing) items, n…
ARHAEEM 837f6a8
feat(sync): saveDiff/loadDiff/latestDiffId
ARHAEEM c768a67
feat(sync): renderDiff digest + drill-in
ARHAEEM 96a6b35
feat(sync): add diff() + diffDetail() engine functions
ARHAEEM 15559b0
feat(sync): sync_base mode=diff (digest + detail drill-in)
ARHAEEM 4b6edf2
feat(sync): stable changeId + class + apply flag on plan actions
ARHAEEM bd0cab5
feat(sync): changeset digest + direction in plan()
ARHAEEM 997ab90
feat(sync): journal-safe selective apply (skip-list + apply:false)
ARHAEEM c7098fc
feat(sync): thread skip-list through apply() + sync_base
ARHAEEM 06f970a
docs(sync): compare/changeset/selective-apply
ARHAEEM b05f0ac
chore(sync): drop dead import; document to-source apply base-swap
ARHAEEM 7c96c75
fix(sync): compare canonicalizes cross-base computed/link refs (no fa…
ARHAEEM 7754291
fix(sync): strip read-only maxUsedAutoNumber so autoNumber fields create
ARHAEEM 3fe3de5
fix(sync): count fields emit internal relationColumnId (not public re…
ARHAEEM 818ba6c
docs(sync): changelog — autoNumber + count field-create fixes
ARHAEEM c871bb4
fix(sync): canonicalize empty-predicate filter operators (no false vi…
ARHAEEM c52118e
fix(sync): delete createTable scaffolding rows for a clean mirror
ARHAEEM 0360193
docs(sync): changelog — createTable scaffolding-row cleanup
ARHAEEM 5790df3
feat(sync): policy presets + resolvePolicy + isDeleting
ARHAEEM ddf069a
feat(sync): validateFieldMappings (fail-fast, 6 codes) + resolve to f…
ARHAEEM 7cf8eeb
fix(sync): add multipleSelects to ARRAY_SOURCE_TYPES hardening
ARHAEEM 02a0321
feat(sync): coerceMappedValue — scalar source->dest injection
ARHAEEM 6e50a8f
feat(sync): Pass1 honors conflict policy (dest-wins preserves dest ed…
ARHAEEM f57539c
feat(sync): Pass1 injects resolved field mappings (source value -> de…
ARHAEEM dd20332
feat(sync): pruneRecords — delete dest-only orphans under mirror (gated)
ARHAEEM a87c337
fix(sync): result accumulator guards in pruneRecords
ARHAEEM bb54df6
feat(sync): runRecords core — pre-flight mapping validation + prune; …
ARHAEEM e046ad4
fix(sync): surface deleted in records job-status + relocate applyReco…
ARHAEEM af8a7f1
feat(sync): sync_base policy/fieldMappings params + plan-mode mapping…
ARHAEEM 450cef6
fix(sync): synchronous fieldMappings pre-flight in apply() + dead DEL…
ARHAEEM 0fefde6
docs(sync): document reconciliation policy + custom field mappings
ARHAEEM 03ed538
fix(docs): clarify createTable scaffolding-row clearing is unconditional
ARHAEEM ab1fd2f
fix(sync): pruneRecords — snapshot-derived orphan detection, M3 scopi…
ARHAEEM 772df21
chore: WIP auth/daemon/webview changes (separated from records-policy)
ARHAEEM 80aa327
feat(sync): matchByNaturalKeys — add-only, ambiguity-safe record matc…
ARHAEEM 0ff6d60
feat(sync): reconcile performs natural-key matching (removes stub)
ARHAEEM 0d1e26b
feat(sync): runRecords natural-key pre-pass + thread naturalKeys thro…
ARHAEEM fa8a57e
feat(sync): sync_base passes naturalKeys to apply + surfaces matched …
ARHAEEM 3f912d5
docs(sync): document natural-key record matching
ARHAEEM 3418339
docs: fix accuracy (reconcile natural-key stale text + add naturalKey…
ARHAEEM 059e1cb
docs: fix stale comment on reconcile natural-key matching
ARHAEEM 6c433cf
feat(sync): pruneSchema — delete dest-only fields/views/tables under …
ARHAEEM e4e3fcc
feat(sync): apply() runs pruneSchema after applyPlan (threads confirm…
ARHAEEM 0606069
feat(sync): sync_base confirmTableDeletions param + surface schema-de…
ARHAEEM bc29bd8
docs(sync): document schema-orphan deletion under mirror
ARHAEEM 87b1e05
docs(changelog): fix stale deferred-follow-ups sentence
ARHAEEM 40d5643
fix(sync): guard pruneSchema with aborted check
ARHAEEM 5e5860f
feat(sync): apply scalar field retypes under confirmRetypes (was RETY…
ARHAEEM 2f3c500
feat(sync): sync_base confirmRetypes param + surface retyped count
ARHAEEM 3c0fe98
docs(sync): document scalar field retypes under confirmRetypes
ARHAEEM 2d9e397
fix(sync): pruneRecords skips truncated tables (>1000 rows) to preven…
ARHAEEM 505125f
feat(sync): runRecords flags truncated tables + warns; thread guard i…
ARHAEEM 27d4682
feat(sync): capture view-section id in snapshot; compare sections by …
ARHAEEM 81d59a1
feat(sync): delete dest-only view-section orphans under mirror (prune…
ARHAEEM a34996e
docs(sync): prune-schema header comment lists sections + deletion order
ARHAEEM 70f308d
fix(security): stop logging CSRF token prefix; drop daemon port from …
ARHAEEM 7ea117f
fix(sync): recognize INTERNAL array type spellings in cells + fieldMa…
ARHAEEM 50bfe7b
fix(sync): preserve persisted idmap.records/attachments across plan/diff
ARHAEEM fbaefab
fix(sync): defer ALL array-shaped cells on the Pass-1 update path
ARHAEEM 24b9b0f
fix(sync): guard mode=apply with a per-pair lock file
ARHAEEM ac370e0
fix(sync): use escaped separator in arrayCellEquals (drop raw NUL byte)
ARHAEEM fc00f3d
fix(sync): make journal resume reachable past the drift guard
ARHAEEM 3537158
fix(sync): propagate cells cleared on source as explicit nulls (sourc…
ARHAEEM 385547c
fix(sync): harden apply engine — exact reverse-link adoption, retryab…
ARHAEEM a7b9d27
fix(sync): skip update rows with an empty cell map
ARHAEEM 571f002
fix(sync): compare matched link fields canonically — no phantom updat…
ARHAEEM 1205974
fix(sync): compare writable display-format options on computed fields
ARHAEEM dd9a0aa
fix(sync): pass collaborator usr ids through view-filter remap verbatim
ARHAEEM 8d34ab3
fix(sync): match views by (name, type) — cross-type same-name views a…
ARHAEEM 79ba83d
fix(sync): never emit the dest primary field as a deletable orphan
ARHAEEM f2cce19
fix(sync): guard reconcile existence-prune against truncated dest sna…
ARHAEEM cef92c5
fix(sync): truncation detection counts fetched rows, not folded synth…
ARHAEEM 81009ad
fix(sync): mirror prune propagates source record deletions (stale idm…
ARHAEEM f98710c
fix(sync): Pass 2 links + Pass 3 attachments honor conflicts=dest-wins
ARHAEEM 3004f7d
fix(sync): scope attachment-fallback dedupe key to the destination cell
ARHAEEM bcf2c72
fix(sync): filter restore survives per-view getView failures; never b…
ARHAEEM fb15ffc
fix(sync): record snapshots avoid filtered views; partial reads block…
ARHAEEM b08f1ea
fix(sync): mode=status detects a records job whose process died mid-run
ARHAEEM 8d80a98
fix(sync): createField registers the real select choice map for the s…
ARHAEEM de9f9b5
fix(sync): records seams — computed-dest clear skip, resume-durable c…
ARHAEEM b6fa5f9
fix(sync): apply-engine seams — (name,type) view adoption, deferred c…
ARHAEEM c98f5ab
docs: update tool count to 71, document upload_attachment and daemon …
ARHAEEM fe5807b
feat(transport): route Airtable API calls through direct node HTTP
ARHAEEM 91e22a5
test(transport): cover HttpTransport + auth direct-HTTP seam
ARHAEEM 9af6601
refactor(auth): drop blocking secretSocketId nav-capture (live-proven…
ARHAEEM da34bd1
feat(auth): AIRTABLE_AUTH_MODE=byo — cookie-only credentials, no browser
ARHAEEM 36e977e
feat(auth): AIRTABLE_AUTH_MODE=direct-login — browser-free login via …
ARHAEEM 3921af7
fix(auth): recover from a locked Chrome profile (exit 21) by killing …
ARHAEEM eefd80e
feat(sync): run plan + apply as background jobs (mode=status phases)
ARHAEEM d56f556
docs: document transport modes (direct-HTTP + auth-mode + http-client…
ARHAEEM 3ea20d2
fix(sync): harden applyJob terminal write + document apply() throw co…
ARHAEEM 2803eac
feat(mcp): re-provision stdio MCP servers when authMode/httpClient ch…
ARHAEEM 0e0d0e4
feat(daemon): inject byo/direct-login credentials via a bearer-authed…
ARHAEEM 8abaecf
feat(auth): byo + direct-login credential handling in extension (keyc…
ARHAEEM 2d04354
fix(formula): resolve field names in downloads + normalize legacy ref…
ARHAEEM d3204b1
feat(mcp): idle park Chromium, PageScheduler, process-tree, tool labels
ARHAEEM ae481e1
fix(mcp): share auth for pageBusy; update multiSelect on records
ARHAEEM ace1e42
fix(mcp): address PR #19 review — CI lockfile, auth/daemon lifecycle,…
ARHAEEM cf4e987
fix(build): keep impit external in the MCP bundle + vendor it for pac…
ARHAEEM da0c5b4
test(mcp): make process-tree + idmap tests deterministic across OSes
ARHAEEM c0a9010
fix(auth): single-flight _doInit so a watchdog timeout can't double-l…
ARHAEEM 8673e04
fix(daemon): fail clearly if listenAvoidingBlockedPorts exhausts all …
ARHAEEM 352b29c
fix(mcp): address PR #19 review — dead code, test engines, tracer red…
ARHAEEM 35b389a
fix(extension): propagate transport-setting edits from settings.json …
ARHAEEM 905ed73
docs(tooling): fix CLAUDE.md tool/category counts and guard them in c…
ARHAEEM e473cdb
fix(mcp): remove sync from safe-write; stop custom profiles gaining n…
ARHAEEM 0e51c20
fix(mcp): correct toggle notifications for absent-key tools; make new…
ARHAEEM 6634c24
fix(mcp): mark sync_base destructive; retire "read-only plan mode" wo…
ARHAEEM f677127
fix(extension): scope the orphan sweep to processes this install prov…
ARHAEEM 39f4c55
fix(extension): require the daemon-start shape for path-based sweep o…
ARHAEEM 032f01f
docs: fix stale 66-tool counts and sync scope claims in published REA…
ARHAEEM 4545a4a
docs(assets): fix stale 66-tool/13-category text baked into banner/ar…
ARHAEEM e1675b6
fix(mcp-server): sanitize real account identifiers in sync test fixture
ARHAEEM ff8dba9
fix(mcp-server): give sync fixture's avatar/attachment hashes distinc…
ARHAEEM e6924b6
test(direct-login): pin CSRF reuse across 2FA — Seer stale-token find…
ARHAEEM 3b71a39
fix(build): vendor impit's per-platform napi binary into the VSIX
ARHAEEM e88b3f7
fix(build): generalize the napi-binary vendoring fix to @ngrok/ngrok …
ARHAEEM 0ca34c7
fix(auth): clear the dead-session breaker on re-authentication (8b)
ARHAEEM 9c319f5
fix(extension): make every logout path actually drop the daemon sessi…
ARHAEEM b89963d
fix(mcp-server): honour HTTP(S)_PROXY/NO_PROXY and unwrap "fetch fail…
ARHAEEM 28cb407
fix(auth): only un-latch the breaker, never zero a partial streak (8b…
ARHAEEM 9fea048
fix(extension): logout must not report success it cannot confirm (8c/F1)
ARHAEEM 8f85a77
fix(extension): a profile left on disk is not a completed logout (8c/F3)
ARHAEEM ba745ab
docs(changelog): document pre-merge pass scope + retroactively docume…
ARHAEEM 0d67323
fix(mcp-server): correct serverInfo.description tool count and guard it
ARHAEEM 58e5efd
fix(extension): logout must not let a vacuous release mask a failed drop
ARHAEEM eb87f60
fix(extension): fail closed on the recordDestructive/sync setting fal…
ARHAEEM 853179e
fix(mcp-server): match getView column-visibility semantics; inject CS…
ARHAEEM 1bb90dd
feat(packaging): define the VSIX target matrix and vendor foreign nat…
ARHAEEM 68e8bf5
feat(packaging): assert every VSIX carries its own platform's binarie…
ARHAEEM 634286b
feat(packaging): build one verified VSIX per target; drop untargeted …
ARHAEEM 462886c
ci(release): publish 8 platform-specific VSIXes, no untargeted fallba…
ARHAEEM cf92b97
docs: correct the "fully self-contained" VSIX claim; document the pla…
ARHAEEM d016d0b
ci(release): bound the Open VSX index-verification wait across 8 targets
ARHAEEM 455bfda
fix(mcp-server): guard CSRF spread against non-plain bodies; unify co…
ARHAEEM 6e31e66
fix(packaging): verify native binaries by magic number, not just by n…
ARHAEEM bb0a636
ci(release): bound Open VSX verification by wall clock; fix the build…
ARHAEEM 67999ce
fix(packaging): report vendor failures without an unhandled-rejection…
ARHAEEM 119c9ea
docs: narrow tool-profile allowlist claim; document column-visibility…
ARHAEEM be862c3
fix(packaging): verify native binaries by exact digest, not by OS mag…
ARHAEEM 5d1538d
fix(packaging): revalidate the vendor cache and guard foreign symlink…
ARHAEEM 96daeed
docs: call these eight target artifact packaging/assertion smokes (18d)
ARHAEEM e8ee2fc
fix(extension): the orphan sweep must not kill by profile-path mentio…
ARHAEEM becd274
fix(packaging): reject unpinned .node files in the artifact, not just…
ARHAEEM 5dd032b
fix(packaging): diff pins not prose; guard the generator's extraction…
ARHAEEM 2e5c702
ci: verify native-binary digest pins at release and on dependency PRs
ARHAEEM a5c80ce
ci: widen the pin-check trigger; record that the PR job is advisory, …
ARHAEEM ec11ec6
fix(extension): make the sweep's image test actually mean argv[0] (17…
ARHAEEM 26cfa0f
fix(mcp-server): only kill positively-attributable browsers on POSIX …
ARHAEEM 2d77844
fix(mcp-server): replace too-loose plain-object test in the CSRF spre…
ARHAEEM 05b54aa
fix(extension): resolve argv[0] by enumeration, not by patched exampl…
ARHAEEM 427a3c7
fix(mcp-server): unify process attribution behind one shared, test-en…
ARHAEEM 40a61a7
fix(mcp-server): pin the win32 PowerShell invocation to the reference…
ARHAEEM 18c8614
fix(attribution): make the argv boundary symmetric and the bundle mar…
ARHAEEM fbd9487
fix(attribution): drop the `=` widening and give the quoted branch th…
ARHAEEM 05917bd
fix(build): parameterize the symlink policy so verify-pins survives n…
ARHAEEM fb11377
fix(attribution): parse argv instead of matching quoted substrings (23)
ARHAEEM fe12bb2
docs: specify native Airtable workbench redesign
ARHAEEM 0b444db
fix(sync): sort fields before hashing in fingerprintSchema (27)
ARHAEEM 0ecff7f
docs: plan native Airtable workbench implementation
ARHAEEM File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
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
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
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,90 @@ | ||
| name: Verify native-binary pins | ||
|
|
||
| # Re-derive every platform package's `.node` digests from the registry and diff | ||
| # them against the committed pin file. | ||
| # | ||
| # ───────────────────────────────────────────────────────────────────────────── | ||
| # THIS JOB IS ADVISORY. IT IS NOT THE GATE. READ THIS BEFORE CHANGING EITHER. | ||
| # | ||
| # It is path-filtered, so on most pull requests it does not run at all — and a | ||
| # job that does not run reports as SKIPPED, which a merge queue or a required- | ||
| # check configuration can render as green. **A skipped run is not a | ||
| # verification.** Nothing about a green PR here proves the pins were checked. | ||
| # | ||
| # The authoritative check is the `Verify native-binary digest pins` step in | ||
| # .github/workflows/release.yml, which sits between `pnpm install | ||
| # --frozen-lockfile` and packaging. That one runs unconditionally on every | ||
| # extension release, and nothing publishes or tags if it fails. THAT is the | ||
| # safety boundary. | ||
| # | ||
| # Two consequences, both easy to get wrong later: | ||
| # - Do NOT promote this workflow to a required status check believing it | ||
| # gates merges. Path filtering means it will pass by absence. | ||
| # - Do NOT delete the release-workflow step believing this job covers it. | ||
| # It does not, and cannot. | ||
| # | ||
| # This was a deliberate trade. The alternatives — a companion always-succeeds | ||
| # job to make the skip explicit, or dropping the `paths` filter so it runs on | ||
| # every PR — each cost more (a permanently-green decoy check, or ~150 MB of | ||
| # tarball downloads on every unrelated PR) than they buy, precisely BECAUSE the | ||
| # release step is already the real gate. What this job buys is early warning for | ||
| # the contributor, in the PR that caused the problem. | ||
| # ───────────────────────────────────────────────────────────────────────────── | ||
| # | ||
| # WHY A SEPARATE, PATH-FILTERED WORKFLOW | ||
| # | ||
| # This is the only check in the repo that needs network access and pulls ~150 MB | ||
| # of tarballs, so it is deliberately kept out of `pnpm test` and out of ci.yml's | ||
| # per-OS matrix. It only has anything to say when the pins or the lockfile move, | ||
| # which is exactly what `paths` expresses — and GitHub applies `paths` at the | ||
| # trigger level, hence its own file rather than a job in ci.yml. | ||
| # | ||
| # WHY IT RUNS ON THE PR AS WELL AS AT RELEASE | ||
| # | ||
| # `pnpm-lock.yaml` changing is how an impit / @ngrok/ngrok bump arrives. With | ||
| # only the release-time check, a stale pin surfaces to whoever runs the release | ||
| # — long after the person who bumped the dependency has moved on. Here it | ||
| # surfaces to the author, in the PR that caused it, with the command to fix it. | ||
| # That is a convenience for the contributor, not a second safety boundary. | ||
| # | ||
| # WHAT IT UNIQUELY CATCHES | ||
| # | ||
| # A pin file that is internally consistent — correct version, correct integrity | ||
| # — but carries WRONG DIGESTS. The neighbouring failure modes are already | ||
| # covered offline and never reach here: a stale or missing pin fails closed in | ||
| # `binaryPin()` during vendoring, and a re-published tarball fails the lockfile | ||
| # SHA-512 on download. A poisoned pin file is the residual trust root, and only | ||
| # a fresh re-derivation from the registry can expose it. | ||
|
|
||
| on: | ||
| pull_request: | ||
| paths: | ||
| # Any of these can invalidate the pin file — two of them WITHOUT editing it: | ||
| - 'pnpm-lock.yaml' # an impit / @ngrok/ngrok bump | ||
| - 'scripts/native-binary-digests.json' # the pins themselves | ||
| - 'scripts/record-native-binary-digests.mjs' # HOW digests are produced | ||
| - 'scripts/vsix-targets.mjs' # WHICH packages are expected at all | ||
| - 'scripts/safe-symlinks.mjs' # the symlink-escape guard the check relies on | ||
| - 'scripts/vendor-platform-packages.mjs' # tarball fetch/verify/vendor logic the check imports | ||
| - 'package.json' # the `check:binary-digests` script definition itself | ||
|
|
||
| permissions: | ||
| contents: read | ||
|
|
||
| jobs: | ||
| verify-pins: | ||
| runs-on: ubuntu-latest | ||
| steps: | ||
| - uses: actions/checkout@v4 | ||
| - uses: pnpm/action-setup@v4 | ||
| with: | ||
| version: 9 | ||
| - uses: actions/setup-node@v4 | ||
| with: | ||
| node-version: '22' | ||
|
|
||
| # No `pnpm install` on purpose: the checker uses only Node builtins, the | ||
| # repo's own scripts, `pnpm-lock.yaml` and `tar`. Skipping the install | ||
| # keeps this job to a fetch and a hash. | ||
| - name: Re-derive digests from the registry and diff against the pins | ||
| run: pnpm check:binary-digests | ||
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
Oops, something went wrong.
Oops, something went wrong.
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.
Uh oh!
There was an error while loading. Please reload this page.