Agent skill

Revit Toolkit Backward Compat

by Nice3point in 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…

MITAuto-check passedDevelopment

Install Revit Toolkit Backward Compat

skills CLI
$ npx skills add Nice3point/RevitToolkit --skill revit-toolkit-backward-compat -a claude-code

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

GitHub CLI
$ gh skill install Nice3point/RevitToolkit revit-toolkit-backward-compat --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/RevitToolkit.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/revit-toolkit-backward-compat .claude/skills/revit-toolkit-backward-compat && 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-toolkit-backward-compat
GitHub stars
176
Token cost
~2k tokens
SKILL.md length
793 words
Files
1
Skills in repo
3
Repo updated
First seen
Licence
MIT

At a glance

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 in 7 steps: Add, deprecate, but never change or delete → Deprecate a member with [Obsolete] and… → Match the CodeTemplate placeholder to… → …
  • Removing any public type
  • SKILL.md covers When to use, Workflow, Validation and Common Pitfalls
  • Calls dotnet

What it does

Revit Toolkit Backward Compat is an agent skill from 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, and treat both the generated API shape and the RVTTK diagnostic ids as stable public surface. USE FOR: renaming, replacing, or removing any public type or member; adding an overload or parameter to a shipped API; changing a generated member name or a diagnostic id; recording the deprecation in the changelog. DO NOT USE…

Its SKILL.md is about 2k 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 Changelog and release notes. It works with JetBrains IDEs and .NET. The repository describes itself as: Toolkit for Revit plugin development. The licence is MIT.

When your agent uses it

  • Removing any public type
  • Adding an overload
  • Parameter to a shipped API
  • Changing a generated member name

Example prompts

  • “/revit-toolkit-backward-compat”

Workflow steps

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

  1. Add, deprecate, but never change or delete
  2. Deprecate a member with [Obsolete] and [CodeTemplate]
  3. Match the CodeTemplate placeholder to the member shape
  4. Keep the obsolete member functional
  5. Deprecate a whole class the same way
  6. Treat generated API and RVTTK ids as public surface
  7. Document, then verify

What it can do on your machine

Read from SKILL.md and the folder at commit b5abec5. 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 Toolkit Backward Compat loads about 2k tokens when it runs. Until then it costs about 150 tokens; SKILL.md has 793 words of instructions outside code blocks.

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

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/RevitToolkit at commit b5abec5, republished under its MIT licence (© Nice3point). 793 words, ~2,026 tokens.

Download SKILL.mdSave it as .claude/skills/revit-toolkit-backward-compat/SKILL.md (or your agent's skills folder).
name
revit-toolkit-backward-compat
description
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, and treat both the generated API shape and the RVTTK#### diagnostic ids as stable public surface. USE FOR: renaming, replacing, or removing any public type or member; adding an overload or parameter to a shipped API; changing a generated member name or a diagnostic id; recording the deprecation in the changelog. DO NOT USE FOR: private implemetations and internal types.
license
MIT

Revit Toolkit Backward Compatibility

Nice3point.Revit.Toolkit is a public NuGet library with downstream consumers; a breaking change breaks other people's builds. Never delete or change an existing public API; deprecate it and keep it working. Public surface is broader than the hand-written types: the shape the source generator emits and the RVTTK#### diagnostic ids the analyzers report are contracts too.

When to use

  • Renaming, replacing, or retiring a public type or member.
  • Adding an overload or a parameter to an already shipped API.
  • Changing a generated member name or introducing or renumbering a diagnostic id.
  • Recording a deprecation or breaking change in the changelog.

Workflow

Step 1: Add, deprecate, but never change or delete

The only safe evolutions are additive or a deprecation.

  • Method signatures: never change an existing signature; add a new overload.
  • Return types: never change a return type.
  • Parameters: add a new parameter only as optional, and only at the end of the list.
  • Renaming or removal: use the deprecation pattern below and keep the old member functional indefinitely.
Step 2: Deprecate a member with [Obsolete] and [CodeTemplate]

To rename or replace a member, mark the old one [Obsolete] with a message that names the replacement, and add a JetBrains [CodeTemplate]; ReSharper and Rider auto-convert call sites. The obsolete member forwards to its replacement and stays functional.

csharp
[Obsolete("Use Application instead")]
[CodeTemplate(
    searchTemplate: "UiApplication",
    Message = "UiApplication is obsolete, use Application instead",
    ReplaceTemplate = "Application",
    ReplaceMessage = "Replace with Application")]
public UIApplication UiApplication => Application;

searchTemplate is the pattern ReSharper matches at a call site, and ReplaceTemplate is what it substitutes; Message shows on the obsolete member and ReplaceMessage on the quick-fix.

Step 3: Match the CodeTemplate placeholder to the member shape

Use a [CodeTemplate] placeholder; the auto-conversion carries the call site's arguments and type arguments across.

  • Method arguments use $args$ in both templates:
csharp
[Obsolete("Use RevitApiContext.BeginFailureSuppressionScope instead")]
[CodeTemplate(
    searchTemplate: "Context.SuppressFailures($args$)",
    Message = "Context.SuppressFailures is obsolete, use RevitApiContext.BeginFailureSuppressionScope with 'using' statement instead",
    ReplaceTemplate = "RevitApiContext.BeginFailureSuppressionScope($args$)",
    ReplaceMessage = "Replace with RevitApiContext.BeginFailureSuppressionScope")]
public static void SuppressFailures(bool resolveErrors = true)
{
    // original implementation kept intact
}
  • Generic type arguments use a named placeholder such as $T$:
csharp
[Obsolete("Use BeginAssemblyResolveScope<T> instead for automatic resource management")]
[CodeTemplate(
    searchTemplate: "BeginAssemblyResolve<$T$>()",
    Message = "BeginAssemblyResolve is obsolete. Use BeginAssemblyResolveScope with 'using' statement instead",
    ReplaceTemplate = "BeginAssemblyResolveScope<$T$>()",
    ReplaceMessage = "Replace with BeginAssemblyResolveScope")]
public static void BeginAssemblyResolve<T>()
{
    BeginAssemblyResolveScope(typeof(T));
}

Omit [CodeTemplate] only when there is no mechanical call-site rewrite, such as retiring a stateful method that a scope now replaces (RestoreDialogs), and still keep the member functional.

Step 4: Keep the obsolete member functional

An obsolete member keeps calling the original implementation, or forwards to the property, field, or method it became. It must not throw and must not silently change behavior; a consumer who has not migrated keeps building and running. A simple rename forwards directly (UiApplication => Application); a replaced method forwards to the new API (BeginAssemblyResolve<T> calls BeginAssemblyResolveScope).

Step 5: Deprecate a whole class the same way

To replace a class, create the new type, mark the old one [Obsolete], and keep it functional. Keep [PublicAPI] on the deprecated class; its contract stays documented.

csharp
[PublicAPI]
[Obsolete("Use Nice3point.Revit.Toolkit.External.ExternalEvent class or ExternalEvent source-generator instead")]
public class ActionEventHandler : ExternalEventHandler
{
    // full implementation stays working
}

The static Context class shows the same pattern at scale: the type is [Obsolete] and every member carries its own [Obsolete] and [CodeTemplate] forwarding to RevitContext/RevitApiContext.

Show full SKILL.md (352 more words)Show less
Step 6: Treat generated API and RVTTK ids as public surface

The [ExternalEvent] generator's output and the analyzers' diagnostic ids are as much a contract as a hand-written method.

  • Never rename a generated property or record; renaming one is a breaking change for every consumer that references the generated name.
  • Never renumber or reuse a shipped RVTTK#### id; assign the next unused id for a new rule.
  • Record every new or changed rule in AnalyzerReleases.Unshipped.md; the shipped ids stay in AnalyzerReleases.Shipped.md.
Step 7: Document, then verify

Record every addition, deprecation, and behavior change in the current section of CHANGELOG.md, and add a migration example at the end of the section for any breaking change or deprecation. Update the README and XML docs in the same change. Then confirm the obsolete member still compiles and its callers still build.

shell
dotnet run -c Release

Validation

  • No existing public signature, return type, or member name changed; new parameters are optional and appended.
  • A renamed or replaced member carries [Obsolete] naming the replacement and a [CodeTemplate] whose placeholder matches the member shape ($args$, $T$).
  • The obsolete member forwards to its replacement, stays functional, and neither throws nor changes behavior.
  • A replaced class is [Obsolete] and still functional; the new class exists alongside it.
  • No generated member name was renamed and no RVTTK#### id was renumbered or reused; a new rule is recorded in AnalyzerReleases.Unshipped.md.
  • The changelog, README, and XML docs record the change, with a migration example for any deprecation.

Common Pitfalls

PitfallCorrect approach
Changing a method signature or return type in placeAdd a new overload; leave the shipped one untouched.
Deleting or renaming a public member outrightDeprecate with [Obsolete] + [CodeTemplate] and keep it functional.
An obsolete member that throws or changes behaviorForward to the replacement; unmigrated callers keep working.
Adding a required parameter to a shipped methodAdd it as optional and only at the end, or add an overload.
Renaming a generated property or reusing a diagnostic idTreat generated names and RVTTK#### ids as public surface.
Deprecating without a changelog migration noteRecord the change and add a migration example for the deprecation.

© 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-toolkit-backward-compat of Nice3point/RevitToolkit.

Open the folder on GitHubat commit b5abec5

Compare with similar skills

Revit Toolkit Backward Compat 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 Toolkit Backward Compat compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Revit Toolkit Backward Compat this skillNice3point/RevitToolkit176—~2kAutomated safety check: PassMIT
ChangelogJetBrains/ideavim10k1 repos~2.7kAutomated safety check: PassMIT
.NET Release Verificationdotnet/core22k—~1.8kAutomated safety check: PassMIT
Add Analyzerdotnet/roslynator3.5k—~1.3kAutomated safety check: PassCustom licence
Generate .NET Release changes.jsondotnet/core22k—~1.7kAutomated safety check: PassMIT
Release Feature Scoringdotnet/core22k—~2.2kAutomated safety check: PassMIT

Similar skills

  • Changelog

    JetBrains/ideavim

    Official

    Maintains the IdeaVim changelog (CHANGES.md). An agent skill from JetBrains/ideavim.

    10k GitHub starsUsed in 1 repo~2.7k tokens
    DevelopmentAuto-check passed
  • Official

    Validates .NET release data with the release-notes CLI: download URL liveness, SHA512 hashes, CDN latest.version files and aka.ms redirects.

    22k GitHub stars~1.8k tokensUpdated today
    DevelopmentAuto-check passed
  • Add Analyzer

    dotnet/roslynator

    Official

    A skill your agent uses when adding a new RCS diagnostic in roslynator (RCS0 formatting, RCS1 general, RCS9 code-analysis), wiring roslynator EditorConfig options, or when docs say CHANGELOG.md…

    3.5k GitHub stars~1.3k tokensUpdated 4 days ago
    DevelopmentAuto-check passed
  • Produces the changes.json manifest for a .NET preview, RC or GA milestone by choosing the right VMR base and head refs and running release-notes generate changes.

    22k GitHub stars~1.7k tokensUpdated today
    DevelopmentAuto-check passed
  • Official

    Ranks the changes in a release manifest and writes a scored features file that release notes, docs and blog posts can each cut at their own threshold.

    22k GitHub stars~2.2k tokensUpdated today
    DevelopmentAuto-check passed
  • Official

    Audits a scored features.json file and its draft release notes against editorial examples to catch over-scored, under-scored, or missing entries.

    22k GitHub stars~1.6k tokensUpdated today
    DevelopmentAuto-check passed

More from Nice3point/RevitToolkit

  • Revit Toolkit Analyzers

    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…

    176 GitHub stars~3.8k tokensUpdated yesterday
    Auto-check passed
  • Revit Toolkit Internals

    Nice3point/RevitToolkit

    Uphold the design contract of the Nice3point.Revit.Toolkit runtime library, that wraps the raw Revit add-in API.

    176 GitHub stars~2.5k tokensUpdated yesterday
    Auto-check passed

Categories

Questions about Revit Toolkit Backward Compat

What does Revit Toolkit Backward Compat do?

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…. Revit Toolkit Backward Compat is an agent skill from Nice3point/RevitToolkit.Toolkit without breaking downstream consumers: deprecate a renamed or replaced member with [Obsolete] with a JetBrains [CodeTemplate] auto-conversion, and treat both the generated API shape and the RVTTK diagnostic ids as stable public surface.

When should I use Revit Toolkit Backward Compat?

Revit Toolkit Backward Compat fits situations like: removing any public type; adding an overload; parameter to a shipped API; changing a generated member name.

How do I install Revit Toolkit Backward Compat in Claude Code?

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

How do I install Revit Toolkit Backward Compat in Codex?

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

Can I use Revit Toolkit Backward Compat 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/RevitToolkit --skill revit-toolkit-backward-compat -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-backward-compat, .gemini/skills/revit-toolkit-backward-compat, .github/skills/revit-toolkit-backward-compat and .opencode/skills/revit-toolkit-backward-compat in your project.

What does Revit Toolkit Backward Compat need to run?

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

Does Revit Toolkit Backward Compat 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 Toolkit Backward Compat 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 Toolkit Backward Compat use?

Revit Toolkit Backward Compat 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 Toolkit Backward Compat use?

About 2k tokens (SKILL.md is roughly 8.1k 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 Toolkit Backward Compat?

Skills that share tags, products or a category with Revit Toolkit Backward Compat: Changelog (JetBrains/ideavim, 10k stars), .NET Release Verification (dotnet/core, 22k stars), Add Analyzer (dotnet/roslynator, 3.5k stars) and Generate .NET Release changes.json (dotnet/core, 22k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Revit Toolkit Backward Compat?

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.