Agent skill

Revit Extensions Authoring

by Nice3point in Nice3point/RevitExtensions

Add a fluent extension to Nice3point.Revit.Extensions with C 14 extension(Type){} blocks that wrap the raw Revit API for readability and chaining.

MITAuto-check passedWriting & Content

Install Revit Extensions Authoring

skills CLI
$ npx skills add Nice3point/RevitExtensions --skill revit-extensions-authoring -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install Nice3point/RevitExtensions revit-extensions-authoring --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/Nice3point/RevitExtensions.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/revit-extensions-authoring .claude/skills/revit-extensions-authoring && rm -rf skills-src

Use ~/.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/

Facts

Skill name
revit-extensions-authoring
GitHub stars
168
Token cost
~2.4k tokens
SKILL.md length
785 words
Files
1
Skills in repo
2
Repo updated
First seen
Licence
MIT

At a glance

Add a fluent extension to Nice3point.Revit.Extensions with C 14 extension(Type){} blocks that wrap the raw Revit API for readability and chaining.

  • Works in 6 steps: Place the file and declare the flat… → Author members inside an extension(Type)… → Return the source object from mutation… → …
  • : authoring a new extension method
  • SKILL.md covers When to use, When not to use, Workflow and Validation, plus 1 more section
  • Calls dotnet

What it does

Revit Extensions Authoring is an agent skill from Nice3point/RevitExtensions. Add a fluent extension to Nice3point.Revit.Extensions with C 14 extension(Type){} blocks that wrap the raw Revit API for readability and chaining. USE FOR: authoring a new extension method or property over a Revit type, utility, or manager; choosing the receiver type and adding the ElementId sibling overload; naming, attributes, namespace placement, and version gating for a new extension. DO NOT USE FOR: deprecating, renaming, or changing an existing public member without breaking consumers; writing the tests or…

Its SKILL.md is about 2.4k 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 Writing & Content, covering Plain language and style rules. It works with C# and .NET. The repository describes itself as: Extensions for Revit plugin development. The licence is MIT.

When your agent uses it

  • : authoring a new extension method
  • Property over a Revit type
  • Choosing the receiver type and adding the ElementId sibling overload
  • Namespace placement

Example prompts

  • “/revit-extensions-authoring”

Workflow steps

6 steps, taken from the step headings in SKILL.md.

  1. Place the file and declare the flat namespace
  2. Author members inside an extension(Type) block
  3. Return the source object from mutation methods
  4. Add the ElementId sibling overload
  5. Attribute, name, and gate by version
  6. Compile every configuration and update docs

What it can do on your machine

Read from SKILL.md and the folder at commit e60a6bd. It shows what the files ask for, not the result of running them.

  • Tool permissions

    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.

  • Runs code

    Shell commands in SKILL.md call:

    • dotnet

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Revit Extensions Authoring loads about 2.4k tokens when it runs. Until then it costs about 146 tokens; SKILL.md has 785 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~146
When it runs · the whole SKILL.md, loaded when a task matches
~2.4k

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.

Safety

Auto-check passed

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.

SKILL.md

The full file from Nice3point/RevitExtensions at commit e60a6bd, republished under its MIT licence (© Nice3point). 785 words, ~2,403 tokens.

Download SKILL.mdSave it as .claude/skills/revit-extensions-authoring/SKILL.md (or your agent's skills folder).
name
revit-extensions-authoring
description
Add a fluent extension to Nice3point.Revit.Extensions with C# 14 extension(Type){} blocks that wrap the raw Revit API for readability and chaining. USE FOR: authoring a new extension method or property over a Revit type, utility, or manager; choosing the receiver type and adding the ElementId sibling overload; naming, attributes, namespace placement, and version gating for a new extension. DO NOT USE FOR: deprecating, renaming, or changing an existing public member without breaking consumers; writing the tests or benchmarks that exercise an extension.
license
MIT

Authoring a Revit Extension

Nice3point.Revit.Extensions is a public NuGet library of fluent extension methods over the Revit API. Each member wraps a raw Revit API call behind a type-safe, chainable, discoverable surface and adds ergonomics, never new behavior. This skill covers adding one extension the way the existing surface is built; it depends on the Revit API packages (Nice3point.Revit.Api.*).

When to use

  • Adding a new extension method or property over a core Revit type, a *Utils static class, or a *Manager.
  • Deciding the receiver type and whether an ElementId sibling overload is needed.
  • Naming, attributes, XML docs, namespace placement, and #if version gating for a new member.

When not to use

  • Changing, renaming, or deprecating an existing public member — that must preserve the API contract; use revit-extensions-backward-compat.
  • Writing coverage for the new member — custom logic is exercised by the TUnit test project, and API wrappers and UI extensions are not tested.

Workflow

Step 1: Place the file and declare the flat namespace

Group one Revit type's extensions per <Type>Extensions.cs. Choose the folder by what the type is:

  • core Autodesk.Revit.DB type (Element, Document, Category, Parameter) → project root.
  • Revit *Utils static class → UtilsExtensions/<UtilsClass>Extensions.cs.
  • Revit *Manager type → ManagersExtensions/<Manager>Extensions.cs.
  • Ribbon / UI Framework helper → UIFrameworkExtensions/.
  • non-public helper (reflection accessors, format utilities) → Internal/, never public.

Declare the flat file-scoped namespace namespace Nice3point.Revit.Extensions;, or namespace Nice3point.Revit.Extensions.UI; for types from RevitAPIUI. Namespaces with nesting like Autodesk.Revit.DB.Structure.StructuralSections declare base on the same policy Nice3point.Revit.Extensions.Structure.StructuralSections. Add // ReSharper disable once CheckNamespace above the namespace whenever the declared namespace does not match the file's folder — every subfolder file needs it; a root file already in the flat namespace does not.

csharp
using JetBrains.Annotations;

// ReSharper disable once CheckNamespace
namespace Nice3point.Revit.Extensions;

/// <summary>
///     Represent extension methods for the <see cref="Autodesk.Revit.DB.JoinGeometryUtils"/> class.
/// </summary>
[PublicAPI]
public static class JoinGeometryUtilsExtensions

Mark the public class [PublicAPI].

Step 2: Author members inside an extension(Type) block

Open one extension(Type receiver) block per receiver and put the receiver's XML doc on the block. Wrap the Revit API directly — call the underlying API and return its result; never reimplement the operation. Write full block bodies for methods; an expression-bodied property is fine for a read-only value.

csharp
/// <param name="element">The source element.</param>
extension(Element element)
{
    /// <summary>Creates clean joins between two elements that share a common face</summary>
    public Element JoinGeometry(Element secondElement)
    {
        JoinGeometryUtils.JoinGeometry(element.Document, element, secondElement);
        return element;
    }

    /// <summary>Determines whether two elements are joined</summary>
    /// <returns>True if the two elements are joined</returns>
    [Pure]
    public bool AreElementsJoined(Element secondElement)
    {
        return JoinGeometryUtils.AreElementsJoined(element.Document, element, secondElement);
    }
}

A static member of the wrapped API becomes a public static member in the block:

csharp
extension(FamilySymbol familySymbol)
{
    [Pure]
    public static ICollection<ElementId> GetProfileSymbols(Document document, ProfileFamilyUsage profileFamilyUsage, bool oneCurveLoopOnly)
    {
        return FamilyUtils.GetProfileSymbols(document, profileFamilyUsage, oneCurveLoopOnly);
    }
}
Step 3: Return the source object from mutation methods

A method that mutates and would otherwise return void returns the receiver; calls chain. Keep a meaningful return value when the API produces one (for example Copy returns the new ElementId collection).

csharp
extension(Element element)
{
    public Element Move(double deltaX = 0d, double deltaY = 0d, double deltaZ = 0d)
    {
        ElementTransformUtils.MoveElement(element.Document, element.Id, new XYZ(deltaX, deltaY, deltaZ));
        return element;
    }

    public Element Rotate(Line axis, double angle)
    {
        ElementTransformUtils.RotateElement(element.Document, element.Id, axis, angle);
        return element;
    }
}
Step 4: Add the ElementId sibling overload

When the method reaches the API through element.Document and element.Id, add a sibling on ElementId that takes an explicit Document. Keep the bare name when it stays unambiguous on ElementId; give it a descriptive, disambiguated name when the bare name would be too generic.

csharp
extension(Element element)
{
    public bool CanBeDeleted => DocumentValidation.CanDeleteElement(element.Document, element.Id);
}

extension(ElementId elementId)
{
    [Pure]
    public bool CanBeDeleted(Document document)
    {
        return DocumentValidation.CanDeleteElement(document, elementId);
    }
}

A generic name gets qualified: GlobalParameter.MoveUpOrder() has the sibling elementId.MoveGlobalParameterUpOrder(document), not elementId.MoveUpOrder(document).

Show full SKILL.md (337 more words)Show less
Step 5: Attribute, name, and gate by version
  • [Pure] on every read-only method or property; [PublicAPI] on the public class.
  • Follow Revit's naming voice: passive for a test on an object (CanBeDeleted, CanBeMirrored), active when the object acts (CanElementCutElement).
  • Document each member: <summary> (copied from the Revit API doc for a wrapper), <param>, <returns>, and every Revit <exception> the call can throw. Let Revit exceptions propagate.
  • Gate a version-specific API with #if REVIT2024_OR_GREATER-style directives; the member then compiles under every declared Debug.RNN/Release.RNN. Keep the whole file coherent per version.
csharp
extension(ElementId elementId)
{
    [Pure]
    public bool IsCategory(BuiltInCategory category)
    {
#if REVIT2024_OR_GREATER
        return elementId.Value == (long)category;
#else
        return elementId.IntegerValue == (int)category;
#endif
    }
}
Step 6: Compile every configuration and update docs

Compile all Revit configurations from the build directory and update the shipped docs in the same change.

shell
dotnet run -c Release

Update Readme.md (add the usage example to the type's existing section — no new section for an ElementId sibling), Changelog.md (categorized entry), and the XML docs. Add coverage in the test project only when the member has custom logic beyond the wrapped call.

Validation

  • One <Type>Extensions.cs per Revit type, in the folder matching core/Utils/Manager/UI/Internal; [PublicAPI] on the class.
  • Flat namespace declared, with // ReSharper disable once CheckNamespace on every subfolder and .UI file.
  • Members live in extension(Type) blocks, call the Revit API directly, and use full method bodies.
  • Mutation methods return the receiver; an ElementId sibling with an explicit Document exists wherever the method uses element.Document/element.Id.
  • [Pure] on read-only members; XML <summary>/<param>/<returns>/<exception> present; version-specific APIs gated with #if.
  • dotnet run -c Release compiles every configuration; Readme.md, Changelog.md, and XML docs updated.

Common Pitfalls

PitfallCorrect approach
Reimplementing the operationCall the underlying Revit API directly and return its result.
A mutation method returning voidReturn the receiver so calls chain.
Method with element.Document/element.Id and no ElementId siblingAdd the sibling taking an explicit Document, disambiguating the name when needed.
Expression-bodied method bodyUse a full block body for methods; expression-bodied properties are fine.
Version-specific API used unconditionallyGate it with #if REVIT####_OR_GREATER so every Debug.RNN/Release.RNN compiles.
Missing // ReSharper disable once CheckNamespace on a subfolder fileAdd it whenever the namespace does not match the folder.

© Nice3point, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in .agents/skills/revit-extensions-authoring of Nice3point/RevitExtensions.

Open the folder on GitHubat commit e60a6bd

Compare with similar skills

Revit Extensions Authoring 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.

Revit Extensions Authoring compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Revit Extensions Authoring this skillNice3point/RevitExtensions168—~2.4kAutomated safety check: PassMIT
Mcaf Dotnet Analyzer Configmanagedcode/Storage138—~1.2kAutomated safety check: PassMIT
Mcaf Dotnet Meziantou Analyzermanagedcode/Storage138—~955Automated safety check: PassMIT
Mcaf Dotnet Stylecop Analyzersmanagedcode/Storage138—~1kAutomated safety check: PassMIT
Minimax DOCXpoco-ai/poco-claw1.4k7 repos~3.9kAutomated safety check: PassMIT
Speckit ConstitutionWeihanLi/WeihanLi.Common24211 repos~2.1kAutomated safety check: PassApache-2.0

Similar skills

  • Mcaf Dotnet Analyzer Config

    managedcode/Storage

    Use a repo-root .editorconfig to configure free .NET analyzer and style rules.

    138 GitHub stars~1.2k tokensUpdated yesterday
    Agent WorkflowsAuto-check passed
  • Use the open-source free Meziantou.Analyzer package for design, usage, security, performance, and style rules in .NET.

    138 GitHub stars~955 tokensUpdated yesterday
    Agent WorkflowsAuto-check passed
  • Use the open-source free StyleCop.Analyzers package for naming, layout, documentation, and style rules in .NET projects.

    138 GitHub stars~1k tokensUpdated yesterday
    Agent WorkflowsAuto-check passed
  • Minimax DOCX

    poco-ai/poco-claw

    Professional DOCX document creation, editing, and formatting using OpenXML SDK (.NET).

    1.4k GitHub starsUsed in 7 repos~3.9k tokens
    Documents & OfficeAuto-check passed
  • Speckit Constitution

    WeihanLi/WeihanLi.Common

    Create or update the project constitution from interactive or provided principle inputs, ensuring all dependent templates stay in sync.

    242 GitHub starsUsed in 11 repos~2.1k tokens
    DevelopmentAuto-check passed
  • Asd Ste100

    danyuchn/asd-ste100-skill

    A skill your agent uses when English text must be parsed without a human to resolve ambiguity — tool descriptions, error messages, inter-agent instructions, system prompts, status reports — and…

    4k GitHub stars~4.1k tokensUpdated 4 days ago
    Writing & ContentAuto-check passed

More from Nice3point/RevitExtensions

  • Revit Extensions Backward Compat

    Nice3point/RevitExtensions

    Deprecate or replace a public member of Nice3point.Revit.Extensions without breaking downstream consumers, using [Obsolete] with a JetBrains CodeTemplate auto-conversion pattern.

    168 GitHub stars~2.1k tokensUpdated yesterday
    Auto-check passed

Works with

Questions about Revit Extensions Authoring

What does Revit Extensions Authoring do?

Add a fluent extension to Nice3point.Revit.Extensions with C 14 extension(Type){} blocks that wrap the raw Revit API for readability and chaining. Revit Extensions Authoring is an agent skill from Nice3point/RevitExtensions.Extensions with C 14 extension(Type){} blocks that wrap the raw Revit API for readability and chaining.

When should I use Revit Extensions Authoring?

Revit Extensions Authoring fits situations like: : authoring a new extension method; property over a Revit type; choosing the receiver type and adding the ElementId sibling overload; namespace placement.

How do I install Revit Extensions Authoring in Claude Code?

Run `npx skills add Nice3point/RevitExtensions --skill revit-extensions-authoring -a claude-code`. Or copy the skill folder (.agents/skills/revit-extensions-authoring in Nice3point/RevitExtensions) into .claude/skills/revit-extensions-authoring in your project. Claude Code loads it when a task matches its description.

How do I install Revit Extensions Authoring in Codex?

Run `npx skills add Nice3point/RevitExtensions --skill revit-extensions-authoring -a codex`. Or copy the skill folder (.agents/skills/revit-extensions-authoring in Nice3point/RevitExtensions) into .agents/skills/revit-extensions-authoring in your project. Codex loads it when a task matches its description.

Can I use Revit Extensions Authoring in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add Nice3point/RevitExtensions --skill revit-extensions-authoring -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-extensions-authoring, .gemini/skills/revit-extensions-authoring, .github/skills/revit-extensions-authoring and .opencode/skills/revit-extensions-authoring in your project.

What does Revit Extensions Authoring need to run?

Going by SKILL.md and its folder, Revit Extensions Authoring needs the command-line tools its instructions call (dotnet).

Does Revit Extensions Authoring access the network?

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.

Is Revit Extensions Authoring safe to install?

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.

What licence does Revit Extensions Authoring use?

Revit Extensions Authoring is published under the MIT licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Revit Extensions Authoring use?

About 2.4k tokens (SKILL.md is roughly 9.6k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Revit Extensions Authoring?

Skills that share tags, products or a category with Revit Extensions Authoring: Mcaf Dotnet Analyzer Config (managedcode/Storage, 138 stars), Mcaf Dotnet Meziantou Analyzer (managedcode/Storage, 138 stars), Mcaf Dotnet Stylecop Analyzers (managedcode/Storage, 138 stars) and Minimax DOCX (poco-ai/poco-claw, 1.4k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Revit Extensions Authoring?

Nice3point (a GitHub user) maintains it in Nice3point/RevitExtensions, which has 168 GitHub stars. The repository holds 2 skills in this directory. The repository was last updated on October 7, 2026.

Source: Nice3point/RevitExtensions on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.