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,86 @@
1
+ #!/bin/bash
2
+
3
+ # Claude Code Pre-Tool-Use Check Script
4
+ # 在执行 Bash 命令前检查是否包含禁止的操作
5
+
6
+ set -e
7
+
8
+ # 读取工具输入(从 stdin)
9
+ TOOL_INPUT=$(cat)
10
+
11
+ # 检查是否是 Bash 工具
12
+ TOOL_NAME=$(echo "$TOOL_INPUT" | jq -r '.tool_name // empty')
13
+
14
+ if [ "$TOOL_NAME" != "Bash" ]; then
15
+ # 不是 Bash 工具,直接通过
16
+ exit 0
17
+ fi
18
+
19
+ # 提取命令
20
+ COMMAND=$(echo "$TOOL_INPUT" | jq -r '.tool_input.command // empty')
21
+
22
+ if [ -z "$COMMAND" ]; then
23
+ # 没有命令,直接通过
24
+ exit 0
25
+ fi
26
+
27
+ # 检查是否包含 --no-verify 或 -n
28
+ if echo "$COMMAND" | grep -qE 'git\s+commit.*(--no-verify|-n)'; then
29
+ echo ""
30
+ echo "❌ 检测到禁止的命令!"
31
+ echo ""
32
+ echo "🚫 禁止使用 'git commit --no-verify' 或 'git commit -n'"
33
+ echo ""
34
+ echo "原因:"
35
+ echo " • Pre-commit hooks 确保代码质量(格式检查、测试运行)"
36
+ echo " • 跳过 hooks 会将低质量代码提交到仓库"
37
+ echo " • 影响团队协作和代码审查"
38
+ echo ""
39
+ echo "正确做法:"
40
+ echo " ✅ git commit -m \"your message\""
41
+ echo ""
42
+ echo "如果 hooks 失败:"
43
+ echo " 1. 运行测试失败 → 修复测试后再提交"
44
+ echo " 2. 格式检查失败 → 运行 npm run format 修复"
45
+ echo " 3. 验证器失败 → 修复验证问题"
46
+ echo ""
47
+ echo "📖 详细说明: .claude/rules/git-workflow.md"
48
+ echo ""
49
+ exit 1
50
+ fi
51
+
52
+ # 检查其他禁止的 git 操作
53
+ # 先检查是否包含 --force-with-lease(允许)
54
+ if echo "$COMMAND" | grep -qE 'git\s+push.*--force-with-lease'; then
55
+ # --force-with-lease 是安全的,允许通过
56
+ :
57
+ elif echo "$COMMAND" | grep -qE 'git\s+push.*--force'; then
58
+ echo ""
59
+ echo "❌ 检测到禁止的命令!"
60
+ echo ""
61
+ echo "🚫 禁止使用 'git push --force'"
62
+ echo ""
63
+ echo "原因:"
64
+ echo " • 强制推送会覆盖远程仓库的历史"
65
+ echo " • 可能导致其他开发者的工作丢失"
66
+ echo " • 破坏团队协作"
67
+ echo ""
68
+ echo "替代方案:"
69
+ echo " ✅ git push --force-with-lease (更安全的强制推送)"
70
+ echo " ✅ 先 pull 再 push"
71
+ echo ""
72
+ exit 1
73
+ fi
74
+
75
+ # 检查是否直接修改 .husky 目录
76
+ if echo "$COMMAND" | grep -qE '(rm|mv|chmod|chown).*\.husky'; then
77
+ echo ""
78
+ echo "⚠️ 警告:正在修改 .husky 目录"
79
+ echo ""
80
+ echo "这可能会影响 Git hooks 的正常运行。"
81
+ echo "请确保你知道自己在做什么。"
82
+ echo ""
83
+ fi
84
+
85
+ # 所有检查通过
86
+ exit 0
@@ -0,0 +1,73 @@
1
+ #!/bin/bash
2
+
3
+ # 测试 pre-tool-use-check.sh 脚本
4
+
5
+ set -e
6
+
7
+ SCRIPT_PATH=".claude/scripts/pre-tool-use-check.sh"
8
+
9
+ echo "🧪 测试 pre-tool-use-check.sh 脚本"
10
+ echo "=================================================="
11
+ echo ""
12
+
13
+ # 测试 1: 正常的 git commit 命令(应该通过)
14
+ echo "📋 测试 1: 正常的 git commit 命令"
15
+ echo "--------------------------------------------------"
16
+ echo '{"tool_name": "Bash", "tool_input": {"command": "git commit -m \"test message\""}}' | bash "$SCRIPT_PATH"
17
+ if [ $? -eq 0 ]; then
18
+ echo "✅ 测试通过:正常命令被允许"
19
+ else
20
+ echo "❌ 测试失败:正常命令被拒绝"
21
+ exit 1
22
+ fi
23
+ echo ""
24
+
25
+ # 测试 2: git commit --no-verify 命令(应该被拒绝)
26
+ echo "📋 测试 2: git commit --no-verify 命令"
27
+ echo "--------------------------------------------------"
28
+ if echo '{"tool_name": "Bash", "tool_input": {"command": "git commit --no-verify -m \"test\""}}' | bash "$SCRIPT_PATH" 2>&1; then
29
+ echo "❌ 测试失败:--no-verify 命令被允许"
30
+ exit 1
31
+ else
32
+ echo "✅ 测试通过:--no-verify 命令被拒绝"
33
+ fi
34
+ echo ""
35
+
36
+ # 测试 3: git push --force 命令(应该被拒绝)
37
+ echo "📋 测试 3: git push --force 命令"
38
+ echo "--------------------------------------------------"
39
+ if echo '{"tool_name": "Bash", "tool_input": {"command": "git push --force origin main"}}' | bash "$SCRIPT_PATH" 2>&1; then
40
+ echo "❌ 测试失败:--force 命令被允许"
41
+ exit 1
42
+ else
43
+ echo "✅ 测试通过:--force 命令被拒绝"
44
+ fi
45
+ echo ""
46
+
47
+ # 测试 4: 非 Bash 工具(应该通过)
48
+ echo "📋 测试 4: 非 Bash 工具"
49
+ echo "--------------------------------------------------"
50
+ echo '{"tool_name": "Write", "tool_input": {"file_path": "/tmp/test.txt"}}' | bash "$SCRIPT_PATH"
51
+ if [ $? -eq 0 ]; then
52
+ echo "✅ 测试通过:非 Bash 工具被允许"
53
+ else
54
+ echo "❌ 测试失败:非 Bash 工具被拒绝"
55
+ exit 1
56
+ fi
57
+ echo ""
58
+
59
+ # 测试 5: git push --force-with-lease(应该通过)
60
+ echo "📋 测试 5: git push --force-with-lease 命令"
61
+ echo "--------------------------------------------------"
62
+ echo '{"tool_name": "Bash", "tool_input": {"command": "git push --force-with-lease origin main"}}' | bash "$SCRIPT_PATH"
63
+ if [ $? -eq 0 ]; then
64
+ echo "✅ 测试通过:--force-with-lease 命令被允许"
65
+ else
66
+ echo "❌ 测试失败:--force-with-lease 命令被拒绝"
67
+ exit 1
68
+ fi
69
+ echo ""
70
+
71
+ echo "=================================================="
72
+ echo "✅ 所有测试通过!"
73
+ echo "=================================================="
@@ -0,0 +1,38 @@
1
+ #!/bin/bash
2
+
3
+ # 增量校验脚本 - 只针对 git 修改的文件
4
+
5
+ set -e
6
+
7
+ echo "🚀 Running incremental validation for git staged files..."
8
+ echo ""
9
+
10
+ # 获取所有修改的 ts/tsx 文件(移除 template/ 前缀)
11
+ STAGED_FILES=$(git diff --cached --name-only --diff-filter=ACM | grep -E '\.(ts|tsx)$' | sed 's|^template/||' || true)
12
+ MODIFIED_FILES=$(git diff --name-only --diff-filter=ACM | grep -E '\.(ts|tsx)$' | sed 's|^template/||' || true)
13
+
14
+ ALL_FILES="$STAGED_FILES $MODIFIED_FILES"
15
+
16
+ if [ -z "$ALL_FILES" ]; then
17
+ echo "✅ No TypeScript files to validate"
18
+ exit 0
19
+ fi
20
+
21
+ echo "📁 Files to validate:"
22
+ for file in $ALL_FILES; do
23
+ echo " - $file"
24
+ done
25
+ echo ""
26
+
27
+ # 运行 ESLint 只针对修改的文件
28
+ echo "🔍 Running ESLint on modified files..."
29
+ if [ -n "$STAGED_FILES" ]; then
30
+ npx eslint $STAGED_FILES --max-warnings=0 || true
31
+ fi
32
+
33
+ if [ -n "$MODIFIED_FILES" ]; then
34
+ npx eslint $MODIFIED_FILES --max-warnings=0 || true
35
+ fi
36
+
37
+ echo ""
38
+ echo "✅ Incremental validation completed!"
@@ -0,0 +1,32 @@
1
+ {
2
+ "PreToolUse": [
3
+ {
4
+ "matcher": {
5
+ "tools": ["*"]
6
+ },
7
+ "hooks": [
8
+ {
9
+ "type": "command",
10
+ "command": "bash .claude/scripts/pre-tool-use-check.sh"
11
+ }
12
+ ]
13
+ }
14
+ ],
15
+ "PostToolUse": [
16
+ {
17
+ "matcher": {
18
+ "tools": ["Write", "Edit"]
19
+ },
20
+ "hooks": [
21
+ {
22
+ "type": "command",
23
+ "command": "bash .claude/scripts/post-edit-check.sh"
24
+ },
25
+ {
26
+ "type": "command",
27
+ "command": "npx tsx .claude/scripts/check-duplicate-types.ts"
28
+ }
29
+ ]
30
+ }
31
+ ]
32
+ }
@@ -0,0 +1,408 @@
1
+ ---
2
+ name: Writing Hookify Rules
3
+ description: This skill should be used when the user asks to "create a hookify rule", "write a hook rule", "configure hookify", "add a hookify rule", or needs guidance on hookify rule syntax and patterns.
4
+ version: 0.1.0
5
+ ---
6
+
7
+ # Writing Hookify Rules
8
+
9
+ ## Overview
10
+
11
+ Hookify rules are markdown files with YAML frontmatter that define patterns to watch for and messages to show when those patterns match. Rules are stored in `.claude/hookify.{rule-name}.local.md` files.
12
+
13
+ ## Rule File Format
14
+
15
+ ### Basic Structure
16
+
17
+ ```markdown
18
+ ---
19
+ name: rule-identifier
20
+ enabled: true
21
+ event: bash|file|stop|prompt|all
22
+ pattern: regex-pattern-here
23
+ ---
24
+
25
+ Message to show Claude when this rule triggers.
26
+ Can include markdown formatting, warnings, suggestions, etc.
27
+ ```
28
+
29
+ ### Frontmatter Fields
30
+
31
+ **name** (required): Unique identifier for the rule
32
+
33
+ - Use kebab-case: `warn-dangerous-rm`, `block-console-log`
34
+ - Be descriptive and action-oriented
35
+ - Start with verb: warn, prevent, block, require, check
36
+
37
+ **enabled** (required): Boolean to activate/deactivate
38
+
39
+ - `true`: Rule is active
40
+ - `false`: Rule is disabled (won't trigger)
41
+ - Can toggle without deleting rule
42
+
43
+ **event** (required): Which hook event to trigger on
44
+
45
+ - `bash`: Bash tool commands
46
+ - `file`: Edit, Write, MultiEdit tools
47
+ - `stop`: When agent wants to stop
48
+ - `prompt`: When user submits a prompt
49
+ - `all`: All events
50
+
51
+ **action** (optional): What to do when rule matches
52
+
53
+ - `warn`: Show message but allow operation (default)
54
+ - `block`: Prevent operation (PreToolUse) or stop session (Stop events)
55
+ - If omitted, defaults to `warn`
56
+
57
+ **pattern** (simple format): Regex pattern to match
58
+
59
+ - Used for simple single-condition rules
60
+ - Matches against command (bash) or new_text (file)
61
+ - Python regex syntax
62
+
63
+ **Example:**
64
+
65
+ ```yaml
66
+ event: bash
67
+ pattern: rm\s+-rf
68
+ ```
69
+
70
+ ### Advanced Format (Multiple Conditions)
71
+
72
+ For complex rules with multiple conditions:
73
+
74
+ ```markdown
75
+ ---
76
+ name: warn-env-file-edits
77
+ enabled: true
78
+ event: file
79
+ conditions:
80
+ - field: file_path
81
+ operator: regex_match
82
+ pattern: \.env$
83
+ - field: new_text
84
+ operator: contains
85
+ pattern: API_KEY
86
+ ---
87
+
88
+ You're adding an API key to a .env file. Ensure this file is in .gitignore!
89
+ ```
90
+
91
+ **Condition fields:**
92
+
93
+ - `field`: Which field to check
94
+ - For bash: `command`
95
+ - For file: `file_path`, `new_text`, `old_text`, `content`
96
+ - `operator`: How to match
97
+ - `regex_match`: Regex pattern matching
98
+ - `contains`: Substring check
99
+ - `equals`: Exact match
100
+ - `not_contains`: Substring must NOT be present
101
+ - `starts_with`: Prefix check
102
+ - `ends_with`: Suffix check
103
+ - `pattern`: Pattern or string to match
104
+
105
+ **All conditions must match for rule to trigger.**
106
+
107
+ ## Message Body
108
+
109
+ The markdown content after frontmatter is shown to Claude when the rule triggers.
110
+
111
+ **Good messages:**
112
+
113
+ - Explain what was detected
114
+ - Explain why it's problematic
115
+ - Suggest alternatives or best practices
116
+ - Use formatting for clarity (bold, lists, etc.)
117
+
118
+ **Example:**
119
+
120
+ ```markdown
121
+ ⚠️ **Console.log detected!**
122
+
123
+ You're adding console.log to production code.
124
+
125
+ **Why this matters:**
126
+
127
+ - Debug logs shouldn't ship to production
128
+ - Console.log can expose sensitive data
129
+ - Impacts browser performance
130
+
131
+ **Alternatives:**
132
+
133
+ - Use a proper logging library
134
+ - Remove before committing
135
+ - Use conditional debug builds
136
+ ```
137
+
138
+ ## Event Type Guide
139
+
140
+ ### bash Events
141
+
142
+ Match Bash command patterns:
143
+
144
+ ```markdown
145
+ ---
146
+ event: bash
147
+ pattern: sudo\s+|rm\s+-rf|chmod\s+777
148
+ ---
149
+
150
+ Dangerous command detected!
151
+ ```
152
+
153
+ **Common patterns:**
154
+
155
+ - Dangerous commands: `rm\s+-rf`, `dd\s+if=`, `mkfs`
156
+ - Privilege escalation: `sudo\s+`, `su\s+`
157
+ - Permission issues: `chmod\s+777`, `chown\s+root`
158
+
159
+ ### file Events
160
+
161
+ Match Edit/Write/MultiEdit operations:
162
+
163
+ ```markdown
164
+ ---
165
+ event: file
166
+ pattern: console\.log\(|eval\(|innerHTML\s*=
167
+ ---
168
+
169
+ Potentially problematic code pattern detected!
170
+ ```
171
+
172
+ **Match on different fields:**
173
+
174
+ ```markdown
175
+ ---
176
+ event: file
177
+ conditions:
178
+ - field: file_path
179
+ operator: regex_match
180
+ pattern: \.tsx?$
181
+ - field: new_text
182
+ operator: regex_match
183
+ pattern: console\.log\(
184
+ ---
185
+
186
+ Console.log in TypeScript file!
187
+ ```
188
+
189
+ **Common patterns:**
190
+
191
+ - Debug code: `console\.log\(`, `debugger`, `print\(`
192
+ - Security risks: `eval\(`, `innerHTML\s*=`, `dangerouslySetInnerHTML`
193
+ - Sensitive files: `\.env$`, `credentials`, `\.pem$`
194
+ - Generated files: `node_modules/`, `dist/`, `build/`
195
+
196
+ ### stop Events
197
+
198
+ Match when agent wants to stop (completion checks):
199
+
200
+ ```markdown
201
+ ---
202
+ event: stop
203
+ pattern: .*
204
+ ---
205
+
206
+ Before stopping, verify:
207
+
208
+ - [ ] Tests were run
209
+ - [ ] Build succeeded
210
+ - [ ] Documentation updated
211
+ ```
212
+
213
+ **Use for:**
214
+
215
+ - Reminders about required steps
216
+ - Completion checklists
217
+ - Process enforcement
218
+
219
+ ### prompt Events
220
+
221
+ Match user prompt content (advanced):
222
+
223
+ ```markdown
224
+ ---
225
+ event: prompt
226
+ conditions:
227
+ - field: user_prompt
228
+ operator: contains
229
+ pattern: deploy to production
230
+ ---
231
+
232
+ Production deployment checklist:
233
+
234
+ - [ ] Tests passing?
235
+ - [ ] Reviewed by team?
236
+ - [ ] Monitoring ready?
237
+ ```
238
+
239
+ ## Pattern Writing Tips
240
+
241
+ ### Regex Basics
242
+
243
+ **Literal characters:** Most characters match themselves
244
+
245
+ - `rm` matches "rm"
246
+ - `console.log` matches "console.log"
247
+
248
+ **Special characters need escaping:**
249
+
250
+ - `.` (any char) → `\.` (literal dot)
251
+ - `(` `)` → `\(` `\)` (literal parens)
252
+ - `[` `]` → `\[` `\]` (literal brackets)
253
+
254
+ **Common metacharacters:**
255
+
256
+ - `\s` - whitespace (space, tab, newline)
257
+ - `\d` - digit (0-9)
258
+ - `\w` - word character (a-z, A-Z, 0-9, \_)
259
+ - `.` - any character
260
+ - `+` - one or more
261
+ - `*` - zero or more
262
+ - `?` - zero or one
263
+ - `|` - OR
264
+
265
+ **Examples:**
266
+
267
+ ```
268
+ rm\s+-rf Matches: rm -rf, rm -rf
269
+ console\.log\( Matches: console.log(
270
+ (eval|exec)\( Matches: eval( or exec(
271
+ chmod\s+777 Matches: chmod 777, chmod 777
272
+ API_KEY\s*= Matches: API_KEY=, API_KEY =
273
+ ```
274
+
275
+ ### Testing Patterns
276
+
277
+ Test regex patterns before using:
278
+
279
+ ```bash
280
+ python3 -c "import re; print(re.search(r'your_pattern', 'test text'))"
281
+ ```
282
+
283
+ Or use online regex testers (regex101.com with Python flavor).
284
+
285
+ ### Common Pitfalls
286
+
287
+ **Too broad:**
288
+
289
+ ```yaml
290
+ pattern: log # Matches "log", "login", "dialog", "catalog"
291
+ ```
292
+
293
+ Better: `console\.log\(|logger\.`
294
+
295
+ **Too specific:**
296
+
297
+ ```yaml
298
+ pattern: rm -rf /tmp # Only matches exact path
299
+ ```
300
+
301
+ Better: `rm\s+-rf`
302
+
303
+ **Escaping issues:**
304
+
305
+ - YAML quoted strings: `"pattern"` requires double backslashes `\\s`
306
+ - YAML unquoted: `pattern: \s` works as-is
307
+ - **Recommendation**: Use unquoted patterns in YAML
308
+
309
+ ## File Organization
310
+
311
+ **Location:** All rules in `.claude/` directory
312
+ **Naming:** `.claude/hookify.{descriptive-name}.local.md`
313
+ **Gitignore:** Add `.claude/*.local.md` to `.gitignore`
314
+
315
+ **Good names:**
316
+
317
+ - `hookify.dangerous-rm.local.md`
318
+ - `hookify.console-log.local.md`
319
+ - `hookify.require-tests.local.md`
320
+ - `hookify.sensitive-files.local.md`
321
+
322
+ **Bad names:**
323
+
324
+ - `hookify.rule1.local.md` (not descriptive)
325
+ - `hookify.md` (missing .local)
326
+ - `danger.local.md` (missing hookify prefix)
327
+
328
+ ## Workflow
329
+
330
+ ### Creating a Rule
331
+
332
+ 1. Identify unwanted behavior
333
+ 2. Determine which tool is involved (Bash, Edit, etc.)
334
+ 3. Choose event type (bash, file, stop, etc.)
335
+ 4. Write regex pattern
336
+ 5. Create `.claude/hookify.{name}.local.md` file in project root
337
+ 6. Test immediately - rules are read dynamically on next tool use
338
+
339
+ ### Refining a Rule
340
+
341
+ 1. Edit the `.local.md` file
342
+ 2. Adjust pattern or message
343
+ 3. Test immediately - changes take effect on next tool use
344
+
345
+ ### Disabling a Rule
346
+
347
+ **Temporary:** Set `enabled: false` in frontmatter
348
+ **Permanent:** Delete the `.local.md` file
349
+
350
+ ## Examples
351
+
352
+ See `${CLAUDE_PLUGIN_ROOT}/examples/` for complete examples:
353
+
354
+ - `dangerous-rm.local.md` - Block dangerous rm commands
355
+ - `console-log-warning.local.md` - Warn about console.log
356
+ - `sensitive-files-warning.local.md` - Warn about editing .env files
357
+
358
+ ## Quick Reference
359
+
360
+ **Minimum viable rule:**
361
+
362
+ ```markdown
363
+ ---
364
+ name: my-rule
365
+ enabled: true
366
+ event: bash
367
+ pattern: dangerous_command
368
+ ---
369
+
370
+ Warning message here
371
+ ```
372
+
373
+ **Rule with conditions:**
374
+
375
+ ```markdown
376
+ ---
377
+ name: my-rule
378
+ enabled: true
379
+ event: file
380
+ conditions:
381
+ - field: file_path
382
+ operator: regex_match
383
+ pattern: \.ts$
384
+ - field: new_text
385
+ operator: contains
386
+ pattern: any
387
+ ---
388
+
389
+ Warning message
390
+ ```
391
+
392
+ **Event types:**
393
+
394
+ - `bash` - Bash commands
395
+ - `file` - File edits
396
+ - `stop` - Completion checks
397
+ - `prompt` - User input
398
+ - `all` - All events
399
+
400
+ **Field options:**
401
+
402
+ - Bash: `command`
403
+ - File: `file_path`, `new_text`, `old_text`, `content`
404
+ - Prompt: `user_prompt`
405
+
406
+ **Operators:**
407
+
408
+ - `regex_match`, `contains`, `equals`, `not_contains`, `starts_with`, `ends_with`
@@ -0,0 +1,54 @@
1
+ # 项目紧凑上下文(用于 AI 会话)
2
+
3
+ ## 架构概览
4
+
5
+ - **模块数量**: 10
6
+ - **中间件**: 7
7
+ - **数据库表**: 3
8
+ - **API 端点**: 74
9
+
10
+ ## 模块列表
11
+
12
+ - **admin**: 8 路由, 8 服务
13
+ - **captcha**: 4 路由, 4 服务
14
+ - **chat**: 5 路由, 5 服务
15
+ - **content**: 4 路由, 4 服务
16
+ - **dispute**: 4 路由, 4 服务
17
+ - **notifications**: 5 路由, 5 服务
18
+ - **order**: 4 路由, 4 服务
19
+ - **permission**: 4 路由, 4 服务
20
+ - **ticket**: 4 路由, 4 服务
21
+ - **todos**: 4 路由, 4 服务
22
+
23
+ ## 关键文件路径
24
+
25
+ ### 服务端
26
+
27
+ ```
28
+ src/server/
29
+ ├── app.ts # 应用入口
30
+ ├── middleware/ # 中间件
31
+ ├── module-{feature}/ # 业务模块
32
+ │ ├── routes/ # API 路由
33
+ │ ├── services/ # 业务逻辑
34
+ │ └── __tests__/ # 测试
35
+ └── db/schema/ # 数据库表定义
36
+ ```
37
+
38
+ ### 客户端
39
+
40
+ ```
41
+ src/client/
42
+ ├── App.tsx # 应用入口
43
+ ├── components/ # UI 组件
44
+ ├── stores/ # Zustand 状态
45
+ └── services/ # API 客户端
46
+ ```
47
+
48
+ ### 共享类型
49
+
50
+ ```
51
+ src/shared/
52
+ ├── core/ # 框架层(不可修改)
53
+ └── modules/ # 业务层 Schema
54
+ ```