Project WatchfulAnvil DeveloperExchange - rpapub/WatchfulAnvil GitHub Wiki
Important
LLMs can generate code, but they canโt validate it. Vibe-coded workflows need deterministic, explainable, and enforceable static analysis to ensure quality, safety, and governance. Watchful Anvil delivers exactly that.
Why Vibe-Coded Code Still Needs Static Code Analysis โ
-
shift left: balance the needs of developers and governance
- transfer from other static code analysis tools into LowCode
- education and shining example
- after test-driven-development my next logical step is static code analysis:
- teastability requires good code @see:slides UiPath Community event #77
- good code requires static code analysis
- great static code analysis requires custom rules
- and, given the importance of units in the testing pyramid #10, must target units of work with specific rules
Fork the repository and receive:
- monorepo with scripts, build pipelines, and documentation (v1.0)
- created with the rule developer in mind
Contributions or in-house fork: Suited for annual targets.
WatchfulAnvil, like a UiPath Studio library, contributing to RPA Development and Operations, is best pictured having its own lifecycle.
GitHub front and center, with:
- Discussions
- Issues
- Kanban board
-
Wiki
- Knowledgebase articles Index
- Issue Template
- rule documentation links in repository wiki (e.g. Rule-Documentation-HWR-SAMPLE-001)
-
GitHub Actions
- Build:
- dlls for
net461
,net6.0
,net8.0
- nupkg
- installer (v1.0)
- dlls for
- Publish:
- GitHub Releases
- MyGet feeds
- Build:
Overcoming the sparse documentation:
-
Development How to Explore the UiPath Activities Api SDK using Visual Studio
-
Rule code to log avtivities into a file
19:13:19 | RootContainer: Main 19:13:19 | ActivityRule: Multiple Assign 19:13:19 | ActivityTap: DisplayName=Ignored Activities, Type=ActivityModel, Children=1, Vars=0, Props=2, Args=0, Toolbox=Sequence, SupportsRefs=False, HasId=True, Annotation=, UiPathActivityTypeId= 19:13:19 | ActivityTap: DisplayName=Assign, Type=ActivityModel, Children=0, Vars=0, Props=2, Args=2, Toolbox=Assign, SupportsRefs=False, HasId=True, Annotation=, UiPathActivityTypeId= 19:13:19 | ActivityPropertyExpr: DisplayName=DisplayName, Expression=Process\Process.xaml - Invoke Workflow File 19:13:19 | ActivityTap: DisplayName=Teardown, Type=ActivityModel, Children=1, Vars=0, Props=2, Args=0, Toolbox=Sequence, SupportsRefs=False, HasId=True, Annotation=, UiPathActivityTypeId= 19:13:19 | ParentActivity: Sequence 19:13:19 | InvalidArgumentName: Name=result, Type=OutArgument(njl:JObject), Reason=Must start with out_, Annotation= 19:13:19 | RootContainer: Main 19:13:19 | ParentActivity: Sequence 19:13:19 | ActivityTap: DisplayName=If global variabl errorType, Type=IfElseModel, Children=2, Vars=0, Props=2, Args=1, Toolbox=If, SupportsRefs=False, HasId=True, Annotation=, UiPathActivityTypeId= 19:13:19 | ActivityTap: DisplayName=Then, Type=ActivityModel, Children=1, Vars=0, Props=2, Args=0, Toolbox=Sequence, SupportsRefs=False, HasId=True, Annotation=, UiPathActivityTypeId= 19:13:19 | ActivityTap: DisplayName=Multiple Assign, Type=ActivityModel, Children=3, Vars=0, Props=2, Args=0, Toolbox=MultipleAssign, SupportsRefs=False, HasId=True, Annotation=, UiPathActivityTypeId= 19:13:19 | ActivityTap: DisplayName=, Type=ActivityModel, Children=0, Vars=0, Props=2, Args=2, Toolbox=AssignOperation, SupportsRefs=False, HasId=True, Annotation=, UiPathActivityTypeId= 19:13:19 | ActivityArguments: 19:13:19 | ActivityArguments: Names=[Out:To variable, In:Set value] | Details=[Out:To variable:0, Culture=neutral, PublicKeyToken=null; In:Set value:0, Culture=neutral, PublicKeyToken=null] 19:13:19 | ActivityPropertyExpr: DisplayName=Id, Expression=InvokeWorkflowFile_1 19:13:19 | ActivityArguments: 19:13:19 | RootContainer: Main
-
XAML parsing and annotations
- provide metadata about the workflow: Die the developer intend tis workflow to be a unit, a module, or something else?
- in my personal styleguide units-of-work have a argument guideline that differs from modules, and the rule can check for that
-
project.json deserialization
- provide access to outputType, name and dependencies
-
advanced build scripts:
- dynamically add "developer dependencies" to project.json
This repo, ready to fork, makes any reverse engineering of low-resolution YouTube videos unnecessary.
- @ignore Support for my custom naming rule
- inspection techniques for hashtag#UiPath workflows via custom Workflow Analyzer rules
- ๐ฏ Why I'm thinking about inline suppression for hashtag#UiPath hashtag#WorkflowAnalyzer rules
- ๐ Pushing the Boundaries of UiPath Workflow Analyzer
- Exploring hashtag#UiPath Studio Workflow Analyzer Custom Rules -- with Purpose
- ๐จ Vibe Coding Requires Smarter RPA Tooling
- ๐ค Working on the Future of AI-Driven Automation Governance
Follow or connect with me linkedin.com/in/cprima/
You want to participate? Great! Fork, build, raise issues, and contribute!
You have an opinion or question? Open a GitHub Discussion or comment on existing one.
Want to follow the project? Star the repository WatchfulAnvil, engage with the Issues or comment on LinkedIn posts.