Tutti Agent Workspace App
tutti-os/tutti
Build or evolve a complex agent-enabled Tutti workspace app repository.
Write, extend, and review CKEditor 5 plugins in the Trilium (TriliumNext Notes) monorepo — the rich-text-note editor under packages/ckeditor5, whose plugins live in src/plugins/.
$ npx skills add TriliumNext/Trilium --skill ckeditor5-plugin-development -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install TriliumNext/Trilium ckeditor5-plugin-development --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/TriliumNext/Trilium.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/ckeditor5-plugin-development .claude/skills/ckeditor5-plugin-development && 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 "ckeditor5-plugin-development" agent skill from https://github.com/TriliumNext/Trilium/tree/main/.claude/skills/ckeditor5-plugin-development into .claude/skills/ckeditor5-plugin-development/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ckeditor5-plugin-development", 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/TriliumNext/Trilium/tree/main/.claude/skills/ckeditor5-plugin-developmentType 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 TriliumNext/Trilium --skill ckeditor5-plugin-development -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install TriliumNext/Trilium ckeditor5-plugin-development --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/TriliumNext/Trilium.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/ckeditor5-plugin-development .agents/skills/ckeditor5-plugin-development && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "ckeditor5-plugin-development" agent skill from https://github.com/TriliumNext/Trilium/tree/main/.claude/skills/ckeditor5-plugin-development into .agents/skills/ckeditor5-plugin-development/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ckeditor5-plugin-development", 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 TriliumNext/Trilium --skill ckeditor5-plugin-development -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install TriliumNext/Trilium ckeditor5-plugin-development --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/TriliumNext/Trilium.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/ckeditor5-plugin-development .cursor/skills/ckeditor5-plugin-development && 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 "ckeditor5-plugin-development" agent skill from https://github.com/TriliumNext/Trilium/tree/main/.claude/skills/ckeditor5-plugin-development into .cursor/skills/ckeditor5-plugin-development/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ckeditor5-plugin-development", 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/TriliumNext/Trilium.git --path .claude/skills/ckeditor5-plugin-development--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 TriliumNext/Trilium --skill ckeditor5-plugin-development -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install TriliumNext/Trilium ckeditor5-plugin-development --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/TriliumNext/Trilium.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/ckeditor5-plugin-development .gemini/skills/ckeditor5-plugin-development && 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 "ckeditor5-plugin-development" agent skill from https://github.com/TriliumNext/Trilium/tree/main/.claude/skills/ckeditor5-plugin-development into .gemini/skills/ckeditor5-plugin-development/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ckeditor5-plugin-development", 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 TriliumNext/Trilium ckeditor5-plugin-developmentInstalls 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 TriliumNext/Trilium --skill ckeditor5-plugin-development -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/TriliumNext/Trilium.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/ckeditor5-plugin-development .github/skills/ckeditor5-plugin-development && 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 "ckeditor5-plugin-development" agent skill from https://github.com/TriliumNext/Trilium/tree/main/.claude/skills/ckeditor5-plugin-development into .github/skills/ckeditor5-plugin-development/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ckeditor5-plugin-development", 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 TriliumNext/Trilium --skill ckeditor5-plugin-development -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install TriliumNext/Trilium ckeditor5-plugin-development --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/TriliumNext/Trilium.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/ckeditor5-plugin-development .opencode/skills/ckeditor5-plugin-development && 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 "ckeditor5-plugin-development" agent skill from https://github.com/TriliumNext/Trilium/tree/main/.claude/skills/ckeditor5-plugin-development into .opencode/skills/ckeditor5-plugin-development/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ckeditor5-plugin-development", 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.
ckeditor5-plugin-developmentWrite, extend, and review CKEditor 5 plugins in the Trilium (TriliumNext Notes) monorepo — the rich-text-note editor under packages/ckeditor5, whose plugins live in src/plugins/.
Ckeditor5 Plugin Development is an agent skill from TriliumNext/Trilium. Write, extend, and review CKEditor 5 plugins in the Trilium (TriliumNext Notes) monorepo — the rich-text-note editor under packages/ckeditor5, whose plugins live in src/plugins/. Use when building or reviewing a Trilium CKEditor 5 feature/plugin, or when working with the editing engine (model, view, schema, conversion/upcast-downcast), commands, the UI library (buttons, dropdowns, dialogs, balloons, toolbars), widgets (block/inline, toWidget, nested editables), keystrokes, localization (t()), registering a plugin…
Its SKILL.md is about 4.8k tokens, which your agent loads only when the skill is triggered. The skill folder holds 12 other files, including reference files (for example `references/architecture.md`, `references/commands.md` and `references/conventions.md`).
It sits in Development, covering Hooks and plugins, Monorepo tooling and Internationalization. The repository describes itself as: Build your personal knowledge base with Trilium Notes. The licence is AGPL-3.0.
3 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 134a865. 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.
Ckeditor5 Plugin Development loads about 4.8k tokens when it runs, and up to ~39k if it reads all its reference files. Until then it costs about 217 tokens; SKILL.md has 1,751 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 TriliumNext/Trilium at commit 134a865, republished under its AGPL-3.0 licence (© TriliumNext). 1,751 words, ~4,832 tokens.
.claude/skills/ckeditor5-plugin-development/SKILL.md (or your agent's skills folder). This skill also uses 11 other files; get the full folder from GitHub.CKEditor 5 is plugin-based: every feature — even typing and <p> support — is a
plugin. Without plugins the editor is an empty API. This skill is specific to Trilium
(TriliumNext Notes), whose rich-text note editor is built from the CKEditor 5 library
(external dep, CKEditor 5 48 or later) plus Trilium's own plugins. Both the editor build and the
plugins live in packages/ckeditor5 (@triliumnext/ckeditor5): each feature is a folder under
src/plugins/ — admonition, collapsible, footnotes, keyboard_marker, math, mermaid, mention,
snippets and the rest — with its tests co-located beside it. No CKEditor feature ships as its own
workspace package any more. The editor is consumed by apps/client (the text note widget). This skill distills
how to write new Trilium plugins and review existing ones idiomatically.
Use it whenever the task involves a Trilium CKEditor 5 plugin/feature: creating one (a folder under
packages/ckeditor5/src/plugins/ — separate packages are not the pattern any more), extending one,
debugging editing behavior, registering a
plugin so it reaches the editor, or reviewing plugin code for correctness and convention
compliance. Trigger concepts include: model/view/schema, conversion (upcast/downcast),
Command, editor.model.change(), ButtonView/componentFactory, widgets (toWidget),
ContextualBalloon/Dialog, editor.keystrokes, t() localization, the plugins.ts
registry / editor classes / toolbar.ts.
These are the library's internal layers (upstream packages ckeditor5-core/-engine/-ui);
in Trilium you never import them by those paths — everything comes from the ckeditor5 aggregate
(see below). They describe how the engine is organized:
ckeditor5-core) — glue classes: Editor,
Plugin, Command, plus the event/observable system.ckeditor5-engine) — the custom MVC data model, the
view (virtual DOM), schema, and conversion between them. The biggest piece.ckeditor5-ui) — MVC views, templates, and components
(buttons, dropdowns, dialogs, toolbars).Mental model of the engine: there is one model document that is converted into two
views — the editing view (what the user sees/edits) and the data view (input/output
for getData()/setData()/paste). You almost always change the model; converters
render it to the view. Never hand-edit the view to represent model state.
data (HTML) ──upcast──▶ MODEL ──editing downcast──▶ editing view ──render──▶ DOM (contentEditable)
│
└────data downcast──────▶ data view ──▶ getData()/output HTMLImport everything from the single ckeditor5 aggregate package (48 or later; it is a
peerDependency + devDependency of every plugin package). There is no premium package: every
premium plugin Trilium used has an in-tree GPL replacement, and the editor always runs under the
GPL license key:
import { Plugin, ButtonView, Command, _setModelData } from 'ckeditor5';packages/ckeditor5 are relative, e.g.
import Kbd from './keyboard_marker/keyboard_marker.js';. The only workspace-package import
in-tree under src/plugins/, and the aggregate registers them from plugins.ts..js/.ts/.json) — enforced by
eslint-config-ckeditor5 (require-file-extensions-in-imports), with
allow-imports-only-from-main-package-entry-point and no-legacy-imports also active.@ckeditor/ckeditor5-* deep paths you'll see in the library's own source (and cited in
references/core-plugin-patterns.md) resolve to the same symbols, but in Trilium you always
import from the ckeditor5 aggregate to avoid duplicate-module-instance problems. The only
routine exceptions are dev/debug packages: @ckeditor/ckeditor5-icons and the
CKEditor Inspector (import CKEditorInspector from '@ckeditor/ckeditor5-inspector';).A plugin extends Plugin (from 'ckeditor5'). There is no isOfficialPlugin/isPremiumPlugin
flag in Trilium plugins. (License headers are not uniform across packages — some, e.g. admonition,
prefix files with a CKSource header; others don't. Match the package you're in; see
references/conventions.md.)
import { Plugin } from 'ckeditor5';
import FooEditing from './fooediting.js';
import FooUI from './fooui.js';
export default class Foo extends Plugin {
// Dependencies — the editor loads these automatically before this plugin.
static get requires() {
return [ FooEditing, FooUI ] as const;
}
// Stable name (PascalCase = the package/folder) for editor.plugins.get( 'Foo' ).
static get pluginName() {
return 'Foo' as const;
}
init() {
const editor = this.editor; // the editor that loaded this plugin
// Register schema, converters, commands, UI, keystrokes, listeners…
}
afterInit() {
// Runs after ALL plugins' init(). Use it when you depend on another
// plugin's runtime state (e.g. registering a widget toolbar).
}
// init()/afterInit() may return a Promise. Plugin extends a base that provides
// destroy() and this.listenTo()/this.stopListening() (auto-cleaned on destroy).
}Plugin folder layout (e.g. packages/ckeditor5/src/plugins/admonition/), all files flat and
snake_case: {feature}.ts glue, {feature}_editing.ts, {feature}_ui.ts, optional
{feature}_command.ts. Put the declare module 'ckeditor5' augmentation at the bottom of the
glue file: every folded-in plugin dropped its separate augmentation.ts and index.ts barrel
that way, so consumers import the specific module they need. (syntax_highlighting still uses the
older separate-file shape — leave it, but don't copy it.) Complex plugins add constants.ts
(ELEMENTS/ATTRIBUTES/COMMANDS/CLASSES), utils.ts (model-query helpers), and split
schema.ts/converters.ts. Tests sit beside the source as *.spec.ts.
Assets live in the package's shared folders, not per plugin: stylesheets in
packages/ckeditor5/src/theme/{feature}.css (imported from the glue plugin) and icons in
packages/ckeditor5/src/icons/, prefixed where the name would otherwise be generic
(mermaid-info.svg). A plugin derived from third-party code also keeps a README.md recording
its provenance, and a LICENSE.md where upstream requires one. See references/conventions.md.
Key rules (inherited from the upstream conventions via eslint-config-ckeditor5):
Feature — the glue plugin: static get requires() { return [ FeatureEditing, FeatureUI ] as const; }FeatureEditing — schema, conversion, commands (works headless / server-side).FeatureUI — buttons, dropdowns, balloons registered in componentFactory.
This enables reuse (someone can take your editing layer and write a different UI). Simple
text-attribute features can reuse the built-in AttributeCommand inline (see keyboard-marker).editor.ui.componentFactory.add( 'name', locale => view ), then the component
'name' is added to Trilium's toolbar config (apps/client/.../text/toolbar.ts).editor.config.define( 'feature', { … } ), read with editor.config.get( 'feature.key' ).?raw straight into the file that uses them
(import fooIcon from '../../icons/foo.svg?raw';); there is no icons export any more.cke icon font that the
User Guide uses to name toolbar buttons (cke-table-merge-cell, cke-trilium-kbd). Adding,
renaming or removing an SVG, or bumping ckeditor5, means regenerating that font and checking
the docs for the old class. See "The cke icon pack" in references/ui-and-localization.md.A "highlight" feature = a $text attribute ↔ <mark> element, a command, a button, a
keystroke. This is the canonical shape for inline styling features.
import { Plugin, Command, ButtonView } from 'ckeditor5';
class HighlightCommand extends Command {
refresh() {
const { document, schema } = this.editor.model;
this.value = document.selection.getAttribute( 'highlight' );
this.isEnabled = schema.checkAttributeInSelection( document.selection, 'highlight' );
}
execute() {
const model = this.editor.model;
const selection = model.document.selection;
const newValue = !this.value;
model.change( writer => {
if ( !selection.isCollapsed ) {
for ( const range of model.schema.getValidRanges( selection.getRanges(), 'highlight' ) ) {
newValue ? writer.setAttribute( 'highlight', true, range )
: writer.removeAttribute( 'highlight', range );
}
}
newValue ? writer.setSelectionAttribute( 'highlight', true )
: writer.removeSelectionAttribute( 'highlight' );
} );
}
}
export default class Highlight extends Plugin {
init() {
const editor = this.editor;
// 1. Schema: allow the attribute on text.
editor.model.schema.extend( '$text', { allowAttributes: 'highlight' } );
// 2. Conversion: model attribute 'highlight' <-> view <mark>.
editor.conversion.attributeToElement( { model: 'highlight', view: 'mark' } );
// 3. Command.
editor.commands.add( 'highlight', new HighlightCommand( editor ) );
// 4. UI button, reactive to command state.
editor.ui.componentFactory.add( 'highlight', locale => {
const button = new ButtonView( locale );
const command = editor.commands.get( 'highlight' );
button.set( { label: editor.t( 'Highlight' ), withText: true, isToggleable: true, tooltip: true } );
button.bind( 'isOn', 'isEnabled' ).to( command, 'value', 'isEnabled' );
button.on( 'execute', () => { editor.execute( 'highlight' ); editor.editing.view.focus(); } );
return button;
} );
// 5. Keystroke.
editor.keystrokes.set( 'Ctrl+Alt+H', 'highlight' );
}
}The same five steps (schema → conversion → command → UI → keystroke) recur in almost every
feature. For elements/objects/widgets you schema.register(...) and use elementToElement
converters instead of attributeToElement; see references/widgets.md.
packages/ckeditor5/src/plugins/. Separate workspace
packages are no longer the pattern — every one that existed has been folded in, since none had
consumers outside the aggregate or was ever published. See
references/tooling-and-packaging.md ("Where a new plugin goes").references/tooling-and-packaging.md):"@triliumnext/ckeditor5-<feature>": "workspace:*" to
packages/ckeditor5/package.json.packages/ckeditor5/src/plugins.ts and add it to the right array —
CORE_PLUGINS (minimal/attribute editor), TRILIUM_PLUGINS (in-repo src/plugins/), or
EXTERNAL_PLUGINS (the @triliumnext workspace packages). These compose into
COMMON_PLUGINS, which the editor classes in packages/ckeditor5/src/index.ts expose as
static builtinPlugins.apps/client/src/widgets/type_widgets/text/toolbar.ts.import CKEditorInspector from '@ckeditor/ckeditor5-inspector'; CKEditorInspector.attach( editor );editor.model.change( writer => … )
(one block = one undo step). Use editor.editing.view.change() only for view-only state
(e.g. focus class) that the model does not represent.pnpm --filter @triliumnext/ckeditor5-<feature> test (also lint, stylelint, test:debug).editor.getData() / editor.setData() and by exercising selection edge
cases (collapsed vs. ranged, inside objects/limits).init() runs
only when the editor is built, so do a full page reload (or close/reopen the note) to get a
fresh editor instance that picks up your change — otherwise you're testing the old code.Load the focused reference for the task at hand:
| File | Use it for |
|---|---|
references/architecture.md | Model, view, schema, positions/ranges/selections, markers, the event/observable system, binding. The conceptual foundation. |
references/conversion.md | Upcast/downcast pipelines, conversion helpers, custom (callback) converters, attribute/element/marker conversion, position mapping. |
references/commands.md | Command patterns: refresh()/execute(), state (value/isEnabled), forceDisabled(), affectsData, command events. |
references/ui-and-localization.md | Views & templates, component catalog (buttons, inputs, dropdowns, dialogs/modals, balloons, toolbars), icons, componentFactory, focus/keystroke management, and t() localization. |
references/widgets.md | Block & inline widgets: toWidget/toWidgetEditable, nested editables, insertObject, widget toolbars, view↔model position mapping, custom properties, and external/async-rendered widgets (UI-element render callbacks, re-render on change, stale-render guard, lazy-load). |
references/conventions.md | Trilium conventions: imports from ckeditor5/@triliumnext + required file extensions, per-package license/headers (not uniform), @triliumnext scope + workspace:*, per-package tsconfig, ?raw icons, localization via editor.t() message ids, declare module 'ckeditor5' augmentation, plus the upstream naming/CSS/BEM/JSDoc/TypeScript rules inherited via eslint-config-ckeditor5. For writing idiomatic code and reviewing. |
references/tooling-and-packaging.md | Trilium packaging & wiring: the @triliumnext/ckeditor5-<feature> package layout, workspace:* deps, main: src/index.ts (no per-package dist), tsconfig/eslint/stylelint setup, the full registration flow (plugins.ts arrays → editor classes builtinPlugins → toolbar.ts), the three editor classes, the Vite build, how apps/client creates the editor (config, watchdog, lazy premium), the Inspector, and how to read CKEditor's own source (via bundle sourcemaps) and trace its runtime decisions. |
references/persisted-attributes.md | Persisting a data-trilium-* attribute end to end: schema → both conversion directions → the deliberate markdown export/import decision (collapsed is DROPPED, task-state is KEPT) → editing-view-only CSS so read-only and share rendering stay correct. Read it before storing plugin state in the saved note content. |
references/review-checklist.md | A structured checklist for reviewing an existing plugin (architecture, schema, conversion, commands, UI, a11y, conventions). |
references/recipes.md | Task-oriented how-tos: insert content, find/iterate nodes, custom observers, place caret, extend other plugins' UI, etc. |
references/core-plugin-patterns.md | Canonical idioms mined from the actual packages/*/src source: toolbar+menu-bar button factory, plugin flags & augmentation.ts, AttributeCommand/setAttributeProperties, inline-attribute boundary helpers, elementToStructure+slots, reconversion, BalloonToolbar, raw-HTML widgets, sanitizing untrusted HTML (CKEditor ships no sanitizer — the host supplies one per feature namespace), clipboard pipeline, markers, post-fixers, async/upload. Each cites its source file. Includes the reconversion hazard that drops sibling UIElements (to-do checkboxes) from reused child views, and the listener-priority rule a forced reconvertItem() depends on. |
For testing a plugin (Vitest setup, test editors, model/view assertions, command/UI test
patterns), use the separate ckeditor5-testing skill.
When reviewing a plugin, confirm: editing/UI split with a glue plugin; static get requires()
and pluginName present; schema registered/extended and the feature self-configures; symmetric
upcast + (data & editing) downcast converters; a Command whose refresh() sets isEnabled
correctly (disabled where the schema disallows it); UI bound to command state and refocusing the
editing view on execute; keyboard accessibility (keystrokes + accessibility.addKeystrokeInfos);
all user-facing strings wrapped in t(); model changes inside model.change(); cleanup of
trackers/handlers in destroy(). Full version: references/review-checklist.md. To drive a
review (workflow, CKEditor-specific defect patterns, contribution process), use the separate
ckeditor5-reviewing skill, which delegates back to this checklist.
This skill is specific to the Trilium (TriliumNext Notes) monorepo's CKEditor 5 integration.
Repository paths it cites — packages/ckeditor5, packages/ckeditor5/src/plugins/<name>/,
apps/client/... — are this repository, and examples come from
Trilium's own plugins (admonition, collapsible, footnotes, keyboard_marker, math, mermaid). The
CKEditor 5 library is an external dependency tracked at 48 or later; its mechanics were
distilled from the upstream docs (ckeditor.com/docs) and source (github.com/ckeditor/ckeditor5,
commit 9ecca53627). Where a snippet cites an upstream library package (e.g. ckeditor5-basic-styles,
-link, -image), that is the library's own source — not a Trilium package.
On versions: these skills name major versions only ("48 or later"). Trilium tracks CKEditor
5 closely, so an exact pin written here would be stale within weeks — read the current one from
packages/ckeditor5/package.json.
© TriliumNext, AGPL-3.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 11 other files (references) in .claude/skills/ckeditor5-plugin-development of TriliumNext/Trilium.
Open the folder on GitHubat commit 134a865
Ckeditor5 Plugin Development 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 |
|---|---|---|---|---|---|---|
| Ckeditor5 Plugin Development this skillTriliumNext/Trilium | 38k | — | ~4.8k | Automated safety check: Pass | AGPL-3.0 | |
| Tutti Agent Workspace Apptutti-os/tutti | 3.8k | — | ~1.9k | Automated safety check: Pass | Apache-2.0 | |
| Openiap Workflowshyodotdev/openiap | 154 | — | ~766 | Automated safety check: Pass | MIT | |
| Wp Plugin Developmentjorgerosal/wordpress-skills | 100 | — | ~12k | Automated safety check: Pass | MIT | |
| Wp Plugin Developmentjorgerosal/wordpress-skills | 100 | — | ~438 | Automated safety check: Pass | MIT | |
| Codebase Contexthomarr-labs/homarr | 5k | — | ~659 | Automated safety check: Pass | Apache-2.0 |
tutti-os/tutti
Build or evolve a complex agent-enabled Tutti workspace app repository.
hyodotdev/openiap
A skill your agent uses for OpenIAP monorepo work that should follow the repository's slash-command workflows when the user asks in natural language instead of typing a slash command, including…
jorgerosal/wordpress-skills
WordPress plugin architecture review and WordPress.org submission standards.
jorgerosal/wordpress-skills
WordPress plugin architecture review for Codex. An agent skill from jorgerosal/wordpress-skills.
homarr-labs/homarr
Navigate Homarr's monorepo architecture and reuse shared packages.
Zhongye1/KnowAgenticRAG
FastAPI Best Architecture (fba) project development guide. An agent skill from Zhongye1/KnowAgenticRAG.
TriliumNext/Trilium
A skill your agent uses when cutting, preparing, or debugging a Trilium release — bumping the monorepo version, tagging, or diagnosing a failed "Release" workflow run.
TriliumNext/Trilium
A skill your agent uses when working on the Trilium Electron desktop app (apps/desktop) — adding or changing an electronApi method / IPC channel, touching preload.ts, main.ts, services/window.ts or…
TriliumNext/Trilium
A skill your agent uses when adding a DB migration or a new column/field to a Becca entity in Trilium ("add a migration", "new column on notes/attributes", "ALTER TABLE", "add a field to…
TriliumNext/Trilium
A skill your agent uses when adding, moving, or wiring an internal REST endpoint in Trilium (a new /api/ route) — choosing between a core-shared handler (packages/trilium-core/src/routes/index.ts…
TriliumNext/Trilium
A skill your agent uses when adding, changing, or reviewing an LLM/MCP tool in Trilium (the defineTools definitions under packages/trilium-core/src/services/llm/tools/ —…
TriliumNext/Trilium
Testing CKEditor 5 plugins in the Trilium monorepo. An agent skill from TriliumNext/Trilium.
Categories
Write, extend, and review CKEditor 5 plugins in the Trilium (TriliumNext Notes) monorepo — the rich-text-note editor under packages/ckeditor5, whose plugins live in src/plugins/. Ckeditor5 Plugin Development is an agent skill from TriliumNext/Trilium. Write, extend, and review CKEditor 5 plugins in the Trilium (TriliumNext Notes) monorepo — the rich-text-note editor under packages/ckeditor5, whose plugins live in src/plugins/.
Ckeditor5 Plugin Development fits situations like: reviewing a Trilium CKEditor 5 feature/plugin; working with the editing engine (model; conversion/upcast-downcast); the UI library (buttons.
Run `npx skills add TriliumNext/Trilium --skill ckeditor5-plugin-development -a claude-code`. Or copy the skill folder (.claude/skills/ckeditor5-plugin-development in TriliumNext/Trilium) into .claude/skills/ckeditor5-plugin-development in your project. Claude Code loads it when a task matches its description.
Run `npx skills add TriliumNext/Trilium --skill ckeditor5-plugin-development -a codex`. Or copy the skill folder (.claude/skills/ckeditor5-plugin-development in TriliumNext/Trilium) into .agents/skills/ckeditor5-plugin-development 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 TriliumNext/Trilium --skill ckeditor5-plugin-development -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/ckeditor5-plugin-development, .gemini/skills/ckeditor5-plugin-development, .github/skills/ckeditor5-plugin-development and .opencode/skills/ckeditor5-plugin-development in your project.
Going by SKILL.md and its folder, Ckeditor5 Plugin Development needs the command-line tools its instructions call (pnpm).
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.
Ckeditor5 Plugin Development is published under the AGPL-3.0 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 34k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Ckeditor5 Plugin Development: Tutti Agent Workspace App (tutti-os/tutti, 3.8k stars), Openiap Workflows (hyodotdev/openiap, 154 stars), Wp Plugin Development (jorgerosal/wordpress-skills, 100 stars) and Wp Plugin Development (jorgerosal/wordpress-skills, 100 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
TriliumNext (a GitHub organization) maintains it in TriliumNext/Trilium, which has 38,231 GitHub stars. The repository holds 22 skills in this directory. The repository was last updated on October 7, 2026.
Source: TriliumNext/Trilium on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.