{"record":{"id":"fae4c9d43d17b839","repo":"microsoft/aspire","slug":"aspire-skills-bundle-contains-an-invalid-version-comparator","errorCode":null,"errorMessage":"Aspire skills bundle contains an invalid version comparator '{0}'.","messagePattern":"Aspire skills bundle contains an invalid version comparator '(.+?)'\\.","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"src/Aspire.Cli/Agents/AspireSkills/AspireSkillsBundleProvider.cs","lineNumber":709,"sourceCode":"            \">\" => comparison > 0,\n            \">=\" => comparison >= 0,\n            \"<\" => comparison < 0,\n            \"<=\" => comparison <= 0,\n            \"=\" or \"==\" => comparison == 0,\n            _ => throw new InvalidOperationException(string.Format(CultureInfo.InvariantCulture, \"Unsupported Aspire skills bundle version comparator '{0}'.\", op))\n        };\n    }\n\n    private static (string Operator, string Operand) ParseComparator(string comparator)\n    {\n        foreach (var op in new[] { \">=\", \"<=\", \"==\", \">\", \"<\", \"=\" })\n        {\n            if (comparator.StartsWith(op, StringComparison.Ordinal))\n            {\n                var operand = comparator[op.Length..];\n                if (string.IsNullOrWhiteSpace(operand))\n                {\n                    throw new InvalidOperationException(string.Format(CultureInfo.InvariantCulture, \"Aspire skills bundle contains an invalid version comparator '{0}'.\", comparator));\n                }\n\n                return (op, operand);\n            }\n        }\n\n        return (\"=\", comparator);\n    }\n\n    private static SemVersion ParseCompatibilityVersion(string version)\n    {\n        if (!SemVersion.TryParse(version, SemVersionStyles.Any, out var parsedVersion))\n        {\n            throw new InvalidOperationException(string.Format(CultureInfo.InvariantCulture, \"Aspire skills bundle contains an invalid version value '{0}'.\", version));\n        }\n\n        return SemVersion.Parse(\n            string.Create(","sourceCodeStart":691,"sourceCodeEnd":727,"githubUrl":"https://github.com/microsoft/aspire/blob/25830f84bd145686607ad00c057b3f84e2e51d43/src/Aspire.Cli/Agents/AspireSkills/AspireSkillsBundleProvider.cs#L691-L727","documentation":"ParseComparator recognizes a known operator prefix and then requires a non-empty operand. A comparator like \">=\", \"<\", or \"=\" with nothing after the operator throws this formatted InvalidOperationException, since a comparison needs a version operand.","triggerScenarios":"Range strings containing dangling operators, e.g. \">= <10.0.0\", \">=,\", or a trailing \">=\", parsed inside IsVersionInRange from the manifest's supports ranges.","commonSituations":"Hand-edited manifests with a missing version after an operator, string manipulation that dropped the operand, or accidental double spaces combined with trimming producing bare operators.","solutions":["Add the missing version operand after the operator, e.g. '>=9.0.0'","Validate the range string in the bundle manifest before publishing","Republish the bundle with the corrected range"],"exampleFix":"// before\n\"supports\": { \"aspireCli\": \">= <10.0.0\" }\n// after\n\"supports\": { \"aspireCli\": \">=9.0.0 <10.0.0\" }","handlingStrategy":"validation","validationCode":"foreach (var token in range.Split(' ', ','))\n    if (token is \">=\" or \"<=\" or \"==\" or \">\" or \"<\" or \"=\")\n        throw new InvalidOperationException($\"Comparator '{token}' has no version operand.\");","typeGuard":null,"tryCatchPattern":"try\n{\n    await installer.InstallAsync(bundleRef);\n}\ncatch (InvalidOperationException ex) when (ex.Message.Contains(\"invalid version comparator\"))\n{\n    logger.LogError(ex, \"A range operator is missing its version operand; fix the manifest range.\");\n}","preventionTips":["Check ranges for dangling operators after manual edits","Keep ranges on a single 'op version' token pattern (e.g. '>=9.0.0')","Validate manifests before publishing a bundle release"],"tags":["cli","skills-bundle","version-range","invalid-syntax"],"backgroundTag":"invalid-argument-format","analyzedSha":"25830f84bd145686607ad00c057b3f84e2e51d43","analyzedAt":"2026-09-16T11:10:06.193Z","contentChangedAt":"2026-09-16T11:10:06.193Z","schemaVersion":2},"datasetVersion":"2026-09-21T04:17:39.646Z"}