@h-ai/cli 0.1.0-alpha.56 → 0.1.0-alpha.57

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.
Files changed (69) hide show
  1. package/README.en.md +205 -0
  2. package/README.ja.md +205 -0
  3. package/README.md +16 -0
  4. package/dist/chunk-MJGUBOAV.js +391 -0
  5. package/dist/chunk-MJGUBOAV.js.map +1 -0
  6. package/dist/{cli-skill-templates-ZIWYMS4Y.js → cli-skill-templates-ZYXES3NT.js} +3 -3
  7. package/dist/{cli-skill-templates-ZIWYMS4Y.js.map → cli-skill-templates-ZYXES3NT.js.map} +1 -1
  8. package/dist/index.js +32 -69
  9. package/dist/index.js.map +1 -1
  10. package/package.json +7 -7
  11. package/templates/apps/api/.gitignore.hbs +13 -0
  12. package/templates/apps/api/.npmrc.hbs +2 -0
  13. package/templates/apps/api/e2e/api-service.spec.ts.hbs +1 -1
  14. package/templates/apps/api/{eslint.config.js → eslint.config.js.hbs} +6 -8
  15. package/templates/apps/api/package.json.hbs +1 -1
  16. package/templates/apps/fullstack/.gitignore.hbs +16 -0
  17. package/templates/apps/fullstack/.npmrc.hbs +2 -0
  18. package/templates/apps/fullstack/apps/{{projectName}}-app/eslint.config.js.hbs +5 -8
  19. package/templates/apps/fullstack/apps/{{projectName}}-desktop/eslint.config.js.hbs +5 -8
  20. package/templates/apps/fullstack/apps/{{projectName}}-web/eslint.config.js.hbs +5 -8
  21. package/templates/apps/fullstack/e2e/fullstack.spec.ts.hbs +1 -1
  22. package/templates/apps/fullstack/{eslint.config.js → eslint.config.js.hbs} +6 -8
  23. package/templates/apps/fullstack/package.json.hbs +1 -1
  24. package/templates/base/.npmrc.hbs +15 -0
  25. package/templates/base/eslint-rules.js +45 -0
  26. package/templates/base/eslint.config.js.hbs +6 -8
  27. package/templates/base/package.json.hbs +1 -1
  28. package/templates/skills/AGENTS.md +9 -8
  29. package/templates/skills/CLAUDE.md +4 -0
  30. package/templates/skills/bridges/admin/AGENTS.md +8 -0
  31. package/templates/skills/bridges/admin/CLAUDE.md +4 -0
  32. package/templates/skills/bridges/admin/copilot-instructions.md +2 -0
  33. package/templates/skills/bridges/api/AGENTS.md +8 -1
  34. package/templates/skills/bridges/api/CLAUDE.md +4 -0
  35. package/templates/skills/bridges/api/copilot-instructions.md +2 -0
  36. package/templates/skills/bridges/fullstack/AGENTS.md.hbs +8 -2
  37. package/templates/skills/bridges/fullstack/CLAUDE.md.hbs +4 -0
  38. package/templates/skills/bridges/fullstack/copilot-instructions.md.hbs +2 -0
  39. package/templates/skills/bridges/h5/AGENTS.md +8 -0
  40. package/templates/skills/bridges/h5/CLAUDE.md +4 -0
  41. package/templates/skills/bridges/h5/copilot-instructions.md +2 -0
  42. package/templates/skills/bridges/mobile-app/AGENTS.md +8 -0
  43. package/templates/skills/bridges/mobile-app/CLAUDE.md +4 -0
  44. package/templates/skills/bridges/mobile-app/copilot-instructions.md +2 -0
  45. package/templates/skills/bridges/website/AGENTS.md +8 -0
  46. package/templates/skills/bridges/website/CLAUDE.md +4 -0
  47. package/templates/skills/bridges/website/copilot-instructions.md +2 -0
  48. package/templates/skills/claude-skill.md.hbs +7 -0
  49. package/templates/skills/copilot-instructions.md +2 -0
  50. package/templates/skills/hai-api-client/SKILL.md +2 -0
  51. package/templates/skills/hai-app-create/SKILL.md +9 -7
  52. package/templates/skills/hai-app-create/development.md +66 -0
  53. package/templates/skills/hai-app-create/reference.md +44 -32
  54. package/templates/skills/hai-app-review/SKILL.md +50 -144
  55. package/templates/skills/hai-app-tests/SKILL.md +3 -1
  56. package/templates/skills/hai-app-tests/reference.md +47 -27
  57. package/templates/skills/hai-build/SKILL.md +5 -4
  58. package/templates/skills/hai-build/reference.md +52 -32
  59. package/templates/skills/hai-ci/SKILL.md +8 -15
  60. package/templates/skills/hai-framework-sync/SKILL.md +8 -1
  61. package/templates/skills/hai-pr-review/SKILL.md +5 -4
  62. package/templates/skills/hai-reldb/SKILL.md +1 -0
  63. package/templates/skills/hai-reldb/reference.md +3 -0
  64. package/templates/skills/hai-scheduler/SKILL.md +3 -0
  65. package/templates/skills/hai-serv/SKILL.md +1 -0
  66. package/templates/skills/hai-serv/reference.md +16 -2
  67. package/templates/skills/hai-storage/SKILL.md +3 -1
  68. package/dist/chunk-WUYLYCW2.js +0 -237
  69. package/dist/chunk-WUYLYCW2.js.map +0 -1
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@h-ai/cli",
3
3
  "type": "module",
4
- "version": "0.1.0-alpha.56",
4
+ "version": "0.1.0-alpha.57",
5
5
  "description": "Hai Framework CLI for project scaffolding and code generation.",
6
6
  "license": "Apache-2.0",
7
7
  "keywords": [
@@ -37,7 +37,7 @@
37
37
  "ora": "^9.1.0",
38
38
  "prompts": "^2.4.2",
39
39
  "yaml": "^2.7.0",
40
- "@h-ai/core": "0.1.0-alpha.56"
40
+ "@h-ai/core": "0.1.0-alpha.57"
41
41
  },
42
42
  "devDependencies": {
43
43
  "@types/fs-extra": "^11.0.4",
@@ -47,11 +47,11 @@
47
47
  "tsup": "^8.5.1",
48
48
  "typescript": "^6.0.3",
49
49
  "vitest": "^4.1.7",
50
- "@h-ai/cache": "0.1.0-alpha.56",
51
- "@h-ai/deploy": "0.1.0-alpha.56",
52
- "@h-ai/reach": "0.1.0-alpha.56",
53
- "@h-ai/reldb": "0.1.0-alpha.56",
54
- "@h-ai/storage": "0.1.0-alpha.56"
50
+ "@h-ai/cache": "0.1.0-alpha.57",
51
+ "@h-ai/reldb": "0.1.0-alpha.57",
52
+ "@h-ai/deploy": "0.1.0-alpha.57",
53
+ "@h-ai/reach": "0.1.0-alpha.57",
54
+ "@h-ai/storage": "0.1.0-alpha.57"
55
55
  },
56
56
  "scripts": {
57
57
  "build": "tsup",
@@ -0,0 +1,13 @@
1
+ node_modules
2
+ .turbo
3
+ dist
4
+ build
5
+ playwright-report
6
+ test-results
7
+ .env
8
+ .env.*
9
+ !.env.example
10
+ !.env.example.hbs
11
+
12
+ # hai deploy 产物(compose / .env.runtime / 镜像 tar / sidecar 凭据)
13
+ .hai/
@@ -0,0 +1,2 @@
1
+ node-linker=hoisted
2
+ shamefully-hoist=true
@@ -1,5 +1,5 @@
1
- import { expect, test } from '@playwright/test'
2
1
  import { apiContract } from '@h-ai/api-contract'
2
+ import { expect, test } from '@playwright/test'
3
3
  import { {{api.contractExportName}} } from '{{api.contractPackageName}}'
4
4
 
5
5
  const API_PREFIX = '/api/v1'
@@ -1,11 +1,15 @@
1
- import antfu from '@antfu/eslint-config'
1
+ import antfu, { GLOB_SRC } from '@antfu/eslint-config'
2
+ import { haiQualityConfig } from './eslint-rules.js'
2
3
 
3
4
  export default antfu({
5
+ // unused-imports 使用 TS 规则,JS 同样使用 TS parser 以保持 scope 契约一致。
6
+ typescript: { files: [GLOB_SRC] },
4
7
  formatters: true,
5
8
  ignores: [
6
9
  '**/dist/**',
7
10
  '**/node_modules/**',
8
11
  '**/.agents/**',
12
+ '**/.claude/**',
9
13
  '**/.github/**',
10
14
  '**/AGENTS.md',
11
15
  '**/CLAUDE.md',
@@ -13,13 +17,7 @@ export default antfu({
13
17
  '**/opencode.json',
14
18
  '**/package.json',
15
19
  ],
16
- }, {
17
- files: ['**/*.js', '**/*.mjs', '**/*.ts'],
18
- rules: {
19
- 'no-console': 'error',
20
- 'ts/no-explicit-any': 'error',
21
- },
22
- }, {
20
+ }, haiQualityConfig, {
23
21
  files: ['**/tsconfig.json', '**/tsconfig.*.json'],
24
22
  rules: {
25
23
  'jsonc/sort-keys': 'off',
@@ -15,7 +15,7 @@
15
15
  "podman:build": "podman build --format docker --jobs=1 --target runtime -t {{projectName}}:latest .",
16
16
  "podman:build:data": "podman build --format docker --jobs=1 --target runtime-with-data --build-context embedded-data=./apps/{{projectName}}-service/data -t {{projectName}}:latest .",
17
17
  "typecheck": "pnpm --filter {{api.contractPackageName}} build && pnpm -r --if-present typecheck",
18
- "lint": "pnpm -r --if-present lint",
18
+ "lint": "eslint *.js *.ts e2e && pnpm -r --if-present lint",
19
19
  "test": "pnpm --filter {{api.contractPackageName}} build && pnpm -r --if-present test",
20
20
  "test:e2e": "pnpm build && playwright test",
21
21
  "clean": "pnpm -r --if-present clean && rimraf node_modules .turbo"
@@ -0,0 +1,16 @@
1
+ node_modules
2
+ .turbo
3
+ dist
4
+ build
5
+ **/src/lib/paraglide
6
+ playwright-report
7
+ test-results
8
+ .env
9
+ .env.*
10
+ !.env.example
11
+ !.env.example.hbs
12
+ **/src-tauri/gen/
13
+ **/src-tauri/target/
14
+
15
+ # hai deploy 产物(compose / .env.runtime / 镜像 tar / sidecar 凭据)
16
+ .hai/
@@ -0,0 +1,2 @@
1
+ node-linker=hoisted
2
+ shamefully-hoist=true
@@ -1,18 +1,15 @@
1
1
  {{! @skipIfEmpty }}
2
2
  {{#if fullstack.frontends.app}}
3
- import antfu from '@antfu/eslint-config'
3
+ import antfu, { GLOB_SRC } from '@antfu/eslint-config'
4
+ import { haiQualityConfig } from '../../eslint-rules.js'
4
5
 
5
6
  export default antfu({
7
+ // unused-imports 使用 TS 规则,JS 同样使用 TS parser 以保持 scope 契约一致。
8
+ typescript: { files: [GLOB_SRC] },
6
9
  formatters: true,
7
10
  ignores: ['**/build/**', '**/dist/**', '**/*.d.ts', '**/project.inlang/**', '**/src/lib/paraglide/**'],
8
11
  svelte: true,
9
- }, {
10
- files: ['**/*.ts', '**/*.svelte'],
11
- rules: {
12
- 'no-console': 'error',
13
- 'ts/no-explicit-any': 'error',
14
- },
15
- }, {
12
+ }, haiQualityConfig, {
16
13
  files: ['**/*.svelte'],
17
14
  rules: {
18
15
  'svelte/html-quotes': 'off',
@@ -1,18 +1,15 @@
1
1
  {{! @skipIfEmpty }}
2
2
  {{#if fullstack.frontends.desktop}}
3
- import antfu from '@antfu/eslint-config'
3
+ import antfu, { GLOB_SRC } from '@antfu/eslint-config'
4
+ import { haiQualityConfig } from '../../eslint-rules.js'
4
5
 
5
6
  export default antfu({
7
+ // unused-imports 使用 TS 规则,JS 同样使用 TS parser 以保持 scope 契约一致。
8
+ typescript: { files: [GLOB_SRC] },
6
9
  formatters: true,
7
10
  ignores: ['**/build/**', '**/dist/**', '**/*.d.ts', '**/project.inlang/**', '**/src/lib/paraglide/**'],
8
11
  svelte: true,
9
- }, {
10
- files: ['**/*.ts', '**/*.svelte'],
11
- rules: {
12
- 'no-console': 'error',
13
- 'ts/no-explicit-any': 'error',
14
- },
15
- }, {
12
+ }, haiQualityConfig, {
16
13
  files: ['**/*.svelte'],
17
14
  rules: {
18
15
  'svelte/html-quotes': 'off',
@@ -1,18 +1,15 @@
1
1
  {{! @skipIfEmpty }}
2
2
  {{#if fullstack.frontends.web}}
3
- import antfu from '@antfu/eslint-config'
3
+ import antfu, { GLOB_SRC } from '@antfu/eslint-config'
4
+ import { haiQualityConfig } from '../../eslint-rules.js'
4
5
 
5
6
  export default antfu({
7
+ // unused-imports 使用 TS 规则,JS 同样使用 TS parser 以保持 scope 契约一致。
8
+ typescript: { files: [GLOB_SRC] },
6
9
  formatters: true,
7
10
  ignores: ['**/build/**', '**/dist/**', '**/*.d.ts', '**/project.inlang/**', '**/src/lib/paraglide/**'],
8
11
  svelte: true,
9
- }, {
10
- files: ['**/*.ts', '**/*.svelte'],
11
- rules: {
12
- 'no-console': 'error',
13
- 'ts/no-explicit-any': 'error',
14
- },
15
- }, {
12
+ }, haiQualityConfig, {
16
13
  files: ['**/*.svelte'],
17
14
  rules: {
18
15
  'svelte/html-quotes': 'off',
@@ -1,5 +1,5 @@
1
- import { expect, test } from '@playwright/test'
2
1
  import { apiContract } from '@h-ai/api-contract'
2
+ import { expect, test } from '@playwright/test'
3
3
  import { {{fullstack.contractExportName}} } from '{{fullstack.contractPackageName}}'
4
4
 
5
5
  const DEFAULT_SERVICE_BASE_URL = 'http://127.0.0.1:3000'
@@ -1,6 +1,9 @@
1
- import antfu from '@antfu/eslint-config'
1
+ import antfu, { GLOB_SRC } from '@antfu/eslint-config'
2
+ import { haiQualityConfig } from './eslint-rules.js'
2
3
 
3
4
  export default antfu({
5
+ // unused-imports 使用 TS 规则,JS 同样使用 TS parser 以保持 scope 契约一致。
6
+ typescript: { files: [GLOB_SRC] },
4
7
  formatters: true,
5
8
  ignores: [
6
9
  '**/build/**',
@@ -9,6 +12,7 @@ export default antfu({
9
12
  '**/project.inlang/**',
10
13
  '**/*.d.ts',
11
14
  '**/.agents/**',
15
+ '**/.claude/**',
12
16
  '**/.github/**',
13
17
  '**/AGENTS.md',
14
18
  '**/CLAUDE.md',
@@ -17,13 +21,7 @@ export default antfu({
17
21
  '**/package.json',
18
22
  ],
19
23
  svelte: true,
20
- }, {
21
- files: ['**/*.ts', '**/*.svelte'],
22
- rules: {
23
- 'no-console': 'error',
24
- 'ts/no-explicit-any': 'error',
25
- },
26
- }, {
24
+ }, haiQualityConfig, {
27
25
  files: ['**/*.svelte'],
28
26
  rules: {
29
27
  'svelte/html-quotes': 'off',
@@ -21,7 +21,7 @@
21
21
  "package": "pnpm build{{#if fullstack.frontends.web}} && pnpm --filter {{projectName}}-web package{{/if}}{{#if fullstack.frontends.app}} && pnpm --filter {{projectName}}-app package{{/if}}{{#if fullstack.frontends.desktop}} && pnpm --filter {{projectName}}-desktop package{{/if}}",
22
22
  "deploy": "pnpm package",
23
23
  "typecheck": "pnpm --filter {{fullstack.contractPackageName}} build && pnpm i18n:compile && pnpm -r --if-present typecheck",
24
- "lint": "pnpm -r --if-present lint",
24
+ "lint": "eslint *.js *.ts e2e && pnpm -r --if-present lint",
25
25
  "test": "pnpm --filter {{fullstack.contractPackageName}} build && pnpm i18n:compile && pnpm -r --if-present test",
26
26
  "test:e2e": "pnpm build && playwright test",
27
27
  "clean": "pnpm -r --if-present clean && rimraf node_modules .turbo"
@@ -0,0 +1,15 @@
1
+ # =============================================================================
2
+ # pnpm configuration
3
+ # =============================================================================
4
+
5
+ # Hoist all packages to node_modules root (required for native addons like better-sqlite3)
6
+ shamefully-hoist=true
7
+
8
+ # Use hoisted node_modules layout instead of pnpm's default symlink isolation
9
+ node-linker=hoisted
10
+
11
+ # Do not fail on peer dependency conflicts
12
+ strict-peer-dependencies=false
13
+
14
+ # Automatically install missing peer dependencies
15
+ auto-install-peers=true
@@ -0,0 +1,45 @@
1
+ /**
2
+ * 应用共享质量门禁。依赖 Antfu 已注册的 TypeScript / ESLint comments 插件。
3
+ * 必要第三方 workaround 使用单行 eslint-disable-next-line <规则> -- 具体原因,
4
+ * 不关闭整个文件的检查。秘密泄漏、输入/权限校验仍需结合业务审查。
5
+ */
6
+ export const haiQualityConfig = {
7
+ files: ['**/*.{js,mjs,cjs,ts,tsx,svelte}'],
8
+ linterOptions: {
9
+ reportUnusedDisableDirectives: 'error',
10
+ },
11
+ rules: {
12
+ 'no-console': ['error', {}],
13
+ 'ts/no-explicit-any': 'error',
14
+ 'ts/ban-ts-comment': ['error', {
15
+ 'ts-ignore': true,
16
+ 'ts-nocheck': true,
17
+ 'ts-check': false,
18
+ 'ts-expect-error': 'allow-with-description',
19
+ 'minimumDescriptionLength': 10,
20
+ }],
21
+ 'eslint-comments/no-unlimited-disable': 'error',
22
+ 'eslint-comments/require-description': 'error',
23
+ // 只禁内部源码/构建目录,公开的 /client、/adapter 等 exports 子路径可用。
24
+ 'no-restricted-imports': ['error', {
25
+ patterns: [{
26
+ group: ['@h-ai/*/src', '@h-ai/*/src/**', '@h-ai/*/dist', '@h-ai/*/dist/**'],
27
+ message: 'Use the public exports of hai packages instead of their src/dist internals.',
28
+ }],
29
+ }],
30
+ 'no-restricted-syntax': ['error', {
31
+ selector: ':matches(TSAsExpression, TSTypeAssertion)[expression.typeAnnotation.type="TSUnknownKeyword"]',
32
+ message: 'Use the real upstream type or narrow unknown. Explain necessary third-party workarounds with a scoped lint exception.',
33
+ }, {
34
+ selector: 'ImportExpression[source.value=/^@h-ai\\/[^/]+\\/(src|dist)(\\/|$)/]',
35
+ message: 'Use the public exports of hai packages instead of their src/dist internals.',
36
+ }, {
37
+ // 仅识别明确的静态敏感键;变量键、别名及业务敏感程度仍需审查。
38
+ selector: 'CallExpression[callee.property.name="setItem"][callee.object.name="localStorage"][arguments.0.value=/^(token|password|secret|api[_-]?key|(access|refresh|auth|session)[_-]?token)$/i]',
39
+ message: 'Keep sensitive tokens in memory, httpOnly cookies or a secure native TokenStore instead of localStorage.',
40
+ }, {
41
+ selector: 'CallExpression[callee.property.name="setItem"][callee.object.property.name="localStorage"][arguments.0.value=/^(token|password|secret|api[_-]?key|(access|refresh|auth|session)[_-]?token)$/i]',
42
+ message: 'Keep sensitive tokens in memory, httpOnly cookies or a secure native TokenStore instead of localStorage.',
43
+ }],
44
+ },
45
+ }
@@ -4,9 +4,12 @@
4
4
  * @see https://github.com/antfu/eslint-config
5
5
  */
6
6
 
7
- import antfu from '@antfu/eslint-config'
7
+ import antfu, { GLOB_SRC } from '@antfu/eslint-config'
8
+ import { haiQualityConfig } from './eslint-rules.js'
8
9
 
9
10
  export default antfu({
11
+ // unused-imports 使用 TS 规则,JS 同样使用 TS parser 以保持 scope 契约一致。
12
+ typescript: { files: [GLOB_SRC] },
10
13
  formatters: true,
11
14
  ignores: [
12
15
  {{#unless isSvelteOnlyApp}}
@@ -18,6 +21,7 @@ export default antfu({
18
21
  '**/project.inlang/**',
19
22
  '**/paraglide/**',
20
23
  '**/.agents/**',
24
+ '**/.claude/**',
21
25
  '**/.github/**',
22
26
  '**/AGENTS.md',
23
27
  '**/CLAUDE.md',
@@ -27,10 +31,4 @@ export default antfu({
27
31
  '**/pnpm-workspace.yaml',
28
32
  ],
29
33
  svelte: true,
30
- }, {
31
- files: ['**/*.ts', '**/*.svelte'],
32
- rules: {
33
- 'no-console': 'error',
34
- 'ts/no-explicit-any': 'error',
35
- },
36
- })
34
+ }, haiQualityConfig)
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "engines": { "node": ">=22.12.0" },
3
3
  "name": "{{projectName}}",
4
- "version": "0.1.0-alpha.56",
4
+ "version": "0.1.0-alpha.57",
5
5
  "private": true,
6
6
  "packageManager": "pnpm@9.15.0",
7
7
  "description": "{{#if_eq appType 'admin'}}Enterprise management system built with hai Agent Framework{{/if_eq}}{{#if_eq appType 'website'}}Enterprise website built with hai Agent Framework{{/if_eq}}{{#if_eq appType 'h5'}}Mobile H5 app built with hai Agent Framework{{/if_eq}}{{#if_eq appType 'api'}}REST API service built with hai Agent Framework{{/if_eq}}{{#if_eq appType 'mobile-app'}}Mobile app built with hai Agent Framework{{/if_eq}}",
@@ -4,6 +4,14 @@
4
4
 
5
5
  ## 行为契约
6
6
 
7
+ 普通新增、修改、修复任务开始前,先读 [应用开发 Skill](.agents/skills/hai-app-create/SKILL.md) 和 [开发规范与框架能力路由](.agents/skills/hai-app-create/development.md);再按任务读取模块 Skill 及其相邻参考文件。架构/构建、审查、测试分别读取 hai-build、hai-app-review、hai-app-tests,不加载整个 skill 树。
8
+
9
+ - 对当前需求逐项检索 hai-framework 能力和已有实现,确认适用的公开 API 后优先复用;未安装模块先核对依赖与配置,不能因 Skill 已存在就假定已启用。框架不适用时说明具体限制与选用方案,不为覆盖清单引入无关模块。
10
+ - 按已安装版本的公开类型确认模块契约:生命周期模块按 init → use → close;core/serv/kit、纯函数/工厂与流按实际签名处理。返回 HaiResult 的操作先检查 success,不以 try/catch 代替判断;事务失败明确触发回滚。
11
+ - 边界输入做 schema 校验,服务端验证身份、租户与资源权限;SQL 动态值参数化,文件路径防逃逸。密钥不进入 PUBLIC_/VITE_ 变量、客户端代码和日志;敏感 token 不写 localStorage。
12
+ - 禁止 any、无说明的 as unknown as、console.log 和硬编码密钥;从包公开入口导入。注释中文、结构化日志英文并脱敏,用户文本走现有 i18n 并同步所有 locale。
13
+ - 完成时说明实际复用的框架能力、未采用的相关能力及原因、门禁结果;跨边界同步类型、配置、调用方、文档和测试。
14
+
7
15
  先读 README、package.json、相关实现/测试和所需 .agents/skills;不要加载整个 skill 树。新增抽象前确认复用路径与真实需求;保留用户改动。跨文件任务简述影响和验证计划,无须固定规模标签或重复问卷。
8
16
 
9
17
  - 直接影响:修改 / 新建 / 删除哪些文件;哪些脚本、类型、配置或路由会变。
@@ -13,14 +21,7 @@
13
21
 
14
22
  本项目由 hai-framework CLI 生成。单应用工程通常在 `src/` 下开发;多包工程会同时包含 `packages/*` 与 `apps/*`。实际结构以当前项目目录为准。
15
23
 
16
- ## 通用硬约束
17
-
18
- - 先用全局检索确认是否已有实现、测试和文档;优先复用,避免为“未来可能”新增抽象。
19
- - 生命周期模块按 init → use → close;core/serv/kit/纯函数和流式 API 按实际签名使用。返回 HaiResult 的业务操作先检查 success,不以 try/catch 代替判断。
20
- - 禁止 `any`、无说明的危险类型断言、`console.log`、硬编码密钥。
21
- - 用户可见文本必须走 i18n;如果项目启用了 `messages/zh-CN.json` 与 `messages/en-US.json`,修改文案时必须同步更新。
22
- - 代码注释中文,日志消息英文。
23
- - 如项目使用 SvelteKit,`+server.ts` 只能导出 HTTP handler 与 SvelteKit 允许的配置项;辅助函数放到 `src/lib/**`。
24
+ 如项目使用 SvelteKit,`+server.ts` 只能导出 HTTP handler 与 SvelteKit 允许的配置项;辅助函数放到 `src/lib/**`。
24
25
 
25
26
  ## 工作流程
26
27
 
@@ -9,3 +9,7 @@
9
9
  ## 质量门禁
10
10
 
11
11
  按 AGENTS.md 和实际 package.json 选择 typecheck、lint、build、test、test:e2e;最终说明已执行结果、未运行原因及同步文档/依赖方。
12
+
13
+ 普通新增、修改、修复任务先读 [应用开发 Skill](.agents/skills/hai-app-create/SKILL.md) 和 [开发规范与框架能力路由](.agents/skills/hai-app-create/development.md),依照 AGENTS.md 的默认规则复用框架并完成安全与质量验证。
14
+
15
+ Claude Code 从 `.claude/skills/` 原生发现技能入口,再读取 `.agents/skills/` 的共享正文与相邻参考。项目规则通过 `@AGENTS.md` 加载;同名技能不在入口目录另维护一份规则。
@@ -4,6 +4,14 @@
4
4
 
5
5
  ## 行为契约
6
6
 
7
+ 普通新增、修改、修复任务开始前,先读 [应用开发 Skill](.agents/skills/hai-app-create/SKILL.md) 和 [开发规范与框架能力路由](.agents/skills/hai-app-create/development.md);再按任务读取模块 Skill 及其相邻参考文件。架构/构建、审查、测试分别读取 hai-build、hai-app-review、hai-app-tests,不加载整个 skill 树。
8
+
9
+ - 对当前需求逐项检索 hai-framework 能力和已有实现,确认适用的公开 API 后优先复用;未安装模块先核对依赖与配置,不能因 Skill 已存在就假定已启用。框架不适用时说明具体限制与选用方案,不为覆盖清单引入无关模块。
10
+ - 按已安装版本的公开类型确认模块契约:生命周期模块按 init → use → close;core/serv/kit、纯函数/工厂与流按实际签名处理。返回 HaiResult 的操作先检查 success,不以 try/catch 代替判断;事务失败明确触发回滚。
11
+ - 边界输入做 schema 校验,服务端验证身份、租户与资源权限;SQL 动态值参数化,文件路径防逃逸。密钥不进入 PUBLIC_/VITE_ 变量、客户端代码和日志;敏感 token 不写 localStorage。
12
+ - 禁止 any、无说明的 as unknown as、console.log 和硬编码密钥;从包公开入口导入。注释中文、结构化日志英文并脱敏,用户文本走现有 i18n 并同步所有 locale。
13
+ - 完成时说明实际复用的框架能力、未采用的相关能力及原因、门禁结果;跨边界同步类型、配置、调用方、文档和测试。
14
+
7
15
  先读 README、package.json、相关实现/测试和所需 .agents/skills;不要加载整个 skill 树。新增抽象前确认复用路径与真实需求;保留用户改动。跨文件任务简述影响和验证计划,无须固定规模标签或重复问卷。
8
16
 
9
17
  - 直接影响:哪些 `+page.svelte`、`+layout.svelte`、`+page.server.ts`、`+server.ts`、service、messages、README、测试会变。
@@ -9,3 +9,7 @@
9
9
  ## 质量门禁
10
10
 
11
11
  按 AGENTS.md 和实际 package.json 选择 typecheck、lint、build、test、test:e2e;最终说明已执行结果、未运行原因及同步文档/依赖方。
12
+
13
+ 普通新增、修改、修复任务先读 [应用开发 Skill](.agents/skills/hai-app-create/SKILL.md) 和 [开发规范与框架能力路由](.agents/skills/hai-app-create/development.md),依照 AGENTS.md 的默认规则复用框架并完成安全与质量验证。
14
+
15
+ Claude Code 从 `.claude/skills/` 原生发现技能入口,再读取 `.agents/skills/` 的共享正文与相邻参考。项目规则通过 `@AGENTS.md` 加载;同名技能不在入口目录另维护一份规则。
@@ -7,3 +7,5 @@
7
7
  ## 质量门禁
8
8
 
9
9
  按 AGENTS.md 和实际 package.json 选择 typecheck、lint、build、test、test:e2e;最终说明已执行结果、未运行原因及同步文档/依赖方。
10
+
11
+ 普通新增、修改、修复任务先读 [应用开发 Skill](../.agents/skills/hai-app-create/SKILL.md) 和 [开发规范与框架能力路由](../.agents/skills/hai-app-create/development.md),依照 AGENTS.md 的默认规则复用框架并完成安全与质量验证。
@@ -4,6 +4,14 @@
4
4
 
5
5
  ## 行为契约
6
6
 
7
+ 普通新增、修改、修复任务开始前,先读 [应用开发 Skill](.agents/skills/hai-app-create/SKILL.md) 和 [开发规范与框架能力路由](.agents/skills/hai-app-create/development.md);再按任务读取模块 Skill 及其相邻参考文件。架构/构建、审查、测试分别读取 hai-build、hai-app-review、hai-app-tests,不加载整个 skill 树。
8
+
9
+ - 对当前需求逐项检索 hai-framework 能力和已有实现,确认适用的公开 API 后优先复用;未安装模块先核对依赖与配置,不能因 Skill 已存在就假定已启用。框架不适用时说明具体限制与选用方案,不为覆盖清单引入无关模块。
10
+ - 按已安装版本的公开类型确认模块契约:生命周期模块按 init → use → close;core/serv/kit、纯函数/工厂与流按实际签名处理。返回 HaiResult 的操作先检查 success,不以 try/catch 代替判断;事务失败明确触发回滚。
11
+ - 边界输入做 schema 校验,服务端验证身份、租户与资源权限;SQL 动态值参数化,文件路径防逃逸。密钥不进入 PUBLIC_/VITE_ 变量、客户端代码和日志;敏感 token 不写 localStorage。
12
+ - 禁止 any、无说明的 as unknown as、console.log 和硬编码密钥;从包公开入口导入。注释中文、结构化日志英文并脱敏,用户文本走现有 i18n 并同步所有 locale。
13
+ - 完成时说明实际复用的框架能力、未采用的相关能力及原因、门禁结果;跨边界同步类型、配置、调用方、文档和测试。
14
+
7
15
  先读 README、package.json、相关实现/测试和所需 .agents/skills;不要加载整个 skill 树。新增抽象前确认复用路径与真实需求;保留用户改动。跨文件任务简述影响和验证计划,无须固定规模标签或重复问卷。
8
16
 
9
17
  - 直接影响:哪些 `apps/*-contract`、`apps/*-service`、config、README、测试会变。
@@ -18,7 +26,6 @@
18
26
  - API 输入输出必须由 `apps/*-contract/src/**` 中的 Zod schema 与 contract 定义统一约束。
19
27
  - Service 通过 `@h-ai/serv` + `@h-ai/api-contract` 装配 HTTP App;不要退回到 SvelteKit API routes 架构。
20
28
  - Typed client / contract / service 三者保持同一份路径与类型定义,不要复制粘贴接口。
21
- - 返回 `HaiResult<T>` 的业务 API 先判断 `success`;纯函数、工厂与流按实际签名处理。
22
29
  - 不生成用户页面;不要引入 UI 专属依赖或页面文案。
23
30
  - 配置和密钥来自 `apps/*-service/config/` 与环境变量,禁止硬编码。
24
31
 
@@ -9,3 +9,7 @@
9
9
  ## 质量门禁
10
10
 
11
11
  按 AGENTS.md 和实际 package.json 选择 typecheck、lint、build、test、test:e2e;最终说明已执行结果、未运行原因及同步文档/依赖方。
12
+
13
+ 普通新增、修改、修复任务先读 [应用开发 Skill](.agents/skills/hai-app-create/SKILL.md) 和 [开发规范与框架能力路由](.agents/skills/hai-app-create/development.md),依照 AGENTS.md 的默认规则复用框架并完成安全与质量验证。
14
+
15
+ Claude Code 从 `.claude/skills/` 原生发现技能入口,再读取 `.agents/skills/` 的共享正文与相邻参考。项目规则通过 `@AGENTS.md` 加载;同名技能不在入口目录另维护一份规则。
@@ -9,3 +9,5 @@
9
9
  ## 质量门禁
10
10
 
11
11
  按 AGENTS.md 和实际 package.json 选择 typecheck、lint、build、test、test:e2e;最终说明已执行结果、未运行原因及同步文档/依赖方。
12
+
13
+ 普通新增、修改、修复任务先读 [应用开发 Skill](../.agents/skills/hai-app-create/SKILL.md) 和 [开发规范与框架能力路由](../.agents/skills/hai-app-create/development.md),依照 AGENTS.md 的默认规则复用框架并完成安全与质量验证。
@@ -4,9 +4,16 @@ Fullstack 多包工程入口。先读 README、根 workspace 脚本与相关 pac
4
4
 
5
5
  ## 行为契约
6
6
 
7
+ 普通新增、修改、修复任务开始前,先读 [应用开发 Skill](.agents/skills/hai-app-create/SKILL.md) 和 [开发规范与框架能力路由](.agents/skills/hai-app-create/development.md);再按任务读取模块 Skill 及其相邻参考文件。架构/构建、审查、测试分别读取 hai-build、hai-app-review、hai-app-tests,不加载整个 skill 树。
8
+
9
+ - 对当前需求逐项检索 hai-framework 能力和已有实现,确认适用的公开 API 后优先复用;未安装模块先核对依赖与配置,不能因 Skill 已存在就假定已启用。框架不适用时说明具体限制与选用方案,不为覆盖清单引入无关模块。
10
+ - 按已安装版本的公开类型确认模块契约:生命周期模块按 init → use → close;core/serv/kit、纯函数/工厂与流按实际签名处理。返回 HaiResult 的操作先检查 success,不以 try/catch 代替判断;事务失败明确触发回滚。
11
+ - 边界输入做 schema 校验,服务端验证身份、租户与资源权限;SQL 动态值参数化,文件路径防逃逸。密钥不进入 PUBLIC_/VITE_ 变量、客户端代码和日志;敏感 token 不写 localStorage。
12
+ - 禁止 any、无说明的 as unknown as、console.log 和硬编码密钥;从包公开入口导入。注释中文、结构化日志英文并脱敏,用户文本走现有 i18n 并同步所有 locale。
13
+ - 完成时说明实际复用的框架能力、未采用的相关能力及原因、门禁结果;跨边界同步类型、配置、调用方、文档和测试。
14
+
7
15
  - 修改前检索实现、调用方、测试和文档,优先复用现有 contract、procedure、共享组件与脚本。
8
16
  - 跨包变更先明确受影响的 contract、serv、shared、前端及交付流程,再同步调用方;不必输出固定问卷。
9
- - 禁止 `any`、`console.log`、硬编码密钥。代码注释中文,日志英文;用户文本走 i18n。
10
17
 
11
18
  ## 架构边界
12
19
 
@@ -21,7 +28,6 @@ Fullstack 多包工程入口。先读 README、根 workspace 脚本与相关 pac
21
28
  | `apps/{{projectName}}-miniapp` | 选择 miniapp 时生成的预留说明与文案,当前不是可运行应用 |
22
29
 
23
30
  - 前端负责 UI 与请求编排;后端业务放 serv,共享能力放 shared。本样板默认不用 `@h-ai/kit`,不要混入 SvelteKit load / route 结构。
24
- - 返回 `HaiResult<T>` 的业务 API 先判断 `success`,业务错误直接透传;纯函数、工厂和流按实际签名使用,不能假定都返回 HaiResult。
25
31
  - 用户文本按 shared 跨端文案与各 app 专属文案分工,同步现有 locale。
26
32
  - 认证接入前检查现有实现;样板不意味着已配好 Cookie 或安全 token 存储。新增认证时 Web 明确 Cookie/内存方案,App 原生端配置安全 TokenStorage,Desktop 按 Tauri 安全边界实现。
27
33
 
@@ -3,3 +3,7 @@
3
3
  @AGENTS.md
4
4
 
5
5
  共享规范见 [AGENTS.md](AGENTS.md);若未自动展开,先手动阅读。fullstack 后端业务在 `packages/{{projectName}}-serv`;contract、shared client 与前端调用方同步修改。模块用法按需读取 `.agents/skills/`。
6
+
7
+ 普通新增、修改、修复任务先读 [应用开发 Skill](.agents/skills/hai-app-create/SKILL.md) 和 [开发规范与框架能力路由](.agents/skills/hai-app-create/development.md),依照 AGENTS.md 的默认规则复用框架并完成安全与质量验证。
8
+
9
+ Claude Code 从 `.claude/skills/` 原生发现技能入口,再读取 `.agents/skills/` 的共享正文与相邻参考。项目规则通过 `@AGENTS.md` 加载;同名技能不在入口目录另维护一份规则。
@@ -12,3 +12,5 @@
12
12
  ## 完成条件
13
13
 
14
14
  同步受影响的 contract、serv、shared、各端调用方及文档与测试,报告门禁结果和未执行原因。
15
+
16
+ 普通新增、修改、修复任务先读 [应用开发 Skill](../.agents/skills/hai-app-create/SKILL.md) 和 [开发规范与框架能力路由](../.agents/skills/hai-app-create/development.md),依照 AGENTS.md 的默认规则复用框架并完成安全与质量验证。
@@ -4,6 +4,14 @@
4
4
 
5
5
  ## 行为契约
6
6
 
7
+ 普通新增、修改、修复任务开始前,先读 [应用开发 Skill](.agents/skills/hai-app-create/SKILL.md) 和 [开发规范与框架能力路由](.agents/skills/hai-app-create/development.md);再按任务读取模块 Skill 及其相邻参考文件。架构/构建、审查、测试分别读取 hai-build、hai-app-review、hai-app-tests,不加载整个 skill 树。
8
+
9
+ - 对当前需求逐项检索 hai-framework 能力和已有实现,确认适用的公开 API 后优先复用;未安装模块先核对依赖与配置,不能因 Skill 已存在就假定已启用。框架不适用时说明具体限制与选用方案,不为覆盖清单引入无关模块。
10
+ - 按已安装版本的公开类型确认模块契约:生命周期模块按 init → use → close;core/serv/kit、纯函数/工厂与流按实际签名处理。返回 HaiResult 的操作先检查 success,不以 try/catch 代替判断;事务失败明确触发回滚。
11
+ - 边界输入做 schema 校验,服务端验证身份、租户与资源权限;SQL 动态值参数化,文件路径防逃逸。密钥不进入 PUBLIC_/VITE_ 变量、客户端代码和日志;敏感 token 不写 localStorage。
12
+ - 禁止 any、无说明的 as unknown as、console.log 和硬编码密钥;从包公开入口导入。注释中文、结构化日志英文并脱敏,用户文本走现有 i18n 并同步所有 locale。
13
+ - 完成时说明实际复用的框架能力、未采用的相关能力及原因、门禁结果;跨边界同步类型、配置、调用方、文档和测试。
14
+
7
15
  先读 README、package.json、相关实现/测试和所需 .agents/skills;不要加载整个 skill 树。新增抽象前确认复用路径与真实需求;保留用户改动。跨文件任务简述影响和验证计划,无须固定规模标签或重复问卷。
8
16
 
9
17
  - 直接影响:哪些页面、layout、导航、API、messages、README、测试会变。
@@ -9,3 +9,7 @@
9
9
  ## 质量门禁
10
10
 
11
11
  按 AGENTS.md 和实际 package.json 选择 typecheck、lint、build、test、test:e2e;最终说明已执行结果、未运行原因及同步文档/依赖方。
12
+
13
+ 普通新增、修改、修复任务先读 [应用开发 Skill](.agents/skills/hai-app-create/SKILL.md) 和 [开发规范与框架能力路由](.agents/skills/hai-app-create/development.md),依照 AGENTS.md 的默认规则复用框架并完成安全与质量验证。
14
+
15
+ Claude Code 从 `.claude/skills/` 原生发现技能入口,再读取 `.agents/skills/` 的共享正文与相邻参考。项目规则通过 `@AGENTS.md` 加载;同名技能不在入口目录另维护一份规则。
@@ -7,3 +7,5 @@
7
7
  ## 质量门禁
8
8
 
9
9
  按 AGENTS.md 和实际 package.json 选择 typecheck、lint、build、test、test:e2e;最终说明已执行结果、未运行原因及同步文档/依赖方。
10
+
11
+ 普通新增、修改、修复任务先读 [应用开发 Skill](../.agents/skills/hai-app-create/SKILL.md) 和 [开发规范与框架能力路由](../.agents/skills/hai-app-create/development.md),依照 AGENTS.md 的默认规则复用框架并完成安全与质量验证。
@@ -4,6 +4,14 @@
4
4
 
5
5
  ## 行为契约
6
6
 
7
+ 普通新增、修改、修复任务开始前,先读 [应用开发 Skill](.agents/skills/hai-app-create/SKILL.md) 和 [开发规范与框架能力路由](.agents/skills/hai-app-create/development.md);再按任务读取模块 Skill 及其相邻参考文件。架构/构建、审查、测试分别读取 hai-build、hai-app-review、hai-app-tests,不加载整个 skill 树。
8
+
9
+ - 对当前需求逐项检索 hai-framework 能力和已有实现,确认适用的公开 API 后优先复用;未安装模块先核对依赖与配置,不能因 Skill 已存在就假定已启用。框架不适用时说明具体限制与选用方案,不为覆盖清单引入无关模块。
10
+ - 按已安装版本的公开类型确认模块契约:生命周期模块按 init → use → close;core/serv/kit、纯函数/工厂与流按实际签名处理。返回 HaiResult 的操作先检查 success,不以 try/catch 代替判断;事务失败明确触发回滚。
11
+ - 边界输入做 schema 校验,服务端验证身份、租户与资源权限;SQL 动态值参数化,文件路径防逃逸。密钥不进入 PUBLIC_/VITE_ 变量、客户端代码和日志;敏感 token 不写 localStorage。
12
+ - 禁止 any、无说明的 as unknown as、console.log 和硬编码密钥;从包公开入口导入。注释中文、结构化日志英文并脱敏,用户文本走现有 i18n 并同步所有 locale。
13
+ - 完成时说明实际复用的框架能力、未采用的相关能力及原因、门禁结果;跨边界同步类型、配置、调用方、文档和测试。
14
+
7
15
  先读 README、package.json、相关实现/测试和所需 .agents/skills;不要加载整个 skill 树。新增抽象前确认复用路径与真实需求;保留用户改动。跨文件任务简述影响和验证计划,无须固定规模标签或重复问卷。
8
16
 
9
17
  - 直接影响:哪些页面、store、原生桥接、messages、README、测试和打包脚本会变。
@@ -9,3 +9,7 @@
9
9
  ## 质量门禁
10
10
 
11
11
  按 AGENTS.md 和实际 package.json 选择 typecheck、lint、build、test、test:e2e;最终说明已执行结果、未运行原因及同步文档/依赖方。
12
+
13
+ 普通新增、修改、修复任务先读 [应用开发 Skill](.agents/skills/hai-app-create/SKILL.md) 和 [开发规范与框架能力路由](.agents/skills/hai-app-create/development.md),依照 AGENTS.md 的默认规则复用框架并完成安全与质量验证。
14
+
15
+ Claude Code 从 `.claude/skills/` 原生发现技能入口,再读取 `.agents/skills/` 的共享正文与相邻参考。项目规则通过 `@AGENTS.md` 加载;同名技能不在入口目录另维护一份规则。
@@ -7,3 +7,5 @@
7
7
  ## 质量门禁
8
8
 
9
9
  按 AGENTS.md 和实际 package.json 选择 typecheck、lint、build、test、test:e2e;最终说明已执行结果、未运行原因及同步文档/依赖方。
10
+
11
+ 普通新增、修改、修复任务先读 [应用开发 Skill](../.agents/skills/hai-app-create/SKILL.md) 和 [开发规范与框架能力路由](../.agents/skills/hai-app-create/development.md),依照 AGENTS.md 的默认规则复用框架并完成安全与质量验证。
@@ -4,6 +4,14 @@
4
4
 
5
5
  ## 行为契约
6
6
 
7
+ 普通新增、修改、修复任务开始前,先读 [应用开发 Skill](.agents/skills/hai-app-create/SKILL.md) 和 [开发规范与框架能力路由](.agents/skills/hai-app-create/development.md);再按任务读取模块 Skill 及其相邻参考文件。架构/构建、审查、测试分别读取 hai-build、hai-app-review、hai-app-tests,不加载整个 skill 树。
8
+
9
+ - 对当前需求逐项检索 hai-framework 能力和已有实现,确认适用的公开 API 后优先复用;未安装模块先核对依赖与配置,不能因 Skill 已存在就假定已启用。框架不适用时说明具体限制与选用方案,不为覆盖清单引入无关模块。
10
+ - 按已安装版本的公开类型确认模块契约:生命周期模块按 init → use → close;core/serv/kit、纯函数/工厂与流按实际签名处理。返回 HaiResult 的操作先检查 success,不以 try/catch 代替判断;事务失败明确触发回滚。
11
+ - 边界输入做 schema 校验,服务端验证身份、租户与资源权限;SQL 动态值参数化,文件路径防逃逸。密钥不进入 PUBLIC_/VITE_ 变量、客户端代码和日志;敏感 token 不写 localStorage。
12
+ - 禁止 any、无说明的 as unknown as、console.log 和硬编码密钥;从包公开入口导入。注释中文、结构化日志英文并脱敏,用户文本走现有 i18n 并同步所有 locale。
13
+ - 完成时说明实际复用的框架能力、未采用的相关能力及原因、门禁结果;跨边界同步类型、配置、调用方、文档和测试。
14
+
7
15
  先读 README、package.json、相关实现/测试和所需 .agents/skills;不要加载整个 skill 树。新增抽象前确认复用路径与真实需求;保留用户改动。跨文件任务简述影响和验证计划,无须固定规模标签或重复问卷。
8
16
 
9
17
  - 直接影响:哪些页面、layout、表单/API、messages、README、测试会变。
@@ -9,3 +9,7 @@
9
9
  ## 质量门禁
10
10
 
11
11
  按 AGENTS.md 和实际 package.json 选择 typecheck、lint、build、test、test:e2e;最终说明已执行结果、未运行原因及同步文档/依赖方。
12
+
13
+ 普通新增、修改、修复任务先读 [应用开发 Skill](.agents/skills/hai-app-create/SKILL.md) 和 [开发规范与框架能力路由](.agents/skills/hai-app-create/development.md),依照 AGENTS.md 的默认规则复用框架并完成安全与质量验证。
14
+
15
+ Claude Code 从 `.claude/skills/` 原生发现技能入口,再读取 `.agents/skills/` 的共享正文与相邻参考。项目规则通过 `@AGENTS.md` 加载;同名技能不在入口目录另维护一份规则。