{"id":32037405,"url":"https://github.com/thgossler/azdo-wi-creator","last_synced_at":"2026-01-24T02:07:44.145Z","repository":{"id":318563218,"uuid":"1071806021","full_name":"thgossler/azdo-wi-creator","owner":"thgossler","description":"A CLI tool for creating Azure DevOps work items from JSON specs.","archived":false,"fork":false,"pushed_at":"2025-10-08T22:16:49.000Z","size":98,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-10-28T23:59:00.366Z","etag":null,"topics":["azure-devops","create","dotnet","workitem"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/thgossler.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-10-07T20:51:30.000Z","updated_at":"2025-10-09T06:11:47.000Z","dependencies_parsed_at":"2025-10-07T23:35:23.674Z","dependency_job_id":null,"html_url":"https://github.com/thgossler/azdo-wi-creator","commit_stats":null,"previous_names":["thgossler/azdo-wi-creator"],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/thgossler/azdo-wi-creator","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thgossler%2Fazdo-wi-creator","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thgossler%2Fazdo-wi-creator/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thgossler%2Fazdo-wi-creator/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thgossler%2Fazdo-wi-creator/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/thgossler","download_url":"https://codeload.github.com/thgossler/azdo-wi-creator/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thgossler%2Fazdo-wi-creator/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28707448,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-23T23:51:44.727Z","status":"online","status_checked_at":"2026-01-24T02:00:06.909Z","response_time":89,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["azure-devops","create","dotnet","workitem"],"created_at":"2025-10-17T09:01:19.401Z","updated_at":"2026-01-24T02:07:44.139Z","avatar_url":"https://github.com/thgossler.png","language":"C#","funding_links":["https://www.paypal.com/donate/?hosted_button_id=JVG7PFJ8DMW7J","https://github.com/sponsors/thgossler"],"categories":[],"sub_categories":[],"readme":"\u003c!-- PROJECT LOGO --\u003e\n\u003cdiv align=\"center\"\u003e\n  \u003ch1 align=\"center\"\u003eAzure DevOps Work Item Creator\u003c/h1\u003e\n  \u003cp align=\"center\"\u003eA command-line tool for creating and managing Azure DevOps work items in bulk from JSON specification files.\u003c/p\u003e\n\u003c/div\u003e\n\n\u003c!-- SHIELDS --\u003e\n\u003cdiv align=\"center\"\u003e\n\n[![Contributors][contributors-shield]][contributors-url]\n[![Forks][forks-shield]][forks-url]\n[![Stargazers][stars-shield]][stars-url]\n[![Issues][issues-shield]][issues-url]\n[![MIT License][license-shield]][license-url]\n\n\u003c/div\u003e\n\n## Features\n\n- ✅ Create or update multiple work items from JSON specifications\n- ✅ Support for multiple area paths (creates one work item per area path)\n- ✅ Support for multiple projects in a single spec file\n- ✅ Short field name support (use \"Title\" instead of \"System.Title\")\n- ✅ Automatic markdown-to-HTML conversion for rich text fields\n- ✅ Automatic tagging with `azdo-wi-creator` for tracking\n- ✅ Smart spec file resolution (local paths, URLs, or simple names)\n- ✅ Support for comments in JSON spec files (single-line `//` and multi-line `/* */`)\n- ✅ Simulation mode (dry-run) to preview changes\n- ✅ Work item protection (prevents accidental updates of non-tool-created items)\n- ✅ List all work items created by the tool\n- ✅ Cross-platform support (Windows, Linux, macOS - x64 and ARM64)\n- ✅ Self-contained single-file executable\n\n## Installation\n\nDownload the pre-built executable for your platform from the [Releases](../../releases) page.\n\nOr build from source:\n\n\u003e Prerequisites:\n\u003e - Installed .NET 10 SDK ([Download .NET 10 SDK](https://dotnet.microsoft.com/en-us/download/dotnet/10.0))\n\n```bash\ngit clone https://github.com/thgossler/azdo-wi-creator.git\ncd azdo-wi-creator\ndotnet publish -c Release\n```\n\n## Authentication\n\nThe tool supports multiple authentication methods in priority order:\n\n1. **Force Interactive Sign-in**: Use the `--interactive-signin` flag to force browser-based authentication (ignores PAT and environment variable)\n   ```bash\n   azdo-wi-creator create -o \"https://dev.azure.com/myorg\" -p \"MyProject\" -t \"Bug\" -s \"feature\" --interactive-signin\n   ```\n\n2. **Command-line PAT option**: Use the `--pat` option to provide a Personal Access Token directly\n   ```bash\n   azdo-wi-creator create -o \"https://dev.azure.com/myorg\" -p \"MyProject\" -t \"Bug\" -s \"feature\" --pat \"your-pat-token\"\n   ```\n\n3. **Environment Variable**: Set the `AZURE_DEVOPS_PAT` environment variable\n   ```bash\n   export AZURE_DEVOPS_PAT=\"your-pat-token\"\n   azdo-wi-creator create -o \"https://dev.azure.com/myorg\" -p \"MyProject\" -t \"Bug\" -s \"feature\"\n   ```\n\n4. **Interactive Browser Sign-in** (default): If no PAT is provided, the tool will open a browser for you to sign in interactively (OAuth)\n   ```bash\n   # No PAT needed - browser will open for authentication\n   azdo-wi-creator create -o \"https://dev.azure.com/myorg\" -p \"MyProject\" -t \"Bug\" -s \"feature\"\n   ```\n\n**Creating a PAT:**\n1. Go to Azure DevOps → User Settings → Personal Access Tokens\n2. Create a new token with **Work Items (Read, Write)** scope\n3. Copy the token and use it with `--pat` option or set as environment variable\n\n## Usage\n\n### Create/Update Work Items\n\n```bash\nazdo-wi-creator create \\\n  --organization \"https://dev.azure.com/myorg\" \\\n  --project \"MyProject\" \\\n  --type \"Bug\" \\\n  --spec \"feature-spec.json\"\n```\n\n**Note**: The `--project` option is now optional if you specify the project in your spec file. See [Multi-Project Support](#multi-project-support) below.\n\n**Short form:**\n```bash\nazdo-wi-creator create -o \"https://dev.azure.com/myorg\" -p \"MyProject\" -t \"Bug\" -s \"feature\"\n```\n\n**With PAT token:**\n```bash\nazdo-wi-creator create -o \"https://dev.azure.com/myorg\" -p \"MyProject\" -t \"Bug\" -s \"feature\" --pat \"your-pat-token\"\n```\n\n**Force interactive sign-in** (ignores PAT and environment variable):\n```bash\nazdo-wi-creator create -o \"https://dev.azure.com/myorg\" -p \"MyProject\" -t \"Bug\" -s \"feature\" --interactive-signin\n```\n\n**Default command** (can omit \"create\"):\n```bash\nazdo-wi-creator -o \"https://dev.azure.com/myorg\" -p \"MyProject\" -t \"Bug\" -s \"feature\"\n```\n\n### Simulation Mode (Dry-Run)\n\nPreview what would be created without making any changes:\n\n```bash\nazdo-wi-creator create -o \"https://dev.azure.com/myorg\" -p \"MyProject\" -t \"Bug\" -s \"feature\" --simulate\n```\n\n### List Work Items Created by Tool\n\n```bash\nazdo-wi-creator list -o \"https://dev.azure.com/myorg\" -p \"MyProject\"\n```\n\n### Force Update\n\n⚠️ **Use with caution!** Updates work items even if they weren't created by this tool:\n\n```bash\nazdo-wi-creator create -o \"https://dev.azure.com/myorg\" -p \"MyProject\" -t \"Bug\" -s \"feature\" --force\n```\n\n## Spec File Format\n\nCreate a JSON file with your work item specifications:\n\n```json\n{\n  \"workItems\": [\n    {\n      \"fields\": {\n        \"Title\": \"My Bug Title\",\n        \"Description\": \"\u003cdiv\u003eBug description in HTML or markdown\u003c/div\u003e\",\n        \"AcceptanceCriteria\": \"- Criteria 1\\n- Criteria 2\",\n        \"Priority\": 1,\n        \"Severity\": \"2 - High\"\n      },\n      \"areaPaths\": [\n        \"MyProject\\\\Team1\",\n        \"MyProject\\\\Team2\"\n      ],\n      \"tags\": \"bug-bash, high-priority\"\n    }\n  ]\n}\n```\n\n### Comments Support\n\nYou can use comments to document your spec files, explain decisions, or temporarily disable sections:\n\n```json\n{\n    // This is a single-line comment\n    /* \n     * This is a multi-line comment\n     * explaining the work items below\n     */\n    \"workItems\": [\n        {\n            \"project\": \"MyProject\",\n            \"fields\": {\n                // Title field is required\n                \"Title\": \"Example Feature\",\n                \"Description\": \"\u003cdiv\u003eFeature description\u003c/div\u003e\",\n                \"State\": \"New\" // Can be: New, Active, Resolved, Closed\n            },\n            // Area paths define where the work item belongs\n            \"areaPaths\": [\n                \"MyProject\\\\Team1\",\n                // You can comment out paths you don't need:\n                // \"MyProject\\\\Team2\",\n                \"MyProject\\\\Team3\"\n            ],\n            /* Tags help categorize work items */\n            \"tags\": \"example, feature\"\n        }\n        // Add more work items here\n    ]\n}\n```\n\n**Note**: Your editor may show syntax warnings about comments in JSON files, but the tool handles them correctly. In Visual Studio Code use the JSONC syntax mode to avoid syntax error for \"JSON with Comments\" (jsonc).\n\n### Field Name Resolution\n\nYou can use **short field names** for convenience! The tool automatically resolves them to fully qualified Azure DevOps reference names.\n\n**Both formats work:**\n\n```json\n{\n  \"fields\": {\n    \"Title\": \"My Feature\",                    // Short name (easier to read)\n    \"System.Title\": \"My Feature\"              // Fully qualified (explicit)\n  }\n}\n```\n\n**Supported short names** (40+ common fields):\n- `Title` → `System.Title`\n- `Description` → `System.Description`\n- `State` → `System.State`\n- `Priority` → `Microsoft.VSTS.Common.Priority`\n- `AcceptanceCriteria` → `Microsoft.VSTS.Common.AcceptanceCriteria`\n- `BusinessValue` → `Microsoft.VSTS.Common.BusinessValue`\n- `Effort` → `Microsoft.VSTS.Scheduling.Effort`\n- `Risk` → `Microsoft.VSTS.Common.Risk`\n- `TargetDate` → `Microsoft.VSTS.Scheduling.TargetDate`\n- And many more...\n\n**Custom fields**: Always use fully qualified names (e.g., `Custom.MyCompanyField`)\n\n### Automatic Markdown Detection\n\nThe tool **automatically detects markdown syntax and HTML tags** in string field values and creates corresponding HTML fields for rich text rendering in Azure DevOps!\n\n**How it works:**\n\n1. **System Fields** (e.g., `System.Description`, `Microsoft.VSTS.Common.AcceptanceCriteria`):\n   - Stores original markdown/HTML in the field (e.g., `System.Description`)\n   - Creates a separate `.Html` field with the HTML version (e.g., `System.Description.Html`)\n   \n2. **Custom Fields** (e.g., `Custom.ProblemStatement`, `Custom.FeatureHypothesis`):\n   - Converts markdown to HTML and stores it directly in the field\n   - No separate `.Html` field is created (custom fields don't support this in Azure DevOps)\n   - Azure DevOps displays the HTML if the field is configured to support markdown/HTML\n\n**Example with System Field:**\n\n```json\n{\n  \"fields\": {\n    \"Description\": \"# Overview\\n\\n- Item 1\\n- Item 2\"\n  }\n}\n```\n\nResult:\n- `System.Description` = \"# Overview\\n\\n- Item 1\\n- Item 2\" (original markdown)\n- `System.Description.Html` = \"\\\u003ch1\u003eOverview\\\u003c/h1\u003e\\\u003cul\u003e\\\u003cli\u003eItem 1\\\u003c/li\u003e\\\u003cli\u003eItem 2\\\u003c/li\u003e\\\u003c/ul\u003e\" (auto-generated)\n\n**Example with Custom Field:**\n\n```json\n{\n  \"fields\": {\n    \"Custom.ProblemStatement\": \"# Problem\\n\\n- Issue 1\\n- Issue 2\"\n  }\n}\n```\n\nResult:\n- `Custom.ProblemStatement` = \"\\\u003ch1\u003eProblem\\\u003c/h1\u003e\\\u003cul\u003e\\\u003cli\u003eIssue 1\\\u003c/li\u003e\\\u003cli\u003eIssue 2\\\u003c/li\u003e\\\u003c/ul\u003e\" (converted to HTML)\n\n**System fields that support .Html:**\n- `System.Description`\n- `System.History`\n- `Microsoft.VSTS.Common.AcceptanceCriteria`\n- `Microsoft.VSTS.TCM.ReproSteps`\n- `Microsoft.VSTS.TCM.SystemInfo`\n\n**Example with Markdown:**\n\n```json\n{\n  \"workItems\": [\n    {\n      \"fields\": {\n        \"Title\": \"Implement User Authentication\",\n        \"Description\": \"# Overview\\n\\nThis feature adds user authentication with the following:\\n\\n- **OAuth 2.0** support\\n- *JWT tokens* for session management\\n- Password reset functionality\\n\\n## Technical Details\\n\\n```javascript\\nconst token = jwt.sign({ userId }, secret);\\n```\\n\\nSee the [design doc](https://example.com) for more info.\",\n        \"Custom.TechSpec\": \"## Architecture\\n\\n- Microservices\\n- Event-driven\\n- REST APIs\"\n      },\n      \"areaPaths\": [\"MyProject\\\\Team1\"]\n    }\n  ]\n}\n```\n\n**What happens:**\n- `System.Description`: Markdown detected → creates both `System.Description` (original) and `System.Description.Html` (converted)\n- `Custom.TechSpec`: Markdown detected → converts to HTML and stores in `Custom.TechSpec`\n- Azure DevOps renders both beautifully\n\n**Example with HTML:**\n\n```json\n{\n  \"workItems\": [\n    {\n      \"fields\": {\n        \"Title\": \"Bug Fix\",\n        \"Description\": \"\u003cdiv\u003eThis is a critical bug that needs attention.\u003c/div\u003e\u003cbr/\u003e\u003cp\u003eSteps to reproduce:\u003c/p\u003e\u003cul\u003e\u003cli\u003eStep 1\u003c/li\u003e\u003cli\u003eStep 2\u003c/li\u003e\u003c/ul\u003e\",\n        \"Custom.Notes\": \"Some text with \u003cbr/\u003e and \u003cstrong\u003eemphasis\u003c/strong\u003e\"\n      },\n      \"areaPaths\": [\"MyProject\\\\Team1\"]\n    }\n  ]\n}\n```\n\n**What happens:**\n- `System.Description`: HTML detected → creates both `System.Description` (original) and `System.Description.Html` (same HTML)\n- `Custom.Notes`: HTML detected → stores HTML directly in `Custom.Notes`\n- Azure DevOps renders the HTML properly\n\n**Supported Markdown:**\n- Headers: `# H1`, `## H2`, `### H3`, etc.\n- Bold: `**bold**` or `__bold__`\n- Italic: `*italic*` or `_italic_`\n- Links: `[text](url)`\n- Code blocks: `` ```code``` ``\n- Inline code: `` `code` ``\n- Lists: `- item` or `* item` or `1. item`\n- Blockquotes: `\u003e quote`\n\n**Supported HTML Tags:**\n- Any valid HTML tags: `\u003cdiv\u003e`, `\u003cspan\u003e`, `\u003cp\u003e`, `\u003cbr/\u003e`, `\u003cstrong\u003e`, `\u003cem\u003e`, `\u003ca\u003e`, `\u003cul\u003e`, `\u003col\u003e`, `\u003cli\u003e`, `\u003ch1\u003e`-`\u003ch6\u003e`, `\u003cpre\u003e`, `\u003ccode\u003e`, `\u003cblockquote\u003e`, etc.\n\n**Plain text is left unchanged** - only fields with markdown syntax or HTML tags get HTML versions!\n\n### Field Mapping\n\nCommon work item fields:\n\n- `Title` (or `System.Title`) - Work item title (required)\n- `Description` (or `System.Description`) - Description (supports HTML/markdown)\n- `AssignedTo` (or `System.AssignedTo`) - Email or display name of assignee\n- `Priority` (or `Microsoft.VSTS.Common.Priority`) - Priority (1-4)\n- `AcceptanceCriteria` (or `Microsoft.VSTS.Common.AcceptanceCriteria`) - Acceptance criteria\n- `Severity` (or `Microsoft.VSTS.Common.Severity`) - Severity level\n- `Tags` (or `System.Tags`) - Will be merged with the tool tag\n\n### Spec File Loading\n\nThe tool supports multiple ways to specify the spec file:\n\n1. **Local file path** (absolute or relative):\n   ```bash\n   --spec \"/path/to/spec.json\"\n   --spec \"./specs/feature-spec.json\"\n   ```\n\n2. **HTTP(S) URL**:\n   ```bash\n   --spec \"https://example.com/specs/feature-spec.json\"\n   ```\n\n3. **Simple name** (smart resolution):\n   ```bash\n   --spec \"feature\"\n   ```\n   The tool will search for:\n   - `feature` (exact match)\n   - `feature-spec.json` (case-insensitive)\n   - In the current working directory\n\n### Multi-Project Support\n\nYou can create work items across multiple projects in a single spec file!\n\nEach work item can specify its own `project` field:\n\n```json\n{\n  \"workItems\": [\n    {\n      \"project\": \"ProjectAlpha\",\n      \"fields\": {\n        \"Title\": \"Feature in Project Alpha\",\n        \"Description\": \"\u003cdiv\u003eThis goes to ProjectAlpha\u003c/div\u003e\"\n      },\n      \"areaPaths\": [\"ProjectAlpha\\\\Team1\"]\n    },\n    {\n      \"project\": \"ProjectBeta\",\n      \"fields\": {\n        \"Title\": \"Feature in Project Beta\",\n        \"Description\": \"\u003cdiv\u003eThis goes to ProjectBeta\u003c/div\u003e\"\n      },\n      \"areaPaths\": [\"ProjectBeta\\\\Team2\"]\n    }\n  ]\n}\n```\n\n**Usage options:**\n\n1. **All projects in spec file** (no --project needed):\n   ```bash\n   azdo-wi-creator create -o \"https://dev.azure.com/myorg\" -t \"Feature\" -s \"multi-project-spec.json\"\n   ```\n\n2. **Mix of spec and command-line** (--project as fallback):\n   ```bash\n   # Work items without \"project\" field will use \"DefaultProject\"\n   azdo-wi-creator create -o \"https://dev.azure.com/myorg\" -p \"DefaultProject\" -t \"Feature\" -s \"spec.json\"\n   ```\n\n3. **Single project** (legacy style, still supported):\n   ```bash\n   azdo-wi-creator create -o \"https://dev.azure.com/myorg\" -p \"MyProject\" -t \"Feature\" -s \"spec.json\"\n   ```\n\n## How It Works\n\n1. **Creation**: When creating work items, the tool automatically adds a `azdo-wi-creator` tag\n2. **Updates**: The tool checks for existing work items with the same title, type, and area path\n3. **Protection**: By default, the tool refuses to update work items without the `azdo-wi-creator` tag\n4. **State Preservation**: When updating, the State field is preserved (not reset to \"New\")\n5. **Multiple Area Paths**: Each area path specified creates a separate work item with the same details\n6. **Multiple Projects**: Work items are grouped by project for efficient processing\n\n## Examples\n\n### Example Files\n\nSee the [examples/](examples/) directory for complete sample spec files:\n- **[Feature-spec.json](examples/Feature-spec.json)** - Comprehensive Feature work items with all Azure DevOps Scrum fields\n- **[multi-project-spec.json](examples/multi-project-spec.json)** - Work items across multiple projects\n- **[short-names-spec.json](examples/short-names-spec.json)** - Demonstrates short field name usage\n- **[comments-example-spec.json](examples/comments-example-spec.json)** - Shows how to use comments in spec files\n\n### Example 1: Create bugs for multiple teams\n\n**bug-spec.json:**\n```json\n{\n  \"workItems\": [\n    {\n      \"fields\": {\n        \"Title\": \"Fix login page issue\",\n        \"Description\": \"Users unable to login on mobile devices\",\n        \"Severity\": \"1 - Critical\"\n      },\n      \"areaPaths\": [\n        \"MyProject\\\\Frontend\",\n        \"MyProject\\\\Backend\"\n      ],\n      \"tags\": \"mobile, login\"\n    }\n  ]\n}\n```\n\n```bash\nazdo-wi-creator -o \"https://dev.azure.com/myorg\" -p \"MyProject\" -t \"Bug\" -s \"bug-spec.json\"\n```\n\nThis creates **2 work items** (one for Frontend, one for Backend).\n\n### Example 2: Simulation mode\n\n```bash\nazdo-wi-creator -o \"https://dev.azure.com/myorg\" -p \"MyProject\" -t \"Task\" -s \"tasks\" --simulate\n```\n\nOutput:\n```\n=== SIMULATION MODE - No changes will be made ===\n\nWould create work item #1:\n  Type: Task\n  Area Path: MyProject\\Team1\n  State: New\n  Title: Implement feature X\n  Fields:\n    System.Title: Implement feature X\n    System.Description: Detailed description...\n  Tags: azdo-wi-creator; feature-x\n\n=== SIMULATION COMPLETE ===\nWould create 1 work item(s)\n```\n\n### Example 3: Short field names\n\n**my-feature-spec.json:**\n```json\n{\n  \"workItems\": [\n    {\n      \"fields\": {\n        \"Title\": \"Customer Portal Redesign\",\n        \"Description\": \"\u003cdiv\u003e\u003ch2\u003eOverview\u003c/h2\u003e\u003cp\u003eModernize the customer portal...\u003c/p\u003e\u003c/div\u003e\",\n        \"Priority\": 1,\n        \"BusinessValue\": 500,\n        \"Effort\": 40,\n        \"Risk\": \"High\",\n        \"TargetDate\": \"2025-06-30\"\n      },\n      \"areaPaths\": [\"MyProject\\\\CustomerExperience\"]\n    }\n  ]\n}\n```\n\nAll short names like `Title`, `Priority`, `BusinessValue` are automatically resolved!\n\n### Example 4: Multi-project work items\n\n**multi-project-spec.json:**\n```json\n{\n  \"workItems\": [\n    {\n      \"project\": \"ProjectAlpha\",\n      \"fields\": {\n        \"Title\": \"Implement User Authentication\",\n        \"Priority\": 1,\n        \"BusinessValue\": 300\n      },\n      \"areaPaths\": [\"ProjectAlpha\\\\Backend\", \"ProjectAlpha\\\\Security\"]\n    },\n    {\n      \"project\": \"ProjectBeta\",\n      \"fields\": {\n        \"Title\": \"API Rate Limiting\",\n        \"Priority\": 1,\n        \"BusinessValue\": 200\n      },\n      \"areaPaths\": [\"ProjectBeta\\\\API\"]\n    }\n  ]\n}\n```\n\n```bash\n# No --project needed when all work items specify their project\nazdo-wi-creator create -o \"https://dev.azure.com/myorg\" -t \"Feature\" -s \"multi-project-spec.json\"\n```\n\nOutput shows projects being processed:\n```\nLoaded 2 work item specification(s)\nOrganization: https://dev.azure.com/myorg\nProjects: ProjectAlpha, ProjectBeta (2 projects)\nWork Item Type: Feature\n\n--- Processing project: ProjectAlpha ---\n✓ Created work item #123: Implement User Authentication\n✓ Created work item #124: Implement User Authentication\n\n--- Processing project: ProjectBeta ---\n✓ Created work item #125: API Rate Limiting\n```\n\n### Example 5: Loading from URL\n\n```bash\nazdo-wi-creator -o \"https://dev.azure.com/myorg\" -p \"MyProject\" -t \"User Story\" \\\n  -s \"https://raw.githubusercontent.com/myorg/specs/main/feature-spec.json\"\n```\n\n## Building from Source\n\nRequirements:\n- .NET 10 SDK\n\n### Build for all platforms:\n\n```bash\n# Windows x64\ndotnet publish -c Release -r win-x64 --self-contained -p:PublishSingleFile=true -o ./publish/win-x64\n\n# Windows ARM64\ndotnet publish -c Release -r win-arm64 --self-contained -p:PublishSingleFile=true -o ./publish/win-arm64\n\n# Linux x64\ndotnet publish -c Release -r linux-x64 --self-contained -p:PublishSingleFile=true -o ./publish/linux-x64\n\n# Linux ARM64\ndotnet publish -c Release -r linux-arm64 --self-contained -p:PublishSingleFile=true -o ./publish/linux-arm64\n\n# macOS x64\ndotnet publish -c Release -r osx-x64 --self-contained -p:PublishSingleFile=true -o ./publish/osx-x64\n\n# macOS ARM64 (Apple Silicon)\ndotnet publish -c Release -r osx-arm64 --self-contained -p:PublishSingleFile=true -o ./publish/osx-arm64\n```\n\n## GitHub Actions\n\nSee the `.github/workflows/` directory for automated build workflows that create releases for all platforms.\n\n## Publishing Release Binaries\n\nThis document describes how to build and publish single-file executables for all supported platforms.\n\n### Quick Start\n\nTo publish binaries for all platforms at once:\n\n```bash\n./publish-all.sh\n```\n\nThis will create single-file executables in the `publish/` directory for all supported platforms.\n\n### VS Code Tasks\n\nYou can also use VS Code tasks to publish for individual platforms or all platforms:\n\n1. Press `Cmd+Shift+P` (macOS) or `Ctrl+Shift+P` (Windows/Linux)\n2. Type \"Tasks: Run Task\"\n3. Select one of:\n   - **Publish All Platforms** - Builds for all platforms\n   - **Publish Windows x64** - Windows 64-bit\n   - **Publish Windows ARM64** - Windows ARM 64-bit\n   - **Publish macOS x64** - macOS Intel\n   - **Publish macOS ARM64** - macOS Apple Silicon\n   - **Publish Linux x64** - Linux 64-bit\n   - **Publish Linux ARM64** - Linux ARM 64-bit\n\n### Manual Publishing\n\nTo manually publish for a specific platform:\n\n```bash\ndotnet publish azdo-wi-creator/azdo-wi-creator.csproj \\\n  --configuration Release \\\n  --runtime \u003cRUNTIME\u003e \\\n  --self-contained true \\\n  --output publish/\u003cRUNTIME\u003e \\\n  /p:PublishSingleFile=true \\\n  /p:PublishTrimmed=false \\\n  /p:IncludeNativeLibrariesForSelfExtract=true\n```\n\nReplace `\u003cRUNTIME\u003e` with:\n\n| Platform | Runtime | Output Directory |\n| -------- | -------- | --------------- |\n| Windows x64 | `win-x64` | `publish/win-x64` |\n| Windows ARM64 | `win-arm64` | `publish/win-arm64` |\n| macOS x64 | `osx-x64` | `publish/osx-x64` |\n| macOS ARM64 | `osx-arm64` | `publish/osx-arm64` |\n| Linux x64 | `linux-x64` | `publish/linux-x64` |\n| Linux ARM64 | `linux-arm64` | `publish/linux-arm64` |\n\n### Output Location\n\nAfter publishing, executables will be located at:\n\n- **Windows**: `publish/win-{x64|arm64}/azdo-wi-creator.exe`\n- **macOS**: `publish/osx-{x64|arm64}/azdo-wi-creator`\n- **Linux**: `publish/linux-{x64|arm64}/azdo-wi-creator`\n\n### Creating a GitHub Release\n\n#### Automated Release (Recommended)\n\nThe repository includes a GitHub Actions workflow that automatically builds and publishes releases when you push a version tag:\n\n```bash\n# 1. Update version in azdo-wi-creator/azdo-wi-creator.csproj\n# \u003cVersion\u003e0.3.0\u003c/Version\u003e\n\n# 2. Commit your changes\ngit add .\ngit commit -m \"Prepare release v0.3.0\"\n\n# 3. Push commits to main branch\ngit push origin main\n\n# 4. Create and push a version tag\ngit tag v0.3.0\ngit push origin v0.3.0\n```\n\nThis automatically:\n- Builds executables for all 6 platforms (Windows, Linux, macOS - x64 \u0026 ARM64)\n- Creates compressed archives (`.zip` for Windows, `.tar.gz` for macOS/Linux)\n- Creates a GitHub Release with version-tagged files (e.g., `azdo-wi-creator-win-x64-v0.3.0.zip`)\n- Generates release notes from your commits\n\n**Note**: The tag must start with `v` (e.g., `v0.3.0`) to trigger the workflow.\n\n#### Manual Release\n\nAlternatively, you can create releases manually:\n\n1. Run `./publish-n-zip-all.sh` to build and zip/tar all platform binaries\n2. Go to your GitHub repository → Releases → Draft a new release\n3. Create a new tag (e.g., `v0.3.0`)\n4. Upload all the archive files from the `publish/` directory\n5. Publish the release\n\n### Binary Characteristics\n\nAll published binaries are:\n- **Self-contained**: Include the .NET runtime (no .NET installation required)\n- **Single-file**: All dependencies bundled into a single executable\n- **Platform-specific**: Optimized for each target platform\n- **Ready to run**: No additional setup or dependencies needed\n\n## Troubleshooting\n\n### Authentication Issues\n\nIf you get authentication errors:\n\n1. **Verify PAT**: Ensure `AZURE_DEVOPS_PAT` is set correctly\n2. **Check permissions**: PAT needs `Work Items (Read, Write)` scope\n3. **Force interactive sign-in**: Use `--interactive-signin` to bypass PAT and environment variables\n   ```bash\n   azdo-wi-creator create -o \"...\" -p \"...\" -t \"...\" -s \"...\" --interactive-signin\n   ```\n4. **Try Azure CLI**: Run `az login` and try again\n\n**When to use `--interactive-signin`:**\n- You have `AZURE_DEVOPS_PAT` set but want to sign in as a different user\n- You want to ensure you're using OAuth tokens instead of PAT\n- Troubleshooting PAT-related authentication issues\n\n### Field Validation Errors\n\nIf work items fail to create:\n\n1. **Required fields**: Check that all mandatory fields for your work item type are included\n2. **Field names**: You can use short names (e.g., `Title`) or fully qualified names (e.g., `System.Title`)\n3. **Simulation mode**: Use `--simulate` to preview without creating\n4. **Check warnings**: Unknown field names will show warnings - verify spelling or use fully qualified names for custom fields\n\n### Area Path Issues\n\n- Area paths must exist in your project\n- Use backslashes: `MyProject\\\\Team1\\\\SubTeam`\n- If not specified, defaults to project root\n\n## Donate\n\nIf you are using the tool but are unable to contribute technically, please consider promoting it and donating an amount that reflects its value to you. You can do so either via PayPal\n\n[![Donate via PayPal](https://www.paypalobjects.com/en_US/i/btn/btn_donate_LG.gif)](https://www.paypal.com/donate/?hosted_button_id=JVG7PFJ8DMW7J)\n\nor via [GitHub Sponsors](https://github.com/sponsors/thgossler).\n\n## Contributing\n\n1. Fork the repository\n2. Create a feature branch: `git checkout -b my-feature`\n3. Make your changes\n4. Test thoroughly on macOS\n5. Submit a pull request\n\n## License\n\nThis project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.\n\n\n\u003c!-- MARKDOWN LINKS \u0026 IMAGES (https://www.markdownguide.org/basic-syntax/#reference-style-links) --\u003e\n[contributors-shield]: https://img.shields.io/github/contributors/thgossler/azdo-wi-creator.svg\n[contributors-url]: https://github.com/thgossler/azdo-wi-creator/graphs/contributors\n[forks-shield]: https://img.shields.io/github/forks/thgossler/azdo-wi-creator.svg\n[forks-url]: https://github.com/thgossler/azdo-wi-creator/network/members\n[stars-shield]: https://img.shields.io/github/stars/thgossler/azdo-wi-creator.svg\n[stars-url]: https://github.com/thgossler/azdo-wi-creator/stargazers\n[issues-shield]: https://img.shields.io/github/issues/thgossler/azdo-wi-creator.svg\n[issues-url]: https://github.com/thgossler/azdo-wi-creator/issues\n[license-shield]: https://img.shields.io/github/license/thgossler/azdo-wi-creator.svg\n[license-url]: https://github.com/thgossler/azdo-wi-creator/blob/main/LICENSE\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthgossler%2Fazdo-wi-creator","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fthgossler%2Fazdo-wi-creator","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthgossler%2Fazdo-wi-creator/lists"}