ワンクリックで
hai-app-create
以 TDD 方式在应用中创建新功能:先编写测试定义行为,再编码实现直至测试通过;当需求涉及新增页面/路由、API、服务、数据模型、组件时使用。
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
メニュー
以 TDD 方式在应用中创建新功能:先编写测试定义行为,再编码实现直至测试通过;当需求涉及新增页面/路由、API、服务、数据模型、组件时使用。
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
SOC 職業分類に基づく
Use when: using @h-ai/ai, LLM calls, chat completion, tool calling, function calling, MCP server, streaming, memory management, context compression, summarization, token estimation, RAG, knowledge base, AI client, embeddings, reasoning, rerank, file parsing, speech recognition ASR, speech synthesis TTS, audio, A2A agent-to-agent. 使用 @h-ai/ai 进行 LLM 调用、工具定义、MCP 服务器、流式处理、记忆管理、上下文压缩、知识库、推理引擎、Rerank、文件解析、语音识别与合成、A2A 与会话持久化。
Use when: using @h-ai/ai for LLM calls, tools, MCP, streaming, memory/context, RAG, audio, A2A, or the AI client. 当需求涉及 AI 对话、工具、Audio、会话、知识库或 AI 客户端时使用。
Use when: creating or extending apps in hai-framework, adding routes, pages, API endpoints, service workspaces, mobile app, H5 app, admin console. 在 hai-framework 中创建或扩展应用或 API service workspace,包含路由、API 端点、typed contract、服务层与 UI 脚手架代码。
Use when: creating a new module, new package, scaffold, add sub-feature, add provider, create repository, module structure, tsup config, error codes, NotInitializedKit pattern. 在 hai-framework 中创建新模块(package)。
Use when: reviewing app code in hai-framework, auditing app quality, checking app conventions, reviewing routes, reviewing API service workspaces, app security, app i18n review. 对 hai-framework 应用层代码进行审查:路由安全 → 认证授权 → i18n → 组件使用 → API 端点 / service workspace → 服务层 → 性能。
Use when: reviewing code, code review, auditing module quality, checking hai-framework conventions, verifying HaiResult<T> usage, reviewing module structure, PR review, checking naming consistency, verifying NotInitializedKit pattern, auditing performance, security, distributed systems. 对 hai-framework 模块进行全维度代码审查:架构 → 命名 → 类型 → 注释 → 性能 → 分布式 → 安全 → 日志 → 测试 → 文档。
| name | hai-app-create |
| description | 以 TDD 方式在应用中创建新功能:先编写测试定义行为,再编码实现直至测试通过;当需求涉及新增页面/路由、API、服务、数据模型、组件时使用。 |
| 项目 | 契约 |
|---|---|
| 能力 | 以 TDD 方式在应用中创建新功能:先编写测试定义行为,再编码实现直至测试通过;当需求涉及新增页面/路由、API、服务、数据模型、组件时使用。 |
| 适用场景 | 当任务与 hai-app-create 的能力描述匹配,并且需要遵循本 Skill 的流程和边界时 |
| 输入 | 明确的功能需求、目标路径、现有实现、仓库规范与验收条件 |
| 输出 | 最小必要的代码、类型、测试和同步文档,以及实际验证结果 |
| 限制 | 不为假设需求增加抽象,不绕过生命周期/HaiResult/i18n 约定,不覆盖用户已有改动 |
面向 AI 助手的应用功能创建指南。必须遵循 TDD:先写测试(Red)→ 再实现(Green)→ 再重构(Refactor)。 若目标是纯 API service workspace,优先围绕
apps/*-contract、apps/*-service与测试组织改动,而不是套用页面/路由脚手架。
$lib/server/services/)创建任何新功能时,必须按以下顺序执行:
hai-app-tests 技能的覆盖范围要求)tests/ 下为服务层、Schema 编写 Vitest 测试e2e/ 下为 API 端点、页面交互编写 Playwright 测试pnpm --filter <app-name> test # 应全部 FAIL
按照下文的「创建指南」编写实际功能代码,每完成一个功能点立即运行测试确认通过。
hai-app-review 审查代码规范pnpm typecheck && pnpm lint && pnpm testpnpm --filter <app-name> test:e2esrc/
hooks.server.ts # `handle` hook 入口
app.css # 全局样式(TailwindCSS 4)
lib/
server/
init.ts # 应用初始化(模块 init 顺序)
services/ # 业务服务层(Server-only)
index.ts # 服务聚合导出
user.ts # 示例:用户服务
schemas/ # 请求校验 Schema(Zod)
components/ # 业务组件(非 @h-ai/ui 通用组件)
stores/ # 客户端 Store(Svelte 5 Runes)
paraglide/ # i18n 生成文件(禁止手动修改)
routes/
+layout.svelte # 根布局
+page.svelte # 首页
(auth)/ # 认证分组路由
login/+page.svelte
admin/ # 管理区域
users/
+page.svelte # 列表页
+page.server.ts # 列表数据加载
[id]/
+page.svelte # 详情页
+page.server.ts
api/ # API 端点
auth/+server.ts
health/+server.ts
iam/
users/+server.ts
messages/ # i18n 消息文件
en-US.json
zh-CN.json
config/ # 模块配置文件
_core.yml
_db.yml
_cache.yml
_iam.yml
使用 SvelteKit 文件路由,参考 src/routes/ 约定:
| 类型 | 路径示例 | 说明 |
|---|---|---|
| 静态页面 | routes/about/+page.svelte | 常规页面 |
| 动态路由 | routes/users/[id]/+page.svelte | URL 参数 |
| 分组路由 | routes/(auth)/login/+page.svelte | 共享布局,不影响 URL |
| API 端点 | routes/api/users/+server.ts | RESTful API |
<!-- +page.svelte -->
<script lang="ts">
// Svelte 5 Runes 语法
let { data } = $props()
let loading = $state(false)
async function handleAction() {
loading = true
try {
// 业务逻辑
} finally {
loading = false
}
}
</script>
<div class="container mx-auto p-4">
<!-- 使用 @h-ai/ui 组件 -->
</div>
import type { PageServerLoad } from './$types'
import { kit } from '@h-ai/kit'
export const load: PageServerLoad = async (event) => {
// 权限守卫
const guard = kit.guard.requireAuth(event)
if (!guard.success)
return kit.response.redirect('/login')
// 加载数据
const result = await someService.list()
if (!result.success)
return kit.response.error(500, result.error.message)
return { items: result.data }
}
// src/routes/api/[resource]/+server.ts
import type { RequestHandler } from './$types'
import { kit } from '@h-ai/kit'
import { z } from 'zod'
const CreateSchema = z.object({
name: z.string().min(1).max(100),
description: z.string().optional(),
})
// GET - 列表
export const GET = kit.handler(async ({ locals }) => {
kit.guard.requirePermission(locals.session, 'resource:read')
const result = await service.list()
if (!result.success)
return kit.response.error(500, result.error.message)
return kit.response.ok(result.data)
})
// POST - 创建
export const POST = kit.handler(async ({ request, locals }) => {
kit.guard.requirePermission(locals.session, 'resource:create')
const data = await kit.validate.formOrFail(request, CreateSchema)
const result = await service.create(data)
if (!result.success)
return kit.response.error(500, result.error.message)
return kit.response.created(result.data)
})
kit.handler(async ({ locals, request, ... }) => { ... }) 包裹,由 handler 统一处理 throw 的 Responsekit.guard.requirePermission(locals.session, 'xxx:yyy'),它本身就是 throw 模式(未通过时 throw 403 Response),无需检查返回值await kit.validate.formOrFail(request, Schema),校验失败时 throw 400 Response,无需手动判断 validkit.response.*try/catch 处理模块返回的错误,直接检查 result.success服务层位于 $lib/server/services/,处理业务逻辑。
import type { HaiResult } from '@h-ai/core'
// src/lib/server/services/article.ts
import { core } from '@h-ai/core'
import { reldb } from '@h-ai/reldb'
const logger = core.logger
/** 创建文章 */
export async function createArticle(input: CreateArticleInput): Promise<HaiResult<Article>> {
logger.debug('Creating article', { title: input.title })
const result = await reldb.crud.create('articles', {
id: crypto.randomUUID(),
...input,
created_at: new Date().toISOString(),
})
if (!result.success)
return result
logger.info('Article created', { id: result.data.id })
return result
}
/** 获取文章列表 */
export async function listArticles(params: ListParams): Promise<HaiResult<PaginatedResult<Article>>> {
logger.debug('Listing articles', { page: params.page })
return reldb.crud.paginate('articles', params)
}
HaiResult<T>debug(进入)+ info(成功)日志debug 日志console.log,使用 core.logger数据库表 Schema 定义在 $lib/server/init.ts 中:
const BUSINESS_SCHEMA = `
CREATE TABLE IF NOT EXISTS articles (
id TEXT PRIMARY KEY,
title TEXT NOT NULL,
content TEXT,
author_id TEXT NOT NULL,
status TEXT DEFAULT 'draft',
created_at TEXT DEFAULT (datetime('now')),
updated_at TEXT DEFAULT (datetime('now'))
);
CREATE INDEX IF NOT EXISTS idx_articles_author_id ON articles(author_id);
CREATE INDEX IF NOT EXISTS idx_articles_status ON articles(status);
`
// 在服务文件或独立类型文件中定义
interface Article {
id: string
title: string
content: string | null
authorId: string
status: 'draft' | 'published' | 'archived'
createdAt: string
updatedAt: string
}
interface CreateArticleInput {
title: string
content?: string
authorId: string
}
业务组件放在 $lib/components/,通用 UI 使用 @h-ai/ui。
<!-- src/lib/components/ArticleCard.svelte -->
<script lang="ts">
import type { Article } from '$lib/server/services/article'
let { article, onEdit }: { article: Article, onEdit?: () => void } = $props()
</script>
<div class="card bg-base-100 shadow">
<div class="card-body">
<h2 class="card-title">{article.title}</h2>
<p>{article.content ?? ''}</p>
{#if onEdit}
<div class="card-actions justify-end">
<button class="btn btn-primary" onclick={onEdit}>编辑</button>
</div>
{/if}
</div>
</div>
$props()、$state()、$derived()、$effect())createEventDispatcher)@h-ai/ui,不重复实现$lib/paraglide/messages.js 中的 key在 $lib/server/init.ts 中管理模块初始化顺序:
core.init() → reldb.init() → cache.init() → iam.init() → createBusinessTables()
新增模块时需在此文件中按依赖顺序添加初始化调用。
HaiResult<T>console.log、any、硬编码密钥@h-ai/uipnpm typecheck && pnpm lint && pnpm test 通过hai-build:项目架构与模块初始化顺序hai-app-tests:TDD 测试规范(Red 阶段详细指引)hai-app-review:代码审查规范(Refactor 阶段参照)hai-kit:SvelteKit 集成的完整 APIhai-ui:UI 组件库使用hai-reldb:数据库操作详细 APIhai-iam:认证与权限管理