AI Visibility
Ryze-AI-Adgent/open-seo-mcp-skills
Measure real AI-engine visibility — traffic from ChatGPT, Perplexity, Claude, Gemini and which pages they cite — from actual GA4 referral data, not prompt sampling.
Diagnose AEO regressions and interpret Canonry AI visibility, Advanced multi-property portfolios, and Site Health evidence.
$ npx skills add Canonry/canonry --skill aero -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install Canonry/canonry aero --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/Canonry/canonry.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/aero .claude/skills/aero && 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 "aero" agent skill from https://github.com/Canonry/canonry/tree/main/skills/aero into .claude/skills/aero/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "aero", 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/Canonry/canonry/tree/main/skills/aeroType 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 Canonry/canonry --skill aero -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install Canonry/canonry aero --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Canonry/canonry.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/aero .agents/skills/aero && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "aero" agent skill from https://github.com/Canonry/canonry/tree/main/skills/aero into .agents/skills/aero/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "aero", 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 Canonry/canonry --skill aero -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install Canonry/canonry aero --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Canonry/canonry.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/aero .cursor/skills/aero && 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 "aero" agent skill from https://github.com/Canonry/canonry/tree/main/skills/aero into .cursor/skills/aero/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "aero", 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/Canonry/canonry.git --path skills/aero--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 Canonry/canonry --skill aero -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install Canonry/canonry aero --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Canonry/canonry.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/aero .gemini/skills/aero && 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 "aero" agent skill from https://github.com/Canonry/canonry/tree/main/skills/aero into .gemini/skills/aero/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "aero", 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 Canonry/canonry aeroInstalls 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 Canonry/canonry --skill aero -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/Canonry/canonry.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/aero .github/skills/aero && 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 "aero" agent skill from https://github.com/Canonry/canonry/tree/main/skills/aero into .github/skills/aero/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "aero", 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 Canonry/canonry --skill aero -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install Canonry/canonry aero --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Canonry/canonry.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/aero .opencode/skills/aero && 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 "aero" agent skill from https://github.com/Canonry/canonry/tree/main/skills/aero into .opencode/skills/aero/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "aero", 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.
aeroDiagnose AEO regressions and interpret Canonry AI visibility, Advanced multi-property portfolios, and Site Health evidence.
Aero is an agent skill from Canonry/canonry. Diagnose AEO regressions and interpret Canonry AI visibility, Advanced multi-property portfolios, and Site Health evidence. Use when a mention or citation coverage number moved and needs explaining, when comparing Properties or markets, diagnosing crawl or page findings, preparing a client report or month-over-month comparison, or analyzing a completed cnry sweep or site audit. Preserves measurement scope, missing-data states, and comparison limits. Use the canonry skill for setup and operations.
Its SKILL.md is about 4.8k tokens, which your agent loads only when the skill is triggered. The skill folder holds 11 other files, including reference files (for example `references/aeo-discovery.md`, `references/agent-operations.md` and `references/memory-patterns.md`).
It sits in Marketing & SEO, covering AI search optimization. It works with Model Context Protocol, SQLite and Google Analytics. The repository describes itself as: Agent-first AI SEO (AEO/GEO) operating platform. The licence is MIT.
5 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 3bf6bc3. 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.
No scripts in the folder and no shell commands in SKILL.md.
From 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.
Aero loads about 4.8k tokens when it runs, and up to ~26k if it reads all its reference files. Until then it costs about 127 tokens; SKILL.md has 2,523 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 Canonry/canonry at commit 3bf6bc3, republished under its MIT licence (© Canonry). 2,523 words, ~4,758 tokens.
.claude/skills/aero/SKILL.md (or your agent's skills folder). This skill also uses 10 other files; get the full folder from GitHub.Use Canonry's stored evidence to explain AI visibility and site readiness. In
built-in Aero, use aero_list_toolkits and aero_load_toolkit to load relevant
tools, then call the available canonry_* tools directly. Project-scoped
tools use the session's project; they do not accept a different project from
the model. External agents can use connected MCP or cnry <command> --format json. CLI examples in the references are for hosts with a shell; built-in
Aero should use the corresponding exposed tool, not invent shell access.
Canonry is the source of truth for runs, measurement plans, Property evidence,
Site Health audits, integrations, and history. Read stored page audits before
proposing fresh aeo-audit work. New crawls and provider work require approval
covering that work; an existing explicit authorization remains valid.
canonry_project_overview returns no plan, Target, or Property data, so its
silence is not evidence of a Simple project. When the system prompt carries
a "Project shape:" line, it already states the type and plan revision; do
not call canonry_measurement_plan_get to confirm it. Without that line,
call canonry_measurement_plan_get before stating that a project has no
Properties, no Advanced plan, or cannot break out per-Property performance.
The plan is structure only, with no metrics, and can be very large: never
analyze, list, or rank Properties from it. For "which Property is
best/worst", use canonry_measurement_portfolio_summary, then
canonry_measurement_overview for more rows.references/portfolio-analysis.md before ranking Properties or comparing
Advanced results.canonry_measurement_data_quality (quote completeness expected,
executed, missing, plus unattributedByClass and latestFill), then
canonry_run_completeness with its run.displayedRunId for missing
answers per engine. A Healthy run status and canonry_doctor are not
completeness checks.canonry_competitor_landscape with answers: not-mentioned,
queryClass and runId: latest. Report its selected answer count and
population. These conditioned reads provide counts, not competitive share
of voice. Per-Property named-instead lists sample weak Properties.canonry_measurement_changes once per class, with its
distribution and withinNoise.weakestMarkets, ranked from actual full metro aggregates with its own
population and queryClass. Quote each row's mention and citation rates
with their numerators and denominators. Its eligible/excluded counts cover
every top-level metro; list: markets pages provide the remaining rollups.
tiedAtWeakest.byMetro counts zero-signal Properties within metros. Those
Property counts never supply metro rates or a ranking of metros.withinNoise: true) is within noise. Never call it a gain, loss, trend,
or regression.truncated: true, a total
(totalProperties, total, questionTotal) above its rows, a
nextCursor, a __partialLists field (it comes first and names each list
the tool cut, as shown of total), or a __truncation note is partial. Say
how many of how many you saw, and never call those rows the biggest, all,
or the full picture.
Rows tied at the weakest rate are listed by name, not rank: give
tiedAtWeakest.count and call the rows examples. Compact reads omit
.byMetro; request raw detail only when those tie counts are needed.references/site-health.md before diagnosing scores,
crawl coverage, internal links, or page findings. Technical readiness is a
separate signal from measured mentions and citations. Use the latest audit
run selected by the tool. runSelection explains same-date ambiguity and
prefers complete scans, then the largest page sample, on the latest date.
For a dated question, pass date: YYYY-MM-DD to the crawl or crawl-pages
read. An empty read for an assumed year does not prove a historical scan is
missing. When the user omitted the year, use
availableScanDates.matchingMonthDayDates from the dated no-data result to
resolve it, then request the exact returned YYYY-MM-DD. If several years
match, clarify the year. Its date lists are bounded: totalDates and
matchingMonthDayTotal describe the full stored populations. Never silently
fall back to another date. Use inventorySummary for complete eligibility
and exclusion counts;
unknown indexability never means a canonical points elsewhere. Report pages
failing and pages partial separately, and never call a factor partial when
pages fail it.monitoring toolkit and read
canonry_sentiment; mention and citation tools do not measure it. One
branded call returns the headline, per-engine and per-Property breakdowns
and criticizedProperties. Take per-engine figures from its provider
breakdowns instead of filtering. A provider filter takes ids (openai
for ChatGPT, gemini, claude), and an empty filtered read means the
filter matched nothing, not that sentiment is missing.
criticizedProperties.keys lists up to five Properties, most criticized
first. Give favorable, mixed and unfavorable as counts over
coverage.judged, which counts assessments (one answer can assess several
Properties), and report rated answers of eligible answers separately as
coverage; never divide outcome counts by answers. Quote the most
criticized Properties' answers with canonry_sentiment_evidence (scope
property, outcome: ["mixed", "unfavorable"]). Non-brand is exceptions
only: list its mixed and unfavorable answers, never a non-brand favorable
share. Its rated share is low because most market answers do not name the
Property; that is not missing data. Never pool the two classes, and do not
quote sentiment.overall from the project overview, which pools them. An
absent subject is not unfavorable, an unrated or partial result is not "no
criticism", and partial values are provisional. Say the ratings are
model-classified and experimental. A trend needs two different rated runs:
pass fromRunId: previous-rated and the current toRunId to
canonry_sentiment_compare. If no compatible rated predecessor exists,
say there is no trend yet. Preserve population-change and incomplete-target
reasons; a bounded-search refusal needs an explicit older run, not a claim
that no rating history exists. Preserve other comparison refusal reasons.
Never compare a run with itself. Aero cannot turn sentiment on or
submit a backfill; send those requests to the operator.metrics.propertiesMentioned;
never named is metrics.propertiesNeverMentioned, also available per
market. Preserve unavailable identities and unmeasured states.
tiedAtWeakest requires zero mentions and zero citations. For names given
where none of an answer's targeted Properties was named, use
answers: not-mentioned on the landscape or portfolio summary and report
answerCount with populationSize. Summary reads use compact pages;
follow nextCursor with unchanged filters to complete only pageList.
Request the appropriate list for another ranking, markets or evidence;
the first-page sibling lists are bounded summaries, not complete lists.
When __truncation says a cursor skips omitted rows, retry the original
cursor with a smaller limit as instructed.not_measured, unavailable metrics, and unchecked signals
are not zero. Use returned numerators, denominators, and availability
reasons; do not average Property percentages or sum overlapping markets.aero_inspect_view
first for view-relative claims. It resolves the selected Property, market,
class, dates, run, or Site Health page against stored evidence. Context is
a selection, not permission. Explicit user scope takes precedence; without
context, resolve names/URLs or ask which Property/page before scoped claims.references/agent-operations.md for shared vocabulary, evidence,
comparison, and authority rules. Its MCP onboarding instructions apply to
external hosts; built-in Aero loads its authorized toolkits and has skill-doc
readers. Tool descriptions define the parameters actually available.Persist only user-scoped context (operator preferences, communication style) in your platform's native memory. Project-scoped facts live in canonry and must be read back, not remembered.
Two signals, not one. Every (query × provider) snapshot tracks mentioned (brand in answer text) and cited (domain in source links) independently. Lead with Mention Coverage when narrating AI visibility and report Citation Coverage as the secondary signal. Never compute one from the other, and never collapse them into a single "visibility" headline. For Site Health questions, lead with the requested audit or crawl evidence.
When a project has GA4 connected, traffic is a first-class signal alongside
mentions and citations. Use cnry ga traffic and cnry ga attribution --trend
for the current snapshot. Use the GA referral-history commands for daily series.
Before you quote GA4 data, make sure that cnry ga status has a recent
lastSyncedAt. If it is stale, get approval before you run cnry ga sync.
For Cloud Run, WordPress, Vercel, or Cloudflare, use cnry traffic status and
cnry traffic events for crawler and AI-referral evidence. Before you quote a
server-side AI referral total, run cnry traffic referral-assessment for the
same dates (canonry_traffic_referral_assessment over MCP) and review its
candidate bursts. Quote the unchanged headline beside the separate adjusted
estimate; a candidate burst is not confirmed automation. Read the Cloudflare
deliveryMode before you recommend an action. Direct push does not use
traffic sync. Queue pull freshness requires an enabled traffic-sync
schedule. Run the traffic.source.* doctor checks. Inspect
traffic.source.queue-backlog before you quote current Queue data. If more than
1,000 messages remain, report that one default tick cannot drain the backlog.
Get approval before you run a manual sync or change the schedule. The full
command reference is in the co-installed
canonry/references/canonry-cli.md.
Diagnosing a stuck Vercel/Cloud Run source: if cnry traffic status shows status=error with a recent lastError of refusing to advance or ExceedsBillingLimitError, the source's lastSyncedAt has aged past the upstream retention boundary and every sync now throws. Recovery: cnry traffic reset <project> --source <id> --advance-to-now. This advances lastSyncedAt to NOW and resumes going-forward syncs — historical events in the gap are unrecoverable from the sync path; run cnry traffic backfill --days N separately if any of that history is needed (capped at retention).
Mention is the primary gauge (see "Two signals, not one" above); citation is the secondary signal on the same query. Rank work accordingly:
answerMentioned null → false. Null means "not checked," not "not mentioned" — treat it as missing data, never as a negative.--probe runsWhen a verification would help, propose the exact probe and get explicit
approval before running it. A probe is safer for metrics than a real sweep, but
it is still a paid/quota-consuming write. After approval, use cnry run <project> --probe --provider <p> --query "...". Probe runs:
cnry runs get <id>Use an approved probe when the run is for investigation rather than the user's metrics. Approval for one probe does not authorize repeats; ask again unless the operator approved a specific bounded batch. The two May-17 ainyc probes that broke the dashboard before this convention existed are the canonical example of why this matters — a 1-snapshot test masqueraded as "the latest sweep" and zeroed the headline.
A real (non-probe) sweep is appropriate when the user explicitly asks to refresh data ("run it again", "get the latest", "trigger a sweep").
## headings and no
--- rules inside an answer. A short bold line is the heaviest
structure available; references/reporting.md governs requested weekly
and monthly documents instead.Detailed playbooks live alongside this file. Read them on demand when the task matches:
| File | Read when |
|---|---|
references/portfolio-analysis.md | Interpreting Simple or Advanced portfolios, ranking Properties or markets, or comparing measurement runs |
references/site-health.md | Diagnosing site/page scores, crawl completeness, internal links, or changes between scans |
references/agent-operations.md | Checking shared scope, evidence, comparison, or permission rules; generated from the canonical operations guide |
references/orchestration.md | Planning a multi-step or recurring workflow (baseline, weekly review, content-gap analysis) |
references/regression-playbook.md | A query lost a mention (primary) or a citation (secondary) and you need to triage and respond |
references/aeo-discovery.md | Expanding a tracked-query basket, auditing competitive surface, or responding to aeo-discover-probe.completed |
references/memory-patterns.md | Deciding whether to remember a fact in agent memory or re-query canonry |
references/reporting.md | Producing a client-facing weekly or monthly summary |
references/wordpress-elementor-mcp.md | Editing WordPress pages with the Elementor MCP integration |
Aero (canonry's built-in agent) exposes list_skill_docs / read_skill_doc tools that walk this directory programmatically. External agents (Claude Code, Codex) can read the files directly.
© Canonry, MIT. 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 10 other files (references) in skills/aero of Canonry/canonry.
Open the folder on GitHubat commit 3bf6bc3
Aero 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 |
|---|---|---|---|---|---|---|
| Aero this skillCanonry/canonry | 171 | — | ~4.8k | Automated safety check: Pass | MIT | |
| AI VisibilityRyze-AI-Adgent/open-seo-mcp-skills | 4.6k | — | ~611 | Automated safety check: Pass | MIT | |
| SEO AuditRyze-AI-Adgent/open-seo-mcp-skills | 4.6k | — | ~663 | Automated safety check: Pass | MIT | |
| SEONexus-JPF/note-companion | 870 | — | ~2.2k | Automated safety check: Pass | MIT | |
| SEO DataforseoAgriciDaniel/codex-seo | 797 | 2 repos | ~4.6k | Automated safety check: Pass | MIT | |
| Geo Scorejianruntech/geo-score | 621 | — | ~2.9k | Automated safety check: Pass | MIT |
Ryze-AI-Adgent/open-seo-mcp-skills
Measure real AI-engine visibility — traffic from ChatGPT, Perplexity, Claude, Gemini and which pages they cite — from actual GA4 referral data, not prompt sampling.
Ryze-AI-Adgent/open-seo-mcp-skills
Full SEO audit of a site from its real Search Console + GA4 data — indexation health, CTR anomalies, decaying pages, striking-distance keywords, quick wins.
Nexus-JPF/note-companion
Use and read this skill immediately if the user request is in any way related to SEO or a site's organic search or AI search presence.
AgriciDaniel/codex-seo
Live SEO data via DataForSEO MCP server. An agent skill from AgriciDaniel/codex-seo.
jianruntech/geo-score
Score a website's AI answer-engine visibility 0–100 against the open AIV rubric, and, with the user's own API keys, check and track through the OpenAI, Perplexity, Gemini and Anthropic APIs whether…
Ryze-AI-Adgent/open-seo-mcp-skills
Find keywords a competitor ranks for that the user's site doesn't — the content gap, prioritized by volume and winnability.
Canonry/canonry
Navigate Canonry through connected MCP tools or the cnry CLI to inspect evidence, diagnose changes, plan measurement, review integrations, and report results.
Categories
Diagnose AEO regressions and interpret Canonry AI visibility, Advanced multi-property portfolios, and Site Health evidence. Aero is an agent skill from Canonry/canonry. Diagnose AEO regressions and interpret Canonry AI visibility, Advanced multi-property portfolios, and Site Health evidence.
Aero fits situations like: citation coverage number moved and needs explaining; comparing Properties; diagnosing crawl; preparing a client report.
Run `npx skills add Canonry/canonry --skill aero -a claude-code`. Or copy the skill folder (skills/aero in Canonry/canonry) into .claude/skills/aero in your project. Claude Code loads it when a task matches its description.
Run `npx skills add Canonry/canonry --skill aero -a codex`. Or copy the skill folder (skills/aero in Canonry/canonry) into .agents/skills/aero 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 Canonry/canonry --skill aero -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/aero, .gemini/skills/aero, .github/skills/aero and .opencode/skills/aero in your project.
SKILL.md names no scripts, command-line tools or credentials: Aero is instructions for the agent only.
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.
Aero is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 4.8k tokens (SKILL.md is roughly 19k 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 21k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Aero: AI Visibility (Ryze-AI-Adgent/open-seo-mcp-skills, 4.6k stars), SEO Audit (Ryze-AI-Adgent/open-seo-mcp-skills, 4.6k stars), SEO (Nexus-JPF/note-companion, 870 stars) and SEO Dataforseo (AgriciDaniel/codex-seo, 797 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
Canonry (a GitHub organization) maintains it in Canonry/canonry, which has 171 GitHub stars. The repository holds 2 skills in this directory. The repository was last updated on October 9, 2026.
Source: Canonry/canonry on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.