Skip to content

feat: v1.3.0 — new component types, reverse solution lookup, cascade configuration, business rule parser - #43

Merged
sabrish merged 52 commits into
mainfrom
feat/new-component-types
Jun 23, 2026
Merged

feat: v1.3.0 — new component types, reverse solution lookup, cascade configuration, business rule parser#43
sabrish merged 52 commits into
mainfrom
feat/new-component-types

Conversation

@sabrish

@sabrish sabrish commented Jun 23, 2026

Copy link
Copy Markdown
Owner

Summary

New component types

┌────────────────────────────┬──────────────────────────┬────────────────────────────────────────────────┐
│ Component │ Entity Set │ Notes │
├────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────┤
│ PCF Controls │ customcontrols │ Type 66 │
├────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────┤
│ Service Endpoints │ serviceendpoints │ Type 95
├────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────┤
│ Copilot Agents │ bots + botcomponents │ Classic PVA and Copilot Studio │
├────────────────────────────┼──────────────────────────┼───────────────────────────────────
│ AI Models │ msdyn_aimodels │ modelCreationContext redacted from
├────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────┤
│ Charts │ savedqueryvisualizations │ │
├────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────┤
│ Views │ savedqueries │
├────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────┤
│ Dialogs │ workflows (category 3) │ Deprecated; shown as advisory in UI │
├────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────┤
│ Reports │ reports │ │
├────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────┤
│ Site Maps │ sitemaps │ │
├────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────┤
│ SLA Definitions │ slas │ │
├────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────┤
│ Duplicate Detection Rules │ duplicatedetectionrules │ │
├────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────┤
│ Virtual Table Data Sources │ entitydatasources │ │
└────────────────────────────┴──────────────────────────┴────────────────────────────────────────────────┘

Reverse solution lookup — #40

Every top-level component now carries referencingSolutions?: string[] (array of solution unique names). Populated by a post-processing pass in BlueprintGenerator from the existing componentToSolutions inventory — zero additional API calls.

  • JSON: field serialised inline on each component object
  • HTML: solution badges in component table rows; dedicated Shared Components section rendered when any component appears in 2+ solutions
  • Markdown: Solutions column in Plugins, Flows, Business Rules, and Web Resources tables; summary/shared-components.md generated for solution-scoped runs

Cascade configuration in relationships — #42

1:N and N:1 relationship rows in entity schema now show full cascade configuration (Delete, Merge, Assign, Share, Reparent, Unshare).

  • HTML:
    / accordion per row; Delete badge shown inline; expanded view shows full cascade table with severity badges and plain-English descriptions
  • Markdown: cascade sub-table appended below the main relationship table

Business rule parser improvements — #37

Extended parseSingleCond to handle all Dataverse-compiled JS condition patterns observed in

  • Pattern G: empty-string checks → is blank / is not blank
  • Pattern H: triple blank check (== undefined && == null && === "") collapsed to single condition
  • Pattern J: indexOf-based string contains / does-not-contain
  • Patterns A/B/D/E: updated for double-paren variables ((vN)) used in complex boolean expressions
  • New stripOuterParens helper; "contains data" triple pre-check in parseCondition

Other

  • Raw OData URL column added to fetch diagnostics view
  • Option set value labels resolved in business rule conditions
  • IF/ELSE IF label fix when an unconditional ALWAYS group precedes a conditional group
  • IDiscoverer contract and buildOrFilter() applied to CopilotAgentDiscovery and CustomConnectorDiscovery

Test plan

  • Generate a blueprint scoped to 2+ solutions — verify referencingSolutions appears on components in JSON, Solutions column in Markdown, badges and Shared Components section in HTML
  • Open entity schema on an entity with 1:N relationships — verify cascade accordion in HTML, cascade sub-table in Markdown
  • Open a business rule that uses blank/contains/complex boolean conditions — verify conditions parse correctly without "pattern not yet recognized" placeholders
  • Verify all 12 new component type tabs appear and populate correctly for a solution that contains them
  • Verify AI model modelCreationContext field is absent from JSON export

sabrish and others added 30 commits April 12, 2026 15:35
…efinitions

Adds three new TypeScript interfaces and extends ComponentInventory,
ComponentType enum, BlueprintResult, and BlueprintSummary to support
PCF controls (type 66), service endpoints (type 95), and Copilot agents.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…e 95) discoverers

PcfControlDiscovery uses Strategy A with a single-pass query against
customcontrols. ServiceEndpointDiscovery uses Strategy A with a two-pass
query: metadata from serviceendpoints plus registered step counts from
sdkmessageprocessingsteps. SolutionComponentDiscovery routes type 66 to
pcfControlIds and type 95 to serviceEndpointIds.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Uses Strategy B (objectid intersection) since no reliable solutioncomponents
type code was found for the bots entity. Two-pass: metadata from bots, then
component counts from botcomponents. Bots table query is wrapped in try/catch
because it may not exist in all environments.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…sList components

Three card-row accordion components (PATTERN-001) with filter bars.
PcfControlsList shows version, managed badge, and compatible data types.
ServiceEndpointsList shows contract type badge, step count, and managed.
CopilotAgentsList shows kind badge, active status, component count, and managed.
Icons and tab registry entries added for all three.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
… components

HTML: three new IHtmlTemplateSection implementations with table rendering in
HtmlTemplates. Sections registered in HTML_TEMPLATE_SECTIONS (static imports,
PATTERN-007). Markdown: generateAllPcfControls, generateAllServiceEndpoints,
and generateAllCopilotAgents methods; three new summary files emitted in the
ZIP export. JSON: pcfControls, serviceEndpoints, copilotAgents included.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
… pipeline and exports

Three new processor steps (6.14–6.16) appended to GENERATOR_STEPS.
BlueprintAccumulator, BlueprintGenerator, and core index updated to expose
all three new types end-to-end through the discovery-to-export pipeline.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
… for v1.2.0

Add types 66 (PCF Controls) and 95 (Service Endpoints) to the Strategy A
discovery table. Add bots/CopilotAgent as a Strategy B entry with a note on
the missing type code and try/catch requirement. Move PCF Controls, Service
Endpoints, and Copilot Agents from Planned to Supported in SUPPORTED_COMPONENTS.md.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Add DuplicateDetectionRule, SiteMap, SlaDefinition, Report, Chart, View,
Dialog, AiModel, and VirtualTableDataSource type interfaces. Extend
ComponentInventory, WorkflowInventory, BlueprintSummary, BlueprintResult,
and BlueprintAccumulator to carry the new arrays. Add WorkflowCategory.Dialog
and all 9 ComponentType codes. Wire into BlueprintGenerator and
SolutionComponentDiscovery inventory initializers.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…omponentDiscovery routing

Add IDiscoverer<T>-implementing discovery classes for DuplicateDetectionRule,
SiteMap, SlaDefinition, Report, Chart, View, Dialog, AiModel, and
VirtualTableDataSource. Update SolutionComponentDiscovery switch to route
all 9 new ComponentType codes, add dialogIds classification in classifyWorkflows,
and add Default Solution direct queries for all 9 types (with try/catch for
msdyn_aimodels and entitydatasources which may not exist in all environments).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Add processor functions and ProcessorStep registrations (steps 6.17–6.25)
for DuplicateDetectionRule, SiteMap, SlaDefinition, Report, Chart, View,
Dialog (reads workflowInventory.dialogIds, emits deprecation warning),
AiModel (double try/catch for missing table), and VirtualTableDataSource.
Export all 9 from processors/index.ts. Append all 9 steps to GENERATOR_STEPS.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…ent types

Add 9 HTML table methods to HtmlTemplates.ts and matching IHtmlTemplateSection
implementations. Add 9 generateAll* methods to MarkdownReporter with files.set
registrations. Add 9 arrays to JsonReporter.serializeResult; virtualTableDataSources
strips connectionDefinition key for defence-in-depth. Register all 9 new sections
in HTML_TEMPLATE_SECTIONS before SecuritySection.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…new component types

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
… for v1.3.0

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The msdyn_modelcreationcontext field may contain sensitive AI Builder
metadata. Strip it from the JSON export, consistent with the existing
VirtualTableDataSource.connectionDefinition redaction pattern.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Adds rawUrl field to FetchLogEntry and getRequestUrl callback to
AdaptiveBatchOptions. BusinessRuleDiscovery, FlowDiscovery and
PluginDiscovery now supply the full OData URL for each batch.
FetchDiagnosticsView shows rawUrl with a Copy URL button and
includes it as a column in the CSV export.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replaces the raw action-type Badge + field/value display with a single
natural-language sentence (e.g. "Show field: statuscode") in both the
React UI (BusinessRulesList) and the HTML export (HtmlTemplates).
Left-border colour-coding is retained as the sole visual cue.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…y names

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
… extract shared formatter

- Remove BusinessRuleDiscovery.enrichWithDisplayNames() which was making
  redundant queryMetadata calls for attribute display names already fetched
  by SchemaDiscovery and stored on EntityBlueprint.entity.Attributes.
- Restore discoverByIds() to a one-liner delegating to getBusinessRulesByIds().
- Add BlueprintGenerator.applyBusinessRuleFieldLabels() which builds the
  label map from already-fetched AttributeMetadata — zero additional API calls.
- Extract formatActionSentence() to src/core/utils/businessRuleFormatting.ts
  as a plain-text utility (DRY violation fix).
- Update BusinessRulesList.tsx to import the shared utility.
- Update HtmlTemplates.ts to use htmlEscape(formatActionSentence(a)) at both
  call sites and remove the now-redundant private method.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…type

AUDIT-004: replace inline style props with makeStyles classes in
BusinessRulesList (rowMeta) and FetchDiagnosticsView (summaryCount
colour variants via mergeClasses). Add missing JSX.Element return
type on FetchDiagnosticsView (learnings [2026-03-11]).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
… drop oversized AI model field

- PcfControlDiscovery: replace manual filter with buildOrFilter, add normalizeBatch
  on input ids, normalizeGuid in mapToPcfControl, add getRequestUrl, implement
  IDiscoverer<PcfControl> with discoverByIds delegating to getControlsByIds
- ServiceEndpointDiscovery: replace Pass 1 manual filter with buildOrFilter, add
  normalizeBatch on input ids, add getRequestUrl to Pass 1 withAdaptiveBatch,
  implement IDiscoverer<ServiceEndpoint> with discoverByIds delegating to
  getEndpointsByIds; Pass 2 unchanged
- AiModelDiscovery: remove msdyn_modelcreationcontext from $select and RawAiModel
  interface (causes HTTP 413 on large records; already redacted from exports),
  set modelCreationContext: null unconditionally, add getRequestUrl

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
… UI inline-style violations

PCF Controls: drop 'displayname' (not on customcontrol) — use 'name' for displayName
AI Models: drop 'msdyn_templateid' and 'msdyn_modelcreationcontext' — neither exists reliably
  across all environments; both already set to null downstream
Service Endpoints: fix Pass 2 step-count filter from '_serviceendpointid_value' to
  '_eventhandlerid_value' (correct OData lookup column on sdkmessageprocessingstep)
BusinessRulesList: replace all borderLeftColor inline styles with makeStyles classes via
  mergeClasses; replace getActionBorderColor with getActionItemClass; add parseErrorText class
FetchDiagnosticsView: move all remaining inline style objects to makeStyles; use mergeClasses
  for row class composition; single-source dropdownSmall/Medium, tdFilter, tdNowrap etc.
AiModelDiscovery: use AI_MODEL_SELECT.split(',') in query to keep select in sync with constant

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…S display for unconditional rules

Add OptionSet to SchemaDiscovery attribute expand — zero extra API calls, data comes from
already-fetched entity schema. Extend applyBusinessRuleFieldLabels in BlueprintGenerator to
build optionMap (field → numericValue → label) from OptionSet.Options and populate
Condition.valueLabel. UI and HTML export both show 'Label (numericValue)' when label is
available. BusinessRulesList now renders an 'ALWAYS' section header when a condition group
has no conditions instead of showing THEN/ELSE with no visible guard. HtmlTemplates updated
consistently; all option label strings pass through htmlEscape().

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The Entity Schema rows in Fetch Diagnostics had no rawUrl because they use a manual
logger.log() call rather than withAdaptiveBatch. Construct the URL from
client.getEnvironmentUrl() and the entity's LogicalName — diagnostic/display only,
entity.LogicalName is Dataverse-owned metadata not caller input.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…conditional group

When conditionGroups[0] has no conditions (ALWAYS), subsequent conditional groups were
incorrectly labeled 'ELSE IF'. Labels are now computed from priorConditionalCount — the
number of groups before the current one that actually have conditions. A conditional group
with no prior conditional siblings is always labeled 'IF', not 'ELSE IF'. Fixed in both
BusinessRulesList.tsx and HtmlTemplates.ts.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…ng utilities

Adds two new learnings entries:
- [2026-06-22] Never re-fetch attribute metadata already present on entityBlueprints[*].entity.Attributes
- [2026-06-22] Extract shared formatting helpers to src/core/utils/ instead of duplicating across React components and HTML reporters

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
OptionSet on AttributeMetadata is a navigation property in the Dataverse
Web API — including it in $select causes a 400 error that silently drops all
141 entity schema fetches, leaving every business rule with no field display
names or option set labels.

Changed the nested Attributes expand from:
  Attributes($select=...,IsManaged,OptionSet)
to:
  Attributes($select=...,IsManaged;$expand=OptionSet)

The semicolon separates $select from $expand within the nested expand options,
which is the correct OData syntax for navigation properties.

Closes #37

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…gnized conditions

Three improvements to BusinessRuleParser.parseClientDataXml():

1. Pattern B extended: now handles both == and === (strict equality) and
   both true and false values — e.g. if((v5)===(false)) — previously only
   == (true) was recognised.

2. Pattern D (new): null/undefined checks — handles if((vN) != null),
   !== null, == null, === null and the undefined equivalents. These appear
   in rules that check whether a field has a value before acting.

3. Placeholder fallback: when condExpr is non-empty but no pattern matched,
   a placeholder condition {field: '(condition)', operator: 'defined in rule —
   pattern not yet recognized'} is inserted instead of leaving conditions:[].
   This prevents the misleading "ALWAYS" label (which implies no condition
   exists) for rules whose compiled JS uses a pattern our parser does not yet
   handle. The same fallback applies in the else-if chain.

Refs #37

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…y schema fetches

The Dataverse metadata API does not support expanding navigation properties
within a nested collection expand. Both:
  Attributes($select=...,OptionSet)       [scalar — invalid, OptionSet is nav]
  Attributes($select=...;$expand=OptionSet) [nested nav expand — not supported]
caused a 400 error on every entity schema fetch (36/36 or 141/141 failures).

Removed OptionSet entirely from the Attributes expand. All scalar attribute
fields (DisplayName, AttributeType, RequiredLevel, etc.) continue to load
correctly, restoring field display names, ERD, and cross-entity automation.

OptionSet data for business rule condition labels requires a separate dedicated
query and will be addressed as a follow-up.

Refs #37

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
_eventhandlerid_value does not exist on sdkmessageprocessingstep in all
environments. The outer try/catch already handled the thrown exception
gracefully (stepCount defaults to 0), but withAdaptiveBatch was still
logging each retry attempt via the FetchLogger, producing a spurious
"1 API request(s) failed" warning in the diagnostics panel.

Removed logger from the Pass 2 withAdaptiveBatch options so that
environment-specific column absence fails silently, as intended.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Previously rawUrl was nested inside the Filter/Content cell, making it
hard to spot and compare across rows. Moved to its own URL column with:
- maxWidth 360px with word-break to handle long OData query strings
- "Copy" button (shortened from "Copy URL") for one-click clipboard copy
- "—" displayed for entries that do not yet have a rawUrl populated

Renamed makeStyles key rawUrl → rawUrlCell; added tdUrl style.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
sabrish and others added 21 commits June 22, 2026 22:19
…icated URL column

Adds environmentUrl option to withAdaptiveBatch so discovery classes
that do not provide getRequestUrl still log a base endpoint URL in the
fetch diagnostics panel. All 22 remaining discovery classes are updated.
Moves the URL out of the Filter/Content column into its own column with
an icon-only copy button (Copy16Regular).

Refs #41

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
… exports

Fetches PicklistAttributeMetadata separately (typed path, one call per
entity that has business rules) and maps numeric option-set values to
their user-localised labels. Labels are now surfaced in the UI card view,
HTML export (already used valueLabel), and the Markdown export (now uses
fieldLabel ?? field and valueLabel formatting for conditions and actions).

Closes #37

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Adds severity field to StepWarning ('error' | 'warning' | 'info').
DialogProcessor marks the deprecation notice as severity 'info'.
StepWarningsPanel splits entries by severity: errors/warnings render in
the existing red/yellow failure panel; info notices render in a separate
neutral 'Notices' panel with an Info24Regular icon. This prevents the
deprecated-dialog advisory from triggering the 'Some components could
not be loaded' error header.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…onditions in parser

Extends the JS condition parser with:
- Pattern A: now covers !== / == / != in addition to === for option-set
  and integer fields, enabling 'not equals' conditions to be recognised
- Pattern E (new): string-literal equality/inequality — (vN) OP ('value')
  handles text fields and lookup-type code comparisons
- Pattern F (new): compound conditions joined by && or || at the top
  level are split and each sub-expression parsed individually, so rules
  with multiple conditions are no longer shown as '(condition) defined
  in rule — pattern not yet recognized'
- parseSingleCond / splitAtTopLevelOps helpers extracted for readability

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…onentDiscovery

All logger.log() calls that bypass withAdaptiveBatch (solutioncomponents,
customapis/connectionreferences/connectors/bots objectid intersection,
buildSolutionComponentMap, and Default Solution Copilot Agents / Virtual
Table Data Sources / AI Models / Global Choices) now include:
  rawUrl: `${this.client.getEnvironmentUrl()}/api/data/v9.2/${entitySet}`
The logQuery inner helper also receives the URL, covering all Default Solution
component-type queries. Eliminates all '—' entries in the URL column for
the Solution Component Discovery step.

Refs #41

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- project.md: captures in-progress business rule parser work and pending issues #40, #42
- learnings.md: adds rule about direct logger.log() calls in SolutionComponentDiscovery bypassing withAdaptiveBatch environmentUrl option

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Emits a [PPSB:br-parser] console log (dev/opt-in only) whenever a
condition expression falls through to the "pattern not yet recognized"
placeholder — for both the main IF block and the else-if chain.
The log captures up to 300 chars of the raw condExpr so new patterns
can be identified from DevTools without touching production output.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1:N and N:1 relationship rows are now collapsible accordions — clicking
a row reveals its CascadeConfiguration (Delete, Merge, Assign, Share,
Reparent, Unshare) with colour-coded badges and plain-English descriptions,
matching the in-app RelationshipsView display. A Delete badge is shown
inline on each summary row as a quick-scan indicator.

M:N rows keep the existing flat table (no cascade config on N:N).

Closes #42

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…ibute

Wrap all cascadeBadgeClass() return values in htmlEscape() before
insertion into class= attributes, consistent with the rule that all
values passing through data-sourced inputs must be escaped even when
the return is a hardcoded constant. Caught by pre-commit review.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Developer again ran only pnpm typecheck && pnpm build without running
/pre-commit before committing. The review gate caught a MEDIUM finding
that required a follow-up fix commit. Adding escalation note to learnings.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…JS variants

Added patterns G/H/J for empty-string checks, blank triples, and string
contains/does-not-contain. Updated A/B/D/E to handle double-paren vars ((vN)).
Added stripOuterParens helper and a contains-data triple pre-check in
parseCondition. Removed temporary debugLog calls — all observed patterns handled.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…s names are code not data

cascadeBadgeClass() returns hardcoded switch-case constants (badge-error,
badge-warning, etc.), not user-supplied data. Wrapping them in htmlEscape()
was semantically incorrect. All Dataverse data values (cascade action strings,
schema names) remain escaped.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…Markdown export

Closes #42 — adds cascade configuration sub-tables (Delete/Assign/Reparent/
Share/Unshare/Merge) below 1:N and N:1 relationship tables, matching HTML and
JSON export parity. Refs #37 — renders parse error blockquote per business rule
when BusinessRuleParser sets a parseError, matching HTML export behaviour.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Adds optional referencingSolutions?: string[] to Flow, BusinessRule,
WebResource, EntityBlueprint, PluginStep, ClassicWorkflow,
BusinessProcessFlow, CustomAPI, EnvironmentVariable,
ConnectionReference, CanvasApp, CustomPage, and ModelDrivenApp.
Field is populated by a post-processing pass in BlueprintGenerator
for solution-scoped runs only (Issue #40).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
After BlueprintResult is assembled, resolves componentToSolutions map
entries into human-readable solution uniquenames and writes them onto
all component types (Flow, BusinessRule, Plugin, WebResource,
ClassicWorkflow, BPF, CustomAPI, EnvironmentVariable,
ConnectionReference, CanvasApp, CustomPage, ModelDrivenApp,
EntityBlueprint). Only runs for solution-scoped generations where
componentToSolutions is populated. Closes #40 (data layer).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Adds Solutions column to Flows, Plugins, Web Resources, and
  Classic Workflows flat tables via htmlSolutionBadges() helper
- Adds solution badges in the expanded accordion content for
  Business Rules
- Adds htmlSharedComponentsSection() to HtmlTemplates: groups all
  components with referencingSolutions.length > 1 by type and
  renders a table per type (Name | Shared Across)
- Adds SharedComponentsSection.ts to the HTML_TEMPLATE_SECTIONS
  registry; section only renders when shared components exist
  (Issue #40)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Adds Solutions column to generateAllFlows, generateAllPlugins,
  generateAllBusinessRules, and generateAllWebResources summary tables;
  value is comma-joined referencingSolutions (blank when empty)
- Adds private generateSharedComponentsSummary() — groups components
  with referencingSolutions.length > 1 by type; renders one table per
  type with Name | Solutions columns
- Calls generateSharedComponentsSummary() from generate() for
  solution-scoped runs; writes to summary/shared-components.md
  (Issue #40)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Add `this.scope.type === 'solution'` to the post-processing guard so intent
is explicit and the pass is defensive against future non-solution scope changes.
Closes #40.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Corrected user-guide.md to clarify that referencingSolutions is inline on
each component object (no root-level sharedComponents array). Updated
CHANGELOG [Unreleased] entry for #40 to reflect full implementation across
all 13 component types and all three export formats.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Finalise CHANGELOG [Unreleased] → [1.3.0] 2026-06-23. Covers new component
types, reverse solution lookup (#40), cascade configuration (#42), and
business rule parser improvements (#37).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
… string

CopilotAgentDiscovery and CustomConnectorDiscovery now implement IDiscoverer<T>
with discoverByIds() delegates. Replaced inline GUID formatting with
buildOrFilter() per PATTERN-002. Updated user-guide.md subtitle and JSON
example from v1.1.2 to v1.3.0.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings June 23, 2026 10:30

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

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 updates the blueprint generator to v1.3.0 by expanding discovery/export coverage for additional Dataverse component types, improving diagnostics (raw OData URL capture), and enhancing business rule display/label enrichment and UI rendering.

Changes:

  • Added discovery, processing, types, UI tabs, and HTML section rendering for multiple new component categories (e.g., PCF controls, service endpoints, Copilot agents, views/charts/reports, dialogs, AI models, virtual table data sources).
  • Added Fetch Log support for capturing/displaying a “Raw URL” per request (when available), plus UI improvements to diagnostics and warnings/notices presentation.
  • Enhanced business rule presentation (action sentence formatting; field/value label enrichment) and updated documentation/versioning for the v1.3.0 release.

Reviewed changes

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

Show a summary per file
File Description
SUPPORTED_COMPONENTS.md Updates supported component matrix; bumps “Last updated” line.
src/core/utils/withAdaptiveBatch.ts Adds raw URL support via getRequestUrl/environmentUrl to fetch logging.
src/core/utils/FetchLogger.ts Extends fetch log entry shape with optional rawUrl.
src/core/utils/businessRuleFormatting.ts Adds shared formatter for business rule action sentences.
src/core/types/virtualTableDataSource.ts Introduces VirtualTableDataSource type.
src/core/types/view.ts Introduces View type.
src/core/types/slaDefinition.ts Introduces SlaDefinition type and related enums.
src/core/types/siteMap.ts Introduces SiteMap type.
src/core/types/serviceEndpoint.ts Introduces ServiceEndpoint types and contract mapping.
src/core/types/report.ts Introduces Report type and report type enum.
src/core/types/pcfControl.ts Introduces PcfControl type.
src/core/types/modelDrivenApp.ts Adds optional referencingSolutions to model-driven apps.
src/core/types/environmentVariable.ts Adds optional referencingSolutions to environment variables.
src/core/types/duplicateDetectionRule.ts Introduces DuplicateDetectionRule type.
src/core/types/dialog.ts Introduces Dialog type.
src/core/types/customPage.ts Adds optional referencingSolutions to custom pages.
src/core/types/customApi.ts Adds optional referencingSolutions to custom APIs.
src/core/types/copilotAgent.ts Introduces CopilotAgent type and AgentKind.
src/core/types/connectionReference.ts Adds optional referencingSolutions to connection references.
src/core/types/components.ts Extends inventories and enums for new component types and workflow category.
src/core/types/classicWorkflow.ts Adds optional referencingSolutions to classic workflows.
src/core/types/chart.ts Introduces Chart type.
src/core/types/canvasApp.ts Adds optional referencingSolutions to canvas apps.
src/core/types/businessProcessFlow.ts Adds optional referencingSolutions to BPFs.
src/core/types/blueprint.ts Expands blueprint result to include new component arrays and summary counters; enriches BR condition/action metadata.
src/core/types/aiModel.ts Introduces AiModel type.
src/core/types.ts Adds optional referencingSolutions to plugin step type.
src/core/reporters/JsonReporter.ts Adds new component arrays to JSON export; attempts to redact sensitive fields.
src/core/reporters/html/sections/VirtualTableDataSourcesSection.ts Adds HTML section for virtual table data sources.
src/core/reporters/html/sections/ViewsSection.ts Adds HTML section for views.
src/core/reporters/html/sections/SlaDefinitionsSection.ts Adds HTML section for SLA definitions.
src/core/reporters/html/sections/SiteMapsSection.ts Adds HTML section for site maps.
src/core/reporters/html/sections/SharedComponentsSection.ts Adds HTML “Shared Components” section gate/rendering.
src/core/reporters/html/sections/ServiceEndpointsSection.ts Adds HTML section for service endpoints.
src/core/reporters/html/sections/ReportsSection.ts Adds HTML section for reports.
src/core/reporters/html/sections/PcfControlsSection.ts Adds HTML section for PCF controls.
src/core/reporters/html/sections/index.ts Registers new HTML sections and adds shared components section.
src/core/reporters/html/sections/DuplicateDetectionRulesSection.ts Adds HTML section for duplicate detection rules.
src/core/reporters/html/sections/DialogsSection.ts Adds HTML section for dialogs.
src/core/reporters/html/sections/CopilotAgentsSection.ts Adds HTML section for Copilot agents.
src/core/reporters/html/sections/ChartsSection.ts Adds HTML section for charts.
src/core/reporters/html/sections/AiModelsSection.ts Adds HTML section for AI models.
src/core/index.ts Re-exports newly added core types.
src/core/generators/processors/VirtualTableDataSourceProcessor.ts Adds processor for virtual table data sources.
src/core/generators/processors/ViewProcessor.ts Adds processor for views.
src/core/generators/processors/SlaDefinitionProcessor.ts Adds processor for SLA definitions.
src/core/generators/processors/SiteMapProcessor.ts Adds processor for site maps.
src/core/generators/processors/ServiceEndpointProcessor.ts Adds processor for service endpoints.
src/core/generators/processors/ReportProcessor.ts Adds processor for reports.
src/core/generators/processors/ProcessorStep.ts Extends accumulator to hold new component arrays.
src/core/generators/processors/PcfControlProcessor.ts Adds processor for PCF controls.
src/core/generators/processors/index.ts Exports newly added processors.
src/core/generators/processors/generatorSteps.ts Registers new processor steps in the generator pipeline.
src/core/generators/processors/DuplicateDetectionRuleProcessor.ts Adds processor for duplicate detection rules.
src/core/generators/processors/DialogProcessor.ts Adds processor for dialogs (including info notice).
src/core/generators/processors/CopilotAgentProcessor.ts Adds processor for Copilot agents.
src/core/generators/processors/ChartProcessor.ts Adds processor for charts.
src/core/generators/processors/AiModelProcessor.ts Adds processor for AI models.
src/core/generators/BlueprintGenerator.ts Adds summary counters, includes new result arrays, enriches BR labels, and annotates referencingSolutions (partial coverage).
src/core/discovery/WebResourceDiscovery.ts Adds environmentUrl so fetch log can build raw URL.
src/core/discovery/VirtualTableDataSourceDiscovery.ts Adds discovery for entitydatasources with credential-safe redaction.
src/core/discovery/ViewDiscovery.ts Adds discovery for savedqueries (views).
src/core/discovery/SlaDefinitionDiscovery.ts Adds discovery for slas (SLA definitions).
src/core/discovery/SiteMapDiscovery.ts Adds discovery for sitemaps.
src/core/discovery/ServiceEndpointDiscovery.ts Adds discovery for serviceendpoints and step-count enrichment.
src/core/discovery/SecurityRoleDiscovery.ts Adds environmentUrl for raw URL fallback.
src/core/discovery/ReportDiscovery.ts Adds discovery for reports.
src/core/discovery/PluginDiscovery.ts Adds getRequestUrl for more precise raw URL logging.
src/core/discovery/PcfControlDiscovery.ts Adds discovery for customcontrols with request URL logging.
src/core/discovery/GlobalChoiceDiscovery.ts Adds environmentUrl for raw URL fallback.
src/core/discovery/FormDiscovery.ts Adds environmentUrl for raw URL fallback.
src/core/discovery/FlowDiscovery.ts Adds getRequestUrl for workflow fetch calls.
src/core/discovery/FieldSecurityProfileDiscovery.ts Adds environmentUrl for raw URL fallback.
src/core/discovery/EnvironmentVariableDiscovery.ts Adds environmentUrl for raw URL fallback.
src/core/discovery/DuplicateDetectionRuleDiscovery.ts Adds discovery for duplicaterules.
src/core/discovery/DialogDiscovery.ts Adds discovery for dialogs via workflows.
src/core/discovery/CustomConnectorDiscovery.ts Implements IDiscoverer and uses buildOrFilter, adds environmentUrl.
src/core/discovery/CustomAPIDiscovery.ts Adds environmentUrl for raw URL fallback.
src/core/discovery/CopilotAgentDiscovery.ts Adds discovery for bots + botcomponents counts.
src/core/discovery/ConnectionReferenceDiscovery.ts Adds environmentUrl for raw URL fallback.
src/core/discovery/ClassicWorkflowDiscovery.ts Adds environmentUrl for raw URL fallback.
src/core/discovery/ChartDiscovery.ts Adds discovery for savedqueryvisualizations (charts).
src/core/discovery/BusinessRuleDiscovery.ts Implements async discoverByIds and adds getRequestUrl for BR fetch calls.
src/core/discovery/BusinessProcessFlowDiscovery.ts Adds environmentUrl for raw URL fallback.
src/core/discovery/AppDiscovery.ts Adds environmentUrl for raw URL fallback.
src/core/discovery/AiModelDiscovery.ts Adds discovery for msdyn_aimodels with safe field exclusion and request URL logging.
src/components/VirtualTableDataSourcesList.tsx Adds UI list/detail view for virtual table data sources.
src/components/ViewsList.tsx Adds UI list/detail view for views with type filters.
src/components/SlaDefinitionsList.tsx Adds UI list/detail view for SLA definitions.
src/components/SiteMapsList.tsx Adds UI list/detail view for site maps.
src/components/ServiceEndpointsList.tsx Adds UI list/detail view for service endpoints.
src/components/results/StepWarningsPanel.tsx Splits “issues” vs “notices” and adds info-styled panel.
src/components/ReportsList.tsx Adds UI list/detail view for reports.
src/components/PcfControlsList.tsx Adds UI list/detail view for PCF controls.
src/components/FetchDiagnosticsView.tsx Adds “Raw URL” column, copy button, and UI refactors for fetch log.
src/components/DuplicateDetectionRulesList.tsx Adds UI list/detail view for duplicate detection rules.
src/components/DialogsList.tsx Adds UI list/detail view for dialogs with deprecation notice.
src/components/CopilotAgentsList.tsx Adds UI list/detail view for Copilot agents.
src/components/ComponentTabRegistry.tsx Registers new tabs for the added component types.
src/components/componentIcons.ts Adds icons for new component tabs/types.
src/components/ChartsList.tsx Adds UI list/detail view for charts.
src/components/BusinessRulesList.tsx Uses shared action formatting and shows field/value labels in conditions/actions; adjusts IF/ELSE IF labeling.
src/components/AiModelsList.tsx Adds UI list/detail view for AI models.
package.json Bumps package version to 1.3.0.
docs/user-guide.md Updates version references and adds details about new output features (needs corrections per comments).
docs/architecture.md Documents referencingSolutions and export enhancements.
COMPONENT_TYPES_REFERENCE.md Extends component type reference for new types and workflows/dialogs.
CHANGELOG.md Adds v1.3.0 changelog entry.
.claude/memory/project.md Updates internal project state/version notes (needs corrections per comments).
.claude/memory/learnings.md Adds internal learnings entries related to discovery orchestration, formatting utilities, logging, and pre-commit practices.

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

Comment thread src/core/reporters/JsonReporter.ts Outdated
Comment on lines +92 to +95
// modelCreationContext may contain sensitive AI Builder metadata — strip from JSON export
aiModels: result.aiModels.map(a => ({ ...a, modelCreationContext: undefined })),
// connectionDefinition is always null in VirtualTableDataSource — explicitly strip the key for safety
virtualTableDataSources: result.virtualTableDataSources.map(v => ({ ...v, connectionDefinition: undefined })),
Comment on lines +83 to +87
const resolveUrl = (batch: TId[]): string | undefined => {
if (getRequestUrl) return getRequestUrl(batch);
if (environmentUrl && entitySet) return `${environmentUrl}/api/data/v9.2/${entitySet}`;
return undefined;
};
Comment thread docs/user-guide.md Outdated
Comment thread docs/user-guide.md Outdated
Comment on lines +571 to +575
"sharedComponents": [
{
"type": "Flow",
"name": "OrderNotificationFlow",
"solutions": ["SalesAutomation", "ServicePortal"]
Comment thread docs/user-guide.md Outdated
Comment thread SUPPORTED_COMPONENTS.md

---
*Last updated: v1.1.0 — 2026-03-12*
*Last updated: v1.3.0 — 2026-04-12*
Comment on lines +428 to +432
// Annotate referencingSolutions on all components (solution-scoped runs only)
if (this.scope.type === 'solution' && this.solutions.length > 0 && inventory.componentToSolutions.size > 0) {
const solutionIdToName = new Map(
this.solutions.map(s => [normalizeGuid(s.solutionid), s.uniquename])
);
Comment thread .claude/memory/project.md Outdated
## Current Version

**v1.1.2** (pending git release 2026-03-17) — patch: cross-entity chain map redesign (trigger operation column, message code support), debug logging cleanup
**v1.3.0** (pending release 2026-06-23) — minor: 9 new component types, reverse solution lookup (#40), cascade configuration in exports (#42), business rule parser improvements (#37)
- JsonReporter: strip modelCreationContext/connectionDefinition via
  destructuring so keys are absent from JSON output, not null
- withAdaptiveBatch: guard fallback rawUrl against display-label entitySet
  values (spaces/parens); only build URL for plain OData entity set names
- Add referencingSolutions to all 12 new component type interfaces
  (pcfControl, serviceEndpoint, copilotAgent, aiModel, chart, view,
  siteMap, slaDefinition, dialog, report, virtualTableDataSource,
  duplicateDetectionRule) and extend BlueprintGenerator post-processing
  pass to annotate them
- user-guide.md: fix two "New in v1.1.2" labels to v1.3.0; remove
  incorrect root-level sharedComponents from JSON example
- project.md: correct "9 new component types" to 12

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@sabrish
sabrish requested a review from Copilot June 23, 2026 11:18
@sabrish
sabrish merged commit ba60a0d into main Jun 23, 2026
1 check passed
@sabrish
sabrish deleted the feat/new-component-types branch June 23, 2026 11:33
@sabrish
sabrish removed the request for review from Copilot June 23, 2026 11:40
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