Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

### Fixed

- **Transformers.js integration tests now skip on Windows CI instead of flaking.** `transformers-embedding-provider.integration.test.ts` and the Transformers.js block of `comparison.integration.test.ts` skip on Windows (in addition to skipping when the optional `@xenova/transformers` dependency is absent), matching the existing `onnx-embedding-provider` test. These tests download a model over the network and load the `onnxruntime-node` native backend — both flaky in Windows CI. Such a failure was previously mislabeled `@xenova/transformers is not installed` by an over-broad `catch` in the provider's `loadPipeline` (the package was installed; the model download/inference is what failed), which is also why an availability-only guard did not prevent it.
- **Config-first skill discovery now honors `..` in `skills.include` patterns.** `vat build`, `vat verify`, and `vat skills validate` all funnel through `discoverSkillsFromConfig`, which previously passed every include pattern to a single downward-only crawl rooted at `projectRoot` — so an include like `"../../docs/skills/*/SKILL.md"` (common in monorepos where SKILL.md sources live alongside, not inside, the package) silently matched zero skills. `vat audit` accepted the same config only because it has a separate filesystem-first walker. Each include pattern is now split into a literal base + glob remainder via `picomatch.scan`, patterns are grouped by their resolved absolute base, and the crawler runs once per base — making config-first discovery agree with audit. User-supplied excludes stay anchored to `projectRoot` so patterns like `docs/private/**` keep their original meaning, and a pattern resolving to a nonexistent base now silently produces zero matches.

## [0.1.38] - 2026-05-18
Expand Down
5 changes: 4 additions & 1 deletion packages/rag/test/integration/comparison.integration.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,10 @@ const isWindows = process.platform === 'win32';
// Transformers.js Provider Comparison
// ---------------------------------------------------------------------------

describe.skipIf(!transformersAvailable)('Transformers.js Provider Comparison', () => {
// Skip on Windows too: the transformers.js backend (onnxruntime-node native
// binaries) + network model download are flaky in Windows CI, matching the ONNX
// provider block below.
describe.skipIf(!transformersAvailable || isWindows)('Transformers.js Provider Comparison', () => {
// Lazy import to avoid errors when @xenova/transformers is not installed
const getProvider = async () => {
const mod = await import('../../src/embedding-providers/transformers-embedding-provider.js');
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,11 @@
*
* Note: These are integration tests that use real transformers.js models.
* They may download models on first run (~20MB for all-MiniLM-L6-v2).
*
* Skipped when:
* - @xenova/transformers is not installed (it is an optional dependency)
* - Running on Windows (the onnxruntime-node native backend + network model
* download are flaky in CI — same reason the onnx provider test skips Windows)
*/

import { describe, it, expect } from 'vitest';
Expand All @@ -11,9 +16,21 @@ import { TransformersEmbeddingProvider } from '../../src/embedding-providers/tra

import { assertBatchEmbedding } from './embedding-test-helpers.js';

// Detect optional dependency availability.
let transformersAvailable = false;
try {
await import('@xenova/transformers');
transformersAvailable = true;
} catch {
// @xenova/transformers not installed
}

const isWindows = process.platform === 'win32';
const skipTransformers = !transformersAvailable || isWindows;

const DEFAULT_MODEL = 'Xenova/all-MiniLM-L6-v2';

describe('TransformersEmbeddingProvider', () => {
describe.skipIf(skipTransformers)('TransformersEmbeddingProvider', () => {
// Use default model for tests
const provider = new TransformersEmbeddingProvider();

Expand Down Expand Up @@ -106,7 +123,7 @@ describe('TransformersEmbeddingProvider', () => {
});
});

describe('TransformersEmbeddingProvider - Custom Model', () => {
describe.skipIf(skipTransformers)('TransformersEmbeddingProvider - Custom Model', () => {
it('should support custom model configuration', async () => {
const provider = new TransformersEmbeddingProvider({
model: DEFAULT_MODEL,
Expand Down
Loading