@manohub/kit
@manohub/kit
AIHub 子应用入口编排层:createSubApp 统一挂载、i18n 单实例,
外加随包分发的接入契约(CONTRACT.md:五层闭集条款 + §7 自检清单)与三个 AI 技能包(skills/)。
组件与命令式服务不在本包 —— 它们来自 @manohub/ui;
全局令牌(值)不在本包 —— 它来自 @manohub/theme;
本包也不发布任何样式 —— 上面两行由消费方直接引。几个包并列安装。
0.6.0 是破坏性变更(上一个已发布版本是
@manohub/app-kit@0.4.3):本包不再提供任何组件 (App*前缀名与.ak-*类名全部退场、farris 依赖移除)、主题层独立为@manohub/theme(容器锚改名data-manohub-ui)、本包内的样式全部删除(reset.css与.app-markdown富文本预设不再提供)、消费侧机器规则整批下线(原kit lint三条护栏不再发布, 合规改为「契约条款 + §7 自检清单」)。 这些是同一次重构,一次性做完 —— 迁移对照与步骤见CONTRACT.md§12。
新项目接入(快速开始)
1. 安装
pnpm add @manohub/kit @manohub/ui @manohub/theme
peer(由应用提供,缺一个都装不上):
pnpm add vue vue-router pinia vue-i18n @tanstack/vue-query
@manohub/ui 自带图标包依赖(@manohub/icon),不必单独声明。
2. 样式:两行 + 应用自己一行(顺序即契约)
本包不发布任何样式:设计令牌(值)在 @manohub/theme、组件面(类 + 组件令牌基础值)在
@manohub/ui,两行由消费方直接引;本包不再提供 reset、富文本预设与样式汇总入口。
@import "@manohub/theme/default.css"; /* ① 令牌(值)—— 换主题只换这一行 */
@import "@manohub/ui/styles.css"; /* ② 组件面(类 + 组件令牌基础值) */
@import "./app.css"; /* ③ 应用自身(只写布局) */
顺序不可换:先值(令牌)后面(组件面)—— 反过来的话组件面里的 var(--ui-*) 全是空值。
改用非兜底主题:把 ① 换成对应主题入口 + 给容器属性 ——
@import "@manohub/theme/farris.css"; /* 替换 ① 那一行 */
createSubApp({ /* … */ theme: 'farris' }) // 写到容器的 data-theme 上
主题套锚在容器属性上(default 不带主题属性、其余套锚 [data-manohub-ui][data-theme='<名>']),
所以换皮不动类名、不动组件代码、不重打包。
3. 入口:统一走 createSubApp
// src/main.ts
import { createSubApp } from '@manohub/kit/entry'
import Root from './root'
import { routes } from './router'
export const { mount, unmount } = createSubApp({
rootComponent: Root,
routes,
i18n: { messages: { zh, en } }, // vue-i18n 形态:{ zh: {...}, en: {...} },无 translation 包装层
})
它替你做完:div.app-container 包裹与 data-manohub-ui 锚点、pinia / vue-router / vue-query 装配、
宿主挂载协议(window.mount/unmount + microApp.mount/unmount)、宿主语言同步、首帧路由重置。
data-manohub-ui 是跨包唯一的作用域锚点(主题令牌、组件令牌、微前端 scopecss 都锚在它上面,
组件库服务层也按它解析宿主)—— 别改名;若自建容器(不走 createSubApp)必须自己带上。
类名 .app-container 只是本包内部命名(调试自查用),不是契约。
4. 第一个页面用模板 A
import { Button, Input, Page, Panel, Table } from '@manohub/ui'
export default function SkillList() {
return (
<Page>
<Page.Header title="技能列表" extra={<Input placeholder="搜索" />} />
<Page.Body mode="plain">
<Panel title="技能列表" actions={<Button variant="primary">新建</Button>}>
<Table data={rows} columns={columns} />
<Panel.Footer>分页放这里</Panel.Footer>
</Panel>
</Page.Body>
</Page>
)
}
三种页面模板、四种操作位、两级滚动归属、分页归属 —— 见 CONTRACT.md §5(L2 结构)。
5. 自检(0.6.0 起没有自动扫描)
本包不再发布消费侧机器规则。合规靠契约条款 + 自检清单在写作与评审时把关:
- 写代码前按契约 §0 权威源表去取值 / 查件名 / 查词表(不要抄一份会过期的副本);
- 收工前人工过
CONTRACT.md§7 自检清单(24 问,五层各一组); - 类型与构建照常跑:
pnpm exec vue-tsc --noEmit
pnpm build
类名命名空间表放本仓 docs/kit-namespaces.md(per-app 文件,格式见技能包的
kit-migrate/references/migration-playbook.md)—— 原 appkit-guardrails.config.json 不再被读取。
6. 技能包落盘(AI 代理用)
pnpm exec kit install # 把三个技能落到本工程的技能目录
pnpm exec kit install --dry-run # 先看会写什么
7. 验收
- 应用能挂载(
window.mount()/ micro-app 容器); - 类型检查 0 错、构建成功;
- 命令式提示落回应用容器(
toast('success', 'ok')后检查 DOM 里[data-manohub-ui]内有.mh-toast); CONTRACT.md§7 自检清单逐条过完。
分发形态
预编译产物:exports 指向 dist。公开入口(改名即破坏性变更):
| 入口 | 内容 |
|---|---|
@manohub/kit |
useClientPagination、resolveAppContainer / resolveAppContainerSelector |
@manohub/kit/entry |
createSubApp、installInitialGuard、createQueryClient、applyLocale / getLocale / i18n / setupI18n |
@manohub/kit/CONTRACT.md |
接入契约(权威规范:五层闭集条款 + §7 自检清单) |
本包没有任何样式出口(0.6.0 起):./styles.css、./reset.css、./markdown.css 都已删除。
样式请引 @manohub/theme 与 @manohub/ui 的公开入口(见上面 §2)。
技能包(AI 代理用,随包分发)
| 技能 | 什么时候用 |
|---|---|
kit |
不确定该用哪个子技能、问骨架层总体规范、要接入步骤与升级口径 |
kit-dev |
写/改页面:选模板、选组件与 prop、样式纪律、收工前自检 |
kit-migrate |
存量应用改造:按契约分层盘点、划批次、逐文件替换、逐层收口 |
来源
包内实现由 gsp-cloud-ds/dip/ibp/aihub/aihub-frontend 的 kit 分支首提交导入
(commit 315b60f),再按「组件与服务独立成 @manohub/ui、本包只留入口编排」拆分而成。
迁移来源 commit 只作留档,不要据此回改本包实现。