Skip to main content

core-add-module

Add a new module to the core package (src/packages/core/). Use when adding shared UI framework infrastructure that all packages can use — e.g., a new extension system feature, a new utility, a new shared component pattern, a new picker, or a new workspace primitive. Core modules are imported as @umbraco-cms/backoffice/{module-name}. Also use when the user says things like "add a module to core", "create a new core feature", or "add shared infrastructure".

来源信息

仓库
umbraco/Umbraco-CMS
最近来源活动
2026年3月27日 11:35
检测到的 SKILL.md 语言
英语
星标
5,265
分支
2,930

安装方式

默认使用会先检查来源的 Prompt;你也可以切换为直接命令,或下载本地副本。

检查来源文件

决定是否安装前,请先阅读 SKILL.md,以及 SkillsMP 当前展示的配套文件。

正在显示 SKILL.md

SKILL.md
来源说明 · 只读预览
name
core-add-module
description
Add a new module to the core package (src/packages/core/). Use when adding shared UI framework infrastructure that all packages can use — e.g., a new extension system feature, a new utility, a new shared component pattern, a new picker, or a new workspace primitive. Core modules are imported as @umbraco-cms/backoffice/{module-name}. Also use when the user says things like "add a module to core", "create a new core feature", or "add shared infrastructure".
allowed-tools
Read, Write, Edit, Grep, Glob
# Add Core Module Add a new module to the core package (`src/packages/core/`). ## Naming conventions - **Module names** are **singular** (e.g., `picker`, `sorter`, `entity-flag`, `modal`, `section`) ## What you need from the user 1. **Module name** — What to call it in singular form (kebab-case, e.g., `picker`, `sorter`, `entity-flag`) 2. **Purpose** — What shared infrastructure this provides ## When to add to core vs. create a new package - **Core module**: Shared UI framework infrastructure used by multiple packages — extension primitives, pickers, validation, repository base classes, workspace utilities. - **New package**: Domain-specific CMS features (documents, media, webhook). Use the `create-package` skill instead. Core modules should not implement CMS-specific features. They provide the building blocks that CMS feature packages use. ## Files to create ``` src/packages/core/{module-name}/ ├── index.ts # Public API exports ├── manifests.ts # Extension registrations (if any) ├── constants.ts # Module constants └── types.ts # Module types ``` ## Step 1: Create the module directory and files ### {module-name}/index.ts The public API. Only export what other packages need: ```typescript export * from './constants.js'; export type * from './types.js'; ``` Use `export type *` for type-only exports. ### {module-name}/manifests.ts Extension registrations for this module: ```typescript export const manifests: Array<UmbExtensionManifest> = [ // Extension registrations ]; ``` If the module has no extensions (pure utility), export an empty array. ### {module-name}/constants.ts ```typescript // Aliases, context tokens, entity types ``` ### {module-name}/types.ts ```typescript // Type definitions, interfaces, meta types ``` ## Step 2: Wire into core's manifests.ts Add the module's manifests to `src/packages/core/manifests.ts`: ```typescript import { manifests as {moduleName}Manifests } from './{module-name}/manifests.js'; // In the manifests array: ...{moduleName}Manifests, ``` The imports are in alphabetical order — insert in the right position. ## Step 3: Add entry point to core's vite.config.ts Add the module to the `entry` object in `src/packages/core/vite.config.ts`: ```typescript '{module-name}/index': './{module-name}/index.ts', ``` The entries are in alphabetical order — insert in the right position. This tells Vite to build the module as a separate entry point. ## Step 4: Register the subpath export Add to the `exports` field in the root `package.json` (`src/Umbraco.Web.UI.Client/package.json`): ```json "./{module-name}": "./dist-cms/packages/core/{module-name}/index.js" ``` This enables imports like `@umbraco-cms/backoffice/{module-name}`. ## Step 5: Regenerate TypeScript config ```bash npm run generate:tsconfig ``` This updates `tsconfig.json` paths so the new module resolves correctly in TypeScript. ## How consumers import After registration, other packages import from the module like: ```typescript import { MyThing } from '@umbraco-cms/backoffice/{module-name}'; import type { MyType } from '@umbraco-cms/backoffice/{module-name}'; ``` ## Reference: existing core modules to study - **Simple utility**: `src/packages/core/culture/` — repository + components, minimal surface - **Extension primitive**: `src/packages/core/entity-action/` — kinds, base classes, shared element - **Infrastructure**: `src/packages/core/repository/` — base classes for the data access pattern ## Checklist - [ ] Module directory created under `src/packages/core/` - [ ] `index.ts` exports only the public API - [ ] `manifests.ts` exports extension registrations (or empty array) - [ ] `constants.ts` and `types.ts` created - [ ] Module manifests imported in `src/packages/core/manifests.ts` (alphabetical order) - [ ] Entry point added to `src/packages/core/vite.config.ts` (alphabetical order) - [ ] Subpath export added to root `package.json` - [ ] `npm run generate:tsconfig` executed - [ ] Compiles: `npm run compile`
在 GitHub 查看