Cross-Language Coding Standards
zereight/gitlab-mcp
Shared reference for naming, function size, complexity and error handling rules that reviewer agents apply across TypeScript, Python, Go, Rust, Java, C# and Swift.
Walks through adding a new rule or framework adapter to `evlog map` in @evlog/cli, from the rule source and registry to types, tests, docs and the published skill.
$ npx skills add evloghq/evlog --skill create-evlog-map-rule -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install evloghq/evlog create-evlog-map-rule --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/evloghq/evlog.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/create-map-rule .claude/skills/create-evlog-map-rule && 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-evlog-map-rule" agent skill from https://github.com/evloghq/evlog/tree/main/.agents/skills/create-map-rule into .claude/skills/create-evlog-map-rule/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "create-evlog-map-rule", 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/evloghq/evlog/tree/main/.agents/skills/create-map-ruleType 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 evloghq/evlog --skill create-evlog-map-rule -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install evloghq/evlog create-evlog-map-rule --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/evloghq/evlog.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/create-map-rule .agents/skills/create-evlog-map-rule && 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-evlog-map-rule" agent skill from https://github.com/evloghq/evlog/tree/main/.agents/skills/create-map-rule into .agents/skills/create-evlog-map-rule/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "create-evlog-map-rule", 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 evloghq/evlog --skill create-evlog-map-rule -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install evloghq/evlog create-evlog-map-rule --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/evloghq/evlog.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/create-map-rule .cursor/skills/create-evlog-map-rule && 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-evlog-map-rule" agent skill from https://github.com/evloghq/evlog/tree/main/.agents/skills/create-map-rule into .cursor/skills/create-evlog-map-rule/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "create-evlog-map-rule", 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/evloghq/evlog.git --path .agents/skills/create-map-rule--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 evloghq/evlog --skill create-evlog-map-rule -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install evloghq/evlog create-evlog-map-rule --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/evloghq/evlog.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/create-map-rule .gemini/skills/create-evlog-map-rule && 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-evlog-map-rule" agent skill from https://github.com/evloghq/evlog/tree/main/.agents/skills/create-map-rule into .gemini/skills/create-evlog-map-rule/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "create-evlog-map-rule", 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 evloghq/evlog create-evlog-map-ruleInstalls 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 evloghq/evlog --skill create-evlog-map-rule -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/evloghq/evlog.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/create-map-rule .github/skills/create-evlog-map-rule && 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-evlog-map-rule" agent skill from https://github.com/evloghq/evlog/tree/main/.agents/skills/create-map-rule into .github/skills/create-evlog-map-rule/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "create-evlog-map-rule", 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 evloghq/evlog --skill create-evlog-map-rule -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install evloghq/evlog create-evlog-map-rule --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/evloghq/evlog.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/create-map-rule .opencode/skills/create-evlog-map-rule && 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-evlog-map-rule" agent skill from https://github.com/evloghq/evlog/tree/main/.agents/skills/create-map-rule into .opencode/skills/create-evlog-map-rule/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "create-evlog-map-rule", 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-evlog-map-ruleWalks through adding a new rule or framework adapter to `evlog map` in @evlog/cli, from the rule source and registry to types, tests, docs and the published skill.
The skill covers two extensions to the coverage scanner in @evlog/cli: a rule, which asks a new question of every entry point, and a framework adapter, which teaches the scanner to find entry points in another framework. It starts with a design decision. A requirement costs score points and can fail a CI gate, while an opportunity never affects the score and appears only when the project already uses the related feature.
A touchpoints checklist lists the files to change: the rule file under `packages/cli/src/lib/map/rules/`, the registry in `index.ts`, the `CheckId` union in `types.ts`, test cases in `rules.test.ts` and the rules page in the docs. It also gives the PR title convention using the `cli` scope. Existing requirements such as wide-event, audit and structured-errors are named as reference points.
5 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 59a105f. 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:
pnpmFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use pnpm, 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.
evlog Map Rule Creator loads about 2.9k tokens when it runs. Until then it costs about 78 tokens; SKILL.md has 1,173 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 evloghq/evlog at commit 59a105f, republished under its MIT licence (© evloghq). 1,173 words, ~2,935 tokens.
.claude/skills/create-evlog-map-rule/SKILL.md (or your agent's skills folder).evlog map Rule (or Framework Adapter)Extend the coverage scanner in @evlog/cli. Two kinds of extension:
packages/cli/src/lib/map/rules/). This is the common case.evlog map to find entry points in a new framework (packages/cli/src/lib/map/adapters/). Rarer and heavier; see the last section.feat(cli): add the {id} map ruleThe cli scope already exists, so no scope registration is needed.
This is the design decision everything else follows from (see apps/docs/content/3.cli/3.rules.md for the published contract):
| Requirement | Opportunity | |
|---|---|---|
| Effect on the score | Costs weight points when it fails | None, ever. The type forbids a weight |
| When it appears | Whenever it applies | Only when the project already uses the feature (appliesTo.when gated on project.features / project.pairable) |
| In the report | FIX FIRST / THEN | GOING FURTHER |
Can fail a CI gate (--min-score, --baseline) | Yes | No |
Guiding principle (from error-catalog.ts): a rule that fires on perfectly good code is policing, not helping. Opportunities must be gated on a signal that makes the case on its own (duplication, an installed package used without its evlog integration), never on "you could adopt a feature you don't use".
Current requirements: wide-event (40), audit (25), structured-errors (20), page-error-handling (20), context (15), error-handling (15). Current opportunities: error-catalog, audit-coverage, ai-logging, auth-identity.
| # | File | Action |
|---|---|---|
| 1 | packages/cli/src/lib/map/rules/{id}.ts | Create the rule (one exported const) |
| 2 | packages/cli/src/lib/map/rules/index.ts | Import + one line in REGISTRY |
| 3 | packages/cli/src/lib/map/types.ts | Add the id to the CheckId union (a type assert in index.ts fails the build if the registry and union drift) |
| 4 | packages/cli/test/map/rules.test.ts | Add cases (the file has an ESLint-RuleTester-style Case harness (runRuleSet exercises one rule in isolation)) |
| 5 | apps/docs/content/3.cli/3.rules.md | Add a row to the Requirements or Opportunities table + a ### {title} section |
| 6 | apps/docs/content/3.cli/4.scoring.md | Requirements only: reflect the new weight in the scoring explanation |
| 7 | skills/review-logging-patterns/references/code-review.md | Add a row to the matching rules table |
| 8 | .changeset/{id}-map-rule.md | Changeset for "@evlog/cli": minor |
Important: Do NOT consider the task complete until all applicable touchpoints have been addressed.
One file, one exported const satisfying MapRule (from rules/types.ts; requirements and opportunities are its two variants):
export const {camelId}Rule = {
id: '{id}', // kebab-case, matches CheckId
category: 'requirement', // or 'opportunity'
title: '{col}', // column header in --all, ~8 chars max
expects: '{concrete thing}', // e.g. 'log.audit()'
question: 'Does this entry point …?', // one sentence, shown by --inspect
weight: 15, // requirements only — opportunities cannot have one
docs: '/learn/…', // docs path, no domain
fixSlot: 'body', // where suggest() lands: 'setup' | 'body' | … (default 'body')
appliesTo: {
kinds: HANDLER_KINDS, // or a subset: 'api' | 'server-action' | 'middleware' | 'cron' | 'page'
// frameworks: ['next'], // optional framework gate
when: ({ project, facts }) => /* opportunity gate — cheap, declarative */,
},
suggest({ project, target }) {
// Code suggestion for `evlog map <file>`, aware of what the project already
// has (project.catalogs, project.features…). Return lines of code.
return ['const log = useLogger(event)']
},
create(context) {
return {
// Prefer onEnd + FileFacts — the shared AST pass already answers most
// questions. Node-type listeners are the escape hatch.
onEnd() {
if (/* gap found */) context.report({ message: '…', line, snippet: true })
},
}
},
} satisfies MapRuleKey rules:
context.report() only for gaps.FileFacts first (../facts.ts). If the answer isn't there, consider extending the facts rather than writing AST listeners; facts are computed once per file for all rules.project (ProjectFacts) is the gate for opportunities: project.features (evlog features in use), project.pairable (installed packages evlog integrates with), project.catalogs (for naming things in suggestions)."X is spelled out here and in 2 other files, and one catalog entry would cover them"). No exclamation marks, no advice-column tone.score.ts and the existing spread (40 down to 15) and discuss the number in the PR rather than inventing precedent.evlog-map-disable {id}) and part of the public evlog.map.json contract. Renaming later is a breaking change.Add the import and one REGISTRY line in rules/index.ts (report order matters: requirements before opportunities, heaviest first), and the id to the CheckId union in types.ts. The AssertIdsMatch type in index.ts fails the build if you forget either side.
packages/cli/test/map/rules.test.ts has a declarative Case harness: source code in, expected check results out, with knobs for kind, framework, path (sensitivity), hasEvlog, features, pairable, dependencies, catalogs, barrels. Use runRuleSet([yourRule], run) to exercise the rule in isolation.
Cover at minimum:
n/a boundaries: wrong kind, gated when returning false, hasEvlog: false phrasing if the rule branches on itsuggest() output when it adapts to the project (e.g. names an existing catalog)evlog-map-disable {id}) behaves like the other rules. Usually free via the shared harnessRun: pnpm --filter @evlog/cli exec vitest run test/map/rules.test.ts
Read apps/docs/AGENTS.md before touching anything under apps/docs/. Then in apps/docs/content/3.cli/3.rules.md: add the row (column title, id, weight/fires-when, expects) and a ### {title} — {question} section following the existing ones, covering what it checks, what passes, what fails, the suggested shape. Requirements with a weight also touch the scoring narrative in 4.scoring.md.
skills/review-logging-patterns/references/code-review.md mirrors the rules tables (requirements + opportunities) and maps each rule to a skill section. Add the row and, if the rule promotes a feature the skill documents elsewhere, link the section.
.changeset/{id}-map-rule.md with "@evlog/cli": minor, written from the user's perspective: what the rule checks, when it fires, whether it moves the score.
pnpm --filter @evlog/cli run lint
pnpm --filter @evlog/cli run typecheck # catches REGISTRY/CheckId drift
pnpm --filter @evlog/cli run testThen sanity-check on a real project: pnpm cli:sandbox builds disposable, unevenly-instrumented apps under .sandbox/ (one per supported framework, each a git repo), and prints the commands to run against them. pnpm cli:sandbox --reset rolls an app back to pristine after an init or map run; --smoke drives the whole non-interactive feature matrix and reports what broke.
Teaching evlog map a new framework is a different, heavier change: the adapter owns route discovery and the framework's capabilities.
A framework is one directory under packages/cli/src/lib/frameworks/<id>/:
| File | Role |
|---|---|
index.ts | The definition: defineFramework({ id, label, docs, detect, accessor, requestLogger, evlogAutoImports?, requestLoggerMember?, shape, map, init? }). Stays free of parser and template code; map and init are () => import(...) loaders so evlog doctor never pays for a scanner |
map.ts | Route discovery (MapAdapter: extractRoutes, optional resolveRequestLogger). Code-first frameworks build it from shared/code-routes.ts with a method table (hono, express, fastify are each a dozen lines) |
init.ts | Optional: the evlog init planner (InitPlanner), default export. Code-first frameworks use middlewareModuleTemplate from init/wiring.ts |
The Framework type, --framework parsing and help text, detection, labels, docs links, telemetry allowlists, error messages and the AGENTS.md accessor all derive from the registry in frameworks/index.ts; adding the definition to DEFINITIONS is the only registration step.
| # | File | Action |
|---|---|---|
| 1 | packages/cli/src/lib/frameworks/{id}/index.ts | Write the definition. shape.loggerCall and shape.handler are what evlog map <file> suggests; requestLoggerMember (e.g. log for req.log) is how facts.ts credits a handler that never names useLogger |
| 2 | packages/cli/src/lib/frameworks/{id}/map.ts | Route discovery. File-based routers: see nuxt/map.ts, next/map.ts, tanstack-start/map.ts. Code-registered routes: codeRoutesAdapter({ framework, methods, on?, routeObject?, middleware }) |
| 3 | packages/cli/src/lib/frameworks/{id}/init.ts | Optional. Leave init out of the definition when evlog init cannot wire the framework yet, and say so in the PR |
| 4 | packages/cli/src/lib/frameworks/index.ts | Add the definition to DEFINITIONS |
| 5 | packages/cli/test/map/fixtures/{id}-basic/ + test/map/scan.test.ts + test/map/adapters.test.ts | A fixture with one instrumented and one dark route; detection, extraction and wide-event credit against it. test/frameworks.test.ts already checks every registry entry detects and loads |
| 6 | apps/docs/content/3.cli/2.map.md + 0.overview.md + 9.observability-score.md + 0.landing.md + 7.reference/6.agent-skills.md | Update the supported-frameworks statements |
| 7 | skills/review-logging-patterns/SKILL.md | Update every supported-frameworks list (frontmatter description, CLI section, --framework flag), same in references/code-review.md, skills/build-audit-logs/SKILL.md (Pass 2) and skills/analyze-logs/SKILL.md (init suggestion) |
| 8 | scripts/cli-sandbox.mjs | Add the framework to APPS (reuse the map fixture) so pnpm cli:sandbox covers it and --smoke exercises every CLI command against it |
| 9 | .changeset/{id}-framework.md | Changeset for "@evlog/cli": minor |
Reference implementations: nuxt/ (file-based, shared with nitro/), next/, tanstack-start/, and hono/, express/, fastify/ for code-registered routes with a per-project resolveRequestLogger.
© evloghq, MIT. 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 .agents/skills/create-map-rule of evloghq/evlog.
Open the folder on GitHubat commit 59a105f
evlog Map Rule Creator 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 |
|---|---|---|---|---|---|---|
| evlog Map Rule Creator this skillevloghq/evlog | 1.9k | — | ~2.9k | Automated safety check: Pass | MIT | |
| Cross-Language Coding Standardszereight/gitlab-mcp | 2k | 1 repos | ~1.4k | Automated safety check: Pass | MIT | |
| Effect TSmattiacerutti/supernova | 187 | — | ~2.8k | Automated safety check: Pass | MIT | |
| fp-go Logging PatternsIBM/fp-go | 2k | — | ~3.7k | Automated safety check: Pass | Apache-2.0 | |
| Strict Programming Practicescode-yeongyu/oh-my-openagent | 70k | — | ~9.5k | Automated safety check: Pass | Custom licence | |
| Rust SkillsJMBeresford/retrom | 2.1k | 1 repos | ~9.5k | Automated safety check: Pass | MIT |
zereight/gitlab-mcp
Shared reference for naming, function size, complexity and error handling rules that reviewer agents apply across TypeScript, Python, Go, Rust, Java, C# and Swift.
mattiacerutti/supernova
Write idiomatic Effect v4 TypeScript following official best practices from effect-solutions and the Effect source.
IBM/fp-go
Adds logging to fp-go functional pipelines with Tap operators, entry and exit logs and error context, so that logging never changes the value or error flowing through.
code-yeongyu/oh-my-openagent
Applies strict, type-first coding rules for Python, Rust, TypeScript and Go, loading the matching language reference before the agent writes or edits any code.
JMBeresford/retrom
Comprehensive Rust coding guidelines with 265 rules across 26 categories.
warpdotdev/warp
Guides log level choices and when to raise a structured Sentry event instead of a plain log line in the Warp Rust codebase, keeping secrets out of logs.
evloghq/evlog
Walks through adding a new built-in evlog drain adapter for an observability platform: source, build config, exports, tests, docs and PR scope.
evloghq/evlog
Guides adding a new built-in enricher to the evlog package, covering the source, tests, docs, README, a related skill and a changeset.
evloghq/evlog
Walks a contributor through adding a new HTTP framework integration to the evlog logging package: middleware source, build entry, exports, tests, example app and docs.
evloghq/evlog
Rules for writing and reviewing evlog docs, blog posts, READMEs, skills and AGENTS.md files, with separate review and rewrite roles, a house voice and a catalog of AI-sounding tells.
evloghq/evlog
Produce a before/after visual comparison of an evlog surface (landing, docs, telemetry, playgrounds) and share it as public Blob URLs.
evloghq/evlog
Runs the daily review of evlog's written material: picks the worst-scoring files in one group, rewrites what holds up, and opens a single pull request that reports the changes.
Works with
Categories
Walks through adding a new rule or framework adapter to `evlog map` in @evlog/cli, from the rule source and registry to types, tests, docs and the published skill. The skill covers two extensions to the coverage scanner in @evlog/cli: a rule, which asks a new question of every entry point, and a framework adapter, which teaches the scanner to find entry points in another framework. It starts with a design decision.
evlog Map Rule Creator fits situations like: adding a coverage check to evlog map; deciding whether a new check should be a requirement or an opportunity; extending evlog map to find entry points in a new framework.
Run `npx skills add evloghq/evlog --skill create-evlog-map-rule -a claude-code`. Or copy the skill folder (.agents/skills/create-map-rule in evloghq/evlog) into .claude/skills/create-evlog-map-rule in your project. Claude Code loads it when a task matches its description.
Run `npx skills add evloghq/evlog --skill create-evlog-map-rule -a codex`. Or copy the skill folder (.agents/skills/create-map-rule in evloghq/evlog) into .agents/skills/create-evlog-map-rule 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 evloghq/evlog --skill create-evlog-map-rule -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-evlog-map-rule, .gemini/skills/create-evlog-map-rule, .github/skills/create-evlog-map-rule and .opencode/skills/create-evlog-map-rule in your project.
Going by SKILL.md and its folder, evlog Map Rule Creator needs the command-line tools its instructions call (pnpm). Our summary lists: A checkout of the evlog monorepo.
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.
evlog Map Rule Creator is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 2.9k tokens (SKILL.md is roughly 12k 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 evlog Map Rule Creator: Cross-Language Coding Standards (zereight/gitlab-mcp, 2k stars), Effect TS (mattiacerutti/supernova, 187 stars), fp-go Logging Patterns (IBM/fp-go, 2k stars) and Strict Programming Practices (code-yeongyu/oh-my-openagent, 70k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
evloghq (a GitHub organization) maintains it in evloghq/evlog, which has 1,887 GitHub stars. The repository holds 20 skills in this directory. The repository was last updated on October 7, 2026.
Source: evloghq/evlog on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.