Scaffold
codewithmukesh/dotnet-claude-kit
Architecture-aware feature scaffolding for .NET 10 projects.
Uphold the design contract of the Nice3point.Revit.Toolkit runtime library, that wraps the raw Revit add-in API.
$ npx skills add Nice3point/RevitToolkit --skill revit-toolkit-internals -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install Nice3point/RevitToolkit revit-toolkit-internals --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/Nice3point/RevitToolkit.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/revit-toolkit-internals .claude/skills/revit-toolkit-internals && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "revit-toolkit-internals" agent skill from https://github.com/Nice3point/RevitToolkit/tree/main/.agents/skills/revit-toolkit-internals into .claude/skills/revit-toolkit-internals/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "revit-toolkit-internals", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/Nice3point/RevitToolkit/tree/main/.agents/skills/revit-toolkit-internalsType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add Nice3point/RevitToolkit --skill revit-toolkit-internals -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install Nice3point/RevitToolkit revit-toolkit-internals --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Nice3point/RevitToolkit.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/revit-toolkit-internals .agents/skills/revit-toolkit-internals && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "revit-toolkit-internals" agent skill from https://github.com/Nice3point/RevitToolkit/tree/main/.agents/skills/revit-toolkit-internals into .agents/skills/revit-toolkit-internals/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "revit-toolkit-internals", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add Nice3point/RevitToolkit --skill revit-toolkit-internals -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install Nice3point/RevitToolkit revit-toolkit-internals --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Nice3point/RevitToolkit.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/revit-toolkit-internals .cursor/skills/revit-toolkit-internals && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "revit-toolkit-internals" agent skill from https://github.com/Nice3point/RevitToolkit/tree/main/.agents/skills/revit-toolkit-internals into .cursor/skills/revit-toolkit-internals/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "revit-toolkit-internals", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/Nice3point/RevitToolkit.git --path .agents/skills/revit-toolkit-internals--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add Nice3point/RevitToolkit --skill revit-toolkit-internals -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install Nice3point/RevitToolkit revit-toolkit-internals --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Nice3point/RevitToolkit.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/revit-toolkit-internals .gemini/skills/revit-toolkit-internals && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "revit-toolkit-internals" agent skill from https://github.com/Nice3point/RevitToolkit/tree/main/.agents/skills/revit-toolkit-internals into .gemini/skills/revit-toolkit-internals/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "revit-toolkit-internals", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install Nice3point/RevitToolkit revit-toolkit-internalsInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add Nice3point/RevitToolkit --skill revit-toolkit-internals -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/Nice3point/RevitToolkit.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/revit-toolkit-internals .github/skills/revit-toolkit-internals && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "revit-toolkit-internals" agent skill from https://github.com/Nice3point/RevitToolkit/tree/main/.agents/skills/revit-toolkit-internals into .github/skills/revit-toolkit-internals/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "revit-toolkit-internals", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add Nice3point/RevitToolkit --skill revit-toolkit-internals -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install Nice3point/RevitToolkit revit-toolkit-internals --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Nice3point/RevitToolkit.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/revit-toolkit-internals .opencode/skills/revit-toolkit-internals && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "revit-toolkit-internals" agent skill from https://github.com/Nice3point/RevitToolkit/tree/main/.agents/skills/revit-toolkit-internals into .opencode/skills/revit-toolkit-internals/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "revit-toolkit-internals", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
revit-toolkit-internalsUphold the design contract of the Nice3point.Revit.Toolkit runtime library, that wraps the raw Revit add-in API.
Revit Toolkit Internals is an agent skill from Nice3point/RevitToolkit. Uphold the design contract of the Nice3point.Revit.Toolkit runtime library, that wraps the raw Revit add-in API. USE FOR: adding or changing a runtime type in the External, External/Events, Options, Helpers, or Internal folders, or the static RevitApiContext/RevitContext; deciding where boilerplate lives and how a scope, handler, or context is shaped. DO NOT USE FOR: authoring the bundled Roslyn analyzers, code fixers, or the source generator, which are a separate compiler tooling contract.
Its SKILL.md is about 2.5k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Development, covering Project scaffolding. It works with .NET. The repository describes itself as: Toolkit for Revit plugin development. The licence is MIT.
7 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit b5abec5. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
dotnetFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Revit Toolkit Internals loads about 2.5k tokens when it runs. Until then it costs about 130 tokens; SKILL.md has 893 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from Nice3point/RevitToolkit at commit b5abec5, republished under its MIT licence (© Nice3point). 893 words, ~2,511 tokens.
.claude/skills/revit-toolkit-internals/SKILL.md (or your agent's skills folder).Nice3point.Revit.Toolkit removes add-in boilerplate by wrapping the awkward parts of the Revit API behind clean instance and static types. The library adds ergonomics and lifecycle management, never new Revit behavior. This skill is the design contract a maintainer upholds when adding or changing a runtime type.
External/Commands or External/Applications, an event type under External/Events, an option handler under Options, a helper under Helpers, or an accessor under Internal.RevitApiContext or RevitContext, a Begin...Scope() operation, or a cross-thread handler.[ExternalEvent] source generator. That is the compiler tooling contract with its own RVTTK#### ids and dual-Roslyn packaging.Model an add-in entry point as an instance base class the consumer inherits; model a global service as a static class.
A base class implements the Revit interface, marks the Revit-facing method [EditorBrowsable(EditorBrowsableState.Never)], does the setup, and exposes a single abstract override; the consumer writes no plumbing.
[PublicAPI]
public abstract class ExternalCommand : IExternalCommand
{
public UIApplication Application { get; private set; } = null!;
public Result Result { get; set; } = Result.Succeeded;
[EditorBrowsable(EditorBrowsableState.Never)]
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
Application = commandData.Application;
using (ResolveHelper.BeginAssemblyResolveScope(GetType()))
{
Execute();
}
return Result;
}
public abstract void Execute();
}RevitApiContext (DB-level Application) and its subclass RevitContext (UI-level) are static, and their static constructors reflect against Revit internals.
Keep every consumer-visible entry point's boilerplate in the base class, never in the override.
A temporary state change (dialog suppression, failure suppression, assembly resolution, the API context) is a factory named Begin...Scope() that acquires the resource and returns an IDisposable reversing it.
Reference-count nested scopes under a Lock, and guard Dispose with Interlocked.Exchange; a double dispose is a no-op.
private static readonly Lock FailureLock = new();
private static int _failureScopeCount;
public static IDisposable BeginFailureSuppressionScope(bool resolveErrors = true)
{
lock (FailureLock)
{
_suppressFailureErrors = resolveErrors;
if (_failureScopeCount++ == 0)
{
Application.FailuresProcessing += ResolveFailures;
}
}
return new FailureSuppressionScope();
}
private sealed class FailureSuppressionScope : IDisposable
{
private int _disposed;
public void Dispose()
{
if (Interlocked.Exchange(ref _disposed, 1) != 0) return;
lock (FailureLock)
{
if (--_failureScopeCount == 0)
{
Application.FailuresProcessing -= ResolveFailures;
}
}
}
}Name the factory for the action it begins (BeginFailureSuppressionScope, not SuppressFailures), and always unsubscribe from the Revit event when the last scope closes.
Every static context is reachable from any thread; all shared state is synchronized.
Use the Lock type for shared fields, keep lock sections minimal, track nested scopes with a counter mutated under the lock, and guard dispose flags with Interlocked.Exchange.
Read a shared value under the lock into a local before acting on it, as the failure and dialog resolvers do; do not touch the field outside the lock.
The Revit API may only be modified from the API context.
Wrap Autodesk.Revit.UI.ExternalEvent; a handler raised from any thread runs in the API context. Take a fast path that invokes the handler directly when already in API mode.
public override ExternalEventRequest Raise()
{
if ((_options & ExternalEventOptions.AllowDirectInvocation) != 0 && RevitContext.IsRevitInApiMode)
{
Execute(RevitContext.UiApplication);
return ExternalEventRequest.Accepted;
}
return base.Raise();
}Await completion with a TaskCompletionSource (see AsyncExternalEvent.RaiseAsync), and queue cross-thread work with a thread-safe structure such as ConcurrentQueue when a handler batches multiple actions.
The base ExternalEventHandler constructor creates the underlying Revit event inside RevitContext.BeginApiContextScope(); construction is valid off the API context.
async/await inside a synchronous Revit command works by pumping a DispatcherFrame.
Complete the frame from a continuation scheduled on TaskScheduler.Default, not the UI synchronization context, or the continuation deadlocks against PushFrame.
public sealed override void Execute()
{
var task = ExecuteAsync();
if (task.IsCompleted)
{
task.GetAwaiter().GetResult();
return;
}
var frame = new DispatcherFrame();
task.ContinueWith(_ => frame.Continue = false, TaskScheduler.Default);
Dispatcher.PushFrame(frame);
task.GetAwaiter().GetResult();
}Reflection into Revit internals and native function-pointer marshaling stay non-public and never leak.
On modern runtimes the accessors use [UnsafeAccessor] (gated #if NET8_0_OR_GREATER, with a reflection fallback for the older target); function-pointer interop lives inside a private nested scope type.
internal static class UnsafeAccessors
{
[UnsafeAccessor(UnsafeAccessorKind.Constructor)]
internal static extern Application CreateApplication(object proxy);
}Never surface a pointer, delegate, or reflected member from Internal/; the API-context scope allocates and frees its native memory inside its own Dispose.
Mark every public class [PublicAPI], every member Revit invokes but consumers must not call [EditorBrowsable(EditorBrowsableState.Never)], and every read-only method [Pure].
Wrap an option callback interface with ergonomic constructors, like FamilyLoadOptions : IFamilyLoadOptions and DuplicateTypeNamesHandler : IDuplicateTypeNamesHandler; keep the Revit-invoked method non-browsable.
Every type must compile under every declared Debug.R20..R27 / Release.R20..R27; gate version-specific Revit APIs with #if REVIT2024_OR_GREATER-style directives and runtime features (AssemblyLoadContext, UnsafeAccessor) with #if NET or #if NET8_0_OR_GREATER.
Ship a test for the changed custom logic in tests/Nice3point.Revit.Toolkit.Tests, then build.
dotnet test -c Debug.R27abstract override; global contexts are static classes; boilerplate lives in the base, not the override.Begin...Scope() returning IDisposable, reference-counted under a Lock, with an Interlocked.Exchange dispose guard.DispatcherFrame with a TaskScheduler.Default continuation.Internal/ and are never surfaced.[PublicAPI], Revit callbacks [EditorBrowsable(Never)], read-only methods [Pure]; every type compiles under every Debug.RNN/Release.RNN.| Pitfall | Correct approach |
|---|---|
| Putting Revit plumbing in the consumer's override | Keep setup in the base class; expose one abstract method. |
| A scope that forgets to reverse or double-reverses | Count under a Lock and guard Dispose with Interlocked.Exchange. |
| Touching a shared field outside the lock | Read it under the lock into a local, then act. |
| Calling the Revit API off the API context | Marshal through the external event; fast-path only when IsRevitInApiMode. |
| Completing the async frame on the UI context | Continue on TaskScheduler.Default; the UI context deadlocks against PushFrame. |
| Exposing a reflected member or native pointer | Keep it internal in Internal/; expose only the wrapped type. |
| A version-specific API without a compilation gate | Gate with #if REVIT####_OR_GREATER / #if NET* so every configuration compiles. |
© Nice3point, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .agents/skills/revit-toolkit-internals of Nice3point/RevitToolkit.
Open the folder on GitHubat commit b5abec5
Revit Toolkit Internals next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Revit Toolkit Internals this skillNice3point/RevitToolkit | 176 | — | ~2.5k | Automated safety check: Pass | MIT | |
| Scaffoldcodewithmukesh/dotnet-claude-kit | 751 | — | ~1.7k | Automated safety check: Pass | MIT | |
| Corvus Benchmarkscorvus-dotnet/Corvus.JsonSchema | 199 | — | ~1.2k | Automated safety check: Pass | Apache-2.0 | |
| Create Migrationfullstackhero/dotnet-starter-kit | 6.8k | — | ~757 | Automated safety check: Pass | MIT | |
| Improve Skill Qualitydotnet/skills | 5.6k | 1 repos | ~3.6k | Automated safety check: Pass | MIT | |
| Create Blazor Projectdotnet/skills | 5.6k | 1 repos | ~3k | Automated safety check: Pass | MIT |
codewithmukesh/dotnet-claude-kit
Architecture-aware feature scaffolding for .NET 10 projects.
corvus-dotnet/Corvus.JsonSchema
Run, interpret, and maintain BenchmarkDotNet benchmarks for JSON Schema validation and query languages.
fullstackhero/dotnet-starter-kit
Create and apply an EF Core migration for a module's DbContext the FSH way (central Migrations project, per-module folder, correct --context).
dotnet/skills
Diagnoses and fixes skills in the dotnet/skills repository that lose to their own baseline, fail to activate, time out, or return "no credible improvement".
dotnet/skills
Create a new ASP.NET Core web application or web site using Blazor.
dotnet/skills
Generate or scaffold ASP.NET Core code — Razor Pages, Blazor components, MVC controllers, views, and Minimal API endpoints — without using ASP.NET Core CLI scaffolding/code-generation tools.
Nice3point/RevitToolkit
Author and extend the Roslyn tooling bundled in the Nice3point.Revit.Toolkit package: the incremental source generator that emits external-event boilerplate, the analyzers and code fixers that…
Nice3point/RevitToolkit
Evolve the public surface of Nice3point.Revit.Toolkit without breaking downstream consumers: deprecate a renamed or replaced member with [Obsolete] with a JetBrains [CodeTemplate] auto-conversion…
Works with
Categories
Uphold the design contract of the Nice3point.Revit.Toolkit runtime library, that wraps the raw Revit add-in API. Revit Toolkit Internals is an agent skill from Nice3point/RevitToolkit.Toolkit runtime library, that wraps the raw Revit add-in API.
Revit Toolkit Internals fits situations like: changing a runtime type in the External; external/Events; internal folders; the static RevitApiContext/RevitContext.
Run `npx skills add Nice3point/RevitToolkit --skill revit-toolkit-internals -a claude-code`. Or copy the skill folder (.agents/skills/revit-toolkit-internals in Nice3point/RevitToolkit) into .claude/skills/revit-toolkit-internals in your project. Claude Code loads it when a task matches its description.
Run `npx skills add Nice3point/RevitToolkit --skill revit-toolkit-internals -a codex`. Or copy the skill folder (.agents/skills/revit-toolkit-internals in Nice3point/RevitToolkit) into .agents/skills/revit-toolkit-internals in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add Nice3point/RevitToolkit --skill revit-toolkit-internals -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/revit-toolkit-internals, .gemini/skills/revit-toolkit-internals, .github/skills/revit-toolkit-internals and .opencode/skills/revit-toolkit-internals in your project.
Going by SKILL.md and its folder, Revit Toolkit Internals needs the command-line tools its instructions call (dotnet).
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Revit Toolkit Internals is published under the MIT licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.
About 2.5k tokens (SKILL.md is roughly 10k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Revit Toolkit Internals: Scaffold (codewithmukesh/dotnet-claude-kit, 751 stars), Corvus Benchmarks (corvus-dotnet/Corvus.JsonSchema, 199 stars), Create Migration (fullstackhero/dotnet-starter-kit, 6.8k stars) and Improve Skill Quality (dotnet/skills, 5.6k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
Nice3point (a GitHub user) maintains it in Nice3point/RevitToolkit, which has 176 GitHub stars. The repository holds 3 skills in this directory. The repository was last updated on October 7, 2026.
Source: Nice3point/RevitToolkit on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.