Skip to content

fix: Update .NET tool usage#1973

Merged
DaveSkender merged 16 commits intov3from
fix-dotnet-tools
Feb 22, 2026
Merged

fix: Update .NET tool usage#1973
DaveSkender merged 16 commits intov3from
fix-dotnet-tools

Conversation

@DaveSkender
Copy link
Owner

No description provided.

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Feb 22, 2026

Note

Reviews paused

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Replaces explicit global .NET tool installs across multiple GitHub Actions workflows and VS Code tasks with manifest-based dotnet tool restore and invokes tools via dotnet tool run (including GitVersion). Updates .coderabbit.yaml path_filters by removing broad Jekyll/vendor/Gemfile.lock exclusions and adding targeted exclusions for test data, generated code, Office documents, backups, and archives. Adds dotnet tool restore and dotnet restore setup instructions to CONTRIBUTING.md. Includes miscellaneous non-API edits (docs, pragma suppressions, using cleanup, small logic and test formatting changes).

Possibly related PRs

  • PR 1969: Switches provisioning to dotnet tool restore and updates CI/tool invocations to use dotnet tool run.
  • PR 1974: Overlaps changes to GitHub workflows, VS Code tasks, and docs by replacing global tool installs with dotnet tool restore/dotnet tool run.
  • PR 1610: Modifies CI workflows to replace direct GitVersion and .NET tool calls with manifest restore and dotnet tool run invocations.

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@DaveSkender DaveSkender temporarily deployed to stockindicators.dev February 22, 2026 19:40 — with GitHub Actions Inactive
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
.github/workflows/copilot-setup-steps.yml (1)

67-67: ⚠️ Potential issue | 🟡 Minor

dotnet tool list --global reports the wrong tool count after migrating to local restore

After dotnet tool restore, tools are installed locally (not globally). --global queries the global tool store, which is unrelated and will typically return 0 for the restored tools. Use dotnet tool list (defaults to local) instead.

🛠️ Proposed fix
-          echo "- .NET Tools: $(dotnet tool list --global | wc -l) installed" >> $GITHUB_STEP_SUMMARY
+          echo "- .NET Tools: $(dotnet tool list | wc -l) installed" >> $GITHUB_STEP_SUMMARY
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/copilot-setup-steps.yml at line 67, The workflow currently
uses the global query "dotnet tool list --global" which reports the wrong count
after running "dotnet tool restore" because restored tools are local; replace
the command invocation "dotnet tool list --global" with "dotnet tool list" so it
queries the local manifest-installed tools (keep the rest of the echo and
summary append logic unchanged and run this after "dotnet tool restore"
completes).
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In @.coderabbit.yaml:
- Line 128: The glob pattern "!*.g.cs" only matches generated files in the repo
root; update the pattern to use a recursive glob so generated files in
subdirectories are excluded—replace "!*.g.cs" with "!**/*.g.cs" (matching the
adjacent "**/" style) to ensure .g.cs files under src/, obj/ and other nested
directories are properly ignored.

In @.github/workflows/test-indicators.yml:
- Around line 84-85: The workflow installs tools with the "Install .NET tools"
step using dotnet tool restore but later calls the bare roslynator analyze
command which won't be on PATH after a local restore; change the workflow to
either (A) invoke the tool via dotnet tool run roslynator analyze wherever
roslynator analyze is used, or (B) after dotnet tool restore add the local tool
folder to PATH (e.g., export PATH="$PATH:./.config/dotnet/tools" or
./dotnet/tools as appropriate) so roslynator analyze can be found; update all
occurrences (the Install .NET tools step and subsequent roslynator analyze
invocations) accordingly and remove the ||/continue-on-error masking if you want
failures to surface.

---

Outside diff comments:
In @.github/workflows/copilot-setup-steps.yml:
- Line 67: The workflow currently uses the global query "dotnet tool list
--global" which reports the wrong count after running "dotnet tool restore"
because restored tools are local; replace the command invocation "dotnet tool
list --global" with "dotnet tool list" so it queries the local
manifest-installed tools (keep the rest of the echo and summary append logic
unchanged and run this after "dotnet tool restore" completes).

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Signed-off-by: Dave Skender <[email protected]>
@DaveSkender DaveSkender temporarily deployed to stockindicators.dev February 22, 2026 19:59 — with GitHub Actions Inactive
@DaveSkender DaveSkender temporarily deployed to stockindicators.dev February 22, 2026 20:04 — with GitHub Actions Inactive
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In @.vscode/tasks.json:
- Line 141: The task currently runs "dotnet restore && dotnet restore
docs/Examples && dotnet tool run dotnet-outdated --exclude FluentAssertions",
which will fail on a fresh clone because local tools aren't restored; either
make the task self-contained by prepending "dotnet tool restore &&" before
"dotnet tool run dotnet-outdated --exclude FluentAssertions", or remove the
"dotnet tool run dotnet-outdated" invocation from the task labeled "Restore
NuGet packages for solution" and instead place that tool-run step into the
existing "Inspect: .NET packages" task so restoration and inspection are
separated.

@DaveSkender DaveSkender temporarily deployed to stockindicators.dev February 22, 2026 20:23 — with GitHub Actions Inactive
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (2)
.agents/skills/code-completion/SKILL.md (1)

226-226: "Last updated" date is stale.

Line 226 still reads January 2, 2026; consider bumping it to reflect today's changes.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.agents/skills/code-completion/SKILL.md at line 226, Update the stale "Last
updated: January 2, 2026" line in SKILL.md to the current date by replacing the
exact string "Last updated: January 2, 2026" with "Last updated: February 22,
2026".
tests/README.md (1)

92-108: LGTM — dotnet tool run invocations are correct.

Both blocks correctly switch to the manifest-based invocation and pass consistent options. The prerequisite dotnet tool restore (documented in docs/CONTRIBUTING.md) is not referenced here, which could trip up developers landing on this README directly without having read the contributing guide. A brief forward-reference would help.

📝 Optional: add a `dotnet tool restore` prerequisite note
+> [!NOTE]
+> Run `dotnet tool restore` once before using the commands below.
+
 To run Roslynator analysis:
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@tests/README.md` around lines 92 - 108, Add a short prerequisite note before
the two roslynator code blocks stating that developers should run "dotnet tool
restore" (or restore global/manifest tools) first and reference
docs/CONTRIBUTING.md; update the README.md near the "dotnet tool run roslynator
analyze" and "dotnet tool run roslynator fix" blocks to include a one-line
forward-reference to that prerequisite so users who land on this page know to
restore tools before invoking the commands.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In @.agents/skills/code-completion/SKILL.md:
- Line 60: The quick reference table entry for the Roslynator fix command must
include the same verbosity flag as the individual checks; update the
quick-reference row so it matches the full command "dotnet tool run roslynator
fix --properties TargetFramework=net10.0 --severity-level info --verbosity
normal" (i.e., add "--verbosity normal" to the table entry) so both locations
are identical.

---

Nitpick comments:
In @.agents/skills/code-completion/SKILL.md:
- Line 226: Update the stale "Last updated: January 2, 2026" line in SKILL.md to
the current date by replacing the exact string "Last updated: January 2, 2026"
with "Last updated: February 22, 2026".

In `@tests/README.md`:
- Around line 92-108: Add a short prerequisite note before the two roslynator
code blocks stating that developers should run "dotnet tool restore" (or restore
global/manifest tools) first and reference docs/CONTRIBUTING.md; update the
README.md near the "dotnet tool run roslynator analyze" and "dotnet tool run
roslynator fix" blocks to include a one-line forward-reference to that
prerequisite so users who land on this page know to restore tools before
invoking the commands.

@DaveSkender DaveSkender temporarily deployed to stockindicators.dev February 22, 2026 20:31 — with GitHub Actions Inactive
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Duplicate comments:
In @.vscode/tasks.json:
- Around line 147-149: The task command that runs "dotnet restore && dotnet
restore docs/Examples && dotnet tool run dotnet-outdated --exclude
FluentAssertions" now correctly declares dependsOn "Install: .NET tools", so
ensure the dependsOn entry remains (it guarantees dotnet tool restore runs
before dotnet tool run), no further code changes required—keep the dependsOn:
"Install: .NET tools" and dependsOrder: "sequence" intact for the task.

Signed-off-by: Dave Skender <[email protected]>
@DaveSkender DaveSkender temporarily deployed to stockindicators.dev February 22, 2026 21:09 — with GitHub Actions Inactive
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/s-z/Stoch/Stoch.BufferList.cs (1)

46-46: ⚠️ Potential issue | 🟡 Minor

Pre-existing bug: Name uses hardcoded literals instead of constructor parameters.

STOCH({14}, {3}, {3}, {3}, {2}, {MaType.SMA}) always emits the default values regardless of the arguments passed to the constructor. new StochList(5, 2, 1) would report STOCH(14, 3, 3, 3, 2, SMA).

🐛 Proposed fix
-        Name = $"STOCH({14}, {3}, {3}, {3}, {2}, {MaType.SMA})";
+        Name = $"STOCH({lookbackPeriods}, {signalPeriods}, {smoothPeriods}, {kFactor}, {dFactor}, {movingAverageType})";
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/s-z/Stoch/Stoch.BufferList.cs` at line 46, The Name property is using
hardcoded literals instead of the instance’s constructor values; update the
assignment of Name in StochList (currently set to $"STOCH({14}, {3}, {3}, {3},
{2}, {MaType.SMA})") to interpolate the actual instance fields or constructor
parameters (the values passed into the StochList constructor) — e.g. use the
internal fields that store the indicator settings (periods/smoothing/signal and
the maType field) so Name reflects those variables (for example:
$"STOCH({kPeriod}, {dPeriod}, {kSmooth}, {dSmooth}, {signalPeriod}, {maType})").
Ensure you reference the same field names used to initialize the object rather
than literals and keep MaType printed from the instance’s maType field.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@docs/examples/UseQuoteApi/Program.cs`:
- Around line 72-75: The null check for the sequence is after calling
results.Any(), which can throw if results is null; change the condition in the
guard so you test for null first (e.g., results == null || !results.Any())
before throwing the InvalidOperationException in this block where results is
produced (from ToSma or related call).

---

Outside diff comments:
In `@src/s-z/Stoch/Stoch.BufferList.cs`:
- Line 46: The Name property is using hardcoded literals instead of the
instance’s constructor values; update the assignment of Name in StochList
(currently set to $"STOCH({14}, {3}, {3}, {3}, {2}, {MaType.SMA})") to
interpolate the actual instance fields or constructor parameters (the values
passed into the StochList constructor) — e.g. use the internal fields that store
the indicator settings (periods/smoothing/signal and the maType field) so Name
reflects those variables (for example: $"STOCH({kPeriod}, {dPeriod}, {kSmooth},
{dSmooth}, {signalPeriod}, {maType})"). Ensure you reference the same field
names used to initialize the object rather than literals and keep MaType printed
from the instance’s maType field.

---

Duplicate comments:
In @.agents/skills/code-completion/SKILL.md:
- Line 60: The quick reference table is missing the --verbosity normal flag
causing an inconsistency with the example command; update the quick reference
table entry (the table row around the earlier mention) to include "--verbosity
normal" so it matches the example "dotnet tool run roslynator fix --properties
TargetFramework=net10.0 --severity-level hidden --verbosity normal" and verify
both occurrences of "--verbosity normal" are identical text-wise in SKILL.md
(search for that flag and the table header "quick reference" to locate the exact
row to edit).

@DaveSkender DaveSkender temporarily deployed to stockindicators.dev February 22, 2026 21:24 — with GitHub Actions Inactive
@DaveSkender DaveSkender temporarily deployed to stockindicators.dev February 22, 2026 21:30 — with GitHub Actions Inactive
@DaveSkender DaveSkender changed the title fix: Update gitversion.tool configuration fix: Update .NET tool usage Feb 22, 2026
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (2)
src/_common/QuotePart/QuotePart.Utilities.cs (1)

95-97: Unnecessary allocation for reference-type T — add a covariant fast-path

The new Cast<IReusable>().ToList() fixes a real latent bug: the old direct cast (IReadOnlyList<IReusable>)items would have thrown InvalidCastException when T is a value type (covariance only applies to reference types). However, it now pays an O(n) heap allocation unconditionally, even for the far more common reference-type path where the runtime already satisfies IReadOnlyList<IReusable> through covariance.

A pattern-match gives you the zero-allocation fast path for reference types while keeping the safe LINQ fallback for value types:

♻️ Proposed fix: covariant fast-path + value-type fallback
-            : items
-                .Cast<IReusable>()
-                .ToList();
+            : items is IReadOnlyList<IReusable> reusables
+                ? reusables
+                : items.Cast<IReusable>().ToList();

As per coding guidelines, unnecessary allocations should be avoided in indicator code.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/_common/QuotePart/QuotePart.Utilities.cs` around lines 95 - 97, In
QuotePart.Utilities.cs replace the unconditional allocation by adding a
covariant fast-path: check whether the existing items variable already
implements IReadOnlyList<IReusable> (pattern-match or "as" + null check) and if
so reuse that reference, otherwise fall back to the current
Cast<IReusable>().ToList() path; target the expression that produces the
IReadOnlyList<IReusable> (the code using items.Cast<IReusable>().ToList()) so
value-type T still uses the safe LINQ fallback while reference-type sequences
avoid the extra O(n) allocation.
tools/performance/Perf.ManualTestDirect.cs (1)

135-135: Consider annotating the type-anchor arms to prevent accidental removal.

The residual (object) casts on these three arms ("ZIGZAG" in Series, "WMA" in Buffer and StreamHub) are the only thing that keeps each switch expression well-typed as object. Removing any of them without adding a replacement anchor will cause a CS0173 compile error. A short comment documents the intent.

♻️ Suggested annotation
-            "ZIGZAG" => (object)Quotes.ToZigZag(),
+            "ZIGZAG" => (object)Quotes.ToZigZag(),  // type anchor: keeps switch expr typed as object
-            "WMA" => (object)Quotes.ToWmaList(14),
+            "WMA" => (object)Quotes.ToWmaList(14),  // type anchor: keeps switch expr typed as object
-            "WMA" => (object)quoteHub.ToWmaHub(14).Results,
+            "WMA" => (object)quoteHub.ToWmaHub(14).Results,  // type anchor: keeps switch expr typed as object

Also applies to: 219-219, 307-307

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@tools/performance/Perf.ManualTestDirect.cs` at line 135, The
switch-expression arms that currently use a residual cast to object (e.g. the
"ZIGZAG" arm using (object)Quotes.ToZigZag(), and the "WMA" arms in Buffer and
StreamHub) should be explicitly annotated so future editors don't remove the
cast and break typing; update each of those arms to either keep the explicit
(object) cast and add a short inline comment like "// type-anchor: object" or
replace the cast with an explicit comment-only anchor (e.g. append "/*
type-anchor: object */") so the switch expression remains well-typed as object
(refer to the "ZIGZAG" arm and the "WMA" arms in Buffer and StreamHub to locate
the spots).
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@src/_common/QuotePart/QuotePart.Utilities.cs`:
- Around line 95-97: In QuotePart.Utilities.cs replace the unconditional
allocation by adding a covariant fast-path: check whether the existing items
variable already implements IReadOnlyList<IReusable> (pattern-match or "as" +
null check) and if so reuse that reference, otherwise fall back to the current
Cast<IReusable>().ToList() path; target the expression that produces the
IReadOnlyList<IReusable> (the code using items.Cast<IReusable>().ToList()) so
value-type T still uses the safe LINQ fallback while reference-type sequences
avoid the extra O(n) allocation.

In `@tools/performance/Perf.ManualTestDirect.cs`:
- Line 135: The switch-expression arms that currently use a residual cast to
object (e.g. the "ZIGZAG" arm using (object)Quotes.ToZigZag(), and the "WMA"
arms in Buffer and StreamHub) should be explicitly annotated so future editors
don't remove the cast and break typing; update each of those arms to either keep
the explicit (object) cast and add a short inline comment like "// type-anchor:
object" or replace the cast with an explicit comment-only anchor (e.g. append
"/* type-anchor: object */") so the switch expression remains well-typed as
object (refer to the "ZIGZAG" arm and the "WMA" arms in Buffer and StreamHub to
locate the spots).

@DaveSkender DaveSkender temporarily deployed to stockindicators.dev February 22, 2026 22:01 — with GitHub Actions Inactive
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@tools/performance/Perf.ManualTestDirect.cs`:
- Line 244: Update the two implicit calls to use the explicit period parameter
to match the existing explicit call: change the call to Quotes.ToDonchian to
pass 20 (reference: Quotes.ToDonchian) and change the call to
Quotes.ToDonchianList to pass 20 (reference: Quotes.ToDonchianList) so all three
implementations (Quotes.ToDonchian(20), Quotes.ToDonchianList(20),
quoteHub.ToDonchianHub(20).Results) consistently use an explicit lookback period
of 20.
- Around line 189-190: The RENKO-ATR benchmarks are incorrectly using the
fixed-brick overloads ToRenko(14), ToRenkoHub(14) and ToRenkoList(14m) instead
of the ATR-based variant; update the Series benchmark to call ToRenkoAtr(14)
(the ATR-based method) and remove the RENKO-ATR entries for Buffer and StreamHub
(since BufferList and StreamHub have no ToRenkoAtrList/ToRenkoAtrHub
implementations), ensuring you replace the Series use of ToRenko(14) with
ToRenkoAtr(14) and delete the RENKO-ATR lines that call ToRenkoList(14m) and
ToRenkoHub(14).

@DaveSkender
Copy link
Owner Author

@coderabbitai pause

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Feb 22, 2026

✅ Actions performed

Reviews paused.

@DaveSkender DaveSkender temporarily deployed to stockindicators.dev February 22, 2026 22:28 — with GitHub Actions Inactive
@DaveSkender DaveSkender merged commit 9bc638d into v3 Feb 22, 2026
16 checks passed
@DaveSkender DaveSkender deleted the fix-dotnet-tools branch February 22, 2026 22:37
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Development

Successfully merging this pull request may close these issues.

1 participant