From 6c82c5447003e825fc9e6b81ec5dc0a2e51030ee Mon Sep 17 00:00:00 2001 From: agent_vscode Date: Sat, 4 Jul 2026 22:33:06 +0300 Subject: [PATCH 1/3] test(mcp): expect Obsidian '> [!info]' callout export in e2e (#333 canon) PR #333 deliberately changed the canonical markdown export of callout nodes to the Obsidian-native format ('> [!type]' + blockquote body, pinned by packages/prosemirror-markdown unit tests); the importer still parses both ':::type' fences and '> [!type]'. The get_page e2e assertion was missed in that switch and still expected ':::info', failing the e2e-mcp job on develop since 4369bbc5. Co-Authored-By: Claude Fable 5 --- packages/mcp/test-e2e.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/mcp/test-e2e.mjs b/packages/mcp/test-e2e.mjs index 6fa6192b..71cb8819 100644 --- a/packages/mcp/test-e2e.mjs +++ b/packages/mcp/test-e2e.mjs @@ -450,7 +450,7 @@ async function main() { // 8. get_page markdown round-trip sanity (table separator present) const md = await client.getPage(pageId); check("get_page md: table separator emitted", md.data.content.includes("| --- |"), ""); - check("get_page md: callout exported as :::", md.data.content.includes(":::info")); + check("get_page md: callout exported as Obsidian '> [!info]'", md.data.content.includes("> [!info]")); // 9. comments: create / list / reply / update / check_new / delete const beforeComments = new Date(Date.now() - 1000).toISOString(); -- 2.52.0 From 7bf1c91a95106ae5c95061478dbf5fe2e0210a04 Mon Sep 17 00:00:00 2001 From: agent_vscode Date: Sat, 4 Jul 2026 22:33:06 +0300 Subject: [PATCH 2/3] ci(develop): gate the :develop image build on e2e suites Reverse the previous policy where e2e jobs only turned the run red without blocking the image publish: build.needs now lists test, e2e-server and e2e-mcp, so a failing test of any kind stops the :develop image from being built and pushed. Stale policy comments updated accordingly. Co-Authored-By: Claude Fable 5 --- .github/workflows/develop.yml | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/.github/workflows/develop.yml b/.github/workflows/develop.yml index 8f6dce1f..e22f9756 100644 --- a/.github/workflows/develop.yml +++ b/.github/workflows/develop.yml @@ -18,12 +18,13 @@ env: IMAGE: ghcr.io/vvzvlad/gitmost jobs: - # Run the reusable test suite first so a failing test blocks the image build. + # Run the reusable test suite first so a failing test blocks the image build + # (the e2e jobs below gate the build as well). test: uses: ./.github/workflows/test.yml build: - needs: test + needs: [test, e2e-server, e2e-mcp] runs-on: ubuntu-latest timeout-minutes: 30 steps: @@ -59,11 +60,8 @@ jobs: cache-from: type=gha,scope=develop-amd64 cache-to: type=gha,scope=develop-amd64,mode=max,ignore-error=true - # e2e jobs run on every develop push but DO NOT gate the build/publish above: - # `build` stays `needs: test` only, so the :develop image still ships even if - # e2e fails. A failing e2e job turns the run red and triggers GitHub's email - # to the pusher — that red run + email is the intended notification, not a - # deploy block. + # e2e jobs gate the build: the :develop image is built and pushed only when + # unit tests AND both e2e suites pass (build.needs lists all three). e2e-server: runs-on: ubuntu-latest # Hard cap: the full-AppModule e2e leaks open handles and hung jest to the 6h max. @@ -124,9 +122,7 @@ jobs: - name: Run server e2e run: pnpm --filter ./apps/server test:e2e - # Same rationale as e2e-server: this job is intentionally NOT in - # `build.needs`. Deploy of the :develop image must not be blocked by e2e; - # a red run plus GitHub's email to the pusher is the notification mechanism. + # Gates the build too — see the comment above e2e-server. e2e-mcp: runs-on: ubuntu-latest timeout-minutes: 20 -- 2.52.0 From 4bd579f7f61ba8a567f8efa1da04d4c845000cac Mon Sep 17 00:00:00 2001 From: agent_vscode Date: Sat, 4 Jul 2026 22:41:25 +0300 Subject: [PATCH 3/3] ci(develop): build image in parallel with tests, gate only the publish MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Two-phase scheme instead of the sequential gate: the build job runs in parallel with test/e2e jobs and only warms the buildx GHA cache (push:false, cache-to mode=max); a new publish job (needs: test, e2e-server, e2e-mcp, build) rebuilds from the warm cache (near-instant on hit, full rebuild on eviction — same as the old sequential timing) and pushes :develop. GHCR login moved to publish; build-args blocks are kept textually identical between the two jobs so the cache hits. Co-Authored-By: Claude Fable 5 --- .github/workflows/develop.yml | 49 ++++++++++++++++++++++++++++++----- 1 file changed, 42 insertions(+), 7 deletions(-) diff --git a/.github/workflows/develop.yml b/.github/workflows/develop.yml index e22f9756..d61bd006 100644 --- a/.github/workflows/develop.yml +++ b/.github/workflows/develop.yml @@ -18,13 +18,48 @@ env: IMAGE: ghcr.io/vvzvlad/gitmost jobs: - # Run the reusable test suite first so a failing test blocks the image build - # (the e2e jobs below gate the build as well). + # Run the reusable test suite. Together with the e2e jobs below it gates the + # publish job (the image push), not the build itself — build runs in parallel. test: uses: ./.github/workflows/test.yml + # Runs in parallel with the test/e2e jobs and only warms the buildx cache + # (GHA cache, scope develop-amd64). No push happens here — the publish job + # below is the only one that pushes the image. build: - needs: [test, e2e-server, e2e-mcp] + runs-on: ubuntu-latest + timeout-minutes: 30 + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Resolve version + id: version + run: echo "value=$(git describe --tags --always)" >> "$GITHUB_OUTPUT" + + - name: Build develop image (warm cache, no push) + uses: docker/build-push-action@v6 + with: + context: . + platforms: linux/amd64 + build-args: | + APP_VERSION=${{ steps.version.outputs.value }} + AI_AGENT_ROLES_CATALOG_URL=https://raw.githubusercontent.com/vvzvlad/gitmost/develop/agent-roles-catalog + push: false + cache-from: type=gha,scope=develop-amd64 + cache-to: type=gha,scope=develop-amd64,mode=max,ignore-error=true + + # The gate: rebuilds from the cache the build job just wrote (near-instant on + # a cache hit; worst case — cache eviction — a full rebuild, which matches the + # old sequential timing) and pushes :develop only when unit tests AND both + # e2e suites AND the build are green. + publish: + needs: [test, e2e-server, e2e-mcp, build] runs-on: ubuntu-latest timeout-minutes: 30 steps: @@ -58,10 +93,10 @@ jobs: push: true tags: ${{ env.IMAGE }}:develop cache-from: type=gha,scope=develop-amd64 - cache-to: type=gha,scope=develop-amd64,mode=max,ignore-error=true - # e2e jobs gate the build: the :develop image is built and pushed only when - # unit tests AND both e2e suites pass (build.needs lists all three). + # e2e jobs gate the publish (image push), not the build: the :develop image + # is pushed only when unit tests AND both e2e suites pass (publish.needs + # lists them all). e2e-server: runs-on: ubuntu-latest # Hard cap: the full-AppModule e2e leaks open handles and hung jest to the 6h max. @@ -122,7 +157,7 @@ jobs: - name: Run server e2e run: pnpm --filter ./apps/server test:e2e - # Gates the build too — see the comment above e2e-server. + # Gates the publish too — see the comment above e2e-server. e2e-mcp: runs-on: ubuntu-latest timeout-minutes: 20 -- 2.52.0