ado-sync 0.1.36 → 0.1.38

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/types.d.ts CHANGED
@@ -19,6 +19,23 @@ export interface SuiteCondition {
19
19
  */
20
20
  tags?: string;
21
21
  }
22
+ /**
23
+ * Routes a test case to a specific primary suite based on a tag expression.
24
+ * Evaluated in order; the first matching route wins.
25
+ * When no route matches, falls back to suiteId or plan root suite.
26
+ */
27
+ export interface SuiteRoute {
28
+ /**
29
+ * Tag expression filter (e.g. '@smoke', '@regression and not @wip').
30
+ * When omitted, this route acts as a catch-all default.
31
+ */
32
+ tags?: string;
33
+ /**
34
+ * Target suite: a suite name (created if absent) or a numeric suite ID.
35
+ * e.g. "Smoke Tests" or 12345
36
+ */
37
+ suite: string | number;
38
+ }
22
39
  export interface TestPlanEntry {
23
40
  id: number;
24
41
  suiteId?: number;
@@ -28,6 +45,26 @@ export interface TestPlanEntry {
28
45
  include?: string | string[];
29
46
  /** Override local.exclude for this plan */
30
47
  exclude?: string | string[];
48
+ /**
49
+ * Tag-condition-based primary suite routing for this plan entry.
50
+ * Routes are evaluated in order; the first match wins.
51
+ * Allows multiple suites under a single test plan without separate testPlans entries.
52
+ *
53
+ * Example:
54
+ * suiteRouting:
55
+ * - tags: "@smoke"
56
+ * suite: "Smoke Tests"
57
+ * - tags: "@regression"
58
+ * suite: "Regression"
59
+ * - suite: "All Tests" # catch-all
60
+ */
61
+ suiteRouting?: SuiteRoute[];
62
+ /**
63
+ * Additional condition-based suite assignment for this plan entry.
64
+ * Overrides sync.suiteConditions for this plan. TCs are added to each
65
+ * matching suite in addition to the primary suite.
66
+ */
67
+ suiteConditions?: SuiteCondition[];
31
68
  }
32
69
  export interface StateConfig {
33
70
  /** Set the TC State field to this value when the scenario has changed. e.g. "Design" */
@@ -189,13 +226,27 @@ export interface SyncConfig {
189
226
  suiteId?: number;
190
227
  /** 'flat' (default) or 'byFolder' to mirror folder structure as nested suites */
191
228
  suiteMapping?: 'flat' | 'byFolder';
229
+ /**
230
+ * Tag-condition-based primary suite routing.
231
+ * Routes are evaluated in order; the first match wins.
232
+ * Allows multiple suites under a single test plan.
233
+ *
234
+ * Example:
235
+ * suiteRouting:
236
+ * - tags: "@smoke"
237
+ * suite: "Smoke Tests"
238
+ * - tags: "@regression"
239
+ * suite: "Regression Suite"
240
+ * - suite: "All Tests" # catch-all default
241
+ */
242
+ suiteRouting?: SuiteRoute[];
192
243
  };
193
244
  /** Multi-plan mode: if present, overrides testPlan for each entry */
194
245
  testPlans?: TestPlanEntry[];
195
246
  /** Local spec sources */
196
247
  local: {
197
- /** 'gherkin' for .feature files, 'markdown' for .md, 'csharp' for MSTest/NUnit .cs, 'java' for JUnit/TestNG .java, 'python' for pytest .py, 'javascript' for Jest/Jasmine/WebdriverIO .js/.ts, 'playwright' for Playwright Test .spec.ts/.spec.js, 'puppeteer' for Puppeteer + Jest/Mocha .js/.ts, 'cypress' for Cypress .cy.js/.cy.ts, 'testcafe' for TestCafe .js/.ts, 'detox' for Detox (React Native) .js/.ts, 'espresso' for Android Espresso .java/.kt, 'xcuitest' for iOS XCUITest .swift, 'flutter' for Flutter/Dart _test.dart */
198
- type: 'gherkin' | 'markdown' | 'csv' | 'excel' | 'csharp' | 'java' | 'python' | 'javascript' | 'playwright' | 'puppeteer' | 'cypress' | 'testcafe' | 'detox' | 'espresso' | 'xcuitest' | 'flutter';
248
+ /** 'gherkin' for .feature files, 'reqnroll' for ReqNRoll .feature files (SpecFlow successor), 'markdown' for .md, 'csharp' for MSTest/NUnit .cs, 'java' for JUnit/TestNG .java, 'python' for pytest .py, 'javascript' for Jest/Jasmine/WebdriverIO .js/.ts, 'playwright' for Playwright Test .spec.ts/.spec.js, 'puppeteer' for Puppeteer + Jest/Mocha .js/.ts, 'cypress' for Cypress .cy.js/.cy.ts, 'testcafe' for TestCafe .js/.ts, 'detox' for Detox (React Native) .js/.ts, 'espresso' for Android Espresso .java/.kt, 'xcuitest' for iOS XCUITest .swift, 'flutter' for Flutter/Dart _test.dart */
249
+ type: 'gherkin' | 'reqnroll' | 'markdown' | 'csv' | 'excel' | 'csharp' | 'java' | 'python' | 'javascript' | 'playwright' | 'puppeteer' | 'cypress' | 'testcafe' | 'detox' | 'espresso' | 'xcuitest' | 'flutter';
199
250
  /** Glob pattern(s) relative to config file location */
200
251
  include: string | string[];
201
252
  /** Glob pattern(s) to exclude */
@@ -287,13 +338,20 @@ export interface SyncConfig {
287
338
  /**
288
339
  * For 'local': absolute path to a GGUF model file.
289
340
  * For 'ollama': model tag, e.g. 'qwen2.5-coder:7b'.
290
- * For 'openai'/'anthropic': model name, e.g. 'gpt-4o-mini'.
341
+ * For 'openai'/'anthropic': model name, e.g. 'gpt-4o-mini' or 'claude-sonnet-4-6'.
291
342
  */
292
343
  model?: string;
293
344
  /** Base URL for 'ollama' or an OpenAI-compatible endpoint. e.g. 'http://localhost:4000' */
294
345
  baseUrl?: string;
295
346
  /** API key for 'openai' or 'anthropic'. Supports $ENV_VAR references. */
296
347
  apiKey?: string;
348
+ /**
349
+ * When true, use AI to analyze test failure messages and generate a human-readable
350
+ * root cause summary. The summary is added as a comment on the Azure test result.
351
+ * Only applies when publishing test results. Requires a non-heuristic provider.
352
+ * Default: false.
353
+ */
354
+ analyzeFailures?: boolean;
297
355
  };
298
356
  };
299
357
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ado-sync",
3
- "version": "0.1.36",
3
+ "version": "0.1.38",
4
4
  "description": "Bidirectional sync between local test specs (Cucumber/Markdown) and Azure DevOps Test Cases",
5
5
  "bin": {
6
6
  "ado-sync": "./dist/cli.js"