Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
53 commits
Select commit Hold shift + click to select a range
1ece9a7
M1/B1: Add agent adapter registry foundation + install snapshot baseline
Vedansi18 May 13, 2026
d93852e
M1/B2: Refactor Claude Code into HookAdapter via agent registry
Vedansi18 May 13, 2026
66dd54b
M1/B2 follow-up: revert advisory-hook comment to original wording
Vedansi18 May 13, 2026
879ed5e
M2/B1: Add VS Code extension skeleton, IPC stub, onboarding, and icon
Vedansi18 May 14, 2026
14e849a
M2/B2: Add chat-history watcher, extractors, and schema fingerprint
Vedansi18 May 14, 2026
3794bc3
M2/B2 follow-up: WAL-aware dump script + Cursor 3.4.20 real-data fixes
Vedansi18 May 15, 2026
94d81dc
M2/B2 follow-up: extract dump-script helpers to src/ + add 28 unit tests
Vedansi18 May 15, 2026
883ade9
M2/B3: Add decision-session webview, HTML template, prompt injection
Vedansi18 May 15, 2026
a3d5fbc
M2/B3 follow-up: injectFn contract for B4 + keyboard shortcuts
Vedansi18 May 15, 2026
3d0957e
M2/B3 audit follow-up: catch onSelect errors + 3 missing test cases
Vedansi18 May 15, 2026
536bca8
Merge B2 (chat-history-capture) into B4 — B4 needs the watcher + extr…
Vedansi18 May 15, 2026
21f3f48
Merge M1 (agents framework + Claude Code adapter) into M2/B4 — B4's C…
Vedansi18 May 15, 2026
174402b
M2/B4: Add Cursor + Windsurf CLI adapters (M9 + M10)
Vedansi18 May 15, 2026
fa3c134
M2/B4 follow-up: WAL fix, host-detector, chat-input-injector, view-pr…
Vedansi18 May 15, 2026
55477c2
M2/B4 audit follow-up: wire registry into install/uninstall + extract…
Vedansi18 May 15, 2026
f6a916b
M2/B4 audit gap closure: defaultReadItemTable + adapter-error catches
Vedansi18 May 15, 2026
1194850
M2/B5: Wire watcher into extension.ts, add smoke-test documentation
Vedansi18 May 16, 2026
e0ae39a
M2/B5 follow-up: align ipc stdin payloads with Layer C's contract (no…
Vedansi18 May 16, 2026
4aa977b
M2/B5 audit follow-up: test the three watcher-callback wirings
Vedansi18 May 16, 2026
7f4f82c
M2 Drift A fix: watch ~/.codeium/windsurf when host=windsurf
Vedansi18 May 16, 2026
e50bfcd
M2 watcher fix: also fs.watch state.vscdb-wal/-shm siblings (WAL-mode…
Vedansi18 May 18, 2026
5bf6796
SMOKE-TEST: lock safe-prompt contract after live data-loss incident
Vedansi18 May 18, 2026
f9b57cb
M2: add Nexpath OutputChannel for live debugging visibility
Vedansi18 May 18, 2026
45e52bc
M2 watcher fix: use ALL matching extractors per row (fingerprint-tie …
Vedansi18 May 18, 2026
928c1ae
chore(M2): gitignore .vsix + add cursor-live-smoke state.vscdb fixtures
Vedansi18 May 20, 2026
19827a5
fix(dev-probe): show local-time date in storeToday header
Vedansi18 May 20, 2026
826a262
M2 critical fix: watcher initial-pass primes dedup, no longer emits h…
Vedansi18 May 20, 2026
f43c6c5
M2 fix: watcher tolerates state.vscdb disappearing between enumerate …
Vedansi18 May 20, 2026
f3079ca
M2 critical fix: cursor-v2024-q4 stable rawSessionId — survives Curso…
Vedansi18 May 20, 2026
4a8cd4b
M2 cleanup: remove diagnostic onTrace callback (bug found, regression…
Vedansi18 May 20, 2026
5688be4
M2/B6: pre-open notification panel so consent toast is visible in Cursor
Vedansi18 May 21, 2026
386e63f
M2/B6: surface chat-pipeline spawn failures in Nexpath Output channel
Vedansi18 May 22, 2026
b18462f
M2/R4.3 fix: multi-workspace prompt mis-attribution + duplicate rows
Vedansi18 May 22, 2026
5e7d5ce
M2/F2: Cursor Composer/Agent capture via globalStorage cursorDiskKV
Vedansi18 May 25, 2026
fe7a276
M2/B6 fix: cross-extractor dedup for Cursor Composer↔Ask mirror
Vedansi18 May 27, 2026
2e1ec1a
M2 fix: surface schema-unknown once per path (stop Windsurf log/toast…
Vedansi18 May 28, 2026
86f08fb
M2 docs: record Windsurf-capture-infeasible finding in windsurf.ts
Vedansi18 May 28, 2026
4c9472d
M2/B6: Publishing infrastructure + cross-OS verification procedure
Vedansi18 May 16, 2026
fd62616
M2/B6 audit follow-up: resolve marketplace ID + pin CI runners + add …
Vedansi18 May 16, 2026
8cfadf6
M2/B6 test gap closure: marketplace-id cross-file invariant
Vedansi18 May 16, 2026
78c157c
M2/B6 lockfile sync: catch up to package.json license field change
Vedansi18 May 16, 2026
0499ca2
M2/B6 critical fix: rename bundle .js → .cjs (silent ERR_REQUIRE_ESM …
Vedansi18 May 18, 2026
85a29cb
M2/B6 critical fix: native-module ABI mismatch (better-sqlite3 vs Ele…
Vedansi18 May 18, 2026
0a89065
build: chmod +x the CLI bins after tsc (postbuild)
Vedansi18 Jun 5, 2026
f0446bc
ext: restore DBUS_SESSION_BUS_ADDRESS when spawning the nexpath CLI
Vedansi18 Jun 5, 2026
4d0c468
ext: package script spawns through shell on Windows (fixes packaging …
Vedansi18 Jun 6, 2026
7031e00
ext: bring the advisory popup window to the foreground on Linux (Laye…
Vedansi18 Jun 6, 2026
a905675
ext: spawn the nexpath CLI through the shell on Windows (fixes "spawn…
Vedansi18 Jun 6, 2026
2d5c340
ext: polling backstop for the chat-history watcher (fixes Windows cap…
Vedansi18 Jun 6, 2026
60ac781
ext: canonicalize the cwd handed to auto/stop (fixes "advisory fires …
Vedansi18 Jun 6, 2026
9eb7c92
ext: complete the terminal-popup loop in Cursor + add an in-editor ad…
Vedansi18 Jun 8, 2026
eaf4e0f
ext: recover the popup selection when `nexpath stop` crashes on exit …
Vedansi18 Jun 8, 2026
f1e9dd4
ext: arm the in-editor fallback before the popup (fixes macOS no-popu…
Vedansi18 Jun 8, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
198 changes: 198 additions & 0 deletions .github/workflows/publish-extension.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,198 @@
name: Publish Nexpath VS Code Extension

# Manual trigger (workflow_dispatch) AND automatic trigger on tag push.
# The build step always runs on every supported OS; the publish step only
# runs when triggered with publish=true OR by a tag matching vsix-v*.
#
# Required repository secrets for publishing:
# VSCE_PAT — Azure DevOps Personal Access Token (Marketplace: Manage)
# OVSX_PAT — Open VSX namespace access token
#
# Both should be created via Settings → Secrets and variables → Actions.

on:
workflow_dispatch:
inputs:
publish:
description: "Publish to marketplaces (false = artefacts only)"
type: boolean
required: true
default: false
push:
tags:
- "vsix-v*"

jobs:
# ──────────────────────────────────────────────────────────────────────────
# Matrix: build one .vsix per supported (os, arch) pair.
# better-sqlite3 ships per-platform prebuilds; each runner naturally has
# the right binary in node_modules after `npm install`.
# ──────────────────────────────────────────────────────────────────────────
package:
name: Package (${{ matrix.target }})
runs-on: ${{ matrix.runner }}
strategy:
fail-fast: false
matrix:
include:
# Pin every runner to a specific version so the matrix is reproducible
# across runs; otherwise GitHub's `*-latest` labels drift to new minor
# versions without warning (and our better-sqlite3 prebuilds are
# node-abi keyed, which can desync with the runner's default node).
- target: linux-x64
runner: ubuntu-22.04
- target: darwin-x64
runner: macos-13 # Intel mac for x64 prebuild
- target: darwin-arm64
runner: macos-14 # Apple Silicon (pinned; previously macos-latest)
- target: win32-x64
runner: windows-2022
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0

- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: "20"
cache: "npm"
cache-dependency-path: src/ext-vscode/package-lock.json

- name: Install sub-package deps
working-directory: src/ext-vscode
run: npm ci

- name: Typecheck
working-directory: src/ext-vscode
run: npx tsc --noEmit

- name: Unit tests
working-directory: src/ext-vscode
run: npm test

- name: Build esbuild bundle
working-directory: src/ext-vscode
run: npm run build

- name: Package .vsix (with better-sqlite3 rebuilt for Cursor's Electron ABI)
working-directory: src/ext-vscode
run: |
mkdir -p dist-vsix
# package-with-electron-abi.mjs rebuilds better-sqlite3 against the
# Electron version pinned in package.json#nexpathTargets.electron,
# runs vsce package, then restores the Node-ABI binary. Skipping
# this wrapper would ship a Node-ABI binding in the .vsix and Cursor
# would fail to activate with NODE_MODULE_VERSION mismatch.
node scripts/package-with-electron-abi.mjs --target ${{ matrix.target }} --out dist-vsix/

- name: Upload .vsix artefact
uses: actions/upload-artifact@v4
with:
name: vsix-${{ matrix.target }}
path: src/ext-vscode/dist-vsix/*.vsix
if-no-files-found: error
retention-days: 30

# Linux ARM64 builds via QEMU emulation — separate job because the
# ubuntu-latest runner is x64. Slower, but the prebuilt better-sqlite3
# is available on npm for linux-arm64.
package-linux-arm64:
name: Package (linux-arm64)
runs-on: ubuntu-22.04
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0

- name: Set up QEMU
uses: docker/setup-qemu-action@v3
with:
platforms: arm64

- name: Build + package inside arm64 container
run: |
docker run --rm --platform linux/arm64 \
-v "${{ github.workspace }}":/work -w /work/src/ext-vscode \
node:20-bullseye bash -lc "
npm ci &&
npx tsc --noEmit &&
npm test &&
npm run build &&
mkdir -p dist-vsix &&
node scripts/package-with-electron-abi.mjs --target linux-arm64 --out dist-vsix/
"

- name: Upload .vsix artefact
uses: actions/upload-artifact@v4
with:
name: vsix-linux-arm64
path: src/ext-vscode/dist-vsix/*.vsix
if-no-files-found: error
retention-days: 30

# ──────────────────────────────────────────────────────────────────────────
# Publish — only runs on tag push or when manually triggered with publish=true.
# Pulls every matrix .vsix as an artefact, then loops them through vsce + ovsx.
# ──────────────────────────────────────────────────────────────────────────
publish:
name: Publish to marketplaces
needs: [package, package-linux-arm64]
if: ${{ github.event_name == 'push' || inputs.publish == true }}
runs-on: ubuntu-22.04
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: "20"
cache: "npm"
cache-dependency-path: src/ext-vscode/package-lock.json

- name: Install sub-package deps (for vsce + ovsx)
working-directory: src/ext-vscode
run: npm ci

- name: Download all .vsix artefacts
uses: actions/download-artifact@v4
with:
pattern: vsix-*
path: dist-vsix-all
merge-multiple: true

- name: List downloaded .vsix files
run: ls -la dist-vsix-all/

- name: Publish to VS Code Marketplace (vsce)
if: ${{ env.VSCE_PAT != '' }}
env:
VSCE_PAT: ${{ secrets.VSCE_PAT }}
working-directory: src/ext-vscode
run: |
for vsix in ../../dist-vsix-all/*.vsix ; do
echo "Publishing $vsix to VS Code Marketplace..."
npx vsce publish --packagePath "$vsix"
done

- name: Publish to Open VSX (ovsx)
if: ${{ env.OVSX_PAT != '' }}
env:
OVSX_PAT: ${{ secrets.OVSX_PAT }}
working-directory: src/ext-vscode
run: |
for vsix in ../../dist-vsix-all/*.vsix ; do
echo "Publishing $vsix to Open VSX..."
npx ovsx publish "$vsix"
done

- name: Sanity-check publication
run: |
echo "If the steps above succeeded:"
echo " - https://marketplace.visualstudio.com/items?itemName=emptyops.nexpath-vscode"
echo " - https://open-vsx.org/extension/emptyops/nexpath-vscode"
echo ""
echo "Note: marketplace ingestion may lag a few minutes after publish."
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,6 @@ node_modules/
*.js.map
*.d.ts.map
.env
src/ext-vscode/out/
src/ext-vscode/node_modules/
src/ext-vscode/*.vsix
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
},
"scripts": {
"build": "tsc",
"postbuild": "node -e \"['dist/cli/index.js','dist/server/index.js'].forEach(f => require('fs').chmodSync(f, 0o755))\"",
"dev:cli": "tsx src/cli/index.ts",
"dev:server": "tsx src/server/index.ts",
"typecheck": "tsc --noEmit",
Expand Down
Loading