ado-sync 0.1.65 → 0.1.68

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.
Files changed (67) hide show
  1. package/README.md +15 -15
  2. package/dist/__tests__/regressions.test.js +1133 -1
  3. package/dist/__tests__/regressions.test.js.map +1 -1
  4. package/dist/ai/summarizer.d.ts +2 -1
  5. package/dist/ai/summarizer.js +6 -1
  6. package/dist/ai/summarizer.js.map +1 -1
  7. package/dist/azure/test-cases.d.ts +11 -1
  8. package/dist/azure/test-cases.js +286 -43
  9. package/dist/azure/test-cases.js.map +1 -1
  10. package/dist/cli-diagnostics.d.ts +66 -0
  11. package/dist/cli-diagnostics.js +75 -0
  12. package/dist/cli-diagnostics.js.map +1 -0
  13. package/dist/cli.js +335 -23
  14. package/dist/cli.js.map +1 -1
  15. package/dist/config.js +194 -9
  16. package/dist/config.js.map +1 -1
  17. package/dist/extensions.d.ts +8 -0
  18. package/dist/extensions.js +86 -0
  19. package/dist/extensions.js.map +1 -0
  20. package/dist/id-markers.d.ts +1 -0
  21. package/dist/id-markers.js +13 -0
  22. package/dist/id-markers.js.map +1 -1
  23. package/dist/sync/cache.d.ts +2 -0
  24. package/dist/sync/cache.js.map +1 -1
  25. package/dist/sync/engine.d.ts +29 -2
  26. package/dist/sync/engine.js +270 -41
  27. package/dist/sync/engine.js.map +1 -1
  28. package/dist/sync/publish-results.d.ts +25 -0
  29. package/dist/sync/publish-results.js +81 -2
  30. package/dist/sync/publish-results.js.map +1 -1
  31. package/dist/types.d.ts +98 -2
  32. package/llms.txt +11 -11
  33. package/package.json +9 -1
  34. package/docs/advanced.md +0 -989
  35. package/docs/agent-setup.md +0 -204
  36. package/docs/capability-roadmap.md +0 -280
  37. package/docs/cli.md +0 -614
  38. package/docs/configuration.md +0 -322
  39. package/docs/examples/csharp-mstest-local-llm.yaml +0 -35
  40. package/docs/examples/csharp-mstest.yaml +0 -21
  41. package/docs/examples/csharp-nunit.yaml +0 -21
  42. package/docs/examples/csharp-specflow.yaml +0 -16
  43. package/docs/examples/cypress.yaml +0 -21
  44. package/docs/examples/detox-react-native.yaml +0 -21
  45. package/docs/examples/espresso-android.yaml +0 -21
  46. package/docs/examples/flutter-dart.yaml +0 -21
  47. package/docs/examples/java-junit.yaml +0 -21
  48. package/docs/examples/java-testng.yaml +0 -21
  49. package/docs/examples/js-jasmine-wdio.yaml +0 -21
  50. package/docs/examples/js-jest.yaml +0 -21
  51. package/docs/examples/playwright-js.yaml +0 -21
  52. package/docs/examples/playwright-ts.yaml +0 -21
  53. package/docs/examples/puppeteer.yaml +0 -21
  54. package/docs/examples/python-pytest.yaml +0 -21
  55. package/docs/examples/robot-framework.yaml +0 -19
  56. package/docs/examples/testcafe.yaml +0 -21
  57. package/docs/examples/xcuitest-ios.yaml +0 -21
  58. package/docs/mcp-server.md +0 -312
  59. package/docs/publish-test-results.md +0 -947
  60. package/docs/spec-formats.md +0 -1357
  61. package/docs/troubleshooting.md +0 -101
  62. package/docs/vscode-extension.md +0 -139
  63. package/docs/work-item-links.md +0 -115
  64. package/docs/workflows.md +0 -457
  65. package/mkdocs.yml +0 -40
  66. package/requirements-docs.txt +0 -4
  67. package/scripts/build_site.sh +0 -6
package/docs/workflows.md DELETED
@@ -1,457 +0,0 @@
1
- # Workflow Examples
2
-
3
- Framework-specific end-to-end examples for using `ado-sync push`, `pull`, and `publish-test-results`.
4
-
5
- ---
6
-
7
- ## Day-to-day
8
-
9
- ```bash
10
- # Local changes first — edit your files, then push
11
- ado-sync push
12
-
13
- # Azure changes first — someone edited a Test Case in the ADO UI
14
- ado-sync pull
15
-
16
- # Check for drift before raising a PR
17
- ado-sync status
18
- ```
19
-
20
- ---
21
-
22
- ## C# MSTest
23
-
24
- ```bash
25
- # 1. Create TCs and write IDs back into .cs files
26
- ado-sync push --dry-run # preview
27
- ado-sync push # writes [TestProperty("tc","ID")] above each [TestMethod]
28
-
29
- # 2. Run tests — TRX contains [TestProperty] values, TC IDs extracted automatically
30
- dotnet test --logger "trx;LogFileName=results.trx"
31
-
32
- # 3. Publish results
33
- ado-sync publish-test-results --testResult results/results.trx
34
- ```
35
-
36
- Recommended config:
37
- ```json
38
- {
39
- "orgUrl": "https://dev.azure.com/my-org",
40
- "project": "MyProject",
41
- "auth": { "type": "pat", "token": "$AZURE_DEVOPS_TOKEN" },
42
- "testPlan": { "id": 1234 },
43
- "local": {
44
- "type": "csharp",
45
- "include": ["**/RegressionTests/**/*.cs"],
46
- "exclude": ["**/*BaseTest.cs", "**/*Helper.cs"]
47
- },
48
- "sync": { "markAutomated": true, "format": { "useExpectedResult": true } }
49
- }
50
- ```
51
-
52
- ---
53
-
54
- ## C# NUnit
55
-
56
- ```bash
57
- ado-sync push
58
-
59
- # Use native NUnit XML logger — TRX omits [Property] values
60
- dotnet test --logger "nunit3;LogFileName=results.xml"
61
-
62
- ado-sync publish-test-results --testResult results/results.xml
63
- ```
64
-
65
- ---
66
-
67
- ## C# SpecFlow
68
-
69
- ```bash
70
- ado-sync push # writes @tc:ID above each Scenario
71
-
72
- dotnet test --logger "trx;LogFileName=results.trx"
73
- ado-sync publish-test-results --testResult results/results.trx
74
- ```
75
-
76
- Recommended config:
77
- ```json
78
- {
79
- "orgUrl": "https://dev.azure.com/my-org",
80
- "project": "MyProject",
81
- "auth": { "type": "pat", "token": "$AZURE_DEVOPS_TOKEN" },
82
- "testPlan": { "id": 1234 },
83
- "local": { "type": "gherkin", "include": ["Features/**/*.feature"] },
84
- "sync": { "tagPrefix": "tc", "markAutomated": true }
85
- }
86
- ```
87
-
88
- ---
89
-
90
- ## Java JUnit / TestNG
91
-
92
- ```bash
93
- ado-sync push # writes // @tc:ID (JUnit 4/TestNG) or @Tag("tc:ID") (JUnit 5)
94
-
95
- # Maven
96
- mvn test # Surefire: target/surefire-reports/*.xml
97
-
98
- # Gradle
99
- ./gradlew test # build/test-results/test/*.xml
100
-
101
- ado-sync publish-test-results \
102
- --testResult "target/surefire-reports/TEST-*.xml" \
103
- --testResultFormat junit
104
- ```
105
-
106
- Recommended config:
107
- ```json
108
- {
109
- "orgUrl": "https://dev.azure.com/my-org",
110
- "project": "MyProject",
111
- "auth": { "type": "pat", "token": "$AZURE_DEVOPS_TOKEN" },
112
- "testPlan": { "id": 1234 },
113
- "local": {
114
- "type": "java",
115
- "include": ["**/src/test/**/*.java"],
116
- "exclude": ["**/*BaseTest.java", "**/*Helper.java"]
117
- },
118
- "sync": { "markAutomated": true }
119
- }
120
- ```
121
-
122
- ---
123
-
124
- ## Python pytest
125
-
126
- ```bash
127
- ado-sync push # writes @pytest.mark.tc(ID) above each def test_*()
128
-
129
- pytest --junitxml=results/junit.xml
130
-
131
- ado-sync publish-test-results --testResult results/junit.xml --testResultFormat junit
132
- ```
133
-
134
- **Optional — embed TC IDs directly into JUnit XML** (more reliable than AutomatedTestName matching):
135
-
136
- Add to `conftest.py`:
137
- ```python
138
- def pytest_runtest_makereport(item, call):
139
- for marker in item.iter_markers("tc"):
140
- if marker.args:
141
- item.user_properties.append(("tc", str(marker.args[0])))
142
- ```
143
-
144
- Recommended config:
145
- ```json
146
- {
147
- "orgUrl": "https://dev.azure.com/my-org",
148
- "project": "MyProject",
149
- "auth": { "type": "pat", "token": "$AZURE_DEVOPS_TOKEN" },
150
- "testPlan": { "id": 1234 },
151
- "local": {
152
- "type": "python",
153
- "include": ["tests/**/*.py"],
154
- "exclude": ["tests/conftest.py", "tests/**/helpers.py"]
155
- },
156
- "sync": { "markAutomated": true }
157
- }
158
- ```
159
-
160
- ---
161
-
162
- ## JavaScript / TypeScript (Jest, Jasmine, WebdriverIO)
163
-
164
- ```bash
165
- ado-sync push # writes // @tc:ID above each it() / test()
166
-
167
- npx jest --reporters=default --reporters=jest-junit
168
- # JEST_JUNIT_OUTPUT_DIR=results JEST_JUNIT_OUTPUT_NAME=junit.xml
169
-
170
- ado-sync publish-test-results --testResult results/junit.xml --testResultFormat junit
171
- ```
172
-
173
- Recommended config:
174
- ```json
175
- {
176
- "orgUrl": "https://dev.azure.com/my-org",
177
- "project": "MyProject",
178
- "auth": { "type": "pat", "token": "$AZURE_DEVOPS_TOKEN" },
179
- "testPlan": { "id": 1234 },
180
- "local": {
181
- "type": "javascript",
182
- "include": ["src/**/*.spec.ts", "tests/**/*.test.js"],
183
- "exclude": ["**/*.helper.ts"]
184
- },
185
- "sync": { "markAutomated": true }
186
- }
187
- ```
188
-
189
- ---
190
-
191
- ## Playwright
192
-
193
- ```bash
194
- ado-sync push # writes annotation: { type: 'tc', description: 'ID' } into test options
195
-
196
- # playwright.config.ts: reporter: [['json', { outputFile: 'results/playwright.json' }]]
197
- npx playwright test
198
-
199
- # TC IDs from native test.annotations; screenshots/videos from attachments[]
200
- ado-sync publish-test-results \
201
- --testResult results/playwright.json \
202
- --attachmentsFolder test-results/
203
- ```
204
-
205
- Recommended config:
206
- ```json
207
- {
208
- "orgUrl": "https://dev.azure.com/my-org",
209
- "project": "MyProject",
210
- "auth": { "type": "pat", "token": "$AZURE_DEVOPS_TOKEN" },
211
- "testPlan": { "id": 1234 },
212
- "local": {
213
- "type": "playwright",
214
- "include": ["tests/**/*.spec.ts"],
215
- "exclude": ["**/*.helper.ts"]
216
- },
217
- "sync": { "markAutomated": true }
218
- }
219
- ```
220
-
221
- ---
222
-
223
- ## Detox (React Native)
224
-
225
- ```bash
226
- ado-sync push # writes // @tc:ID above each it() / test()
227
-
228
- npx detox test --configuration ios.sim.release
229
-
230
- ado-sync publish-test-results --testResult results/junit.xml --testResultFormat junit
231
- ```
232
-
233
- Recommended config:
234
- ```json
235
- {
236
- "orgUrl": "https://dev.azure.com/my-org",
237
- "project": "MyProject",
238
- "auth": { "type": "pat", "token": "$AZURE_DEVOPS_TOKEN" },
239
- "testPlan": { "id": 1234 },
240
- "local": { "type": "detox", "include": ["e2e/**/*.test.ts"] },
241
- "sync": { "markAutomated": true }
242
- }
243
- ```
244
-
245
- ---
246
-
247
- ## Espresso (Android)
248
-
249
- ```bash
250
- ado-sync push # writes // @tc:ID above @Test
251
-
252
- ./gradlew connectedAndroidTest
253
- # XML: app/build/outputs/androidTest-results/connected/TEST-*.xml
254
-
255
- ado-sync publish-test-results \
256
- --testResult "app/build/outputs/androidTest-results/connected/TEST-*.xml" \
257
- --testResultFormat junit
258
- ```
259
-
260
- Recommended config:
261
- ```json
262
- {
263
- "orgUrl": "https://dev.azure.com/my-org",
264
- "project": "MyProject",
265
- "auth": { "type": "pat", "token": "$AZURE_DEVOPS_TOKEN" },
266
- "testPlan": { "id": 1234 },
267
- "local": {
268
- "type": "espresso",
269
- "include": ["app/src/androidTest/**/*.java", "app/src/androidTest/**/*.kt"],
270
- "exclude": ["**/*BaseTest.java"]
271
- },
272
- "sync": { "markAutomated": true }
273
- }
274
- ```
275
-
276
- ---
277
-
278
- ## XCUITest (iOS)
279
-
280
- ```bash
281
- ado-sync push # writes // @tc:ID above func test*()
282
-
283
- xcodebuild test \
284
- -project MyApp.xcodeproj -scheme MyApp \
285
- -destination 'platform=iOS Simulator,name=iPhone 15' \
286
- -resultBundlePath TestResults.xcresult
287
- xcrun xcresulttool get --path TestResults.xcresult --format junit > results/junit.xml
288
-
289
- ado-sync publish-test-results --testResult results/junit.xml --testResultFormat junit
290
- ```
291
-
292
- Recommended config:
293
- ```json
294
- {
295
- "orgUrl": "https://dev.azure.com/my-org",
296
- "project": "MyProject",
297
- "auth": { "type": "pat", "token": "$AZURE_DEVOPS_TOKEN" },
298
- "testPlan": { "id": 1234 },
299
- "local": {
300
- "type": "xcuitest",
301
- "include": ["UITests/**/*.swift"],
302
- "exclude": ["UITests/**/*Helper.swift", "UITests/**/*Base.swift"]
303
- },
304
- "sync": { "markAutomated": true }
305
- }
306
- ```
307
-
308
- ---
309
-
310
- ## Flutter
311
-
312
- ```bash
313
- ado-sync push # writes // @tc:ID above testWidgets() / test()
314
-
315
- flutter test --reporter junit > results/junit.xml
316
-
317
- ado-sync publish-test-results --testResult results/junit.xml --testResultFormat junit
318
- ```
319
-
320
- Recommended config:
321
- ```json
322
- {
323
- "orgUrl": "https://dev.azure.com/my-org",
324
- "project": "MyProject",
325
- "auth": { "type": "pat", "token": "$AZURE_DEVOPS_TOKEN" },
326
- "testPlan": { "id": 1234 },
327
- "local": {
328
- "type": "flutter",
329
- "include": ["test/**/*_test.dart", "integration_test/**/*_test.dart"]
330
- },
331
- "sync": { "markAutomated": true }
332
- }
333
- ```
334
-
335
- ---
336
-
337
- ## Robot Framework
338
-
339
- ```bash
340
- ado-sync push # inserts/updates tc:ID in [Tags] of each test case
341
-
342
- robot --outputdir results tests/
343
-
344
- ado-sync publish-test-results --testResult results/output.xml
345
- ```
346
-
347
- TC IDs are read directly from the `tc:N` tag in `<tags>` in `output.xml` — no extra config needed.
348
-
349
- Recommended config:
350
- ```json
351
- {
352
- "orgUrl": "https://dev.azure.com/my-org",
353
- "project": "MyProject",
354
- "auth": { "type": "pat", "token": "$AZURE_DEVOPS_TOKEN" },
355
- "testPlan": { "id": 1234 },
356
- "local": {
357
- "type": "robot",
358
- "include": ["tests/**/*.robot"],
359
- "exclude": ["tests/resources/**"]
360
- },
361
- "sync": { "markAutomated": true }
362
- }
363
- ```
364
-
365
- ---
366
-
367
- ## CI pipeline (GitHub Actions)
368
-
369
- ### Basic push + publish
370
-
371
- ```yaml
372
- - name: Sync test cases to Azure DevOps
373
- run: ado-sync push --config-override sync.disableLocalChanges=true
374
- env:
375
- AZURE_DEVOPS_TOKEN: ${{ secrets.AZURE_DEVOPS_TOKEN }}
376
-
377
- - name: Publish test results
378
- run: ado-sync publish-test-results --testResult results/test.trx
379
- env:
380
- AZURE_DEVOPS_TOKEN: ${{ secrets.AZURE_DEVOPS_TOKEN }}
381
- ```
382
-
383
- Use `sync.disableLocalChanges=true` in CI so the pipeline never commits ID writeback files.
384
-
385
- ---
386
-
387
- ### PR comment bot
388
-
389
- Copy [`.github/workflows/ado-sync-pr-check.yml`](../.github/workflows/ado-sync-pr-check.yml) into your repo. On every pull request it runs `ado-sync push --dry-run` and posts a comment showing:
390
-
391
- - Unlinked specs that would be created in Azure DevOps
392
- - Specs with drift vs. existing Test Cases
393
- - Conflicts where both local and remote changed
394
-
395
- Requires one secret: `ADO_PAT` (Azure DevOps PAT with Test Management read/write).
396
-
397
- ---
398
-
399
- ### Coverage gate + AC gate
400
-
401
- Copy [`.github/workflows/ado-sync-coverage-gate.yml`](../.github/workflows/ado-sync-coverage-gate.yml) into your repo. Runs three checks on push/PR to main:
402
-
403
- ```
404
- Step 1 — Spec coverage gate
405
- ado-sync coverage --fail-below 80
406
- Fails if fewer than 80% of local specs are linked to Azure Test Cases.
407
-
408
- Step 2 — Acceptance criteria gate
409
- ado-sync ac-gate --area-path "..."
410
- Fails if any Active/Resolved story is missing AC or linked Test Cases.
411
-
412
- Step 3 — Trend report (informational)
413
- ado-sync trend --days 30
414
- Optionally posts a Slack/Teams webhook summary. Never fails the build.
415
- ```
416
-
417
- Configure via GitHub repository variables (no code changes needed):
418
-
419
- | Variable | Description | Default |
420
- |----------|-------------|---------|
421
- | `ADO_SYNC_COVERAGE_MIN` | Minimum spec link rate % | `80` |
422
- | `ADO_SYNC_AC_AREA_PATH` | Area path scope for AC gate | *(all stories)* |
423
- | `ADO_SYNC_TREND_DAYS` | Days of history for trend report | `30` |
424
- | `ADO_SYNC_TREND_WEBHOOK` | Slack/Teams webhook URL | *(none)* |
425
- | `ADO_SYNC_TREND_WEBHOOK_TYPE` | `slack`, `teams`, or `generic` | `slack` |
426
-
427
- ---
428
-
429
- ### Stale TC cleanup in CI
430
-
431
- To periodically retire stale Azure Test Cases (TCs that no longer have a local spec):
432
-
433
- ```yaml
434
- - name: Retire stale test cases
435
- run: ado-sync stale --retire --dry-run # remove --dry-run to apply
436
- env:
437
- AZURE_DEVOPS_TOKEN: ${{ secrets.AZURE_DEVOPS_TOKEN }}
438
- ```
439
-
440
- This transitions orphaned TCs to `Closed` state and tags them `ado-sync:retired`. Use `--retire-state "Inactive"` if your process uses a different state name.
441
-
442
- ---
443
-
444
- ### Flaky test detection in CI
445
-
446
- ```yaml
447
- - name: Detect flaky tests
448
- run: |
449
- ado-sync trend \
450
- --days 14 \
451
- --fail-on-flaky \
452
- --webhook-url ${{ secrets.SLACK_WEBHOOK }}
453
- env:
454
- AZURE_DEVOPS_TOKEN: ${{ secrets.AZURE_DEVOPS_TOKEN }}
455
- ```
456
-
457
- Exits 1 if any test both passed and failed in the last 14 days, and posts a summary to Slack. Drop `--fail-on-flaky` to run as informational-only.
package/mkdocs.yml DELETED
@@ -1,40 +0,0 @@
1
- site_name: ADO Sync Documentation
2
- site_description: Documentation for syncing Azure DevOps test results.
3
- repo_name: PavanMudigonda/ado-sync
4
- repo_url: https://github.com/PavanMudigonda/ado-sync
5
-
6
- theme:
7
- name: material
8
- palette:
9
- primary: indigo
10
- accent: deep purple
11
-
12
- docs_dir: docs
13
-
14
- nav:
15
- - Welcome: index.md
16
- - CLI: cli.md
17
- - Configuration: configuration.md
18
- - Capability Roadmap: capability-roadmap.md
19
- - Agent Setup: agent-setup.md
20
- - MCP Server: mcp-server.md
21
- - Work Item Links: work-item-links.md
22
- - Workflows: workflows.md
23
- - Publish Test Results: publish-test-results.md
24
- - Spec Formats: spec-formats.md
25
- - VS Code Extension: vscode-extension.md
26
- - Troubleshooting: troubleshooting.md
27
- - Advanced: advanced.md
28
- - Examples:
29
- - C#: examples/csharp-mstest.yaml
30
- - Cypress: examples/cypress.yaml
31
- - Playwright: examples/playwright-js.yaml
32
- - Python: examples/python-pytest.yaml
33
- - Java: examples/java-junit.yaml
34
-
35
- markdown_extensions:
36
- - pymdownx.highlight:
37
- anchor_linenums: true
38
- - pymdownx.inlinehilite
39
- - pymdownx.snippets
40
- - pymdownx.superfences
@@ -1,4 +0,0 @@
1
- mkdocs-material>=9.5.0
2
- mkdocs>=1.5.0
3
- mkdocs-minify-plugin
4
- pymdown-extensions
@@ -1,6 +0,0 @@
1
- #!/bin/bash
2
- set -eo pipefail
3
-
4
- echo "Building site..."
5
- # Copy root README.md to docs/index.md to be the welcome page
6
- cp README.md docs/index.md