Skip to content

fix: use per-package versions instead of tag override#9

Merged
joshsmithxrm merged 1 commit intomainfrom
fix/independent-package-versions
Dec 20, 2025
Merged

fix: use per-package versions instead of tag override#9
joshsmithxrm merged 1 commit intomainfrom
fix/independent-package-versions

Conversation

@joshsmithxrm
Copy link
Copy Markdown
Owner

@joshsmithxrm joshsmithxrm commented Dec 20, 2025

Summary

Fixes an issue where the publish workflow would override all package versions with the git tag version. This caused problems when packages have different versions.

Problem

The workflow used -p:Version=${{ steps.version.outputs.VERSION }} which would apply the tag version to ALL packages:

Package csproj Version With tag v1.0.0-alpha.1
PPDS.Plugins 1.1.0 ❌ Would publish as 1.0.0-alpha.1 (DOWNGRADE)
PPDS.Dataverse 1.0.0-alpha.1 ✅ Correct
PPDS.Migration 1.0.0-alpha.1 ✅ Correct
PPDS.Migration.Cli 1.0.0-alpha.1 ✅ Correct

Solution

  • Remove -p:Version= override from build and pack commands
  • Each package now uses its version from its csproj file
  • Add step to display package versions before publishing for visibility

Changes

  • publish-nuget.yml: Removed version override, added package version display step

Test Plan

  • Verify workflow syntax is valid
  • Create a test release to confirm packages publish with correct versions

🤖 Generated with Claude Code

The workflow was overriding all package versions with the git tag version,
which would cause issues when packages have different versions (e.g.,
PPDS.Plugins at 1.1.0 vs new packages at 1.0.0-alpha.1).

Changes:
- Remove -p:Version= override from build and pack commands
- Each package now uses its version from its csproj file
- Add step to display package versions before publishing
- Keep tag extraction for logging purposes

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings December 20, 2025 08:18
@gemini-code-assist
Copy link
Copy Markdown

Note

Gemini is unable to generate a summary for this pull request due to the file types involved not being currently supported.

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 fixes a critical issue in the NuGet publishing workflow where all packages were being forced to use the git tag version, causing version downgrades for packages with different versions. The solution removes the version override and allows each package to use its own version from its .csproj file.

Key changes:

  • Removed the -p:Version= parameter from dotnet build and pack commands
  • Added a display step to show package versions before publishing for transparency
  • Modified tag extraction step to only log the release tag instead of setting it as a build parameter

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

@joshsmithxrm joshsmithxrm merged commit dbd9504 into main Dec 20, 2025
8 checks passed
@joshsmithxrm joshsmithxrm deleted the fix/independent-package-versions branch December 25, 2025 10:10
joshsmithxrm added a commit that referenced this pull request Jan 1, 2026
When silent token acquisition fails (e.g., tokens cached under different
tenant's authority), the fallback now respects the profile's original
AuthMethod instead of always defaulting to device code flow.

- Add preferredAuthMethod parameter to GlobalDiscoveryService
- Check if interactive browser is available before falling back
- Use interactive browser for profiles created with that method
- Only fall back to device code for SP profiles or when interactive unavailable
- Always use "organizations" authority for discovery (enables token reuse)

Fixes item #9 in issue #59.

🤖 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 1, 2026
)

* feat(plugins): enhance registration config and extraction

- Add unsecureConfiguration field (renamed from configuration for clarity)
- Add entityAlias field to image output
- Add MainOperation (stage 30) support for custom actions
- Add ZuluTimeConverter for consistent timestamp formatting
- Fix solution component handling for updates (add even on update)
- Fix cross-platform path normalization (use forward slashes)
- Add JSON schema for plugin-registration.json

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

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

* fix(auth): honor profile's auth method on silent auth failure (#59)

When silent token acquisition fails (e.g., tokens cached under different
tenant's authority), the fallback now respects the profile's original
AuthMethod instead of always defaulting to device code flow.

- Add preferredAuthMethod parameter to GlobalDiscoveryService
- Check if interactive browser is available before falling back
- Use interactive browser for profiles created with that method
- Only fall back to device code for SP profiles or when interactive unavailable
- Always use "organizations" authority for discovery (enables token reuse)

Fixes item #9 in issue #59.

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

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

* fix(auth): implement tenant-aware MSAL account selection (#59)

Root cause: MSAL token cache shared by all profiles, but account lookup
used `accounts.FirstOrDefault()` which picked arbitrary cached account
regardless of which tenant the profile belonged to.

Fix:
- Add HomeAccountId property to AuthProfile and ICredentialProvider
- Store account identifier (format: {objectId}.{tenantId}) after auth
- Use GetAccountAsync(homeAccountId) for precise account lookup
- Fall back to filtering by HomeAccountId.TenantId if no identifier
- Never silently use random cached account - force re-auth if needed
- Apply fix to: InteractiveBrowserCredentialProvider,
  DeviceCodeCredentialProvider, GlobalDiscoveryService

The fix ensures each profile's token lookup finds only tokens from the
correct tenant, preventing cross-tenant environment discovery.

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

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

* docs: update changelogs for issue #59 fixes

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

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

* chore: prepare releases Auth-v1.0.0-beta.2 and Cli-v1.0.0-beta.3

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

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

* refactor: address PR review feedback

- Extract MsalAccountHelper for DRY account lookup (Gemini feedback)
- Remove entityAlias from schema required array (Copilot feedback)
- Add CultureInfo.InvariantCulture to DateTimeOffset.Parse (Copilot feedback)

Generic catch clause deferred to #61.

🤖 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 Jan 2, 2026
Addresses issues #7, #9, #15, #27 from code review:

- #7: Add thread-safety remarks to ConsoleProgressReporter
- #9: Add documentation for role mapping limitation in TieredImporter
- #15: Replace Console.WriteLine with AuthenticationOutput in auth library
  - New AuthenticationOutput class allows consumers to redirect or suppress output
  - Set AuthenticationOutput.Writer = null to suppress, or provide custom Action<string>
- #27: Add validation in CredentialProviderFactory before null-forgiveness
  - ValidateRequiredFields checks GitHubFederated, AzureDevOpsFederated, UsernamePassword

🤖 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 2, 2026
* fix: add thread-safe async locking to ProfileConnectionSource

Add SemaphoreSlim for proper async synchronization in GetSeedClientAsync.
The previous implementation checked _seedClient outside any lock, allowing
concurrent calls to create duplicate providers and clients.

Changes:
- Add _asyncLock SemaphoreSlim for async method synchronization
- Implement double-check locking pattern in GetSeedClientAsync
- Dispose SemaphoreSlim in Dispose method

Fixes part of #71

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

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

* fix: use ConcurrentBag for thread-safe provider tracking

Replace List<ICredentialProvider> with ConcurrentBag<ICredentialProvider>
to prevent collection corruption when CreateFromProfileAsync is called
concurrently from multiple threads.

Changes:
- Add System.Collections.Concurrent using
- Change _activeProviders to ConcurrentBag<ICredentialProvider>
- Update Dispose to use TryTake pattern instead of Clear()

Fixes part of #71

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

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

* fix: properly unregister MSAL cache in InteractiveBrowserCredentialProvider

Unregister the MsalCacheHelper from the token cache during disposal to
release file locks on the token cache file.

Fixes part of #71

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

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

* fix: properly unregister MSAL cache in GlobalDiscoveryService

Unregister the MsalCacheHelper from the token cache during disposal to
release file locks on the token cache file.

Fixes part of #71

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

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

* fix: remove redundant CancellationTokenSource from Program.cs

System.CommandLine 2.x handles Ctrl+C automatically and passes the
cancellation token to command handlers via SetAction's cancellationToken
parameter. The manual CancelKeyPress handler was creating a CTS that was
never connected to the command invocation pipeline.

Removed the unused CTS and added a clarifying comment about how
cancellation is handled.

Fixes part of #71

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

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

* fix: use ConcurrentDictionary for entity type code cache

Replace Dictionary<string, int> with ConcurrentDictionary<string, int>
for the _entityTypeCodeCache to ensure thread-safe access in case of
concurrent operations.

Fixes part of #71

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

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

* refactor: extract duplicate ParseBypassPlugins to DataCommandGroup

Move the ParseBypassPlugins method from ImportCommand and CopyCommand
to DataCommandGroup as a shared internal helper. Both commands now
reference the single implementation.

Fixes part of #71

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

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

* chore: suppress NU1702 warning for cross-framework PPDS.Plugins reference

PPDS.Plugins must target net462 (Dataverse plugin sandbox requirement) but
is referenced by projects targeting net8.0+. Since the package contains only
attributes and enums with no framework-specific APIs, this cross-framework
reference is intentional and safe.

Added explanatory comments in each affected project file.

Fixes part of #71

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

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

* fix: remove NU1903 vulnerability warning suppression

The high-severity vulnerability in transitive dependencies has been fixed
upstream. Remove the suppression so future vulnerabilities are properly
reported.

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

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

* fix: use X509CertificateLoader for .NET 9+ certificate loading

Replace deprecated X509Certificate2 constructor with X509CertificateLoader
on .NET 9+. Uses conditional compilation to maintain compatibility with
.NET 8.

Fixes SYSLIB0057 warnings on net9.0 and net10.0 targets.

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

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

* fix: suppress SYSLIB0014 warning for ServicePointManager

ServicePointManager is obsolete in .NET 6+, but these settings are required
for optimal Dataverse throughput. The Dataverse SDK uses HttpWebRequest
internally, so these settings still apply. No alternative exists until
Microsoft updates their SDK to use HttpClient.

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

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

* fix: use async/await in thread safety tests (xUnit1031)

Convert blocking Task.WaitAll() to async Task.WhenAll() to resolve
xUnit1031 analyzer warnings about potential deadlocks in test methods.

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

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

* fix: address 11 code review findings from #80

Critical fixes:
- Fix copy-paste bug in CertificateStoreCredentialProvider (StoreName→StoreLocation)
- Fix memory leak in DeviceCodeCredentialProvider.Dispose() (unregister cache)
- Fix memory leak in UsernamePasswordCredentialProvider.Dispose() (unregister cache)
- Fix double-checked locking bug in ConnectionStringSource (add volatile)

High priority fixes:
- Add debug logging for expected role lookup failures in TieredImporter
- Remove duplicate endpoint lookup in GlobalDiscoveryService
- Remove dead code ExecuteBatchesParallelAsync (76 lines)

Medium priority fixes:
- Redact exception messages in TieredImporter using ConnectionStringRedactor
- Add validation for empty entity/field names in CmtSchemaReader
- Add validation for MaxParallelEntities >= 1 in ImportOptions
- Preserve FaultException error codes in BulkOperationExecutor

Closes #80

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

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

* fix: add AuthenticationOutput for configurable auth messaging (#80)

Addresses issues #7, #9, #15, #27 from code review:

- #7: Add thread-safety remarks to ConsoleProgressReporter
- #9: Add documentation for role mapping limitation in TieredImporter
- #15: Replace Console.WriteLine with AuthenticationOutput in auth library
  - New AuthenticationOutput class allows consumers to redirect or suppress output
  - Set AuthenticationOutput.Writer = null to suppress, or provide custom Action<string>
- #27: Add validation in CredentialProviderFactory before null-forgiveness
  - ValidateRequiredFields checks GitHubFederated, AzureDevOpsFederated, UsernamePassword

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

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

* fix: address remaining issue 71 code review findings (8, 12)

Issue 8: Wrap sync-over-async in Task.Run to avoid deadlock
- ProfileConnectionSource.GetSeedClient() now runs async code on
  threadpool to prevent deadlock in sync contexts (UI/ASP.NET)

Issue 12: Use Uri.TryCreate instead of try-catch for flow control
- AuthCommandGroup.ExtractEnvironmentName() refactored to avoid
  exception-based control flow

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

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

* refactor: extract phase processors from TieredImporter (#18)

Extract schema validation, deferred field processing, and relationship
processing into separate classes to improve testability and maintainability.

New components:
- ISchemaValidator/SchemaValidator: Load target metadata, detect mismatches
- DeferredFieldProcessor: Process self-referential lookup updates
- RelationshipProcessor: Process M2M associations with role mapping
- ImportContext: Shared context for all import phases
- FieldMetadataCollection: Type-safe wrapper for field validity data
- SchemaMismatchResult: Result type with detailed error message builder
- IImportPhaseProcessor/PhaseResult: Common interface for phase processors

TieredImporter reduced from 1,085 to 646 lines, now focused on orchestration.

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

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

* fix: address PR review feedback (issues 1, 3, 4)

- Remove unused roleNameCache from RelationshipProcessor (#1)
  The cache was built with a network call but never used since
  LookupRoleByIdAsync queries by ID directly, not by name.

- Add volatile to AuthenticationOutput._writer (#3)
  Ensures thread-safe reads/writes of the static field.

- Unify ProfileConnectionSource locking (#4)
  Both sync and async paths now use the same SemaphoreSlim lock,
  preventing race conditions between GetSeedClient and GetSeedClientAsync.
  Also marked _seedClient as volatile for proper double-checked locking.

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

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

---------

Co-authored-by: Claude <noreply@anthropic.com>
joshsmithxrm added a commit that referenced this pull request Jan 2, 2026
- Add warning message on JSON parse failure (#9)
- Handle FileNotFoundError when dotnet not in PATH (#1, #12)
- Add 5-minute timeout to subprocess calls (#11)

🤖 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 2, 2026
* docs: add Claude workflow automation and streamline CLAUDE.md

- Add /pre-pr command for pre-commit validation (build, test, changelog check)
- Add /review-bot-comments command for triaging bot review findings
- Add pre-commit hook to validate builds/tests before commit
- Update development workflow to reference new commands
- Streamline CLAUDE.md (remove verbose namespace examples, simplify comments section)
- Add testing requirements table showing coverage gaps (Auth, Migration need tests)
- Add bot review handling guidance

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

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

* docs: minor refinements to hook and CLAUDE.md

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

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

* fix: improve pre-commit hook robustness

- Add warning message on JSON parse failure (#9)
- Handle FileNotFoundError when dotnet not in PATH (#1, #12)
- Add 5-minute timeout to subprocess calls (#11)

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

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

* fix: improve pre-commit hook command detection and output

- Use shlex.split for robust git commit detection (#2)
- Print both stdout and stderr on build/test failure (#3, #4)

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

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

* docs: simplify gh api permission in settings example

🤖 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 Jan 3, 2026
- Add warning message on JSON parse failure (#9)
- Handle FileNotFoundError when dotnet not in PATH (#1, #12)
- Add 5-minute timeout to subprocess calls (#11)

🤖 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 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