{"id":48016276,"url":"https://github.com/rpapub/xaml-parser","last_synced_at":"2026-04-04T13:43:50.549Z","repository":{"id":343427980,"uuid":"1074046606","full_name":"rpapub/xaml-parser","owner":"rpapub","description":"Standalone XAML workflow parser for automation projects","archived":false,"fork":false,"pushed_at":"2026-03-10T10:50:31.000Z","size":1335,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-10T16:51:28.669Z","etag":null,"topics":["staticcodeanalysis","uipath"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rpapub.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","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-11T03:51:08.000Z","updated_at":"2026-03-10T10:50:27.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/rpapub/xaml-parser","commit_stats":null,"previous_names":["rpapub/xaml-parser"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/rpapub/xaml-parser","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rpapub%2Fxaml-parser","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rpapub%2Fxaml-parser/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rpapub%2Fxaml-parser/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rpapub%2Fxaml-parser/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rpapub","download_url":"https://codeload.github.com/rpapub/xaml-parser/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rpapub%2Fxaml-parser/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31402276,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-04T10:20:44.708Z","status":"ssl_error","status_checked_at":"2026-04-04T10:20:06.846Z","response_time":60,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["staticcodeanalysis","uipath"],"created_at":"2026-04-04T13:43:50.429Z","updated_at":"2026-04-04T13:43:50.519Z","avatar_url":"https://github.com/rpapub.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# XAML Parser\r\n\r\nParse UiPath XAML workflow files and extract complete metadata - arguments, variables, activities, expressions, and annotations.\r\n\r\n[![License: CC BY 4.0](https://img.shields.io/badge/License-CC%20BY%204.0-lightgrey.svg)](https://creativecommons.org/licenses/by/4.0/)\r\n\r\n## What is this?\r\n\r\nA zero-dependency parser for UiPath XAML workflow files. Extract all metadata from automation projects:\r\n- Workflow arguments (inputs/outputs)\r\n- Variables and their scopes\r\n- Activities and their configurations\r\n- Business logic annotations\r\n- VB.NET and C# expressions\r\n\r\n**Available in**: Python (stable) | Go (planned)\r\n\r\n## Installation\r\n\r\n### Python\r\n\r\n```bash\r\npip install cpmf-uips-xaml\r\n```\r\n\r\nOr for development:\r\n```bash\r\ngit clone https://github.com/rpapub/xaml-parser.git\r\ncd xaml-parser/python\r\nuv sync\r\n```\r\n\r\n## Quick Examples by Use Case\r\n\r\n### 1. Extract Workflow Arguments\r\n\r\n```python\r\nfrom pathlib import Path\r\nfrom cpmf_uips_xaml import XamlParser\r\n\r\nparser = XamlParser()\r\nresult = parser.parse_file(Path(\"Main.xaml\"))\r\n\r\nif result.success:\r\n    for arg in result.content.arguments:\r\n        print(f\"{arg.direction.upper()}: {arg.name} ({arg.type})\")\r\n        if arg.annotation:\r\n            print(f\"  → {arg.annotation}\")\r\n```\r\n\r\n**Output:**\r\n```\r\nIN: Config (System.Collections.Generic.Dictionary\u003cString, Object\u003e)\r\n  → Configuration dictionary from orchestrator\r\nOUT: TransactionData (System.Data.DataRow)\r\n  → Current transaction item\r\n```\r\n\r\n### 2. List All Activities\r\n\r\n```python\r\nresult = parser.parse_file(Path(\"Process.xaml\"))\r\n\r\nfor activity in result.content.activities:\r\n    indent = \"  \" * activity.depth_level\r\n    print(f\"{indent}{activity.tag}: {activity.display_name or '(unnamed)'}\")\r\n```\r\n\r\n**Output:**\r\n```\r\nSequence: Process Transaction\r\n  TryCatch: Try Process\r\n    Assign: Set Transaction Data\r\n    InvokeWorkflowFile: Update System\r\n  LogMessage: Transaction Complete\r\n```\r\n\r\n### 3. Extract Business Logic Annotations\r\n\r\n```python\r\nresult = parser.parse_file(Path(\"workflow.xaml\"))\r\n\r\n# Root workflow annotation\r\nif result.content.root_annotation:\r\n    print(f\"Workflow Purpose: {result.content.root_annotation}\")\r\n\r\n# Activity annotations\r\nfor activity in result.content.activities:\r\n    if activity.annotation:\r\n        print(f\"\\n{activity.display_name}:\")\r\n        print(f\"  {activity.annotation}\")\r\n```\r\n\r\n### 4. Find All Expressions\r\n\r\n```python\r\nconfig = {'extract_expressions': True}\r\nparser = XamlParser(config)\r\nresult = parser.parse_file(Path(\"workflow.xaml\"))\r\n\r\nfor activity in result.content.activities:\r\n    for expr in activity.expressions:\r\n        print(f\"{activity.display_name}: {expr.content}\")\r\n        print(f\"  Language: {expr.language}\")\r\n        print(f\"  Type: {expr.expression_type}\")\r\n```\r\n\r\n### 5. Generate Workflow Documentation\r\n\r\n```python\r\nimport json\r\n\r\nresult = parser.parse_file(Path(\"Main.xaml\"))\r\n\r\ndoc = {\r\n    'workflow': result.content.display_name or 'Main',\r\n    'description': result.content.root_annotation,\r\n    'arguments': [\r\n        {\r\n            'name': arg.name,\r\n            'type': arg.type,\r\n            'direction': arg.direction,\r\n            'description': arg.annotation\r\n        }\r\n        for arg in result.content.arguments\r\n    ],\r\n    'activity_count': len(result.content.activities),\r\n    'variable_count': len(result.content.variables)\r\n}\r\n\r\nprint(json.dumps(doc, indent=2))\r\n```\r\n\r\n### 6. Validate Workflow Structure in CI/CD\r\n\r\n```python\r\nimport sys\r\n\r\nresult = parser.parse_file(Path(\"workflow.xaml\"))\r\n\r\nif not result.success:\r\n    print(f\"❌ Parsing failed: {', '.join(result.errors)}\")\r\n    sys.exit(1)\r\n\r\n# Check for required arguments\r\nrequired = ['in_Config', 'out_Result']\r\nactual = {arg.name for arg in result.content.arguments}\r\n\r\nif not all(req in actual for req in required):\r\n    print(f\"❌ Missing required arguments\")\r\n    sys.exit(1)\r\n\r\nprint(f\"✅ Workflow valid: {len(result.content.activities)} activities\")\r\n```\r\n\r\n### 7. Analyze Workflow Dependencies\r\n\r\n```python\r\ninvocations = []\r\n\r\nfor activity in result.content.activities:\r\n    if activity.tag == 'InvokeWorkflowFile':\r\n        workflow_path = activity.visible_attributes.get('WorkflowFileName', '')\r\n        invocations.append(workflow_path)\r\n\r\nprint(\"Invoked workflows:\")\r\nfor path in invocations:\r\n    print(f\"  - {path}\")\r\n```\r\n\r\n## Advanced: Graph-Based Analysis \u0026 Multi-View Output\r\n\r\n**New in v2.0**: Transform parsed workflows into queryable graph structures with multiple output views.\r\n\r\n### Project-Level Analysis\r\n\r\nParse entire UiPath projects and analyze call graphs, control flow, and activity relationships:\r\n\r\n```python\r\nfrom pathlib import Path\r\nfrom cpmf_uips_xaml import ProjectParser, analyze_project\r\n\r\n# Parse entire project\r\nparser = ProjectParser()\r\nproject_result = parser.parse_project(Path(\"MyProject\"), recursive=True)\r\n\r\n# Build queryable graph structures\r\nindex = analyze_project(project_result)\r\n\r\n# Query the project\r\nprint(f\"Total workflows: {index.total_workflows}\")\r\nprint(f\"Total activities: {index.activities.node_count()}\")\r\nprint(f\"Entry points: {len(index.entry_points)}\")\r\n\r\n# Find circular dependencies\r\ncycles = index.find_call_cycles()\r\nif cycles:\r\n    print(f\"Warning: Found {len(cycles)} circular call chains\")\r\n```\r\n\r\n### Multi-View Output\r\n\r\nGenerate different representations of the same project:\r\n\r\n#### 1. Flat View (Default, Backward Compatible)\r\n\r\n```python\r\nfrom cpmf_uips_xaml.views import FlatView\r\n\r\nview = FlatView()\r\noutput = view.render(index)\r\n# Returns traditional flat list of workflows\r\n```\r\n\r\n#### 2. Execution View (Call Graph Traversal)\r\n\r\nFollow the execution path from an entry point, showing nested invocations:\r\n\r\n```python\r\nfrom cpmf_uips_xaml.views import ExecutionView\r\n\r\n# Start from entry point workflow\r\nentry_workflow_id = index.entry_points[0]\r\nview = ExecutionView(entry_point=entry_workflow_id, max_depth=10)\r\noutput = view.render(index)\r\n\r\n# Output shows:\r\n# - Call depth for each workflow\r\n# - Nested activities (callee activities under InvokeWorkflowFile)\r\n# - Execution order from entry to leaves\r\n```\r\n\r\n**Use case**: Understand what actually runs when you start from Main.xaml\r\n\r\n#### 3. Slice View (Context Window for LLM)\r\n\r\nExtract focused context around a specific activity:\r\n\r\n```python\r\nfrom cpmf_uips_xaml.views import SliceView\r\n\r\n# Focus on a specific activity\r\nfocal_activity_id = \"act:sha256:abc123def456\"\r\nview = SliceView(focus=focal_activity_id, radius=2)\r\noutput = view.render(index)\r\n\r\n# Output includes:\r\n# - The focal activity\r\n# - Parent chain (root to focal)\r\n# - Siblings (same parent)\r\n# - Context activities within radius\r\n```\r\n\r\n**Use case**: Provide relevant context to LLMs without overwhelming token limits\r\n\r\n### CLI Usage with Views\r\n\r\n```bash\r\n# Parse project with flat view (default)\r\ncpmf-uips-xaml project.json --dto --json\r\n\r\n# Execution view from entry point\r\ncpmf-uips-xaml project.json --dto --json \\\r\n  --view execution \\\r\n  --entry \"wf:sha256:abc123def456\"\r\n\r\n# Slice view around specific activity\r\ncpmf-uips-xaml project.json --dto --json \\\r\n  --view slice \\\r\n  --focus \"act:sha256:abc123def456\" \\\r\n  --radius 3\r\n\r\n# With progress reporting (rich/tqdm/json/simple)\r\ncpmf-uips-xaml project.json --progress rich --json\r\n```\r\n\r\n#### Available CLI Flags\r\n\r\n**Output Modes:**\r\n- `--json` - Raw JSON output\r\n- `--dto` - Normalized DTO with stable IDs and edges\r\n- `--arguments` - Show only arguments\r\n- `--activities` - Show only activities\r\n- `--tree` - Show activity tree\r\n- `--summary` - Show summary for multiple files\r\n- `--graph` - Show workflow dependency graph (project mode)\r\n\r\n**View Transformations** (with `--dto`):\r\n- `--view {nested,execution,slice}` - View type (default: nested)\r\n- `--entry WORKFLOW_ID` - Entry point for execution view\r\n- `--focus ACTIVITY_ID` - Focal activity for slice view\r\n- `--radius N` - Context radius for slice view\r\n\r\n**Output Options:**\r\n- `--profile {full,minimal,mcp,datalake}` - Output profile\r\n- `--combine` - Combine all workflows into single output\r\n- `--sort` - Sort output alphabetically\r\n- `-o, --output PATH` - Output file/directory\r\n\r\n**Analysis:**\r\n- `--metrics` - Include workflow metrics\r\n- `--anti-patterns` - Detect anti-patterns\r\n\r\n**Progress Reporting:** _(new in v0.3)_\r\n- `--progress {rich,tqdm,json,simple}` - Progress reporter type\r\n  - `rich` - Animated progress bars (requires `pip install rich`)\r\n  - `tqdm` - tqdm-style progress (requires `pip install tqdm`)\r\n  - `json` - JSON-lines for machine parsing\r\n  - `simple` - Plain text progress\r\n\r\n**Logging \u0026 Performance:**\r\n- `-v, --verbose` - Enable verbose diagnostic logging\r\n- `--log-level {DEBUG,INFO,WARNING,ERROR,CRITICAL}` - Set log level\r\n- `--log-dir DIR` - Directory for log files\r\n- `--no-log-file` - Disable log file output\r\n- `--performance` - Enable detailed performance profiling\r\n\r\n**Project Parsing:**\r\n- `--entry-points-only` - Parse only entry points (no recursive discovery)\r\n\r\n### Graph Query Methods\r\n\r\nThe ProjectIndex provides powerful query methods:\r\n\r\n```python\r\n# Get workflow by ID or path\r\nworkflow = index.get_workflow(\"wf:sha256:abc123\")\r\nworkflow = index.get_workflow_by_path(\"Workflows/Process.xaml\")\r\n\r\n# Get activity and its containing workflow\r\nactivity = index.get_activity(\"act:sha256:def456\")\r\nparent_workflow = index.get_workflow_for_activity(\"act:sha256:def456\")\r\n\r\n# Get all workflows reachable from entry point\r\nreachable = index.workflows.reachable_from(entry_workflow_id)\r\n\r\n# Topological sort of workflow call graph\r\nexecution_order = index.get_execution_order()\r\n\r\n# Extract context around activity\r\ncontext = index.slice_context(\"act:sha256:abc123\", radius=2)\r\n```\r\n\r\n### Architecture \u0026 API Modules\r\n\r\n#### Processing Pipeline\r\n\r\n```\r\nXAML Files → Parse → Normalize → Analyze → ProjectIndex (IR)\r\n                                              ↓\r\n                          Views (Nested, Execution, Slice)\r\n                                              ↓\r\n                              Emitters (JSON, Mermaid, Docs)\r\n```\r\n\r\n**Stages:**\r\n1. **Parse** - Extract raw data from XAML (XamlParser, ProjectParser)\r\n2. **Normalize** - Convert to stable DTOs with IDs and edges\r\n3. **Analyze** - Build queryable graph structures (ProjectIndex)\r\n4. **View** - Transform IR for specific use cases\r\n5. **Emit** - Output in various formats\r\n\r\n#### API Organization\r\n\r\nThe `cpmf_uips_xaml.api` module provides a clean facade organized into focused submodules:\r\n\r\n**`api.parsing`** - Parse and normalize XAML\r\n```python\r\nfrom cpmf_uips_xaml.api import parse_file, parse_project, normalize_parse_results\r\n\r\n# Parse single file\r\nresult = parse_file(Path(\"Main.xaml\"))\r\n\r\n# Parse entire project\r\nproject_result = parse_project(Path(\"MyProject\"))\r\n\r\n# Parse + normalize to DTO\r\nworkflow_dto = parse_file_to_dto(Path(\"Main.xaml\"))\r\n```\r\n\r\n**`api.analysis`** - Build indices and analyze\r\n```python\r\nfrom cpmf_uips_xaml.api import build_index, analyze_project\r\n\r\n# Build index from workflows\r\nindex = build_index(workflows, project_dir=Path(\".\"))\r\n\r\n# Parse + analyze (complete pipeline)\r\nproject_result, analyzer, index = parse_and_analyze_project(Path(\"MyProject\"))\r\n```\r\n\r\n**`api.views`** - Transform to different views\r\n```python\r\nfrom cpmf_uips_xaml.api import render_project_view\r\n\r\n# Render execution view\r\noutput = render_project_view(\r\n    analyzer, index,\r\n    view_type=\"execution\",\r\n    entry_point=\"wf:sha256:abc123\"\r\n)\r\n```\r\n\r\n**`api.emit`** - Output workflows\r\n```python\r\nfrom cpmf_uips_xaml.api import emit_workflows\r\n\r\n# Emit to JSON\r\nemit_workflows(workflows, format=\"json\", output_path=Path(\"output.json\"))\r\n\r\n# Emit to Mermaid diagram\r\nemit_workflows(workflows, format=\"mermaid\", output_path=Path(\"diagram.md\"))\r\n```\r\n\r\n**`api.config`** - Configuration management\r\n```python\r\nfrom cpmf_uips_xaml.api import load_default_config\r\n\r\nconfig = load_default_config()\r\n```\r\n\r\n#### When to Use XamlParser vs API Facade\r\n\r\n**Use `XamlParser` directly** when:\r\n- Parsing a single file with minimal processing\r\n- Need fine-grained control over parser config\r\n- Working with raw `ParseResult` objects\r\n\r\n**Use API facade (`api.*`)** when:\r\n- Parsing projects (multiple files)\r\n- Building indices and graphs\r\n- Generating different views\r\n- Orchestrating the full pipeline (parse → normalize → analyze → emit)\r\n\r\n**ProjectIndex** is an Intermediate Representation (IR) with 4 graph layers:\r\n- **Workflows Graph**: All workflows with metadata\r\n- **Activities Graph**: All activities across all workflows\r\n- **Call Graph**: Workflow invocation relationships\r\n- **Control Flow Graph**: Activity execution edges\r\n\r\n**Benefits**:\r\n- Single parse, multiple output formats\r\n- Queryable structure for analysis tools\r\n- Optimized for LLM context extraction\r\n- 100% backward compatible (NestedView produces same output as v1.x)\r\n- Clean layer boundaries (CLI → API → Stages)\r\n\r\nSee [docs/ADR-GRAPH-ARCHITECTURE.md](docs/ADR-GRAPH-ARCHITECTURE.md) for design decisions.\r\n\r\n## What Can You Extract?\r\n\r\n### Workflow Arguments\r\n- Name, type, direction (in/out/inout)\r\n- Default values\r\n- Documentation annotations\r\n\r\n### Variables\r\n- Name, type, scope\r\n- Default values\r\n- Scoped to workflow or activity\r\n\r\n### Activities\r\n- Activity type (Sequence, Assign, If, etc.)\r\n- Display name and annotations\r\n- All properties (visible and ViewState)\r\n- Nested configuration\r\n- Parent-child relationships\r\n- Depth level in tree\r\n\r\n### Expressions\r\n- VB.NET and C# expressions\r\n- Expression type (assignment, condition, etc.)\r\n- Variable and method references\r\n- LINQ query detection\r\n\r\n### Metadata\r\n- XML namespaces\r\n- Assembly references\r\n- Expression language (VB/C#)\r\n- Parse diagnostics and performance\r\n\r\n## Output Formats\r\n\r\nThe parser supports multiple output formats via emitters:\r\n\r\n| Format | Extension | Description | Use Case |\r\n|--------|-----------|-------------|----------|\r\n| **JSON** | `.json` | Structured workflow data | API integration, data analysis |\r\n| **Mermaid** | `.md` | Call graph diagrams | Documentation, visualization |\r\n| **Doc** | `.md` | Human-readable docs | Team documentation |\r\n\r\n**Emitter Usage:**\r\n```python\r\nfrom cpmf_uips_xaml.api import emit_workflows\r\n\r\n# JSON output\r\nemit_workflows(workflows, format=\"json\", output_path=Path(\"output.json\"))\r\n\r\n# Mermaid diagram\r\nemit_workflows(workflows, format=\"mermaid\", output_path=Path(\"diagram.md\"))\r\n\r\n# Documentation\r\nemit_workflows(workflows, format=\"doc\", output_path=Path(\"docs.md\"))\r\n```\r\n\r\n**CLI:**\r\n```bash\r\n# Automatic format selection based on extension\r\ncpmf-uips-xaml project.json -o output.json  # JSON\r\ncpmf-uips-xaml project.json --graph -o diagram.md  # Mermaid\r\n```\r\n\r\n## Configuration Options\r\n\r\n```python\r\nconfig = {\r\n    'extract_arguments': True,      # Extract workflow arguments\r\n    'extract_variables': True,      # Extract variables\r\n    'extract_activities': True,     # Extract activities\r\n    'extract_expressions': True,    # Parse expressions (slower)\r\n    'extract_viewstate': False,     # Include ViewState data\r\n    'strict_mode': False,           # Fail on any error\r\n    'max_depth': 50,                # Max activity nesting depth\r\n}\r\n\r\nparser = XamlParser(config)\r\n```\r\n\r\n## Error Handling\r\n\r\nThe parser handles errors gracefully:\r\n\r\n```python\r\nresult = parser.parse_file(Path(\"malformed.xaml\"))\r\n\r\nif not result.success:\r\n    print(\"Errors:\")\r\n    for error in result.errors:\r\n        print(f\"  - {error}\")\r\n\r\n    print(\"\\nWarnings:\")\r\n    for warning in result.warnings:\r\n        print(f\"  - {warning}\")\r\n\r\n# Partial results may still be available\r\nif result.content:\r\n    print(f\"\\nPartially parsed: {len(result.content.activities)} activities\")\r\n```\r\n\r\n## Language Support\r\n\r\n| Language | Status | Package |\r\n|----------|--------|---------|\r\n| **Python** | ✅ Stable (3.9+) | `xaml-parser` |\r\n| **Go** | 🚧 Planned | `github.com/rpapub/xaml-parser/go` |\r\n\r\n## Documentation\r\n\r\n- **[Python API Documentation](python/README.md)** - Detailed Python usage\r\n- **[Contributing Guide](CONTRIBUTING.md)** - For developers\r\n- **[Architecture](docs/architecture.md)** - Design decisions\r\n- **[Schemas](schemas/)** - JSON output schemas\r\n\r\n## Use Cases\r\n\r\n- **Static Analysis** - Extract metadata for code quality tools\r\n- **Documentation** - Auto-generate workflow documentation\r\n- **Migration** - Parse workflows for platform migration\r\n- **CI/CD Validation** - Validate structure in pipelines\r\n- **Code Review** - Extract business logic for review\r\n- **Dependency Analysis** - Map workflow dependencies\r\n\r\n## Breaking Changes \u0026 Migration\r\n\r\n### v0.3.0 - Event-Based Progress Reporting\r\n\r\n**CLI Breaking Change:**\r\n\r\nThe `--progress` flag changed from a boolean to a choice of reporter types.\r\n\r\n**Before (v0.2.x):**\r\n```bash\r\ncpmf-uips-xaml project.json --progress  # Boolean flag\r\n```\r\n\r\n**After (v0.3.x):**\r\n```bash\r\n# Choose a specific reporter\r\ncpmf-uips-xaml project.json --progress rich\r\ncpmf-uips-xaml project.json --progress tqdm\r\ncpmf-uips-xaml project.json --progress json\r\ncpmf-uips-xaml project.json --progress simple\r\n\r\n# Or omit for no progress (default)\r\ncpmf-uips-xaml project.json\r\n```\r\n\r\n**API Breaking Change:**\r\n\r\nThe `show_progress` parameter was replaced with a `reporter` parameter.\r\n\r\n**Before (v0.2.x):**\r\n```python\r\nfrom cpmf_uips_xaml.api import parse_and_analyze_project\r\n\r\nresult, analyzer, index = parse_and_analyze_project(\r\n    project_dir,\r\n    show_progress=True  # Boolean\r\n)\r\n```\r\n\r\n**After (v0.3.x):**\r\n```python\r\nfrom cpmf_uips_xaml.api import parse_and_analyze_project\r\nfrom cpmf_uips_xaml.cli.reporters import RichReporter\r\n\r\n# With progress\r\nresult, analyzer, index = parse_and_analyze_project(\r\n    project_dir,\r\n    reporter=RichReporter()\r\n)\r\n\r\n# No progress (default)\r\nresult, analyzer, index = parse_and_analyze_project(project_dir)\r\n```\r\n\r\n**Benefits:**\r\n- Library is now UI-agnostic (no Rich dependency in core)\r\n- Multiple reporter types (Rich, tqdm, JSON, Simple)\r\n- Easy to add custom reporters (implement `ProgressReporter` protocol)\r\n- Zero overhead when disabled (default `NULL_REPORTER`)\r\n\r\n## License\r\n\r\n[CC-BY 4.0](LICENSE) - Christian Prior-Mamulyan and contributors\r\n\r\n**Attribution:**\r\n```\r\nXAML Parser by Christian Prior-Mamulyan, licensed under CC-BY 4.0\r\nSource: https://github.com/rpapub/xaml-parser\r\n```\r\n\r\n## Links\r\n\r\n- **GitHub**: https://github.com/rpapub/xaml-parser\r\n- **Issues**: https://github.com/rpapub/xaml-parser/issues\r\n- **PyPI**: https://pypi.org/project/xaml-parser/ (planned)\r\n\r\n## History\r\n\r\nOriginally developed as part of the [rpax](https://github.com/rpapub/rpax) automation analysis project.\r\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frpapub%2Fxaml-parser","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frpapub%2Fxaml-parser","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frpapub%2Fxaml-parser/lists"}