@h-ai/cli 0.1.0-alpha.20 → 0.1.0-alpha.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -7
- package/dist/{chunk-GSMXGUYF.js → chunk-5IGMJVV5.js} +56 -38
- package/dist/chunk-5IGMJVV5.js.map +1 -0
- package/dist/{chunk-3BBXDQ4Y.js → chunk-CFCXOKGV.js} +24 -2
- package/dist/chunk-CFCXOKGV.js.map +1 -0
- package/dist/cli-config-templates-5J5VKWWD.js +5 -0
- package/dist/{cli-config-templates-IGGO7P45.js.map → cli-config-templates-5J5VKWWD.js.map} +1 -1
- package/dist/cli-skill-templates-JMSV2SVW.js +5 -0
- package/dist/{cli-skill-templates-IMYZPQRG.js.map → cli-skill-templates-JMSV2SVW.js.map} +1 -1
- package/dist/index.js +567 -75
- package/dist/index.js.map +1 -1
- package/package.json +3 -2
- package/templates/README.md +40 -29
- package/templates/apps/api/apps/{{projectName}}-contract/README.md.hbs +16 -0
- package/templates/apps/api/apps/{{projectName}}-contract/package.json.hbs +38 -0
- package/templates/apps/api/apps/{{projectName}}-contract/src/app-contract.ts.hbs +27 -0
- package/templates/apps/api/apps/{{projectName}}-contract/src/app-schemas.ts.hbs +33 -0
- package/templates/apps/api/apps/{{projectName}}-contract/src/index.ts.hbs +3 -0
- package/templates/apps/api/apps/{{projectName}}-contract/src/{{projectName}}-contract.ts.hbs +12 -0
- package/templates/apps/api/apps/{{projectName}}-contract/tests/contract.test.ts.hbs +18 -0
- package/templates/apps/api/apps/{{projectName}}-contract/tsconfig.json.hbs +12 -0
- package/templates/apps/api/apps/{{projectName}}-contract/tsup.config.ts.hbs +11 -0
- package/templates/apps/api/apps/{{projectName}}-contract/vitest.config.ts.hbs +9 -0
- package/templates/apps/api/apps/{{projectName}}-service/README.md.hbs +17 -0
- package/templates/apps/api/apps/{{projectName}}-service/config/_core.yml.hbs +19 -0
- package/templates/apps/api/apps/{{projectName}}-service/config/_serv.yml.hbs +26 -0
- package/templates/apps/api/apps/{{projectName}}-service/package.json.hbs +55 -0
- package/templates/apps/api/apps/{{projectName}}-service/src/app.ts.hbs +98 -0
- package/templates/apps/api/apps/{{projectName}}-service/src/index.ts.hbs +21 -0
- package/templates/apps/api/apps/{{projectName}}-service/src/lib/server/init.ts.hbs +184 -0
- package/templates/apps/api/apps/{{projectName}}-service/src/server/procedures/app-procedures.ts.hbs +49 -0
- package/templates/apps/api/apps/{{projectName}}-service/src/server/procedures/index.ts.hbs +18 -0
- package/templates/apps/api/apps/{{projectName}}-service/tests/service.test.ts.hbs +168 -0
- package/templates/apps/api/apps/{{projectName}}-service/tsconfig.json.hbs +16 -0
- package/templates/apps/api/apps/{{projectName}}-service/tsup.config.ts.hbs +11 -0
- package/templates/apps/api/apps/{{projectName}}-service/vitest.config.ts.hbs +9 -0
- package/templates/apps/api/e2e/api-service.spec.ts.hbs +18 -0
- package/templates/apps/api/eslint.config.js +32 -0
- package/templates/apps/api/package.json.hbs +29 -0
- package/templates/apps/api/playwright.config.ts.hbs +58 -0
- package/templates/apps/api/pnpm-workspace.yaml.hbs +14 -0
- package/templates/apps/api/tsconfig.base.json +15 -0
- package/templates/apps/fullstack/apps/{{projectName}}-app/.env.example.hbs +10 -0
- package/templates/apps/fullstack/apps/{{projectName}}-app/README.md.hbs +24 -7
- package/templates/apps/fullstack/apps/{{projectName}}-app/capacitor.config.ts.hbs +18 -0
- package/templates/apps/fullstack/apps/{{projectName}}-app/eslint.config.js.hbs +1 -1
- package/templates/apps/fullstack/apps/{{projectName}}-app/index.html.hbs +16 -0
- package/templates/apps/fullstack/apps/{{projectName}}-app/messages/en-US.json.hbs +6 -0
- package/templates/apps/fullstack/apps/{{projectName}}-app/messages/zh-CN.json.hbs +6 -0
- package/templates/apps/fullstack/apps/{{projectName}}-app/package.json.hbs +51 -29
- package/templates/apps/fullstack/apps/{{projectName}}-app/src/App.svelte.hbs +186 -0
- package/templates/apps/fullstack/apps/{{projectName}}-app/src/app.css.hbs +2 -0
- package/templates/apps/fullstack/apps/{{projectName}}-app/src/app.d.ts.hbs +0 -1
- package/templates/apps/fullstack/apps/{{projectName}}-app/src/lib/capacitor.ts.hbs +18 -0
- package/templates/apps/fullstack/apps/{{projectName}}-app/src/main.ts.hbs +14 -0
- package/templates/apps/fullstack/apps/{{projectName}}-app/svelte.config.js.hbs +1 -5
- package/templates/apps/fullstack/apps/{{projectName}}-app/tsconfig.json.hbs +10 -4
- package/templates/apps/fullstack/apps/{{projectName}}-app/vite.config.ts.hbs +4 -3
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/.env.example.hbs +6 -0
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/README.md.hbs +20 -6
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/eslint.config.js.hbs +1 -1
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/index.html.hbs +15 -0
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/package.json.hbs +33 -30
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/src/App.svelte.hbs +152 -0
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/src/app.d.ts.hbs +1 -2
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/src/main.ts.hbs +13 -0
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/Cargo.toml.hbs +22 -0
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/build.rs.hbs +6 -0
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/capabilities/default.json.hbs +12 -0
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/icons/128x128.png +0 -0
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/icons/128x128@2x.png +0 -0
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/icons/32x32.png +0 -0
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/icons/icon.icns +0 -0
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/icons/icon.ico +0 -0
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/src/lib.rs.hbs +16 -0
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/src/main.rs.hbs +8 -0
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/tauri.conf.json.hbs +41 -0
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/svelte.config.js.hbs +2 -8
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/tsconfig.json.hbs +9 -4
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/vite.config.ts.hbs +44 -21
- package/templates/apps/fullstack/apps/{{projectName}}-web/README.md.hbs +15 -6
- package/templates/apps/fullstack/apps/{{projectName}}-web/eslint.config.js.hbs +1 -1
- package/templates/apps/fullstack/apps/{{projectName}}-web/index.html.hbs +15 -0
- package/templates/apps/fullstack/apps/{{projectName}}-web/package.json.hbs +25 -27
- package/templates/apps/fullstack/apps/{{projectName}}-web/src/App.svelte.hbs +153 -0
- package/templates/apps/fullstack/apps/{{projectName}}-web/src/app.d.ts.hbs +0 -1
- package/templates/apps/fullstack/apps/{{projectName}}-web/src/main.ts.hbs +14 -0
- package/templates/apps/fullstack/apps/{{projectName}}-web/svelte.config.js.hbs +1 -5
- package/templates/apps/fullstack/apps/{{projectName}}-web/tsconfig.json.hbs +10 -4
- package/templates/apps/fullstack/apps/{{projectName}}-web/vite.config.ts.hbs +3 -2
- package/templates/apps/fullstack/e2e/fullstack.spec.ts.hbs +2 -1
- package/templates/apps/fullstack/eslint.config.js +0 -1
- package/templates/apps/fullstack/package.json.hbs +18 -17
- package/templates/apps/fullstack/packages/{{projectName}}-contract/package.json.hbs +3 -3
- package/templates/apps/fullstack/packages/{{projectName}}-serv/README.md.hbs +2 -2
- package/templates/apps/fullstack/packages/{{projectName}}-serv/package.json.hbs +2 -2
- package/templates/apps/fullstack/packages/{{projectName}}-serv/src/index.ts.hbs +1 -1
- package/templates/apps/fullstack/packages/{{projectName}}-serv/tests/{server-app.test.ts.hbs → app-server.test.ts.hbs} +1 -1
- package/templates/apps/fullstack/packages/{{projectName}}-shared/package.json.hbs +9 -8
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/index.ts.hbs +1 -1
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/api/api-client.ts.hbs +5 -1
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/ThemeSwitcher.svelte.hbs +1 -1
- package/templates/apps/fullstack/packages/{{projectName}}-shared/tsconfig.json.hbs +1 -1
- package/templates/apps/fullstack/playwright.config.ts.hbs +41 -4
- package/templates/apps/fullstack/pnpm-workspace.yaml.hbs +15 -0
- package/templates/apps/mobile-app/.env.hbs +3 -0
- package/templates/apps/{android-app → mobile-app}/capacitor.config.ts.hbs +2 -2
- package/templates/apps/mobile-app/index.html.hbs +13 -0
- package/templates/apps/mobile-app/messages/en-US.json +36 -0
- package/templates/apps/mobile-app/messages/zh-CN.json +36 -0
- package/templates/apps/mobile-app/src/App.svelte.hbs +162 -0
- package/templates/apps/mobile-app/src/lib/api.ts.hbs +54 -0
- package/templates/apps/{android-app → mobile-app}/src/lib/capacitor.ts +5 -6
- package/templates/apps/mobile-app/src/main.ts.hbs +11 -0
- package/templates/base/.gitignore.hbs +16 -0
- package/templates/base/{eslint.config.js → eslint.config.js.hbs} +4 -1
- package/templates/base/package.json.hbs +52 -33
- package/templates/base/playwright.config.ts +30 -3
- package/templates/base/pnpm-workspace.yaml.hbs +14 -0
- package/templates/base/src/app.d.ts.hbs +3 -0
- package/templates/base/src/app.html.hbs +3 -0
- package/templates/base/svelte.config.js.hbs +43 -3
- package/templates/base/tests/scaffold.test.ts.hbs +7 -0
- package/templates/base/tsconfig.json.hbs +50 -0
- package/templates/base/vite.config.ts.hbs +10 -0
- package/templates/skills/AGENTS.md +57 -24
- package/templates/skills/CLAUDE.md +18 -7
- package/templates/skills/bridges/admin/AGENTS.md +66 -0
- package/templates/skills/bridges/admin/CLAUDE.md +19 -0
- package/templates/skills/bridges/admin/copilot-instructions.md +46 -0
- package/templates/skills/bridges/api/AGENTS.md +65 -0
- package/templates/skills/bridges/api/CLAUDE.md +19 -0
- package/templates/skills/bridges/api/copilot-instructions.md +46 -0
- package/templates/skills/bridges/fullstack/AGENTS.md +84 -0
- package/templates/skills/bridges/fullstack/CLAUDE.md +19 -0
- package/templates/skills/bridges/fullstack/copilot-instructions.md +54 -0
- package/templates/skills/bridges/h5/AGENTS.md +65 -0
- package/templates/skills/bridges/h5/CLAUDE.md +19 -0
- package/templates/skills/bridges/h5/copilot-instructions.md +44 -0
- package/templates/skills/bridges/mobile-app/AGENTS.md +77 -0
- package/templates/skills/bridges/mobile-app/CLAUDE.md +19 -0
- package/templates/skills/bridges/mobile-app/copilot-instructions.md +45 -0
- package/templates/skills/bridges/website/AGENTS.md +65 -0
- package/templates/skills/bridges/website/CLAUDE.md +19 -0
- package/templates/skills/bridges/website/copilot-instructions.md +44 -0
- package/templates/skills/copilot-instructions.md +27 -64
- package/templates/skills/hai-app-create/SKILL.md +1 -0
- package/templates/skills/hai-app-review/SKILL.md +1 -1
- package/templates/skills/hai-app-tests/SKILL.md +28 -3
- package/templates/skills/hai-capacitor/SKILL.md +14 -22
- package/templates/skills/opencode.json +1 -6
- package/dist/chunk-3BBXDQ4Y.js.map +0 -1
- package/dist/chunk-GSMXGUYF.js.map +0 -1
- package/dist/cli-config-templates-IGGO7P45.js +0 -5
- package/dist/cli-skill-templates-IMYZPQRG.js +0 -5
- package/templates/apps/android-app/.env.hbs +0 -3
- package/templates/apps/android-app/messages/en-US.json +0 -24
- package/templates/apps/android-app/messages/zh-CN.json +0 -24
- package/templates/apps/android-app/src/lib/api.ts.hbs +0 -32
- package/templates/apps/android-app/src/routes/+layout.svelte.hbs +0 -43
- package/templates/apps/android-app/src/routes/+layout.ts +0 -7
- package/templates/apps/android-app/src/routes/+page.svelte.hbs +0 -38
- package/templates/apps/api/src/routes/+layout.svelte +0 -14
- package/templates/apps/api/src/routes/+page.svelte +0 -11
- package/templates/apps/api/src/routes/api/v1/health/+server.ts +0 -14
- package/templates/apps/api/src/routes/api/v1/items/+server.ts +0 -37
- package/templates/apps/api/src/routes/api/v1/items/[id]/+server.ts +0 -30
- package/templates/apps/api/tests/health.test.ts.hbs +0 -26
- package/templates/apps/fullstack/apps/{{projectName}}-app/src/app.html.hbs +0 -14
- package/templates/apps/fullstack/apps/{{projectName}}-app/src/routes/+layout.svelte.hbs +0 -18
- package/templates/apps/fullstack/apps/{{projectName}}-app/src/routes/+page.svelte.hbs +0 -162
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/src/app.html.hbs +0 -14
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/src/routes/+layout.svelte.hbs +0 -18
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/src/routes/+page.svelte.hbs +0 -162
- package/templates/apps/fullstack/apps/{{projectName}}-web/src/app.html.hbs +0 -14
- package/templates/apps/fullstack/apps/{{projectName}}-web/src/routes/+layout.svelte.hbs +0 -18
- package/templates/apps/fullstack/apps/{{projectName}}-web/src/routes/+page.svelte.hbs +0 -162
- package/templates/apps/fullstack/pnpm-workspace.yaml +0 -7
- package/templates/base/tsconfig.json +0 -20
- /package/templates/apps/fullstack/packages/{{projectName}}-serv/src/{server-app.ts.hbs → app-server.ts.hbs} +0 -0
- /package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/stores/{theme.svelte.ts.hbs → theme-store.svelte.ts.hbs} +0 -0
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
{{#if isSvelteOnlyApp}}
|
|
2
|
+
{
|
|
3
|
+
"$schema": "https://json.schemastore.org/tsconfig",
|
|
4
|
+
"compilerOptions": {
|
|
5
|
+
"target": "ES2022",
|
|
6
|
+
"lib": ["ES2022", "DOM", "DOM.Iterable"],
|
|
7
|
+
"moduleDetection": "force",
|
|
8
|
+
"module": "ESNext",
|
|
9
|
+
"moduleResolution": "bundler",
|
|
10
|
+
"resolveJsonModule": true,
|
|
11
|
+
"types": ["svelte", "vite/client", "node", "vitest/globals"],
|
|
12
|
+
"allowJs": true,
|
|
13
|
+
"checkJs": false,
|
|
14
|
+
"strict": true,
|
|
15
|
+
"noEmit": true,
|
|
16
|
+
"isolatedModules": true,
|
|
17
|
+
"verbatimModuleSyntax": true,
|
|
18
|
+
"skipLibCheck": true
|
|
19
|
+
},
|
|
20
|
+
"include": [
|
|
21
|
+
"src/**/*.ts",
|
|
22
|
+
"src/**/*.svelte",
|
|
23
|
+
"tests/**/*.ts",
|
|
24
|
+
"vite.config.ts",
|
|
25
|
+
"svelte.config.js"
|
|
26
|
+
],
|
|
27
|
+
"exclude": ["node_modules", "dist", "build", "android", "ios"]
|
|
28
|
+
}
|
|
29
|
+
{{else}}
|
|
30
|
+
{
|
|
31
|
+
"extends": "./.svelte-kit/tsconfig.json",
|
|
32
|
+
"compilerOptions": {
|
|
33
|
+
"moduleResolution": "bundler",
|
|
34
|
+
"allowImportingTsExtensions": true,
|
|
35
|
+
"allowJs": true,
|
|
36
|
+
"checkJs": false,
|
|
37
|
+
"strict": true,
|
|
38
|
+
"verbatimModuleSyntax": true,
|
|
39
|
+
"skipLibCheck": true
|
|
40
|
+
},
|
|
41
|
+
"include": [
|
|
42
|
+
"src/**/*",
|
|
43
|
+
"src/**/*.svelte"
|
|
44
|
+
],
|
|
45
|
+
"exclude": [
|
|
46
|
+
"node_modules",
|
|
47
|
+
".svelte-kit"
|
|
48
|
+
]
|
|
49
|
+
}
|
|
50
|
+
{{/if}}
|
|
@@ -6,7 +6,11 @@ import process from 'node:process'
|
|
|
6
6
|
{{#if hasI18n}}
|
|
7
7
|
import { paraglideVitePlugin } from '@inlang/paraglide-js'
|
|
8
8
|
{{/if}}
|
|
9
|
+
{{#if isSvelteOnlyApp}}
|
|
10
|
+
import { svelte } from '@sveltejs/vite-plugin-svelte'
|
|
11
|
+
{{else}}
|
|
9
12
|
import { sveltekit } from '@sveltejs/kit/vite'
|
|
13
|
+
{{/if}}
|
|
10
14
|
{{#if hasUi}}
|
|
11
15
|
import tailwindcss from '@tailwindcss/vite'
|
|
12
16
|
{{/if}}
|
|
@@ -18,7 +22,11 @@ export default defineConfig(({ mode }) => {
|
|
|
18
22
|
|
|
19
23
|
return {
|
|
20
24
|
plugins: [
|
|
25
|
+
{{#if isSvelteOnlyApp}}
|
|
26
|
+
svelte(),
|
|
27
|
+
{{else}}
|
|
21
28
|
sveltekit(),
|
|
29
|
+
{{/if}}
|
|
22
30
|
{{#if hasUi}}
|
|
23
31
|
tailwindcss(),
|
|
24
32
|
{{/if}}
|
|
@@ -35,9 +43,11 @@ export default defineConfig(({ mode }) => {
|
|
|
35
43
|
exclude: ['bits-ui'],
|
|
36
44
|
},
|
|
37
45
|
{{/if}}
|
|
46
|
+
{{#unless isSvelteOnlyApp}}
|
|
38
47
|
ssr: {
|
|
39
48
|
noExternal: [/@h-ai\//],
|
|
40
49
|
},
|
|
50
|
+
{{/unless}}
|
|
41
51
|
server: {
|
|
42
52
|
fs: {
|
|
43
53
|
allow: [path.resolve(process.cwd())],
|
|
@@ -1,37 +1,70 @@
|
|
|
1
1
|
# AGENTS.md
|
|
2
2
|
|
|
3
|
-
> 通用 AI
|
|
3
|
+
> 通用 AI 编程助手入口。优先阅读 `README.md`、现有测试与 `.agents/skills/`;本文件同时作为 `hai add` / AI 支持回填时的 generic fallback。
|
|
4
|
+
|
|
5
|
+
## 行为契约
|
|
6
|
+
|
|
7
|
+
1. 每次响应第一行写:`规模: XS|S|M|L — <一句话意图>`。
|
|
8
|
+
2. 任务规模 ≥ M 时,先回顾 `README.md`、相关测试、现有 AI 指导文件与对应 `.agents/skills/*/SKILL.md`。
|
|
9
|
+
3. 在写第一行新代码前,用 1 行回答 Q1-Q7:复用对象、可扩展点、当前真实调用点、更简方案、知识泄漏、一致性、性能/安全对比。
|
|
10
|
+
4. 任务规模 ≥ M 时,同步说明直接/间接影响:文件、接口/类型、导入、测试、文档、依赖方。
|
|
11
|
+
5. 不能把未运行或失败的门禁写成“已通过”。
|
|
12
|
+
|
|
13
|
+
## 必要性自检(M / L 任务必须输出)
|
|
14
|
+
|
|
15
|
+
- Q1:仓库里是否已有同类能力可复用?
|
|
16
|
+
- Q2:能否扩展现有文件/模块,而不是新建抽象或目录?
|
|
17
|
+
- Q3:当前真实调用点是什么,不要为了“以后可能”而设计?
|
|
18
|
+
- Q4:有没有少一层、少一个参数、少一个文件的更简单方案?
|
|
19
|
+
- Q5:这次改动会不会让使用方必须了解新的内部细节?
|
|
20
|
+
- Q6:是否与当前项目命名、目录、脚本和对外暴露形式一致?
|
|
21
|
+
- Q7:是否已经比较过更高效或更安全的做法?
|
|
22
|
+
|
|
23
|
+
## 影响分析(M / L 任务必须输出)
|
|
24
|
+
|
|
25
|
+
- 直接影响:修改 / 新建 / 删除哪些文件;哪些脚本、类型、配置或路由会变。
|
|
26
|
+
- 间接影响:哪些测试、README、i18n、示例、共享类型、依赖方需要同步更新。
|
|
4
27
|
|
|
5
28
|
## 项目概述
|
|
6
29
|
|
|
7
|
-
|
|
30
|
+
本项目由 hai-framework CLI 生成。单应用工程通常在 `src/` 下开发;多包工程会同时包含 `packages/*` 与 `apps/*`。实际结构以当前项目目录为准。
|
|
8
31
|
|
|
9
|
-
|
|
32
|
+
## 通用硬约束
|
|
10
33
|
|
|
11
|
-
|
|
34
|
+
- 先用全局检索确认是否已有实现、测试和文档;优先复用,避免为“未来可能”新增抽象。
|
|
35
|
+
- 统一模式:`module.init(config) -> use -> module.close()`;公共 `@h-ai/*` API 返回 `HaiResult<T>` 或 `Promise<HaiResult<T>>`,业务错误不要直接 `throw`。
|
|
36
|
+
- 禁止 `any`、无说明的危险类型断言、`console.log`、硬编码密钥。
|
|
37
|
+
- 用户可见文本必须走 i18n;如果项目启用了 `messages/zh-CN.json` 与 `messages/en-US.json`,修改文案时必须同步更新。
|
|
38
|
+
- 代码注释中文,日志消息英文。
|
|
39
|
+
- 如项目使用 SvelteKit,`+server.ts` 只能导出 HTTP handler 与 SvelteKit 允许的配置项;辅助函数放到 `src/lib/**`。
|
|
12
40
|
|
|
13
|
-
|
|
14
|
-
- **TDD 驱动开发**:先写测试(Red)→ 确认失败 → 再实现(Green)→ 确认通过 → 重构(Refactor)
|
|
15
|
-
- 禁止 `any`(使用 `unknown` + 缩窄),禁止 `console.log`(使用 `core.logger`)
|
|
16
|
-
- 用户可见文本走 i18n,代码注释中文,日志英文
|
|
17
|
-
- HaiResult 错误直接透传,不重新包装
|
|
18
|
-
- 框架模块公共 API 不抛异常,统一返回 `HaiResult<T>`;不要用 `try/catch` 处理模块返回的错误
|
|
19
|
-
- 质量门禁按顺序执行:`pnpm typecheck` → `pnpm lint` → `pnpm build`(涉及构建/发布时)→ `pnpm test` → `pnpm --filter <workspace> test:e2e`(涉及 UI/路由/E2E 时)
|
|
41
|
+
## 工作流程
|
|
20
42
|
|
|
21
|
-
|
|
43
|
+
1. 先搜索现有实现、引用点、测试和 README。
|
|
44
|
+
2. 小步修改,优先保持目录结构、公开 API 和脚本稳定。
|
|
45
|
+
3. 改动公共类型、配置、模板或共享逻辑时,同步更新所有调用方与文档。
|
|
46
|
+
4. 每次改动后按影响范围运行质量门禁并记录结果。
|
|
47
|
+
|
|
48
|
+
## 质量门禁
|
|
22
49
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
50
|
+
```bash
|
|
51
|
+
pnpm typecheck
|
|
52
|
+
pnpm lint
|
|
53
|
+
pnpm build
|
|
54
|
+
pnpm test
|
|
55
|
+
pnpm test:e2e
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## 完成条件
|
|
28
59
|
|
|
29
|
-
|
|
60
|
+
- typecheck / lint / build / test / test:e2e 状态明确;失败必须先修复或明确说明原因。
|
|
61
|
+
- README、i18n、测试、代码注释与实现保持一致。
|
|
62
|
+
- 最终回复说明执行过的门禁、已同步的文档 / 依赖方,以及未完成项。
|
|
30
63
|
|
|
31
|
-
|
|
64
|
+
## Skills 路由
|
|
32
65
|
|
|
33
|
-
-
|
|
34
|
-
-
|
|
35
|
-
-
|
|
36
|
-
-
|
|
37
|
-
-
|
|
66
|
+
- `hai-build/SKILL.md`:架构、构建和质量门禁。
|
|
67
|
+
- `hai-app-create/SKILL.md`:应用骨架、路由、页面与 API 模板。
|
|
68
|
+
- `hai-app-review/SKILL.md`:应用代码审查。
|
|
69
|
+
- `hai-app-tests/SKILL.md`:Vitest / Playwright 测试策略。
|
|
70
|
+
- 具体模块按需读取对应 `hai-*` Skill。
|
|
@@ -2,12 +2,23 @@
|
|
|
2
2
|
|
|
3
3
|
@AGENTS.md
|
|
4
4
|
|
|
5
|
-
> Claude Code 项目指引。共享规范通过 `@AGENTS.md`
|
|
5
|
+
> Claude Code 项目指引。共享规范通过 `@AGENTS.md` 复用;本文件用于 generic fallback 场景,模块和工作流参考资料位于 `.agents/skills/`。
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
如果当前运行环境未自动展开 `@AGENTS.md`,必须先手动阅读 `AGENTS.md`,再开始修改代码或文档。
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
-
|
|
12
|
-
-
|
|
13
|
-
-
|
|
9
|
+
## 开始工作前
|
|
10
|
+
|
|
11
|
+
- 回复第一行保持:`规模: XS|S|M|L — <一句话意图>`。
|
|
12
|
+
- 任务规模 ≥ M 时,先输出 Q1-Q7 必要性自检与影响分析,再写代码。
|
|
13
|
+
- 修改前先看 `README.md`、相关测试和对应 `.agents/skills/*/SKILL.md`。
|
|
14
|
+
|
|
15
|
+
## 工作重点
|
|
16
|
+
|
|
17
|
+
- 优先复用现有实现,不为未来假设提前抽象。
|
|
18
|
+
- 若项目启用 SvelteKit,记住 `+server.ts` 不能导出自定义 helper。
|
|
19
|
+
- 若项目启用 i18n,用户可见文本必须同步多语言文件。
|
|
20
|
+
|
|
21
|
+
## 完成前检查
|
|
22
|
+
|
|
23
|
+
- 按影响范围运行 `pnpm typecheck`、`pnpm lint`、`pnpm build`、`pnpm test`、`pnpm test:e2e`。
|
|
24
|
+
- 在最终回复里说明门禁结果、文档 / 测试同步情况与未完成项。
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# AGENTS.md
|
|
2
|
+
|
|
3
|
+
> 管理后台项目 AI 编程助手入口。优先结合 `README.md`、`.agents/skills/`、`src/routes/`、`src/lib/server/` 与 `messages/*` 工作。
|
|
4
|
+
|
|
5
|
+
## 行为契约
|
|
6
|
+
|
|
7
|
+
1. 每次响应第一行写:`规模: XS|S|M|L — <一句话意图>`。
|
|
8
|
+
2. 任务规模 ≥ M 时,先回顾相关路由、服务、测试、i18n 文案与 `.agents/skills/*/SKILL.md`。
|
|
9
|
+
3. 在写第一行新代码前,用 1 行回答 Q1-Q7 必要性自检。
|
|
10
|
+
4. 任务规模 ≥ M 时,说明将影响的页面、layout、API、认证流程、测试和文档。
|
|
11
|
+
|
|
12
|
+
## 必要性自检(M / L 任务必须输出)
|
|
13
|
+
|
|
14
|
+
- Q1:已有页面 / service / 模块 API 是否可复用?
|
|
15
|
+
- Q2:能否扩展现有 `src/lib/server/services`、`src/routes`、共享组件,而不是新建抽象?
|
|
16
|
+
- Q3:当前真实调用点是哪些页面、表单、API 或 guard?
|
|
17
|
+
- Q4:能否用更少的 route / load / helper / 组件解决?
|
|
18
|
+
- Q5:是否把 provider、DB 细节或中间态泄漏给页面层?
|
|
19
|
+
- Q6:是否与现有路由结构、i18n、权限模型和脚本一致?
|
|
20
|
+
- Q7:是否比较过更安全的鉴权、校验和数据处理方案?
|
|
21
|
+
|
|
22
|
+
## 影响分析(M / L 任务必须输出)
|
|
23
|
+
|
|
24
|
+
- 直接影响:哪些 `+page.svelte`、`+layout.svelte`、`+page.server.ts`、`+server.ts`、service、messages、README、测试会变。
|
|
25
|
+
- 间接影响:哪些角色权限、导航入口、共享组件、表单流程和依赖模块需要同步。
|
|
26
|
+
|
|
27
|
+
## 项目定位
|
|
28
|
+
|
|
29
|
+
本项目是 hai-framework 管理后台:SvelteKit 负责路由、页面、`hooks.server.ts` 和 API 端点;IAM、数据库、缓存等能力通过 `@h-ai/*` 模块初始化后使用。
|
|
30
|
+
|
|
31
|
+
## 架构边界
|
|
32
|
+
|
|
33
|
+
- 页面组件、layout、load 只负责渲染、权限态拼装和请求编排;业务逻辑放在 `src/lib/server/services` 或模块 API。
|
|
34
|
+
- 认证授权使用 `@h-ai/iam` / `@h-ai/kit`;Web token 优先 httpOnly cookie。
|
|
35
|
+
- 所有用户可见文本走 `$lib/paraglide/messages.js`,同步 `messages/zh-CN.json` 与 `messages/en-US.json`。
|
|
36
|
+
- API 边界必须做 Zod 校验,HaiResult 错误用 kit response 转换。
|
|
37
|
+
- `+server.ts` 只能导出 handler 和 SvelteKit 允许的配置项;helper 放到 `src/lib/server/**`。
|
|
38
|
+
- 本样板默认不使用 `@h-ai/serv`、`@h-ai/api-contract`、`@h-ai/api-client`、`@h-ai/capacitor` 作为主架构。
|
|
39
|
+
|
|
40
|
+
## 工作流程
|
|
41
|
+
|
|
42
|
+
1. 先搜索现有路由、service、共享组件、messages 和测试。
|
|
43
|
+
2. 变更权限、登录、会话、导航或 CRUD 页面时,优先扩展现有 service / component,而不是临时散落逻辑。
|
|
44
|
+
3. 修改页面、API、认证流程后,同步测试、README 和 i18n。
|
|
45
|
+
|
|
46
|
+
## 质量门禁
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
pnpm typecheck
|
|
50
|
+
pnpm lint
|
|
51
|
+
pnpm build
|
|
52
|
+
pnpm test
|
|
53
|
+
pnpm test:e2e
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## 完成条件
|
|
57
|
+
|
|
58
|
+
- 修改页面、API、认证流程时同步测试、README 和 i18n。
|
|
59
|
+
- 修改公共模块用法或共享组件时,全局检索并同步依赖方。
|
|
60
|
+
- 最终回复说明门禁状态、已更新页面 / API / 文档与未完成项。
|
|
61
|
+
|
|
62
|
+
## 优先 Skills
|
|
63
|
+
|
|
64
|
+
- `hai-build`、`hai-app-create`、`hai-app-review`、`hai-app-tests`
|
|
65
|
+
- `hai-kit`、`hai-ui`、`hai-iam`、`hai-reldb`、`hai-cache`、`hai-crypto`
|
|
66
|
+
- 其它 `hai-*` 模块按需读取
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# CLAUDE.md
|
|
2
|
+
|
|
3
|
+
@AGENTS.md
|
|
4
|
+
|
|
5
|
+
> Claude Code 管理后台项目指引。共享规范通过 `@AGENTS.md` 复用;具体模块用法按需读取 `.agents/skills/`。
|
|
6
|
+
|
|
7
|
+
如果当前运行环境未自动展开 `@AGENTS.md`,必须先手动阅读 `AGENTS.md`,再开始修改代码或文档。
|
|
8
|
+
|
|
9
|
+
## 开始工作前
|
|
10
|
+
|
|
11
|
+
- 回复第一行保持:`规模: XS|S|M|L — <一句话意图>`。
|
|
12
|
+
- 任务规模 ≥ M 时,先输出 Q1-Q7 必要性自检与影响分析。
|
|
13
|
+
- 修改前先看 `src/routes/`、`src/lib/server/`、`messages/*` 与相关测试。
|
|
14
|
+
|
|
15
|
+
## 管理后台特有提醒
|
|
16
|
+
|
|
17
|
+
- 页面层只做渲染与请求编排,不把业务逻辑塞进 `+page.svelte`。
|
|
18
|
+
- 鉴权、guard、response 优先复用 `@h-ai/kit` / `@h-ai/iam`。
|
|
19
|
+
- 所有用户可见文本都要同步 i18n。
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# GitHub Copilot 项目指令
|
|
2
|
+
|
|
3
|
+
> 管理后台工程指引。详细模块用法按需读取 `.agents/skills/`。
|
|
4
|
+
|
|
5
|
+
## 行为契约
|
|
6
|
+
|
|
7
|
+
- 每次响应第一行写:`规模: XS|S|M|L — <一句话意图>`。
|
|
8
|
+
- 任务规模 ≥ M 时,先输出 Q1-Q7 必要性自检与影响分析,再开始修改。
|
|
9
|
+
- 修改前先阅读 `AGENTS.md`、`README.md`、相关页面 / service / 测试与 `.agents/skills/*/SKILL.md`。
|
|
10
|
+
|
|
11
|
+
## 技术栈要点
|
|
12
|
+
|
|
13
|
+
- SvelteKit 2 + Svelte 5 Runes。
|
|
14
|
+
- `@h-ai/kit` 负责 SvelteKit handle、守卫、响应和校验。
|
|
15
|
+
- `@h-ai/iam` 负责登录、会话与 RBAC。
|
|
16
|
+
- UI 使用 TailwindCSS、DaisyUI 与 `@h-ai/ui`。
|
|
17
|
+
|
|
18
|
+
## 技术边界
|
|
19
|
+
|
|
20
|
+
- 页面 / layout / load 只做渲染、权限态和请求编排;业务逻辑放到 `src/lib/server/services` 或 `@h-ai/*` 模块。
|
|
21
|
+
- `+server.ts` 只能导出 handler 与官方允许的配置项;helper 放到 `src/lib/server/**`。
|
|
22
|
+
- 页面文本必须走 i18n。
|
|
23
|
+
- API 输入必须 Zod 校验,权限检查使用 kit guard。
|
|
24
|
+
- 公共模块 API 返回 `HaiResult<T>`,不要用 `try/catch` 包裹正常业务错误。
|
|
25
|
+
- 本样板默认不以 `@h-ai/serv` / `@h-ai/api-client` / `@h-ai/api-contract` 作为主架构。
|
|
26
|
+
|
|
27
|
+
## 开发流程
|
|
28
|
+
|
|
29
|
+
1. 先检索现有路由、service、共享组件、messages 和测试。
|
|
30
|
+
2. 修改认证、导航、CRUD、表单流程后,同步测试、README 和 i18n。
|
|
31
|
+
3. 不要把未运行或失败的门禁写成“已通过”。
|
|
32
|
+
|
|
33
|
+
## 质量门禁
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
pnpm typecheck
|
|
37
|
+
pnpm lint
|
|
38
|
+
pnpm build
|
|
39
|
+
pnpm test
|
|
40
|
+
pnpm test:e2e
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## 完成条件
|
|
44
|
+
|
|
45
|
+
- 页面、API、认证相关改动同步更新测试、README 和 i18n。
|
|
46
|
+
- 最终交付说明要列出门禁状态、已更新页面 / API / 文档与未完成项。
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# AGENTS.md
|
|
2
|
+
|
|
3
|
+
> API 服务项目 AI 编程助手入口。优先结合 `README.md`、`.agents/skills/`、`apps/*-contract/src/**`、`apps/*-service/src/**` 与测试工作。
|
|
4
|
+
|
|
5
|
+
## 行为契约
|
|
6
|
+
|
|
7
|
+
1. 每次响应第一行写:`规模: XS|S|M|L — <一句话意图>`。
|
|
8
|
+
2. 任务规模 ≥ M 时,先回顾现有 contract、service、配置、测试与 `.agents/skills/*/SKILL.md`。
|
|
9
|
+
3. 在写第一行新代码前,用 1 行回答 Q1-Q7 必要性自检。
|
|
10
|
+
4. 任务规模 ≥ M 时,说明将影响的 contract、procedures、配置、README 和调用方。
|
|
11
|
+
|
|
12
|
+
## 必要性自检(M / L 任务必须输出)
|
|
13
|
+
|
|
14
|
+
- Q1:已有 contract / procedure / module API 是否可复用?
|
|
15
|
+
- Q2:能否扩展现有 schema、config、procedure,而不是新增抽象层?
|
|
16
|
+
- Q3:当前真实调用点是哪些测试、客户端或 service 入口?
|
|
17
|
+
- Q4:能否用更少的 contract 节点、middleware 或配置解决?
|
|
18
|
+
- Q5:是否把 provider、DB 行结构或内部错误细节泄漏给调用方?
|
|
19
|
+
- Q6:是否与现有 workspace 目录结构、脚本和质量门禁一致?
|
|
20
|
+
- Q7:是否比较过更安全的输入校验、安全头和密钥处理方案?
|
|
21
|
+
|
|
22
|
+
## 影响分析(M / L 任务必须输出)
|
|
23
|
+
|
|
24
|
+
- 直接影响:哪些 `apps/*-contract`、`apps/*-service`、config、README、测试会变。
|
|
25
|
+
- 间接影响:哪些 typed client、部署脚本、环境变量说明和断言需要同步。
|
|
26
|
+
|
|
27
|
+
## 项目定位
|
|
28
|
+
|
|
29
|
+
本项目是 hai-framework API workspace:`apps/<project>-contract` 提供 typed contract,`apps/<project>-service` 提供 `@h-ai/serv` 实现,无 UI 页面和前端 i18n。
|
|
30
|
+
|
|
31
|
+
## 架构边界
|
|
32
|
+
|
|
33
|
+
- API 输入输出必须由 `apps/*-contract/src/**` 中的 Zod schema 与 contract 定义统一约束。
|
|
34
|
+
- Service 通过 `@h-ai/serv` + `@h-ai/api-contract` 装配 HTTP App;不要退回到 SvelteKit API routes 架构。
|
|
35
|
+
- Typed client / contract / service 三者保持同一份路径与类型定义,不要复制粘贴接口。
|
|
36
|
+
- 公共模块 API 返回 `HaiResult<T>`;业务错误不要直接 `throw`。
|
|
37
|
+
- 不生成用户页面;不要引入 UI 专属依赖或页面文案。
|
|
38
|
+
- 配置和密钥来自 `apps/*-service/config/` 与环境变量,禁止硬编码。
|
|
39
|
+
|
|
40
|
+
## 工作流程
|
|
41
|
+
|
|
42
|
+
1. 先搜索现有 contract、procedures、init、config 和测试。
|
|
43
|
+
2. 修改 contract、响应格式、安全策略或配置时,同步 README、typed client 调用方与测试。
|
|
44
|
+
3. 每次改动后运行质量门禁,不能留下“已知失败”。
|
|
45
|
+
|
|
46
|
+
## 质量门禁
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
pnpm typecheck
|
|
50
|
+
pnpm lint
|
|
51
|
+
pnpm build
|
|
52
|
+
pnpm test
|
|
53
|
+
pnpm test:e2e
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## 完成条件
|
|
57
|
+
|
|
58
|
+
- 修改 contract、procedure、配置或环境变量说明后,同步测试、README 和调用方。
|
|
59
|
+
- 最终回复说明门禁状态、已更新 contract / service / 配置 / 文档与未完成项。
|
|
60
|
+
|
|
61
|
+
## 优先 Skills
|
|
62
|
+
|
|
63
|
+
- `hai-build`、`hai-app-create`、`hai-app-review`、`hai-app-tests`
|
|
64
|
+
- `hai-serv`、`hai-api-contract`、`hai-api-client`
|
|
65
|
+
- `hai-core`、`hai-reldb`、`hai-cache`、`hai-iam`、`hai-crypto`
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# CLAUDE.md
|
|
2
|
+
|
|
3
|
+
@AGENTS.md
|
|
4
|
+
|
|
5
|
+
> Claude Code API 服务项目指引。共享规范通过 `@AGENTS.md` 复用;具体模块用法按需读取 `.agents/skills/`。
|
|
6
|
+
|
|
7
|
+
如果当前运行环境未自动展开 `@AGENTS.md`,必须先手动阅读 `AGENTS.md`,再开始修改代码或文档。
|
|
8
|
+
|
|
9
|
+
## 开始工作前
|
|
10
|
+
|
|
11
|
+
- 回复第一行保持:`规模: XS|S|M|L — <一句话意图>`。
|
|
12
|
+
- 任务规模 ≥ M 时,先输出 Q1-Q7 必要性自检与影响分析。
|
|
13
|
+
- 修改前先看 `src/routes/api/**`、`src/lib/server/**`、配置文件和测试。
|
|
14
|
+
|
|
15
|
+
## API 特有提醒
|
|
16
|
+
|
|
17
|
+
- `+server.ts` 只能导出 handler 与允许的配置项。
|
|
18
|
+
- 输入校验、安全头、环境变量说明和错误响应要一起维护。
|
|
19
|
+
- 不要把 UI 页面、营销文案或客户端状态管理带进 API 项目。
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# GitHub Copilot 项目指令
|
|
2
|
+
|
|
3
|
+
> API 服务工程指引。详细模块用法按需读取 `.agents/skills/`。
|
|
4
|
+
|
|
5
|
+
## 行为契约
|
|
6
|
+
|
|
7
|
+
- 每次响应第一行写:`规模: XS|S|M|L — <一句话意图>`。
|
|
8
|
+
- 任务规模 ≥ M 时,先输出 Q1-Q7 必要性自检与影响分析,再开始修改。
|
|
9
|
+
- 修改前先阅读 `AGENTS.md`、`README.md`、相关 route / config / 测试与 `.agents/skills/*/SKILL.md`。
|
|
10
|
+
|
|
11
|
+
## 技术栈要点
|
|
12
|
+
|
|
13
|
+
- `apps/*-contract` 维护 typed API contract、Zod schema 与共享类型。
|
|
14
|
+
- `apps/*-service` 基于 `@h-ai/serv` 装配 HTTP App、procedures 与模块初始化。
|
|
15
|
+
- `@h-ai/core` 提供配置、日志、i18n 与 HaiResult 基础能力。
|
|
16
|
+
- `@h-ai/api-client` 负责 typed client 调用与测试接入。
|
|
17
|
+
|
|
18
|
+
## 技术边界
|
|
19
|
+
|
|
20
|
+
- API 输入必须 Zod 校验。
|
|
21
|
+
- contract / service / typed client 必须共用同一份 contract 定义,不要复制路径或类型。
|
|
22
|
+
- 响应统一使用 HaiResult 约定,业务错误按 HaiResult 透传。
|
|
23
|
+
- 后端主架构使用 `@h-ai/serv` + `@h-ai/api-contract` + `@h-ai/api-client`,不要退回到 SvelteKit API routes。
|
|
24
|
+
- 禁止 UI 页面样板、`any`、`console.log`、硬编码密钥。
|
|
25
|
+
- 配置文件位于 `apps/*-service/config/`,service 入口与 procedures 位于 `apps/*-service/src/`。
|
|
26
|
+
|
|
27
|
+
## 开发流程
|
|
28
|
+
|
|
29
|
+
1. 先检索现有 contract、procedures、config 和测试。
|
|
30
|
+
2. 修改响应格式、安全头、错误码或环境变量说明时,同步 README、测试和调用方。
|
|
31
|
+
3. 不要把未运行或失败的门禁写成“已通过”。
|
|
32
|
+
|
|
33
|
+
## 质量门禁
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
pnpm typecheck
|
|
37
|
+
pnpm lint
|
|
38
|
+
pnpm build
|
|
39
|
+
pnpm test
|
|
40
|
+
pnpm test:e2e
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## 完成条件
|
|
44
|
+
|
|
45
|
+
- API、配置和测试同步更新。
|
|
46
|
+
- 交付说明中列出门禁状态、受影响 route / 配置 / 文档与未完成项。
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
# AGENTS.md
|
|
2
|
+
|
|
3
|
+
> Fullstack 多包工程 AI 编程助手入口。优先结合 `README.md`、`.agents/skills/`、根工作区脚本、`packages/*`、`apps/*` 与 e2e 工作。
|
|
4
|
+
|
|
5
|
+
## 行为契约
|
|
6
|
+
|
|
7
|
+
1. 每次响应第一行写:`规模: XS|S|M|L — <一句话意图>`。
|
|
8
|
+
2. 任务规模 ≥ M 时,先回顾相关 package、app、workspace 脚本、测试与 `.agents/skills/*/SKILL.md`。
|
|
9
|
+
3. 在写第一行新代码前,用 1 行回答 Q1-Q7 必要性自检。
|
|
10
|
+
4. 任务规模 ≥ M 时,说明将影响的 contract、serv、shared、各前端、测试、README 和发布脚本。
|
|
11
|
+
|
|
12
|
+
## 必要性自检(M / L 任务必须输出)
|
|
13
|
+
|
|
14
|
+
- Q1:已有 contract、procedure、shared client、跨端组件或脚本是否可复用?
|
|
15
|
+
- Q2:能否扩展现有 `packages/*` / `apps/*`,而不是新建重复 package、adapter 或 wrapper?
|
|
16
|
+
- Q3:当前真实调用点是哪些 package、app、页面或部署流程?
|
|
17
|
+
- Q4:能否用更少的 workspace package、导出层或前端改动解决?
|
|
18
|
+
- Q5:是否把服务端实现、数据库细节或原生桥接泄漏给调用方?
|
|
19
|
+
- Q6:是否与现有 workspace 结构、脚本、契约与 i18n 分工一致?
|
|
20
|
+
- Q7:是否比较过更高效或更安全的跨端协作方式?
|
|
21
|
+
|
|
22
|
+
## 影响分析(M / L 任务必须输出)
|
|
23
|
+
|
|
24
|
+
- 直接影响:哪些 `packages/<project>-contract`、`packages/<project>-serv`、`packages/<project>-shared`、`apps/<project>-*`、README、测试、打包脚本会变。
|
|
25
|
+
- 间接影响:哪些 workspace 依赖、typed client、Capacitor/Tauri 配置、i18n 编译和 e2e 需要同步。
|
|
26
|
+
|
|
27
|
+
## 项目概述
|
|
28
|
+
|
|
29
|
+
本项目是 hai-framework fullstack 工作区:
|
|
30
|
+
|
|
31
|
+
- `packages/<project>-contract`:前后端共享 API contract、Zod schema 与类型。
|
|
32
|
+
- `packages/<project>-serv`:后端服务,使用 `@h-ai/serv` 实现业务 API。
|
|
33
|
+
- `packages/<project>-shared`:跨端共享 UI Shell、主题、语言切换和 typed API client。
|
|
34
|
+
- `apps/<project>-web`:Svelte 5 + Vite Web 前端。
|
|
35
|
+
- `apps/<project>-app`:Svelte 5 + Vite + Capacitor 移动端 SPA。
|
|
36
|
+
- `apps/<project>-desktop`:Svelte 5 + Vite + Tauri v2 桌面端。
|
|
37
|
+
|
|
38
|
+
前端只做 UI 与请求编排;后端业务逻辑放在 `packages/<project>-serv`,不要写进前端组件。
|
|
39
|
+
|
|
40
|
+
## 架构边界
|
|
41
|
+
|
|
42
|
+
- Contract、serv、shared、各端页面必须同步演进。
|
|
43
|
+
- 公共 API 返回 `HaiResult<T>`,错误直接透传,不重新包装。
|
|
44
|
+
- 用户可见文本走 i18n:shared 放跨端文案,各 app 放本端文案。
|
|
45
|
+
- 移动端 token 使用 Capacitor 安全存储;Web 使用 httpOnly cookie;桌面端按 Tauri 安全边界配置。
|
|
46
|
+
- Web / App / Desktop 前端不承载后端业务逻辑;服务端逻辑统一放在 `packages/<project>-serv`。
|
|
47
|
+
- 共享 UI、typed API client、主题与语言切换放在 `packages/<project>-shared`。
|
|
48
|
+
- 本样板默认不使用 `@h-ai/kit`;不要把 fullstack 后端逻辑写回 SvelteKit 式 `load` / route 模式。
|
|
49
|
+
|
|
50
|
+
## 工作流程
|
|
51
|
+
|
|
52
|
+
1. 先搜索相关 package、app、workspace 脚本、测试和 README。
|
|
53
|
+
2. 修改 contract / serv / shared 后,全局检索并同步所有 `packages/*` 和 `apps/*`。
|
|
54
|
+
3. 修改 Web / App / Desktop 页面时,同步对应 README、messages 和测试。
|
|
55
|
+
4. 涉及发布或原生壳时,同时检查根脚本、Capacitor/Tauri 配置与 e2e。
|
|
56
|
+
|
|
57
|
+
## 质量门禁
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
pnpm typecheck
|
|
61
|
+
pnpm lint
|
|
62
|
+
pnpm build
|
|
63
|
+
pnpm test
|
|
64
|
+
pnpm test:e2e
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
涉及发布时还要运行:
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
pnpm compile
|
|
71
|
+
pnpm package
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
## 完成条件
|
|
75
|
+
|
|
76
|
+
- 修改 contract / serv / shared 后,全局检索并同步所有 `packages/*` 和 `apps/*`。
|
|
77
|
+
- 修改 Web/App/Desktop 页面时,同步对应 README、messages 和测试。
|
|
78
|
+
- 最终回复说明门禁状态、未执行项原因、已同步文档和依赖方。
|
|
79
|
+
|
|
80
|
+
## 优先 Skills
|
|
81
|
+
|
|
82
|
+
- `hai-build`、`hai-app-review`、`hai-app-tests`
|
|
83
|
+
- `hai-core`、`hai-ui`、`hai-serv`、`hai-api-contract`、`hai-api-client`、`hai-capacitor`
|
|
84
|
+
- 其它 `hai-*` 模块按需读取
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# CLAUDE.md
|
|
2
|
+
|
|
3
|
+
@AGENTS.md
|
|
4
|
+
|
|
5
|
+
> Claude Code fullstack 项目指引。共享规范通过 `@AGENTS.md` 复用;contract、serv、shared、Web/App/Desktop 的详细做法按需读取 `.agents/skills/`。
|
|
6
|
+
|
|
7
|
+
如果当前运行环境未自动展开 `@AGENTS.md`,必须先手动阅读 `AGENTS.md`,再开始修改代码或文档。
|
|
8
|
+
|
|
9
|
+
## 开始工作前
|
|
10
|
+
|
|
11
|
+
- 回复第一行保持:`规模: XS|S|M|L — <一句话意图>`。
|
|
12
|
+
- 任务规模 ≥ M 时,先输出 Q1-Q7 必要性自检与影响分析。
|
|
13
|
+
- 修改前先看相关 `packages/*`、`apps/*`、workspace 脚本、messages 和测试。
|
|
14
|
+
|
|
15
|
+
## Fullstack 特有提醒
|
|
16
|
+
|
|
17
|
+
- `packages/<project>-serv` 才是后端业务逻辑主场,不要把逻辑写进前端组件。
|
|
18
|
+
- contract、shared client、各端页面改动必须成套同步。
|
|
19
|
+
- App/Desktop 还要关注 Capacitor / Tauri 的原生壳配置与打包脚本。
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# GitHub Copilot 项目指令
|
|
2
|
+
|
|
3
|
+
> Fullstack 工程指引。详细模块用法按需读取 `.agents/skills/`。
|
|
4
|
+
|
|
5
|
+
## 行为契约
|
|
6
|
+
|
|
7
|
+
- 每次响应第一行写:`规模: XS|S|M|L — <一句话意图>`。
|
|
8
|
+
- 任务规模 ≥ M 时,先输出 Q1-Q7 必要性自检与影响分析,再开始修改。
|
|
9
|
+
- 修改前先阅读 `AGENTS.md`、`README.md`、相关 `packages/*` / `apps/*` / 测试与 `.agents/skills/*/SKILL.md`。
|
|
10
|
+
|
|
11
|
+
## 技术栈要点
|
|
12
|
+
|
|
13
|
+
- Contract:`packages/<project>-contract` 定义 API contract、schema 与共享类型。
|
|
14
|
+
- Fullstack 服务端:`packages/<project>-serv` 使用 `@h-ai/serv` 实现业务 API。
|
|
15
|
+
- Shared:`packages/<project>-shared` 放跨端 Shell、i18n、主题和 typed API client。
|
|
16
|
+
- Web:Svelte 5 + Vite 前端。
|
|
17
|
+
- App:Svelte 5 + Vite + Capacitor 原生壳。
|
|
18
|
+
- Desktop:Svelte 5 + Vite + Tauri v2 纯客户端壳。
|
|
19
|
+
|
|
20
|
+
不要把后端业务逻辑写进 Svelte 前端组件。
|
|
21
|
+
|
|
22
|
+
## 技术边界
|
|
23
|
+
|
|
24
|
+
- 公共 API 返回 `HaiResult<T>`;业务错误不要直接 `throw`。
|
|
25
|
+
- Contract、serv procedure、shared client 与各端调用方必须一起更新。
|
|
26
|
+
- 用户可见文本走 i18n,shared 与各端 messages 分工清晰。
|
|
27
|
+
- Web/App/Desktop 前端只做 UI 与请求编排;后端逻辑放在 Fullstack 服务端。
|
|
28
|
+
- 禁止 `any`、`console.log`、硬编码密钥。
|
|
29
|
+
- 代码注释中文,日志消息英文。
|
|
30
|
+
|
|
31
|
+
## 开发流程
|
|
32
|
+
|
|
33
|
+
1. 先检索相关 package、app、workspace 脚本、messages 和测试。
|
|
34
|
+
2. 修改公共契约后,全局检索并更新所有受影响的 `packages/*`、`apps/*` 和 CLI 模板。
|
|
35
|
+
3. 修改 App / Desktop 时,同时检查 Capacitor / Tauri v2 原生壳配置与打包脚本。
|
|
36
|
+
4. 不要把未运行或失败的门禁写成“已通过”。
|
|
37
|
+
|
|
38
|
+
## 质量门禁
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
pnpm typecheck
|
|
42
|
+
pnpm lint
|
|
43
|
+
pnpm build
|
|
44
|
+
pnpm test
|
|
45
|
+
pnpm test:e2e
|
|
46
|
+
pnpm compile
|
|
47
|
+
pnpm package
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## 完成条件
|
|
51
|
+
|
|
52
|
+
- README、`.agents/skills/**/SKILL.md`、i18n、测试与实现同步。
|
|
53
|
+
- 修改公共契约后,全局检索并更新所有受影响的 `packages/*`、`apps/*` 和 CLI 模板。
|
|
54
|
+
- 交付说明中列出门禁状态、受影响 package/app 与未完成项。
|