create-wakii-stack 0.0.0-stage → 0.1.1

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 (998) hide show
  1. package/README.md +66 -2
  2. package/dist/chunk-7XGW4UJ5.js +75 -0
  3. package/dist/chunk-AKPWS7FJ.js +76 -0
  4. package/dist/chunk-ELM6GGC5.js +50 -0
  5. package/dist/chunk-ON2WTGZH.js +77 -0
  6. package/dist/index.js +391 -0
  7. package/dist/manifest-2JVLRMDB.js +10 -0
  8. package/dist/manifest-O35TPW73.js +10 -0
  9. package/dist/manifest-TXTY67BF.js +10 -0
  10. package/dist/manifest-XWHR7Y3F.js +10 -0
  11. package/package.json +23 -4
  12. package/stack-template/.changeset/config.json +15 -0
  13. package/stack-template/.changeset/vu53-ui-redesign.md +11 -0
  14. package/stack-template/.claude/agents/be-dev.md +56 -0
  15. package/stack-template/.claude/agents/contracts-keeper.md +51 -0
  16. package/stack-template/.claude/agents/e2e-runner.md +61 -0
  17. package/stack-template/.claude/agents/fe-dev.md +53 -0
  18. package/stack-template/.claude/settings.json +77 -0
  19. package/stack-template/.claude/settings.local.json +9 -0
  20. package/stack-template/.claude/skills/add-service/SKILL.md +81 -0
  21. package/stack-template/.claude/skills/sync-contracts/SKILL.md +74 -0
  22. package/stack-template/.editorconfig +21 -0
  23. package/stack-template/.gitattributes +10 -0
  24. package/stack-template/.github/pull_request_template.md +26 -0
  25. package/stack-template/.github/workflow-templates/services-ci.yml.example +69 -0
  26. package/stack-template/.github/workflows/contracts.yml +133 -0
  27. package/stack-template/.github/workflows/convergence.yml +209 -0
  28. package/stack-template/.github/workflows/git-guard.yml +44 -0
  29. package/stack-template/.github/workflows/publish-uikit.yml +96 -0
  30. package/stack-template/.github/workflows/remotes-activity.yml +82 -0
  31. package/stack-template/.github/workflows/remotes-tasks.yml +82 -0
  32. package/stack-template/.github/workflows/services-auth-svc.yml +153 -0
  33. package/stack-template/.github/workflows/services-go-svc.yml +281 -0
  34. package/stack-template/.github/workflows/services-node-svc.yml +173 -0
  35. package/stack-template/.github/workflows/services-spring-svc.yml +132 -0
  36. package/stack-template/.github/workflows/shell.yml +78 -0
  37. package/stack-template/.github/workflows/ui-kit.yml +51 -0
  38. package/stack-template/.husky/commit-msg +14 -0
  39. package/stack-template/.husky/pre-push +51 -0
  40. package/stack-template/.spectral.yaml +17 -0
  41. package/stack-template/AGENTS.md +197 -0
  42. package/stack-template/CLAUDE.md +114 -0
  43. package/stack-template/README.md +172 -0
  44. package/stack-template/app/admin/index.html +12 -0
  45. package/stack-template/app/admin/package.json +40 -0
  46. package/stack-template/app/admin/scripts/verify-chart.mjs +49 -0
  47. package/stack-template/app/admin/src/App.test.tsx +70 -0
  48. package/stack-template/app/admin/src/App.tsx +33 -0
  49. package/stack-template/app/admin/src/data/users.ts +47 -0
  50. package/stack-template/app/admin/src/layout/AdminLayout.tsx +212 -0
  51. package/stack-template/app/admin/src/main.tsx +17 -0
  52. package/stack-template/app/admin/src/pages/ComponentsDemo.tsx +138 -0
  53. package/stack-template/app/admin/src/pages/Dashboard.tsx +182 -0
  54. package/stack-template/app/admin/src/pages/HooksDemo.tsx +153 -0
  55. package/stack-template/app/admin/src/pages/Settings.tsx +156 -0
  56. package/stack-template/app/admin/src/pages/UploadPage.tsx +34 -0
  57. package/stack-template/app/admin/src/pages/Users.test.tsx +66 -0
  58. package/stack-template/app/admin/src/pages/Users.tsx +245 -0
  59. package/stack-template/app/admin/src/styles.css +9 -0
  60. package/stack-template/app/admin/src/tests/setup.ts +15 -0
  61. package/stack-template/app/admin/tsconfig.json +18 -0
  62. package/stack-template/app/admin/vite.config.ts +11 -0
  63. package/stack-template/app/admin/vitest.config.ts +14 -0
  64. package/stack-template/app/create-wakii-app/README.md +71 -0
  65. package/stack-template/app/create-wakii-app/package.json +27 -0
  66. package/stack-template/app/create-wakii-app/scripts/publish-npm.sh +38 -0
  67. package/stack-template/app/create-wakii-app/src/index.ts +127 -0
  68. package/stack-template/app/create-wakii-app/src/options.test.ts +80 -0
  69. package/stack-template/app/create-wakii-app/src/options.ts +117 -0
  70. package/stack-template/app/create-wakii-app/src/scaffold.test.ts +143 -0
  71. package/stack-template/app/create-wakii-app/src/scaffold.ts +194 -0
  72. package/stack-template/app/create-wakii-app/tsconfig.json +17 -0
  73. package/stack-template/app/create-wakii-app/vitest.config.ts +9 -0
  74. package/stack-template/app/create-wakii-stack/package.json +27 -0
  75. package/stack-template/app/create-wakii-stack/src/manifest.ts +101 -0
  76. package/stack-template/app/create-wakii-stack/src/options.ts +106 -0
  77. package/stack-template/app/create-wakii-stack/src/scaffold.ts +315 -0
  78. package/stack-template/app/create-wakii-stack/tsconfig.json +17 -0
  79. package/stack-template/app/create-wakii-stack/vitest.config.ts +9 -0
  80. package/stack-template/app/remotes/activity/Dockerfile +36 -0
  81. package/stack-template/app/remotes/activity/README.md +59 -0
  82. package/stack-template/app/remotes/activity/index.html +11 -0
  83. package/stack-template/app/remotes/activity/nginx.conf +35 -0
  84. package/stack-template/app/remotes/activity/package.json +40 -0
  85. package/stack-template/app/remotes/activity/rspack.config.mjs +152 -0
  86. package/stack-template/app/remotes/activity/src/ActivityPage.tsx +139 -0
  87. package/stack-template/app/remotes/activity/src/api.ts +63 -0
  88. package/stack-template/app/remotes/activity/src/app.css +7 -0
  89. package/stack-template/app/remotes/activity/src/components/FeedItem.tsx +39 -0
  90. package/stack-template/app/remotes/activity/src/components/StatTile.tsx +24 -0
  91. package/stack-template/app/remotes/activity/src/components/Timeline.tsx +53 -0
  92. package/stack-template/app/remotes/activity/src/components/time.ts +30 -0
  93. package/stack-template/app/remotes/activity/src/env.d.ts +5 -0
  94. package/stack-template/app/remotes/activity/src/index.tsx +12 -0
  95. package/stack-template/app/remotes/activity/src/standalone.tsx +36 -0
  96. package/stack-template/app/remotes/activity/tests/ActivityPage.test.tsx +260 -0
  97. package/stack-template/app/remotes/activity/tests/api.test.ts +61 -0
  98. package/stack-template/app/remotes/activity/tests/setup.ts +1 -0
  99. package/stack-template/app/remotes/activity/tests/test-utils.tsx +16 -0
  100. package/stack-template/app/remotes/activity/tsconfig.json +26 -0
  101. package/stack-template/app/remotes/activity/vitest.config.ts +38 -0
  102. package/stack-template/app/remotes/tasks/Dockerfile +36 -0
  103. package/stack-template/app/remotes/tasks/README.md +59 -0
  104. package/stack-template/app/remotes/tasks/index.html +11 -0
  105. package/stack-template/app/remotes/tasks/nginx.conf +35 -0
  106. package/stack-template/app/remotes/tasks/package.json +41 -0
  107. package/stack-template/app/remotes/tasks/rspack.config.mjs +153 -0
  108. package/stack-template/app/remotes/tasks/src/TasksPage.tsx +284 -0
  109. package/stack-template/app/remotes/tasks/src/api.ts +109 -0
  110. package/stack-template/app/remotes/tasks/src/app.css +7 -0
  111. package/stack-template/app/remotes/tasks/src/components/StatusBadge.tsx +20 -0
  112. package/stack-template/app/remotes/tasks/src/components/StatusSelect.tsx +27 -0
  113. package/stack-template/app/remotes/tasks/src/components/TaskForm.tsx +74 -0
  114. package/stack-template/app/remotes/tasks/src/components/TaskItem.tsx +199 -0
  115. package/stack-template/app/remotes/tasks/src/components/TaskList.tsx +60 -0
  116. package/stack-template/app/remotes/tasks/src/components/status.ts +23 -0
  117. package/stack-template/app/remotes/tasks/src/env.d.ts +5 -0
  118. package/stack-template/app/remotes/tasks/src/index.tsx +12 -0
  119. package/stack-template/app/remotes/tasks/src/standalone.tsx +38 -0
  120. package/stack-template/app/remotes/tasks/tests/TasksPage.test.tsx +445 -0
  121. package/stack-template/app/remotes/tasks/tests/api.test.ts +159 -0
  122. package/stack-template/app/remotes/tasks/tests/setup.ts +1 -0
  123. package/stack-template/app/remotes/tasks/tests/test-utils.tsx +16 -0
  124. package/stack-template/app/remotes/tasks/tsconfig.json +26 -0
  125. package/stack-template/app/remotes/tasks/vitest.config.ts +34 -0
  126. package/stack-template/app/shared/README.md +21 -0
  127. package/stack-template/app/shared/package.json +37 -0
  128. package/stack-template/app/shared/src/api-client.ts +66 -0
  129. package/stack-template/app/shared/src/error-envelope.ts +38 -0
  130. package/stack-template/app/shared/src/index.ts +21 -0
  131. package/stack-template/app/shared/src/mf-bootstrap.ts +89 -0
  132. package/stack-template/app/shared/src/refresh-client.ts +170 -0
  133. package/stack-template/app/shared/src/token-storage.ts +57 -0
  134. package/stack-template/app/shell/Dockerfile +37 -0
  135. package/stack-template/app/shell/README.md +79 -0
  136. package/stack-template/app/shell/index.html +11 -0
  137. package/stack-template/app/shell/nginx.conf +23 -0
  138. package/stack-template/app/shell/package.json +43 -0
  139. package/stack-template/app/shell/rspack.config.mjs +147 -0
  140. package/stack-template/app/shell/src/App.tsx +57 -0
  141. package/stack-template/app/shell/src/api.ts +36 -0
  142. package/stack-template/app/shell/src/app.css +11 -0
  143. package/stack-template/app/shell/src/bootstrap.tsx +24 -0
  144. package/stack-template/app/shell/src/components/Layout.tsx +35 -0
  145. package/stack-template/app/shell/src/components/NavBar.tsx +118 -0
  146. package/stack-template/app/shell/src/components/RemoteSlot.tsx +82 -0
  147. package/stack-template/app/shell/src/components/RequireAuth.tsx +14 -0
  148. package/stack-template/app/shell/src/env.d.ts +7 -0
  149. package/stack-template/app/shell/src/index.tsx +3 -0
  150. package/stack-template/app/shell/src/pages/HomePage.tsx +70 -0
  151. package/stack-template/app/shell/src/pages/LoginPage.tsx +217 -0
  152. package/stack-template/app/shell/src/remote-urls.ts +18 -0
  153. package/stack-template/app/shell/tests/a11y.test.tsx +53 -0
  154. package/stack-template/app/shell/tests/api-timeout.test.ts +43 -0
  155. package/stack-template/app/shell/tests/integration.test.tsx +93 -0
  156. package/stack-template/app/shell/tests/login.test.tsx +227 -0
  157. package/stack-template/app/shell/tests/mf-retry.test.ts +76 -0
  158. package/stack-template/app/shell/tests/refresh-client.test.ts +301 -0
  159. package/stack-template/app/shell/tests/remote-slot.test.tsx +109 -0
  160. package/stack-template/app/shell/tests/remote-urls.test.ts +26 -0
  161. package/stack-template/app/shell/tests/setup.ts +15 -0
  162. package/stack-template/app/shell/tests/shell-chrome.test.tsx +126 -0
  163. package/stack-template/app/shell/tsconfig.json +26 -0
  164. package/stack-template/app/shell/vitest.config.ts +42 -0
  165. package/stack-template/app/spike/README.md +35 -0
  166. package/stack-template/app/spike/host/index.html +11 -0
  167. package/stack-template/app/spike/host/package.json +17 -0
  168. package/stack-template/app/spike/host/rspack.config.mjs +34 -0
  169. package/stack-template/app/spike/host/src/bootstrap.jsx +26 -0
  170. package/stack-template/app/spike/host/src/index.jsx +3 -0
  171. package/stack-template/app/spike/remote/package.json +17 -0
  172. package/stack-template/app/spike/remote/rspack.config.mjs +36 -0
  173. package/stack-template/app/spike/remote/src/Hello.jsx +7 -0
  174. package/stack-template/app/spike/remote/src/index.js +2 -0
  175. package/stack-template/app/spike/serve.mjs +31 -0
  176. package/stack-template/app/starter-templates/template-feats/extras/carousel/src/DemoCarousel.tsx +99 -0
  177. package/stack-template/app/starter-templates/template-feats/extras/chart/src/DemoChart.tsx +84 -0
  178. package/stack-template/app/starter-templates/template-feats/extras/editor/src/DemoEditor.tsx +110 -0
  179. package/stack-template/app/starter-templates/template-feats/extras/schedule/src/DemoSchedule.tsx +81 -0
  180. package/stack-template/app/starter-templates/template-feats/router/src/App.tsx +332 -0
  181. package/stack-template/app/starter-templates/template-feats/router/src/main.tsx +14 -0
  182. package/stack-template/app/starter-templates/vite-js/README.md +72 -0
  183. package/stack-template/app/starter-templates/vite-js/index.html +12 -0
  184. package/stack-template/app/starter-templates/vite-js/jsconfig.json +10 -0
  185. package/stack-template/app/starter-templates/vite-js/package.json +22 -0
  186. package/stack-template/app/starter-templates/vite-js/src/App.jsx +158 -0
  187. package/stack-template/app/starter-templates/vite-js/src/main.jsx +10 -0
  188. package/stack-template/app/starter-templates/vite-js/src/styles.css +15 -0
  189. package/stack-template/app/starter-templates/vite-js/src/theme.js +21 -0
  190. package/stack-template/app/starter-templates/vite-js/vite.config.mjs +8 -0
  191. package/stack-template/app/starter-templates/vite-ts/README.md +53 -0
  192. package/stack-template/app/starter-templates/vite-ts/index.html +12 -0
  193. package/stack-template/app/starter-templates/vite-ts/package.json +29 -0
  194. package/stack-template/app/starter-templates/vite-ts/src/App.tsx +181 -0
  195. package/stack-template/app/starter-templates/vite-ts/src/main.tsx +12 -0
  196. package/stack-template/app/starter-templates/vite-ts/src/styles.css +21 -0
  197. package/stack-template/app/starter-templates/vite-ts/src/theme.ts +16 -0
  198. package/stack-template/app/starter-templates/vite-ts/tsconfig.json +25 -0
  199. package/stack-template/app/starter-templates/vite-ts/tsconfig.node.json +11 -0
  200. package/stack-template/app/starter-templates/vite-ts/vite.config.ts +10 -0
  201. package/stack-template/app/ui-kit/.storybook/main.ts +29 -0
  202. package/stack-template/app/ui-kit/.storybook/manager-head.html +97 -0
  203. package/stack-template/app/ui-kit/.storybook/manager.ts +138 -0
  204. package/stack-template/app/ui-kit/.storybook/preview-head.html +57 -0
  205. package/stack-template/app/ui-kit/.storybook/preview.ts +62 -0
  206. package/stack-template/app/ui-kit/.storybook/tailwind-preview.css +3 -0
  207. package/stack-template/app/ui-kit/.storybook/test-runner.config.ts +20 -0
  208. package/stack-template/app/ui-kit/CHANGELOG.md +137 -0
  209. package/stack-template/app/ui-kit/LICENSE +21 -0
  210. package/stack-template/app/ui-kit/MIGRATION.md +84 -0
  211. package/stack-template/app/ui-kit/README.md +173 -0
  212. package/stack-template/app/ui-kit/RELEASE.md +77 -0
  213. package/stack-template/app/ui-kit/USAGE.md +380 -0
  214. package/stack-template/app/ui-kit/eslint.config.js +47 -0
  215. package/stack-template/app/ui-kit/package.json +166 -0
  216. package/stack-template/app/ui-kit/scripts/publish-github.sh +39 -0
  217. package/stack-template/app/ui-kit/scripts/publish-npm.sh +76 -0
  218. package/stack-template/app/ui-kit/scripts/stamp-build.cjs +13 -0
  219. package/stack-template/app/ui-kit/src/KitchenSink.stories.tsx +576 -0
  220. package/stack-template/app/ui-kit/src/Tokens.stories.tsx +193 -0
  221. package/stack-template/app/ui-kit/src/entries/carousel.ts +7 -0
  222. package/stack-template/app/ui-kit/src/entries/chart.ts +4 -0
  223. package/stack-template/app/ui-kit/src/entries/editor.ts +4 -0
  224. package/stack-template/app/ui-kit/src/entries/experience3d.ts +5 -0
  225. package/stack-template/app/ui-kit/src/entries/schedule.ts +5 -0
  226. package/stack-template/app/ui-kit/src/env.d.ts +3 -0
  227. package/stack-template/app/ui-kit/src/hooks/form.stories.tsx +80 -0
  228. package/stack-template/app/ui-kit/src/hooks/hooks-new.stories.tsx +392 -0
  229. package/stack-template/app/ui-kit/src/hooks/hooks.stories.tsx +167 -0
  230. package/stack-template/app/ui-kit/src/hooks/useClickAway.test.tsx +63 -0
  231. package/stack-template/app/ui-kit/src/hooks/useClickAway.ts +30 -0
  232. package/stack-template/app/ui-kit/src/hooks/useControllableState.test.ts +36 -0
  233. package/stack-template/app/ui-kit/src/hooks/useControllableState.ts +41 -0
  234. package/stack-template/app/ui-kit/src/hooks/useCopyToClipboard.test.ts +89 -0
  235. package/stack-template/app/ui-kit/src/hooks/useCopyToClipboard.ts +20 -0
  236. package/stack-template/app/ui-kit/src/hooks/useCountdown.test.ts +88 -0
  237. package/stack-template/app/ui-kit/src/hooks/useCountdown.ts +38 -0
  238. package/stack-template/app/ui-kit/src/hooks/useDebounce.test.ts +71 -0
  239. package/stack-template/app/ui-kit/src/hooks/useDebounce.ts +14 -0
  240. package/stack-template/app/ui-kit/src/hooks/useDefault.test.ts +37 -0
  241. package/stack-template/app/ui-kit/src/hooks/useDefault.ts +15 -0
  242. package/stack-template/app/ui-kit/src/hooks/useEventListener.test.ts +47 -0
  243. package/stack-template/app/ui-kit/src/hooks/useEventListener.ts +28 -0
  244. package/stack-template/app/ui-kit/src/hooks/useFieldArray.test.tsx +160 -0
  245. package/stack-template/app/ui-kit/src/hooks/useFieldArray.ts +85 -0
  246. package/stack-template/app/ui-kit/src/hooks/useFocusTrap.ts +67 -0
  247. package/stack-template/app/ui-kit/src/hooks/useForm.test.tsx +192 -0
  248. package/stack-template/app/ui-kit/src/hooks/useForm.ts +119 -0
  249. package/stack-template/app/ui-kit/src/hooks/useFullscreen.test.tsx +71 -0
  250. package/stack-template/app/ui-kit/src/hooks/useFullscreen.ts +68 -0
  251. package/stack-template/app/ui-kit/src/hooks/useHover.test.tsx +30 -0
  252. package/stack-template/app/ui-kit/src/hooks/useHover.ts +23 -0
  253. package/stack-template/app/ui-kit/src/hooks/useInView.test.tsx +70 -0
  254. package/stack-template/app/ui-kit/src/hooks/useInView.ts +55 -0
  255. package/stack-template/app/ui-kit/src/hooks/useInfiniteScroll.test.tsx +72 -0
  256. package/stack-template/app/ui-kit/src/hooks/useInfiniteScroll.ts +45 -0
  257. package/stack-template/app/ui-kit/src/hooks/useIsFirstRender.test.ts +30 -0
  258. package/stack-template/app/ui-kit/src/hooks/useIsFirstRender.ts +14 -0
  259. package/stack-template/app/ui-kit/src/hooks/useKeyPress.test.ts +45 -0
  260. package/stack-template/app/ui-kit/src/hooks/useKeyPress.ts +31 -0
  261. package/stack-template/app/ui-kit/src/hooks/useLocalStorage.test.ts +102 -0
  262. package/stack-template/app/ui-kit/src/hooks/useLocalStorage.ts +34 -0
  263. package/stack-template/app/ui-kit/src/hooks/useLockBodyScroll.test.ts +42 -0
  264. package/stack-template/app/ui-kit/src/hooks/useLockBodyScroll.ts +13 -0
  265. package/stack-template/app/ui-kit/src/hooks/useMeasure.test.tsx +57 -0
  266. package/stack-template/app/ui-kit/src/hooks/useMeasure.ts +32 -0
  267. package/stack-template/app/ui-kit/src/hooks/useMediaQuery.test.ts +73 -0
  268. package/stack-template/app/ui-kit/src/hooks/useMediaQuery.ts +20 -0
  269. package/stack-template/app/ui-kit/src/hooks/useMountEffect.test.ts +22 -0
  270. package/stack-template/app/ui-kit/src/hooks/useMountEffect.ts +10 -0
  271. package/stack-template/app/ui-kit/src/hooks/useOnlineStatus.test.ts +36 -0
  272. package/stack-template/app/ui-kit/src/hooks/useOnlineStatus.ts +21 -0
  273. package/stack-template/app/ui-kit/src/hooks/usePrevious.test.ts +35 -0
  274. package/stack-template/app/ui-kit/src/hooks/usePrevious.ts +13 -0
  275. package/stack-template/app/ui-kit/src/hooks/useScrollProgress.test.ts +59 -0
  276. package/stack-template/app/ui-kit/src/hooks/useScrollProgress.ts +31 -0
  277. package/stack-template/app/ui-kit/src/hooks/useSessionStorage.test.ts +80 -0
  278. package/stack-template/app/ui-kit/src/hooks/useSessionStorage.ts +34 -0
  279. package/stack-template/app/ui-kit/src/hooks/useThrottle.test.ts +61 -0
  280. package/stack-template/app/ui-kit/src/hooks/useThrottle.ts +30 -0
  281. package/stack-template/app/ui-kit/src/hooks/useTimeout.test.ts +95 -0
  282. package/stack-template/app/ui-kit/src/hooks/useTimeout.ts +38 -0
  283. package/stack-template/app/ui-kit/src/hooks/useTitle.test.ts +34 -0
  284. package/stack-template/app/ui-kit/src/hooks/useTitle.ts +24 -0
  285. package/stack-template/app/ui-kit/src/hooks/useToggle.test.ts +46 -0
  286. package/stack-template/app/ui-kit/src/hooks/useToggle.ts +16 -0
  287. package/stack-template/app/ui-kit/src/hooks/useUpdateEffect.test.ts +25 -0
  288. package/stack-template/app/ui-kit/src/hooks/useUpdateEffect.ts +18 -0
  289. package/stack-template/app/ui-kit/src/hooks/useWindowSize.test.ts +33 -0
  290. package/stack-template/app/ui-kit/src/hooks/useWindowSize.ts +23 -0
  291. package/stack-template/app/ui-kit/src/index.ts +218 -0
  292. package/stack-template/app/ui-kit/src/intro-showcase.stories.tsx +272 -0
  293. package/stack-template/app/ui-kit/src/intro.docs.mdx +247 -0
  294. package/stack-template/app/ui-kit/src/motion/motion-showcase.stories.tsx +234 -0
  295. package/stack-template/app/ui-kit/src/motion/motion.md +38 -0
  296. package/stack-template/app/ui-kit/src/provider/index.tsx +77 -0
  297. package/stack-template/app/ui-kit/src/provider/provider.stories.tsx +87 -0
  298. package/stack-template/app/ui-kit/src/provider/provider.test.tsx +121 -0
  299. package/stack-template/app/ui-kit/src/styles/base.css +171 -0
  300. package/stack-template/app/ui-kit/src/styles/dark-theme.test.ts +21 -0
  301. package/stack-template/app/ui-kit/src/styles/tailwind.css +220 -0
  302. package/stack-template/app/ui-kit/src/styles/themes/dark.css +71 -0
  303. package/stack-template/app/ui-kit/src/styles/tokens.css +133 -0
  304. package/stack-template/app/ui-kit/src/styles/ui-kit.css +10 -0
  305. package/stack-template/app/ui-kit/src/templates/auth.stories.tsx +425 -0
  306. package/stack-template/app/ui-kit/src/templates/crud.stories.tsx +416 -0
  307. package/stack-template/app/ui-kit/src/templates/dashboard.stories.tsx +504 -0
  308. package/stack-template/app/ui-kit/src/templates/experience/chapters/ch1-deep-focus.tsx +96 -0
  309. package/stack-template/app/ui-kit/src/templates/experience/chapters/ch2-living-docs.tsx +134 -0
  310. package/stack-template/app/ui-kit/src/templates/experience/chapters/ch3-team-velocity.tsx +148 -0
  311. package/stack-template/app/ui-kit/src/templates/experience/chapters/ch4-ship-your-app.tsx +100 -0
  312. package/stack-template/app/ui-kit/src/templates/experience/chapters/ch5-future.tsx +67 -0
  313. package/stack-template/app/ui-kit/src/templates/experience/chapters/hero.tsx +434 -0
  314. package/stack-template/app/ui-kit/src/templates/experience/chapters/nav-footer.tsx +85 -0
  315. package/stack-template/app/ui-kit/src/templates/experience/hero.stories.tsx +27 -0
  316. package/stack-template/app/ui-kit/src/templates/experience/hero.test.tsx +108 -0
  317. package/stack-template/app/ui-kit/src/templates/experience/index.stories.tsx +51 -0
  318. package/stack-template/app/ui-kit/src/templates/experience/lib/ChapterShell.tsx +84 -0
  319. package/stack-template/app/ui-kit/src/templates/experience/lib/SideNav.tsx +173 -0
  320. package/stack-template/app/ui-kit/src/templates/experience/lib/chapter-shell.test.tsx +266 -0
  321. package/stack-template/app/ui-kit/src/templates/experience/lib/scroll-mood.tsx +143 -0
  322. package/stack-template/app/ui-kit/src/templates/experience/lib/starfield.test.tsx +31 -0
  323. package/stack-template/app/ui-kit/src/templates/experience/lib/starfield.tsx +190 -0
  324. package/stack-template/app/ui-kit/src/templates/experience/mood-engine.stories.tsx +114 -0
  325. package/stack-template/app/ui-kit/src/templates/experience/shell-nav.stories.tsx +113 -0
  326. package/stack-template/app/ui-kit/src/templates/kanban-project.stories.tsx +352 -0
  327. package/stack-template/app/ui-kit/src/templates/landing.stories.tsx +380 -0
  328. package/stack-template/app/ui-kit/src/templates/parallax-landing.stories.tsx +633 -0
  329. package/stack-template/app/ui-kit/src/templates/settings.stories.tsx +474 -0
  330. package/stack-template/app/ui-kit/src/ui/accordion/accordion.stories.tsx +91 -0
  331. package/stack-template/app/ui-kit/src/ui/accordion/accordion.test.tsx +99 -0
  332. package/stack-template/app/ui-kit/src/ui/accordion/index.tsx +107 -0
  333. package/stack-template/app/ui-kit/src/ui/affix/affix.stories.tsx +104 -0
  334. package/stack-template/app/ui-kit/src/ui/affix/affix.test.tsx +138 -0
  335. package/stack-template/app/ui-kit/src/ui/affix/index.tsx +89 -0
  336. package/stack-template/app/ui-kit/src/ui/alert/alert.stories.tsx +149 -0
  337. package/stack-template/app/ui-kit/src/ui/alert/alert.test.tsx +85 -0
  338. package/stack-template/app/ui-kit/src/ui/alert/index.tsx +118 -0
  339. package/stack-template/app/ui-kit/src/ui/anchor/anchor.stories.tsx +96 -0
  340. package/stack-template/app/ui-kit/src/ui/anchor/anchor.test.tsx +191 -0
  341. package/stack-template/app/ui-kit/src/ui/anchor/index.tsx +144 -0
  342. package/stack-template/app/ui-kit/src/ui/auto-complete/auto-complete.stories.tsx +67 -0
  343. package/stack-template/app/ui-kit/src/ui/auto-complete/auto-complete.test.tsx +94 -0
  344. package/stack-template/app/ui-kit/src/ui/auto-complete/index.tsx +54 -0
  345. package/stack-template/app/ui-kit/src/ui/avatar/avatar.stories.tsx +132 -0
  346. package/stack-template/app/ui-kit/src/ui/avatar/avatar.test.tsx +65 -0
  347. package/stack-template/app/ui-kit/src/ui/avatar/index.tsx +48 -0
  348. package/stack-template/app/ui-kit/src/ui/avatar-group/avatar-group.stories.tsx +113 -0
  349. package/stack-template/app/ui-kit/src/ui/avatar-group/avatar-group.test.tsx +71 -0
  350. package/stack-template/app/ui-kit/src/ui/avatar-group/index.tsx +66 -0
  351. package/stack-template/app/ui-kit/src/ui/backdrop/backdrop.stories.tsx +66 -0
  352. package/stack-template/app/ui-kit/src/ui/backdrop/backdrop.test.tsx +37 -0
  353. package/stack-template/app/ui-kit/src/ui/backdrop/index.tsx +29 -0
  354. package/stack-template/app/ui-kit/src/ui/badge/badge.stories.tsx +105 -0
  355. package/stack-template/app/ui-kit/src/ui/badge/badge.test.tsx +115 -0
  356. package/stack-template/app/ui-kit/src/ui/badge/index.tsx +154 -0
  357. package/stack-template/app/ui-kit/src/ui/blockui/blockui.stories.tsx +34 -0
  358. package/stack-template/app/ui-kit/src/ui/blockui/blockui.test.tsx +29 -0
  359. package/stack-template/app/ui-kit/src/ui/blockui/index.tsx +25 -0
  360. package/stack-template/app/ui-kit/src/ui/bottom-navigation/bottom-navigation.stories.tsx +70 -0
  361. package/stack-template/app/ui-kit/src/ui/bottom-navigation/bottom-navigation.test.tsx +68 -0
  362. package/stack-template/app/ui-kit/src/ui/bottom-navigation/index.tsx +82 -0
  363. package/stack-template/app/ui-kit/src/ui/branch-fill.test.tsx +245 -0
  364. package/stack-template/app/ui-kit/src/ui/breadcrumb/breadcrumb.stories.tsx +103 -0
  365. package/stack-template/app/ui-kit/src/ui/breadcrumb/breadcrumb.test.tsx +49 -0
  366. package/stack-template/app/ui-kit/src/ui/breadcrumb/index.tsx +37 -0
  367. package/stack-template/app/ui-kit/src/ui/busy-box/busy-box.stories.tsx +30 -0
  368. package/stack-template/app/ui-kit/src/ui/busy-box/busy-box.test.tsx +29 -0
  369. package/stack-template/app/ui-kit/src/ui/busy-box/index.tsx +25 -0
  370. package/stack-template/app/ui-kit/src/ui/button/button.stories.tsx +121 -0
  371. package/stack-template/app/ui-kit/src/ui/button/button.test.tsx +207 -0
  372. package/stack-template/app/ui-kit/src/ui/button/index.tsx +128 -0
  373. package/stack-template/app/ui-kit/src/ui/calendar/calendar.stories.tsx +100 -0
  374. package/stack-template/app/ui-kit/src/ui/calendar/calendar.test.tsx +92 -0
  375. package/stack-template/app/ui-kit/src/ui/calendar/index.tsx +163 -0
  376. package/stack-template/app/ui-kit/src/ui/card/card.stories.tsx +203 -0
  377. package/stack-template/app/ui-kit/src/ui/card/card.test.tsx +135 -0
  378. package/stack-template/app/ui-kit/src/ui/card/index.tsx +84 -0
  379. package/stack-template/app/ui-kit/src/ui/carousel/carousel.stories.tsx +533 -0
  380. package/stack-template/app/ui-kit/src/ui/carousel/carousel.test.tsx +148 -0
  381. package/stack-template/app/ui-kit/src/ui/carousel/index.tsx +195 -0
  382. package/stack-template/app/ui-kit/src/ui/cascade-select/cascade-select.stories.tsx +126 -0
  383. package/stack-template/app/ui-kit/src/ui/cascade-select/cascade-select.test.tsx +132 -0
  384. package/stack-template/app/ui-kit/src/ui/cascade-select/index.tsx +87 -0
  385. package/stack-template/app/ui-kit/src/ui/chart/chart-theme.test.tsx +79 -0
  386. package/stack-template/app/ui-kit/src/ui/chart/chart.stories.tsx +278 -0
  387. package/stack-template/app/ui-kit/src/ui/chart/chart.test.tsx +103 -0
  388. package/stack-template/app/ui-kit/src/ui/chart/index.tsx +172 -0
  389. package/stack-template/app/ui-kit/src/ui/checkbox/checkbox.stories.tsx +67 -0
  390. package/stack-template/app/ui-kit/src/ui/checkbox/checkbox.test.tsx +99 -0
  391. package/stack-template/app/ui-kit/src/ui/checkbox/index.tsx +52 -0
  392. package/stack-template/app/ui-kit/src/ui/chips/chips.stories.tsx +53 -0
  393. package/stack-template/app/ui-kit/src/ui/chips/chips.test.tsx +86 -0
  394. package/stack-template/app/ui-kit/src/ui/chips/index.tsx +44 -0
  395. package/stack-template/app/ui-kit/src/ui/collapse/collapse.stories.tsx +93 -0
  396. package/stack-template/app/ui-kit/src/ui/collapse/collapse.test.tsx +128 -0
  397. package/stack-template/app/ui-kit/src/ui/collapse/index.tsx +75 -0
  398. package/stack-template/app/ui-kit/src/ui/color-picker/color-picker.stories.tsx +48 -0
  399. package/stack-template/app/ui-kit/src/ui/color-picker/color-picker.test.tsx +68 -0
  400. package/stack-template/app/ui-kit/src/ui/color-picker/index.tsx +38 -0
  401. package/stack-template/app/ui-kit/src/ui/context-menu/context-menu.stories.tsx +73 -0
  402. package/stack-template/app/ui-kit/src/ui/context-menu/context-menu.test.tsx +93 -0
  403. package/stack-template/app/ui-kit/src/ui/context-menu/index.tsx +79 -0
  404. package/stack-template/app/ui-kit/src/ui/count-up/count-up.stories.tsx +80 -0
  405. package/stack-template/app/ui-kit/src/ui/count-up/count-up.test.tsx +121 -0
  406. package/stack-template/app/ui-kit/src/ui/count-up/index.tsx +70 -0
  407. package/stack-template/app/ui-kit/src/ui/date-picker/date-picker.stories.tsx +154 -0
  408. package/stack-template/app/ui-kit/src/ui/date-picker/date-picker.test.tsx +221 -0
  409. package/stack-template/app/ui-kit/src/ui/date-picker/index.tsx +287 -0
  410. package/stack-template/app/ui-kit/src/ui/date-picker/locale-constants.ts +90 -0
  411. package/stack-template/app/ui-kit/src/ui/date-picker/locale.tsx +15 -0
  412. package/stack-template/app/ui-kit/src/ui/deferred-content/deferred-content.stories.tsx +62 -0
  413. package/stack-template/app/ui-kit/src/ui/deferred-content/deferred-content.test.tsx +94 -0
  414. package/stack-template/app/ui-kit/src/ui/deferred-content/index.tsx +61 -0
  415. package/stack-template/app/ui-kit/src/ui/descriptions/descriptions.stories.tsx +114 -0
  416. package/stack-template/app/ui-kit/src/ui/descriptions/descriptions.test.tsx +75 -0
  417. package/stack-template/app/ui-kit/src/ui/descriptions/index.tsx +48 -0
  418. package/stack-template/app/ui-kit/src/ui/divider/divider.stories.tsx +66 -0
  419. package/stack-template/app/ui-kit/src/ui/divider/divider.test.tsx +83 -0
  420. package/stack-template/app/ui-kit/src/ui/divider/index.tsx +65 -0
  421. package/stack-template/app/ui-kit/src/ui/drag-drop/drag-drop.stories.tsx +145 -0
  422. package/stack-template/app/ui-kit/src/ui/drag-drop/drag-drop.test.tsx +352 -0
  423. package/stack-template/app/ui-kit/src/ui/drag-drop/index.tsx +456 -0
  424. package/stack-template/app/ui-kit/src/ui/drawer/drawer.stories.tsx +108 -0
  425. package/stack-template/app/ui-kit/src/ui/drawer/drawer.test.tsx +132 -0
  426. package/stack-template/app/ui-kit/src/ui/drawer/index.tsx +113 -0
  427. package/stack-template/app/ui-kit/src/ui/dropdown/dropdown.stories.tsx +61 -0
  428. package/stack-template/app/ui-kit/src/ui/dropdown/dropdown.test.tsx +101 -0
  429. package/stack-template/app/ui-kit/src/ui/dropdown/index.tsx +162 -0
  430. package/stack-template/app/ui-kit/src/ui/editor/EditorInner.tsx +93 -0
  431. package/stack-template/app/ui-kit/src/ui/editor/editor.stories.tsx +37 -0
  432. package/stack-template/app/ui-kit/src/ui/editor/editor.test.tsx +84 -0
  433. package/stack-template/app/ui-kit/src/ui/editor/index.tsx +58 -0
  434. package/stack-template/app/ui-kit/src/ui/empty-state/empty-state.stories.tsx +24 -0
  435. package/stack-template/app/ui-kit/src/ui/empty-state/empty-state.test.tsx +48 -0
  436. package/stack-template/app/ui-kit/src/ui/empty-state/index.tsx +22 -0
  437. package/stack-template/app/ui-kit/src/ui/experience3d/experience3d.stories.tsx +66 -0
  438. package/stack-template/app/ui-kit/src/ui/experience3d/experience3d.test.tsx +50 -0
  439. package/stack-template/app/ui-kit/src/ui/experience3d/index.tsx +457 -0
  440. package/stack-template/app/ui-kit/src/ui/field/field-array.stories.tsx +214 -0
  441. package/stack-template/app/ui-kit/src/ui/field/field.stories.tsx +158 -0
  442. package/stack-template/app/ui-kit/src/ui/field/field.test.tsx +68 -0
  443. package/stack-template/app/ui-kit/src/ui/field/index.tsx +48 -0
  444. package/stack-template/app/ui-kit/src/ui/fieldset/fieldset.stories.tsx +49 -0
  445. package/stack-template/app/ui-kit/src/ui/fieldset/fieldset.test.tsx +88 -0
  446. package/stack-template/app/ui-kit/src/ui/fieldset/index.tsx +62 -0
  447. package/stack-template/app/ui-kit/src/ui/flex/flex.stories.tsx +96 -0
  448. package/stack-template/app/ui-kit/src/ui/flex/flex.test.tsx +79 -0
  449. package/stack-template/app/ui-kit/src/ui/flex/index.tsx +45 -0
  450. package/stack-template/app/ui-kit/src/ui/float-button/float-button.stories.tsx +82 -0
  451. package/stack-template/app/ui-kit/src/ui/float-button/float-button.test.tsx +107 -0
  452. package/stack-template/app/ui-kit/src/ui/float-button/index.tsx +124 -0
  453. package/stack-template/app/ui-kit/src/ui/galleria/galleria.stories.tsx +78 -0
  454. package/stack-template/app/ui-kit/src/ui/galleria/galleria.test.tsx +67 -0
  455. package/stack-template/app/ui-kit/src/ui/galleria/index.tsx +47 -0
  456. package/stack-template/app/ui-kit/src/ui/grid/grid.stories.tsx +179 -0
  457. package/stack-template/app/ui-kit/src/ui/grid/grid.test.tsx +286 -0
  458. package/stack-template/app/ui-kit/src/ui/grid/index.tsx +104 -0
  459. package/stack-template/app/ui-kit/src/ui/icons/icons.stories.tsx +52 -0
  460. package/stack-template/app/ui-kit/src/ui/icons/icons.test.tsx +60 -0
  461. package/stack-template/app/ui-kit/src/ui/icons/index.tsx +294 -0
  462. package/stack-template/app/ui-kit/src/ui/image/image.stories.tsx +231 -0
  463. package/stack-template/app/ui-kit/src/ui/image/image.test.tsx +79 -0
  464. package/stack-template/app/ui-kit/src/ui/image/index.tsx +76 -0
  465. package/stack-template/app/ui-kit/src/ui/inplace/index.tsx +33 -0
  466. package/stack-template/app/ui-kit/src/ui/inplace/inplace.stories.tsx +75 -0
  467. package/stack-template/app/ui-kit/src/ui/inplace/inplace.test.tsx +58 -0
  468. package/stack-template/app/ui-kit/src/ui/input/index.tsx +133 -0
  469. package/stack-template/app/ui-kit/src/ui/input/input-search.stories.tsx +112 -0
  470. package/stack-template/app/ui-kit/src/ui/input/input-search.test.tsx +116 -0
  471. package/stack-template/app/ui-kit/src/ui/input/input-search.tsx +116 -0
  472. package/stack-template/app/ui-kit/src/ui/input/input.stories.tsx +176 -0
  473. package/stack-template/app/ui-kit/src/ui/input/input.test.tsx +106 -0
  474. package/stack-template/app/ui-kit/src/ui/input-mask/index.tsx +39 -0
  475. package/stack-template/app/ui-kit/src/ui/input-mask/input-mask.stories.tsx +46 -0
  476. package/stack-template/app/ui-kit/src/ui/input-mask/input-mask.test.tsx +57 -0
  477. package/stack-template/app/ui-kit/src/ui/input-number/index.tsx +125 -0
  478. package/stack-template/app/ui-kit/src/ui/input-number/input-number.stories.tsx +190 -0
  479. package/stack-template/app/ui-kit/src/ui/input-number/input-number.test.tsx +157 -0
  480. package/stack-template/app/ui-kit/src/ui/input-otp/index.tsx +57 -0
  481. package/stack-template/app/ui-kit/src/ui/input-otp/input-otp.stories.tsx +90 -0
  482. package/stack-template/app/ui-kit/src/ui/input-otp/input-otp.test.tsx +66 -0
  483. package/stack-template/app/ui-kit/src/ui/kanban/index.tsx +277 -0
  484. package/stack-template/app/ui-kit/src/ui/kanban/kanban.stories.tsx +219 -0
  485. package/stack-template/app/ui-kit/src/ui/kanban/kanban.test.tsx +234 -0
  486. package/stack-template/app/ui-kit/src/ui/knob/index.tsx +58 -0
  487. package/stack-template/app/ui-kit/src/ui/knob/knob.stories.tsx +49 -0
  488. package/stack-template/app/ui-kit/src/ui/knob/knob.test.tsx +42 -0
  489. package/stack-template/app/ui-kit/src/ui/layout/index.tsx +145 -0
  490. package/stack-template/app/ui-kit/src/ui/layout/layout.stories.tsx +158 -0
  491. package/stack-template/app/ui-kit/src/ui/layout/layout.test.tsx +154 -0
  492. package/stack-template/app/ui-kit/src/ui/link/index.tsx +61 -0
  493. package/stack-template/app/ui-kit/src/ui/link/link.stories.tsx +68 -0
  494. package/stack-template/app/ui-kit/src/ui/link/link.test.tsx +69 -0
  495. package/stack-template/app/ui-kit/src/ui/list/index.tsx +135 -0
  496. package/stack-template/app/ui-kit/src/ui/list/list.stories.tsx +194 -0
  497. package/stack-template/app/ui-kit/src/ui/list/list.test.tsx +164 -0
  498. package/stack-template/app/ui-kit/src/ui/listbox/index.tsx +27 -0
  499. package/stack-template/app/ui-kit/src/ui/listbox/listbox.stories.tsx +57 -0
  500. package/stack-template/app/ui-kit/src/ui/listbox/listbox.test.tsx +49 -0
  501. package/stack-template/app/ui-kit/src/ui/mega-menu/index.tsx +142 -0
  502. package/stack-template/app/ui-kit/src/ui/mega-menu/mega-menu.stories.tsx +137 -0
  503. package/stack-template/app/ui-kit/src/ui/mega-menu/mega-menu.test.tsx +130 -0
  504. package/stack-template/app/ui-kit/src/ui/mention/index.tsx +76 -0
  505. package/stack-template/app/ui-kit/src/ui/mention/mention.stories.tsx +44 -0
  506. package/stack-template/app/ui-kit/src/ui/mention/mention.test.tsx +87 -0
  507. package/stack-template/app/ui-kit/src/ui/menu/index.tsx +256 -0
  508. package/stack-template/app/ui-kit/src/ui/menu/menu.stories.tsx +124 -0
  509. package/stack-template/app/ui-kit/src/ui/menu/menu.test.tsx +251 -0
  510. package/stack-template/app/ui-kit/src/ui/menubar/index.tsx +42 -0
  511. package/stack-template/app/ui-kit/src/ui/menubar/menubar.stories.tsx +66 -0
  512. package/stack-template/app/ui-kit/src/ui/menubar/menubar.test.tsx +65 -0
  513. package/stack-template/app/ui-kit/src/ui/message/index.tsx +123 -0
  514. package/stack-template/app/ui-kit/src/ui/message/message.stories.tsx +104 -0
  515. package/stack-template/app/ui-kit/src/ui/message/message.test.tsx +109 -0
  516. package/stack-template/app/ui-kit/src/ui/modal/index.tsx +142 -0
  517. package/stack-template/app/ui-kit/src/ui/modal/modal.stories.tsx +128 -0
  518. package/stack-template/app/ui-kit/src/ui/modal/modal.test.tsx +166 -0
  519. package/stack-template/app/ui-kit/src/ui/notification/index.tsx +142 -0
  520. package/stack-template/app/ui-kit/src/ui/notification/notification.stories.tsx +155 -0
  521. package/stack-template/app/ui-kit/src/ui/notification/notification.test.tsx +83 -0
  522. package/stack-template/app/ui-kit/src/ui/order-list/index.tsx +38 -0
  523. package/stack-template/app/ui-kit/src/ui/order-list/order-list.stories.tsx +38 -0
  524. package/stack-template/app/ui-kit/src/ui/order-list/order-list.test.tsx +54 -0
  525. package/stack-template/app/ui-kit/src/ui/org-chart/index.tsx +138 -0
  526. package/stack-template/app/ui-kit/src/ui/org-chart/org-chart.stories.tsx +76 -0
  527. package/stack-template/app/ui-kit/src/ui/org-chart/org-chart.test.tsx +98 -0
  528. package/stack-template/app/ui-kit/src/ui/pagination/index.tsx +102 -0
  529. package/stack-template/app/ui-kit/src/ui/pagination/pagination.stories.tsx +103 -0
  530. package/stack-template/app/ui-kit/src/ui/pagination/pagination.test.tsx +112 -0
  531. package/stack-template/app/ui-kit/src/ui/panel-menu/index.tsx +59 -0
  532. package/stack-template/app/ui-kit/src/ui/panel-menu/panel-menu.stories.tsx +96 -0
  533. package/stack-template/app/ui-kit/src/ui/panel-menu/panel-menu.test.tsx +64 -0
  534. package/stack-template/app/ui-kit/src/ui/parallax/index.tsx +62 -0
  535. package/stack-template/app/ui-kit/src/ui/parallax/parallax.stories.tsx +115 -0
  536. package/stack-template/app/ui-kit/src/ui/parallax/parallax.test.tsx +148 -0
  537. package/stack-template/app/ui-kit/src/ui/password/index.tsx +67 -0
  538. package/stack-template/app/ui-kit/src/ui/password/password.stories.tsx +43 -0
  539. package/stack-template/app/ui-kit/src/ui/password/password.test.tsx +45 -0
  540. package/stack-template/app/ui-kit/src/ui/pick-list/index.tsx +103 -0
  541. package/stack-template/app/ui-kit/src/ui/pick-list/pick-list.stories.tsx +59 -0
  542. package/stack-template/app/ui-kit/src/ui/pick-list/pick-list.test.tsx +94 -0
  543. package/stack-template/app/ui-kit/src/ui/popconfirm/index.tsx +102 -0
  544. package/stack-template/app/ui-kit/src/ui/popconfirm/popconfirm.stories.tsx +73 -0
  545. package/stack-template/app/ui-kit/src/ui/popconfirm/popconfirm.test.tsx +127 -0
  546. package/stack-template/app/ui-kit/src/ui/popover/index.tsx +136 -0
  547. package/stack-template/app/ui-kit/src/ui/popover/popover.stories.tsx +114 -0
  548. package/stack-template/app/ui-kit/src/ui/popover/popover.test.tsx +172 -0
  549. package/stack-template/app/ui-kit/src/ui/progress/index.tsx +46 -0
  550. package/stack-template/app/ui-kit/src/ui/progress/progress.stories.tsx +57 -0
  551. package/stack-template/app/ui-kit/src/ui/progress/progress.test.tsx +90 -0
  552. package/stack-template/app/ui-kit/src/ui/qr-code/index.tsx +88 -0
  553. package/stack-template/app/ui-kit/src/ui/qr-code/qr-code.stories.tsx +109 -0
  554. package/stack-template/app/ui-kit/src/ui/qr-code/qr-code.test.tsx +155 -0
  555. package/stack-template/app/ui-kit/src/ui/qr-code/qrcode-core.ts +56 -0
  556. package/stack-template/app/ui-kit/src/ui/qr-code/qrcode-generator.vendor.ts +2300 -0
  557. package/stack-template/app/ui-kit/src/ui/radio/index.tsx +62 -0
  558. package/stack-template/app/ui-kit/src/ui/radio/radio.stories.tsx +94 -0
  559. package/stack-template/app/ui-kit/src/ui/radio/radio.test.tsx +83 -0
  560. package/stack-template/app/ui-kit/src/ui/rating/index.tsx +36 -0
  561. package/stack-template/app/ui-kit/src/ui/rating/rating.stories.tsx +42 -0
  562. package/stack-template/app/ui-kit/src/ui/rating/rating.test.tsx +45 -0
  563. package/stack-template/app/ui-kit/src/ui/result/index.tsx +72 -0
  564. package/stack-template/app/ui-kit/src/ui/result/result.stories.tsx +82 -0
  565. package/stack-template/app/ui-kit/src/ui/result/result.test.tsx +57 -0
  566. package/stack-template/app/ui-kit/src/ui/reveal/index.tsx +83 -0
  567. package/stack-template/app/ui-kit/src/ui/reveal/reveal.stories.tsx +91 -0
  568. package/stack-template/app/ui-kit/src/ui/reveal/reveal.test.tsx +148 -0
  569. package/stack-template/app/ui-kit/src/ui/schedule/index.tsx +104 -0
  570. package/stack-template/app/ui-kit/src/ui/schedule/schedule.fc.test.tsx +95 -0
  571. package/stack-template/app/ui-kit/src/ui/schedule/schedule.stories.tsx +61 -0
  572. package/stack-template/app/ui-kit/src/ui/schedule/schedule.test.tsx +41 -0
  573. package/stack-template/app/ui-kit/src/ui/scroll-page/index.tsx +46 -0
  574. package/stack-template/app/ui-kit/src/ui/scroll-page/scroll-page.stories.tsx +92 -0
  575. package/stack-template/app/ui-kit/src/ui/scroll-page/scroll-page.test.tsx +51 -0
  576. package/stack-template/app/ui-kit/src/ui/scroll-panel/index.tsx +16 -0
  577. package/stack-template/app/ui-kit/src/ui/scroll-panel/scroll-panel.stories.tsx +37 -0
  578. package/stack-template/app/ui-kit/src/ui/scroll-panel/scroll-panel.test.tsx +41 -0
  579. package/stack-template/app/ui-kit/src/ui/scrolltop/index.tsx +27 -0
  580. package/stack-template/app/ui-kit/src/ui/scrolltop/scrolltop.stories.tsx +41 -0
  581. package/stack-template/app/ui-kit/src/ui/scrolltop/scrolltop.test.tsx +37 -0
  582. package/stack-template/app/ui-kit/src/ui/segmented/index.tsx +47 -0
  583. package/stack-template/app/ui-kit/src/ui/segmented/segmented.stories.tsx +126 -0
  584. package/stack-template/app/ui-kit/src/ui/segmented/segmented.test.tsx +77 -0
  585. package/stack-template/app/ui-kit/src/ui/select/index.tsx +302 -0
  586. package/stack-template/app/ui-kit/src/ui/select/select.stories.tsx +268 -0
  587. package/stack-template/app/ui-kit/src/ui/select/select.test.tsx +226 -0
  588. package/stack-template/app/ui-kit/src/ui/sidebar/index.tsx +83 -0
  589. package/stack-template/app/ui-kit/src/ui/sidebar/sidebar.stories.tsx +71 -0
  590. package/stack-template/app/ui-kit/src/ui/sidebar/sidebar.test.tsx +101 -0
  591. package/stack-template/app/ui-kit/src/ui/skeleton/index.tsx +55 -0
  592. package/stack-template/app/ui-kit/src/ui/skeleton/skeleton.stories.tsx +110 -0
  593. package/stack-template/app/ui-kit/src/ui/skeleton/skeleton.test.tsx +74 -0
  594. package/stack-template/app/ui-kit/src/ui/slide-menu/index.tsx +103 -0
  595. package/stack-template/app/ui-kit/src/ui/slide-menu/slide-menu.stories.tsx +92 -0
  596. package/stack-template/app/ui-kit/src/ui/slide-menu/slide-menu.test.tsx +120 -0
  597. package/stack-template/app/ui-kit/src/ui/slider/index.tsx +90 -0
  598. package/stack-template/app/ui-kit/src/ui/slider/slider.stories.tsx +60 -0
  599. package/stack-template/app/ui-kit/src/ui/slider/slider.test.tsx +66 -0
  600. package/stack-template/app/ui-kit/src/ui/space/index.tsx +32 -0
  601. package/stack-template/app/ui-kit/src/ui/space/space.stories.tsx +66 -0
  602. package/stack-template/app/ui-kit/src/ui/space/space.test.tsx +56 -0
  603. package/stack-template/app/ui-kit/src/ui/speed-dial/index.tsx +32 -0
  604. package/stack-template/app/ui-kit/src/ui/speed-dial/speed-dial.stories.tsx +34 -0
  605. package/stack-template/app/ui-kit/src/ui/speed-dial/speed-dial.test.tsx +34 -0
  606. package/stack-template/app/ui-kit/src/ui/spinner/index.tsx +74 -0
  607. package/stack-template/app/ui-kit/src/ui/spinner/spinner.stories.tsx +64 -0
  608. package/stack-template/app/ui-kit/src/ui/spinner/spinner.test.tsx +66 -0
  609. package/stack-template/app/ui-kit/src/ui/split-button/index.tsx +155 -0
  610. package/stack-template/app/ui-kit/src/ui/split-button/split-button.stories.tsx +137 -0
  611. package/stack-template/app/ui-kit/src/ui/split-button/split-button.test.tsx +152 -0
  612. package/stack-template/app/ui-kit/src/ui/splitter/index.tsx +49 -0
  613. package/stack-template/app/ui-kit/src/ui/splitter/splitter.stories.tsx +24 -0
  614. package/stack-template/app/ui-kit/src/ui/splitter/splitter.test.tsx +21 -0
  615. package/stack-template/app/ui-kit/src/ui/statistic/index.tsx +28 -0
  616. package/stack-template/app/ui-kit/src/ui/statistic/statistic.stories.tsx +112 -0
  617. package/stack-template/app/ui-kit/src/ui/statistic/statistic.test.tsx +39 -0
  618. package/stack-template/app/ui-kit/src/ui/steps/index.tsx +50 -0
  619. package/stack-template/app/ui-kit/src/ui/steps/steps.stories.tsx +57 -0
  620. package/stack-template/app/ui-kit/src/ui/steps/steps.test.tsx +55 -0
  621. package/stack-template/app/ui-kit/src/ui/switch/index.tsx +87 -0
  622. package/stack-template/app/ui-kit/src/ui/switch/switch.stories.tsx +123 -0
  623. package/stack-template/app/ui-kit/src/ui/switch/switch.test.tsx +98 -0
  624. package/stack-template/app/ui-kit/src/ui/tab-menu/index.tsx +33 -0
  625. package/stack-template/app/ui-kit/src/ui/tab-menu/tab-menu.stories.tsx +49 -0
  626. package/stack-template/app/ui-kit/src/ui/tab-menu/tab-menu.test.tsx +50 -0
  627. package/stack-template/app/ui-kit/src/ui/table/index.tsx +690 -0
  628. package/stack-template/app/ui-kit/src/ui/table/table-advanced.stories.tsx +91 -0
  629. package/stack-template/app/ui-kit/src/ui/table/table-advanced.test.tsx +188 -0
  630. package/stack-template/app/ui-kit/src/ui/table/table-expandable.stories.tsx +91 -0
  631. package/stack-template/app/ui-kit/src/ui/table/table-expandable.test.tsx +143 -0
  632. package/stack-template/app/ui-kit/src/ui/table/table.stories.tsx +342 -0
  633. package/stack-template/app/ui-kit/src/ui/table/table.test.tsx +465 -0
  634. package/stack-template/app/ui-kit/src/ui/table/types.ts +173 -0
  635. package/stack-template/app/ui-kit/src/ui/tabs/index.tsx +118 -0
  636. package/stack-template/app/ui-kit/src/ui/tabs/tabs.stories.tsx +113 -0
  637. package/stack-template/app/ui-kit/src/ui/tabs/tabs.test.tsx +77 -0
  638. package/stack-template/app/ui-kit/src/ui/tag/index.tsx +68 -0
  639. package/stack-template/app/ui-kit/src/ui/tag/tag.stories.tsx +88 -0
  640. package/stack-template/app/ui-kit/src/ui/tag/tag.test.tsx +126 -0
  641. package/stack-template/app/ui-kit/src/ui/team/debt-board/debt-board.stories.tsx +52 -0
  642. package/stack-template/app/ui-kit/src/ui/team/debt-board/debt-board.test.tsx +72 -0
  643. package/stack-template/app/ui-kit/src/ui/team/debt-board/index.tsx +125 -0
  644. package/stack-template/app/ui-kit/src/ui/team/inbox-thread/inbox-thread.stories.tsx +70 -0
  645. package/stack-template/app/ui-kit/src/ui/team/inbox-thread/inbox-thread.test.tsx +56 -0
  646. package/stack-template/app/ui-kit/src/ui/team/inbox-thread/index.tsx +107 -0
  647. package/stack-template/app/ui-kit/src/ui/team/ping-feed/index.tsx +102 -0
  648. package/stack-template/app/ui-kit/src/ui/team/ping-feed/ping-feed.stories.tsx +57 -0
  649. package/stack-template/app/ui-kit/src/ui/team/ping-feed/ping-feed.test.tsx +60 -0
  650. package/stack-template/app/ui-kit/src/ui/team/stage-pipeline/index.tsx +60 -0
  651. package/stack-template/app/ui-kit/src/ui/team/stage-pipeline/stage-pipeline.stories.tsx +68 -0
  652. package/stack-template/app/ui-kit/src/ui/team/stage-pipeline/stage-pipeline.test.tsx +50 -0
  653. package/stack-template/app/ui-kit/src/ui/team/team-dashboard/index.tsx +103 -0
  654. package/stack-template/app/ui-kit/src/ui/team/team-dashboard/team-dashboard.stories.tsx +72 -0
  655. package/stack-template/app/ui-kit/src/ui/team/team-dashboard/team-dashboard.test.tsx +72 -0
  656. package/stack-template/app/ui-kit/src/ui/time-picker/index.tsx +143 -0
  657. package/stack-template/app/ui-kit/src/ui/time-picker/time-picker.stories.tsx +90 -0
  658. package/stack-template/app/ui-kit/src/ui/time-picker/time-picker.test.tsx +64 -0
  659. package/stack-template/app/ui-kit/src/ui/timeline/index.tsx +91 -0
  660. package/stack-template/app/ui-kit/src/ui/timeline/timeline.stories.tsx +209 -0
  661. package/stack-template/app/ui-kit/src/ui/timeline/timeline.test.tsx +116 -0
  662. package/stack-template/app/ui-kit/src/ui/timesheet/index.tsx +277 -0
  663. package/stack-template/app/ui-kit/src/ui/timesheet/timesheet.stories.tsx +97 -0
  664. package/stack-template/app/ui-kit/src/ui/timesheet/timesheet.test.tsx +103 -0
  665. package/stack-template/app/ui-kit/src/ui/toggle-button/index.tsx +28 -0
  666. package/stack-template/app/ui-kit/src/ui/toggle-button/toggle-button-group.stories.tsx +85 -0
  667. package/stack-template/app/ui-kit/src/ui/toggle-button/toggle-button-group.test.tsx +97 -0
  668. package/stack-template/app/ui-kit/src/ui/toggle-button/toggle-button-group.tsx +81 -0
  669. package/stack-template/app/ui-kit/src/ui/toggle-button/toggle-button.stories.tsx +46 -0
  670. package/stack-template/app/ui-kit/src/ui/toggle-button/toggle-button.test.tsx +38 -0
  671. package/stack-template/app/ui-kit/src/ui/toolbar/index.tsx +18 -0
  672. package/stack-template/app/ui-kit/src/ui/toolbar/toolbar.stories.tsx +35 -0
  673. package/stack-template/app/ui-kit/src/ui/toolbar/toolbar.test.tsx +11 -0
  674. package/stack-template/app/ui-kit/src/ui/tooltip/index.tsx +61 -0
  675. package/stack-template/app/ui-kit/src/ui/tooltip/tooltip.stories.tsx +81 -0
  676. package/stack-template/app/ui-kit/src/ui/tooltip/tooltip.test.tsx +120 -0
  677. package/stack-template/app/ui-kit/src/ui/tour/index.tsx +210 -0
  678. package/stack-template/app/ui-kit/src/ui/tour/tour.stories.tsx +153 -0
  679. package/stack-template/app/ui-kit/src/ui/tour/tour.test.tsx +131 -0
  680. package/stack-template/app/ui-kit/src/ui/transition/index.tsx +377 -0
  681. package/stack-template/app/ui-kit/src/ui/transition/transition.stories.tsx +254 -0
  682. package/stack-template/app/ui-kit/src/ui/transition/transition.test.tsx +285 -0
  683. package/stack-template/app/ui-kit/src/ui/tree/index.tsx +68 -0
  684. package/stack-template/app/ui-kit/src/ui/tree/tree.stories.tsx +139 -0
  685. package/stack-template/app/ui-kit/src/ui/tree/tree.test.tsx +77 -0
  686. package/stack-template/app/ui-kit/src/ui/tree-select/index.tsx +251 -0
  687. package/stack-template/app/ui-kit/src/ui/tree-select/tree-select.stories.tsx +105 -0
  688. package/stack-template/app/ui-kit/src/ui/tree-select/tree-select.test.tsx +174 -0
  689. package/stack-template/app/ui-kit/src/ui/tree-table/index.tsx +229 -0
  690. package/stack-template/app/ui-kit/src/ui/tree-table/tree-table.stories.tsx +111 -0
  691. package/stack-template/app/ui-kit/src/ui/tree-table/tree-table.test.tsx +137 -0
  692. package/stack-template/app/ui-kit/src/ui/typography/index.tsx +124 -0
  693. package/stack-template/app/ui-kit/src/ui/typography/typography.stories.tsx +65 -0
  694. package/stack-template/app/ui-kit/src/ui/typography/typography.test.tsx +117 -0
  695. package/stack-template/app/ui-kit/src/ui/upload/index.tsx +39 -0
  696. package/stack-template/app/ui-kit/src/ui/upload/upload-core.tsx +204 -0
  697. package/stack-template/app/ui-kit/src/ui/upload/upload-dropzone.tsx +79 -0
  698. package/stack-template/app/ui-kit/src/ui/upload/upload.stories.tsx +67 -0
  699. package/stack-template/app/ui-kit/src/ui/upload/upload.test.tsx +204 -0
  700. package/stack-template/app/ui-kit/src/ui/virtual-scroll/index.tsx +86 -0
  701. package/stack-template/app/ui-kit/src/ui/virtual-scroll/virtual-scroll.stories.tsx +111 -0
  702. package/stack-template/app/ui-kit/src/ui/virtual-scroll/virtual-scroll.test.tsx +125 -0
  703. package/stack-template/app/ui-kit/src/ui/watermark/index.tsx +182 -0
  704. package/stack-template/app/ui-kit/src/ui/watermark/watermark.stories.tsx +96 -0
  705. package/stack-template/app/ui-kit/src/ui/watermark/watermark.test.tsx +120 -0
  706. package/stack-template/app/ui-kit/src/utils/array.test.ts +88 -0
  707. package/stack-template/app/ui-kit/src/utils/array.ts +51 -0
  708. package/stack-template/app/ui-kit/src/utils/dom.test.tsx +69 -0
  709. package/stack-template/app/ui-kit/src/utils/dom.ts +38 -0
  710. package/stack-template/app/ui-kit/src/utils/format.test.ts +63 -0
  711. package/stack-template/app/ui-kit/src/utils/format.ts +81 -0
  712. package/stack-template/app/ui-kit/tests/setup.ts +15 -0
  713. package/stack-template/app/ui-kit/tsconfig.json +18 -0
  714. package/stack-template/app/ui-kit/tsup.config.ts +37 -0
  715. package/stack-template/app/ui-kit/vercel.json +6 -0
  716. package/stack-template/app/ui-kit/vitest.config.ts +22 -0
  717. package/stack-template/contracts/auth/token-contract.md +119 -0
  718. package/stack-template/contracts/auth/users.json +35 -0
  719. package/stack-template/contracts/db/tasks-schema.sql +62 -0
  720. package/stack-template/contracts/events/fixtures/task.assigned.json +11 -0
  721. package/stack-template/contracts/events/fixtures/task.assignment_failed.json +11 -0
  722. package/stack-template/contracts/events/fixtures/task.created.json +12 -0
  723. package/stack-template/contracts/events/fixtures/task.deleted.json +10 -0
  724. package/stack-template/contracts/events/fixtures/task.updated.json +12 -0
  725. package/stack-template/contracts/events/task-events.md +80 -0
  726. package/stack-template/contracts/openapi/activity.yaml +196 -0
  727. package/stack-template/contracts/openapi/auth.yaml +310 -0
  728. package/stack-template/contracts/openapi/tasks.yaml +316 -0
  729. package/stack-template/contracts/openapi/users.yaml +345 -0
  730. package/stack-template/docs/adr/0001-mixed-stack.md +14 -0
  731. package/stack-template/docs/adr/0002-mf-rspack.md +14 -0
  732. package/stack-template/docs/adr/0003-contract-first.md +14 -0
  733. package/stack-template/docs/adr/0004-readonly-schema-tradeoff.md +14 -0
  734. package/stack-template/docs/adr/0005-fail-closed.md +14 -0
  735. package/stack-template/docs/adr/0006-fire-and-forget-events.md +14 -0
  736. package/stack-template/docs/adr/0007-fork-not-upgrade.md +14 -0
  737. package/stack-template/docs/adr/0008-kafka-outbox-saga.md +24 -0
  738. package/stack-template/docs/adr/0009-ui-kit-split.md +39 -0
  739. package/stack-template/docs/adr/README.md +15 -0
  740. package/stack-template/docs/ai/recipes.md +956 -0
  741. package/stack-template/docs/ai/table-Theming.md +25 -0
  742. package/stack-template/docs/ai/table-datadisplay-mz.md +20 -0
  743. package/stack-template/docs/ai/table-feedback.md +20 -0
  744. package/stack-template/docs/ai/table-forms.md +26 -0
  745. package/stack-template/docs/git-flow.md +70 -0
  746. package/stack-template/docs/parity-matrix.md +102 -0
  747. package/stack-template/docs/superpowers/contexts/auth-real/gap-answer.md +195 -0
  748. package/stack-template/docs/superpowers/contexts/auth-real/sf-1.md +21 -0
  749. package/stack-template/docs/superpowers/contexts/auth-real/sf-2.md +21 -0
  750. package/stack-template/docs/superpowers/contexts/auth-real/sf-3.md +17 -0
  751. package/stack-template/docs/superpowers/contexts/auth-real/sf-4.md +20 -0
  752. package/stack-template/docs/superpowers/contexts/auth-real/sf-5.md +21 -0
  753. package/stack-template/docs/superpowers/contexts/experience-design.md +85 -0
  754. package/stack-template/docs/superpowers/contexts/sf-1.md +39 -0
  755. package/stack-template/docs/superpowers/contexts/sf-2.md +42 -0
  756. package/stack-template/docs/superpowers/contexts/sf-3.md +42 -0
  757. package/stack-template/docs/superpowers/contexts/sf-4.md +26 -0
  758. package/stack-template/docs/superpowers/contexts/sf-5.md +36 -0
  759. package/stack-template/docs/superpowers/contexts/sf-6.md +36 -0
  760. package/stack-template/docs/superpowers/contexts/sf-7.md +35 -0
  761. package/stack-template/docs/superpowers/contexts/sf-cin-overview.md +21 -0
  762. package/stack-template/docs/superpowers/contexts/ui-redesign/sf-1.md +46 -0
  763. package/stack-template/docs/superpowers/contexts/ui-redesign/sf-2.md +44 -0
  764. package/stack-template/docs/superpowers/contexts/ui-redesign/sf-3.md +47 -0
  765. package/stack-template/docs/superpowers/contexts/ui-redesign/sf-4.md +44 -0
  766. package/stack-template/docs/superpowers/contexts/ui-redesign/sf-5.md +36 -0
  767. package/stack-template/docs/superpowers/designs/direction-approved.md +11 -0
  768. package/stack-template/docs/superpowers/designs/ui-redesign/drafts/a-roulette-soundviz.html +353 -0
  769. package/stack-template/docs/superpowers/designs/ui-redesign/drafts/b-reference.html +347 -0
  770. package/stack-template/docs/superpowers/designs/ui-redesign/drafts/c-designer.html +375 -0
  771. package/stack-template/docs/superpowers/designs/ui-redesign/ds-demo.html +140 -0
  772. package/stack-template/docs/superpowers/designs/ui-redesign-direction.md +93 -0
  773. package/stack-template/docs/superpowers/improvements-log.md +158 -0
  774. package/stack-template/docs/superpowers/mindmaps/auth-real.wakii +115 -0
  775. package/stack-template/docs/superpowers/mindmaps/kafka-outbox-saga.wakii +110 -0
  776. package/stack-template/docs/superpowers/mindmaps/micro-boilerplate.wakii +171 -0
  777. package/stack-template/docs/superpowers/mindmaps/ui-redesign.wakii +116 -0
  778. package/stack-template/docs/superpowers/mindmaps/vu53-cinematic-experience.wakii +32 -0
  779. package/stack-template/docs/superpowers/plans/2026-10-12-sf-1-contracts-platform-plan.md +44 -0
  780. package/stack-template/docs/superpowers/plans/2026-10-12-sf-3-spring-svc-impact.md +69 -0
  781. package/stack-template/docs/superpowers/plans/2026-10-12-sf-3-spring-svc-plan.md +27 -0
  782. package/stack-template/docs/superpowers/plans/2026-10-12-sf-4-go-svc-plan.md +99 -0
  783. package/stack-template/docs/superpowers/plans/2026-10-12-sf-5-fe-shell-plan.md +64 -0
  784. package/stack-template/docs/superpowers/plans/2026-10-12-sf-6-fe-remotes-plan.md +83 -0
  785. package/stack-template/docs/superpowers/plans/2026-10-12-sf-7-convergence-plan.md +59 -0
  786. package/stack-template/docs/superpowers/plans/2026-10-12-sf2-node-svc-plan.md +19 -0
  787. package/stack-template/docs/superpowers/plans/2026-10-13-sf-1-kafka-foundation-plan.md +30 -0
  788. package/stack-template/docs/superpowers/plans/2026-10-13-sf-1-ui-redesign-plan.md +28 -0
  789. package/stack-template/docs/superpowers/plans/2026-10-13-sf-2-node-outbox-plan.md +46 -0
  790. package/stack-template/docs/superpowers/plans/2026-10-13-sf-3-go-consumer-plan.md +31 -0
  791. package/stack-template/docs/superpowers/plans/2026-10-13-sf-4-spring-tx-plan.md +96 -0
  792. package/stack-template/docs/superpowers/plans/2026-10-13-sf-5-convergence-plan.md +21 -0
  793. package/stack-template/docs/superpowers/plans/2026-10-14-sf-2-ui-redesign-plan.md +32 -0
  794. package/stack-template/docs/superpowers/plans/2026-10-14-sf-3-ui-redesign-plan.md +34 -0
  795. package/stack-template/docs/superpowers/plans/2026-10-14-sf-5-ui-redesign-plan.md +35 -0
  796. package/stack-template/docs/superpowers/plans/2026-10-17-auth-real-plan.md +112 -0
  797. package/stack-template/docs/superpowers/plans/2026-10-17-ui-kit-split-plan.md +18 -0
  798. package/stack-template/docs/superpowers/reviews/2026-10-18-data-display-coverage.md +52 -0
  799. package/stack-template/docs/superpowers/reviews/code-reviewer-sf-5-r1.md +65 -0
  800. package/stack-template/docs/superpowers/reviews/security-audit-sf-5-auth-real.md +39 -0
  801. package/stack-template/docs/superpowers/specs/2026-10-12-boilerplate-microservice-mfe.md +110 -0
  802. package/stack-template/docs/superpowers/specs/2026-10-12-sf-3-spring-svc-design.md +160 -0
  803. package/stack-template/docs/superpowers/specs/2026-10-12-sf-7-convergence-spec.md +114 -0
  804. package/stack-template/docs/superpowers/specs/2026-10-12-sf2-node-svc-spec.md +42 -0
  805. package/stack-template/docs/superpowers/specs/2026-10-13-kafka-outbox-saga.md +111 -0
  806. package/stack-template/docs/superpowers/specs/2026-10-13-ui-redesign.md +173 -0
  807. package/stack-template/docs/superpowers/specs/2026-10-14-sf-3-ui-redesign.md +46 -0
  808. package/stack-template/docs/superpowers/specs/2026-10-14-sf-5-ui-redesign.md +30 -0
  809. package/stack-template/docs/superpowers/specs/2026-10-17-antd-look-tokens.md +28 -0
  810. package/stack-template/docs/superpowers/specs/2026-10-17-auth-real-design.md +124 -0
  811. package/stack-template/docs/superpowers/specs/2026-10-17-tailwind-migration.md +32 -0
  812. package/stack-template/docs/superpowers/specs/2026-10-17-ui-kit-split.md +44 -0
  813. package/stack-template/docs/superpowers/specs/2026-10-18-0.3.0-release-notes.md +77 -0
  814. package/stack-template/docs/toolchain.md +28 -0
  815. package/stack-template/docs/wakii-playbook.md +172 -0
  816. package/stack-template/docs/walkthrough.md +204 -0
  817. package/stack-template/orca.yaml +146 -0
  818. package/stack-template/package.json +19 -0
  819. package/stack-template/platform/.env.example +72 -0
  820. package/stack-template/platform/conventions/01-dockerfile-pattern.md +78 -0
  821. package/stack-template/platform/conventions/02-healthcheck.md +26 -0
  822. package/stack-template/platform/conventions/03-logging.md +41 -0
  823. package/stack-template/platform/conventions/04-error-envelope.md +41 -0
  824. package/stack-template/platform/conventions/05-ports.md +38 -0
  825. package/stack-template/platform/conventions/06-configuration.md +25 -0
  826. package/stack-template/platform/conventions/07-cors.md +23 -0
  827. package/stack-template/platform/conventions/08-gateway-and-remotes.md +33 -0
  828. package/stack-template/platform/conventions/09-async-messaging.md +42 -0
  829. package/stack-template/platform/conventions/README.md +15 -0
  830. package/stack-template/platform/docker-compose.yml +255 -0
  831. package/stack-template/platform/gateway/nginx/nginx.conf +137 -0
  832. package/stack-template/platform/postgres/init/01-init.sh +55 -0
  833. package/stack-template/pnpm-lock.yaml +15992 -0
  834. package/stack-template/pnpm-workspace.yaml +24 -0
  835. package/stack-template/scripts/scaffold/scaffold.sh +110 -0
  836. package/stack-template/scripts/smoke/e2e.sh +305 -0
  837. package/stack-template/scripts/snapshot-stack-template.sh +84 -0
  838. package/stack-template/services/auth-svc/.dockerignore +5 -0
  839. package/stack-template/services/auth-svc/Dockerfile +32 -0
  840. package/stack-template/services/auth-svc/README.md +101 -0
  841. package/stack-template/services/auth-svc/drizzle/0000_init.sql +25 -0
  842. package/stack-template/services/auth-svc/drizzle/meta/0000_snapshot.json +190 -0
  843. package/stack-template/services/auth-svc/drizzle/meta/_journal.json +13 -0
  844. package/stack-template/services/auth-svc/drizzle.config.ts +10 -0
  845. package/stack-template/services/auth-svc/package.json +35 -0
  846. package/stack-template/services/auth-svc/pnpm-lock.yaml +2425 -0
  847. package/stack-template/services/auth-svc/src/app.test.ts +403 -0
  848. package/stack-template/services/auth-svc/src/app.ts +103 -0
  849. package/stack-template/services/auth-svc/src/auth-crypto.test.ts +32 -0
  850. package/stack-template/services/auth-svc/src/auth-crypto.ts +25 -0
  851. package/stack-template/services/auth-svc/src/db/client.ts +24 -0
  852. package/stack-template/services/auth-svc/src/db/migrate.ts +72 -0
  853. package/stack-template/services/auth-svc/src/db/schema.ts +39 -0
  854. package/stack-template/services/auth-svc/src/db/seed.ts +60 -0
  855. package/stack-template/services/auth-svc/src/env.test.ts +55 -0
  856. package/stack-template/services/auth-svc/src/env.ts +57 -0
  857. package/stack-template/services/auth-svc/src/logger.ts +31 -0
  858. package/stack-template/services/auth-svc/src/plugins/auth.ts +70 -0
  859. package/stack-template/services/auth-svc/src/repo.drizzle.integration.test.ts +182 -0
  860. package/stack-template/services/auth-svc/src/repo.drizzle.ts +144 -0
  861. package/stack-template/services/auth-svc/src/repo.test-support.ts +168 -0
  862. package/stack-template/services/auth-svc/src/repo.ts +60 -0
  863. package/stack-template/services/auth-svc/src/routes/auth.ts +193 -0
  864. package/stack-template/services/auth-svc/src/routes/health.ts +40 -0
  865. package/stack-template/services/auth-svc/src/server.ts +54 -0
  866. package/stack-template/services/auth-svc/tsconfig.json +20 -0
  867. package/stack-template/services/go-svc/.dockerignore +5 -0
  868. package/stack-template/services/go-svc/Dockerfile +19 -0
  869. package/stack-template/services/go-svc/README.md +93 -0
  870. package/stack-template/services/go-svc/cmd/server/main.go +105 -0
  871. package/stack-template/services/go-svc/go.mod +12 -0
  872. package/stack-template/services/go-svc/internal/api/auth.go +83 -0
  873. package/stack-template/services/go-svc/internal/api/auth_test.go +92 -0
  874. package/stack-template/services/go-svc/internal/api/envelope.go +61 -0
  875. package/stack-template/services/go-svc/internal/api/envelope_test.go +51 -0
  876. package/stack-template/services/go-svc/internal/api/fakes_test.go +105 -0
  877. package/stack-template/services/go-svc/internal/api/feed.go +98 -0
  878. package/stack-template/services/go-svc/internal/api/feed_test.go +118 -0
  879. package/stack-template/services/go-svc/internal/api/health.go +34 -0
  880. package/stack-template/services/go-svc/internal/api/health_test.go +46 -0
  881. package/stack-template/services/go-svc/internal/api/json.go +13 -0
  882. package/stack-template/services/go-svc/internal/api/middleware.go +82 -0
  883. package/stack-template/services/go-svc/internal/api/middleware_test.go +48 -0
  884. package/stack-template/services/go-svc/internal/api/openapi/activity.yaml +196 -0
  885. package/stack-template/services/go-svc/internal/api/openapi.go +29 -0
  886. package/stack-template/services/go-svc/internal/api/openapi_test.go +38 -0
  887. package/stack-template/services/go-svc/internal/api/router.go +86 -0
  888. package/stack-template/services/go-svc/internal/api/stats.go +63 -0
  889. package/stack-template/services/go-svc/internal/api/stats_test.go +83 -0
  890. package/stack-template/services/go-svc/internal/api/types.go +32 -0
  891. package/stack-template/services/go-svc/internal/apperr/apperr.go +9 -0
  892. package/stack-template/services/go-svc/internal/config/config.go +115 -0
  893. package/stack-template/services/go-svc/internal/config/config_test.go +92 -0
  894. package/stack-template/services/go-svc/internal/consumer/envelope.go +78 -0
  895. package/stack-template/services/go-svc/internal/consumer/envelope_test.go +154 -0
  896. package/stack-template/services/go-svc/internal/consumer/handler.go +91 -0
  897. package/stack-template/services/go-svc/internal/consumer/handler_test.go +136 -0
  898. package/stack-template/services/go-svc/internal/consumer/producer.go +117 -0
  899. package/stack-template/services/go-svc/internal/consumer/runner.go +194 -0
  900. package/stack-template/services/go-svc/internal/consumer/runner_test.go +351 -0
  901. package/stack-template/services/go-svc/internal/logging/logging.go +49 -0
  902. package/stack-template/services/go-svc/internal/model/model.go +37 -0
  903. package/stack-template/services/go-svc/internal/resolve/resolver.go +134 -0
  904. package/stack-template/services/go-svc/internal/resolve/resolver_test.go +82 -0
  905. package/stack-template/services/go-svc/internal/resolve/token.go +130 -0
  906. package/stack-template/services/go-svc/internal/resolve/token_test.go +151 -0
  907. package/stack-template/services/go-svc/internal/store/events.go +71 -0
  908. package/stack-template/services/go-svc/internal/store/migrate.go +90 -0
  909. package/stack-template/services/go-svc/internal/store/migrate_test.go +34 -0
  910. package/stack-template/services/go-svc/internal/store/migrations/0001_create_events.sql +20 -0
  911. package/stack-template/services/go-svc/internal/store/migrations/0002_widen_action_cascade.sql +14 -0
  912. package/stack-template/services/go-svc/internal/store/store.go +65 -0
  913. package/stack-template/services/go-svc/internal/store/tasks.go +109 -0
  914. package/stack-template/services/go-svc/internal/swagger/assets/LICENSE +202 -0
  915. package/stack-template/services/go-svc/internal/swagger/assets/NOTICE +2 -0
  916. package/stack-template/services/go-svc/internal/swagger/assets/favicon-16x16.png +0 -0
  917. package/stack-template/services/go-svc/internal/swagger/assets/favicon-32x32.png +0 -0
  918. package/stack-template/services/go-svc/internal/swagger/assets/swagger-ui-bundle.js +2 -0
  919. package/stack-template/services/go-svc/internal/swagger/assets/swagger-ui.css +3 -0
  920. package/stack-template/services/go-svc/internal/swagger/index.html +28 -0
  921. package/stack-template/services/go-svc/internal/swagger/swagger.go +38 -0
  922. package/stack-template/services/go-svc/test/integration/integration_test.go +523 -0
  923. package/stack-template/services/node-svc/.dockerignore +5 -0
  924. package/stack-template/services/node-svc/Dockerfile +27 -0
  925. package/stack-template/services/node-svc/README.md +155 -0
  926. package/stack-template/services/node-svc/drizzle/0000_init.sql +17 -0
  927. package/stack-template/services/node-svc/drizzle/0001_status-assignment-failed.sql +2 -0
  928. package/stack-template/services/node-svc/drizzle/0002_outbox-table.sql +7 -0
  929. package/stack-template/services/node-svc/drizzle/meta/0000_snapshot.json +136 -0
  930. package/stack-template/services/node-svc/drizzle/meta/0001_snapshot.json +136 -0
  931. package/stack-template/services/node-svc/drizzle/meta/0002_snapshot.json +180 -0
  932. package/stack-template/services/node-svc/drizzle/meta/_journal.json +27 -0
  933. package/stack-template/services/node-svc/drizzle.config.ts +10 -0
  934. package/stack-template/services/node-svc/package.json +39 -0
  935. package/stack-template/services/node-svc/pnpm-lock.yaml +2706 -0
  936. package/stack-template/services/node-svc/src/app.test.ts +611 -0
  937. package/stack-template/services/node-svc/src/app.ts +126 -0
  938. package/stack-template/services/node-svc/src/clients/spring.ts +53 -0
  939. package/stack-template/services/node-svc/src/compensation-consumer.test.ts +157 -0
  940. package/stack-template/services/node-svc/src/compensation-consumer.ts +170 -0
  941. package/stack-template/services/node-svc/src/db/client.ts +23 -0
  942. package/stack-template/services/node-svc/src/db/migrate.ts +63 -0
  943. package/stack-template/services/node-svc/src/db/schema-diff.test.ts +252 -0
  944. package/stack-template/services/node-svc/src/db/schema.ts +64 -0
  945. package/stack-template/services/node-svc/src/env.ts +52 -0
  946. package/stack-template/services/node-svc/src/logger.ts +18 -0
  947. package/stack-template/services/node-svc/src/outbox-relay.test.ts +141 -0
  948. package/stack-template/services/node-svc/src/outbox-relay.ts +182 -0
  949. package/stack-template/services/node-svc/src/plugins/auth.ts +76 -0
  950. package/stack-template/services/node-svc/src/repo.drizzle.test.ts +182 -0
  951. package/stack-template/services/node-svc/src/repo.drizzle.ts +158 -0
  952. package/stack-template/services/node-svc/src/repo.ts +73 -0
  953. package/stack-template/services/node-svc/src/routes/health.ts +42 -0
  954. package/stack-template/services/node-svc/src/routes/tasks.ts +287 -0
  955. package/stack-template/services/node-svc/src/server.ts +91 -0
  956. package/stack-template/services/node-svc/src/types/api.d.ts +391 -0
  957. package/stack-template/services/node-svc/src/types/log.ts +3 -0
  958. package/stack-template/services/node-svc/tsconfig.json +20 -0
  959. package/stack-template/services/spring-svc/.dockerignore +5 -0
  960. package/stack-template/services/spring-svc/.mvn/wrapper/maven-wrapper.properties +20 -0
  961. package/stack-template/services/spring-svc/Dockerfile +22 -0
  962. package/stack-template/services/spring-svc/README.md +121 -0
  963. package/stack-template/services/spring-svc/mvnw +332 -0
  964. package/stack-template/services/spring-svc/mvnw.cmd +206 -0
  965. package/stack-template/services/spring-svc/pom.xml +144 -0
  966. package/stack-template/services/spring-svc/src/main/java/com/example/springsvc/SpringSvcApplication.java +12 -0
  967. package/stack-template/services/spring-svc/src/main/java/com/example/springsvc/domain/Team.java +64 -0
  968. package/stack-template/services/spring-svc/src/main/java/com/example/springsvc/domain/TeamRepository.java +34 -0
  969. package/stack-template/services/spring-svc/src/main/java/com/example/springsvc/domain/User.java +72 -0
  970. package/stack-template/services/spring-svc/src/main/java/com/example/springsvc/domain/UserRepository.java +10 -0
  971. package/stack-template/services/spring-svc/src/main/java/com/example/springsvc/logging/LowercaseLevelJsonProvider.java +24 -0
  972. package/stack-template/services/spring-svc/src/main/java/com/example/springsvc/security/JwtAuthFilter.java +89 -0
  973. package/stack-template/services/spring-svc/src/main/java/com/example/springsvc/security/JwtVerifier.java +48 -0
  974. package/stack-template/services/spring-svc/src/main/java/com/example/springsvc/service/TeamService.java +84 -0
  975. package/stack-template/services/spring-svc/src/main/java/com/example/springsvc/web/ApiError.java +15 -0
  976. package/stack-template/services/spring-svc/src/main/java/com/example/springsvc/web/ApiException.java +37 -0
  977. package/stack-template/services/spring-svc/src/main/java/com/example/springsvc/web/DevCorsConfig.java +41 -0
  978. package/stack-template/services/spring-svc/src/main/java/com/example/springsvc/web/ErrorEnvelope.java +27 -0
  979. package/stack-template/services/spring-svc/src/main/java/com/example/springsvc/web/GlobalExceptionHandler.java +90 -0
  980. package/stack-template/services/spring-svc/src/main/java/com/example/springsvc/web/HealthController.java +46 -0
  981. package/stack-template/services/spring-svc/src/main/java/com/example/springsvc/web/ReadinessService.java +40 -0
  982. package/stack-template/services/spring-svc/src/main/java/com/example/springsvc/web/TeamController.java +79 -0
  983. package/stack-template/services/spring-svc/src/main/java/com/example/springsvc/web/UserController.java +187 -0
  984. package/stack-template/services/spring-svc/src/main/java/db/migration/V2__SeedUsers.java +66 -0
  985. package/stack-template/services/spring-svc/src/main/resources/application.yml +42 -0
  986. package/stack-template/services/spring-svc/src/main/resources/db/migration/V1__init.sql +24 -0
  987. package/stack-template/services/spring-svc/src/main/resources/logback-spring.xml +34 -0
  988. package/stack-template/services/spring-svc/src/main/resources/openapi/users.yaml +345 -0
  989. package/stack-template/services/spring-svc/src/test/java/com/example/springsvc/logging/LogShapeTest.java +39 -0
  990. package/stack-template/services/spring-svc/src/test/java/com/example/springsvc/security/JwtAuthFilterTest.java +106 -0
  991. package/stack-template/services/spring-svc/src/test/java/com/example/springsvc/seed/SeedMatchIntegrationTest.java +68 -0
  992. package/stack-template/services/spring-svc/src/test/java/com/example/springsvc/service/TeamServiceRollbackTest.java +122 -0
  993. package/stack-template/services/spring-svc/src/test/java/com/example/springsvc/web/DevCorsTest.java +45 -0
  994. package/stack-template/services/spring-svc/src/test/java/com/example/springsvc/web/HealthCheckTest.java +56 -0
  995. package/stack-template/services/spring-svc/src/test/java/com/example/springsvc/web/TeamApiTest.java +139 -0
  996. package/stack-template/services/spring-svc/src/test/java/com/example/springsvc/web/TestPingController.java +21 -0
  997. package/stack-template/services/spring-svc/src/test/java/com/example/springsvc/web/UserApiTest.java +182 -0
  998. package/stack-template/stack-manifest.json +285 -0
@@ -0,0 +1,85 @@
1
+ # EXPERIENCE-DESIGN — hợp đồng thiết kế Templates/Cinematic Experience (v1.0 — SF-1)
2
+
3
+ > Nguồn: REF-SPEC (`docs/team/ref/REF-SPEC.md`, PO đo live 1280×800) + mindmap VU-53-CIN SF-1.
4
+ > **Mọi SF code theo file này.** Sửa contract = PR riêng + lead duyệt. IP: số đo/cấu trúc tham
5
+ > khảo ref — copy/ảnh/nội dung là Orca/Wakii (VN-flavored).
6
+
7
+ ## 1. Typography scale (REF-SPEC — đo computed, dùng đúng số)
8
+
9
+ | Vai trò | Spec | Utility |
10
+ |---|---|---|
11
+ | Display / brand / CTA | **12px / 700 UPPERCASE / tracking 2.4px** | `text-[12px] font-bold uppercase tracking-[2.4px]` |
12
+ | Label mono (kicker, CHƯƠNG 0X) | **11px / 700 UPPERCASE / tracking 2.64px / font-mono** | `font-mono text-[11px] font-bold uppercase tracking-[2.64px]` |
13
+ | H1 hero | **18px / 300 LIGHT / uppercase / tracking 0.14em / line-height 1.6 / line-break chủ động** | `Typography.Title level={1}` + style |
14
+ | H2 chapter | **~29px / 300 light / leading-snug / tracking 0.02em** | `text-[29px] font-light leading-snug tracking-[0.02em]` |
15
+ | Hero editorial đoạn | **17px / 400 / leading 1.5** (cụm trái, KHÔNG caps) | `text-[17px] leading-[1.5]` |
16
+ | Body | **12px / 400 / tracking 0.3px / leading 1.7** | `text-[12px] leading-[1.7] tracking-[0.3px]` |
17
+ | Meta số (stats) | tabular-nums, 30px bold band / 3xl cards | `text-3xl font-bold tabular-nums` |
18
+
19
+ Quy tắc: KHÔNG bold to (editorial LIGHT); heading lớn chỉ ≥3:1, body ≥4.5:1 (WCAG luminance — verify script trong story mood-engine).
20
+
21
+ ## 2. Palette 5 mood + hero/end (token + gradient stops từng chương)
22
+
23
+ Token nền tự chủ (không theo theme — thêm 1 lần vào `styles/tokens.css`, đã có):
24
+ `--hero-sky-a: #ffffff` · `--hero-sky-b: #e8edf4` · `--navy-ink: rgb(16,36,52)` ·
25
+ `--hero-ink: rgb(16,36,52)` (cố định, KHÔNG flip dark) · `--chapter-bg-a: rgb(10,12,22)` ·
26
+ `--chapter-bg-b: rgb(16,36,52)`.
27
+
28
+ | # | Mood id | Chương | Gradient stops (background) | Ink | Dot/nhấn |
29
+ |---|---|---|---|---|---|
30
+ | 0 | `atlas` | Hero | `165deg, #cdd8f6 0% → var(--hero-sky-a) 55% → #dfe4fb 100%` (light-cố định) | `--navy-ink` (light) / trắng (dark) | `#ff5c39` ◆ |
31
+ | 1 | `focus` | Ch1 Deep focus | `180deg, var(--chapter-bg-a) → var(--chapter-bg-b)` | `white/92` body · `white` heading | `--st-done` |
32
+ | 2 | `docs` | Ch2 Living docs | `180deg, var(--chapter-bg-b) → rgb(10,20,38)` | `white/85` | `--accent` (duotone ảnh accent→done multiply) |
33
+ | 3 | `velocity` | Ch3 Velocity | `180deg, var(--chapter-bg-a) → color-mix(in srgb, var(--accent) 14%, rgb(10,12,22))` | `white/92` | mood accent LIVE (`#5e6ad2/#0d9488/#ea580c` — text dùng `accent-hi` ≥4.5:1) |
34
+ | 4 | `ship` | Ch4 Ship 3D | `180deg, rgb(10,12,22) → var(--scrim-4)` + ảnh `opacity-60` + `from-black/85 via-black/55` | `white` | `--accent` |
35
+ | 5 | `future` | Ch5 + End CTA | `180deg, var(--c-s1) → var(--c-canvas)` (sáng trở lại) | `--ink` (theme-flip — nền sáng cả dark) | `--st-done` |
36
+
37
+ Crossfade: `MoodBackdrop` (lib/scroll-mood) render 1 layer absolute/mood, opacity
38
+ `clamp(0, 1 − |p×(N−1) − i|, 1)` với `p` = progress scroll toàn trang (rAF) — chạy mượt
39
+ liên tục, không re-render content.
40
+
41
+ ## 3. Spacing scale
42
+
43
+ | Khoảng | Giá trị |
44
+ |---|---|
45
+ | Section programmatic padding | `py-16` (chapter) · hero/end `min-h-screen` + `p-6` |
46
+ | Content rail | `mx-auto max-w-5xl px-10` (max-md px-6) |
47
+ | Grid chapter | `md:grid-cols-2 gap-8 items-center` |
48
+ | Card gap | `gap-4` grid · `gap-2` list feature · `gap-10` KPI |
49
+ | Pinned | section `h-[200vh]` + con `sticky top-0 h-screen overflow-hidden` |
50
+ | Side-nav | `fixed left-6` w-44, offsetTop 0, ẩn < md |
51
+
52
+ ## 4. Motion vocabulary (duy nhất các hiệu ứng này)
53
+
54
+ | Hiệu ứng | Thông số | Dùng ở |
55
+ |---|---|---|
56
+ | Parallax nền-gần-fixed | `speed 0.08 / strength 280` | hero BG · chapter BG · ch4 |
57
+ | Parallax lớp giữa | `speed 0.3 / strength 240` | gate checklist · quote |
58
+ | Parallax chữ dẫn đầu | `speed 0.5 / strength 280` | hero content · ch4 chữ |
59
+ | Reveal | direction up/left/right · `delay 80–320ms, stagger +90ms` | sections/cards/features |
60
+ | CountUp | `duration 1.2s` default · format vi-VN | KPI/CTA/ch1 |
61
+ | Mask-reveal ảnh | `clip-path inset(0 X% 0 0)` theo `useSectionProgress` | ch2/ch3 ảnh |
62
+ | Split-text reveal | từng chữ stagger CSS (template-local) | ch1 |
63
+ | Mood crossfade | `MoodBackdrop` rAF — opacity nội suy tuyến tính | toàn trang |
64
+ | Sun journey | cung sin x10→90% · y 20→8→20% · 4 pha | section riêng |
65
+ | UI micro | 150–250ms + `--ease-enter/exit` · infinite CHỈ trạng thái (pulse WIP) | — |
66
+
67
+ `prefers-reduced-motion`: Parallax/Reveal/CountUp/Scene3D tự tắt (frame tĩnh) — không chapter nào tự viết motion ngoài vocabulary.
68
+
69
+ ## 5. Ảnh-grade chuẩn (Avatar/Getty graded — mọi ảnh trong chapters)
70
+
71
+ 1. Ảnh gốc `grayscale` (Tailwind filter).
72
+ 2. Overlay duotone: `bg-gradient-to-tr from-accent/25 via-transparent to-st-done/20 mix-blend-multiply` (accent theo mood chương).
73
+ 3. Vignette mép: `[box-shadow:inset_0_0_90px_var(--scrim-2)]`.
74
+ 4. Mask-reveal clip-path khi muốn lộ dần (xem motion). Overlay nằm TRONG wrapper bị clip.
75
+
76
+ ## 6. A11y & quality gate
77
+
78
+ - Chapter container: `<section id="chN" data-mood="<mood-id>" className="relative min-h-screen">`.
79
+ - CTA là `button`/`a` thật; heading h2/chương; Icon trang trí aria-hidden (default).
80
+ - Contrast: body ≥4.5:1, heading ≥3:1 — verify bằng script luminance (story mood-engine log số).
81
+ - Chỉnh màu chapter KHÔNG dùng token flip (--ink/--ink2) — dùng white-alpha cố định (nền tự chủ tối).
82
+
83
+ ## 7. Đổi contract
84
+
85
+ PR riêng sửa file này + đánh版本 v1.x. Chapter không theo contract = gate fail (lead check bằng số đo trong verify paste).
@@ -0,0 +1,39 @@
1
+ # SF-1 Context Pack — Kafka foundation + async contracts
2
+ > Đọc file này THAY VÌ tự tổng hợp. Epic spec: `docs/superpowers/specs/2026-10-13-kafka-outbox-saga.md` (rev 3). Mindmap: `docs/superpowers/mindmaps/kafka-outbox-saga.wakii`.
3
+ > Story trước FI-62 đã merge (main @0785930) — repo CÓ code thật.
4
+
5
+ ## Spec slice (chỉ phần SF-1 chịu trách nhiệm)
6
+ 1. `platform/docker-compose.yml` thêm entry `kafka`: image `apache/kafka` (KRaft native, KHÔNG zookeeper), `KAFKA_HEAP_OPTS` ~512MB, healthcheck dùng **full path** `/opt/kafka/bin/kafka-broker-api-versions.sh --bootstrap-server localhost:9092` (image không có script trên PATH), KHÔNG service nào `depends_on` kafka, KHÔNG expose 9092 ra host. Cập nhật **header ownership** compose (SF-1 story này sở hữu).
7
+ 2. **PRE-ADD env cho downstream (P0 plan-critic — 1 lần sửa compose duy nhất)**: entry `node-svc` thêm `KAFKA_BROKERS: ${KAFKA_BROKERS:-kafka:9092}`; entry `go-svc` thêm `KAFKA_BROKERS` + `AUTH_MOCK_URL: http://auth-mock:8090` + `SVC_ACTIVITY_PASSWORD: ${SVC_ACTIVITY_PASSWORD:?set in .env}`. Đồng bộ `.env.example` (KAFKA_BROKERS, SVC_ACTIVITY_PASSWORD + các kafka env nếu cần). SF-2/3 KHÔNG đụng compose.
8
+ 3. `contracts/events/task-events.md`: envelope `{schemaVersion:1, id: UUID, type, occurredAt: RFC3339, payload}`; payload shape THEO EVENT TYPE (task.created/updated/assigned/deleted/assignment_failed — liệt kê fields chính xác: taskId, userId, assigneeId?, title?, status?); **filter-by-type convention**: group `go-svc-activity` xử lý mọi type TRỪ `task.assignment_failed`, group `node-svc-compensation` CHỈ nhận `task.assignment_failed`; topics `task-events` (1 partition) + `task-events.dlq`; retry ×3 in-memory rồi DLQ; manual commit sau DB tx; auto.offset.reset earliest.
9
+ 4. **Golden fixtures `contracts/events/fixtures/*.json`** — mỗi event type 1 file mẫu đúng envelope (P0 plan-critic: SF-2 relay test + SF-3 consumer test + CI console-producer ĐỀU load đây — contract machine-checkable 2 đầu).
10
+ 5. `platform/conventions/09-async-messaging.md`: quy tắc producer/consumer/retry/DLQ/idempotency (envelope id do producer sinh, consumer ON CONFLICT), lazy-connect rule (Kafka không vào readyz/depends_on).
11
+ 6. Fixture users: thêm `svc-fail` (email `fail@demo.local`) + `svc-activity` (service user) vào `contracts/auth/users.json` — roles `["user"]` khớp enum users.yaml (spring `SeedMatchIntegrationTest` so seed↔fixture runtime); auth-mock + spring V2 seed đọc tự nhiên (mount runtime, không cần migration mới vì CI volume fresh).
12
+ 7. `docs/adr/0008-*.md` supersede ADR-0006: vì sao Kafka KRaft, outbox tự viết (không Debezium), simplifications có chủ đích (presence-based trigger, in-memory retry count, PLAINTEXT, segmentio/kafka-go — franz-go là path production), saga choreography.
13
+ 8. README section compose: 10 services, kafka lazy-connect note.
14
+
15
+ ## Touch map (files SF-1 tạo/sở hữu)
16
+ ```
17
+ platform/docker-compose.yml [SỬA — SỞ HỮU story này; pre-add env đúng 1 lần]
18
+ platform/.env.example [SỬA — SỞ HỮU]
19
+ contracts/events/task-events.md [TẠO — SỞ HỮU]
20
+ contracts/events/fixtures/*.json [TẠO — SỞ HỮU, golden cho SF-2/3]
21
+ contracts/auth/users.json [SỬA — thêm 2 fixture users]
22
+ platform/conventions/09-async-messaging.md [TẠO — SỞ HỮU]
23
+ docs/adr/0008-*.md [TẠO — SỞ HỮU]
24
+ README.md [SỬA section compose]
25
+ services/node-svc|go-svc/**, contracts/openapi/*, contracts/db/* [KHÔNG ĐỤNG — SF-2/3 sở hữu]
26
+ ```
27
+
28
+ ## ACCEPTANCE (user-visible)
29
+ - `docker compose config -q` validate với entry kafka + env mới (CI-verified — dev machine không Docker).
30
+ - CI: convergence không đỏ vì kafka entry (không service depend kafka — chain 9 service nguyên vẹn).
31
+ - Golden fixtures parse được JSON, envelope đủ field theo task-events.md, mỗi event type 1 file.
32
+ - users.json có 2 user mới, roles hợp lệ, spring SeedMatch test (chạy ở SF-4 branch) vẫn pass khi merge.
33
+ - ADR-0008 + conventions/09 tồn tại, narrative khớp ADR-0006 (supersede rõ ràng).
34
+
35
+ ## Boundary (KHÔNG làm)
36
+ - KHÔNG đụng `contracts/db/tasks-schema.sql`, `contracts/openapi/tasks.yaml`, `activity.yaml`, `services/node-svc/**`, `services/go-svc/**`, FE — SF-2/3 sở hữu.
37
+ - KHÔNG đưa kafka vào readyz/depends_on bất kỳ service nào.
38
+ - KHÔNG expose 9092 ra host. KHÔNG SASL/SSL.
39
+ - Compose chỉ sửa ĐÚNG 1 lần (pre-add env trọn vẹn) — SF-2+ đụng compose = flag.
@@ -0,0 +1,42 @@
1
+ # SF-2 Context Pack — node-svc Outbox + Producer + compensation consumer
2
+ > Đọc file này THAY VÌ tự tổng hợp. Epic spec: `docs/superpowers/specs/2026-10-13-kafka-outbox-saga.md` (rev 3). Mindmap: `docs/superpowers/mindmaps/kafka-outbox-saga.wakii`.
3
+ > Depends: SF-1 (KAFKA_BROKERS env đã pre-add trong compose, golden fixtures, conventions/09).
4
+
5
+ ## Spec slice (chỉ phần SF-2 chịu trách nhiệm)
6
+ 1. **Cụm nguyên tử node-side cascade** (1 cụm — sửa cùng lúc để schema-diff.test không đỏ giữa chừng): canonical DDL `contracts/db/tasks-schema.sql` CHECK status thêm `'assignment_failed'` (varchar(20) đủ — 17 ký tự) + `src/db/schema.ts` mirror + migration CHECK + `contracts/openapi/tasks.yaml` **TaskStatus split**: `TaskStatus` 3 giá trị (query param + PATCH body — WRITABLE) / `TaskStatusExtended` 4 giá trị (chỉ `Task.status` response — READ-ONLY). PATCH KHÔNG nhận `assignment_failed` (system-owned); route hard-code 3 giá trị giữ cho query/body, response nới. Typegen drift job sẽ ép commit api.d.ts.
7
+ 2. **Pin schema-diff.test scope (P0)**: `src/db/schema-diff.test.ts` hiện assert `migrated.tables === canonical.tables` + `canonical.indexes.length === 3` — sửa test WHITELIST outbox table với expected-def riêng (không đếm vào canonical), canonical + index-3 GIỮ NGUYÊN (hướng ngược làm đỏ copy-dir standalone).
8
+ 3. Outbox table migration (schema `tasks`: id UUID **do node sinh**, type, payload jsonb, created_at, published_at nullable) + drizzle schema. Outbox KHÔNG vào canonical DDL (node-internal infra).
9
+ 4. **Transactional repo API** (drizzle có `.transaction()` gốc): đổi interface `TaskRepo` (`repo.ts:38-45`) + impl `repo.drizzle.ts` + fake — repo method nhận outbox op, **envelope id sinh trong repo**; event matrix PRESENCE-BASED: POST→`task.created`; PATCH có assigneeId→`task.assigned` (+`task.updated` nếu body còn field khác); PATCH không assigneeId→`task.updated`; DELETE→`task.deleted`; KHÔNG có unassign/null. Fake repo có seam tiêm lỗi giữa 2 step.
10
+ 5. Relay worker: poll 500ms, publish **đúng golden fixture format** (`contracts/events/fixtures/*.json` — test load chung), mark `published_at`, purge note (published cũ > N ngày).
11
+ 6. Xóa `clients/activity.ts` + 5 refs (`app.ts:24`, `app.test.ts`, `routes/tasks.ts:30`, `server.ts:5,22`) — thay bằng relay + consumer wiring.
12
+ 7. Compensation consumer (group `node-svc-compensation`, CHỈ type `task.assignment_failed`): `UPDATE task SET status='assignment_failed' WHERE id AND assignee_id=<payload.assigneeId> AND status NOT IN ('assignment_failed')` — **CONDITIONAL guard chống stale compensation** (bắt buộc — dạy saga đúng).
13
+ 8. **Task `services-node-svc.yml` kafka boot-smoke (P0)**: `up -d postgres kafka node-svc` + assert outbox row `published_at IS NOT NULL` sau publish (relay THẬT trên CI, không fake).
14
+ 9. Tests: tx rollback (seam fail giữa 2 step → task VÀ outbox cùng biến mất), relay unit (fake producer), consumer unit. `KAFKA_BROKERS` lazy-connect (env đã có từ SF-1 — KHÔNG sửa compose).
15
+ 10. README node-svc: standalone ghi dependency contracts/db (FLAG sẵn convergence.yml:62) + outbox/kafka section.
16
+
17
+ ## Touch map (files SF-2 tạo/sở hữu)
18
+ ```
19
+ services/node-svc/** [SỞ HỮU — kể cả xóa clients/activity.ts]
20
+ contracts/db/tasks-schema.sql [SỬA — SF-2 sở hữu cụm node-side]
21
+ contracts/openapi/tasks.yaml [SỬA — TaskStatus split]
22
+ platform/docker-compose.yml [READ-ONLY — env đã pre-add SF-1; đụng = FLAG]
23
+ contracts/events/fixtures/*.json [READ-ONLY — test load, KHÔNG sửa]
24
+ platform/conventions/09, contracts/events/task-events.md [READ-ONLY]
25
+ .github/workflows/services-node-svc.yml [SỞ HỮU — kafka boot-smoke task]
26
+ pnpm-lock.yaml [kafkajs + commit bình thường; conflict SF-3 = coordinator resolve]
27
+ ```
28
+
29
+ ## ACCEPTANCE (user-visible)
30
+ - Tạo task → outbox row xuất hiện TRONG cùng tx (seam-fail test: task + outbox cùng biến mất khi fail giữa 2 step).
31
+ - Relay publish format KHỚP golden fixture (test 2 đầu load chung file).
32
+ - CI node workflow xanh gồm boot-smoke kafka: outbox row `published_at IS NOT NULL` trên broker thật.
33
+ - PATCH `status: assignment_failed` bị từ chối (schema PATCH 3 giá trị); GET task `assignment_failed` hợp lệ (extended).
34
+ - Compensation consumer: event task.assignment_failed → task status đổi; stale event (assignee khác) KHÔNG đổi (conditional guard test).
35
+ - 23/23 tests cũ không vỡ (hoặc cập nhật chính đáng theo matrix).
36
+
37
+ ## Boundary (KHÔNG làm)
38
+ - KHÔNG sửa compose/.env.example (SF-1 pre-add rồi — đụng = FLAG).
39
+ - KHÔNG sửa contracts/events/**, conventions/09, users.json, activity.yaml, go-svc, FE.
40
+ - KHÔNG đụng services-go-svc.yml (SF-3).
41
+ - KHÔNG value-compare trigger (presence-based là chủ đích — ADR-0008).
42
+ - KHÔNG thử docker/kafka local — CI verify (dev machine không Docker).
@@ -0,0 +1,42 @@
1
+ # SF-3 Context Pack — go-svc Consumer + Saga + thanh lý ingest
2
+ > Đọc file này THAY VÌ tự tổng hợp. Epic spec: `docs/superpowers/specs/2026-10-13-kafka-outbox-saga.md` (rev 3). Mindmap: `docs/superpowers/mindmaps/kafka-outbox-saga.wakii`.
3
+ > Depends: SF-1 (env pre-add: KAFKA_BROKERS, AUTH_MOCK_URL, SVC_ACTIVITY_PASSWORD; golden fixtures; conventions/09).
4
+
5
+ ## Spec slice (chỉ phần SF-3 chịu trách nhiệm)
6
+ 1. **Cụm nguyên tử activity-side cascade**: migration `internal/store/migrations/0002_*.sql` — **`ALTER COLUMN action TYPE varchar(40)`** (`task.assignment_failed` = 22 ký tự > varchar(20) — chỉ sửa CHECK quên width = InsertEvent chết runtime, retry ×3 → DLQ sai nguyên nhân) + CHECK drop/recreate thêm `task.assigned`/`task.assignment_failed`.
7
+ 2. **activity.yaml ×2 FILE** (P0 — sửa 1 bỏ 1 = docs endpoint lệch im lặng): canonical `contracts/openapi/activity.yaml` + snapshot nhúng `services/go-svc/internal/api/openapi/activity.yaml` — TRỌN GÓI: xóa `/events` path + `ActivityEventInput` + `EventAccepted`; enum action thêm `task.assigned`/`task.assignment_failed`; description bỏ "fire-and-forget"; stats keys thêm assignment_failed. **Thêm diff-guard 2 file vào `services-go-svc.yml`** (precedent: services-spring-svc.yml diff users.yaml).
8
+ 3. `store/tasks.go` byStatus map thêm key `assignment_failed` (stats hiện hard-code 3 keys).
9
+ 4. Consumer package `internal/consumer/`: `segmentio/kafka-go` (ADR ghi franz-go = path production), group `go-svc-activity`, manual commit SAU DB tx, **ON CONFLICT DO NOTHING bằng envelope id** (id do node sinh — đổi `store/events.go` InsertEvent nhận id từ envelope, bỏ `uuid.New()`), filter-by-type (bỏ qua `task.assignment_failed`), auto.offset.reset earliest. Test load golden fixture.
10
+ 5. Retry ×3 (in-memory) → publish `task.assignment_failed` (envelope id MỚI do go sinh — go là producer lúc này) vào `task-events` → đẩy event gốc vào `task-events.dlq`.
11
+ 6. Resolver service-token: boot login `svc-activity` (AUTH_MOCK_URL + SVC_ACTIVITY_PASSWORD env từ SF-1) — **retry backoff, KHÔNG crash nếu auth-mock chưa lên** (go chỉ depends_on postgres); lazy re-login khi 401/expiry; cache JWT cho resolver enrich userName.
12
+ 7. Xóa `internal/api/events.go` ingest + route wiring + `events_test.go` cập nhật + integration test cập nhật (không còn POST /events — schemathesis step trong workflow cũng theo).
13
+ 8. **`services-go-svc.yml` 3 điểm chạm + diff-guard (P0)**: (a) step event→feed→stats POST /events → thay bằng **kafka console producer publish golden fixture** (script trong image apache/kafka) + kafka vào subset boot + **tạo topic tường minh** (`kafka-topics.sh --create` task-events + dlq, 1 partition — không dựa auto-create); (b) stats assert exact-equality 3 keys → nới thêm assignment_failed; (c) giữ ≥1 proof event→feed (chống thoái hóa).
14
+ 9. Simulate fail hook: assigneeId = svc-fail → consumer cố tình fail (deterministic cho e2e saga SF-5).
15
+ 10. `internal/config/config.go` +KAFKA_BROKERS/group/DLQ/AUTH_MOCK_URL/SVC_ACTIVITY_PASSWORD; `model` +action constants; go.mod +segmentio.
16
+
17
+ ## Touch map (files SF-3 tạo/sở hữu)
18
+ ```
19
+ services/go-svc/** [SỞ HỮU — kể cả xóa ingest, thêm consumer]
20
+ contracts/openapi/activity.yaml [SỬA — SF-3 sở hữu trọn gói]
21
+ services/go-svc/internal/api/openapi/activity.yaml [SỬA — snapshot ×2]
22
+ frontend/remotes/tasks/** (type + statusLabel + tests) [SỞ HỮU — badge assignment_failed, P0 plan-critic gán đích danh]
23
+ frontend/remotes/activity/** (action labels + tests) [SỞ HỮU]
24
+ .github/workflows/services-go-svc.yml [SỞ HỮU — 3 điểm chạm + diff-guard]
25
+ contracts/events/fixtures/*.json [READ-ONLY — test load, KHÔNG sửa]
26
+ platform/docker-compose.yml [READ-ONLY — env đã pre-add; kafka đã có; đụng = FLAG]
27
+ ```
28
+
29
+ ## ACCEPTANCE (user-visible)
30
+ - CI go-svc xanh: boot-smoke subset có kafka, publish golden fixture qua console producer → feed có row (proof event→feed), stats nới pass, diff-guard pass.
31
+ - Consumer unit: golden fixture → activity row đúng; duplicate envelope id → vẫn 1 row (idempotency).
32
+ - Retry/DLQ: simulate svc-fail → 3 retry → `task.assignment_failed` publish + event gốc vào DLQ (test assert).
33
+ - Resolver: enrich userName bằng service-token; auth-mock down lúc boot → không crash, retry; 401 → lazy re-login.
34
+ - GET /api/activity/events → 404 (ingest đã xóa); docs endpoint khớp contract (diff-guard).
35
+ - FE remote-tasks: task `assignment_failed` render badge đúng; remote-activity action label mới có.
36
+
37
+ ## Boundary (KHÔNG làm)
38
+ - KHÔNG sửa compose/.env.example, contracts/events/**, conventions/09, contracts/db, tasks.yaml, node-svc, spring-svc (đụng = FLAG).
39
+ - KHÔNG đụng services-node-svc.yml (SF-2).
40
+ - KHÔNG dùng franz-go (segmentio theo spec; franz-go ghi ADR).
41
+ - KHÔNG SASL/SSL — PLAINTEXT compose-internal.
42
+ - KHÔNG thử docker/kafka local — CI verify.
@@ -0,0 +1,26 @@
1
+ # SF-4 Context Pack — spring-svc @Transactional demo
2
+ > Đọc file này THAY VÌ tự tổng hợp. Epic spec: `docs/superpowers/specs/2026-10-13-kafka-outbox-saga.md` (rev 3). Mindmap: `docs/superpowers/mindmaps/kafka-outbox-saga.wakii`.
3
+ > KHÔNG depends-on SF-1 — chạy song song từ tier 0 (false dep đã cắt: rollback trigger dùng alice@demo.local có sẵn; không đụng kafka/compose/file SF-1 sửa).
4
+
5
+ ## Spec slice (chỉ phần SF-4 chịu trách nhiệm)
6
+ 1. `service/TeamService.java` (MỚI — service layer, hiện TeamController gọi thẳng TeamRepository): method tạo team + members qua **N step** (≥2 lệnh ghi: teams.save + members từng dòng qua repository), có step GIỮA chừng có thể fail — annotate `@Transactional`.
7
+ 2. Endpoint (delegate từ TeamController sang TeamService): tạo team kèm members; **trigger rollback deterministic: member email trùng `alice@demo.local`** (fixture CÓ SẮN trong users.json — không cần SF-1) → bước insert member đó throw → **rollback toàn bộ** (team + members trước đó cùng biến mất) → error envelope 409/422 theo conventions.
8
+ 3. `TeamController.java` sửa: delegate sang TeamService (giữ contract yaml — không đổi API path/shape).
9
+ 4. Tests: (a) happy path — team + members tạo đủ; (b) **rollback assert** — fail giữa chừng → team KHÔNG tồn tại trong DB sau request (verify qua repository, không chỉ response); (c) chạy trên postgres service container trong CI (`mvnw verify` — CI-verifiable, dev machine không JDK/Docker không sao).
10
+ 5. README spring-svc: section @Transactional demo + giải thích Situation A (nhiều step 1 DB = 1 tx là đủ, so sánh Situation B cross-service → trỏ sang saga node/go).
11
+
12
+ ## Touch map (files SF-4 tạo/sở hữu)
13
+ ```
14
+ services/spring-svc/** [SỞ HỮU — service/ mới, web/TeamController sửa, tests]
15
+ ```
16
+
17
+ ## ACCEPTANCE (user-visible)
18
+ - POST team với members hợp lệ → 201, team + members trong DB.
19
+ - POST team với member trùng alice@demo.local ở vị trí giữa → error envelope, **DB không có team lẫn members** (rollback assert qua repository).
20
+ - CI spring workflow xanh (mvnw verify + tests + boot-smoke hiện có không vỡ).
21
+
22
+ ## Boundary (KHÔNG làm)
23
+ - KHÔNG dính Kafka/outbox/topic — SF-4 độc lập hoàn toàn.
24
+ - KHÔNG sửa users.json, compose, contracts, CI của service khác.
25
+ - KHÔNG đổi API contract teams (path/shape giữ nguyên).
26
+ - KHÔNG thử docker local — CI verify (mvnw wrapper có sẵn; JDK qua CI toolchain).
@@ -0,0 +1,36 @@
1
+ # SF-5 Context Pack — Convergence + ADR sync + docs
2
+ > Đọc file này THAY VÌ tự tổng hợp. Epic spec: `docs/superpowers/specs/2026-10-13-kafka-outbox-saga.md` (rev 3). Mindmap: `docs/superpowers/mindmaps/kafka-outbox-saga.wakii`.
3
+ > Depends: SF-2, SF-3, SF-4 (SF-1 transitively). Dest khi bạn fork đã đủ SF-1..4.
4
+
5
+ ## Spec slice (chỉ phần SF-5 chịu trách nhiệm)
6
+ 1. `.github/workflows/convergence.yml`: boot **10 services** (kafka thêm vào), KAFKA_HEAP_OPTS nếu cần, **poll budget nới** (outbox 500ms + Kafka latency — e2e poll hiện RETRIES×1s còn dư nhưng kiểm chứng), copy-dir giữ contracts/db (outbox KHÔNG vào canonical — chỉ schema tasks là cross-service contract).
7
+ 2. `scripts/smoke/e2e.sh` **2 chiều**:
8
+ - Happy path (có sẵn): login → tạo task → poll feed (qua outbox+Kafka — nới window).
9
+ - **Saga path (mới)**: PATCH task assigneeId = svc-fail → poll GET task status = `assignment_failed` → **assert DLQ: `kafka-console-consumer` (trong container kafka) đọc `task-events.dlq` thấy event gốc** — acceptance #3 đủ 2 nửa.
10
+ 3. FE remotes verify tổng thể trên stack thật (SF-3 đã sửa tests/tile/badge — bạn verify happy + saga path render đúng, screenshot/browser theo Rule 0 nếu có thể; else curl + CI evidence).
11
+ 4. Docs sync: walkthrough (thêm saga demo + **note Flyway V2 seed chạy 1 lần — pgdata volume CŨ thiếu svc users → `docker compose down -v` sau pull**), README 3 service + compose, rà ADR-0008 consistency với code thật.
12
+ 5. Security pass cuối: 9092 không expose host, secrets (JWT_SECRET, passwords) không vào envelope/event payload, `.env` không commit.
13
+ 6. Scaffold probe: `scaffold.sh` copy `platform/` nguyên khối → kafka entry + .env.example tự flow; chạy compose config -q trên output (convergence scaffold-verify job hiện có).
14
+ 7. Report (KHÔNG fix) bug product thấy được trong services/FE — SF sở hữu fix.
15
+
16
+ ## Touch map (files SF-5 tạo/sở hữu)
17
+ ```
18
+ scripts/smoke/e2e.sh [SỞ HỮU]
19
+ .github/workflows/convergence.yml [SỞ HỮU — convergence touch points]
20
+ docs/** (walkthrough, ADR consistency) [SỞ HỮU]
21
+ README.md [SỬA lần cuối]
22
+ platform/docker-compose.yml [SỬA CHỈ health-gated depends_on nếu cần — còn lại flag]
23
+ services/*, frontend/*, contracts/* [READ-ONLY toàn bộ — bug = report coordinator]
24
+ ```
25
+
26
+ ## ACCEPTANCE (user-visible)
27
+ - CI convergence xanh: compose 10 services + e2e 2 chiều (happy + saga kèm DLQ assert) + copy-dir standalone.
28
+ - Saga e2e: assign svc-fail → task `assignment_failed` VÀ event gốc trong `task-events.dlq` (kafka-console-consumer assert).
29
+ - Walkthrough fresh-clone đọc được một người mới chạy từ đầu (kèm note down -v cho volume cũ).
30
+ - Security pass: 0 P0/P1.
31
+
32
+ ## Boundary (KHÔNG làm)
33
+ - KHÔNG fix business logic services/FE (report coordinator).
34
+ - KHÔNG merge vào main / KHÔNG tạo PR (coordinator làm).
35
+ - KHÔNG thêm tính năng mới — hội tụ + chứng minh.
36
+ - KHÔNG thử compose local — CI verify; browser walkthrough = human gate tại checkpoint (ghi hướng dẫn cho user).
@@ -0,0 +1,36 @@
1
+ # SF-6 Context Pack — FE remotes (tasks + activity)
2
+ > Đọc file này THAY VÌ tự tổng hợp từ bracket + epic + comments.
3
+ > Epic spec: `docs/superpowers/specs/2026-10-12-boilerplate-microservice-mfe.md` (rev 3). Bracket: `docs/superpowers/mindmaps/micro-boilerplate.wakii`.
4
+
5
+ ## Spec slice (chỉ phần SF-6 chịu trách nhiệm)
6
+ 1. Scaffold 2 remote apps: `frontend/remotes/tasks/`, `frontend/remotes/activity/` — Rspack + @module-federation/enhanced REMOTE, cùng pattern.
7
+ 2. Remote URLs đọc từ remote registry (env-configurable); dev server proxy theo conventions (native mode không cần CORS mở).
8
+ 3. Remote `tasks`: danh sách + tạo/sửa task — gọi node-svc qua gateway `/api/tasks`, đính JWT (api client từ fe-shared); error envelope decode → toast/inline error.
9
+ 4. Remote `activity`: feed + stats — gọi go-svc qua gateway `/api/activity`; render user-display fields (userName, taskTitle) từ response.
10
+ 5. Shared singletons theo catalog (react/react-dom/router KHÔNG duplicate — expose + shared config đúng MF 2.0).
11
+ 6. Mỗi remote: vitest tests (component + api call mocked), Dockerfile nginx static, **boot-smoke CI job** (up + trả 200 + remoteEntry.js fetch được), compose impl điền vào entry pre-seed, README.md standalone (copy KÈM `frontend/shared`).
12
+ 7. Lưu ý vận hành: SF-5 đang song song regenerate `pnpm-lock.yaml` — khi merge coordinator xử lý theo checklist (lấy 1 phía + `pnpm install` lại); SF-6 commit lockfile của mình bình thường.
13
+
14
+ ## Touch map (files SF-6 tạo/sở hữu)
15
+ ```
16
+ frontend/remotes/tasks/** [SỞ HỮU]
17
+ frontend/remotes/activity/** [SỞ HỮU]
18
+ frontend/shared/** [READ-ONLY — SF-1; thiếu = FLAG]
19
+ frontend/shell/** [READ-ONLY — SF-5; host phải expose remote slots, nếu thiếu slot = FLAG]
20
+ pnpm-workspace.yaml / catalog [READ-ONLY]
21
+ platform/docker-compose.yml [READ-ONLY — impl điền vào entry pre-seed]
22
+ platform/conventions/* [READ-ONLY]
23
+ pnpm-lock.yaml [chung với SF-5 — coordinator resolve khi merge]
24
+ ```
25
+
26
+ ## ACCEPTANCE (user-visible)
27
+ - Chạy shell (SF-5) + 2 remote dev servers → login → route `/tasks`: tạo task mới → hiện trong danh sách (đi qua node-svc THẬT qua gateway); route `/activity`: feed/stats phản ánh task vừa tạo (go-svc thật).
28
+ - 1 remote down → shell vẫn chạy, remote còn lại hoạt động.
29
+ - Vitest pass cho cả 2 remote.
30
+ - CI xanh: build + tests + boot-smoke per remote (remoteEntry fetch được).
31
+
32
+ ## Boundary (KHÔNG làm)
33
+ - KHÔNG sửa shell/fe-shared/catalog/compose/contracts (đụng = flag).
34
+ - KHÔNG implement service-side (SF-2/3/4 sở hữu).
35
+ - KHÔNG thêm remote thứ 3 — chỉ tasks + activity.
36
+ - KHÔNG thử docker local — CI verify.
@@ -0,0 +1,35 @@
1
+ # SF-7 Context Pack — Convergence & Scaffold
2
+ > Đọc file này THAY VÌ tự tổng hợp từ bracket + epic + comments.
3
+ > Epic spec: `docs/superpowers/specs/2026-10-12-boilerplate-microservice-mfe.md` (rev 3). Bracket: `docs/superpowers/mindmaps/micro-boilerplate.wakii`.
4
+
5
+ ## Spec slice (chỉ phần SF-7 chịu trách nhiệm)
6
+ 1. **Smoke e2e API-level COMMITTED**: `scripts/smoke/e2e.sh` (curl: login auth-mock → tạo task node-svc → đọc feed go-svc; assert kết quả) + CI job chạy nó trên compose stack — KHÔNG ad-hoc tại checkpoint, KHÔNG browser trong CI (browser walkthrough = human gate tại checkpoint).
7
+ 2. CI hoàn chỉnh: path-filter + docker build per stack + contract test + gitleaks + **copy-dir standalone smoke** (copy 1 service + `frontend/shared` ra tmp → build/test pass).
8
+ 3. Docs đồng bộ: README Mermaid = kiến trúc thật; ADR ghi các quyết định (mixed stack, MF/Rspack, contract-first, readonly schema trade-off, fail-closed vs degrade, fire-and-forget events, fork-not-upgrade model); toolchain doc (JDK/Go/Node/pnpm/docker needed where); fresh-clone walkthrough checklist.
9
+ 4. Scaffold script `scripts/scaffold/`: copy + rename + prune (không generator framework) — sinh project mới đặt tên riêng, chạy được cùng flow. **Nếu trễ: scope-flag lên user — KHÔNG auto-complete bằng manual fallback.**
10
+ 5. Security-audit checkpoint: secrets/exec-bit/lockfile/deps scan (OWASP surface + repo hygiene).
11
+ 6. Rà multi-stage + pinned base images toàn bộ Dockerfile.
12
+ 7. Compose health-gated depends_on hoàn chỉnh (service_healthy chain) — e2e không flaky vì race.
13
+
14
+ ## Touch map (files SF-7 tạo/sở hữu)
15
+ ```
16
+ scripts/smoke/e2e.sh [SỞ HỮU]
17
+ scripts/scaffold/** [SỞ HỮU]
18
+ .github/workflows/* [SỞ HỮU riêng file convergence — SF-1 templates READ-ONLY, có gì thiếu flag]
19
+ docs/** (ADR, walkthrough) [SỞ HỮU]
20
+ README.md [SỬA lần cuối — đồng bộ]
21
+ platform/docker-compose.yml [SỬA: health-gated depends_on — SF-7 được phép vì là convergence; mọi sửa khác flag]
22
+ services/* frontend/* [READ-ONLY toàn bộ — bug thấy được = report, KHÔNG fix]
23
+ ```
24
+
25
+ ## ACCEPTANCE (user-visible)
26
+ - CI job e2e smoke xanh: script curl login → tạo task → đọc feed qua gateway — chứng minh chuỗi 3 service liền mạch.
27
+ - Copy-dir smoke xanh: ≥1 service + fe-shared copy ra tmp build/test được — chứng minh standalone.
28
+ - Scaffold: chạy script → thư mục project mới → cùng flow chạy được (CI verify scaffold output build được).
29
+ - README + ADR + fresh-clone walkthrough đọc theo được một người mới chạy từ đầu.
30
+ - Security-audit: 0 P0/P1 còn mở.
31
+
32
+ ## Boundary (KHÔNG làm)
33
+ - KHÔNG fix bug business logic trong services/FE (report lại coordinator — SF sở hữu fix).
34
+ - KHÔNG merge vào `main` / KHÔNG tạo PR thay người (PR agent tạo nhưng merge là human gate — outside SF-7 scope, coordinator làm).
35
+ - KHÔNG thêm tính năng mới — chỉ hội tụ + chứng minh cái đã có.
@@ -0,0 +1,21 @@
1
+ # Context pack — VU-53-CIN Cinematic Experience (epic-level, SF packs slice từ đây)
2
+
3
+ ## Spec slice (font: REF-SPEC docs/team/ref/ đo trực tiếp site ref)
4
+ - Typography: display 12px/700 UPPERCASE tracking 2.4px · label mono 11px/700 tracking 2.64 · H1 hero 18px/300 LIGHT nền SÁNG chữ navy · H2 chapter ~29px/300 · body 12px/400 tracking 0.3 · copy punchy 2 dòng ALL-CAPS cho heading
5
+ - Cấu trúc: hero sáng → 5 chương nền TỐI tự chủ gradient (section owns bg, theme-independent) → End CTA + footer numbered. Side-nav Anchor sticky progress single-source.
6
+ - Motion vocabulary: parallax nền-gần-fixed (speed 0.08/strength 280) + split-text reveal + mask-reveal clip-path + sticky-pinned 200vh + mood crossfade theo scroll + sun-journey dawn→night. 150-250ms UI, infinite chỉ cho trạng thái. Reduced-motion tắt sạch.
7
+ - 3D: ScrollFlythrough (three peer-dep, procedural ship, fallback node) trong Ch4. fps ≥50.
8
+ - IP: kỹ thuật+cấu trúc+bố cọc sao chép được; copy/ảnh/art là của Orca (VN-flavored), KHÔNG copy nguyên văn ref.
9
+
10
+ ## Touch map
11
+ src/templates/experience/** (chapters, lib/scroll-mood, index.stories) · src/ui/parallax (strength prop) · src/ui/experience3d (ScrollFlythrough) · src/styles/tokens.css (mood vars). Consumer apps KHÔNG đụng.
12
+
13
+ ## ACCEPTANCE (user-visible)
14
+ 1. Story Templates/Cinematic Experience — Experience chạy end-to-end: hero sáng → 5 chương → CTA, cuộn mượt không giật.
15
+ 2. Đặt cạnh ref-hero.png/ref-mid-chapter.png: typography + nhịp + mood tương đồng (số đo đúng REF-SPEC).
16
+ 3. Dark + light + prefers-reduced-motion + 375px đều đẹp; contrast ≥4.5:1 số đo được.
17
+ 4. Ch4 camera bay quanh tàu 3D thật, không cứng khung.
18
+ 5. Deploy alias xem được.
19
+
20
+ ## Boundary
21
+ KHÔNG đụng: component core ngoài scope (chỉ dùng, không sửa API trừ prop mới đã ghi touch map) · apps consumer · pre-push hook. Việc cũ 6-chapter hiện có = prior art tái sử dụng, không phải ràng buộc.
@@ -0,0 +1,46 @@
1
+ # SF-1 Context Pack — Design direction + design-system nền móng
2
+ > Đọc file này THAY VÌ tự tổng hợp. Epic spec: `docs/superpowers/specs/2026-10-13-ui-redesign.md` (rev 3). Mindmap: `docs/superpowers/mindmaps/ui-redesign.wakii`.
3
+ > Depends: — (tier 0, SF đầu tiên). WHY: UI là "mặt tiền" boilerplate khi dev nội bộ fresh-clone demo — hiện gần như unstyled (CSS 68 dòng, 0 tokens, coupling CSS shell→remotes). SF này quyết định hướng thiết kế (USER CHỌN) và dựng nền móng mọi SF sau consume.
4
+
5
+ ## Spec slice (chỉ phần SF-1 chịu trách nhiệm)
6
+ 0. **DESIGN GATE ĐÃ XONG lúc CREATE** (2026-10-13): user đã chọn hướng **B "Linear-referenced dark"** — đọc `docs/superpowers/designs/ui-redesign-direction.md` (tokens + component props API ĐẦY ĐỦ, visual chuẩn `designs/drafts/b-reference.html`) + `designs/direction-approved.md`. KHÔNG chạy designer 3 hướng nữa — implement thẳng theo hand-off.
7
+ 1. `fe-shared/src/styles/tokens.css` + `base.css` — ĐÚNG giá trị mục 1-2 hand-off (không tự chế thêm token; thiếu = flag coordinator).
8
+ 2. `fe-shared/src/styles/tokens.css` — custom properties `:root`, idempotent (nhiều bản cùng giá trị vô hại — remote CSS inject runtime sau CSS shell). `fe-shared/src/styles/base.css` — `@layer reset,base` tối thiểu, GIỐNG HỆT mọi bản copy; shell là nơi import LÀM CHỦ global base (remote chỉ tokens + scoped classes).
9
+ 3. Primitives `fe-shared/src/ui/`: `Badge` (role="status", variant enum phủ 4 status extended tasks: todo/in_progress/done/assignment_failed + 5 action labels activity: task.created/updated/assigned/deleted/assignment_failed), `EmptyState`, `Skeleton` (aria-busy), `Spinner`. **TS props API từng primitive document trong hand-off doc** — SF-2/3/4 consume theo đúng shape.
10
+ 4. Barrel export + package.json exports map — CHỈ phần mới; 4 file logic fe-shared (api-client/token-storage/error-envelope/mf-bootstrap) READ-ONLY tuyệt đối, trường `mfToolkit` READ-LOCKED.
11
+ 5. **Rspack ×3**: remotes thiếu css rule + `experiments.css` — copy y hệt shell (`frontend/shell/rspack.config.mjs:42-45,85-87`); `declare module '*.css'` env.d.ts ×3 (defensive); **`'react/jsx-runtime': {singleton:true, requiredVersion:false}` vào shared CẢ 3 config** (hiện chỉ react/react-dom — JSX fe-shared compile ra import jsx-runtime sẽ duplicate react).
12
+ 6. **Spike R2 chạy SỚM** — ngay sau task 5 với 1 JSX stub tối thiểu trong fe-shared, TRƯỚC khi viết 4 primitives: build 3 package → load shell + remote mount + 1 tương tác đổi status → console KHÔNG có "Invalid hook call"/"2 copies of React" → screenshot vào `docs/superpowers/evidence/`. FAIL → fallback primitives **class-only** (không JSX — chỉ className helpers), hand-off ghi API shape thay thế.
13
+ 7. `output.cssFilename: '[name].[contenthash].css'` prod ×3 (cache-busting; CSS emit ở ROOT — không nằm trong `/assets/` immutable, đừng tìm rule đó).
14
+ 8. Remotes `src/index.tsx` (standalone debug :4001/:4002) import base+tokens — fix "standalone trơ trụi". SF-3/4 sẽ TIẾP TỤC sửa file này (banner debug) — giữ import, ghi comment rõ.
15
+ 9. Tests primitives ở **`frontend/shell/tests/primitives.test.tsx`** (fe-shared KHÔNG có vitest — thêm vào sẽ đụng `pnpm-lock.yaml`, success criteria cấm đổi lockfile).
16
+ 10. Ownership notes: comment `pnpm-workspace.yaml` (dòng SF-1 cũ sở hữu) + `frontend/shared/package.json` description + fe-shared README — ghi rõ từ story này: `src/styles/` + `src/ui/` do design-system SF sở hữu, logic files READ-LOCKED.
17
+ 11. Demo: 1 trang HTML đơn giản render primitives (đính kèm hand-off hoặc standalone dev) — user thấy được design system sống.
18
+
19
+ ## Touch map (files SF-1 tạo/sở hữu)
20
+ ```
21
+ frontend/shared/src/styles/{tokens,base}.css [MỚI — SỞ HỮU]
22
+ frontend/shared/src/ui/{Badge,EmptyState,Skeleton,Spinner}.tsx [MỚI — SỞ HỮU]
23
+ frontend/shared/src/index.ts [SỬA — barrel thêm export phần mới]
24
+ frontend/shared/package.json [SỬA — exports map + description; mfToolkit LOCKED]
25
+ frontend/shared/README.md [SỬA — cách import tokens/primitives]
26
+ frontend/{shell,remotes/tasks,remotes/activity}/rspack.config.mjs [SỬA — css rule + jsx-runtime shared + cssFilename]
27
+ frontend/{shell,remotes/tasks,remotes/activity}/env.d.ts [SỬA — declare *.css]
28
+ frontend/remotes/{tasks,activity}/src/index.tsx [SỬA — import base+tokens]
29
+ frontend/shell/tests/primitives.test.tsx [MỚI]
30
+ docs/superpowers/designs/ui-redesign-direction.md [MỚI — sau USER GATE]
31
+ docs/superpowers/evidence/ [spike R2 screenshot]
32
+ pnpm-workspace.yaml [SỬA — comment ownership]
33
+ frontend/shared/src/{api-client,token-storage,error-envelope,mf-bootstrap}.ts [READ-ONLY]
34
+ contracts/**, platform/**, services/**, scripts/**, .github/** [READ-ONLY]
35
+ ```
36
+
37
+ ## ACCEPTANCE (user-visible)
38
+ - User được xem 3 hướng prototype đầy đủ (login + tasks + activity) và CHỌN 1 — hướng chưa chọn = SF chưa xong.
39
+ - Sau SF-1: mở standalone `http://localhost:4001` / `:4002` trực tiếp → có baseline style (không còn trơ trụi); primitives render đúng hand-off; 3 package `pnpm build` xanh; spike R2 PASS có screenshot (console sạch duplicate-react); `pnpm test` shell xanh kèm tests primitives.
40
+ - `pnpm-lock.yaml` KHÔNG đổi (0 deps mới).
41
+
42
+ ## Boundary (KHÔNG làm)
43
+ - KHÔNG restyle shell/remotes pages (SF-2/3/4 — SF-1 chỉ nền móng + config).
44
+ - KHÔNG đụng 4 file logic fe-shared + trường mfToolkit; KHÔNG thêm npm dependency nào.
45
+ - KHÔNG tự chốt hướng thiết kế thay user (gate bắt buộc); KHÔNG thêm asset ngoài/CDN font (CSP chưa set).
46
+ - KHÔNG merge vào main / KHÔNG tạo PR (coordinator làm).
@@ -0,0 +1,44 @@
1
+ # SF-2 Context Pack — Shell: layout + login + nav + remote fallback
2
+ > Đọc file này THAY VÌ tự tổng hợp. Epic spec: `docs/superpowers/specs/2026-10-13-ui-redesign.md` (rev 3). Mindmap: `docs/superpowers/mindmaps/ui-redesign.wakii`.
3
+ > Depends: SF-1 (tokens + primitives + hand-off doc đã merge). WHY: shell là khung mọi trang — layout/nav/login là thứ user nhìn đầu tiên sau login gate; hiện nav không active state, HomePage trống, login form trơ.
4
+
5
+ ## Spec slice (chỉ phần SF-2 chịu trách nhiệm)
6
+ 1. Layout: container max-width + header/page structure theo direction đã chọn (`docs/superpowers/designs/ui-redesign-direction.md`). **Giữ NGUYÊN VẸN**: skip link text "Tới nội dung chính" + `href="#main-content"`, `main id="main-content" tabIndex={-1}`, focus main khi đổi route (`frontend/shell/src/components/Layout.tsx:14-27`).
7
+ 2. NavBar active state: `aria-current="page"` + visual theo tokens; responsive wrap ≤768px (hiện flex không wrap → overflow mobile).
8
+ 3. NavBar user chip + logout/login styling — giữ `data-testid="nav-user"` + aria-label "Điều hướng chính".
9
+ 4. HomePage: dashboard chào + quick links 2 remote + demo hints (alice@demo.local / demo-password, fail@demo.local cho saga) — thay `<h1>Trang chủ</h1>` 8 dòng hiện tại.
10
+ 5. LoginPage: card giữa màn hình + error banner styling + demo hint format đẹp — behavior GIỮ (redirect khi có token, deep-link `location.state.from`, error messages nguyên văn "Email hoặc mật khẩu không đúng." / "Không kết nối được máy chủ đăng nhập.").
11
+ 6. RemoteSlot: Suspense fallback = `Skeleton` primitive (thay `<p>Đang tải {name}…</p>` — không test nào assert chuỗi này); error fallback visual — GIỮ text "Không tải được phần tasks…" + nút "Thử lại" (test contract).
12
+ 7. `frontend/shell/src/styles.css` rewrite → scoped classes + consume tokens từ fe-shared; xóa element selectors toàn cục (body/nav/form/label/button — đã chuyển vào base.css của SF-1). Shell import base+tokens LÀM CHỦ global (bootstrap.tsx).
13
+ 8. Tests tách theo surface: a11y 3 case giữ nguyên vẹn (hard gate) / login / remote-slot / integration — update chuỗi nếu UI đổi text (quy tắc cùng-commit cùng-SF).
14
+ 9. Diff-hygiene cuối SF: diff không chứa secrets, không exec-bit mới (phase-gate security Phase 1).
15
+
16
+ ## Interface contract (với SF-1 output)
17
+ - Import: `@boilerplate/fe-shared` → `Skeleton`, tokens qua CSS (`tokens.css` vars theo hand-off doc). Props API từng primitive = mục hand-off "component spec" — DÙNG ĐÚNG SHAPE, không tự chế props.
18
+ - Cần variant primitive chưa có trong hand-off? **FLAG coordinator** — fe-shared đã đóng băng sau SF-1, không tự sửa.
19
+
20
+ ## Touch map (files SF-2 tạo/sở hữu)
21
+ ```
22
+ frontend/shell/src/styles.css [SỞ HỮU — rewrite]
23
+ frontend/shell/src/bootstrap.tsx [SỬA — import chain]
24
+ frontend/shell/src/components/Layout.tsx [SỬA — className only, KHÔNG đụng focus logic]
25
+ frontend/shell/src/components/NavBar.tsx [SỬA — aria-current + styling]
26
+ frontend/shell/src/components/RemoteSlot.tsx [SỬA — fallback visuals]
27
+ frontend/shell/src/pages/{HomePage,LoginPage}.tsx [SỬA]
28
+ frontend/shell/tests/* [SỬA — update + giữ a11y 3 case]
29
+ frontend/remotes/**, frontend/shared/** [READ-ONLY toàn bộ]
30
+ rspack.config.mjs / env.d.ts [READ-ONLY — SF-1 đã xong config]
31
+ contracts/**, platform/**, services/**, scripts/** [READ-ONLY]
32
+ ```
33
+
34
+ ## ACCEPTANCE (user-visible)
35
+ - Qua gateway :8080 (hoặc dev :3000): login form card đẹp giữa màn hình, hint demo đọc được; sau login nav hiện email chip + trang đang đứng được đánh dấu active; HomePage dashboard có quick links Tasks/Activity + hint saga.
36
+ - Thu hẹp cửa sổ ≤768px: nav wrap, không overflow ngang.
37
+ - Kill remote dev server → reload: slot hiện skeleton lúc tải + fallback đẹp có nút "Thử lại" hoạt động (walkthrough mục 4.4).
38
+ - `pnpm test` + `pnpm typecheck` shell xanh; 3 test a11y pass nguyên vẹn.
39
+
40
+ ## Boundary (KHÔNG làm)
41
+ - KHÔNG đụng frontend/remotes/** (SF-3/4) và frontend/shared/** (đóng băng sau SF-1).
42
+ - KHÔNG đổi RemoteSlot text contract ("Không tải được phần tasks…" / "Thử lại"), KHÔNG đổi error messages login, KHÔNG bỏ skip-link/focus logic.
43
+ - KHÔNG thêm tokens/primitives mới (flag coordinator nếu cần).
44
+ - KHÔNG merge vào main / KHÔNG tạo PR (coordinator làm).
@@ -0,0 +1,47 @@
1
+ # SF-3 Context Pack — Remote tasks: TasksPage redesign + UX gaps
2
+ > Đọc file này THAY VÌ tự tổng hợp. Epic spec: `docs/superpowers/specs/2026-10-13-ui-redesign.md` (rev 3). Mindmap: `docs/superpowers/mindmaps/ui-redesign.wakii`.
3
+ > Depends: SF-1 (tokens + primitives + rspack css rule đã merge). WHY: Tasks là màn hình demo chính (walkthrough mục 4.2) — hiện là 1 component 181 dòng, select status + list 1 cột, bỏ lỡ DELETE/edit/assignee/pagination/filter mà API LÙN có sẵn.
4
+
5
+ ## Spec slice (chỉ phần SF-3 chịu trách nhiệm)
6
+ 1. Tách component: `TaskForm` / `TaskList` / `TaskItem` / `StatusSelect` — giữ export `default` + named `TasksPage` (MF expose `./TasksPage` cần default; đổi = breaking registry).
7
+ 2. TaskItem: card layout responsive; `StatusBadge` dùng primitive Badge — status thường 3 giá trị + **"Gán thất bại" cho assignment_failed giữ `role="status"` + text nguyên văn** (walkthrough 4b + test contract; KHÔNG cho chọn assignment_failed trong select — PATCH cấm).
8
+ 3. Per-item busy: Spinner + disable select khi PATCH đang bay (hiện không có — user không biết thao tác đang xử lý).
9
+ 4. Edit inline title/description: nút sửa → input inline → save (PATCH)/cancel. API có sẵn (`updateTask` — mở rộng `src/api.ts` payload nếu cần).
10
+ 5. Delete: nút xoá + confirm dialog → DELETE `/api/tasks/{id}` (API có sẵn, UI chưa có). Feed activity tự nhận task.deleted qua Kafka.
11
+ 6. Assignee hiển thị **UUID rút gọn monospace + tooltip full** — KHÔNG resolve tên qua `/api/users` (ngoài endpoint pin + sai base URL dev). + createdAt hiển thị.
12
+ 7. Pagination "Tải thêm": limit ≤100 + offset (API có sẵn) — hiển thị "x/total" đúng.
13
+ 8. Filter theo status: `?status=` (API có sẵn) — chip/toggle bộ 3 writable status.
14
+ 9. `src/api.ts` ĐƯỢC MỞ RỘNG: thêm params limit/offset/status cho `fetchTasks`, thêm `deleteTask` — đúng contract `contracts/openapi/tasks.yaml` (limit max 100, offset ≥0). KHÔNG gọi endpoint ngoài `/api/tasks*`.
15
+ 10. Loading = Skeleton list (primitive), empty = EmptyState (giữ text "Chưa có task nào" semantics), error banner giữ `role="alert"` + message 503 spring nguyên văn.
16
+ 11. Scoped css riêng theo kiến trúc CSS đích (tokens + scoped classes, KHÔNG element selectors toàn cục). SF-3∥SF-4 chạy song song — KHÔNG copy code SF-4.
17
+ 12. Standalone `src/index.tsx`: banner debug đẹp — **rebase trên SF-1, KHÔNG revert import base+tokens** SF-1 đã thêm.
18
+ 13. Tests: update chuỗi đổi + THÊM case: edit inline gọi PATCH đúng payload / delete gọi DELETE + confirm / load-more gọi offset / filter gọi ?status= / per-item busy.
19
+
20
+ ## Interface contract
21
+ - Primitives + tokens theo hand-off (`docs/superpowers/designs/ui-redesign-direction.md`) — dùng đúng props API; cần variant mới → FLAG coordinator (fe-shared đóng băng).
22
+ - MF contract GIỮ: name `tasks`, expose `./TasksPage`, default export, publicPath prod `/remotes/tasks/`.
23
+
24
+ ## Touch map (files SF-3 tạo/sở hữu)
25
+ ```
26
+ frontend/remotes/tasks/src/TasksPage.tsx [SỞ HỮU — tách component]
27
+ frontend/remotes/tasks/src/components/*.tsx [MỚI — TaskForm/TaskList/TaskItem/StatusSelect]
28
+ frontend/remotes/tasks/src/styles.css [MỚI — scoped]
29
+ frontend/remotes/tasks/src/api.ts [SỬA — mở rộng params + deleteTask]
30
+ frontend/remotes/tasks/src/index.tsx [SỬA — banner debug, giữ imports SF-1]
31
+ frontend/remotes/tasks/tests/* [SỬA — update + thêm case]
32
+ frontend/shell/**, frontend/remotes/activity/**, frontend/shared/** [READ-ONLY]
33
+ rspack.config.mjs / env.d.ts [READ-ONLY — SF-1 đã xong]
34
+ contracts/**, platform/**, services/** [READ-ONLY]
35
+ ```
36
+
37
+ ## ACCEPTANCE (user-visible)
38
+ - Trên UI mới qua :8080: tạo task → thấy trong danh sách card; sửa tiêu đề inline; đổi status (select busy trong lúc bay); xoá có confirm; filter theo status; "Tải thêm" nếu >limit; "x/total" đúng.
39
+ - Task item hiện assignee (UUID rút gọn) + createdAt.
40
+ - Saga 4b: assign `fail@demo.local` → badge "Gán thất bại" hiện rõ (role=status), KHÔNG có select status.
41
+ - Standalone :4001 mở trực tiếp: có style + banner debug.
42
+ - `pnpm test` + `pnpm typecheck` tasks xanh (12 case cũ update + case mới).
43
+
44
+ ## Boundary (KHÔNG làm)
45
+ - KHÔNG đụng frontend/shell/** (SF-2), frontend/remotes/activity/** (SF-4), frontend/shared/** (đóng băng).
46
+ - KHÔNG đổi: STATUS_LABELS text nếu không bắt buộc (test contract), aria-label bộ tasks ("Quản lý tasks", "Form tạo task", "Danh sách tasks", "Trạng thái task <title>"), role=alert/status.
47
+ - KHÔNG gọi API ngoài /api/tasks*; KHÔNG thêm deps; KHÔNG merge vào main / tạo PR.
@@ -0,0 +1,44 @@
1
+ # SF-4 Context Pack — Remote activity: ActivityPage redesign
2
+ > Đọc file này THAY VÌ tự tổng hợp. Epic spec: `docs/superpowers/specs/2026-10-13-ui-redesign.md` (rev 3). Mindmap: `docs/superpowers/mindmaps/ui-redesign.wakii`.
3
+ > Depends: SF-1 (tokens + primitives + rspack css rule đã merge). WHY: Activity chứng minh chuỗi Kafka (outbox → topic → go consumer) phản ánh thao tác Tasks — hiện stats tile inline-style + feed dòng text phẳng, khó "đọc" activity theo thời gian.
4
+
5
+ ## Spec slice (chỉ phần SF-4 chịu trách nhiệm)
6
+ 1. Stats: grid layout responsive + StatTile cards dùng tokens — **giữ nguyên bộ aria-label** ("Thống kê tasks", "Tổng số task", "Task Cần làm/Làm/Xong", "Sự kiện 24h qua").
7
+ 2. Feed: timeline theo nhóm ngày (mỗi nhóm heading ngày) + item card: action badge (primitive Badge, variant theo 5 action labels) + userName/taskTitle đậm + time vi-VN (`toLocaleString('vi-VN')` giữ).
8
+ 3. Unknown action: fallback render nguyên văn (giữ hành vi hiện tại).
9
+ 4. Nút "Làm mới": styling + busy state (Spinner, disable khi đang tải).
10
+ 5. Loading = Skeleton FEED + STATS RIÊNG BIỆT — giữ `Promise.allSettled` independence (stats fail KHÔNG che feed, ngược lại — có test).
11
+ 6. Empty = EmptyState primitive hướng dẫn sang Tasks ("Chưa có hoạt động nào — tạo một task ở trang Tasks…" semantics giữ).
12
+ 7. Scoped css riêng theo kiến trúc CSS đích (mục "Kiến trúc đích" spec — tokens + scoped classes). SF-3∥SF-4 chạy song song — KHÔNG copy code SF-3.
13
+ 8. Standalone `src/index.tsx`: banner debug đẹp — **rebase trên SF-1, KHÔNG revert import base+tokens**.
14
+ 9. Tests: update + THÊM (stats grid aria-label giữ, skeleton xuất hiện lúc loading từng khu).
15
+ 10. Diff-hygiene cuối SF (phase-gate security Phase 2).
16
+
17
+ ## Interface contract
18
+ - Primitives + tokens theo hand-off (`docs/superpowers/designs/ui-redesign-direction.md`); Badge variant enum phủ 5 action labels — SF-1 đã cam kết; thiếu variant → FLAG coordinator.
19
+ - MF contract GIỮ: name `activity`, expose `./ActivityPage`, default export, publicPath prod `/remotes/activity/`.
20
+
21
+ ## Touch map (files SF-4 tạo/sở hữu)
22
+ ```
23
+ frontend/remotes/activity/src/ActivityPage.tsx [SỞ HỮU — redesign]
24
+ frontend/remotes/activity/src/components/*.tsx [MỚI — StatTile/Timeline/FeedItem nếu tách]
25
+ frontend/remotes/activity/src/styles.css [MỚI — scoped]
26
+ frontend/remotes/activity/src/index.tsx [SỬA — banner debug, giữ imports SF-1]
27
+ frontend/remotes/activity/tests/* [SỬA — update + thêm]
28
+ frontend/remotes/activity/src/api.ts [SỬA tối thiểu — KHÔNG đổi call shape hiện có]
29
+ frontend/shell/**, frontend/remotes/tasks/**, frontend/shared/** [READ-ONLY]
30
+ rspack.config.mjs / env.d.ts [READ-ONLY — SF-1 đã xong]
31
+ contracts/**, platform/**, services/** [READ-ONLY]
32
+ ```
33
+
34
+ ## ACCEPTANCE (user-visible)
35
+ - Qua :8080: stats là các card trong grid responsive; feed dạng timeline theo ngày, mỗi item có badge action + tên người + task + giờ vi-VN đọc được.
36
+ - Tạo/sửa/xoá/assign task ở Tasks (SF-3) → reload Activity: sự kiện mới xuất hiện đúng badge (kể cả task.deleted).
37
+ - Nút "Làm mới" có busy state; stats fail vẫn xem được feed (và ngược lại).
38
+ - Standalone :4002 mở trực tiếp: có style + banner debug.
39
+ - `pnpm test` + `pnpm typecheck` activity xanh.
40
+
41
+ ## Boundary (KHÔNG làm)
42
+ - KHÔNG đụng frontend/shell/** (SF-2), frontend/remotes/tasks/** (SF-3), frontend/shared/** (đóng băng).
43
+ - KHÔNG đổi ACTION_LABELS text + aria-label bộ activity ("Activity feed và thống kê", "Danh sách hoạt động", stats labels), KHÔNG bỏ Promise.allSettled independence.
44
+ - KHÔNG gọi API ngoài /api/activity/*; KHÔNG thêm deps; KHÔNG merge vào main / tạo PR.