From a540193c50ce72d53d5431a42bb1eaae8e87b3a1 Mon Sep 17 00:00:00 2001 From: Aric Camarata Date: Wed, 26 Aug 2026 15:00:12 -0400 Subject: [PATCH 1/3] ci: path-filtered workflows now watch their own file MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A workflow with a `paths:` filter that does not list itself cannot be triggered by an edit to itself. You can break the workflow — a bad condition, a typo in a step, a wrong action version — and CI stays green until some unrelated change happens to match the filter and finally runs it. The failure surfaces later, attributed to the wrong commit. Adds the workflow file to every `paths:` block it owns, including `pull_request` (the one that matters for catching this pre-merge) and inline flow-array forms. Same fix cli made in #257; this extends it to the rest of the org after a sweep found 33 affected workflows across 9 repos. Verified: every workflow YAML in this repo still parses. --- .github/workflows/companion-build.yml | 1 + .github/workflows/desktop-e2e.yml | 4 ++-- .github/workflows/libnclaw-build.yml | 2 ++ .github/workflows/nself-first-check.yml | 1 + 4 files changed, 6 insertions(+), 2 deletions(-) diff --git a/.github/workflows/companion-build.yml b/.github/workflows/companion-build.yml index 6d370a5..1df00e3 100644 --- a/.github/workflows/companion-build.yml +++ b/.github/workflows/companion-build.yml @@ -5,6 +5,7 @@ on: branches: [main] paths: - 'desktop/tauri/**' + - '.github/workflows/companion-build.yml' workflow_dispatch: jobs: diff --git a/.github/workflows/desktop-e2e.yml b/.github/workflows/desktop-e2e.yml index cb20da2..86bcf64 100644 --- a/.github/workflows/desktop-e2e.yml +++ b/.github/workflows/desktop-e2e.yml @@ -1,10 +1,10 @@ name: Desktop E2E on: pull_request: - paths: ['nclaw/desktop/**'] + paths: ['nclaw/desktop/**', '.github/workflows/desktop-e2e.yml'] push: branches: [main] - paths: ['nclaw/desktop/**'] + paths: ['nclaw/desktop/**', '.github/workflows/desktop-e2e.yml'] jobs: e2e: diff --git a/.github/workflows/libnclaw-build.yml b/.github/workflows/libnclaw-build.yml index ca37c8c..494000b 100644 --- a/.github/workflows/libnclaw-build.yml +++ b/.github/workflows/libnclaw-build.yml @@ -4,9 +4,11 @@ on: push: paths: - 'core/**' + - '.github/workflows/libnclaw-build.yml' pull_request: paths: - 'core/**' + - '.github/workflows/libnclaw-build.yml' workflow_dispatch: concurrency: diff --git a/.github/workflows/nself-first-check.yml b/.github/workflows/nself-first-check.yml index ff0c909..5a3a757 100644 --- a/.github/workflows/nself-first-check.yml +++ b/.github/workflows/nself-first-check.yml @@ -11,6 +11,7 @@ on: paths: - '**/docker-compose*.yml' - '**/docker-compose*.yaml' + - '.github/workflows/nself-first-check.yml' concurrency: group: ${{ github.workflow }}-${{ github.ref }} From 5fe4420248c4306de43301cead8ec0fd91804c43 Mon Sep 17 00:00:00 2001 From: Aric Camarata Date: Wed, 26 Aug 2026 16:21:43 -0400 Subject: [PATCH 2/3] fix(ci): Desktop E2E pointed at nclaw/desktop, which does not exist Every path in this workflow carried an 'nclaw/' prefix, a leftover from a monorepo-relative layout that does not apply inside the nclaw repo. The real directory is desktop/. Consequences, all of which were invisible: paths filter never matched, so the workflow had never run once working-directory failed to start the shell at all: 'No such file or directory' / 'The directory name is invalid' on all three runners artifact path would have uploaded nothing The filter and the working directories were the same bug, so fixing the filter alone would have made the suite run and immediately die. Both are corrected together, along with the artifact path. desktop/ has what the suite needs: package nclaw-desktop, an e2e script (playwright test), playwright in devDependencies, and a pnpm-lock.yaml for --frozen-lockfile. Refs #50. --- .github/workflows/desktop-e2e.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/desktop-e2e.yml b/.github/workflows/desktop-e2e.yml index 86bcf64..3144c76 100644 --- a/.github/workflows/desktop-e2e.yml +++ b/.github/workflows/desktop-e2e.yml @@ -1,10 +1,10 @@ name: Desktop E2E on: pull_request: - paths: ['nclaw/desktop/**', '.github/workflows/desktop-e2e.yml'] + paths: ['desktop/**', '.github/workflows/desktop-e2e.yml'] push: branches: [main] - paths: ['nclaw/desktop/**', '.github/workflows/desktop-e2e.yml'] + paths: ['desktop/**', '.github/workflows/desktop-e2e.yml'] jobs: e2e: @@ -21,16 +21,16 @@ jobs: - uses: pnpm/action-setup@v6 with: { version: '9' } - name: Install deps - working-directory: nclaw/desktop + working-directory: desktop run: pnpm install --frozen-lockfile - name: Install Playwright browsers - working-directory: nclaw/desktop + working-directory: desktop run: pnpm exec playwright install --with-deps chromium - name: Run E2E - working-directory: nclaw/desktop + working-directory: desktop run: pnpm e2e - uses: actions/upload-artifact@v7 if: failure() with: name: playwright-report-${{ matrix.os }} - path: nclaw/desktop/playwright-report/ + path: desktop/playwright-report/ From 29051c129f708f496d7a21e647bfb33c69961019 Mon Sep 17 00:00:00 2001 From: Aric Camarata Date: Wed, 26 Aug 2026 17:15:03 -0400 Subject: [PATCH 3/3] fix(ci): Desktop E2E could not resolve the @nself/* workspace siblings MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit With the nclaw/ path prefix corrected, the suite finally reached Run E2E and vite died on every runner: Failed to resolve import "@nself/observability" from "src/main.tsx" Failed to resolve import "@nself/auth-core" from "src/lib/auth.js" ... and @nself/graphql-client, @nself/i18n Two causes, both structural. pnpm-workspace.yaml globs '../packages/@nself/*' — the nself-org/packages repo as a SIBLING directory — and desktop/package.json depends on five of them as workspace:*. CI checked out only nclaw, so the sibling never existed and those packages could never resolve. nclaw now checks out into a subdir with nself-org/packages beside it, matching the layout the workspace file already expects. Install also has to run at the workspace ROOT. The lockfile is the root pnpm-lock.yaml (~712 KB) covering every member; running pnpm install inside desktop/ cannot link workspace siblings. Only the Playwright and e2e steps stay in desktop/. Verified all five packages exist and are public in nself-org/packages. Refs #50. --- .github/workflows/desktop-e2e.yml | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/.github/workflows/desktop-e2e.yml b/.github/workflows/desktop-e2e.yml index 3144c76..f102fab 100644 --- a/.github/workflows/desktop-e2e.yml +++ b/.github/workflows/desktop-e2e.yml @@ -15,22 +15,43 @@ jobs: runs-on: ${{ matrix.os }} timeout-minutes: 8 steps: + # pnpm-workspace.yaml globs '../packages/@nself/*', i.e. the + # nself-org/packages repo as a SIBLING directory. desktop/package.json + # depends on five of them (auth-core, graphql-client, i18n, observability, + # ui) as workspace:*. Checking out only nclaw leaves those unresolvable and + # vite dies with "Failed to resolve import @nself/observability". + # nclaw goes in a subdir so the sibling lands beside it, matching the + # layout the workspace file expects. - uses: actions/checkout@v7 + with: + path: nclaw + - uses: actions/checkout@v7 + with: + repository: nself-org/packages + path: packages + - uses: actions/setup-node@v7 with: { node-version: '20' } - uses: pnpm/action-setup@v6 with: { version: '9' } + + # Install at the workspace ROOT, not desktop/. The lockfile lives at the + # root (pnpm-lock.yaml, ~712 KB) and covers every workspace member; + # installing inside desktop/ cannot link the workspace siblings. - name: Install deps - working-directory: desktop + working-directory: nclaw run: pnpm install --frozen-lockfile + - name: Install Playwright browsers - working-directory: desktop + working-directory: nclaw/desktop run: pnpm exec playwright install --with-deps chromium + - name: Run E2E - working-directory: desktop + working-directory: nclaw/desktop run: pnpm e2e + - uses: actions/upload-artifact@v7 if: failure() with: name: playwright-report-${{ matrix.os }} - path: desktop/playwright-report/ + path: nclaw/desktop/playwright-report/