create-fullstack-scaffold 0.1.0

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 (530) hide show
  1. package/README.md +154 -0
  2. package/dist/cli/index.d.ts +2 -0
  3. package/dist/cli/index.js +439 -0
  4. package/dist/cli/index.js.map +1 -0
  5. package/package.json +171 -0
  6. package/template/.agents/skills/writing-hookify-rules/SKILL.md +408 -0
  7. package/template/.ai-context.md +368 -0
  8. package/template/.claude/hookify.block-dangerous-commands.local.md +41 -0
  9. package/template/.claude/hookify.check-api-types.local.md +111 -0
  10. package/template/.claude/hookify.check-duplicate-types.local.md +287 -0
  11. package/template/.claude/hookify.check-test-assertions.local.md +93 -0
  12. package/template/.claude/hookify.remind-add-tests.local.md +209 -0
  13. package/template/.claude/hookify.remind-db-migration.local.md +58 -0
  14. package/template/.claude/hookify.remind-run-tests.local.md +52 -0
  15. package/template/.claude/hookify.warn-any-type.local.md +203 -0
  16. package/template/.claude/hookify.warn-console-log.local.md +73 -0
  17. package/template/.claude/rules/00-project-config.md +147 -0
  18. package/template/.claude/rules/01-file-types.md +127 -0
  19. package/template/.claude/rules/02-git-workflow.md +167 -0
  20. package/template/.claude/rules/10-api-type-inference.md +555 -0
  21. package/template/.claude/rules/20-server-api.md +349 -0
  22. package/template/.claude/rules/21-server-entrypoint.md +257 -0
  23. package/template/.claude/rules/30-client-components.md +314 -0
  24. package/template/.claude/rules/31-client-services.md +768 -0
  25. package/template/.claude/rules/32-client-state-zustand.md +324 -0
  26. package/template/.claude/rules/33-client-app-entry.md +276 -0
  27. package/template/.claude/rules/34-client-admin-module.md +445 -0
  28. package/template/.claude/rules/35-cli-module.md +259 -0
  29. package/template/.claude/rules/40-admin-module.md +495 -0
  30. package/template/.claude/rules/40-shared-types.md +450 -0
  31. package/template/.claude/rules/50-websocket.md +245 -0
  32. package/template/.claude/rules/51-sse.md +372 -0
  33. package/template/.claude/rules/52-cloudflare-realtime.md +384 -0
  34. package/template/.claude/rules/60-testing-standards.md +245 -0
  35. package/template/.claude/rules/61-hono-testing.md +200 -0
  36. package/template/.claude/scripts/README.md +187 -0
  37. package/template/.claude/scripts/check-duplicate-types.ts +188 -0
  38. package/template/.claude/scripts/post-edit-check-incremental.sh +61 -0
  39. package/template/.claude/scripts/post-edit-check.sh +22 -0
  40. package/template/.claude/scripts/pre-tool-use-check.sh +86 -0
  41. package/template/.claude/scripts/test-pre-tool-use.sh +73 -0
  42. package/template/.claude/scripts/validate-git-changes.sh +38 -0
  43. package/template/.claude/settings.json +32 -0
  44. package/template/.claude/skills/writing-hookify-rules/SKILL.md +408 -0
  45. package/template/.dev-context-compact.md +54 -0
  46. package/template/.dev-context.md +621 -0
  47. package/template/.dev-guide.md +243 -0
  48. package/template/.env.example +60 -0
  49. package/template/.eslintrc.routes.json +39 -0
  50. package/template/.husky/_/husky.sh +27 -0
  51. package/template/.husky/commit-msg +4 -0
  52. package/template/.husky/post-commit +4 -0
  53. package/template/.husky/pre-commit +19 -0
  54. package/template/.husky/pre-push +12 -0
  55. package/template/.prettierignore +22 -0
  56. package/template/.prettierrc +8 -0
  57. package/template/.sessions/3/2026-03-26T05-41-09-154Z_03bb597f-3898-4a2e-8c08-5746bbe8d95e.jsonl +18 -0
  58. package/template/.sessions/3/2026-03-26T05-48-30-052Z_12de4774-9cb3-494c-9852-bd1e6b0003c3.jsonl +6 -0
  59. package/template/.vscode/extensions.json +8 -0
  60. package/template/.vscode/settings.json +4 -0
  61. package/template/.workspaces/3/hello.py +1 -0
  62. package/template/.wrangler/state/v3/d1/miniflare-D1DatabaseObject/803c2e37182b913f8857edf6d8776515cef4af6d48fcb25913e457f4b14ffa97.sqlite +0 -0
  63. package/template/.wrangler/state/v3/d1/miniflare-D1DatabaseObject/803c2e37182b913f8857edf6d8776515cef4af6d48fcb25913e457f4b14ffa97.sqlite-shm +0 -0
  64. package/template/.wrangler/state/v3/d1/miniflare-D1DatabaseObject/803c2e37182b913f8857edf6d8776515cef4af6d48fcb25913e457f4b14ffa97.sqlite-wal +0 -0
  65. package/template/CLAUDE.md +296 -0
  66. package/template/DESIGN.md +260 -0
  67. package/template/DEV_CONTEXT_GUIDE.md +366 -0
  68. package/template/DEV_TOOLS_README.md +396 -0
  69. package/template/FRAMEWORK_HISTORY.md +34 -0
  70. package/template/PROJECT_SUMMARY.md +325 -0
  71. package/template/QUICKSTART.md +305 -0
  72. package/template/README.md +154 -0
  73. package/template/STRUCTURE.txt +81 -0
  74. package/template/admin.html +13 -0
  75. package/template/auth-inject.html +33 -0
  76. package/template/commitlint.config.js +12 -0
  77. package/template/docs/PERMISSION_ARCHITECTURE.md +279 -0
  78. package/template/docs/PERMISSION_EXAMPLES.md +230 -0
  79. package/template/docs/PERMISSION_SYSTEM.md +301 -0
  80. package/template/docs/SMART_TEST.md +171 -0
  81. package/template/docs/runtime-abstract.md +253 -0
  82. package/template/drizzle/0000_rainy_boomer.sql +101 -0
  83. package/template/drizzle/0001_add_todo_attachments.sql +12 -0
  84. package/template/drizzle/0002_chilly_magneto.sql +89 -0
  85. package/template/drizzle/meta/0000_snapshot.json +652 -0
  86. package/template/drizzle/meta/0001_snapshot.json +735 -0
  87. package/template/drizzle/meta/0002_snapshot.json +1198 -0
  88. package/template/drizzle/meta/_journal.json +27 -0
  89. package/template/drizzle.config.ts +13 -0
  90. package/template/eslint-rules/README-no-middleware-in-routes.md +154 -0
  91. package/template/eslint-rules/__tests__/enforce-valid-method.test.ts +251 -0
  92. package/template/eslint-rules/__tests__/layer-boundary.test.ts +102 -0
  93. package/template/eslint-rules/__tests__/module-boundary.test.ts +77 -0
  94. package/template/eslint-rules/__tests__/no-direct-zod-import-in-file-routes.test.ts +45 -0
  95. package/template/eslint-rules/__tests__/no-new-old-service-naming.test.ts +76 -0
  96. package/template/eslint-rules/e2e-test-location.js +153 -0
  97. package/template/eslint-rules/enforce-valid-method.js +217 -0
  98. package/template/eslint-rules/flat-routes-services.js +69 -0
  99. package/template/eslint-rules/framework-protect.js +186 -0
  100. package/template/eslint-rules/layer-boundary.js +164 -0
  101. package/template/eslint-rules/limit-type-complexity.js +130 -0
  102. package/template/eslint-rules/middleware-location.js +162 -0
  103. package/template/eslint-rules/module-boundary.js +125 -0
  104. package/template/eslint-rules/no-ambiguous-file-paths.js +64 -0
  105. package/template/eslint-rules/no-any-on-apiclient.js +173 -0
  106. package/template/eslint-rules/no-boolean-success.js +43 -0
  107. package/template/eslint-rules/no-deep-relative-imports.js +69 -0
  108. package/template/eslint-rules/no-direct-fetch.js +122 -0
  109. package/template/eslint-rules/no-direct-ws-sse.js +57 -0
  110. package/template/eslint-rules/no-direct-zod-import-in-file-routes.js +54 -0
  111. package/template/eslint-rules/no-disable-direct-fetch.js +57 -0
  112. package/template/eslint-rules/no-disable-type-safe-client.js +58 -0
  113. package/template/eslint-rules/no-inline-schema.js +220 -0
  114. package/template/eslint-rules/no-middleware-in-routes.js +81 -0
  115. package/template/eslint-rules/no-new-old-service-naming.js +123 -0
  116. package/template/eslint-rules/no-type-assertion-in-rpc.js +99 -0
  117. package/template/eslint-rules/no-type-assertion-on-shared-types.js +109 -0
  118. package/template/eslint-rules/no-util-functions-in-service.js +128 -0
  119. package/template/eslint-rules/prefer-shared-types.js +352 -0
  120. package/template/eslint-rules/protect-ws-sse-interface.js +66 -0
  121. package/template/eslint-rules/require-antd-generic-types.js +73 -0
  122. package/template/eslint-rules/require-file-openapi-props.js +114 -0
  123. package/template/eslint-rules/require-hono-chain-syntax.js +129 -0
  124. package/template/eslint-rules/require-nullable-for-optional.js +99 -0
  125. package/template/eslint-rules/require-response-helpers.js +140 -0
  126. package/template/eslint-rules/require-type-safe-test-client.js +106 -0
  127. package/template/eslint-rules/route-location.js +72 -0
  128. package/template/eslint.config.js +231 -0
  129. package/template/index.html +17 -0
  130. package/template/lint-scripts/DIRECTORY_RULES.md +335 -0
  131. package/template/lint-scripts/README.md +299 -0
  132. package/template/lint-scripts/TESTING.md +273 -0
  133. package/template/lint-scripts/ai-context-generator.ts +159 -0
  134. package/template/lint-scripts/check-framework-modify.sh +8 -0
  135. package/template/lint-scripts/check-menu-permissions.js +242 -0
  136. package/template/lint-scripts/check-refs.ts +165 -0
  137. package/template/lint-scripts/check-route-auth-complete.js +260 -0
  138. package/template/lint-scripts/check-route-auth.js +212 -0
  139. package/template/lint-scripts/check-route-permissions.js +210 -0
  140. package/template/lint-scripts/config/project.config.ts +358 -0
  141. package/template/lint-scripts/dev-context-analyzer.ts +707 -0
  142. package/template/lint-scripts/dev-guide-generator.ts +830 -0
  143. package/template/lint-scripts/dev-server.ts +58 -0
  144. package/template/lint-scripts/eslint-route-auth.js +158 -0
  145. package/template/lint-scripts/eslint-routes-permission.js +147 -0
  146. package/template/lint-scripts/fix-route-auth.js +245 -0
  147. package/template/lint-scripts/framework/check-modify.ts +152 -0
  148. package/template/lint-scripts/framework/hash-utils.ts +180 -0
  149. package/template/lint-scripts/framework/init-baseline.ts +84 -0
  150. package/template/lint-scripts/framework/update-baseline.ts +148 -0
  151. package/template/lint-scripts/post-commit-track.ts +66 -0
  152. package/template/lint-scripts/quick-test.sh +27 -0
  153. package/template/lint-scripts/smart-test.ts +268 -0
  154. package/template/lint-scripts/test-history.ts +360 -0
  155. package/template/lint-scripts/test-tracker.ts +350 -0
  156. package/template/lint-scripts/validate-all.ts +250 -0
  157. package/template/lint-scripts/validators/api-coverage.validator.ts +355 -0
  158. package/template/lint-scripts/validators/client-rpc.validator.ts +190 -0
  159. package/template/lint-scripts/validators/client-tests.validator.ts +155 -0
  160. package/template/lint-scripts/validators/console-log.validator.ts +122 -0
  161. package/template/lint-scripts/validators/directory-structure.validator.ts +181 -0
  162. package/template/lint-scripts/validators/imports.validator.ts +180 -0
  163. package/template/lint-scripts/validators/index.ts +271 -0
  164. package/template/lint-scripts/validators/md-refs.validator.ts +165 -0
  165. package/template/lint-scripts/validators/module-tests.validator.ts +112 -0
  166. package/template/lint-scripts/validators/sensitive.validator.ts +185 -0
  167. package/template/lint-scripts/validators/server-rpc.validator.ts +141 -0
  168. package/template/lint-scripts/validators/test-quality.validator.ts +257 -0
  169. package/template/lint-scripts/validators/todos.validator.ts +126 -0
  170. package/template/lint-scripts/watch-validator.ts +131 -0
  171. package/template/modules.config.ts +71 -0
  172. package/template/package-lock.json +14554 -0
  173. package/template/package.json +158 -0
  174. package/template/patches/@hono+zod-openapi+1.2.2.patch +67 -0
  175. package/template/patches/@hono+zod-validator+0.7.6.patch +13 -0
  176. package/template/patches/hono+4.12.16.patch +246 -0
  177. package/template/patches/typescript+5.8.3.patch +26 -0
  178. package/template/playwright.config.ts +60 -0
  179. package/template/pnpm-lock.yaml +7137 -0
  180. package/template/postcss.config.js +6 -0
  181. package/template/scripts/create-template.ts +1724 -0
  182. package/template/src/admin/App.tsx +59 -0
  183. package/template/src/admin/components/AccountSwitcher.tsx +104 -0
  184. package/template/src/admin/components/CaptchaModal.tsx +150 -0
  185. package/template/src/admin/components/NotificationDrawer.tsx +213 -0
  186. package/template/src/admin/components/PageHeader.tsx +45 -0
  187. package/template/src/admin/components/PermissionConfigEditor.tsx +237 -0
  188. package/template/src/admin/components/PermissionGuard.tsx +108 -0
  189. package/template/src/admin/components/PermissionTree.tsx +193 -0
  190. package/template/src/admin/components/ProtectedRoute.tsx +33 -0
  191. package/template/src/admin/components/StatsCard.tsx +44 -0
  192. package/template/src/admin/components/UserFormModal.tsx +67 -0
  193. package/template/src/admin/components/UserTable.tsx +72 -0
  194. package/template/src/admin/components/__tests__/PageHeader.test.tsx +48 -0
  195. package/template/src/admin/components/__tests__/PermissionConfigEditor.test.tsx +147 -0
  196. package/template/src/admin/components/__tests__/PermissionGuard.test.tsx +221 -0
  197. package/template/src/admin/components/__tests__/PermissionTree.test.tsx +187 -0
  198. package/template/src/admin/components/__tests__/ProtectedRoute.test.tsx +129 -0
  199. package/template/src/admin/components/__tests__/StatsCard.test.tsx +44 -0
  200. package/template/src/admin/components/__tests__/UserFormModal.test.tsx +125 -0
  201. package/template/src/admin/components/__tests__/UserTable.test.tsx +89 -0
  202. package/template/src/admin/components/index.ts +7 -0
  203. package/template/src/admin/hooks/__tests__/useAuditLogs.test.ts +109 -0
  204. package/template/src/admin/hooks/__tests__/usePermissions.test.tsx +327 -0
  205. package/template/src/admin/hooks/__tests__/usePermissionsBranches.test.ts +198 -0
  206. package/template/src/admin/hooks/__tests__/useRoles.test.ts +261 -0
  207. package/template/src/admin/hooks/useAdminNotifications.ts +156 -0
  208. package/template/src/admin/hooks/useAuditLogs.ts +44 -0
  209. package/template/src/admin/hooks/useConfig.ts +168 -0
  210. package/template/src/admin/hooks/usePermissions.ts +156 -0
  211. package/template/src/admin/hooks/useRoles.ts +120 -0
  212. package/template/src/admin/layouts/Header.tsx +93 -0
  213. package/template/src/admin/layouts/Layout.tsx +23 -0
  214. package/template/src/admin/layouts/Sidebar.tsx +120 -0
  215. package/template/src/admin/main.tsx +18 -0
  216. package/template/src/admin/pages/ContentPage.tsx +252 -0
  217. package/template/src/admin/pages/DashboardPage.tsx +141 -0
  218. package/template/src/admin/pages/DisputesPage.tsx +261 -0
  219. package/template/src/admin/pages/LoginPage.tsx +121 -0
  220. package/template/src/admin/pages/MediaTestPage.tsx +524 -0
  221. package/template/src/admin/pages/OrdersPage.tsx +302 -0
  222. package/template/src/admin/pages/PermissionsPage.tsx +95 -0
  223. package/template/src/admin/pages/RegisterPage.tsx +103 -0
  224. package/template/src/admin/pages/RolesPage.tsx +330 -0
  225. package/template/src/admin/pages/SettingsPage.tsx +73 -0
  226. package/template/src/admin/pages/SystemLogsPage.tsx +218 -0
  227. package/template/src/admin/pages/TestCaptchaPage.tsx +120 -0
  228. package/template/src/admin/pages/TicketsPage.tsx +292 -0
  229. package/template/src/admin/pages/UsersPage.tsx +282 -0
  230. package/template/src/admin/pages/__tests__/ContentPage.test.tsx +213 -0
  231. package/template/src/admin/pages/__tests__/DashboardPage.test.tsx +153 -0
  232. package/template/src/admin/pages/__tests__/DisputesPage.test.tsx +196 -0
  233. package/template/src/admin/pages/__tests__/LoginPage.test.tsx +112 -0
  234. package/template/src/admin/pages/__tests__/OrdersPage.test.tsx +217 -0
  235. package/template/src/admin/pages/__tests__/PermissionsPage.test.tsx +119 -0
  236. package/template/src/admin/pages/__tests__/RegisterPage.test.tsx +179 -0
  237. package/template/src/admin/pages/__tests__/RolesPage.test.tsx +256 -0
  238. package/template/src/admin/pages/__tests__/SettingsPage.test.tsx +66 -0
  239. package/template/src/admin/pages/__tests__/SystemLogsPage.test.tsx +125 -0
  240. package/template/src/admin/pages/__tests__/TicketsPage.test.tsx +202 -0
  241. package/template/src/admin/pages/__tests__/UsersPage.test.tsx +229 -0
  242. package/template/src/admin/services/README.md +263 -0
  243. package/template/src/admin/services/TESTING.md +323 -0
  244. package/template/src/admin/services/__tests__/skipLoading.test.ts +146 -0
  245. package/template/src/admin/services/apiClient.ts +66 -0
  246. package/template/src/admin/services/requestInterceptor.ts +127 -0
  247. package/template/src/admin/services/types.ts +5 -0
  248. package/template/src/admin/stores/__tests__/adminStore.test.ts +184 -0
  249. package/template/src/admin/stores/__tests__/adminStoreBranches.test.ts +148 -0
  250. package/template/src/admin/stores/__tests__/captchaStore.test.ts +75 -0
  251. package/template/src/admin/stores/__tests__/captchaStoreBranches.test.ts +37 -0
  252. package/template/src/admin/stores/__tests__/loadingStore.test.ts +68 -0
  253. package/template/src/admin/stores/adminStore.ts +88 -0
  254. package/template/src/admin/stores/captchaStore.ts +47 -0
  255. package/template/src/admin/stores/loadingStore.ts +27 -0
  256. package/template/src/cli/index.ts +22 -0
  257. package/template/src/cli/modules/config/index.ts +132 -0
  258. package/template/src/cli/modules/index.ts +12 -0
  259. package/template/src/cli/modules/notification/index.ts +86 -0
  260. package/template/src/cli/modules/todo/index.ts +60 -0
  261. package/template/src/cli/rpc/client.ts +23 -0
  262. package/template/src/cli/rpc/index.ts +1 -0
  263. package/template/src/cli/utils/api.ts +17 -0
  264. package/template/src/cli/utils/auto-command.ts +229 -0
  265. package/template/src/cli/utils/index.ts +8 -0
  266. package/template/src/cli/utils/logger.ts +79 -0
  267. package/template/src/client/App.tsx +24 -0
  268. package/template/src/client/Layout.tsx +27 -0
  269. package/template/src/client/components/AuthButton.tsx +41 -0
  270. package/template/src/client/components/ConnectionStatus.tsx +75 -0
  271. package/template/src/client/components/EmptyState.tsx +26 -0
  272. package/template/src/client/components/Footer.tsx +17 -0
  273. package/template/src/client/components/LoadingSpinner.tsx +26 -0
  274. package/template/src/client/components/MessageCard.tsx +61 -0
  275. package/template/src/client/components/Navigation.tsx +65 -0
  276. package/template/src/client/components/StatusBadge.tsx +50 -0
  277. package/template/src/client/components/__tests__/App.test.tsx +79 -0
  278. package/template/src/client/components/__tests__/AuthButton.test.tsx +119 -0
  279. package/template/src/client/components/__tests__/ConnectionStatus.test.tsx +188 -0
  280. package/template/src/client/components/__tests__/EmptyState.test.tsx +70 -0
  281. package/template/src/client/components/__tests__/Footer.test.tsx +22 -0
  282. package/template/src/client/components/__tests__/LoadingSpinner.test.tsx +75 -0
  283. package/template/src/client/components/__tests__/MessageCard.test.tsx +142 -0
  284. package/template/src/client/components/__tests__/Navigation.test.tsx +40 -0
  285. package/template/src/client/components/__tests__/StatusBadge.test.tsx +107 -0
  286. package/template/src/client/components/index.ts +6 -0
  287. package/template/src/client/index.css +27 -0
  288. package/template/src/client/main.tsx +25 -0
  289. package/template/src/client/pages/ContentDetailPage.tsx +142 -0
  290. package/template/src/client/pages/ContentListPage.tsx +169 -0
  291. package/template/src/client/pages/NotificationPage.tsx +288 -0
  292. package/template/src/client/pages/TodoPage.tsx +389 -0
  293. package/template/src/client/pages/WebSocketPage.tsx +239 -0
  294. package/template/src/client/pages/__tests__/ContentDetailPage.test.tsx +176 -0
  295. package/template/src/client/pages/__tests__/ContentListPage.test.tsx +202 -0
  296. package/template/src/client/pages/__tests__/NotificationPage.test.tsx +246 -0
  297. package/template/src/client/pages/__tests__/TodoPage.test.tsx +433 -0
  298. package/template/src/client/pages/__tests__/WebSocketPage.test.tsx +378 -0
  299. package/template/src/client/services/apiClient.ts +66 -0
  300. package/template/src/client/stores/__tests__/authStore.test.ts +139 -0
  301. package/template/src/client/stores/__tests__/chatWSStore.test.ts +416 -0
  302. package/template/src/client/stores/__tests__/notificationStore.test.ts +453 -0
  303. package/template/src/client/stores/__tests__/todoStore.test.ts +509 -0
  304. package/template/src/client/stores/authStore.ts +51 -0
  305. package/template/src/client/stores/chatWSStore.ts +122 -0
  306. package/template/src/client/stores/notificationStore.ts +199 -0
  307. package/template/src/client/stores/todoStore.ts +207 -0
  308. package/template/src/server/__tests__/integration/todos-api.test.ts +138 -0
  309. package/template/src/server/app.ts +105 -0
  310. package/template/src/server/config.ts +86 -0
  311. package/template/src/server/core/__tests__/realtime-core.test.ts +329 -0
  312. package/template/src/server/core/__tests__/realtime-scanner.test.ts +210 -0
  313. package/template/src/server/core/__tests__/runtime-node.test.ts +330 -0
  314. package/template/src/server/core/__tests__/runtime.test.ts +219 -0
  315. package/template/src/server/core/__tests__/typed-runtime.test.ts +178 -0
  316. package/template/src/server/core/durable-objects/RealtimeDO.ts +206 -0
  317. package/template/src/server/core/index.ts +83 -0
  318. package/template/src/server/core/module-loader.ts +281 -0
  319. package/template/src/server/core/realtime-core.ts +152 -0
  320. package/template/src/server/core/realtime-scanner.ts +99 -0
  321. package/template/src/server/core/runtime-cloudflare.ts +207 -0
  322. package/template/src/server/core/runtime-node.ts +170 -0
  323. package/template/src/server/core/runtime.ts +129 -0
  324. package/template/src/server/core/typed-runtime.ts +80 -0
  325. package/template/src/server/db/__tests__/driver.test.ts +203 -0
  326. package/template/src/server/db/config.ts +1 -0
  327. package/template/src/server/db/driver-cloudflare.ts +50 -0
  328. package/template/src/server/db/driver.ts +116 -0
  329. package/template/src/server/db/index.ts +3 -0
  330. package/template/src/server/db/init.ts +412 -0
  331. package/template/src/server/db/schema/api-endpoints.ts +23 -0
  332. package/template/src/server/db/schema/contents.ts +31 -0
  333. package/template/src/server/db/schema/disputes.ts +39 -0
  334. package/template/src/server/db/schema/index.ts +14 -0
  335. package/template/src/server/db/schema/notifications.ts +16 -0
  336. package/template/src/server/db/schema/orders.ts +30 -0
  337. package/template/src/server/db/schema/permission-audit-logs.ts +17 -0
  338. package/template/src/server/db/schema/permission-route-mappings.ts +22 -0
  339. package/template/src/server/db/schema/permissions.ts +17 -0
  340. package/template/src/server/db/schema/role-permissions.ts +22 -0
  341. package/template/src/server/db/schema/roles.ts +17 -0
  342. package/template/src/server/db/schema/tickets.ts +62 -0
  343. package/template/src/server/db/schema/todo-attachments.ts +22 -0
  344. package/template/src/server/db/schema/todos.ts +21 -0
  345. package/template/src/server/db/schema/user-roles.ts +17 -0
  346. package/template/src/server/db/seeds/index.ts +1 -0
  347. package/template/src/server/db/seeds/permission-data.ts +354 -0
  348. package/template/src/server/db/test-setup.ts +647 -0
  349. package/template/src/server/entries/cloudflare.ts +71 -0
  350. package/template/src/server/entries/node.ts +190 -0
  351. package/template/src/server/index.ts +62 -0
  352. package/template/src/server/middleware/__tests__/auth-simple.test.ts +147 -0
  353. package/template/src/server/middleware/__tests__/auth.test.ts +276 -0
  354. package/template/src/server/middleware/__tests__/captcha.test.ts +258 -0
  355. package/template/src/server/middleware/__tests__/error-handler.test.ts +364 -0
  356. package/template/src/server/middleware/__tests__/error-response-format.test.ts +80 -0
  357. package/template/src/server/middleware/__tests__/permission.test.ts +312 -0
  358. package/template/src/server/middleware/audit-log.ts +101 -0
  359. package/template/src/server/middleware/auth.ts +235 -0
  360. package/template/src/server/middleware/captcha.ts +166 -0
  361. package/template/src/server/middleware/cors.ts +30 -0
  362. package/template/src/server/middleware/error-handler.ts +135 -0
  363. package/template/src/server/middleware/index.ts +24 -0
  364. package/template/src/server/middleware/logger.ts +73 -0
  365. package/template/src/server/middleware/permission.ts +127 -0
  366. package/template/src/server/middleware/rate-limit.ts +69 -0
  367. package/template/src/server/middleware/realtime-env.ts +12 -0
  368. package/template/src/server/module-admin/__tests__/admin-routes.test.ts +360 -0
  369. package/template/src/server/module-admin/__tests__/admin-service.test.ts +222 -0
  370. package/template/src/server/module-admin/__tests__/audit-log-routes.test.ts +261 -0
  371. package/template/src/server/module-admin/__tests__/export-routes.test.ts +160 -0
  372. package/template/src/server/module-admin/__tests__/media-routes.test.ts +122 -0
  373. package/template/src/server/module-admin/module.ts +40 -0
  374. package/template/src/server/module-admin/routes/admin-notification-routes.ts +197 -0
  375. package/template/src/server/module-admin/routes/admin-routes.ts +20 -0
  376. package/template/src/server/module-admin/routes/auth-routes.ts +86 -0
  377. package/template/src/server/module-admin/routes/export-routes.ts +207 -0
  378. package/template/src/server/module-admin/routes/media-routes.ts +78 -0
  379. package/template/src/server/module-admin/routes/system-routes.ts +89 -0
  380. package/template/src/server/module-admin/routes/user-management-routes.ts +143 -0
  381. package/template/src/server/module-admin/services/admin-service.ts +268 -0
  382. package/template/src/server/module-captcha/__tests__/captcha-route.test.ts +35 -0
  383. package/template/src/server/module-captcha/__tests__/captcha-service.test.ts +53 -0
  384. package/template/src/server/module-captcha/module.ts +35 -0
  385. package/template/src/server/module-captcha/routes/captcha-routes.ts +68 -0
  386. package/template/src/server/module-captcha/services/captcha-service.ts +3 -0
  387. package/template/src/server/module-chat/__tests__/chat-routes.test.ts +39 -0
  388. package/template/src/server/module-chat/__tests__/chat-rpc.test.ts +185 -0
  389. package/template/src/server/module-chat/__tests__/chat-service.test.ts +64 -0
  390. package/template/src/server/module-chat/module.ts +27 -0
  391. package/template/src/server/module-chat/routes/chat-routes.ts +46 -0
  392. package/template/src/server/module-chat/services/chat-service.ts +38 -0
  393. package/template/src/server/module-content/__tests__/content-route.test.ts +40 -0
  394. package/template/src/server/module-content/__tests__/content-service.test.ts +107 -0
  395. package/template/src/server/module-content/module.ts +39 -0
  396. package/template/src/server/module-content/routes/content-routes.ts +182 -0
  397. package/template/src/server/module-content/routes/public-content-routes.ts +58 -0
  398. package/template/src/server/module-content/services/content-service.ts +224 -0
  399. package/template/src/server/module-dispute/__tests__/dispute-route.test.ts +43 -0
  400. package/template/src/server/module-dispute/__tests__/dispute-service.test.ts +135 -0
  401. package/template/src/server/module-dispute/module.ts +30 -0
  402. package/template/src/server/module-dispute/routes/dispute-routes.ts +153 -0
  403. package/template/src/server/module-dispute/services/dispute-service.ts +255 -0
  404. package/template/src/server/module-file/__tests__/file-routes.test.ts +284 -0
  405. package/template/src/server/module-file/__tests__/file-storage-service.test.ts +323 -0
  406. package/template/src/server/module-file/module.ts +28 -0
  407. package/template/src/server/module-file/routes/file-routes.ts +288 -0
  408. package/template/src/server/module-notifications/__tests__/notification-route-rpc.test.ts +375 -0
  409. package/template/src/server/module-notifications/__tests__/notification-service.test.ts +241 -0
  410. package/template/src/server/module-notifications/__tests__/sse-rpc.test.ts +289 -0
  411. package/template/src/server/module-notifications/module.ts +32 -0
  412. package/template/src/server/module-notifications/routes/notification-routes.ts +190 -0
  413. package/template/src/server/module-notifications/services/notification-service.ts +104 -0
  414. package/template/src/server/module-order/__tests__/order-route.test.ts +258 -0
  415. package/template/src/server/module-order/__tests__/order-service.test.ts +222 -0
  416. package/template/src/server/module-order/module.ts +30 -0
  417. package/template/src/server/module-order/routes/order-routes.ts +202 -0
  418. package/template/src/server/module-order/services/order-service.ts +268 -0
  419. package/template/src/server/module-permission/__tests__/permission-middleware.test.ts +90 -0
  420. package/template/src/server/module-permission/__tests__/permission-routes.test.ts +330 -0
  421. package/template/src/server/module-permission/__tests__/permission-service-impl.test.ts +388 -0
  422. package/template/src/server/module-permission/__tests__/permission-service.test.ts +190 -0
  423. package/template/src/server/module-permission/__tests__/role-routes.test.ts +215 -0
  424. package/template/src/server/module-permission/module.ts +68 -0
  425. package/template/src/server/module-permission/routes/audit-log-routes.ts +76 -0
  426. package/template/src/server/module-permission/routes/permission-routes.ts +184 -0
  427. package/template/src/server/module-permission/routes/role-routes.ts +263 -0
  428. package/template/src/server/module-permission/services/audit-log-service.ts +108 -0
  429. package/template/src/server/module-permission/services/permission-service-impl.ts +233 -0
  430. package/template/src/server/module-permission/services/permission-service.ts +256 -0
  431. package/template/src/server/module-permission/services/role-service.ts +122 -0
  432. package/template/src/server/module-ticket/__tests__/ticket-route.test.ts +173 -0
  433. package/template/src/server/module-ticket/__tests__/ticket-service.test.ts +201 -0
  434. package/template/src/server/module-ticket/module.ts +30 -0
  435. package/template/src/server/module-ticket/routes/ticket-routes.ts +210 -0
  436. package/template/src/server/module-ticket/services/ticket-service.ts +297 -0
  437. package/template/src/server/module-todos/__tests__/todo-service.test.ts +196 -0
  438. package/template/src/server/module-todos/__tests__/todos-file-upload.test.ts +439 -0
  439. package/template/src/server/module-todos/__tests__/todos-route-rpc.test.ts +575 -0
  440. package/template/src/server/module-todos/module.ts +30 -0
  441. package/template/src/server/module-todos/routes/todos-routes.ts +260 -0
  442. package/template/src/server/module-todos/services/todo-service.ts +202 -0
  443. package/template/src/server/route-registry.ts +47 -0
  444. package/template/src/server/test-utils/test-client.ts +66 -0
  445. package/template/src/server/test-utils/test-server.ts +131 -0
  446. package/template/src/server/types/bindings.ts +10 -0
  447. package/template/src/server/utils/__tests__/app-error.test.ts +374 -0
  448. package/template/src/server/utils/__tests__/auth.test.ts +76 -0
  449. package/template/src/server/utils/__tests__/captcha.test.ts +80 -0
  450. package/template/src/server/utils/__tests__/file-storage.test.ts +472 -0
  451. package/template/src/server/utils/__tests__/logger.test.ts +221 -0
  452. package/template/src/server/utils/__tests__/route-helpers.test.ts +264 -0
  453. package/template/src/server/utils/app-error.ts +355 -0
  454. package/template/src/server/utils/auth.ts +65 -0
  455. package/template/src/server/utils/captcha.ts +119 -0
  456. package/template/src/server/utils/date.ts +50 -0
  457. package/template/src/server/utils/env.ts +4 -0
  458. package/template/src/server/utils/file-storage.ts +462 -0
  459. package/template/src/server/utils/generate.ts +26 -0
  460. package/template/src/server/utils/id-helpers.ts +5 -0
  461. package/template/src/server/utils/logger.ts +139 -0
  462. package/template/src/server/utils/permission-utils.ts +6 -0
  463. package/template/src/server/utils/response.ts +40 -0
  464. package/template/src/server/utils/route-helpers.ts +200 -0
  465. package/template/src/server/utils/uuid.ts +8 -0
  466. package/template/src/server/utils/ws-helper.ts +30 -0
  467. package/template/src/shared/constants/index.ts +1 -0
  468. package/template/src/shared/constants/resource-types.ts +72 -0
  469. package/template/src/shared/core/__tests__/sse-client.test.ts +376 -0
  470. package/template/src/shared/core/__tests__/ws-client.test.ts +468 -0
  471. package/template/src/shared/core/api-request.ts +192 -0
  472. package/template/src/shared/core/api-schemas.ts +41 -0
  473. package/template/src/shared/core/index.ts +37 -0
  474. package/template/src/shared/core/module-manifest.ts +120 -0
  475. package/template/src/shared/core/protocol-types.ts +26 -0
  476. package/template/src/shared/core/sse-client.ts +185 -0
  477. package/template/src/shared/core/ws-client.ts +236 -0
  478. package/template/src/shared/hooks/index.ts +2 -0
  479. package/template/src/shared/hooks/useSSE.ts +57 -0
  480. package/template/src/shared/hooks/useWebSocket.ts +66 -0
  481. package/template/src/shared/index.ts +5 -0
  482. package/template/src/shared/modules/admin/index.ts +1 -0
  483. package/template/src/shared/modules/admin/schemas.ts +100 -0
  484. package/template/src/shared/modules/audit/index.ts +1 -0
  485. package/template/src/shared/modules/audit/schemas.ts +24 -0
  486. package/template/src/shared/modules/captcha/index.ts +1 -0
  487. package/template/src/shared/modules/captcha/schemas.ts +19 -0
  488. package/template/src/shared/modules/chat/index.ts +38 -0
  489. package/template/src/shared/modules/content/index.ts +1 -0
  490. package/template/src/shared/modules/content/schemas.ts +53 -0
  491. package/template/src/shared/modules/dispute/index.ts +1 -0
  492. package/template/src/shared/modules/dispute/schemas.ts +62 -0
  493. package/template/src/shared/modules/files/index.ts +11 -0
  494. package/template/src/shared/modules/files/schemas.ts +44 -0
  495. package/template/src/shared/modules/index.ts +70 -0
  496. package/template/src/shared/modules/notifications/index.ts +26 -0
  497. package/template/src/shared/modules/notifications/schemas.ts +73 -0
  498. package/template/src/shared/modules/order/index.ts +1 -0
  499. package/template/src/shared/modules/order/schemas.ts +63 -0
  500. package/template/src/shared/modules/permission/index.ts +42 -0
  501. package/template/src/shared/modules/permission/permission-dependencies.ts +50 -0
  502. package/template/src/shared/modules/permission/permissions.ts +275 -0
  503. package/template/src/shared/modules/permission/schemas.ts +92 -0
  504. package/template/src/shared/modules/permission/types.ts +23 -0
  505. package/template/src/shared/modules/role/index.ts +1 -0
  506. package/template/src/shared/modules/role/schemas.ts +46 -0
  507. package/template/src/shared/modules/ticket/index.ts +1 -0
  508. package/template/src/shared/modules/ticket/schemas.ts +77 -0
  509. package/template/src/shared/modules/todos/index.ts +20 -0
  510. package/template/src/shared/modules/todos/schemas.ts +65 -0
  511. package/template/src/shared/schemas/index.ts +79 -0
  512. package/template/src/types/global.d.ts +14 -0
  513. package/template/src/vite-env.d.ts +21 -0
  514. package/template/tailwind.config.js +11 -0
  515. package/template/tests/e2e/admin-crud.spec.ts +81 -0
  516. package/template/tests/e2e/case-o1.spec.ts +108 -0
  517. package/template/tests/e2e/global-setup.ts +73 -0
  518. package/template/tests/e2e/global-teardown.ts +28 -0
  519. package/template/tests/e2e/notification.spec.ts +458 -0
  520. package/template/tests/e2e/todo.spec.ts +623 -0
  521. package/template/tests/e2e/websocket.spec.ts +254 -0
  522. package/template/tsconfig.json +35 -0
  523. package/template/tsup.config.ts +95 -0
  524. package/template/vite-plugins.ts +113 -0
  525. package/template/vite.config.ts +96 -0
  526. package/template/vitest.config.ts +53 -0
  527. package/template/vitest.integration.config.ts +24 -0
  528. package/template/vitest.integration.setup.ts +22 -0
  529. package/template/vitest.setup.ts +74 -0
  530. package/template/wrangler.toml +33 -0
@@ -0,0 +1,154 @@
1
+ # Todo Application Template
2
+
3
+ A full-stack React + Hono application template with TypeScript, demonstrating best practices for monorepo-style architecture with single-port development.
4
+
5
+ ## Features
6
+
7
+ - **Frontend**: React with TypeScript, Vite
8
+ - **Backend**: Hono with TypeScript
9
+ - **Database**: SQLite with Drizzle ORM
10
+ - **State Management**: Zustand
11
+ - **Real-time**: WebSocket + SSE support
12
+ - **Testing**: Vitest (unit + integration tests)
13
+ - **Code Quality**: ESLint, Prettier, pre-commit hooks
14
+ - **Type Safety**: End-to-end type safety with Hono RPC
15
+
16
+ ## Architecture
17
+
18
+ ```
19
+ src/
20
+ ├── client/ # React frontend
21
+ │ ├── components/ # UI components
22
+ │ ├── stores/ # Zustand state management
23
+ │ ├── services/ # API clients (apiClient)
24
+ │ ├── hooks/ # Custom hooks
25
+ │ ├── pages/ # Page components
26
+ │ └── App.tsx
27
+ ├── server/ # Hono backend
28
+ │ ├── module-todos/ # Todo module
29
+ │ ├── module-chat/ # WebSocket chat module
30
+ │ ├── module-notifications/ # SSE notifications module
31
+ │ ├── core/ # Core services (runtime, realtime)
32
+ │ ├── middleware/ # Express middleware
33
+ │ ├── test-utils/ # Test utilities
34
+ │ └── entries/ # Entry points (node.ts, cloudflare.ts)
35
+ └── shared/ # Shared types
36
+ ├── core/ # Framework layer (ws-client, sse-client)
37
+ ├── modules/ # Business layer (chat, todos, notifications)
38
+ └── schemas/ # Unified exports
39
+ ```
40
+
41
+ ## Getting Started
42
+
43
+ ### Installation
44
+
45
+ ```bash
46
+ npm install
47
+ ```
48
+
49
+ ### Development
50
+
51
+ ```bash
52
+ npm run dev
53
+ ```
54
+
55
+ The application will be available at http://localhost:3010
56
+
57
+ ### Build
58
+
59
+ ```bash
60
+ npm run build
61
+ ```
62
+
63
+ ### Testing
64
+
65
+ ```bash
66
+ # Run all tests
67
+ npm test
68
+
69
+ # Run unit tests only
70
+ npm run test:unit
71
+
72
+ # Run integration tests only
73
+ npm run test:integration
74
+ ```
75
+
76
+ ## Key Concepts
77
+
78
+ ### Path Aliases
79
+
80
+ - `@shared/*` → src/shared/\*
81
+ - `@client/*` → src/client/\*
82
+ - `@server/*` → src/server/\*
83
+
84
+ ### Single-Port Development
85
+
86
+ Uses "@hono/vite-dev-server" to run both frontend and backend on port 3010.
87
+
88
+ ### Framework Layer vs Business Layer
89
+
90
+ The project has clear separation between framework and business layers:
91
+
92
+ - **Framework Layer** (`src/shared/core/`): Generic, reusable infrastructure
93
+ - **Business Layer** (`src/shared/modules/`): Business-specific schemas and protocols
94
+
95
+ ### Hono RPC
96
+
97
+ Provides type-safe API calls from frontend to backend:
98
+
99
+ ```typescript
100
+ import { apiClient } from '@client/services/apiClient'
101
+
102
+ // HTTP API
103
+ const response = await apiClient.api.todos.$get()
104
+ const result = await response.json()
105
+
106
+ // WebSocket
107
+ const ws = apiClient.api.chat.ws.$ws()
108
+ const result = await ws.call('echo', { message: 'hello' })
109
+
110
+ // SSE
111
+ const conn = await apiClient.api.notifications.stream.$sse()
112
+ conn.on('notification', n => console.log(n))
113
+ ```
114
+
115
+ ### Real-time Features
116
+
117
+ | Feature | Method | Type Safety | Testing |
118
+ | --------- | ------------------- | ----------- | ---------------- |
119
+ | HTTP API | `$get()`, `$post()` | ✅ | No server needed |
120
+ | WebSocket | `$ws()` | ✅ | Requires server |
121
+ | SSE | `$sse()` | ✅ | No server needed |
122
+
123
+ ### Module Structure
124
+
125
+ Backend is organized by feature modules:
126
+
127
+ - `module-todos/` - Todo CRUD
128
+ - `module-chat/` - WebSocket chat
129
+ - `module-notifications/` - SSE notifications
130
+
131
+ Each module contains:
132
+
133
+ - `routes/` - API endpoints
134
+ - `services/` - Business logic
135
+ - `__tests__/` - Unit tests
136
+
137
+ ## Pre-commit Hooks
138
+
139
+ The project uses Husky for Git hooks:
140
+
141
+ - **lint-staged** - Format staged files
142
+ - **npm test** - Run test suite
143
+ - **validate-all** - Custom validation script
144
+
145
+ ## Environment Variables
146
+
147
+ See `.env.example` for required environment variables.
148
+
149
+ ## Documentation
150
+
151
+ - `QUICKSTART.md` - Quick start guide
152
+ - `DESIGN.md` - Technical architecture
153
+ - `CLAUDE.md` - Development guidelines
154
+ - `.claude/rules/` - Detailed development constraints
@@ -0,0 +1,81 @@
1
+ COMPLETE PROJECT STRUCTURE
2
+ ==========================
3
+
4
+ template/
5
+ ├── .claude/
6
+ │ └── rules/
7
+ │ └── project-rules.md # Development guidelines
8
+
9
+ ├── .husky/
10
+ │ ├── pre-commit # Git pre-commit hook
11
+ │ └── _/
12
+ │ └── husky.sh # Husky utilities
13
+
14
+ ├── .vscode/
15
+ │ └── extensions.json # VS Code recommendations
16
+
17
+ ├── scripts/
18
+ │ └── validate-all.ts # Pre-commit validation script
19
+
20
+ ├── src/
21
+ │ ├── client/ # React Frontend
22
+ │ │ ├── components/
23
+ │ │ │ └── __tests__/
24
+ │ │ │ └── App.test.tsx # Component tests
25
+ │ │ ├── stores/
26
+ │ │ │ ├── todoStore.ts # Zustand store
27
+ │ │ │ └── __tests__/
28
+ │ │ │ └── todoStore.test.ts # Store tests
29
+ │ │ ├── services/
30
+ │ │ │ └── apiClient.ts # Hono RPC client
31
+ │ │ ├── test/
32
+ │ │ │ ├── setup.ts # Vitest setup
33
+ │ │ │ └── cleanup.ts # Test utilities
34
+ │ │ ├── App.tsx # Main Todo List component
35
+ │ │ ├── main.tsx # React entry point
36
+ │ │ └── index.css # Global styles
37
+ │ │
38
+ │ ├── server/ # Hono Backend
39
+ │ │ ├── module-todos/ # Todo feature module
40
+ │ │ │ ├── routes/
41
+ │ │ │ │ └── todos-routes.ts # API endpoints (Hono RPC)
42
+ │ │ │ ├── services/
43
+ │ │ │ │ └── todo-service.ts # Business logic
44
+ │ │ │ └── __tests__/
45
+ │ │ │ └── todo-service.test.ts # Service unit tests
46
+ │ │ ├── shared/
47
+ │ │ │ ├── db.ts # Database connection
48
+ │ │ │ └── schema.ts # Drizzle ORM schema
49
+ │ │ ├── integration/
50
+ │ │ │ └── todos-api.test.ts # API integration tests
51
+ │ │ └── index.ts # Server entry point
52
+ │ │
53
+ │ ├── shared/ # Shared Types
54
+ │ │ ├── types.ts # TypeScript interfaces
55
+ │ │ └── schemas.ts # Zod validation schemas
56
+ │ │
57
+ │ └── vite-env.d.ts # Vite type declarations
58
+
59
+ ├── Configuration Files
60
+ │ ├── package.json # Dependencies and scripts
61
+ │ ├── vite.config.ts # Vite + Hono dev server
62
+ │ ├── tsconfig.json # TypeScript config
63
+ │ ├── vitest.config.ts # Unit test config
64
+ │ ├── vitest.integration.config.ts # Integration test config
65
+ │ ├── eslint.config.js # ESLint rules
66
+ │ ├── .prettierrc # Prettier config
67
+ │ ├── .prettierignore # Prettier ignore
68
+ │ ├── .gitignore # Git ignore patterns
69
+ │ ├── .env.example # Environment variables template
70
+ │ └── index.html # HTML entry point
71
+
72
+ └── Documentation
73
+ ├── README.md # User documentation
74
+ ├── QUICKSTART.md # Quick start guide
75
+ ├── DESIGN.md # Architecture documentation
76
+ ├── PROJECT_SUMMARY.md # Project summary
77
+ ├── CLAUDE.md # Claude Code guidelines
78
+ └── STRUCTURE.txt # This file
79
+
80
+ TOTAL FILES: 40+
81
+ ================================================================================
@@ -0,0 +1,13 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <link rel="icon" type="image/svg+xml" href="/vite.svg" />
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
+ <title>Admin Dashboard</title>
8
+ </head>
9
+ <body>
10
+ <div id="root"></div>
11
+ <script type="module" src="/src/admin/main.tsx"></script>
12
+ </body>
13
+ </html>
@@ -0,0 +1,33 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head><title>Auth Inject</title></head>
4
+ <body>
5
+ <script>
6
+ localStorage.setItem('ops-storage', JSON.stringify({
7
+ "state": {
8
+ "user": {
9
+ "id": "1",
10
+ "username": "superadmin",
11
+ "email": "admin@biomimic.com",
12
+ "role": "super_admin",
13
+ "avatar": null,
14
+ "permissions": [
15
+ "user:view","user:create","user:edit","user:delete",
16
+ "content:view","content:create","content:edit","content:delete",
17
+ "system:settings","system:logs","system:monitor",
18
+ "data:export","data:import",
19
+ "order:view","order:process",
20
+ "ticket:view","ticket:reply","ticket:close",
21
+ "dispute:view","dispute:create","dispute:edit","dispute:delete","dispute:resolve",
22
+ "notification:view","notification:create","notification:edit"
23
+ ]
24
+ },
25
+ "token": "fake-test-token-for-ui-testing",
26
+ "isAuthenticated": true
27
+ },
28
+ "version": 0
29
+ }));
30
+ window.location.href = '/ops/dashboard';
31
+ </script>
32
+ </body>
33
+ </html>
@@ -0,0 +1,12 @@
1
+ export default {
2
+ extends: ['@commitlint/config-conventional'],
3
+ rules: {
4
+ 'type-enum': [
5
+ 2,
6
+ 'always',
7
+ ['feat', 'fix', 'docs', 'style', 'refactor', 'test', 'chore', 'revert'],
8
+ ],
9
+ 'subject-max-length': [2, 'always', 80],
10
+ 'body-max-line-length': [2, 'always', 200],
11
+ },
12
+ }
@@ -0,0 +1,279 @@
1
+ # 权限管理系统架构文档
2
+
3
+ ## 系统概述
4
+
5
+ 本权限管理系统采用 RBAC(基于角色的访问控制)模型,实现了细粒度的权限控制,支持按钮级别的显示/隐藏。
6
+
7
+ ## 核心概念
8
+
9
+ ### 1. 角色 (Role)
10
+
11
+ 系统定义了三种角色:
12
+
13
+ - **超级管理员 (super_admin)**:拥有所有权限,可以管理用户、系统设置等
14
+ - **客服人员 (customer_service)**:拥有订单处理、工单管理等客服相关权限
15
+ - **普通用户 (user)**:只能查看基本内容
16
+
17
+ ### 2. 权限 (Permission)
18
+
19
+ 权限按照功能模块分类:
20
+
21
+ - **用户管理**:user:view, user:create, user:edit, user:delete
22
+ - **内容管理**:content:view, content:create, content:edit, content:delete
23
+ - **系统管理**:system:settings, system:logs, system:monitor
24
+ - **数据管理**:data:export, data:import
25
+ - **订单管理**:order:view, order:process
26
+ - **工单管理**:ticket:view, ticket:reply, ticket:close
27
+
28
+ ### 3. 权限检查模式
29
+
30
+ - **单个权限检查**:检查用户是否拥有某个特定权限
31
+ - **多权限检查(全部)**:用户必须拥有所有指定权限
32
+ - **多权限检查(任一)**:用户只需拥有其中一个权限
33
+
34
+ ## 架构设计
35
+
36
+ ### 后端架构
37
+
38
+ ```
39
+ ┌─────────────────────────────────────────────────────────┐
40
+ │ API Routes │
41
+ │ /api/admin/permissions/roles │
42
+ │ /api/admin/permissions │
43
+ │ /api/admin/permissions/me │
44
+ └─────────────────────────────────────────────────────────┘
45
+
46
+
47
+ ┌─────────────────────────────────────────────────────────┐
48
+ │ Permission Service │
49
+ │ - getAllRoles() │
50
+ │ - getAllPermissions() │
51
+ │ - getUserPermissions() │
52
+ │ - validatePermissions() │
53
+ └─────────────────────────────────────────────────────────┘
54
+
55
+
56
+ ┌─────────────────────────────────────────────────────────┐
57
+ │ Auth Middleware │
58
+ │ - authMiddleware() │
59
+ │ - requireSuperAdminMiddleware() │
60
+ │ - requirePermissionsMiddleware() │
61
+ └─────────────────────────────────────────────────────────┘
62
+
63
+
64
+ ┌─────────────────────────────────────────────────────────┐
65
+ │ Shared Permission Definitions │
66
+ │ - Role enum │
67
+ │ - Permission enum │
68
+ │ - ROLE_PERMISSIONS mapping │
69
+ │ - Permission helper functions │
70
+ └─────────────────────────────────────────────────────────┘
71
+ ```
72
+
73
+ ### 前端架构
74
+
75
+ ```
76
+ ┌─────────────────────────────────────────────────────────┐
77
+ │ PermissionProvider │
78
+ │ - 提供权限上下文 │
79
+ │ - 自动获取用户权限 │
80
+ │ - 管理权限状态 │
81
+ └─────────────────────────────────────────────────────────┘
82
+
83
+
84
+ ┌─────────────────────────────────────────────────────────┐
85
+ │ usePermissions Hook │
86
+ │ - hasPermission() │
87
+ │ - hasAnyPermission() │
88
+ │ - hasAllPermissions() │
89
+ │ - refreshPermissions() │
90
+ └─────────────────────────────────────────────────────────┘
91
+
92
+
93
+ ┌─────────────────────────────────────────────────────────┐
94
+ │ Permission Components │
95
+ │ - PermissionGuard:基础权限控制组件 │
96
+ │ - Can:声明式权限组件 │
97
+ │ - Cannot:反向权限组件 │
98
+ │ - PermissionButton:权限按钮组件 │
99
+ └─────────────────────────────────────────────────────────┘
100
+ ```
101
+
102
+ ## 数据流
103
+
104
+ ### 1. 用户登录流程
105
+
106
+ ```
107
+ 用户登录
108
+
109
+ 验证用户名密码
110
+
111
+ 获取用户角色
112
+
113
+ 根据角色获取权限列表
114
+
115
+ 生成 JWT Token(包含用户ID和角色)
116
+
117
+ 返回用户信息和权限
118
+ ```
119
+
120
+ ### 2. 权限检查流程
121
+
122
+ ```
123
+ 前端组件渲染
124
+
125
+ 调用 usePermissions Hook
126
+
127
+ 从 PermissionProvider 获取权限
128
+
129
+ PermissionGuard 组件检查权限
130
+
131
+ 显示或隐藏组件
132
+ ```
133
+
134
+ ### 3. API 请求流程
135
+
136
+ ```
137
+ 前端发起请求
138
+
139
+ 携带 Token 到后端
140
+
141
+ Auth Middleware 验证 Token
142
+
143
+ 提取用户信息和权限
144
+
145
+ 检查路由权限要求
146
+
147
+ 允许或拒绝访问
148
+ ```
149
+
150
+ ## 文件结构
151
+
152
+ ```
153
+ template/
154
+ ├── src/
155
+ │ ├── shared/
156
+ │ │ └── modules/
157
+ │ │ └── admin/
158
+ │ │ ├── permissions.ts # 权限定义和工具函数
159
+ │ │ ├── schemas.ts # 权限相关 Schema
160
+ │ │ └── index.ts # 导出
161
+ │ ├── server/
162
+ │ │ ├── middleware/
163
+ │ │ │ └── auth.ts # 认证和权限中间件
164
+ │ │ ├── module-admin/
165
+ │ │ │ ├── routes/
166
+ │ │ │ │ └── admin-routes.ts # 权限 API 路由
167
+ │ │ │ └── services/
168
+ │ │ │ └── permission-service.ts # 权限服务
169
+ │ │ └── utils/
170
+ │ │ └── auth.ts # 认证工具函数
171
+ │ └── admin/
172
+ │ ├── hooks/
173
+ │ │ └── usePermissions.tsx # 权限 Hook
174
+ │ ├── components/
175
+ │ │ └── PermissionGuard.tsx # 权限组件
176
+ │ ├── pages/
177
+ │ │ └── PermissionsPage.tsx # 权限管理页面
178
+ │ └── config/
179
+ │ └── permissions.ts # 权限配置
180
+ └── docs/
181
+ ├── PERMISSION_SYSTEM.md # 使用文档
182
+ └── PERMISSION_EXAMPLES.md # 示例文档
183
+ ```
184
+
185
+ ## 安全考虑
186
+
187
+ ### 1. 前后端双重验证
188
+
189
+ - **前端**:控制UI显示,提升用户体验
190
+ - **后端**:实际权限验证,确保安全
191
+
192
+ ### 2. 权限缓存
193
+
194
+ - 前端缓存用户权限,减少API调用
195
+ - 用户角色变更时自动刷新权限
196
+
197
+ ### 3. Token 安全
198
+
199
+ - Token 包含用户ID和角色信息
200
+ - Token 过期时间合理设置
201
+ - 敏感操作需要重新验证
202
+
203
+ ## 扩展性
204
+
205
+ ### 1. 添加新权限
206
+
207
+ 1. 在 `permissions.ts` 中添加新权限枚举
208
+ 2. 在 `PERMISSION_LABELS` 中添加权限说明
209
+ 3. 在 `PERMISSION_CATEGORIES` 中归类权限
210
+ 4. 在 `ROLE_PERMISSIONS` 中为角色分配权限
211
+
212
+ ### 2. 添加新角色
213
+
214
+ 1. 在 `Role` 枚举中添加新角色
215
+ 2. 在 `ROLE_LABELS` 中添加角色说明
216
+ 3. 在 `ROLE_PERMISSIONS` 中定义角色权限
217
+
218
+ ### 3. 自定义权限检查
219
+
220
+ ```typescript
221
+ // 自定义权限检查逻辑
222
+ function customPermissionCheck(user: User, resource: string): boolean {
223
+ // 实现自定义逻辑
224
+ return true
225
+ }
226
+ ```
227
+
228
+ ## 性能优化
229
+
230
+ ### 1. 前端优化
231
+
232
+ - 使用 Context API 避免重复请求
233
+ - 权限数据缓存在本地存储
234
+ - 按需加载权限配置
235
+
236
+ ### 2. 后端优化
237
+
238
+ - 权限数据缓存在内存中
239
+ - 使用索引优化权限查询
240
+ - 批量权限检查减少数据库查询
241
+
242
+ ## 测试策略
243
+
244
+ ### 1. 单元测试
245
+
246
+ - 测试权限工具函数
247
+ - 测试权限中间件
248
+ - 测试权限组件
249
+
250
+ ### 2. 集成测试
251
+
252
+ - 测试完整的权限检查流程
253
+ - 测试不同角色的访问控制
254
+
255
+ ### 3. E2E 测试
256
+
257
+ - 测试用户登录和权限获取
258
+ - 测试权限控制的UI显示
259
+
260
+ ## 最佳实践
261
+
262
+ 1. **最小权限原则**:只授予必要的权限
263
+ 2. **双重验证**:前后端都要进行权限检查
264
+ 3. **明确提示**:无权限时提供友好的提示
265
+ 4. **定期审计**:定期检查和清理不必要的权限
266
+ 5. **文档维护**:及时更新权限文档
267
+
268
+ ## 监控和日志
269
+
270
+ - 记录权限检查失败的操作
271
+ - 监控权限相关的异常
272
+ - 分析权限使用情况
273
+
274
+ ## 未来规划
275
+
276
+ 1. **动态权限**:支持运行时动态分配权限
277
+ 2. **权限组**:支持权限组管理
278
+ 3. **数据权限**:支持数据级别的权限控制
279
+ 4. **权限继承**:支持角色权限继承