Plugin Testing
polyipseity/obsidian-terminal
Skill for testing Obsidian plugin features in this repository.
Author a new Cartography intel module end-to-end (entry point, sync GET/TRANSFORM/LOAD/CLEANUP, declarative data model, integration test, schema docs).
$ npx skills add cartography-cncf/cartography --skill create-module -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install cartography-cncf/cartography create-module --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/cartography-cncf/cartography.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/create-module .claude/skills/create-module && 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 "create-module" agent skill from https://github.com/cartography-cncf/cartography/tree/master/.agents/skills/create-module into .claude/skills/create-module/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "create-module", 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/cartography-cncf/cartography/tree/master/.agents/skills/create-moduleType 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 cartography-cncf/cartography --skill create-module -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install cartography-cncf/cartography create-module --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/cartography-cncf/cartography.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/create-module .agents/skills/create-module && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "create-module" agent skill from https://github.com/cartography-cncf/cartography/tree/master/.agents/skills/create-module into .agents/skills/create-module/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "create-module", 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 cartography-cncf/cartography --skill create-module -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install cartography-cncf/cartography create-module --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/cartography-cncf/cartography.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/create-module .cursor/skills/create-module && 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 "create-module" agent skill from https://github.com/cartography-cncf/cartography/tree/master/.agents/skills/create-module into .cursor/skills/create-module/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "create-module", 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/cartography-cncf/cartography.git --path .agents/skills/create-module--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 cartography-cncf/cartography --skill create-module -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install cartography-cncf/cartography create-module --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/cartography-cncf/cartography.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/create-module .gemini/skills/create-module && 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 "create-module" agent skill from https://github.com/cartography-cncf/cartography/tree/master/.agents/skills/create-module into .gemini/skills/create-module/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "create-module", 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 cartography-cncf/cartography create-moduleInstalls 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 cartography-cncf/cartography --skill create-module -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/cartography-cncf/cartography.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/create-module .github/skills/create-module && 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 "create-module" agent skill from https://github.com/cartography-cncf/cartography/tree/master/.agents/skills/create-module into .github/skills/create-module/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "create-module", 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 cartography-cncf/cartography --skill create-module -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install cartography-cncf/cartography create-module --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/cartography-cncf/cartography.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/create-module .opencode/skills/create-module && 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 "create-module" agent skill from https://github.com/cartography-cncf/cartography/tree/master/.agents/skills/create-module into .opencode/skills/create-module/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "create-module", 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.
create-moduleAuthor a new Cartography intel module end-to-end (entry point, sync GET/TRANSFORM/LOAD/CLEANUP, declarative data model, integration test, schema docs).
Create Module is an agent skill from cartography-cncf/cartography. Author a new Cartography intel module end-to-end (entry point, sync GET/TRANSFORM/LOAD/CLEANUP, declarative data model, integration test, schema docs). Use when the user asks to add a new provider, integration, intel module, or service ingestion to Cartography (e.g. "add a new module for service X", "integrate ServiceY", "create a sync for Z API").
Its SKILL.md is about 2.5k tokens, which your agent loads only when the skill is triggered. The skill folder holds 6 other files, including reference files (for example `references/coding-conventions.md`, `references/config-docs.md` and `references/data-model.md`).
It sits in Testing & QA, covering Integration testing. The repository describes itself as: Cartography is a Python tool that pulls infrastructure assets and their relationships into a Neo4j graph database. The licence is Apache-2.0.
10 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit e4eda50. 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:
gitmakepytestFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use 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.
Create Module loads about 2.5k tokens when it runs, and up to ~8.3k if it reads all its reference files. Until then it costs about 91 tokens; SKILL.md has 775 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 cartography-cncf/cartography at commit e4eda50, republished under its Apache-2.0 licence (© cartography-cncf). 775 words, ~2,471 tokens.
.claude/skills/create-module/SKILL.md (or your agent's skills folder). This skill also uses 5 other files; get the full folder from GitHub.Build a brand new Cartography intel module from scratch using the modern declarative data model. The module must follow the standard sync pattern (get -> transform -> load -> cleanup) and be exercised by an integration test.
load() / load_matchlinks() from cartography.client.core.tx, and GraphJob.from_node_schema() for cleanup.<Service>Tenant). Never to an infrastructure parent..get() with None default. Do not silently swallow exceptions in get().CartographyNodeSchema / CartographyRelSchema subclass is ignored. See the add-node-type and add-relationship skills.sync(), not individual load() calls. Mock only external boundaries (API clients, credentials).git commit -s (DCO).cartography/intel/your_service/
├── __init__.py # Entry point: start_your_service_ingestion()
└── users.py # Domain sync (or devices.py, projects.py, etc.)
cartography/models/your_service/
├── tenant.py # Tenant/account schema
└── user.py # Domain schemas
tests/data/your_service/
└── users.py # Mock API payloads
tests/integration/cartography/intel/your_service/
└── test_users.py # End-to-end sync testThe entry point (__init__.py) reads from Config, validates required credentials, builds common_job_parameters, and dispatches to per-domain sync() functions. See references/sync-pattern.md for a copy-paste template.
In cartography/cli.py:
PANEL_YOUR_SERVICE = "Your Service Options" and register it in MODULE_PANELS._build_app().run() (use Annotated[Optional[str], typer.Option(...)] with rich_help_panel=PANEL_YOUR_SERVICE).os.environ and pass them into cartography.config.Config(...).In cartography/config.py, extend Config.__init__ with the new fields. Then in your module entry point, validate them and short-circuit with logger.info("... not configured - skipping module") when missing.
cartography/sync.pyAdd one entry to TOP_LEVEL_MODULES using the lazy wrapper. Do not add a top-level import cartography.intel.your_service to sync.py — that defeats lazy SDK loading and reintroduces the slow-startup problem.
TOP_LEVEL_MODULES = OrderedDict({
...
"your_service": _LazyStage("cartography.intel.your_service", "start_your_service_ingestion"),
...
# `analysis` must remain last
"analysis": _LazyStage("cartography.intel.analysis", "run"),
})Pick a sensible position relative to neighbors (cloud providers grouped together, etc.). The provider's heavy SDK imports stay where they are — they only fire when this stage is selected and run.
For each domain (users, devices, projects, ...):
@timeit
def sync(
neo4j_session: neo4j.Session,
api_key: str,
tenant_id: str,
update_tag: int,
common_job_parameters: dict[str, Any],
) -> None:
raw = get(api_key, tenant_id) # 1. GET — dumb, raises on failure
data = transform(raw) # 2. TRANSFORM — shape for ingest
load_users(neo4j_session, data, tenant_id, update_tag) # 3. LOAD — data model
cleanup(neo4j_session, common_job_parameters) # 4. CLEANUP — GraphJobget() should be minimal: set timeouts, call response.raise_for_status(), and let errors propagate. AWS get-functions wrap with @aws_handle_regions. See references/sync-pattern.md for the long-form template, error-handling rules, and transform examples.
Create dataclasses in cartography/models/your_service/. Required for every node:
@dataclass(frozen=True)
class YourServiceUserNodeProperties(CartographyNodeProperties):
id: PropertyRef = PropertyRef("id") # REQUIRED
lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True) # REQUIRED
# business properties...
tenant_id: PropertyRef = PropertyRef("TENANT_ID", set_in_kwargs=True)The schema picks a label, properties, and the mandatory sub_resource_relationship to your tenant-like node:
@dataclass(frozen=True)
class YourServiceUserSchema(CartographyNodeSchema):
label: str = "YourServiceUser"
properties: YourServiceUserNodeProperties = YourServiceUserNodeProperties()
sub_resource_relationship: YourServiceTenantToUserRel = YourServiceTenantToUserRel()
other_relationships: OtherRelationships = OtherRelationships([
YourServiceUserToHumanRel(),
])For advanced node configurations (extra labels, conditional labels, scoped cleanup, one-to-many) see the add-node-type skill. For relationships, MatchLinks, and multi-module patterns see the add-relationship skill. See references/data-model.md for the full reference.
def load_users(neo4j_session, data, tenant_id, update_tag):
load(neo4j_session, YourServiceTenantSchema(), [{"id": tenant_id}], lastupdated=update_tag)
load(neo4j_session, YourServiceUserSchema(), data, lastupdated=update_tag, TENANT_ID=tenant_id)
def cleanup(neo4j_session, common_job_parameters):
GraphJob.from_node_schema(YourServiceUserSchema(), common_job_parameters).run(neo4j_session)If you hand-write a Cypher write query during prototyping, use run_write_query() (managed transaction + retries), never neo4j_session.run().
In tests/integration/cartography/intel/your_service/test_users.py, patch only get() and call sync() end-to-end. Assert outcomes (nodes + relationships) using tests.integration.util.check_nodes / check_rels. Do not assert on mock call counts or internal parameters. See references/testing.md for a full template and the test boundary policy.
Create docs/root/modules/your_service/index.md and
docs/root/modules/your_service/config.md, then add config and schema to
the module's toctree. Follow references/config-docs.md exactly for the
canonical config.md structure and content-placement rules.
Do not create or hand-edit schema.md. Sphinx generates it from the
declarative data model. Write human-readable schema documentation in the model
itself:
description= to every displayed PropertyRef.enrich-ontology skill when adding semantic labels or canonical
ontology projections.If the module needs post-ingestion enrichment (internet exposure, permission inheritance, cross-resource linking), call run_typed_analysis_job() / run_scoped_typed_analysis_job() at the end of the entry point. See the analysis-jobs skill.
make lint
# integration test for the module:
pytest tests/integration/cartography/intel/your_service/ -xSign every commit: git commit -s -m "...". Update the PR description to match .github/pull_request_template.md.
Config fields wired, secrets resolved from env varscartography/sync.py:TOP_LEVEL_MODULES via _LazyStage, with no top-level import cartography.intel.<service> added to sync.pylabel, properties, sub_resource_relationship, other_relationships, extra_node_labels, scoped_cleanup)data["x"], optional use data.get("x") with None defaultextra_index=True set on frequently queried fieldssync(), asserts nodes + rels with check_nodes / check_relsindex.md and canonical config.md added with a config / schema toctreePropertyRef values have descriptionsschema.md was addedmake lint clean, git commit -s usedSee the troubleshooting skill for ModuleNotFoundError, PropertyRef validation failed, missing relationships, cleanup misbehavior, and date-handling pitfalls.
references/sync-pattern.md — full templates for __init__.py, sync(), get(), transform(), error-handling rules.references/data-model.md — node properties, schema, sub-resource relationships, loading, ECS example.references/testing.md — integration test template, check_nodes / check_rels, mocking policy, integration test boundary.references/coding-conventions.md — error handling, type hints, logging levels and format, deprecation conventions.references/config-docs.md — canonical module config.md template and content-placement rules.© cartography-cncf, 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
SKILL.md and 5 other files (references) in .agents/skills/create-module of cartography-cncf/cartography.
Open the folder on GitHubat commit e4eda50
Create Module 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 |
|---|---|---|---|---|---|---|
| Create Module this skillcartography-cncf/cartography | 4.1k | — | ~2.5k | Automated safety check: Pass | Apache-2.0 | |
| Plugin Testingpolyipseity/obsidian-terminal | 948 | — | ~828 | Automated safety check: Pass | AGPL-3.0 | |
| Td Integration Testmarcus/td | 250 | — | ~1.2k | Automated safety check: Pass | MIT | |
| Integration E2E Testingshinpr/claude-code-workflows | 690 | — | ~3.5k | Automated safety check: Pass | MIT | |
| JS-in-HTML Testingliaohch3/claude-tap | 3.3k | — | ~924 | Automated safety check: Pass | MIT | |
| Crosvm Testinggoogle/crosvm | 1.3k | — | ~847 | Automated safety check: Pass | BSD-3-Clause |
polyipseity/obsidian-terminal
Skill for testing Obsidian plugin features in this repository.
marcus/td
Write integration tests for the td-sync admin API using the TestHarness in internal/api/testharnesstest.go.
shinpr/claude-code-workflows
Integration and E2E test design principles, ROI calculation, test skeleton specification, and review criteria.
liaohch3/claude-tap
Tests JavaScript embedded in an HTML file in two layers: pytest checks of the logic ported to Python, and Playwright runs in a real browser for the DOM.
google/crosvm
Skill to assist with running tests and managing test VMs in the crosvm repository.
talkincode/toughradius
Write CI-executable acceptance/integration tests for protocol or end-to-end changes (TR-F022).
cartography-cncf/cartography
Define a new node schema under cartography/models/MODULENAME/, including required properties, sub-resource relationships, extra labels, conditional labels, scoped cleanup, and one-to-many transforms.
cartography-cncf/cartography
Define a CartographyRelSchema (standard relationship), one-to-many edge, or MatchLink connecting existing nodes.
cartography-cncf/cartography
Add a post-ingestion typed analysis job to a Cartography module to enrich the graph after sync.
cartography-cncf/cartography
Author a Cartography security rule (one or more Cypher Facts plus a Pydantic Finding output model) under cartography/rules/data/rules/.
cartography-cncf/cartography
Map a Cartography node into the Ontology system using semantic labels (UserAccount, DeviceInstance, Tenant, Database, ObjectStorage, FileStorage) or canonical nodes (User, Device).
cartography-cncf/cartography
Promote provider-specific relationships to a canonical cross-provider ontology edge using the WORKLOADPARENT pattern (a parallel CartographyRelSchema with the canonical rellabel, the old edge kept…
Categories
Author a new Cartography intel module end-to-end (entry point, sync GET/TRANSFORM/LOAD/CLEANUP, declarative data model, integration test, schema docs). Create Module is an agent skill from cartography-cncf/cartography. Author a new Cartography intel module end-to-end (entry point, sync GET/TRANSFORM/LOAD/CLEANUP, declarative data model, integration test, schema docs).
Create Module fits situations like: the user asks to add a new provider; service ingestion to Cartography (e.g.
Run `npx skills add cartography-cncf/cartography --skill create-module -a claude-code`. Or copy the skill folder (.agents/skills/create-module in cartography-cncf/cartography) into .claude/skills/create-module in your project. Claude Code loads it when a task matches its description.
Run `npx skills add cartography-cncf/cartography --skill create-module -a codex`. Or copy the skill folder (.agents/skills/create-module in cartography-cncf/cartography) into .agents/skills/create-module 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 cartography-cncf/cartography --skill create-module -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/create-module, .gemini/skills/create-module, .github/skills/create-module and .opencode/skills/create-module in your project.
Going by SKILL.md and its folder, Create Module needs the command-line tools its instructions call (git, make and pytest). Our summary lists: Python 3.
SKILL.md contains no URLs. Its commands use 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.
Create Module 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.5k tokens (SKILL.md is roughly 9.9k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 5.8k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Create Module: Plugin Testing (polyipseity/obsidian-terminal, 948 stars), Td Integration Test (marcus/td, 250 stars), Integration E2E Testing (shinpr/claude-code-workflows, 690 stars) and JS-in-HTML Testing (liaohch3/claude-tap, 3.3k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
cartography-cncf (a GitHub organization) maintains it in cartography-cncf/cartography, which has 4,120 GitHub stars. The repository holds 11 skills in this directory. The repository was last updated on October 7, 2026.
Source: cartography-cncf/cartography on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.