diff --git a/.config/dotnet-tools.json b/.config/dotnet-tools.json index 0bea08b..df50bc2 100644 --- a/.config/dotnet-tools.json +++ b/.config/dotnet-tools.json @@ -24,7 +24,7 @@ "rollForward": false }, "demaconsulting.reqstream": { - "version": "1.10.0", + "version": "1.11.0", "commands": [ "reqstream" ], diff --git a/docs/reqstream/quality.yaml b/docs/reqstream/quality.yaml new file mode 100644 index 0000000..b2e65ed --- /dev/null +++ b/docs/reqstream/quality.yaml @@ -0,0 +1,58 @@ +--- +# Quality/process requirements grouping SysML2Workbench's use of off-the-shelf (OTS) +# UI frameworks, testing tools, and in-house library dependencies. These requirements +# exist so that OTS-derived requirements (which describe capabilities the desktop +# application relies on from third-party or sibling-repository components, not +# user-visible SysML2Workbench functionality) are not reported as orphans by +# `dotnet reqstream --requirements requirements.yaml --enforce`. +sections: + - title: 'Quality Requirements' + requirements: + - id: 'SysML2Workbench-Quality-TestInfrastructure' + title: 'The repository shall rely on xUnit and Appium to execute and verify automated test evidence.' + tags: [quality] + justification: | + Automated testing depends on xUnit's execution/reporting capabilities and + Appium's end-to-end desktop UI automation. This grouping requirement links + those OTS requirements to the quality root so they participate in orphan + detection without being falsely reported as disconnected from + SysML2Workbench functionality. + children: + - 'XUnit-ExecuteAutomatedVerification' + - 'XUnit-ProvideTraceableTestEvidence' + - 'Appium-DriveDesktopApplicationEndToEnd' + - 'Appium-LocateControlsByAutomationId' + + - id: 'SysML2Workbench-Quality-DesktopShell' + title: 'The application shall rely on Avalonia and AvaloniaEdit to host the cross-platform desktop UI shell and syntax-highlighted text views.' + tags: [quality] + justification: | + The desktop shell, diagram surface, and context-menu interactions depend on + Avalonia's cross-platform UI hosting, and read-only syntax-highlighted + SysML text views depend on AvaloniaEdit. This grouping requirement links + those OTS requirements to the quality root so they participate in orphan + detection without being falsely reported as disconnected from + SysML2Workbench functionality. + children: + - 'Avalonia-HostDesktopShell' + - 'Avalonia-HostInteractiveDiagramSurface' + - 'Avalonia-CopyDiagramAsSysmlViaContextMenu' + - 'AvaloniaEdit-RenderReadOnlySyntaxHighlightedText' + - 'AvaloniaEdit-LoadEmbeddedSysmlHighlighting' + + - id: 'SysML2Workbench-Quality-ModelingEngine' + title: 'The application shall rely on the DemaConsulting.SysML2Tools and DemaConsulting.Rendering libraries to load workspaces, resolve impact, and render diagrams.' + tags: [quality] + justification: | + Workspace loading, view-layout generation, and connection-aware impact + analysis depend on the SysML2Tools library, and SVG diagram output depends + on the Rendering library preserving diagram primitives. This grouping + requirement links those OTS requirements to the quality root so they + participate in orphan detection without being falsely reported as + disconnected from SysML2Workbench functionality. + children: + - 'SysML2Tools-LoadWorkspaceModels' + - 'SysML2Tools-GenerateViewLayouts' + - 'SysML2Tools-ConnectionAwareImpactAnalysis' + - 'Rendering-ProduceSvgOutput' + - 'Rendering-PreserveDiagramPrimitives' diff --git a/docs/reqstream/sysml2-workbench.yaml b/docs/reqstream/sysml2-workbench.yaml index 8f5019e..4f05258 100644 --- a/docs/reqstream/sysml2-workbench.yaml +++ b/docs/reqstream/sysml2-workbench.yaml @@ -4,20 +4,24 @@ sections: requirements: - id: 'SysML2Workbench-ManageWorkspace' title: 'The SysML2Workbench shall open a folder as a live workspace, discover SysML model files, resolve imports, and refresh loaded content when workspace files change.' + tags: [system] justification: | Phase 0 is centered on local multi-file model viewing rather than single-file inspection, so users need the desktop application to mirror the SysML2Tools CLI workspace model and stay current with external edits. children: - 'SysML2Workbench-WorkspaceSubsystem-ManageWorkspace' - 'SysML2Workbench-WorkspaceSubsystem-RefreshWorkspaceState' + - 'SysML2Workbench-AppShellSubsystem-PresentWorkspaceSources' tests: - 'OpenWorkspace_LoadsAndRefreshesWorkspace' - id: 'SysML2Workbench-BrowsePredefinedViews' title: 'The SysML2Workbench shall let users browse supported predefined SysML views from the loaded model and render the selected view in the desktop shell.' + tags: [system] justification: | A core value of the application is turning existing model-defined views into an interactive desktop experience without requiring the command-line renderer. children: - 'SysML2Workbench-ViewCatalogSubsystem-EnumeratePredefinedViews' + - 'SysML2Workbench-ViewCatalogSubsystem-SignalActiveViewSelection' - 'SysML2Workbench-LayoutRenderingSubsystem-RenderSelectedView' - 'SysML2Workbench-AppShellSubsystem-PresentSelectedView' tests: @@ -25,6 +29,7 @@ sections: - id: 'SysML2Workbench-AuthorCustomViews' title: 'The SysML2Workbench shall let users build ad hoc custom views, preview them, and export equivalent SysML view text for promotion into model files.' + tags: [system] justification: | The architecture explicitly adds GUI-driven custom view authoring while avoiding a tool-specific persistence format by exporting standard SysML text. children: @@ -37,22 +42,39 @@ sections: - id: 'SysML2Workbench-PresentWorkspaceDiagnostics' title: 'The SysML2Workbench shall collect parser and reference-resolution diagnostics for the whole workspace and present them in a dedicated diagnostics panel.' + tags: [system] justification: | Users need a consolidated view of workspace problems so they can understand model load failures and broken references without manually inspecting every file. children: - 'SysML2Workbench-WorkspaceSubsystem-AggregateWorkspaceDiagnostics' - 'SysML2Workbench-DiagnosticsPanelSubsystem-DisplayWorkspaceDiagnostics' + - 'SysML2Workbench-DiagnosticsPanelSubsystem-RefreshDisplayedDiagnostics' tests: - 'OpenWorkspace_ShowsWorkspaceDiagnostics' - id: 'SysML2Workbench-OperateAsDesktopShell' title: 'The SysML2Workbench shall provide a cross-platform desktop shell with local rolling logs for navigating workspaces, rendered diagrams, and diagnostics during a user session.' + tags: [system] justification: | The product is a desktop application, so it must provide the shell and operational logging needed for day-to-day use and user-attachable bug reports. children: - 'SysML2Workbench-LoggingSubsystem-PersistOperationalEvents' + - 'SysML2Workbench-LoggingSubsystem-RetainRecentLogHistory' - 'SysML2Workbench-AppShellSubsystem-CoordinateSessionWorkspace' - 'SysML2Workbench-AppShellSubsystem-DefaultSidebarPanel' - 'SysML2Workbench-AppShellSubsystem-ShowActiveDocumentStatus' + - 'SysML2Workbench-AppShellSubsystem-PresentAboutDialog' tests: - 'StartSession_OpensShellAndWritesOperationalLogs' + + - id: 'SysML2Workbench-QueryWorkspaceModel' + title: 'The SysML2Workbench shall let users interactively query the loaded workspace model - listing declarations or running any element-scoped SysML2Tools query verb - from the desktop shell, and copy the rendered result to the clipboard.' + tags: [system] + justification: | + Beyond browsing predefined views, users need to interrogate the model's structure and relationships (uses, used-by, dependencies, impact, hierarchy, and similar queries already offered by the SysML2Tools CLI) without leaving the desktop application. + children: + - 'SysML2Workbench-AppShellSubsystem-HostQueryWorkflow' + - 'SysML2Workbench-ElementPickerSubsystem-ProvideReusablePicker' + - 'SysML2Workbench-ElementPickerSubsystem-DecoupleFromWorkspace' + tests: + - 'QueryDialog_SelectDescribeAndCopyAsMarkdown_PlacesRenderedMarkdownOnClipboard' diff --git a/docs/reqstream/sysml2-workbench/app-shell-subsystem.yaml b/docs/reqstream/sysml2-workbench/app-shell-subsystem.yaml index da762ec..8f78ef7 100644 --- a/docs/reqstream/sysml2-workbench/app-shell-subsystem.yaml +++ b/docs/reqstream/sysml2-workbench/app-shell-subsystem.yaml @@ -31,12 +31,62 @@ sections: - 'SysML2Workbench-AppShellSubsystem-MainWindowShell-ArrangePrimaryRegions' - 'SysML2Workbench-AppShellSubsystem-MainWindowShell-SynchronizeSessionState' - 'SysML2Workbench-AppShellSubsystem-MainWindowShell-RenderCustomViewPreviewWithoutMutatingTabs' + - 'SysML2Workbench-AppShellSubsystem-MainWindowShell-ExportTabAsSysml' - 'SysML2Workbench-AppShellSubsystem-ViewBuilderDialog-LiveUpdatePreviewOnEveryEdit' - 'SysML2Workbench-AppShellSubsystem-ViewBuilderDialog-CommitCreatesNewDiagramTab' - 'SysML2Workbench-AppShellSubsystem-ViewBuilderDialog-CancelDiscardsWithoutSideEffects' + - 'SysML2Workbench-AppShellSubsystem-ViewBuilderDialog-RefreshExposeTargetsFromWorkspace' + - 'SysML2Workbench-AppShellSubsystem-ViewBuilderDialog-ManageExposeTargets' + - 'SysML2Workbench-AppShellSubsystem-ViewBuilderDialog-FreshInstancePerOpen' + - 'SysML2Workbench-AppShellSubsystem-ViewBuilderDialog-FilterExposeTargetsByTypeAndText' tests: - 'CustomViewWorkflow_PreviewsAndExportsFromShell' + - id: 'SysML2Workbench-AppShellSubsystem-PresentWorkspaceSources' + title: 'The AppShellSubsystem shall let users add, remove, and browse individual file and folder workspace sources - including opening a source''s underlying files - from a dedicated workspace panel, and shall support closing every source at once.' + justification: | + A workspace is built up incrementally from an arbitrary combination of files and folders rather than a single root, so the shell must expose source-management commands and a visual inventory of the resulting tree, plus a one-action way to reset back to empty. + children: + - 'SysML2Workbench-AppShellSubsystem-MainWindowShell-ManageMultipleSources' + - 'SysML2Workbench-AppShellSubsystem-MainWindowShell-SupportEmptyWorkspace' + - 'SysML2Workbench-AppShellSubsystem-MainWindowShell-CloseAllSources' + - 'SysML2Workbench-AppShellSubsystem-MainWindowShell-OpenSourceTextTab' + - 'SysML2Workbench-AppShellSubsystem-WorkspacePanel-BuildSourceTree' + - 'SysML2Workbench-AppShellSubsystem-WorkspacePanel-ReflectDedupeInTreeShape' + - 'SysML2Workbench-AppShellSubsystem-WorkspacePanel-RefreshOnSourcesChanged' + - 'SysML2Workbench-AppShellSubsystem-WorkspacePanel-WireAddRemoveCommands' + - 'SysML2Workbench-AppShellSubsystem-WorkspacePanel-ResolveOpenableFile' + tests: + - 'AddFolderSourceAsync_SecondDistinctFolder_IsAdditiveAndWatchesBothSources' + - 'RebuildTree_FolderSource_ProducesSourceNodeWithFileChildren' + + - id: 'SysML2Workbench-AppShellSubsystem-HostQueryWorkflow' + title: 'The AppShellSubsystem shall provide a Query menu dialog that lets users list workspace declarations or run any element-scoped SysML2Tools query against a selected element, see results update live with no explicit "Run" gesture, and copy the rendered result to the clipboard.' + justification: | + Interactively querying the loaded model (list, describe, uses, used-by, dependencies, impact, hierarchy, requirements, interface, connections, states) without leaving the desktop shell is a distinct, user-visible capability that reuses the shared ElementPickerSubsystem control and the DemaConsulting.SysML2Tools query engine. + children: + - 'SysML2Workbench-AppShellSubsystem-QueryDialog-RefreshPickersFromWorkspace' + - 'SysML2Workbench-AppShellSubsystem-QueryDialog-BrowseTabIsClientSideList' + - 'SysML2Workbench-AppShellSubsystem-QueryDialog-ElementQueryDispatchesThroughEngine' + - 'SysML2Workbench-AppShellSubsystem-QueryDialog-ConnectionAwareImpact' + - 'SysML2Workbench-AppShellSubsystem-QueryDialog-SurfaceTraversalMetadata' + - 'SysML2Workbench-AppShellSubsystem-QueryDialog-HandleFailuresGracefully' + - 'SysML2Workbench-AppShellSubsystem-QueryDialog-CopyResultToClipboard' + - 'SysML2Workbench-AppShellSubsystem-QueryDialog-EndToEndFromMenu' + tests: + - 'QueryDialog_SelectDescribeAndCopyAsMarkdown_PlacesRenderedMarkdownOnClipboard' + + - id: 'SysML2Workbench-AppShellSubsystem-PresentAboutDialog' + title: 'The AppShellSubsystem shall present an About dialog, opened from the main window, that shows application identity information and lists the key third-party dependencies the desktop application relies on.' + justification: | + Users and support staff need a discoverable, in-app way to confirm which application version and key dependencies are running without inspecting build artifacts. + children: + - 'SysML2Workbench-AppShellSubsystem-AboutDialog-ExposeApplicationInfo' + - 'SysML2Workbench-AppShellSubsystem-AboutDialog-ListKeyDependencies' + tests: + - 'Construction_ExposesApplicationNameAndTagline' + - 'Construction_ExposesDependencyList_ContainsExpectedEntries' + - id: 'SysML2Workbench-AppShellSubsystem-DefaultSidebarPanel' title: 'The AppShellSubsystem shall present the workspace panel as the sidebar panel shown by default when the application starts, ahead of the predefined-views panel in the same sidebar.' justification: | diff --git a/docs/reqstream/sysml2-workbench/element-picker-subsystem.yaml b/docs/reqstream/sysml2-workbench/element-picker-subsystem.yaml index 6b25e42..9485a31 100644 --- a/docs/reqstream/sysml2-workbench/element-picker-subsystem.yaml +++ b/docs/reqstream/sysml2-workbench/element-picker-subsystem.yaml @@ -16,6 +16,13 @@ sections: children: - 'SysML2Workbench-ElementPickerSubsystem-ElementPicker-AcceptCallerBuiltCandidates' - 'SysML2Workbench-ElementPickerSubsystem-ElementPicker-FilterByTypeAndText' + - 'SysML2Workbench-ElementPickerSubsystem-ElementPicker-ManageChipsWithoutDuplicates' + - 'SysML2Workbench-ElementPickerSubsystem-ElementPicker-TrackSelection' + - 'SysML2Workbench-ElementPickerSubsystem-ElementPicker-LabelKnownNodeKinds' + - 'SysML2Workbench-ElementPickerSubsystem-ElementFilter-AcceptCallerBuiltCandidates' + - 'SysML2Workbench-ElementPickerSubsystem-ElementFilter-FilterByTypeAndText' + - 'SysML2Workbench-ElementPickerSubsystem-ElementFilter-ManageChipsWithoutDuplicates' + - 'SysML2Workbench-ElementPickerSubsystem-ElementFilter-SearchAndCommitAddableTypeFilter' tests: - 'ElementPickerViewModel_SetCandidates_AvailableTypeLabels_IsDistinctAndSorted' diff --git a/docs/reqstream/sysml2-workbench/layout-rendering-subsystem.yaml b/docs/reqstream/sysml2-workbench/layout-rendering-subsystem.yaml index c272453..fd4cbcb 100644 --- a/docs/reqstream/sysml2-workbench/layout-rendering-subsystem.yaml +++ b/docs/reqstream/sysml2-workbench/layout-rendering-subsystem.yaml @@ -11,6 +11,7 @@ sections: children: - 'SysML2Workbench-LayoutRenderingSubsystem-LayoutInvoker-BuildPredefinedViewLayout' - 'SysML2Workbench-LayoutRenderingSubsystem-SvgCanvasHost-DisplayRenderedSvg' + - 'SysML2Workbench-LayoutRenderingSubsystem-SvgCanvasHost-ClearStaleDiagram' tests: - 'RenderPredefinedView_DisplaysSvgDiagram' diff --git a/docs/reqstream/sysml2-workbench/platform-requirements.yaml b/docs/reqstream/sysml2-workbench/platform-requirements.yaml index cb753fc..3f4004b 100644 --- a/docs/reqstream/sysml2-workbench/platform-requirements.yaml +++ b/docs/reqstream/sysml2-workbench/platform-requirements.yaml @@ -6,6 +6,7 @@ sections: requirements: - id: 'SysML2Workbench-Platform-Windows' title: 'The SysML2Workbench shall run as a desktop application on Windows operating systems.' + tags: [system] justification: | Windows is an explicitly supported desktop target for the shared Avalonia shell and must be verifiable independently from other operating systems. tests: @@ -13,6 +14,7 @@ sections: - id: 'SysML2Workbench-Platform-Ubuntu' title: 'The SysML2Workbench shall run as a desktop application on Ubuntu Linux operating systems.' + tags: [system] justification: | Linux desktop support is part of the project scope, and Ubuntu-based validation provides explicit evidence for that platform family. tests: @@ -20,6 +22,7 @@ sections: - id: 'SysML2Workbench-Platform-MacOS' title: 'The SysML2Workbench shall run as a desktop application on macOS operating systems.' + tags: [system] justification: | macOS is one of the intended desktop targets for the Avalonia-based application and requires platform-specific verification evidence. tests: @@ -27,6 +30,7 @@ sections: - id: 'SysML2Workbench-Platform-DotNet9' title: 'The SysML2Workbench shall support the .NET 9.0 runtime.' + tags: [system] justification: | The project is expected to run on modern .NET desktop runtimes, and explicit runtime requirements keep compatibility evidence separate from operating-system support evidence. tests: diff --git a/docs/reqstream/sysml2-workbench/view-builder-subsystem.yaml b/docs/reqstream/sysml2-workbench/view-builder-subsystem.yaml index 6d51401..5bcd3ce 100644 --- a/docs/reqstream/sysml2-workbench/view-builder-subsystem.yaml +++ b/docs/reqstream/sysml2-workbench/view-builder-subsystem.yaml @@ -13,6 +13,7 @@ sections: - 'SysML2Workbench-ViewBuilderSubsystem-ViewDefinitionModel-StoreExposeTargets' - 'SysML2Workbench-ViewBuilderSubsystem-ViewDefinitionModel-StoreExposeRecursionAndFilter' - 'SysML2Workbench-ViewBuilderSubsystem-ViewDefinitionModel-ReportDefinitionReadiness' + - 'SysML2Workbench-ViewBuilderSubsystem-ViewDefinitionModel-AddExposeTargetSelectionDirectly' tests: - 'EditDefinition_TracksCustomViewInputs' diff --git a/docs/reqstream/sysml2-workbench/view-catalog-subsystem.yaml b/docs/reqstream/sysml2-workbench/view-catalog-subsystem.yaml index 155aa8e..7196f70 100644 --- a/docs/reqstream/sysml2-workbench/view-catalog-subsystem.yaml +++ b/docs/reqstream/sysml2-workbench/view-catalog-subsystem.yaml @@ -20,5 +20,6 @@ sections: Selecting a predefined view is the handoff point between view discovery and actual diagram rendering. children: - 'SysML2Workbench-ViewCatalogSubsystem-ViewCatalogPresenter-TrackSelectedView' + - 'SysML2Workbench-ViewCatalogSubsystem-ViewCatalogPresenter-BuildViewDefinitionFromWorkspaceView' tests: - 'SelectView_PublishesActiveSelection' diff --git a/docs/reqstream/sysml2-workbench/workspace-subsystem.yaml b/docs/reqstream/sysml2-workbench/workspace-subsystem.yaml index e40e1ec..a3937ee 100644 --- a/docs/reqstream/sysml2-workbench/workspace-subsystem.yaml +++ b/docs/reqstream/sysml2-workbench/workspace-subsystem.yaml @@ -11,6 +11,13 @@ sections: children: - 'SysML2Workbench-WorkspaceSubsystem-WorkspaceModel-MaintainWorkspaceTree' - 'SysML2Workbench-WorkspaceSubsystem-WorkspaceModel-ResolveWorkspaceInputs' + - 'SysML2Workbench-WorkspaceSubsystem-WorkspaceModel-SupportEmptyResolution' + - 'SysML2Workbench-WorkspaceSubsystem-WorkspaceSourceSet-MaintainOrderedSources' + - 'SysML2Workbench-WorkspaceSubsystem-WorkspaceSourceSet-RemoveSource' + - 'SysML2Workbench-WorkspaceSubsystem-WorkspaceSourceSet-ClearSources' + - 'SysML2Workbench-WorkspaceSubsystem-WorkspaceSourceSet-ResolveEmptySet' + - 'SysML2Workbench-WorkspaceSubsystem-WorkspaceSourceSet-DiscoverFolderFiles' + - 'SysML2Workbench-WorkspaceSubsystem-WorkspaceSourceSet-DedupeOverlap' tests: - 'OpenWorkspace_BuildsWorkspaceState' @@ -24,6 +31,9 @@ sections: - 'SysML2Workbench-WorkspaceSubsystem-WorkspaceModel-TrackPerFileLoadState' - 'SysML2Workbench-WorkspaceSubsystem-DiagnosticsAggregator-CollectWorkspaceDiagnostics' - 'SysML2Workbench-WorkspaceSubsystem-DiagnosticsAggregator-PublishDeterministicDiagnostics' + - 'SysML2Workbench-WorkspaceSubsystem-FileWatcher-WatchPerSourceScope' + - 'SysML2Workbench-WorkspaceSubsystem-FileWatcher-UnwatchSource' + - 'SysML2Workbench-WorkspaceSubsystem-FileWatcher-RequireWatchBeforeQueue' tests: - 'ExternalChange_RefreshesWorkspaceState' diff --git a/requirements.yaml b/requirements.yaml index 12c37ce..ebcb4c3 100644 --- a/requirements.yaml +++ b/requirements.yaml @@ -1,5 +1,10 @@ --- +# root-tags: requirements carrying any of these tags are treated as traceability roots. +# `dotnet reqstream --requirements requirements.yaml --enforce` reports any requirement +# that does not trace (via parent/child links) to a root-tagged requirement as orphaned. +root-tags: [system, quality] includes: + - docs/reqstream/quality.yaml - docs/reqstream/sysml2-workbench.yaml - docs/reqstream/sysml2-workbench/platform-requirements.yaml - docs/reqstream/sysml2-workbench/workspace-subsystem.yaml