Mirage VFS Adapter Authoring
strukto-ai/mirage
Builds or extends a custom Mirage virtual filesystem adapter for an API, database, object store or app data, with a working mount configuration and filesystem tests.
Guides building Flowsint enrichers and types: where definitions live, how the base class and vault work, and when a new type is warranted.
$ npx skills add reconurge/flowsint --skill flowsint-enricher-builder -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install reconurge/flowsint flowsint-enricher-builder --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/reconurge/flowsint.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/flowsint-enricher-builder .claude/skills/flowsint-enricher-builder && 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 "flowsint-enricher-builder" agent skill from https://github.com/reconurge/flowsint/tree/main/.claude/skills/flowsint-enricher-builder into .claude/skills/flowsint-enricher-builder/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "flowsint-enricher-builder", 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/reconurge/flowsint/tree/main/.claude/skills/flowsint-enricher-builderType 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 reconurge/flowsint --skill flowsint-enricher-builder -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install reconurge/flowsint flowsint-enricher-builder --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/reconurge/flowsint.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/flowsint-enricher-builder .agents/skills/flowsint-enricher-builder && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "flowsint-enricher-builder" agent skill from https://github.com/reconurge/flowsint/tree/main/.claude/skills/flowsint-enricher-builder into .agents/skills/flowsint-enricher-builder/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "flowsint-enricher-builder", 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 reconurge/flowsint --skill flowsint-enricher-builder -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install reconurge/flowsint flowsint-enricher-builder --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/reconurge/flowsint.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/flowsint-enricher-builder .cursor/skills/flowsint-enricher-builder && 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 "flowsint-enricher-builder" agent skill from https://github.com/reconurge/flowsint/tree/main/.claude/skills/flowsint-enricher-builder into .cursor/skills/flowsint-enricher-builder/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "flowsint-enricher-builder", 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/reconurge/flowsint.git --path .claude/skills/flowsint-enricher-builder--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 reconurge/flowsint --skill flowsint-enricher-builder -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install reconurge/flowsint flowsint-enricher-builder --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/reconurge/flowsint.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/flowsint-enricher-builder .gemini/skills/flowsint-enricher-builder && 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 "flowsint-enricher-builder" agent skill from https://github.com/reconurge/flowsint/tree/main/.claude/skills/flowsint-enricher-builder into .gemini/skills/flowsint-enricher-builder/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "flowsint-enricher-builder", 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 reconurge/flowsint flowsint-enricher-builderInstalls 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 reconurge/flowsint --skill flowsint-enricher-builder -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/reconurge/flowsint.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/flowsint-enricher-builder .github/skills/flowsint-enricher-builder && 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 "flowsint-enricher-builder" agent skill from https://github.com/reconurge/flowsint/tree/main/.claude/skills/flowsint-enricher-builder into .github/skills/flowsint-enricher-builder/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "flowsint-enricher-builder", 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 reconurge/flowsint --skill flowsint-enricher-builder -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install reconurge/flowsint flowsint-enricher-builder --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/reconurge/flowsint.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/flowsint-enricher-builder .opencode/skills/flowsint-enricher-builder && 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 "flowsint-enricher-builder" agent skill from https://github.com/reconurge/flowsint/tree/main/.claude/skills/flowsint-enricher-builder into .opencode/skills/flowsint-enricher-builder/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "flowsint-enricher-builder", 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.
flowsint-enricher-builderGuides building Flowsint enrichers and types: where definitions live, how the base class and vault work, and when a new type is warranted.
This skill has the agent build enrichers and entity types for Flowsint by reading the source instead of relying on memory. It lists the authoritative paths: type definitions and their registry, the enricher base class and registry, existing enrichers as templates, the UI category mapping, the vault and logger interfaces, external tool wrappers under tools/, and the developer docs for types, enrichers and the catalog.
Its first question for any new enricher is whether to reuse a type, extend one or create a new one. It reuses a type that covers all required fields, extends it when one or two optional fields are missing, and creates a new type when the entity is distinct, with a different primary key, label meaning or graph role. It warns against forcing data into the wrong type, for example putting risk scores into Domain metadata when a RiskProfile type exists.
It also covers wiring in an external API or tool, resolving vault secrets and params, debugging why types or enrichers are not discovered, and designing a pivot from one entity to another.
4 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 4c05849. 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:
poetrymakeFrom 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.
Flowsint Enricher Builder loads about 2.6k tokens when it runs. Until then it costs about 120 tokens; SKILL.md has 1,015 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 reconurge/flowsint at commit 4c05849, republished under its Apache-2.0 licence (© reconurge). 1,015 words, ~2,632 tokens.
.claude/skills/flowsint-enricher-builder/SKILL.md (or your agent's skills folder).You build enrichers and types for Flowsint. You do not memorize the catalog — you know where to look and how the pieces fit. Always read source before generating code: type definitions and existing enrichers are the ground truth.
Read these first. Never assume signatures or fields — open the file.
| What | Path |
|---|---|
| Type definitions | flowsint-types/src/flowsint_types/<name>.py |
| Type registry + decorator | flowsint-types/src/flowsint_types/registry.py |
| Type package exports | flowsint-types/src/flowsint_types/__init__.py |
| Enricher base class | flowsint-core/src/flowsint_core/core/enricher_base.py |
| Enricher registry + decorator | flowsint-enrichers/src/flowsint_enrichers/registry.py |
| Existing enrichers (templates) | flowsint-enrichers/src/flowsint_enrichers/<input_type>/to_<output>.py |
| UI category mapping | flowsint-core/src/flowsint_core/core/services/type_registry_service.py (_get_category_definitions) |
| Vault interface | flowsint-core/src/flowsint_core/core/vault.py |
| Logger interface | flowsint-core/src/flowsint_core/core/logger.py |
| Tools (external CLI/API wrappers) | tools/ (top-level), e.g. tools.network.subfinder.SubfinderTool |
| Doc — types tutorial | docs/developers/managing-types.mdx |
| Doc — enrichers tutorial | docs/developers/managing-enrichers.mdx |
| Doc — enricher catalog | docs/sources/available-enrichers.mdx |
When the user describes a enricher, decide before writing code:
flowsint-types/src/flowsint_types/ — open the closest candidate file and read its fields.ConfigDict.extra = "allow").RiskProfile exists — don't stuff scores into Domain metadata. If nothing fits, propose a new type and tell the user why.Surface the decision to the user before generating code: list candidate types you found, what's missing, and your recommendation.
Minimum surface (read enricher_base.py for the full contract):
from typing import List
from flowsint_core.core.enricher_base import Enricher
from flowsint_core.core.logger import Logger
from flowsint_enrichers.registry import flowsint_enricher
from flowsint_types import Domain, Ip # or whatever types
@flowsint_enricher
class MyEnricher(Enricher):
"""[Source name] One-line purpose."""
InputType = Domain # base type, not List[Domain]
OutputType = Ip
@classmethod
def name(cls) -> str:
return "domain_to_ip" # snake_case, unique
@classmethod
def category(cls) -> str:
return "Domain" # see note on casing below
@classmethod
def key(cls) -> str:
return "domain" # primary field of InputType
@classmethod
def get_params_schema(cls): # optional, only if params needed
return [...]
async def scan(self, data: List[InputType]) -> List[OutputType]: ...
def postprocess(self, results, input_data):
for src, dst in zip(input_data, results):
self.create_node(src)
self.create_node(dst)
self.create_relationship(src, dst, "RESOLVES_TO")
return results
InputType = MyEnricher.InputType
OutputType = MyEnricher.OutputTypeFile location: flowsint-enrichers/src/flowsint_enrichers/<input_type>/to_<target>.py. The directory matches the input type's lowercase name. If no directory exists for your input type, create it (no __init__.py needed — auto-discovery walks the tree).
Registration: the @flowsint_enricher decorator does it. Do not edit any registry.py. API restart picks up new files via load_all_enrichers().
Defined via get_params_schema() classmethod. Each entry is a dict:
| Field | Required | Notes |
|---|---|---|
name | yes | Param key; for vaultSecret, also the default vault key name |
type | yes | One of string, number, select, url, vaultSecret |
description | yes | Shown in UI |
required | no | Defaults to false |
default | no | Default value |
options | for select | List of {"label": ..., "value": ...} |
Read params inside scan():
mode = self.params.get("mode", "passive")
api_key = self.get_secret("MY_API_KEY") # vault-resolved during async_initVault resolution flow (see Enricher.resolve_params in enricher_base.py):
MY_API_KEY).required: true and nothing found → Exception("Required vault secret 'MY_API_KEY' is missing...").Never hardcode keys. Always declare a vaultSecret param. Document the expected vault key name in the docstring.
create_node(obj) and create_relationship(from_obj, to_obj, rel_label="IS_RELATED_TO") take Pydantic objects directly. Don't manually construct node dicts — pass the typed instance.
Relationship label convention: UPPER_SNAKE_CASE verb phrase (HAS_DOMAIN, RESOLVES_TO, FOUND_IN_BREACH). Be consistent with existing enrichers — grep before inventing a new label.
self.log_graph_message("...") for graph-related progress logs. Logger.info / error / warn(self.sketch_id, {"message": "..."}) for general logs.
When you decide a new type is warranted:
flowsint-types/src/flowsint_types/<snake_case>.py.PascalCase, inherit from FlowsintType, decorate with @flowsint_type.Field(..., json_schema_extra={"primary": True}). Must uniquely identify the entity (used as Neo4j MERGE key).compute_label: @model_validator(mode='after'), sets self.nodeLabel, returns self. Handle None for optional fields.__init__.py: add import + entry in __all__.("MyType", "primary_field_name", icon) tuple in _get_category_definitions() in type_registry_service.py. Without this, the type works as an enricher I/O but doesn't show in the UI type picker.cd flowsint-types && poetry install (or make prod from repo root).tests/test_<name>.py covering creation, primary uniqueness, compute_label with full/partial fields.Full template + patterns: docs/developers/managing-types.mdx.
name(): <input>_to_<output> snake_case (e.g. domain_to_ip, email_to_breaches).to_<target>.py under <input_type>/ directory.DomainToIpEnricher, WhoisEnricher).UPPER_SNAKE_CASE verb.[ToolName/Source] tag — convention used across the codebase (e.g. """[DeHashed] Get breach intelligence ...""").Known smell: category() strings are inconsistent in source (Ip vs IP, lowercase social/phones mixed with PascalCase). When adding a new enricher, match the casing already used in the same directory — don't introduce a third variant. If the user asks for a cleanup pass, flag it as a separate task.
flowsint-types/src/flowsint_types/. List what exists, what's missing.flowsint-enrichers/src/flowsint_enrichers/<input>/to_*.py. Copy its structure (imports, class methods, postprocess pattern).tools/ already have one? If yes, import it. If no, the user needs a new tool first — point them to docs/developers/managing-tools.mdx.vaultSecret).scan with explicit try/except per item — one failing input must not kill the batch. Log every failure via Logger.error.postprocess: nodes + relationships from typed instances.InputType / OutputType at module bottom (codebase convention).tests/test_<enricher>.py checking metadata, types, and one happy-path scan.postprocess instead of passing Pydantic objects.except must log.scan when preprocess (in the base class) already validates InputType via TypeAdapter.registry.py to register an enricher manually — the decorator does it.Any as InputType/OutputType outside the n8n/ connector escape hatch.If the user proposes stuffing data into a type that doesn't fit, push back. Show the existing type's fields, explain the mismatch, propose the cleaner alternative (extend or new type). Don't generate the bad version.
© reconurge, 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/flowsint-enricher-builder of reconurge/flowsint.
Open the folder on GitHubat commit 4c05849
Flowsint Enricher Builder 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 |
|---|---|---|---|---|---|---|
| Flowsint Enricher Builder this skillreconurge/flowsint | 9.6k | — | ~2.6k | Automated safety check: Pass | Apache-2.0 | |
| Mirage VFS Adapter Authoringstrukto-ai/mirage | 3.7k | — | ~2.4k | Automated safety check: Pass | Apache-2.0 | |
| DDNS Provider DevelopmentNewFuture/DDNS | 4.7k | — | ~558 | Automated safety check: Pass | MIT | |
| TqSdk Trading and Datashinnytech/tqsdk-python | 5.1k | — | ~2k | Automated safety check: Pass | Apache-2.0 | |
| Hugging Face API Tool Builderhuggingface/skills | 11k | 2 repos | ~1.5k | Automated safety check: Pass | Apache-2.0 | |
| Osint Investigationjohnson7788/MultiUserClaw | 327 | — | ~3k | Automated safety check: Pass | MIT |
strukto-ai/mirage
Builds or extends a custom Mirage virtual filesystem adapter for an API, database, object store or app data, with a working mount configuration and filesystem tests.
NewFuture/DDNS
Adds or changes a DNS provider in the DDNS project while keeping its code, schemas, tests and Chinese and English docs consistent.
shinnytech/tqsdk-python
Answers TqSdk Python questions on market data, accounts, orders, margin trials, simulation and backtesting, using the library's own docs and examples.
huggingface/skills
Builds reusable command line scripts that fetch, enrich or process data from the Hugging Face API, aimed at chained, repeated or automated tasks.
johnson7788/MultiUserClaw
Public-records OSINT investigation framework — SEC EDGAR filings, USAspending contracts, Senate lobbying, OFAC sanctions, ICIJ offshore leaks, NYC property records (ACRIS), OpenCorporates…
Tommy-yw/RunbookHermes
Passive domain reconnaissance using Python stdlib. An agent skill from Tommy-yw/RunbookHermes.
Works with
Categories
Guides building Flowsint enrichers and types: where definitions live, how the base class and vault work, and when a new type is warranted. This skill has the agent build enrichers and entity types for Flowsint by reading the source instead of relying on memory. It lists the authoritative paths: type definitions and their registry, the enricher base class and registry, existing enrichers as templates, the UI category mapping, the vault and logger interfaces, external tool wrappers under tools/, and the developer docs for types, enrichers and the catalog.
Flowsint Enricher Builder fits situations like: adding a new enricher to Flowsint; creating a new Flowsint type for a distinct entity; wiring an external API or command-line tool into Flowsint; debugging why a type or enricher is not discovered.
Run `npx skills add reconurge/flowsint --skill flowsint-enricher-builder -a claude-code`. Or copy the skill folder (.claude/skills/flowsint-enricher-builder in reconurge/flowsint) into .claude/skills/flowsint-enricher-builder in your project. Claude Code loads it when a task matches its description.
Run `npx skills add reconurge/flowsint --skill flowsint-enricher-builder -a codex`. Or copy the skill folder (.claude/skills/flowsint-enricher-builder in reconurge/flowsint) into .agents/skills/flowsint-enricher-builder 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 reconurge/flowsint --skill flowsint-enricher-builder -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/flowsint-enricher-builder, .gemini/skills/flowsint-enricher-builder, .github/skills/flowsint-enricher-builder and .opencode/skills/flowsint-enricher-builder in your project.
Going by SKILL.md and its folder, Flowsint Enricher Builder needs the command-line tools its instructions call (poetry and make). Our summary lists: A checkout of the Flowsint repository; Python.
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.
Flowsint Enricher Builder 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 2.6k tokens (SKILL.md is roughly 11k 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 Flowsint Enricher Builder: Mirage VFS Adapter Authoring (strukto-ai/mirage, 3.7k stars), DDNS Provider Development (NewFuture/DDNS, 4.7k stars), TqSdk Trading and Data (shinnytech/tqsdk-python, 5.1k stars) and Hugging Face API Tool Builder (huggingface/skills, 11k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
reconurge (a GitHub organization) maintains it in reconurge/flowsint, which has 9,590 GitHub stars. The repository was last updated on October 3, 2026.
Source: reconurge/flowsint on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.