Skip to content

chore(config): release v0.3.0#117

Merged
q-soriarty merged 19 commits intomainfrom
release/0.3.0
Feb 14, 2026
Merged

chore(config): release v0.3.0#117
q-soriarty merged 19 commits intomainfrom
release/0.3.0

Conversation

@q-soriarty
Copy link
Copy Markdown
Collaborator

Release v0.3.0 — Architecture Skeleton & Beckhoff ADS Integration

Highlights

  • Full architecture skeleton for all 4 .NET modules (backend, build server, monitor server, shared)
  • Frontend feature-based architecture with Keycloak auth
  • Direct Beckhoff ADS integration replacing custom MQTT relay
  • 6 test projects, root solution, architecture documentation

See CHANGELOG.md for full details.

🤖 Generated with Claude Code

q-soriarty and others added 19 commits February 14, 2026 13:06
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…106)

* fix(ci): pin cla action version and remove npm cache from commitlint

Pin contributor-assistant/github-action to v2.6.1 — the bare v2 major
version tag does not exist. Remove cache: 'npm' from commitlint workflow
since package-lock.json is gitignored and commitlint is installed
globally. Add 'ci' to allowed scope-enum in commitlintrc.

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

* chore(ci): trigger ci rerun with updated pr title

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

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Disable subject-case: lower-case rule — acronyms like DTO, MQTT,
TwinCAT, CLAUDE.md are unavoidable in commit subjects and cause
false positives. Add ci scope to CLAUDE.md.

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Cherry-pick from hotfix/fix-cla-signatures-branch.
The main branch is protected, so CLA action cannot commit
signatures/cla.json there. Use develop instead.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Cherry-pick from hotfix/cla-signatures-branch.
Both main and develop are protected, so CLA action needs
a dedicated unprotected branch for signature storage.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* docs: add architecture design documents for all modules

Add BUILD_SERVER_DESIGN.md covering Beckhoff Automation Interface
patterns, pipeline architecture, COM interop constraints, and code
generation strategy. Add MODULE_ARCHITECTURE.md covering project
structure, dependency graphs, and technology choices per module.
Update ARCHITECTURE.md with cross-references to new design documents.

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

* ci: trigger CLA re-check

* ci: trigger CLA re-check

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* feat(config): add shared DTO library with models, enums, and MQTT topics

Create FlowForge.Shared class library containing DTOs for Flow,
Build, Deploy, Project, Target, Auth, and Monitor domains. Add
enums for Permission and ProjectRole. Add type-safe MQTT topic
builders.

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

* ci: trigger CLA re-check

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* feat(frontend): add feature-based arch with auth, layout, modules

Add feature-based folder structure with auth (Keycloak), layout, and
feature modules (editor, projects, build, deploy, targets, monitoring,
admin). Configure React Flow, Zustand, React Query, and SignalR hooks.

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

* ci: trigger commitlint re-check

* ci: trigger CLA re-check

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* feat(config): add shared DTO library with models, enums, and MQTT topics

Create FlowForge.Shared class library containing DTOs for Flow,
Build, Deploy, Project, Target, Auth, and Monitor domains. Add
enums for Permission and ProjectRole. Add type-safe MQTT topic
builders.

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

* feat(backend): add clean architecture layers

Introduce Application and Infrastructure projects following
Clean Architecture Lite pattern with service/repository interfaces,
EF Core, and external integration stubs.

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

* ci: trigger commitlint re-check

* ci: trigger CLA re-check

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* feat(config): add shared DTO library with models, enums, and MQTT topics

Create FlowForge.Shared class library containing DTOs for Flow,
Build, Deploy, Project, Target, Auth, and Monitor domains. Add
enums for Permission and ProjectRole. Add type-safe MQTT topic
builders.

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

* feat(build-server): add pipeline and TwinCAT facades

Add build pipeline with sequential step architecture,
INodeTranslator strategy for code generation, and
IVisualStudioInstance / IAutomationInterface COM facades.

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

* ci: trigger commitlint re-check

* ci: trigger CLA re-check

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
#102)

* feat(config): add shared DTO library with models, enums, and MQTT topics

Create FlowForge.Shared class library containing DTOs for Flow,
Build, Deploy, Project, Target, Auth, and Monitor domains. Add
enums for Permission and ProjectRole. Add type-safe MQTT topic
builders.

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

* feat(monitor-server): add typed hub interface, auth, and service layer

Add monitor server architecture:
- Hubs/IPlcDataHubClient — typed SignalR client interface
- Auth/TokenValidator — short-lived HMAC token validation
- Services/IMqttAdsClient + MqttAdsClient — ADS over MQTT interface
- Services/SubscriptionManager — per-connection subscription tracking

Add Shared project reference. Update solution to include Shared.

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

* ci: trigger CLA re-check

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* test: add test projects and root solution for all modules

Create 6 xUnit test projects with NSubstitute + FluentAssertions covering
Shared, Backend.Api, Backend.Application, Backend.Infrastructure,
BuildServer, and MonitorServer. Add root FlowForge.sln with solution
folders. Defer x86 platform target on BuildServer until COM references
are added.

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

* ci: trigger CLA re-check

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* docs(config): update CLAUDE.md and CHANGELOG.md

Update CLAUDE.md with new project structure (Shared, Clean Architecture,
pipeline pattern, test projects, root solution) and add build/test
commands. Add architecture skeleton entries to CHANGELOG.md [Unreleased].

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

* ci: trigger commitlint re-check

* ci: trigger CLA re-check

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Cherry-pick from hotfix/cla-allowlist-owner.
Org members should not need to sign the CLA on every PR.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…113)

Add PlcAdsState enum, PlcStateDto, AdsConnectionInfo, and
AdsVariableSubscription to FlowForge.Shared for use across monitor and
build server without requiring Beckhoff NuGet dependencies. Update
PlcTargetDto with CurrentState and DeployRequestDto with AdsPort.
Create doc/ADS_INTEGRATION.md documenting the decision to use direct
Beckhoff.TwinCAT.Ads instead of custom MQTT ADS relay topics.

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* feat(config): add shared ADS types and integration architecture doc

Add PlcAdsState enum, PlcStateDto, AdsConnectionInfo, and
AdsVariableSubscription to FlowForge.Shared for use across monitor and
build server without requiring Beckhoff NuGet dependencies. Update
PlcTargetDto with CurrentState and DeployRequestDto with AdsPort.
Create doc/ADS_INTEGRATION.md documenting the decision to use direct
Beckhoff.TwinCAT.Ads instead of custom MQTT ADS relay topics.

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

* feat(monitor-server): add direct Beckhoff ADS client

Replace IMqttAdsClient/MqttAdsClient with IAdsClient/AdsClientWrapper
using Beckhoff.TwinCAT.Ads + TcpRouter for direct ADS-over-TCP from
Linux Docker containers. Add batch read (Sum Commands), PLC state read,
and ADS notification subscription to the interface. Update PlcDataHub to
use IAdsClient with SubscriptionManager. Add ADS connection config
(TargetHostname, AdsPort, AdsTcpPort) to MonitorOptions.

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

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* feat(config): add shared ADS types and integration architecture doc

Add PlcAdsState enum, PlcStateDto, AdsConnectionInfo, and
AdsVariableSubscription to FlowForge.Shared for use across monitor and
build server without requiring Beckhoff NuGet dependencies. Update
PlcTargetDto with CurrentState and DeployRequestDto with AdsPort.
Create doc/ADS_INTEGRATION.md documenting the decision to use direct
Beckhoff.TwinCAT.Ads instead of custom MQTT ADS relay topics.

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

* feat(build-server): add ADS deploy client for direct PLC activation

Add IAdsDeployClient/AdsDeployClient using Beckhoff.TwinCAT.Ads for
deploy-time ADS operations (state read, config mode switch, restart).
Update DeployStep with IAdsDeployClient + IAutomationInterface injection
and documented deploy sequence. Add TargetConnectionInfo to BuildContext.
Clarify MqttHandler is for FlowForge internal messaging only.

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

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* feat(config): add shared ADS types and integration architecture doc

Add PlcAdsState enum, PlcStateDto, AdsConnectionInfo, and
AdsVariableSubscription to FlowForge.Shared for use across monitor and
build server without requiring Beckhoff NuGet dependencies. Update
PlcTargetDto with CurrentState and DeployRequestDto with AdsPort.
Create doc/ADS_INTEGRATION.md documenting the decision to use direct
Beckhoff.TwinCAT.Ads instead of custom MQTT ADS relay topics.

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

* feat(build-server): add ADS deploy client for direct PLC activation

Add IAdsDeployClient/AdsDeployClient using Beckhoff.TwinCAT.Ads for
deploy-time ADS operations (state read, config mode switch, restart).
Update DeployStep with IAdsDeployClient + IAutomationInterface injection
and documented deploy sequence. Add TargetConnectionInfo to BuildContext.
Clarify MqttHandler is for FlowForge internal messaging only.

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

* feat(monitor-server): add direct Beckhoff ADS client

Replace IMqttAdsClient/MqttAdsClient with IAdsClient/AdsClientWrapper
using Beckhoff.TwinCAT.Ads + TcpRouter for direct ADS-over-TCP from
Linux Docker containers. Add batch read (Sum Commands), PLC state read,
and ADS notification subscription to the interface. Update PlcDataHub to
use IAdsClient with SubscriptionManager. Add ADS connection config
(TargetHostname, AdsPort, AdsTcpPort) to MonitorOptions.

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

* refactor(config): remove ADS MQTT topics, add service stubs

Remove AdsRead/AdsWrite/AdsNotification MQTT topics — ADS communication
now uses Beckhoff.TwinCAT.Ads directly. Add DeployStatus topic for
deploy progress. Update DeployService with IMqttService dependency and
TODO stubs for deploy request/approval/status. Add TODO stubs to
TargetService for target listing, deploy lock, and permission checks.
Create BUILD_SERVER_DESIGN.md and MODULE_ARCHITECTURE.md. Update
ARCHITECTURE.md to reflect ADS-direct architecture throughout.

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

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@q-soriarty q-soriarty merged commit 4afe6e3 into main Feb 14, 2026
1 of 2 checks passed
@github-actions github-actions bot locked and limited conversation to collaborators Feb 14, 2026
@q-soriarty q-soriarty deleted the release/0.3.0 branch February 14, 2026 14:52
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant