Skip to content

feat: add PPDS.Dataverse, PPDS.Migration, and CLI packages#8

Merged
joshsmithxrm merged 13 commits intomainfrom
feature/dataverse-packages
Dec 20, 2025
Merged

feat: add PPDS.Dataverse, PPDS.Migration, and CLI packages#8
joshsmithxrm merged 13 commits intomainfrom
feature/dataverse-packages

Conversation

@joshsmithxrm
Copy link
Copy Markdown
Owner

@joshsmithxrm joshsmithxrm commented Dec 19, 2025

Summary

Adds three new packages to the PPDS SDK ecosystem:

PPDS.Dataverse

High-performance Dataverse connectivity with:

  • Multi-connection pool supporting multiple Application Users for load distribution
  • Connection selection strategies: RoundRobin, LeastConnections, ThrottleAware
  • Throttle tracking with automatic routing away from throttled connections
  • Bulk operation wrappers: CreateMultiple, UpdateMultiple, UpsertMultiple, DeleteMultiple
  • Security utilities: ConnectionStringRedactor, DataverseConnectionException, SensitiveDataAttribute

PPDS.Migration

High-performance data migration engine:

  • Parallel export with configurable degree of parallelism
  • Tiered import with automatic dependency resolution (Tarjan's algorithm for SCC detection)
  • Circular reference detection with deferred field processing
  • CMT format compatibility (schema.xml, data.zip) - drop-in replacement
  • Progress reporting with Console and JSON output formats
  • Security-first design: no PII in logs, connection string redaction

PPDS.Migration.Cli

CLI tool for data migration operations:

  • Commands: export, import, analyze, migrate
  • Environment variable support for credentials (security best practice)
  • JSON progress output for tool integration
  • Packaged as .NET global tool (ppds-migrate)

Performance Improvements

Scenario CMT PPDS.Migration Improvement
Export 50 entities, 100K records ~2 hours ~15 min 8x
Import 50 entities, 100K records ~4 hours ~1.5 hours 2.5x

Test Plan

  • All 498 tests pass (PPDS.Plugins: 148, PPDS.Dataverse: 142, PPDS.Migration.Cli: 208)
  • Build succeeds for all target frameworks (net462, net8.0, net10.0)
  • Solution builds with no errors
  • Integration test with real Dataverse environment
  • CLI tool end-to-end test

New Files

  • src/PPDS.Dataverse/ - Connection pooling and bulk operations (15 files)
  • src/PPDS.Migration/ - Migration engine library (26 files)
  • src/PPDS.Migration.Cli/ - CLI tool (11 files)
  • tests/PPDS.Dataverse.Tests/ - Unit tests
  • tests/PPDS.Migration.Cli.Tests/ - Unit tests

🤖 Generated with Claude Code

joshsmithxrm and others added 2 commits December 19, 2025 14:24
Add comprehensive design documentation for two new packages:
- PPDS.Dataverse: Connection pooling, bulk operations, resilience
- PPDS.Migration: High-performance CMT replacement for data migration

Includes:
- 00_PACKAGE_STRATEGY.md: Overall SDK architecture and naming
- 01_PPDS_DATAVERSE_DESIGN.md: Connection pool and bulk ops design
- 02_PPDS_MIGRATION_DESIGN.md: Migration engine design
- 03_IMPLEMENTATION_PROMPTS.md: Implementation prompts

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
…ctivity

- Multi-connection pool with support for multiple Application Users
- Connection selection strategies: RoundRobin, LeastConnections, ThrottleAware
- Throttle tracking with automatic routing away from throttled connections
- Bulk operation wrappers: CreateMultiple, UpdateMultiple, UpsertMultiple, DeleteMultiple
- DI integration via AddDataverseConnectionPool() extension method
- Affinity cookie disabled by default for improved throughput
- Updated publish workflow to support multiple packages and version from git tag
- 31 unit tests covering strategies, throttle tracking, and DI registration

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings December 19, 2025 23:58
@gemini-code-assist
Copy link
Copy Markdown

Summary of Changes

Hello @joshsmithxrm, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request introduces the foundational PPDS.Dataverse NuGet package, a critical component for high-performance and resilient Dataverse interactions within .NET applications. It focuses on optimizing data operations by implementing sophisticated connection pooling, intelligent load distribution across multiple application users, and robust handling of Dataverse service protection limits. The package also provides streamlined access to modern bulk APIs, aiming to drastically improve the efficiency and scalability of Dataverse integrations.

Highlights

  • New PPDS.Dataverse Package: Introduced a new NuGet package, PPDS.Dataverse, providing high-performance connectivity to Dataverse with advanced features.
  • Connection Pooling: Implemented a multi-connection pool to distribute load across multiple Application Users, enhancing throughput and resilience.
  • Intelligent Connection Selection: Added various connection selection strategies including RoundRobin, LeastConnections, and a ThrottleAware strategy that automatically routes away from throttled connections.
  • Bulk Operations Support: Provided wrappers for modern Dataverse bulk operations such as CreateMultiple, UpdateMultiple, UpsertMultiple, and DeleteMultiple, significantly improving data manipulation efficiency.
  • Dependency Injection Integration: Included services.AddDataverseConnectionPool() extension methods for seamless integration with .NET's dependency injection system.
  • Performance Optimizations: Configured the Dataverse client to disable the affinity cookie by default, which can lead to a 10x+ throughput improvement, and targets net8.0 and net10.0.
  • Updated Build and Documentation: The publish-nuget.yml workflow was updated to support multiple packages and extract versions from git tags. New design documents were added outlining the package strategy, detailed Dataverse design, and future migration engine design.
Ignored Files
  • Ignored by pattern: .github/workflows/** (1)
    • .github/workflows/publish-nuget.yml
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

Copy link
Copy Markdown

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request introduces a significant and well-designed new feature, the PPDS.Dataverse package. The design documents are thorough, and the implementation of the connection pooling, resilience, and dependency injection components is solid and follows modern C# practices. The code is clean, well-documented, and includes a good set of unit tests.

I've found a critical issue in the bulk operation implementation that prevents it from meeting its performance goals. I've also noted a few medium-severity issues related to API design consistency and a minor TODO that needs to be addressed. Once these points are addressed, this will be an excellent addition to the SDK.

Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR introduces the PPDS.Dataverse package, a high-performance Dataverse connectivity layer featuring connection pooling, bulk operations, and intelligent throttle management. The implementation provides multi-connection support for load distribution across Application Users, with automatic routing away from throttled connections.

Key Changes:

  • New PPDS.Dataverse package with connection pooling, bulk operations, and resilience features
  • Support for multiple connection sources with RoundRobin, LeastConnections, and ThrottleAware selection strategies
  • Bulk API wrappers for CreateMultiple, UpdateMultiple, UpsertMultiple, DeleteMultiple operations
  • Comprehensive test suite with 31 unit tests covering pooling, resilience, and DI components

Reviewed changes

Copilot reviewed 41 out of 42 changed files in this pull request and generated 8 comments.

Show a summary per file
File Description
src/PPDS.Dataverse/PPDS.Dataverse.csproj Project configuration targeting net8.0/net10.0 with strong naming
src/PPDS.Dataverse/Client/* Client abstraction layer wrapping ServiceClient
src/PPDS.Dataverse/Pooling/* Connection pool with multi-connection support and lifecycle management
src/PPDS.Dataverse/Pooling/Strategies/* Connection selection strategies (RoundRobin, LeastConnections, ThrottleAware)
src/PPDS.Dataverse/Resilience/* Throttle tracking and service protection exception handling
src/PPDS.Dataverse/BulkOperations/* Bulk operation executor with modern API wrappers
src/PPDS.Dataverse/DependencyInjection/* DI extensions and configuration options
tests/PPDS.Dataverse.Tests/* Comprehensive unit tests for all major components
docs/design/* Detailed design documentation and implementation prompts
.github/workflows/publish-nuget.yml Updated to support multiple packages and version extraction from tags
CHANGELOG.md Updated with new package details

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

joshsmithxrm and others added 3 commits December 19, 2025 18:23
- Add README for PPDS.Dataverse package
- Update main README to cover both packages
- Add ADRs for key architectural decisions:
  - 0001: Disable affinity cookie by default
  - 0002: Multi-connection pooling
  - 0003: Throttle-aware connection selection
- Add pattern documentation:
  - Connection pooling pattern
  - Bulk operations pattern
- Remove design docs (replaced by ADRs and patterns)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
- Rename ADR files to SCREAMING_SNAKE_CASE (0001_DISABLE_AFFINITY_COOKIE.md, etc.)
- Rename pattern files with _PATTERNS.md suffix and move to docs/architecture/
- Remove dates from ADR files (per style guide: no dates in content)
- Replace ✓/✗ with ✅/❌ in code examples
- Fix broken link to non-existent PPDS.Plugins README

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
New CLI tool for high-performance Dataverse data migration:

Commands:
- export: Export data from Dataverse to ZIP file
- import: Import data from ZIP file into Dataverse
- analyze: Analyze schema and display dependency graph
- migrate: Migrate data between environments

Code quality improvements:
- Extract shared console output helpers to ConsoleOutput.cs
- Move ImportMode and OutputFormat enums to separate files
- Add --bypass-flows option to MigrateCommand for consistency
- Add --verbose option to AnalyzeCommand for consistency
- Fix broken link in README.md

Test coverage:
- 98 unit tests covering all command argument parsing
- Exit code validation tests
- JSON output contract tests
- ConsoleOutput helper tests

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
@joshsmithxrm joshsmithxrm changed the title feat: add PPDS.Dataverse package for high-performance Dataverse connectivity feat: add PPDS.Dataverse and PPDS.Migration.Cli packages Dec 20, 2025
joshsmithxrm and others added 2 commits December 19, 2025 21:21
PPDS.Dataverse and PPDS.Migration.Cli are new packages that should
be published as alpha releases for initial testing before stable 1.0.0.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Fixes NuGet warning about missing readme in the package.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 62 out of 63 changed files in this pull request and generated 1 comment.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@joshsmithxrm
Copy link
Copy Markdown
Owner Author

@gemini-code-assist review

Copy link
Copy Markdown

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request introduces two significant new packages, PPDS.Dataverse and PPDS.Migration.Cli, which add high-performance Dataverse connectivity and a data migration tool. The code is well-structured with good documentation and unit tests. I've identified a critical issue in the bulk operation implementation that uses an older, less performant API, which should be addressed to meet the project's performance goals. I also have a couple of medium-severity suggestions regarding an unimplemented feature and improving the robustness of the CLI's JSON output. Overall, this is a great addition to the SDK.

joshsmithxrm and others added 5 commits December 19, 2025 22:06
- Replace Ecosystem Integration with Dependencies & Versioning section in CLAUDE.md
- Add Compatibility table to README.md
- Document version sync rules, dependencies, and breaking change impacts

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Critical fixes:
- Refactor BulkOperationExecutor to use CreateMultipleRequest,
  UpdateMultipleRequest, UpsertMultipleRequest with EntityCollection
  for 10x+ performance improvement
- Add ElasticTable flag for Cosmos DB-backed table support with
  native DeleteMultiple and partial success handling
- Wire bypass options correctly: BypassBusinessLogicExecution (new),
  SuppressCallbackRegistrationExpanderJob for Power Automate flows

Medium fixes:
- Change IDataverseClient.ConnectedOrgVersion from string to Version?
- Wire ThrottleEvents to _throttleTracker.TotalThrottleEvents
- Remove unused GetAvailableConnections() from IThrottleTracker
- Remove unused Weight property from DataverseConnection
- Use System.Text.Json.JsonSerializer in ConsoleOutput

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Security features:
- ConnectionStringRedactor: Redacts sensitive values (ClientSecret, Password,
  Token, etc.) from connection strings before logging
- DataverseConnectionException: Wraps connection errors with sanitized messages
  to prevent credential leakage in logs and stack traces
- SensitiveDataAttribute: Marks properties containing sensitive data for
  documentation and static analysis
- DataverseConnection.ToString(): Excludes connection string from output
- DataverseConnection.GetRedactedConnectionString(): Safe logging helper

CLI security improvements:
- Environment variable support for all connection strings:
  - PPDS_CONNECTION for export/import
  - PPDS_SOURCE_CONNECTION and PPDS_TARGET_CONNECTION for migrate
- Connection args no longer required at parse time (resolved at runtime)
- Keeps credentials out of command-line args, process listings, shell history

Documentation:
- Security best practices section in PPDS.Dataverse README
- Environment variable usage guide in PPDS.Migration.Cli README

Tests: 40 new tests covering all security features

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Implements prompts 9-16 from the implementation plan:

## PPDS.Migration Library
- Parallel export with configurable degree of parallelism
- Tiered import with automatic dependency resolution (Tarjan's algorithm)
- Circular reference detection with deferred field processing
- CMT format compatibility (schema.xml, data.zip)
- Progress reporting (Console and JSON formats)
- Security-first design: no PII in logs, connection string redaction

## Key Components
- Models: MigrationSchema, DependencyGraph, ExecutionPlan, IdMapping
- Analysis: DependencyGraphBuilder, ExecutionPlanBuilder
- Export: ParallelExporter with FetchXML paging
- Import: TieredImporter with bulk operation support
- Formats: CMT schema/data readers and writers
- Progress: IProgressReporter with Console/JSON implementations

## CLI Integration
- Updated PPDS.Migration.Cli to reference PPDS.Migration
- Commands ready to use migration library

## Documentation
- Updated CHANGELOG.md with PPDS.Migration features
- Updated README.md with package info and examples
- Added PPDS.Migration package README

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
@joshsmithxrm joshsmithxrm changed the title feat: add PPDS.Dataverse and PPDS.Migration.Cli packages feat: add PPDS.Dataverse, PPDS.Migration, and CLI packages Dec 20, 2025
@joshsmithxrm joshsmithxrm requested a review from Copilot December 20, 2025 07:07
@joshsmithxrm
Copy link
Copy Markdown
Owner Author

@gemini-code-assist review

Copy link
Copy Markdown

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This is an impressive and substantial pull request that adds three major new packages to the SDK: PPDS.Dataverse, PPDS.Migration, and PPDS.Migration.Cli. The new functionality for high-performance Dataverse connectivity, connection pooling, and data migration is well-architected and thoughtfully implemented. The use of modern .NET features, dependency injection, and robust error handling is excellent. The security-first design, especially around connection string redaction and exception sanitization, is a standout feature. The inclusion of detailed documentation, ADRs, and a comprehensive test suite demonstrates a high level of quality. I have one critical finding regarding a missing package dependency that needs to be addressed. Otherwise, this is a fantastic contribution.

Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 108 out of 110 changed files in this pull request and generated 20 comments.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Required for deserializing BulkApiErrorDetails from elastic table operations.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
@joshsmithxrm joshsmithxrm merged commit 66a8b15 into main Dec 20, 2025
2 checks passed
@joshsmithxrm joshsmithxrm deleted the feature/dataverse-packages branch December 25, 2025 10:10
joshsmithxrm added a commit that referenced this pull request Jan 3, 2026
- Refactor tests to use early-bound entity classes (PluginAssembly,
  SdkMessage) instead of late-bound Entity with magic strings
- Fix exception handling tests to use UpsertPluginTypeAsync (which
  actually calls GetComponentTypeAsync) instead of UpsertPackageAsync
  (which uses CreateWithSolutionHeaderAsync and doesn't call it)
- Add tests for FaultException, FaultException<OrganizationServiceFault>,
  and solution addition skip when componentType returns 0

Addresses bot review comments #8, #14, #15

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
joshsmithxrm added a commit that referenced this pull request Jan 3, 2026
* refactor: add logging to GetComponentTypeAsync catch block

- Add required ILogger<PluginRegistrationService> dependency
- Update all callers (ListCommand, CleanCommand, DiffCommand, DeployCommand)
  to get logger from service provider and pass to constructor
- Replace generic catch clause with specific FaultException handlers
- Log failures at Debug level for troubleshooting while maintaining
  graceful degradation behavior (returns 0 to skip solution addition)
- Add System.ServiceModel using for FaultException types
- Add unit tests for PluginRegistrationService

Fixes #61

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* test: add exception handling tests and use early-bound entities

- Refactor tests to use early-bound entity classes (PluginAssembly,
  SdkMessage) instead of late-bound Entity with magic strings
- Fix exception handling tests to use UpsertPluginTypeAsync (which
  actually calls GetComponentTypeAsync) instead of UpsertPackageAsync
  (which uses CreateWithSolutionHeaderAsync and doesn't call it)
- Add tests for FaultException, FaultException<OrganizationServiceFault>,
  and solution addition skip when componentType returns 0

Addresses bot review comments #8, #14, #15

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
joshsmithxrm added a commit that referenced this pull request Mar 18, 2026
Solutions (#1,#2,#3,#5): Include Managed toggle, sort controls,
Visible/API Managed fields, Maker Portal button, isVisible/isApiManaged
end-to-end C# support.

Import Jobs (#7,#8,#9): Search bar, Operation Context column
(end-to-end C#→TS), record count with filtered status.

Plugin Traces (#11,#12,#17,#18,#55): CRITICAL Trace Level dropdown
fix, Maker Portal URL fix (Dynamics 365 classic), status text labels,
record count, search bar.

Web Resources (#19): Restored Created By and Created On columns.

Connection References (#23,#24,#25,#28,#55): Expandable flow/connection
detail with chevron toggle, ISO timestamp formatting, search bar,
status badge improvements (Unknown/Unbound), Sync Settings button.

Environment Variables (#29,#31,#55): Modified On column restored,
search bar, Sync Settings button.

Metadata Browser (#37): Custom Only filter toggle for entities.

Data Explorer (#41,#42): Clear button, Import button (file dialog).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
joshsmithxrm added a commit that referenced this pull request Mar 19, 2026
Solutions (#1,#2,#3,#5): Include Managed toggle, sort controls,
Visible/API Managed fields, Maker Portal button, isVisible/isApiManaged
end-to-end C# support.

Import Jobs (#7,#8,#9): Search bar, Operation Context column
(end-to-end C#→TS), record count with filtered status.

Plugin Traces (#11,#12,#17,#18,#55): CRITICAL Trace Level dropdown
fix, Maker Portal URL fix (Dynamics 365 classic), status text labels,
record count, search bar.

Web Resources (#19): Restored Created By and Created On columns.

Connection References (#23,#24,#25,#28,#55): Expandable flow/connection
detail with chevron toggle, ISO timestamp formatting, search bar,
status badge improvements (Unknown/Unbound), Sync Settings button.

Environment Variables (#29,#31,#55): Modified On column restored,
search bar, Sync Settings button.

Metadata Browser (#37): Custom Only filter toggle for entities.

Data Explorer (#41,#42): Clear button, Import button (file dialog).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
joshsmithxrm added a commit that referenced this pull request Mar 19, 2026
* fix(cdp): use pwsh Expand-Archive for VSIX extraction on Windows

bsdtar interprets the C: drive prefix as a remote host, breaking
VSIX extraction in --vsix mode. Use PowerShell's Expand-Archive on
Windows; keep tar on other platforms.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* plan: extension UX audit fixes — 28 findings across 10 phases

Side-by-side comparison of legacy v0.3.4 vs new extension produced
55 findings. After triage: 28 fixes, 22 keep-new-behavior, 5 deferred.
Organized into 10 phases (1 cross-cutting + 9 per-panel) for parallel
agent execution.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* feat(ext): Phase 1 — cross-cutting infrastructure fixes

- Add Connection References + Environment Variables to sidebar Tools (#56, #57)
- Standardize command titles: "Open Data Explorer", "Open Plugin Traces" (#51)
- Remove text-transform: uppercase from 5 panel CSS files for Title Case headers (#10)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* feat(ext): Phases 2-9 — UX audit fixes across all 8 panels

Solutions (#1,#2,#3,#5): Include Managed toggle, sort controls,
Visible/API Managed fields, Maker Portal button, isVisible/isApiManaged
end-to-end C# support.

Import Jobs (#7,#8,#9): Search bar, Operation Context column
(end-to-end C#→TS), record count with filtered status.

Plugin Traces (#11,#12,#17,#18,#55): CRITICAL Trace Level dropdown
fix, Maker Portal URL fix (Dynamics 365 classic), status text labels,
record count, search bar.

Web Resources (#19): Restored Created By and Created On columns.

Connection References (#23,#24,#25,#28,#55): Expandable flow/connection
detail with chevron toggle, ISO timestamp formatting, search bar,
status badge improvements (Unknown/Unbound), Sync Settings button.

Environment Variables (#29,#31,#55): Modified On column restored,
search bar, Sync Settings button.

Metadata Browser (#37): Custom Only filter toggle for entities.

Data Explorer (#41,#42): Clear button, Import button (file dialog).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix(ext): review fixes — colSpan bug and command injection

- Connection References: fix colCount from wrong heuristic (8) to
  correct value (7) matching actual column count
- CDP tool: sanitize paths for PowerShell injection (escape single
  quotes); use execFileSync for tar on Unix to avoid shell interpretation

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* style(ext): extract inline styles to CSS classes per Gemini review

Move search input and sort select inline styles to dedicated
.toolbar-search and .toolbar-select CSS classes across 4 panels
(Connection Refs, Env Variables, Import Jobs, Solutions).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix(ext): add missing webview entry points to knip config

The 6 non-query/solutions webview panels are esbuild entry points but
were missing from knip.json, causing false-positive unused-file reports.
Also un-export internal-only types from shared modules.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix(ext): solution filter GUID bug and raw ISO timestamps

- SolutionFilter shared component used uniqueName as option value
  instead of GUID id, causing "solutionId must be a valid GUID" error
  on Web Resources (and silently wrong on Conn Refs / Env Vars)
- Import Jobs and Web Resources rendered raw ISO timestamps; add
  formatDateTime helper matching Plugin Traces / Conn Refs pattern

Found by QA blind verification agents.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix(ext): review fixes — escaping, shell safety, URL normalization

- Solutions panel: escape rootComponentBehavior and boolean ternaries
  before innerHTML insertion (S1 compliance)
- Connection References: escape literal "Unbound" for consistent
  escaping discipline
- CDP tool: use execFileSync instead of execSync for PowerShell
  VSIX extraction (S2 compliance — no shell: true)
- Plugin Traces: strip trailing slash from environment URL before
  Maker Portal link construction

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix(ext): escape formatDate output in solutions detail card

Wrap formatDate() calls in escapeHtml() for consistent escaping
discipline — formatDate can return raw ISO string on parse failure.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants