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
693 changes: 344 additions & 349 deletions .github/workflows/main.yml

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion .powershell/docs/Get-DiscussionId.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -529,7 +529,7 @@ function Find-OrCreateDiscussion {
if (-not $docCategory) {
Write-ErrorLog "Documentation category '$GitHubDiscussionCategory' not found"
Write-InformationLog "Available categories: $($categories.name -join ', ')"
return $null
exit 1
}

# Generate documentation URL
Expand Down
3 changes: 3 additions & 0 deletions docs/content/docs/config/_index.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,7 @@ description: |
short_title: Configuration
weight: 50
date: 2025-06-24T12:07:31Z
discussionId: 2904

---

20 changes: 10 additions & 10 deletions docs/content/docs/config/config-wizard/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,20 +4,20 @@ short_title: Config Wizard
description: Build your Azure DevOps Migration Tools configuration with our interactive step-by-step wizard supporting three migration type architectures
weight: 50
date: 2025-06-26T12:00:00Z
discussionId:
discussionId: 2902
aliases:
- /config-wizard/
- /wizard/
- /configure/
- /config-wizard/
- /wizard/
- /configure/
layout: config-wizard
cascade:
- build:
list: never
render: never
target:
environment: production
---
- build:
list: never
render: never
target:
environment: production

---
Use this interactive wizard to build your Azure DevOps Migration Tools configuration. The wizard supports three primary migration types:

- **Work Items**: Standard work item migration with pre-configured TfsWorkItemEndpoint and TfsWorkItemMigrationProcessor
Expand Down
14 changes: 9 additions & 5 deletions docs/content/docs/config/schema/index.md
Original file line number Diff line number Diff line change
@@ -1,12 +1,16 @@
---
title: "JSON Schemas"
description: "JSON Schema definitions for Azure DevOps Migration Tools configuration"
title: JSON Schemas
description: JSON Schema definitions for Azure DevOps Migration Tools configuration
weight: 10
outputs: ["html", "schema-catalog"]
outputs:
- html
- schema-catalog
aliases:
- /schema/
---
- /schema/
date: 2025-07-23T09:41:21Z
discussionId: 2901

---
The Azure DevOps Migration Tools provide JSON Schema definitions for configuration validation and IDE support.

## Main Configuration Schema
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
---
title: Tfs WorkItemType Validator Processor
description: Validates Work Item Types against a set of rules. Does not migrate Work Items, only validates types.
dataFile: reference.processors.tfsworkitemtypevalidatorprocessor.yaml
slug: tfs-workitem-type-validator-processor
aliases:
- /docs/Reference/Processors/TfsWorkItemTypeValidatorProcessor
- /Reference/Processors/TfsWorkItemTypeValidatorProcessor
- /learn/azure-devops-migration-tools/Reference/Processors/TfsWorkItemTypeValidatorProcessor
- /learn/azure-devops-migration-tools/Reference/Processors/TfsWorkItemTypeValidatorProcessor/index.md
date: 2025-06-24T12:07:31Z
discussionId: 2905

---
{{< class-description >}}

## Options

{{< class-options >}}

## Samples

### Sample

{{< class-sample sample="sample" >}}

### Defaults

{{< class-sample sample="defaults" >}}

### Classic

{{< class-sample sample="classic" >}}

## Metadata

{{< class-metadata >}}

## Schema

{{< class-schema >}}
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
---
title: Tfs WorkItemType Validator Tool
description: Validates Work Item Types against a set of rules. Does not migrate Work Items, only validates types.
dataFile: reference.tools.tfsworkitemtypevalidatortool.yaml
schemaFile: schema.tools.tfsworkitemtypevalidatortool.json
slug: work-item-type-validator-tool
aliases:
- /docs/Reference/Tools/WorkItemTypeValidatorTool
- /Reference/Tools/WorkItemTypeValidatorTool
- /learn/azure-devops-migration-tools/Reference/Tools/WorkItemTypeValidatorTool
- /learn/azure-devops-migration-tools/Reference/Tools/WorkItemTypeMappingTool/index.md
date: 2025-06-24T12:07:31Z
discussionId: 2903

---
{{< class-description >}}

## Options

{{< class-options >}}

## Samples

### Sample

{{< class-sample sample="sample" >}}

### Defaults

{{< class-sample sample="defaults" >}}

### Classic

{{< class-sample sample="classic" >}}

## Metadata

{{< class-metadata >}}

## Schema

{{< class-schema >}}
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ configurationSamples:
"Enabled": false,
"WIQLQuery": "Select [System.Id] From WorkItems Where [System.TeamProject] = @project and not [System.WorkItemType] contains 'Test Suite, Test Plan,Shared Steps,Shared Parameter,Feedback Request'",
"TargetLinksToKeepOrganization": "https://dev.azure.com/nkdagility",
"TargetLinksToKeepProject": "10464ecf-816d-4fca-a547-81f230b9069a",
"TargetLinksToKeepProject": "916bd342-1db7-45e3-bef1-a370734362a4",
"CleanupFileName": "c:/temp/OutboundLinkTargets.bat",
"PrependCommand": "start",
"DryRun": true,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
optionsClassName: TfsWorkItemTypeValidatorProcessorOptions
optionsClassFullName: MigrationTools.Processors.TfsWorkItemTypeValidatorProcessorOptions
configurationSamples:
- name: defaults
order: 2
description:
code: There are no defaults! Check the sample for options!
sampleFor: MigrationTools.Processors.TfsWorkItemTypeValidatorProcessorOptions
- name: sample
order: 1
description:
code: There is no sample, but you can check the classic below for a general feel.
sampleFor: MigrationTools.Processors.TfsWorkItemTypeValidatorProcessorOptions
- name: classic
order: 3
description:
code: >-
{
"$type": "TfsWorkItemTypeValidatorProcessorOptions",
"Enabled": false,
"StopIfValidationFails": true,
"SourceName": null,
"TargetName": null
}
sampleFor: MigrationTools.Processors.TfsWorkItemTypeValidatorProcessorOptions
description: Work item type validation processor. Basically it just runs the to validate work item types. The validation is run always, even if the tool iself is disabled. Neither this processor, nor the tool do not perform any changes to the source or target system.
className: TfsWorkItemTypeValidatorProcessor
typeName: Processors
options:
- parameterName: Enabled
type: Boolean
description: If set to `true` then the processor will run. Set to `false` and the processor will not run.
defaultValue: missing XML code comments
- parameterName: SourceName
type: String
description: This is the `IEndpoint` that will be used as the source of the Migration. Can be null for a write only processor.
defaultValue: missing XML code comments
- parameterName: StopIfValidationFails
type: Boolean
description: If set to , migration process will stop if there are some validation errors. If set to , migration process will continue, for example to support some other validation processors. Default value is .
defaultValue: missing XML code comments
- parameterName: TargetName
type: String
description: This is the `IEndpoint` that will be used as the Target of the Migration. Can be null for a read only processor.
defaultValue: missing XML code comments
status: missing XML code comments
processingTarget: missing XML code comments
classFile: src/MigrationTools.Clients.TfsObjectModel/Processors/TfsWorkItemTypeValidatorProcessor.cs
optionsClassFile: src/MigrationTools.Clients.TfsObjectModel/Processors/TfsWorkItemTypeValidatorProcessorOptions.cs
1 change: 1 addition & 0 deletions docs/hugo.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ params:
keywords: "Azure DevOps, Migration Tools, DevOps, Migration"
og_image: "/images/og-image.jpg" # URL to the default Open Graph image
siteProdUrl: "https://devopsmigration.io"
sitePreviewUrl: "https://blue-river-093197403-preview.westeurope.5.azurestaticapps.net"
supportEmail: "[email protected]"
githubUrl: "https://github.com/nkdAgility/azure-devops-migration-tools"
editPage: "https://github.com/nkdAgility/azure-devops-migration-tools/tree/main/docs/content/"
Expand Down
106 changes: 106 additions & 0 deletions docs/layouts/_partials/components/menu-version.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
<script src="/js/version-loader.js"></script>
<!-- Document Versions dropdown -->
<div class="dropdown">
<button class="btn btn-outline-secondary btn-sm dropdown-toggle" type="button" id="versionsDropdown" data-bs-toggle="dropdown" aria-expanded="false" title="Documentation Versions">
<i class="fas fa-code-branch me-1"></i>
{{ hugo.Environment | title }}
</button>
<div class="dropdown-menu dropdown-menu-end" aria-labelledby="versionsDropdown" style="min-width: 300px;">
<h6 class="dropdown-header"><i class="fas fa-code-branch me-2"></i>Documentation Versions</h6>
<div class="dropdown-item-text">
{{/* Fetch GitHub releases */}}
{{ $releases := resources.GetRemote "https://api.github.com/repos/nkdAgility/azure-devops-migration-tools/releases" }}
{{ $releases = $releases | transform.Unmarshal }}
{{/* Get latest stable and prerelease versions */}}
{{ $latestRelease := index (where $releases "prerelease" false) 0 }}
{{ $latestPrerelease := index (where $releases "prerelease" true) 0 }}


<a href="{{ .Site.Params.siteProdUrl }}{{ if .RelPermalink }}{{ .RelPermalink }}{{ else }}/{{ end }}" target="_blank" class="text-decoration-none">
{{ if eq hugo.Environment "production" }}
<div class="d-flex align-items-center justify-content-between p-2 bg-success bg-opacity-25 border border-success rounded mb-2 dropdown-item-hover position-relative">
<span class="small fw-medium text-dark d-flex align-items-center">
<i class="fas fa-check-circle text-success me-2"></i>
Production
<span class="badge bg-success mx-2" style="font-size: 0.6rem;">CURRENT</span>
</span>
<span class="badge bg-primary text-white">{{ .Site.Params.version }}</span>
</div>
{{ else }}
<div class="d-flex align-items-center justify-content-between p-2 bg-light rounded mb-2 dropdown-item-hover">
<span class="small fw-medium text-dark">Production</span>
<span class="badge bg-primary text-white" id="version-production">{{ $latestRelease.tag_name }}</span>
</div>
<script>
// Load production version dynamically
document.addEventListener("DOMContentLoaded", async () => {
try {
const prodVersion = await getVersion("{{ .Site.Params.siteProdUrl }}/version.json");
const prodElement = document.getElementById("version-production");
if (prodElement) {
prodElement.textContent = prodVersion;
}
} catch (error) {
console.warn("Could not load production version, keeping fallback:", error.message);
// Fallback value from server-side rendering remains
}
});
</script>
{{ end }}
</a>
<a href="{{ .Site.Params.sitePreviewUrl }}{{ if .RelPermalink }}{{ .RelPermalink }}{{ else }}/{{ end }}" target="_blank" class="text-decoration-none">
{{ if eq hugo.Environment "preview" }}
<div class="d-flex align-items-center justify-content-between p-2 bg-success bg-opacity-25 border border-success rounded dropdown-item-hover position-relative">
<span class="small fw-medium text-dark d-flex align-items-center">
<i class="fas fa-check-circle text-success me-2"></i>
Preview
<span class="badge bg-success mx-2" style="font-size: 0.6rem;">CURRENT</span>
</span>
<span class="badge preview-badge">{{ .Site.Params.version }}</span>
</div>
{{ else }}
<div class="d-flex align-items-center justify-content-between p-2 bg-light rounded dropdown-item-hover">
<span class="small fw-medium text-dark">Preview</span>
<span class="badge preview-badge" id="version-preview">{{ $latestPrerelease.tag_name }}</span>
</div>
<script>
// Load preview version dynamically
document.addEventListener("DOMContentLoaded", async () => {
try {
const previewVersion = await getVersion("{{ .Site.Params.sitePreviewUrl }}/version.json");
const previewElement = document.getElementById("version-preview");
if (previewElement) {
previewElement.textContent = previewVersion;
}
} catch (error) {
console.warn("Could not load preview version, keeping fallback:", error.message);
// Fallback value from server-side rendering remains
}
});
</script>
{{ end }}
</a>
{{ if and (ne hugo.Environment "production") (ne hugo.Environment "preview") }}
<hr />
<a href="{{ if .RelPermalink }}{{ .RelPermalink }}{{ else }}/{{ end }}" target="_blank" class="text-decoration-none">
<div class="d-flex align-items-center justify-content-between p-2 bg-success bg-opacity-25 border border-success rounded mb-2 dropdown-item-hover position-relative">
<span class="small fw-medium text-dark d-flex align-items-center">
<i class="fas fa-check-circle text-success me-2"></i>
{{ hugo.Environment | title }}
<span class="badge bg-success mx-2" style="font-size: 0.6rem;">CURRENT</span>
</span>
{{ if ne hugo.Environment "development" }}
<span class="badge bg-danger ">{{ .Site.Params.version }}</span>
{{ else }}
{{ if .Page.GitInfo }}
<span class="badge bg-danger">v0.0.0-local.{{ .Page.GitInfo.AbbreviatedHash }}</span>
{{ else }}
<span class="badge bg-danger">v0.0.0-local.dev</span>
{{ end }}
{{ end }}
</div>
</a>
{{ end }}
</div>
</div>
</div>
Loading
Loading