Assess Migration
mendixlabs/mxcli
Investigate an existing non-Mendix application (Java, .NET, Python, Node, PHP, …) and produce a structured migration assessment for Mendix.
Port a component or feature that already exists in one protocol client template to sibling clients under packages/templates/clients/<protocol/ that are missing it.
$ npx skills add asyncapi/generator --skill port-client-component -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install asyncapi/generator port-client-component --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/asyncapi/generator.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/port-client-component .claude/skills/port-client-component && 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 "port-client-component" agent skill from https://github.com/asyncapi/generator/tree/master/.claude/skills/port-client-component into .claude/skills/port-client-component/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "port-client-component", 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/asyncapi/generator/tree/master/.claude/skills/port-client-componentType 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 asyncapi/generator --skill port-client-component -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install asyncapi/generator port-client-component --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/asyncapi/generator.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/port-client-component .agents/skills/port-client-component && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "port-client-component" agent skill from https://github.com/asyncapi/generator/tree/master/.claude/skills/port-client-component into .agents/skills/port-client-component/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "port-client-component", 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 asyncapi/generator --skill port-client-component -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install asyncapi/generator port-client-component --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/asyncapi/generator.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/port-client-component .cursor/skills/port-client-component && 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 "port-client-component" agent skill from https://github.com/asyncapi/generator/tree/master/.claude/skills/port-client-component into .cursor/skills/port-client-component/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "port-client-component", 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/asyncapi/generator.git --path .claude/skills/port-client-component--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 asyncapi/generator --skill port-client-component -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install asyncapi/generator port-client-component --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/asyncapi/generator.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/port-client-component .gemini/skills/port-client-component && 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 "port-client-component" agent skill from https://github.com/asyncapi/generator/tree/master/.claude/skills/port-client-component into .gemini/skills/port-client-component/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "port-client-component", 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 asyncapi/generator port-client-componentInstalls 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 asyncapi/generator --skill port-client-component -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/asyncapi/generator.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/port-client-component .github/skills/port-client-component && 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 "port-client-component" agent skill from https://github.com/asyncapi/generator/tree/master/.claude/skills/port-client-component into .github/skills/port-client-component/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "port-client-component", 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 asyncapi/generator --skill port-client-component -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install asyncapi/generator port-client-component --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/asyncapi/generator.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/port-client-component .opencode/skills/port-client-component && 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 "port-client-component" agent skill from https://github.com/asyncapi/generator/tree/master/.claude/skills/port-client-component into .opencode/skills/port-client-component/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "port-client-component", 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.
port-client-componentPort a component or feature that already exists in one protocol client template to sibling clients under packages/templates/clients/<protocol/ that are missing it.
Port Client Component is an agent skill from asyncapi/generator. Port a component or feature that already exists in one protocol client template to sibling clients under packages/templates/clients/<protocol/ that are missing it. Use when the user asks to "port", "add this to the other client(s) too", or "do the same for python/dart/java", or describes a parity gap between clients of the same protocol. Requires the feature, the reference client, and the target client(s) to be named explicitly.
Its SKILL.md is about 4.6k 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 Backend & APIs. It works with Java, Python and Node.js. The repository describes itself as: Use your AsyncAPI definition to generate literally anything. Markdown documentation, Node.js code, HTML documentation, anything! The licence is Apache-2.0.
8 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit ab1f79a. 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:
npmgitturboFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use npm and git, which can reach the network depending on how they are called.
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.
Port Client Component loads about 4.6k tokens when it runs. Until then it costs about 114 tokens; SKILL.md has 2,335 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 asyncapi/generator at commit ab1f79a, republished under its Apache-2.0 licence (© asyncapi). 2,335 words, ~4,579 tokens.
.claude/skills/port-client-component/SKILL.md (or your agent's skills folder).You are porting a component or feature that already works in one protocol client template to one or more sibling clients that are missing it, within packages/templates/clients/<protocol>/* (currently: websocket — javascript, python, dart, java/quarkus; kafka — java/quarkus). This is a recurring shape in this repo — a capability lands in one client and sibling clients for the same protocol never get the equivalent treatment.
Read AGENT.md sections 2.5 (release hygiene / changesets) and 4.7 (baked-in templates) before executing — this skill's closing steps depend on both.
The user must name three things explicitly:
java/quarkus).If any of the three is missing, ask via AskUserQuestion. Do not guess reference/target/feature from a bare GitHub issue number or URL: extracting them from free-form issue text requires interpretation and risks misidentifying which client is the reference on a vaguely-worded issue. The user names it; you don't guess it.
Check in order; stop and report on the first failure:
The reference and every target must live under the same packages/templates/clients/<protocol>/ directory. Cross-protocol porting (e.g. websocket → kafka) is out of scope — stop and tell the user.
For each target, Grep for an equivalent construct using the feature's key terms from the user's description. If a target already has it, drop it from the target list and tell the user why — never overwrite working code to "match" a reference.
Work through these in order — each produces an artifact the execution steps consume directly. Print each artifact back to the user as you produce it.
Grep the reference client's template/ and components/ directories and its committed runnable example at the template root (example.py / example.js / example.dart — hand-maintained mirror of the generated example, not build output) for the feature's key terms (from the user's description). List the matches as "the reference files." A hit in the root example file makes the target's root example file an injection point too — that file is what the client README's manual test actually runs, so omitting it ships a port the documented test never exercises. This step also proves the reference actually has the feature: if the matches are ambiguous, ask the user to point at the specific file(s) rather than guessing; if nothing plausible turns up and the user can't point at a file either, stop and report "feature not found in reference client."
Grep the other sibling clients that already have this feature — not just the named reference. If a sibling's implementation behaviorally diverges from the reference (observable test: the reference only registers/stores something while a sibling also applies it in the runtime path, or their generated methods differ in what they do rather than how they say it), surface the divergence via AskUserQuestion and let the user pick which behavior to port — before any translation. Do not silently mirror the reference when a more complete sibling exists, and do not silently "improve" on the reference either; the choice is the user's, and it must be made before the golden snippet is written because the snippet encodes it.
Check whether any reference file imports from @asyncapi/generator-components for this feature. This determines which execution branch applies:
| What the reference files show | Branch |
|---|---|
A reference file imports a component from @asyncapi/generator-components that renders this feature | A — Shared-config extension |
| No such import — the feature's logic lives only in the reference client's own template-local files | B — Local-only logic |
packages/components/src/components/, built on a per-language config map (the QueryParamsVariables shape: a top-level object keyed by language, values either a function or a framework-keyed sub-object, e.g. java: { quarkus: (param) => … }). Deterministic — the shared component already knows how to render every language, it's just missing entries/wiring for the targets.Don't assume Branch A because a shared components package exists — confirm the specific reference files actually import from it. A reference client can have template-local logic even when unrelated shared components exist for other features.
A feature can span both branches — e.g. a local register method and constructor field (B) plus a shared example component missing the target's config entry (A). Classify each reference file separately: the branch applies per file, and a mixed feature runs both execution sections, each for its own files.
For each target client, find the file(s) structurally equivalent to the reference files — same relative path under that client's directory (the <framework> segment adds one directory level for stack-specific clients like java/quarkus). Record one row per (reference file × target) pair in a markdown table and print it back to the user:
| Reference file | Target client | Target file | Exists? |
|---|---|---|---|
…/websocket/python/components/Constructor.js | dart | …/websocket/dart/components/Constructor.js | yes |
…/websocket/python/components/Constructor.js | java/quarkus | …/websocket/java/quarkus/components/Constructor.js | yes |
…/websocket/python/example.py | dart | …/websocket/dart/example.dart | yes |
Structural equivalence is by role, not always by filename — e.g. python declares instance fields in Constructor.js while dart declares them in ClientFields.js; the root example file's equivalent is the target's own root example file.
This table is the injection map — the execution steps edit exactly these target files and no others, with one exemption: Branch A additionally edits the shared component itself under packages/components/ (its config map and Language typedef in src/components/<Component>.js, and its test in test/components/<Component>.test.js). Those files are per-feature rather than per-target, so they are not rows in this table; the Branch A execution steps name them explicitly. If a target has no structurally equivalent file at all (Exists? = no — the feature would need an entirely new file, not an edit to an existing one), flag that row — that's a bigger change than this skill's mechanical scope assumes, and the user should confirm before you proceed.
Any step that writes target-language code is a cross-language translation — the code strings inside a Branch A config-map entry just as much as Branch B's template-local logic. Translation is the one judgment call in this skill, so never translate freely from general language knowledge; anchor every choice to something checkable in this repo by running these two steps before writing any code. Their output is what the closing steps verify deterministically: the snapshot diff there must match the golden snippet produced here.
Break the reference logic into its constructs (env-var read, null/absence check, map assignment, string interpolation, error raise, …). For each construct, find how the target language already expresses it in this repo and record one row per construct — print the table back to the user:
| Construct (reference: python) | Target idiom (dart) | Precedent file |
|---|---|---|
os.getenv("X") | Platform.environment['X'] | …/dart/components/Connect.js |
params["x"] = y | params['x'] = y; | …/dart/components/Connect.js |
if x is not None: | if (x != null) { | …/dart/components/HandleMessage.js |
Precedent sources, in priority order:
template/ and components/ files (Grep them for the construct).Repo precedent wins over textbook syntax: it matches the style the generated client already uses, keeps snapshot churn minimal, and turns free-form translation into filling in a table. Only fall back to general language knowledge for a construct with no precedent anywhere in the repo — and mark that row (no precedent) so the user knows which lines rest on judgment alone.
Using the idiom map, author the exact target-language code the generated client file should contain after the port, and print it to the user. The snippet must mirror the reference 1:1 — same structure, same order of operations, same variable roles; no "improvements," no restructuring. The goal is behavioral parity, not a better implementation. This is the expected answer the closing steps' snapshot diff is checked against — writing it first means that diff is compared to a committed intent, not eyeballed for plausibility.
Execute in order:
Run the translation protocol for each target language, then add a config-map entry for each target language missing one, modeled directly off an existing sibling entry in the shared component (same keys/shape, target language's syntax from the idiom map only). Match the existing entry's shape exactly: if siblings return { variableDefinition, ifCondition, assignment, closing }, the new entry returns the same four keys, not a reinterpretation.
Worked example — adding a dart entry to queryParamLogicConfig in QueryParamsVariables.js, modeled off the existing javascript entry (same four keys, Dart syntax only):
// Existing sibling (javascript):
// variableDefinition → `const ${paramName} = ${paramName} || process.env.${paramName.toUpperCase()};`
// ifCondition → `if (${paramName}) {`
// assignment → `params["${paramName}"] = ${paramName};`
// closing → `}`
dart: (param) => {
const paramName = param[0];
return {
variableDefinition: {
text: `final ${paramName}Value = ${paramName} ?? Platform.environment['${paramName.toUpperCase()}'];`,
indent: 8,
},
ifCondition: { text: `if (${paramName}Value != null) {`, indent: 8 },
assignment: { text: `params['${paramName}'] = ${paramName}Value;`, indent: 10 },
closing: { text: '}', indent: 8, newLines: 1 },
};
},Also extend the component's @typedef Language union (e.g. 'python' | 'java' | 'javascript' → add 'dart'), and delete any JSDoc note that explains why the target language was previously excluded — the port makes it stale. The typedef is manual (the runtime supportedLanguages check derives from Object.keys(<config>) and updates itself) but is not published to the API docs; see closing step 5 for how to read the docs diff.
Wire the shared component into targets that don't call it yet. Add the import, plumb the required prop through the call chain the same way the reference sources it (e.g. via a helper like getQueryParams), and render the shared component with language='<target>' (and framework='<target-framework>' where applicable).
Extend the shared component's test. Add one snapshot case per new language branch to packages/components/test/components/<Component>.test.js, following the existing per-language case pattern exactly. If that test file does not exist yet, create it first, modeled on a sibling component's test — per AGENT.md §4.5 every shared component must have its own tests, so a missing file is a gap to close, not a reason to skip this step. Then regenerate the component's snapshot:
(cd packages/components && npm run test:update -- <Component>)This rebuilds lib/ and then runs jest with -u, scoped to that component's suite.
Open the regenerated .snap and sanity-check the new language's output before moving on — the real correctness gate is the integration-snapshot diff in the closing steps.
Execute in order:
Run the translation protocol for each target file in the injection map: build the idiom map, then write the golden snippet.
Write the template code. Write the template/component code so it renders exactly the golden snippet — the rendered output is the contract, and closing step 3's snapshot diff verifies it. All translation decisions were already made in the golden snippet; nothing new gets invented here.
Do not create a new shared component during this port, even though the logic now exists in reference + N targets after this change. Porting and deduping are separate concerns — deduping is deliberately deferred to the handoff step below.
Run these regardless of which branch you executed:
Rebuild the shared package if the port touched packages/components/src (Branch A always does). Integration tests transpile templates against packages/components/lib/ (Babel output), not src/. The test:update run in Branch A step 3 already rebuilds lib/, so this step is only needed if you edited src/ again after it — but skipping it in that case regenerates snapshots against stale component code:
npm run components:buildRegenerate integration snapshots for the protocol:
(cd packages/templates/clients/<protocol>/test/integration-test && npm run test:update)or per client: npm run test:<lang>:update.
Diff the snapshots as the correctness gate:
git diff packages/templates/clients/<protocol>/test/integration-test/__snapshots__/This is where the translation protocol's output gets verified: the added snapshot lines must match the golden snippet from protocol step 2 — not merely "look right." Modest whitespace churn elsewhere is expected; any deviation from the golden snippet, or large semantic diffs (different method names, missing lines, changed body content), means a step above is wrong — usually the idiom map or the code that consumed it. Fix the offending step and re-run steps 2–3 rather than accepting the diff.
Run the full check from the repo root:
npm run templates:test
npm run lintBranch A only — regenerate the components API docs:
turbo run docs --filter=@asyncapi/generator-componentsthen git diff apps/generator/docs/api_components.md. Interpret the diff by what actually changed: the repo's jsdoc2md handlebars template publishes only function-level JSDoc (description, @param, @returns, @example) — @typedef unions are never emitted into the doc. If the port only extended the Language typedef and added config entries, an empty diff is correct; confirm by grepping the published file for the component's section rather than looping on rewrites of good JSDoc. Only if a function-level JSDoc block changed (or a new public component was added) does an empty diff mean the JSDoc is missing or malformed (per AGENT.md §2.4, this doc is a committed artifact that must be regenerated in the same PR as any public-signature change).
Changeset reminder. Per AGENT.md §2.5, packages/templates/* is private/unpublished, so target this change at @asyncapi/generator. Add @asyncapi/generator-components as well whenever Branch A modified anything under packages/components — a new config-map entry changes the published package's rendered output even though the component's prop signature is unchanged, so the signature alone is not the trigger.
After porting, check whether the ported logic is now duplicated with no shared home:
Glob for packages/templates/clients/**/components/<SameFileName>.js; if it returns 2+, report this to the user and offer via AskUserQuestion to invoke migrate-component next.Constructor.js alongside unrelated logic), automatic duplication detection is unreliable — tell the user duplication may now exist and let them decide, rather than guessing.packages/components/src/components/QueryParamsVariables.js.packages/components/test/components/QueryParamsVariables.test.js.© asyncapi, Apache-2.0. 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 .claude/skills/port-client-component of asyncapi/generator.
Open the folder on GitHubat commit ab1f79a
Port Client Component 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 |
|---|---|---|---|---|---|---|
| Port Client Component this skillasyncapi/generator | 1.1k | — | ~4.6k | Automated safety check: Pass | Apache-2.0 | |
| Assess Migrationmendixlabs/mxcli | 129 | — | ~3.6k | Automated safety check: Notes | Apache-2.0 | |
| Detecting Insecure Deserializationjeremylongshore/tons-of-skills-marketplace | 2.8k | — | ~1.4k | Automated safety check: Pass | MIT | |
| Rds Sqlserveraws/agent-toolkit-for-aws | 2.8k | — | ~6.3k | Automated safety check: Pass | Apache-2.0 | |
| Backend DevelopmentaAAaqwq/AGI-Super-Team | 105 | 1 repos | ~1.8k | Automated safety check: Notes | MIT | |
| Dt Obs ServicesDynatrace/dynatrace-for-ai | 162 | — | ~3.3k | Automated safety check: Pass | Apache-2.0 |
mendixlabs/mxcli
Investigate an existing non-Mendix application (Java, .NET, Python, Node, PHP, …) and produce a structured migration assessment for Mendix.
jeremylongshore/tons-of-skills-marketplace
Scan a source tree for unsafe-by-default deserialization APIs: Python pickle.loads / cPickle / shelve / dill, Ruby Marshal.load / YAML.load (pre-3.1 default), Java ObjectInputStream.readObject, PHP…
aws/agent-toolkit-for-aws
Provides connectivity, authentication, and troubleshooting guidance for Amazon RDS for SQL Server.
aAAaqwq/AGI-Super-Team
老王我是后端通才,啥后端技术都能搞!但你得告诉老王你想用啥语言,别tm让老王我瞎猜!. An agent skill from aAAaqwq/AGI-Super-Team.
Dynatrace/dynatrace-for-ai
Service performance monitoring with RED metrics (Rate, Errors, Duration) and runtime-specific telemetry for Java, .NET, Node.js, Python, PHP, and Go.
intellectronica/agent-skills
This skill helps with GitHub Copilot SDK work across Node.js/TypeScript, Python, Go, .NET, and Java.
asyncapi/generator
A skill your agent uses when editing, adding, or reviewing any file under .github/workflows/, or when a CI step installs a CLI tool (npm i -g, npx, pipx, uses: /setup-).
asyncapi/generator
Promote a duplicated React/JSX template-local component into the shared @asyncapi/generator-components package.
Categories
Port a component or feature that already exists in one protocol client template to sibling clients under packages/templates/clients/<protocol/ that are missing it. Port Client Component is an agent skill from asyncapi/generator. Port a component or feature that already exists in one protocol client template to sibling clients under packages/templates/clients/<protocol/ that are missing it.
Port Client Component fits situations like: the user asks to port; add this to the other client(s) too; do the same for python/dart/java; describes a parity gap between clients of the same protocol.
Run `npx skills add asyncapi/generator --skill port-client-component -a claude-code`. Or copy the skill folder (.claude/skills/port-client-component in asyncapi/generator) into .claude/skills/port-client-component in your project. Claude Code loads it when a task matches its description.
Run `npx skills add asyncapi/generator --skill port-client-component -a codex`. Or copy the skill folder (.claude/skills/port-client-component in asyncapi/generator) into .agents/skills/port-client-component 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 asyncapi/generator --skill port-client-component -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/port-client-component, .gemini/skills/port-client-component, .github/skills/port-client-component and .opencode/skills/port-client-component in your project.
Going by SKILL.md and its folder, Port Client Component needs the command-line tools its instructions call (npm, git and turbo). Our summary lists: Python 3.
SKILL.md contains no URLs. Its commands use npm and git, which can reach the network depending on how they are called. 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.
Port Client Component is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 4.6k tokens (SKILL.md is roughly 18k 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 Port Client Component: Assess Migration (mendixlabs/mxcli, 129 stars), Detecting Insecure Deserialization (jeremylongshore/tons-of-skills-marketplace, 2.8k stars), Rds Sqlserver (aws/agent-toolkit-for-aws, 2.8k stars) and Backend Development (aAAaqwq/AGI-Super-Team, 105 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
asyncapi (a GitHub organization) maintains it in asyncapi/generator, which has 1,081 GitHub stars. The repository holds 3 skills in this directory. The repository was last updated on October 5, 2026.
Source: asyncapi/generator on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.