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.
- package/README.md +66 -2
- package/dist/chunk-7XGW4UJ5.js +75 -0
- package/dist/chunk-AKPWS7FJ.js +76 -0
- package/dist/chunk-ELM6GGC5.js +50 -0
- package/dist/chunk-ON2WTGZH.js +77 -0
- package/dist/index.js +391 -0
- package/dist/manifest-2JVLRMDB.js +10 -0
- package/dist/manifest-O35TPW73.js +10 -0
- package/dist/manifest-TXTY67BF.js +10 -0
- package/dist/manifest-XWHR7Y3F.js +10 -0
- package/package.json +23 -4
- package/stack-template/.changeset/config.json +15 -0
- package/stack-template/.changeset/vu53-ui-redesign.md +11 -0
- package/stack-template/.claude/agents/be-dev.md +56 -0
- package/stack-template/.claude/agents/contracts-keeper.md +51 -0
- package/stack-template/.claude/agents/e2e-runner.md +61 -0
- package/stack-template/.claude/agents/fe-dev.md +53 -0
- package/stack-template/.claude/settings.json +77 -0
- package/stack-template/.claude/settings.local.json +9 -0
- package/stack-template/.claude/skills/add-service/SKILL.md +81 -0
- package/stack-template/.claude/skills/sync-contracts/SKILL.md +74 -0
- package/stack-template/.editorconfig +21 -0
- package/stack-template/.gitattributes +10 -0
- package/stack-template/.github/pull_request_template.md +26 -0
- package/stack-template/.github/workflow-templates/services-ci.yml.example +69 -0
- package/stack-template/.github/workflows/contracts.yml +133 -0
- package/stack-template/.github/workflows/convergence.yml +209 -0
- package/stack-template/.github/workflows/git-guard.yml +44 -0
- package/stack-template/.github/workflows/publish-uikit.yml +96 -0
- package/stack-template/.github/workflows/remotes-activity.yml +82 -0
- package/stack-template/.github/workflows/remotes-tasks.yml +82 -0
- package/stack-template/.github/workflows/services-auth-svc.yml +153 -0
- package/stack-template/.github/workflows/services-go-svc.yml +281 -0
- package/stack-template/.github/workflows/services-node-svc.yml +173 -0
- package/stack-template/.github/workflows/services-spring-svc.yml +132 -0
- package/stack-template/.github/workflows/shell.yml +78 -0
- package/stack-template/.github/workflows/ui-kit.yml +51 -0
- package/stack-template/.husky/commit-msg +14 -0
- package/stack-template/.husky/pre-push +51 -0
- package/stack-template/.spectral.yaml +17 -0
- package/stack-template/AGENTS.md +197 -0
- package/stack-template/CLAUDE.md +114 -0
- package/stack-template/README.md +172 -0
- package/stack-template/app/admin/index.html +12 -0
- package/stack-template/app/admin/package.json +40 -0
- package/stack-template/app/admin/scripts/verify-chart.mjs +49 -0
- package/stack-template/app/admin/src/App.test.tsx +70 -0
- package/stack-template/app/admin/src/App.tsx +33 -0
- package/stack-template/app/admin/src/data/users.ts +47 -0
- package/stack-template/app/admin/src/layout/AdminLayout.tsx +212 -0
- package/stack-template/app/admin/src/main.tsx +17 -0
- package/stack-template/app/admin/src/pages/ComponentsDemo.tsx +138 -0
- package/stack-template/app/admin/src/pages/Dashboard.tsx +182 -0
- package/stack-template/app/admin/src/pages/HooksDemo.tsx +153 -0
- package/stack-template/app/admin/src/pages/Settings.tsx +156 -0
- package/stack-template/app/admin/src/pages/UploadPage.tsx +34 -0
- package/stack-template/app/admin/src/pages/Users.test.tsx +66 -0
- package/stack-template/app/admin/src/pages/Users.tsx +245 -0
- package/stack-template/app/admin/src/styles.css +9 -0
- package/stack-template/app/admin/src/tests/setup.ts +15 -0
- package/stack-template/app/admin/tsconfig.json +18 -0
- package/stack-template/app/admin/vite.config.ts +11 -0
- package/stack-template/app/admin/vitest.config.ts +14 -0
- package/stack-template/app/create-wakii-app/README.md +71 -0
- package/stack-template/app/create-wakii-app/package.json +27 -0
- package/stack-template/app/create-wakii-app/scripts/publish-npm.sh +38 -0
- package/stack-template/app/create-wakii-app/src/index.ts +127 -0
- package/stack-template/app/create-wakii-app/src/options.test.ts +80 -0
- package/stack-template/app/create-wakii-app/src/options.ts +117 -0
- package/stack-template/app/create-wakii-app/src/scaffold.test.ts +143 -0
- package/stack-template/app/create-wakii-app/src/scaffold.ts +194 -0
- package/stack-template/app/create-wakii-app/tsconfig.json +17 -0
- package/stack-template/app/create-wakii-app/vitest.config.ts +9 -0
- package/stack-template/app/create-wakii-stack/package.json +27 -0
- package/stack-template/app/create-wakii-stack/src/manifest.ts +101 -0
- package/stack-template/app/create-wakii-stack/src/options.ts +106 -0
- package/stack-template/app/create-wakii-stack/src/scaffold.ts +315 -0
- package/stack-template/app/create-wakii-stack/tsconfig.json +17 -0
- package/stack-template/app/create-wakii-stack/vitest.config.ts +9 -0
- package/stack-template/app/remotes/activity/Dockerfile +36 -0
- package/stack-template/app/remotes/activity/README.md +59 -0
- package/stack-template/app/remotes/activity/index.html +11 -0
- package/stack-template/app/remotes/activity/nginx.conf +35 -0
- package/stack-template/app/remotes/activity/package.json +40 -0
- package/stack-template/app/remotes/activity/rspack.config.mjs +152 -0
- package/stack-template/app/remotes/activity/src/ActivityPage.tsx +139 -0
- package/stack-template/app/remotes/activity/src/api.ts +63 -0
- package/stack-template/app/remotes/activity/src/app.css +7 -0
- package/stack-template/app/remotes/activity/src/components/FeedItem.tsx +39 -0
- package/stack-template/app/remotes/activity/src/components/StatTile.tsx +24 -0
- package/stack-template/app/remotes/activity/src/components/Timeline.tsx +53 -0
- package/stack-template/app/remotes/activity/src/components/time.ts +30 -0
- package/stack-template/app/remotes/activity/src/env.d.ts +5 -0
- package/stack-template/app/remotes/activity/src/index.tsx +12 -0
- package/stack-template/app/remotes/activity/src/standalone.tsx +36 -0
- package/stack-template/app/remotes/activity/tests/ActivityPage.test.tsx +260 -0
- package/stack-template/app/remotes/activity/tests/api.test.ts +61 -0
- package/stack-template/app/remotes/activity/tests/setup.ts +1 -0
- package/stack-template/app/remotes/activity/tests/test-utils.tsx +16 -0
- package/stack-template/app/remotes/activity/tsconfig.json +26 -0
- package/stack-template/app/remotes/activity/vitest.config.ts +38 -0
- package/stack-template/app/remotes/tasks/Dockerfile +36 -0
- package/stack-template/app/remotes/tasks/README.md +59 -0
- package/stack-template/app/remotes/tasks/index.html +11 -0
- package/stack-template/app/remotes/tasks/nginx.conf +35 -0
- package/stack-template/app/remotes/tasks/package.json +41 -0
- package/stack-template/app/remotes/tasks/rspack.config.mjs +153 -0
- package/stack-template/app/remotes/tasks/src/TasksPage.tsx +284 -0
- package/stack-template/app/remotes/tasks/src/api.ts +109 -0
- package/stack-template/app/remotes/tasks/src/app.css +7 -0
- package/stack-template/app/remotes/tasks/src/components/StatusBadge.tsx +20 -0
- package/stack-template/app/remotes/tasks/src/components/StatusSelect.tsx +27 -0
- package/stack-template/app/remotes/tasks/src/components/TaskForm.tsx +74 -0
- package/stack-template/app/remotes/tasks/src/components/TaskItem.tsx +199 -0
- package/stack-template/app/remotes/tasks/src/components/TaskList.tsx +60 -0
- package/stack-template/app/remotes/tasks/src/components/status.ts +23 -0
- package/stack-template/app/remotes/tasks/src/env.d.ts +5 -0
- package/stack-template/app/remotes/tasks/src/index.tsx +12 -0
- package/stack-template/app/remotes/tasks/src/standalone.tsx +38 -0
- package/stack-template/app/remotes/tasks/tests/TasksPage.test.tsx +445 -0
- package/stack-template/app/remotes/tasks/tests/api.test.ts +159 -0
- package/stack-template/app/remotes/tasks/tests/setup.ts +1 -0
- package/stack-template/app/remotes/tasks/tests/test-utils.tsx +16 -0
- package/stack-template/app/remotes/tasks/tsconfig.json +26 -0
- package/stack-template/app/remotes/tasks/vitest.config.ts +34 -0
- package/stack-template/app/shared/README.md +21 -0
- package/stack-template/app/shared/package.json +37 -0
- package/stack-template/app/shared/src/api-client.ts +66 -0
- package/stack-template/app/shared/src/error-envelope.ts +38 -0
- package/stack-template/app/shared/src/index.ts +21 -0
- package/stack-template/app/shared/src/mf-bootstrap.ts +89 -0
- package/stack-template/app/shared/src/refresh-client.ts +170 -0
- package/stack-template/app/shared/src/token-storage.ts +57 -0
- package/stack-template/app/shell/Dockerfile +37 -0
- package/stack-template/app/shell/README.md +79 -0
- package/stack-template/app/shell/index.html +11 -0
- package/stack-template/app/shell/nginx.conf +23 -0
- package/stack-template/app/shell/package.json +43 -0
- package/stack-template/app/shell/rspack.config.mjs +147 -0
- package/stack-template/app/shell/src/App.tsx +57 -0
- package/stack-template/app/shell/src/api.ts +36 -0
- package/stack-template/app/shell/src/app.css +11 -0
- package/stack-template/app/shell/src/bootstrap.tsx +24 -0
- package/stack-template/app/shell/src/components/Layout.tsx +35 -0
- package/stack-template/app/shell/src/components/NavBar.tsx +118 -0
- package/stack-template/app/shell/src/components/RemoteSlot.tsx +82 -0
- package/stack-template/app/shell/src/components/RequireAuth.tsx +14 -0
- package/stack-template/app/shell/src/env.d.ts +7 -0
- package/stack-template/app/shell/src/index.tsx +3 -0
- package/stack-template/app/shell/src/pages/HomePage.tsx +70 -0
- package/stack-template/app/shell/src/pages/LoginPage.tsx +217 -0
- package/stack-template/app/shell/src/remote-urls.ts +18 -0
- package/stack-template/app/shell/tests/a11y.test.tsx +53 -0
- package/stack-template/app/shell/tests/api-timeout.test.ts +43 -0
- package/stack-template/app/shell/tests/integration.test.tsx +93 -0
- package/stack-template/app/shell/tests/login.test.tsx +227 -0
- package/stack-template/app/shell/tests/mf-retry.test.ts +76 -0
- package/stack-template/app/shell/tests/refresh-client.test.ts +301 -0
- package/stack-template/app/shell/tests/remote-slot.test.tsx +109 -0
- package/stack-template/app/shell/tests/remote-urls.test.ts +26 -0
- package/stack-template/app/shell/tests/setup.ts +15 -0
- package/stack-template/app/shell/tests/shell-chrome.test.tsx +126 -0
- package/stack-template/app/shell/tsconfig.json +26 -0
- package/stack-template/app/shell/vitest.config.ts +42 -0
- package/stack-template/app/spike/README.md +35 -0
- package/stack-template/app/spike/host/index.html +11 -0
- package/stack-template/app/spike/host/package.json +17 -0
- package/stack-template/app/spike/host/rspack.config.mjs +34 -0
- package/stack-template/app/spike/host/src/bootstrap.jsx +26 -0
- package/stack-template/app/spike/host/src/index.jsx +3 -0
- package/stack-template/app/spike/remote/package.json +17 -0
- package/stack-template/app/spike/remote/rspack.config.mjs +36 -0
- package/stack-template/app/spike/remote/src/Hello.jsx +7 -0
- package/stack-template/app/spike/remote/src/index.js +2 -0
- package/stack-template/app/spike/serve.mjs +31 -0
- package/stack-template/app/starter-templates/template-feats/extras/carousel/src/DemoCarousel.tsx +99 -0
- package/stack-template/app/starter-templates/template-feats/extras/chart/src/DemoChart.tsx +84 -0
- package/stack-template/app/starter-templates/template-feats/extras/editor/src/DemoEditor.tsx +110 -0
- package/stack-template/app/starter-templates/template-feats/extras/schedule/src/DemoSchedule.tsx +81 -0
- package/stack-template/app/starter-templates/template-feats/router/src/App.tsx +332 -0
- package/stack-template/app/starter-templates/template-feats/router/src/main.tsx +14 -0
- package/stack-template/app/starter-templates/vite-js/README.md +72 -0
- package/stack-template/app/starter-templates/vite-js/index.html +12 -0
- package/stack-template/app/starter-templates/vite-js/jsconfig.json +10 -0
- package/stack-template/app/starter-templates/vite-js/package.json +22 -0
- package/stack-template/app/starter-templates/vite-js/src/App.jsx +158 -0
- package/stack-template/app/starter-templates/vite-js/src/main.jsx +10 -0
- package/stack-template/app/starter-templates/vite-js/src/styles.css +15 -0
- package/stack-template/app/starter-templates/vite-js/src/theme.js +21 -0
- package/stack-template/app/starter-templates/vite-js/vite.config.mjs +8 -0
- package/stack-template/app/starter-templates/vite-ts/README.md +53 -0
- package/stack-template/app/starter-templates/vite-ts/index.html +12 -0
- package/stack-template/app/starter-templates/vite-ts/package.json +29 -0
- package/stack-template/app/starter-templates/vite-ts/src/App.tsx +181 -0
- package/stack-template/app/starter-templates/vite-ts/src/main.tsx +12 -0
- package/stack-template/app/starter-templates/vite-ts/src/styles.css +21 -0
- package/stack-template/app/starter-templates/vite-ts/src/theme.ts +16 -0
- package/stack-template/app/starter-templates/vite-ts/tsconfig.json +25 -0
- package/stack-template/app/starter-templates/vite-ts/tsconfig.node.json +11 -0
- package/stack-template/app/starter-templates/vite-ts/vite.config.ts +10 -0
- package/stack-template/app/ui-kit/.storybook/main.ts +29 -0
- package/stack-template/app/ui-kit/.storybook/manager-head.html +97 -0
- package/stack-template/app/ui-kit/.storybook/manager.ts +138 -0
- package/stack-template/app/ui-kit/.storybook/preview-head.html +57 -0
- package/stack-template/app/ui-kit/.storybook/preview.ts +62 -0
- package/stack-template/app/ui-kit/.storybook/tailwind-preview.css +3 -0
- package/stack-template/app/ui-kit/.storybook/test-runner.config.ts +20 -0
- package/stack-template/app/ui-kit/CHANGELOG.md +137 -0
- package/stack-template/app/ui-kit/LICENSE +21 -0
- package/stack-template/app/ui-kit/MIGRATION.md +84 -0
- package/stack-template/app/ui-kit/README.md +173 -0
- package/stack-template/app/ui-kit/RELEASE.md +77 -0
- package/stack-template/app/ui-kit/USAGE.md +380 -0
- package/stack-template/app/ui-kit/eslint.config.js +47 -0
- package/stack-template/app/ui-kit/package.json +166 -0
- package/stack-template/app/ui-kit/scripts/publish-github.sh +39 -0
- package/stack-template/app/ui-kit/scripts/publish-npm.sh +76 -0
- package/stack-template/app/ui-kit/scripts/stamp-build.cjs +13 -0
- package/stack-template/app/ui-kit/src/KitchenSink.stories.tsx +576 -0
- package/stack-template/app/ui-kit/src/Tokens.stories.tsx +193 -0
- package/stack-template/app/ui-kit/src/entries/carousel.ts +7 -0
- package/stack-template/app/ui-kit/src/entries/chart.ts +4 -0
- package/stack-template/app/ui-kit/src/entries/editor.ts +4 -0
- package/stack-template/app/ui-kit/src/entries/experience3d.ts +5 -0
- package/stack-template/app/ui-kit/src/entries/schedule.ts +5 -0
- package/stack-template/app/ui-kit/src/env.d.ts +3 -0
- package/stack-template/app/ui-kit/src/hooks/form.stories.tsx +80 -0
- package/stack-template/app/ui-kit/src/hooks/hooks-new.stories.tsx +392 -0
- package/stack-template/app/ui-kit/src/hooks/hooks.stories.tsx +167 -0
- package/stack-template/app/ui-kit/src/hooks/useClickAway.test.tsx +63 -0
- package/stack-template/app/ui-kit/src/hooks/useClickAway.ts +30 -0
- package/stack-template/app/ui-kit/src/hooks/useControllableState.test.ts +36 -0
- package/stack-template/app/ui-kit/src/hooks/useControllableState.ts +41 -0
- package/stack-template/app/ui-kit/src/hooks/useCopyToClipboard.test.ts +89 -0
- package/stack-template/app/ui-kit/src/hooks/useCopyToClipboard.ts +20 -0
- package/stack-template/app/ui-kit/src/hooks/useCountdown.test.ts +88 -0
- package/stack-template/app/ui-kit/src/hooks/useCountdown.ts +38 -0
- package/stack-template/app/ui-kit/src/hooks/useDebounce.test.ts +71 -0
- package/stack-template/app/ui-kit/src/hooks/useDebounce.ts +14 -0
- package/stack-template/app/ui-kit/src/hooks/useDefault.test.ts +37 -0
- package/stack-template/app/ui-kit/src/hooks/useDefault.ts +15 -0
- package/stack-template/app/ui-kit/src/hooks/useEventListener.test.ts +47 -0
- package/stack-template/app/ui-kit/src/hooks/useEventListener.ts +28 -0
- package/stack-template/app/ui-kit/src/hooks/useFieldArray.test.tsx +160 -0
- package/stack-template/app/ui-kit/src/hooks/useFieldArray.ts +85 -0
- package/stack-template/app/ui-kit/src/hooks/useFocusTrap.ts +67 -0
- package/stack-template/app/ui-kit/src/hooks/useForm.test.tsx +192 -0
- package/stack-template/app/ui-kit/src/hooks/useForm.ts +119 -0
- package/stack-template/app/ui-kit/src/hooks/useFullscreen.test.tsx +71 -0
- package/stack-template/app/ui-kit/src/hooks/useFullscreen.ts +68 -0
- package/stack-template/app/ui-kit/src/hooks/useHover.test.tsx +30 -0
- package/stack-template/app/ui-kit/src/hooks/useHover.ts +23 -0
- package/stack-template/app/ui-kit/src/hooks/useInView.test.tsx +70 -0
- package/stack-template/app/ui-kit/src/hooks/useInView.ts +55 -0
- package/stack-template/app/ui-kit/src/hooks/useInfiniteScroll.test.tsx +72 -0
- package/stack-template/app/ui-kit/src/hooks/useInfiniteScroll.ts +45 -0
- package/stack-template/app/ui-kit/src/hooks/useIsFirstRender.test.ts +30 -0
- package/stack-template/app/ui-kit/src/hooks/useIsFirstRender.ts +14 -0
- package/stack-template/app/ui-kit/src/hooks/useKeyPress.test.ts +45 -0
- package/stack-template/app/ui-kit/src/hooks/useKeyPress.ts +31 -0
- package/stack-template/app/ui-kit/src/hooks/useLocalStorage.test.ts +102 -0
- package/stack-template/app/ui-kit/src/hooks/useLocalStorage.ts +34 -0
- package/stack-template/app/ui-kit/src/hooks/useLockBodyScroll.test.ts +42 -0
- package/stack-template/app/ui-kit/src/hooks/useLockBodyScroll.ts +13 -0
- package/stack-template/app/ui-kit/src/hooks/useMeasure.test.tsx +57 -0
- package/stack-template/app/ui-kit/src/hooks/useMeasure.ts +32 -0
- package/stack-template/app/ui-kit/src/hooks/useMediaQuery.test.ts +73 -0
- package/stack-template/app/ui-kit/src/hooks/useMediaQuery.ts +20 -0
- package/stack-template/app/ui-kit/src/hooks/useMountEffect.test.ts +22 -0
- package/stack-template/app/ui-kit/src/hooks/useMountEffect.ts +10 -0
- package/stack-template/app/ui-kit/src/hooks/useOnlineStatus.test.ts +36 -0
- package/stack-template/app/ui-kit/src/hooks/useOnlineStatus.ts +21 -0
- package/stack-template/app/ui-kit/src/hooks/usePrevious.test.ts +35 -0
- package/stack-template/app/ui-kit/src/hooks/usePrevious.ts +13 -0
- package/stack-template/app/ui-kit/src/hooks/useScrollProgress.test.ts +59 -0
- package/stack-template/app/ui-kit/src/hooks/useScrollProgress.ts +31 -0
- package/stack-template/app/ui-kit/src/hooks/useSessionStorage.test.ts +80 -0
- package/stack-template/app/ui-kit/src/hooks/useSessionStorage.ts +34 -0
- package/stack-template/app/ui-kit/src/hooks/useThrottle.test.ts +61 -0
- package/stack-template/app/ui-kit/src/hooks/useThrottle.ts +30 -0
- package/stack-template/app/ui-kit/src/hooks/useTimeout.test.ts +95 -0
- package/stack-template/app/ui-kit/src/hooks/useTimeout.ts +38 -0
- package/stack-template/app/ui-kit/src/hooks/useTitle.test.ts +34 -0
- package/stack-template/app/ui-kit/src/hooks/useTitle.ts +24 -0
- package/stack-template/app/ui-kit/src/hooks/useToggle.test.ts +46 -0
- package/stack-template/app/ui-kit/src/hooks/useToggle.ts +16 -0
- package/stack-template/app/ui-kit/src/hooks/useUpdateEffect.test.ts +25 -0
- package/stack-template/app/ui-kit/src/hooks/useUpdateEffect.ts +18 -0
- package/stack-template/app/ui-kit/src/hooks/useWindowSize.test.ts +33 -0
- package/stack-template/app/ui-kit/src/hooks/useWindowSize.ts +23 -0
- package/stack-template/app/ui-kit/src/index.ts +218 -0
- package/stack-template/app/ui-kit/src/intro-showcase.stories.tsx +272 -0
- package/stack-template/app/ui-kit/src/intro.docs.mdx +247 -0
- package/stack-template/app/ui-kit/src/motion/motion-showcase.stories.tsx +234 -0
- package/stack-template/app/ui-kit/src/motion/motion.md +38 -0
- package/stack-template/app/ui-kit/src/provider/index.tsx +77 -0
- package/stack-template/app/ui-kit/src/provider/provider.stories.tsx +87 -0
- package/stack-template/app/ui-kit/src/provider/provider.test.tsx +121 -0
- package/stack-template/app/ui-kit/src/styles/base.css +171 -0
- package/stack-template/app/ui-kit/src/styles/dark-theme.test.ts +21 -0
- package/stack-template/app/ui-kit/src/styles/tailwind.css +220 -0
- package/stack-template/app/ui-kit/src/styles/themes/dark.css +71 -0
- package/stack-template/app/ui-kit/src/styles/tokens.css +133 -0
- package/stack-template/app/ui-kit/src/styles/ui-kit.css +10 -0
- package/stack-template/app/ui-kit/src/templates/auth.stories.tsx +425 -0
- package/stack-template/app/ui-kit/src/templates/crud.stories.tsx +416 -0
- package/stack-template/app/ui-kit/src/templates/dashboard.stories.tsx +504 -0
- package/stack-template/app/ui-kit/src/templates/experience/chapters/ch1-deep-focus.tsx +96 -0
- package/stack-template/app/ui-kit/src/templates/experience/chapters/ch2-living-docs.tsx +134 -0
- package/stack-template/app/ui-kit/src/templates/experience/chapters/ch3-team-velocity.tsx +148 -0
- package/stack-template/app/ui-kit/src/templates/experience/chapters/ch4-ship-your-app.tsx +100 -0
- package/stack-template/app/ui-kit/src/templates/experience/chapters/ch5-future.tsx +67 -0
- package/stack-template/app/ui-kit/src/templates/experience/chapters/hero.tsx +434 -0
- package/stack-template/app/ui-kit/src/templates/experience/chapters/nav-footer.tsx +85 -0
- package/stack-template/app/ui-kit/src/templates/experience/hero.stories.tsx +27 -0
- package/stack-template/app/ui-kit/src/templates/experience/hero.test.tsx +108 -0
- package/stack-template/app/ui-kit/src/templates/experience/index.stories.tsx +51 -0
- package/stack-template/app/ui-kit/src/templates/experience/lib/ChapterShell.tsx +84 -0
- package/stack-template/app/ui-kit/src/templates/experience/lib/SideNav.tsx +173 -0
- package/stack-template/app/ui-kit/src/templates/experience/lib/chapter-shell.test.tsx +266 -0
- package/stack-template/app/ui-kit/src/templates/experience/lib/scroll-mood.tsx +143 -0
- package/stack-template/app/ui-kit/src/templates/experience/lib/starfield.test.tsx +31 -0
- package/stack-template/app/ui-kit/src/templates/experience/lib/starfield.tsx +190 -0
- package/stack-template/app/ui-kit/src/templates/experience/mood-engine.stories.tsx +114 -0
- package/stack-template/app/ui-kit/src/templates/experience/shell-nav.stories.tsx +113 -0
- package/stack-template/app/ui-kit/src/templates/kanban-project.stories.tsx +352 -0
- package/stack-template/app/ui-kit/src/templates/landing.stories.tsx +380 -0
- package/stack-template/app/ui-kit/src/templates/parallax-landing.stories.tsx +633 -0
- package/stack-template/app/ui-kit/src/templates/settings.stories.tsx +474 -0
- package/stack-template/app/ui-kit/src/ui/accordion/accordion.stories.tsx +91 -0
- package/stack-template/app/ui-kit/src/ui/accordion/accordion.test.tsx +99 -0
- package/stack-template/app/ui-kit/src/ui/accordion/index.tsx +107 -0
- package/stack-template/app/ui-kit/src/ui/affix/affix.stories.tsx +104 -0
- package/stack-template/app/ui-kit/src/ui/affix/affix.test.tsx +138 -0
- package/stack-template/app/ui-kit/src/ui/affix/index.tsx +89 -0
- package/stack-template/app/ui-kit/src/ui/alert/alert.stories.tsx +149 -0
- package/stack-template/app/ui-kit/src/ui/alert/alert.test.tsx +85 -0
- package/stack-template/app/ui-kit/src/ui/alert/index.tsx +118 -0
- package/stack-template/app/ui-kit/src/ui/anchor/anchor.stories.tsx +96 -0
- package/stack-template/app/ui-kit/src/ui/anchor/anchor.test.tsx +191 -0
- package/stack-template/app/ui-kit/src/ui/anchor/index.tsx +144 -0
- package/stack-template/app/ui-kit/src/ui/auto-complete/auto-complete.stories.tsx +67 -0
- package/stack-template/app/ui-kit/src/ui/auto-complete/auto-complete.test.tsx +94 -0
- package/stack-template/app/ui-kit/src/ui/auto-complete/index.tsx +54 -0
- package/stack-template/app/ui-kit/src/ui/avatar/avatar.stories.tsx +132 -0
- package/stack-template/app/ui-kit/src/ui/avatar/avatar.test.tsx +65 -0
- package/stack-template/app/ui-kit/src/ui/avatar/index.tsx +48 -0
- package/stack-template/app/ui-kit/src/ui/avatar-group/avatar-group.stories.tsx +113 -0
- package/stack-template/app/ui-kit/src/ui/avatar-group/avatar-group.test.tsx +71 -0
- package/stack-template/app/ui-kit/src/ui/avatar-group/index.tsx +66 -0
- package/stack-template/app/ui-kit/src/ui/backdrop/backdrop.stories.tsx +66 -0
- package/stack-template/app/ui-kit/src/ui/backdrop/backdrop.test.tsx +37 -0
- package/stack-template/app/ui-kit/src/ui/backdrop/index.tsx +29 -0
- package/stack-template/app/ui-kit/src/ui/badge/badge.stories.tsx +105 -0
- package/stack-template/app/ui-kit/src/ui/badge/badge.test.tsx +115 -0
- package/stack-template/app/ui-kit/src/ui/badge/index.tsx +154 -0
- package/stack-template/app/ui-kit/src/ui/blockui/blockui.stories.tsx +34 -0
- package/stack-template/app/ui-kit/src/ui/blockui/blockui.test.tsx +29 -0
- package/stack-template/app/ui-kit/src/ui/blockui/index.tsx +25 -0
- package/stack-template/app/ui-kit/src/ui/bottom-navigation/bottom-navigation.stories.tsx +70 -0
- package/stack-template/app/ui-kit/src/ui/bottom-navigation/bottom-navigation.test.tsx +68 -0
- package/stack-template/app/ui-kit/src/ui/bottom-navigation/index.tsx +82 -0
- package/stack-template/app/ui-kit/src/ui/branch-fill.test.tsx +245 -0
- package/stack-template/app/ui-kit/src/ui/breadcrumb/breadcrumb.stories.tsx +103 -0
- package/stack-template/app/ui-kit/src/ui/breadcrumb/breadcrumb.test.tsx +49 -0
- package/stack-template/app/ui-kit/src/ui/breadcrumb/index.tsx +37 -0
- package/stack-template/app/ui-kit/src/ui/busy-box/busy-box.stories.tsx +30 -0
- package/stack-template/app/ui-kit/src/ui/busy-box/busy-box.test.tsx +29 -0
- package/stack-template/app/ui-kit/src/ui/busy-box/index.tsx +25 -0
- package/stack-template/app/ui-kit/src/ui/button/button.stories.tsx +121 -0
- package/stack-template/app/ui-kit/src/ui/button/button.test.tsx +207 -0
- package/stack-template/app/ui-kit/src/ui/button/index.tsx +128 -0
- package/stack-template/app/ui-kit/src/ui/calendar/calendar.stories.tsx +100 -0
- package/stack-template/app/ui-kit/src/ui/calendar/calendar.test.tsx +92 -0
- package/stack-template/app/ui-kit/src/ui/calendar/index.tsx +163 -0
- package/stack-template/app/ui-kit/src/ui/card/card.stories.tsx +203 -0
- package/stack-template/app/ui-kit/src/ui/card/card.test.tsx +135 -0
- package/stack-template/app/ui-kit/src/ui/card/index.tsx +84 -0
- package/stack-template/app/ui-kit/src/ui/carousel/carousel.stories.tsx +533 -0
- package/stack-template/app/ui-kit/src/ui/carousel/carousel.test.tsx +148 -0
- package/stack-template/app/ui-kit/src/ui/carousel/index.tsx +195 -0
- package/stack-template/app/ui-kit/src/ui/cascade-select/cascade-select.stories.tsx +126 -0
- package/stack-template/app/ui-kit/src/ui/cascade-select/cascade-select.test.tsx +132 -0
- package/stack-template/app/ui-kit/src/ui/cascade-select/index.tsx +87 -0
- package/stack-template/app/ui-kit/src/ui/chart/chart-theme.test.tsx +79 -0
- package/stack-template/app/ui-kit/src/ui/chart/chart.stories.tsx +278 -0
- package/stack-template/app/ui-kit/src/ui/chart/chart.test.tsx +103 -0
- package/stack-template/app/ui-kit/src/ui/chart/index.tsx +172 -0
- package/stack-template/app/ui-kit/src/ui/checkbox/checkbox.stories.tsx +67 -0
- package/stack-template/app/ui-kit/src/ui/checkbox/checkbox.test.tsx +99 -0
- package/stack-template/app/ui-kit/src/ui/checkbox/index.tsx +52 -0
- package/stack-template/app/ui-kit/src/ui/chips/chips.stories.tsx +53 -0
- package/stack-template/app/ui-kit/src/ui/chips/chips.test.tsx +86 -0
- package/stack-template/app/ui-kit/src/ui/chips/index.tsx +44 -0
- package/stack-template/app/ui-kit/src/ui/collapse/collapse.stories.tsx +93 -0
- package/stack-template/app/ui-kit/src/ui/collapse/collapse.test.tsx +128 -0
- package/stack-template/app/ui-kit/src/ui/collapse/index.tsx +75 -0
- package/stack-template/app/ui-kit/src/ui/color-picker/color-picker.stories.tsx +48 -0
- package/stack-template/app/ui-kit/src/ui/color-picker/color-picker.test.tsx +68 -0
- package/stack-template/app/ui-kit/src/ui/color-picker/index.tsx +38 -0
- package/stack-template/app/ui-kit/src/ui/context-menu/context-menu.stories.tsx +73 -0
- package/stack-template/app/ui-kit/src/ui/context-menu/context-menu.test.tsx +93 -0
- package/stack-template/app/ui-kit/src/ui/context-menu/index.tsx +79 -0
- package/stack-template/app/ui-kit/src/ui/count-up/count-up.stories.tsx +80 -0
- package/stack-template/app/ui-kit/src/ui/count-up/count-up.test.tsx +121 -0
- package/stack-template/app/ui-kit/src/ui/count-up/index.tsx +70 -0
- package/stack-template/app/ui-kit/src/ui/date-picker/date-picker.stories.tsx +154 -0
- package/stack-template/app/ui-kit/src/ui/date-picker/date-picker.test.tsx +221 -0
- package/stack-template/app/ui-kit/src/ui/date-picker/index.tsx +287 -0
- package/stack-template/app/ui-kit/src/ui/date-picker/locale-constants.ts +90 -0
- package/stack-template/app/ui-kit/src/ui/date-picker/locale.tsx +15 -0
- package/stack-template/app/ui-kit/src/ui/deferred-content/deferred-content.stories.tsx +62 -0
- package/stack-template/app/ui-kit/src/ui/deferred-content/deferred-content.test.tsx +94 -0
- package/stack-template/app/ui-kit/src/ui/deferred-content/index.tsx +61 -0
- package/stack-template/app/ui-kit/src/ui/descriptions/descriptions.stories.tsx +114 -0
- package/stack-template/app/ui-kit/src/ui/descriptions/descriptions.test.tsx +75 -0
- package/stack-template/app/ui-kit/src/ui/descriptions/index.tsx +48 -0
- package/stack-template/app/ui-kit/src/ui/divider/divider.stories.tsx +66 -0
- package/stack-template/app/ui-kit/src/ui/divider/divider.test.tsx +83 -0
- package/stack-template/app/ui-kit/src/ui/divider/index.tsx +65 -0
- package/stack-template/app/ui-kit/src/ui/drag-drop/drag-drop.stories.tsx +145 -0
- package/stack-template/app/ui-kit/src/ui/drag-drop/drag-drop.test.tsx +352 -0
- package/stack-template/app/ui-kit/src/ui/drag-drop/index.tsx +456 -0
- package/stack-template/app/ui-kit/src/ui/drawer/drawer.stories.tsx +108 -0
- package/stack-template/app/ui-kit/src/ui/drawer/drawer.test.tsx +132 -0
- package/stack-template/app/ui-kit/src/ui/drawer/index.tsx +113 -0
- package/stack-template/app/ui-kit/src/ui/dropdown/dropdown.stories.tsx +61 -0
- package/stack-template/app/ui-kit/src/ui/dropdown/dropdown.test.tsx +101 -0
- package/stack-template/app/ui-kit/src/ui/dropdown/index.tsx +162 -0
- package/stack-template/app/ui-kit/src/ui/editor/EditorInner.tsx +93 -0
- package/stack-template/app/ui-kit/src/ui/editor/editor.stories.tsx +37 -0
- package/stack-template/app/ui-kit/src/ui/editor/editor.test.tsx +84 -0
- package/stack-template/app/ui-kit/src/ui/editor/index.tsx +58 -0
- package/stack-template/app/ui-kit/src/ui/empty-state/empty-state.stories.tsx +24 -0
- package/stack-template/app/ui-kit/src/ui/empty-state/empty-state.test.tsx +48 -0
- package/stack-template/app/ui-kit/src/ui/empty-state/index.tsx +22 -0
- package/stack-template/app/ui-kit/src/ui/experience3d/experience3d.stories.tsx +66 -0
- package/stack-template/app/ui-kit/src/ui/experience3d/experience3d.test.tsx +50 -0
- package/stack-template/app/ui-kit/src/ui/experience3d/index.tsx +457 -0
- package/stack-template/app/ui-kit/src/ui/field/field-array.stories.tsx +214 -0
- package/stack-template/app/ui-kit/src/ui/field/field.stories.tsx +158 -0
- package/stack-template/app/ui-kit/src/ui/field/field.test.tsx +68 -0
- package/stack-template/app/ui-kit/src/ui/field/index.tsx +48 -0
- package/stack-template/app/ui-kit/src/ui/fieldset/fieldset.stories.tsx +49 -0
- package/stack-template/app/ui-kit/src/ui/fieldset/fieldset.test.tsx +88 -0
- package/stack-template/app/ui-kit/src/ui/fieldset/index.tsx +62 -0
- package/stack-template/app/ui-kit/src/ui/flex/flex.stories.tsx +96 -0
- package/stack-template/app/ui-kit/src/ui/flex/flex.test.tsx +79 -0
- package/stack-template/app/ui-kit/src/ui/flex/index.tsx +45 -0
- package/stack-template/app/ui-kit/src/ui/float-button/float-button.stories.tsx +82 -0
- package/stack-template/app/ui-kit/src/ui/float-button/float-button.test.tsx +107 -0
- package/stack-template/app/ui-kit/src/ui/float-button/index.tsx +124 -0
- package/stack-template/app/ui-kit/src/ui/galleria/galleria.stories.tsx +78 -0
- package/stack-template/app/ui-kit/src/ui/galleria/galleria.test.tsx +67 -0
- package/stack-template/app/ui-kit/src/ui/galleria/index.tsx +47 -0
- package/stack-template/app/ui-kit/src/ui/grid/grid.stories.tsx +179 -0
- package/stack-template/app/ui-kit/src/ui/grid/grid.test.tsx +286 -0
- package/stack-template/app/ui-kit/src/ui/grid/index.tsx +104 -0
- package/stack-template/app/ui-kit/src/ui/icons/icons.stories.tsx +52 -0
- package/stack-template/app/ui-kit/src/ui/icons/icons.test.tsx +60 -0
- package/stack-template/app/ui-kit/src/ui/icons/index.tsx +294 -0
- package/stack-template/app/ui-kit/src/ui/image/image.stories.tsx +231 -0
- package/stack-template/app/ui-kit/src/ui/image/image.test.tsx +79 -0
- package/stack-template/app/ui-kit/src/ui/image/index.tsx +76 -0
- package/stack-template/app/ui-kit/src/ui/inplace/index.tsx +33 -0
- package/stack-template/app/ui-kit/src/ui/inplace/inplace.stories.tsx +75 -0
- package/stack-template/app/ui-kit/src/ui/inplace/inplace.test.tsx +58 -0
- package/stack-template/app/ui-kit/src/ui/input/index.tsx +133 -0
- package/stack-template/app/ui-kit/src/ui/input/input-search.stories.tsx +112 -0
- package/stack-template/app/ui-kit/src/ui/input/input-search.test.tsx +116 -0
- package/stack-template/app/ui-kit/src/ui/input/input-search.tsx +116 -0
- package/stack-template/app/ui-kit/src/ui/input/input.stories.tsx +176 -0
- package/stack-template/app/ui-kit/src/ui/input/input.test.tsx +106 -0
- package/stack-template/app/ui-kit/src/ui/input-mask/index.tsx +39 -0
- package/stack-template/app/ui-kit/src/ui/input-mask/input-mask.stories.tsx +46 -0
- package/stack-template/app/ui-kit/src/ui/input-mask/input-mask.test.tsx +57 -0
- package/stack-template/app/ui-kit/src/ui/input-number/index.tsx +125 -0
- package/stack-template/app/ui-kit/src/ui/input-number/input-number.stories.tsx +190 -0
- package/stack-template/app/ui-kit/src/ui/input-number/input-number.test.tsx +157 -0
- package/stack-template/app/ui-kit/src/ui/input-otp/index.tsx +57 -0
- package/stack-template/app/ui-kit/src/ui/input-otp/input-otp.stories.tsx +90 -0
- package/stack-template/app/ui-kit/src/ui/input-otp/input-otp.test.tsx +66 -0
- package/stack-template/app/ui-kit/src/ui/kanban/index.tsx +277 -0
- package/stack-template/app/ui-kit/src/ui/kanban/kanban.stories.tsx +219 -0
- package/stack-template/app/ui-kit/src/ui/kanban/kanban.test.tsx +234 -0
- package/stack-template/app/ui-kit/src/ui/knob/index.tsx +58 -0
- package/stack-template/app/ui-kit/src/ui/knob/knob.stories.tsx +49 -0
- package/stack-template/app/ui-kit/src/ui/knob/knob.test.tsx +42 -0
- package/stack-template/app/ui-kit/src/ui/layout/index.tsx +145 -0
- package/stack-template/app/ui-kit/src/ui/layout/layout.stories.tsx +158 -0
- package/stack-template/app/ui-kit/src/ui/layout/layout.test.tsx +154 -0
- package/stack-template/app/ui-kit/src/ui/link/index.tsx +61 -0
- package/stack-template/app/ui-kit/src/ui/link/link.stories.tsx +68 -0
- package/stack-template/app/ui-kit/src/ui/link/link.test.tsx +69 -0
- package/stack-template/app/ui-kit/src/ui/list/index.tsx +135 -0
- package/stack-template/app/ui-kit/src/ui/list/list.stories.tsx +194 -0
- package/stack-template/app/ui-kit/src/ui/list/list.test.tsx +164 -0
- package/stack-template/app/ui-kit/src/ui/listbox/index.tsx +27 -0
- package/stack-template/app/ui-kit/src/ui/listbox/listbox.stories.tsx +57 -0
- package/stack-template/app/ui-kit/src/ui/listbox/listbox.test.tsx +49 -0
- package/stack-template/app/ui-kit/src/ui/mega-menu/index.tsx +142 -0
- package/stack-template/app/ui-kit/src/ui/mega-menu/mega-menu.stories.tsx +137 -0
- package/stack-template/app/ui-kit/src/ui/mega-menu/mega-menu.test.tsx +130 -0
- package/stack-template/app/ui-kit/src/ui/mention/index.tsx +76 -0
- package/stack-template/app/ui-kit/src/ui/mention/mention.stories.tsx +44 -0
- package/stack-template/app/ui-kit/src/ui/mention/mention.test.tsx +87 -0
- package/stack-template/app/ui-kit/src/ui/menu/index.tsx +256 -0
- package/stack-template/app/ui-kit/src/ui/menu/menu.stories.tsx +124 -0
- package/stack-template/app/ui-kit/src/ui/menu/menu.test.tsx +251 -0
- package/stack-template/app/ui-kit/src/ui/menubar/index.tsx +42 -0
- package/stack-template/app/ui-kit/src/ui/menubar/menubar.stories.tsx +66 -0
- package/stack-template/app/ui-kit/src/ui/menubar/menubar.test.tsx +65 -0
- package/stack-template/app/ui-kit/src/ui/message/index.tsx +123 -0
- package/stack-template/app/ui-kit/src/ui/message/message.stories.tsx +104 -0
- package/stack-template/app/ui-kit/src/ui/message/message.test.tsx +109 -0
- package/stack-template/app/ui-kit/src/ui/modal/index.tsx +142 -0
- package/stack-template/app/ui-kit/src/ui/modal/modal.stories.tsx +128 -0
- package/stack-template/app/ui-kit/src/ui/modal/modal.test.tsx +166 -0
- package/stack-template/app/ui-kit/src/ui/notification/index.tsx +142 -0
- package/stack-template/app/ui-kit/src/ui/notification/notification.stories.tsx +155 -0
- package/stack-template/app/ui-kit/src/ui/notification/notification.test.tsx +83 -0
- package/stack-template/app/ui-kit/src/ui/order-list/index.tsx +38 -0
- package/stack-template/app/ui-kit/src/ui/order-list/order-list.stories.tsx +38 -0
- package/stack-template/app/ui-kit/src/ui/order-list/order-list.test.tsx +54 -0
- package/stack-template/app/ui-kit/src/ui/org-chart/index.tsx +138 -0
- package/stack-template/app/ui-kit/src/ui/org-chart/org-chart.stories.tsx +76 -0
- package/stack-template/app/ui-kit/src/ui/org-chart/org-chart.test.tsx +98 -0
- package/stack-template/app/ui-kit/src/ui/pagination/index.tsx +102 -0
- package/stack-template/app/ui-kit/src/ui/pagination/pagination.stories.tsx +103 -0
- package/stack-template/app/ui-kit/src/ui/pagination/pagination.test.tsx +112 -0
- package/stack-template/app/ui-kit/src/ui/panel-menu/index.tsx +59 -0
- package/stack-template/app/ui-kit/src/ui/panel-menu/panel-menu.stories.tsx +96 -0
- package/stack-template/app/ui-kit/src/ui/panel-menu/panel-menu.test.tsx +64 -0
- package/stack-template/app/ui-kit/src/ui/parallax/index.tsx +62 -0
- package/stack-template/app/ui-kit/src/ui/parallax/parallax.stories.tsx +115 -0
- package/stack-template/app/ui-kit/src/ui/parallax/parallax.test.tsx +148 -0
- package/stack-template/app/ui-kit/src/ui/password/index.tsx +67 -0
- package/stack-template/app/ui-kit/src/ui/password/password.stories.tsx +43 -0
- package/stack-template/app/ui-kit/src/ui/password/password.test.tsx +45 -0
- package/stack-template/app/ui-kit/src/ui/pick-list/index.tsx +103 -0
- package/stack-template/app/ui-kit/src/ui/pick-list/pick-list.stories.tsx +59 -0
- package/stack-template/app/ui-kit/src/ui/pick-list/pick-list.test.tsx +94 -0
- package/stack-template/app/ui-kit/src/ui/popconfirm/index.tsx +102 -0
- package/stack-template/app/ui-kit/src/ui/popconfirm/popconfirm.stories.tsx +73 -0
- package/stack-template/app/ui-kit/src/ui/popconfirm/popconfirm.test.tsx +127 -0
- package/stack-template/app/ui-kit/src/ui/popover/index.tsx +136 -0
- package/stack-template/app/ui-kit/src/ui/popover/popover.stories.tsx +114 -0
- package/stack-template/app/ui-kit/src/ui/popover/popover.test.tsx +172 -0
- package/stack-template/app/ui-kit/src/ui/progress/index.tsx +46 -0
- package/stack-template/app/ui-kit/src/ui/progress/progress.stories.tsx +57 -0
- package/stack-template/app/ui-kit/src/ui/progress/progress.test.tsx +90 -0
- package/stack-template/app/ui-kit/src/ui/qr-code/index.tsx +88 -0
- package/stack-template/app/ui-kit/src/ui/qr-code/qr-code.stories.tsx +109 -0
- package/stack-template/app/ui-kit/src/ui/qr-code/qr-code.test.tsx +155 -0
- package/stack-template/app/ui-kit/src/ui/qr-code/qrcode-core.ts +56 -0
- package/stack-template/app/ui-kit/src/ui/qr-code/qrcode-generator.vendor.ts +2300 -0
- package/stack-template/app/ui-kit/src/ui/radio/index.tsx +62 -0
- package/stack-template/app/ui-kit/src/ui/radio/radio.stories.tsx +94 -0
- package/stack-template/app/ui-kit/src/ui/radio/radio.test.tsx +83 -0
- package/stack-template/app/ui-kit/src/ui/rating/index.tsx +36 -0
- package/stack-template/app/ui-kit/src/ui/rating/rating.stories.tsx +42 -0
- package/stack-template/app/ui-kit/src/ui/rating/rating.test.tsx +45 -0
- package/stack-template/app/ui-kit/src/ui/result/index.tsx +72 -0
- package/stack-template/app/ui-kit/src/ui/result/result.stories.tsx +82 -0
- package/stack-template/app/ui-kit/src/ui/result/result.test.tsx +57 -0
- package/stack-template/app/ui-kit/src/ui/reveal/index.tsx +83 -0
- package/stack-template/app/ui-kit/src/ui/reveal/reveal.stories.tsx +91 -0
- package/stack-template/app/ui-kit/src/ui/reveal/reveal.test.tsx +148 -0
- package/stack-template/app/ui-kit/src/ui/schedule/index.tsx +104 -0
- package/stack-template/app/ui-kit/src/ui/schedule/schedule.fc.test.tsx +95 -0
- package/stack-template/app/ui-kit/src/ui/schedule/schedule.stories.tsx +61 -0
- package/stack-template/app/ui-kit/src/ui/schedule/schedule.test.tsx +41 -0
- package/stack-template/app/ui-kit/src/ui/scroll-page/index.tsx +46 -0
- package/stack-template/app/ui-kit/src/ui/scroll-page/scroll-page.stories.tsx +92 -0
- package/stack-template/app/ui-kit/src/ui/scroll-page/scroll-page.test.tsx +51 -0
- package/stack-template/app/ui-kit/src/ui/scroll-panel/index.tsx +16 -0
- package/stack-template/app/ui-kit/src/ui/scroll-panel/scroll-panel.stories.tsx +37 -0
- package/stack-template/app/ui-kit/src/ui/scroll-panel/scroll-panel.test.tsx +41 -0
- package/stack-template/app/ui-kit/src/ui/scrolltop/index.tsx +27 -0
- package/stack-template/app/ui-kit/src/ui/scrolltop/scrolltop.stories.tsx +41 -0
- package/stack-template/app/ui-kit/src/ui/scrolltop/scrolltop.test.tsx +37 -0
- package/stack-template/app/ui-kit/src/ui/segmented/index.tsx +47 -0
- package/stack-template/app/ui-kit/src/ui/segmented/segmented.stories.tsx +126 -0
- package/stack-template/app/ui-kit/src/ui/segmented/segmented.test.tsx +77 -0
- package/stack-template/app/ui-kit/src/ui/select/index.tsx +302 -0
- package/stack-template/app/ui-kit/src/ui/select/select.stories.tsx +268 -0
- package/stack-template/app/ui-kit/src/ui/select/select.test.tsx +226 -0
- package/stack-template/app/ui-kit/src/ui/sidebar/index.tsx +83 -0
- package/stack-template/app/ui-kit/src/ui/sidebar/sidebar.stories.tsx +71 -0
- package/stack-template/app/ui-kit/src/ui/sidebar/sidebar.test.tsx +101 -0
- package/stack-template/app/ui-kit/src/ui/skeleton/index.tsx +55 -0
- package/stack-template/app/ui-kit/src/ui/skeleton/skeleton.stories.tsx +110 -0
- package/stack-template/app/ui-kit/src/ui/skeleton/skeleton.test.tsx +74 -0
- package/stack-template/app/ui-kit/src/ui/slide-menu/index.tsx +103 -0
- package/stack-template/app/ui-kit/src/ui/slide-menu/slide-menu.stories.tsx +92 -0
- package/stack-template/app/ui-kit/src/ui/slide-menu/slide-menu.test.tsx +120 -0
- package/stack-template/app/ui-kit/src/ui/slider/index.tsx +90 -0
- package/stack-template/app/ui-kit/src/ui/slider/slider.stories.tsx +60 -0
- package/stack-template/app/ui-kit/src/ui/slider/slider.test.tsx +66 -0
- package/stack-template/app/ui-kit/src/ui/space/index.tsx +32 -0
- package/stack-template/app/ui-kit/src/ui/space/space.stories.tsx +66 -0
- package/stack-template/app/ui-kit/src/ui/space/space.test.tsx +56 -0
- package/stack-template/app/ui-kit/src/ui/speed-dial/index.tsx +32 -0
- package/stack-template/app/ui-kit/src/ui/speed-dial/speed-dial.stories.tsx +34 -0
- package/stack-template/app/ui-kit/src/ui/speed-dial/speed-dial.test.tsx +34 -0
- package/stack-template/app/ui-kit/src/ui/spinner/index.tsx +74 -0
- package/stack-template/app/ui-kit/src/ui/spinner/spinner.stories.tsx +64 -0
- package/stack-template/app/ui-kit/src/ui/spinner/spinner.test.tsx +66 -0
- package/stack-template/app/ui-kit/src/ui/split-button/index.tsx +155 -0
- package/stack-template/app/ui-kit/src/ui/split-button/split-button.stories.tsx +137 -0
- package/stack-template/app/ui-kit/src/ui/split-button/split-button.test.tsx +152 -0
- package/stack-template/app/ui-kit/src/ui/splitter/index.tsx +49 -0
- package/stack-template/app/ui-kit/src/ui/splitter/splitter.stories.tsx +24 -0
- package/stack-template/app/ui-kit/src/ui/splitter/splitter.test.tsx +21 -0
- package/stack-template/app/ui-kit/src/ui/statistic/index.tsx +28 -0
- package/stack-template/app/ui-kit/src/ui/statistic/statistic.stories.tsx +112 -0
- package/stack-template/app/ui-kit/src/ui/statistic/statistic.test.tsx +39 -0
- package/stack-template/app/ui-kit/src/ui/steps/index.tsx +50 -0
- package/stack-template/app/ui-kit/src/ui/steps/steps.stories.tsx +57 -0
- package/stack-template/app/ui-kit/src/ui/steps/steps.test.tsx +55 -0
- package/stack-template/app/ui-kit/src/ui/switch/index.tsx +87 -0
- package/stack-template/app/ui-kit/src/ui/switch/switch.stories.tsx +123 -0
- package/stack-template/app/ui-kit/src/ui/switch/switch.test.tsx +98 -0
- package/stack-template/app/ui-kit/src/ui/tab-menu/index.tsx +33 -0
- package/stack-template/app/ui-kit/src/ui/tab-menu/tab-menu.stories.tsx +49 -0
- package/stack-template/app/ui-kit/src/ui/tab-menu/tab-menu.test.tsx +50 -0
- package/stack-template/app/ui-kit/src/ui/table/index.tsx +690 -0
- package/stack-template/app/ui-kit/src/ui/table/table-advanced.stories.tsx +91 -0
- package/stack-template/app/ui-kit/src/ui/table/table-advanced.test.tsx +188 -0
- package/stack-template/app/ui-kit/src/ui/table/table-expandable.stories.tsx +91 -0
- package/stack-template/app/ui-kit/src/ui/table/table-expandable.test.tsx +143 -0
- package/stack-template/app/ui-kit/src/ui/table/table.stories.tsx +342 -0
- package/stack-template/app/ui-kit/src/ui/table/table.test.tsx +465 -0
- package/stack-template/app/ui-kit/src/ui/table/types.ts +173 -0
- package/stack-template/app/ui-kit/src/ui/tabs/index.tsx +118 -0
- package/stack-template/app/ui-kit/src/ui/tabs/tabs.stories.tsx +113 -0
- package/stack-template/app/ui-kit/src/ui/tabs/tabs.test.tsx +77 -0
- package/stack-template/app/ui-kit/src/ui/tag/index.tsx +68 -0
- package/stack-template/app/ui-kit/src/ui/tag/tag.stories.tsx +88 -0
- package/stack-template/app/ui-kit/src/ui/tag/tag.test.tsx +126 -0
- package/stack-template/app/ui-kit/src/ui/team/debt-board/debt-board.stories.tsx +52 -0
- package/stack-template/app/ui-kit/src/ui/team/debt-board/debt-board.test.tsx +72 -0
- package/stack-template/app/ui-kit/src/ui/team/debt-board/index.tsx +125 -0
- package/stack-template/app/ui-kit/src/ui/team/inbox-thread/inbox-thread.stories.tsx +70 -0
- package/stack-template/app/ui-kit/src/ui/team/inbox-thread/inbox-thread.test.tsx +56 -0
- package/stack-template/app/ui-kit/src/ui/team/inbox-thread/index.tsx +107 -0
- package/stack-template/app/ui-kit/src/ui/team/ping-feed/index.tsx +102 -0
- package/stack-template/app/ui-kit/src/ui/team/ping-feed/ping-feed.stories.tsx +57 -0
- package/stack-template/app/ui-kit/src/ui/team/ping-feed/ping-feed.test.tsx +60 -0
- package/stack-template/app/ui-kit/src/ui/team/stage-pipeline/index.tsx +60 -0
- package/stack-template/app/ui-kit/src/ui/team/stage-pipeline/stage-pipeline.stories.tsx +68 -0
- package/stack-template/app/ui-kit/src/ui/team/stage-pipeline/stage-pipeline.test.tsx +50 -0
- package/stack-template/app/ui-kit/src/ui/team/team-dashboard/index.tsx +103 -0
- package/stack-template/app/ui-kit/src/ui/team/team-dashboard/team-dashboard.stories.tsx +72 -0
- package/stack-template/app/ui-kit/src/ui/team/team-dashboard/team-dashboard.test.tsx +72 -0
- package/stack-template/app/ui-kit/src/ui/time-picker/index.tsx +143 -0
- package/stack-template/app/ui-kit/src/ui/time-picker/time-picker.stories.tsx +90 -0
- package/stack-template/app/ui-kit/src/ui/time-picker/time-picker.test.tsx +64 -0
- package/stack-template/app/ui-kit/src/ui/timeline/index.tsx +91 -0
- package/stack-template/app/ui-kit/src/ui/timeline/timeline.stories.tsx +209 -0
- package/stack-template/app/ui-kit/src/ui/timeline/timeline.test.tsx +116 -0
- package/stack-template/app/ui-kit/src/ui/timesheet/index.tsx +277 -0
- package/stack-template/app/ui-kit/src/ui/timesheet/timesheet.stories.tsx +97 -0
- package/stack-template/app/ui-kit/src/ui/timesheet/timesheet.test.tsx +103 -0
- package/stack-template/app/ui-kit/src/ui/toggle-button/index.tsx +28 -0
- package/stack-template/app/ui-kit/src/ui/toggle-button/toggle-button-group.stories.tsx +85 -0
- package/stack-template/app/ui-kit/src/ui/toggle-button/toggle-button-group.test.tsx +97 -0
- package/stack-template/app/ui-kit/src/ui/toggle-button/toggle-button-group.tsx +81 -0
- package/stack-template/app/ui-kit/src/ui/toggle-button/toggle-button.stories.tsx +46 -0
- package/stack-template/app/ui-kit/src/ui/toggle-button/toggle-button.test.tsx +38 -0
- package/stack-template/app/ui-kit/src/ui/toolbar/index.tsx +18 -0
- package/stack-template/app/ui-kit/src/ui/toolbar/toolbar.stories.tsx +35 -0
- package/stack-template/app/ui-kit/src/ui/toolbar/toolbar.test.tsx +11 -0
- package/stack-template/app/ui-kit/src/ui/tooltip/index.tsx +61 -0
- package/stack-template/app/ui-kit/src/ui/tooltip/tooltip.stories.tsx +81 -0
- package/stack-template/app/ui-kit/src/ui/tooltip/tooltip.test.tsx +120 -0
- package/stack-template/app/ui-kit/src/ui/tour/index.tsx +210 -0
- package/stack-template/app/ui-kit/src/ui/tour/tour.stories.tsx +153 -0
- package/stack-template/app/ui-kit/src/ui/tour/tour.test.tsx +131 -0
- package/stack-template/app/ui-kit/src/ui/transition/index.tsx +377 -0
- package/stack-template/app/ui-kit/src/ui/transition/transition.stories.tsx +254 -0
- package/stack-template/app/ui-kit/src/ui/transition/transition.test.tsx +285 -0
- package/stack-template/app/ui-kit/src/ui/tree/index.tsx +68 -0
- package/stack-template/app/ui-kit/src/ui/tree/tree.stories.tsx +139 -0
- package/stack-template/app/ui-kit/src/ui/tree/tree.test.tsx +77 -0
- package/stack-template/app/ui-kit/src/ui/tree-select/index.tsx +251 -0
- package/stack-template/app/ui-kit/src/ui/tree-select/tree-select.stories.tsx +105 -0
- package/stack-template/app/ui-kit/src/ui/tree-select/tree-select.test.tsx +174 -0
- package/stack-template/app/ui-kit/src/ui/tree-table/index.tsx +229 -0
- package/stack-template/app/ui-kit/src/ui/tree-table/tree-table.stories.tsx +111 -0
- package/stack-template/app/ui-kit/src/ui/tree-table/tree-table.test.tsx +137 -0
- package/stack-template/app/ui-kit/src/ui/typography/index.tsx +124 -0
- package/stack-template/app/ui-kit/src/ui/typography/typography.stories.tsx +65 -0
- package/stack-template/app/ui-kit/src/ui/typography/typography.test.tsx +117 -0
- package/stack-template/app/ui-kit/src/ui/upload/index.tsx +39 -0
- package/stack-template/app/ui-kit/src/ui/upload/upload-core.tsx +204 -0
- package/stack-template/app/ui-kit/src/ui/upload/upload-dropzone.tsx +79 -0
- package/stack-template/app/ui-kit/src/ui/upload/upload.stories.tsx +67 -0
- package/stack-template/app/ui-kit/src/ui/upload/upload.test.tsx +204 -0
- package/stack-template/app/ui-kit/src/ui/virtual-scroll/index.tsx +86 -0
- package/stack-template/app/ui-kit/src/ui/virtual-scroll/virtual-scroll.stories.tsx +111 -0
- package/stack-template/app/ui-kit/src/ui/virtual-scroll/virtual-scroll.test.tsx +125 -0
- package/stack-template/app/ui-kit/src/ui/watermark/index.tsx +182 -0
- package/stack-template/app/ui-kit/src/ui/watermark/watermark.stories.tsx +96 -0
- package/stack-template/app/ui-kit/src/ui/watermark/watermark.test.tsx +120 -0
- package/stack-template/app/ui-kit/src/utils/array.test.ts +88 -0
- package/stack-template/app/ui-kit/src/utils/array.ts +51 -0
- package/stack-template/app/ui-kit/src/utils/dom.test.tsx +69 -0
- package/stack-template/app/ui-kit/src/utils/dom.ts +38 -0
- package/stack-template/app/ui-kit/src/utils/format.test.ts +63 -0
- package/stack-template/app/ui-kit/src/utils/format.ts +81 -0
- package/stack-template/app/ui-kit/tests/setup.ts +15 -0
- package/stack-template/app/ui-kit/tsconfig.json +18 -0
- package/stack-template/app/ui-kit/tsup.config.ts +37 -0
- package/stack-template/app/ui-kit/vercel.json +6 -0
- package/stack-template/app/ui-kit/vitest.config.ts +22 -0
- package/stack-template/contracts/auth/token-contract.md +119 -0
- package/stack-template/contracts/auth/users.json +35 -0
- package/stack-template/contracts/db/tasks-schema.sql +62 -0
- package/stack-template/contracts/events/fixtures/task.assigned.json +11 -0
- package/stack-template/contracts/events/fixtures/task.assignment_failed.json +11 -0
- package/stack-template/contracts/events/fixtures/task.created.json +12 -0
- package/stack-template/contracts/events/fixtures/task.deleted.json +10 -0
- package/stack-template/contracts/events/fixtures/task.updated.json +12 -0
- package/stack-template/contracts/events/task-events.md +80 -0
- package/stack-template/contracts/openapi/activity.yaml +196 -0
- package/stack-template/contracts/openapi/auth.yaml +310 -0
- package/stack-template/contracts/openapi/tasks.yaml +316 -0
- package/stack-template/contracts/openapi/users.yaml +345 -0
- package/stack-template/docs/adr/0001-mixed-stack.md +14 -0
- package/stack-template/docs/adr/0002-mf-rspack.md +14 -0
- package/stack-template/docs/adr/0003-contract-first.md +14 -0
- package/stack-template/docs/adr/0004-readonly-schema-tradeoff.md +14 -0
- package/stack-template/docs/adr/0005-fail-closed.md +14 -0
- package/stack-template/docs/adr/0006-fire-and-forget-events.md +14 -0
- package/stack-template/docs/adr/0007-fork-not-upgrade.md +14 -0
- package/stack-template/docs/adr/0008-kafka-outbox-saga.md +24 -0
- package/stack-template/docs/adr/0009-ui-kit-split.md +39 -0
- package/stack-template/docs/adr/README.md +15 -0
- package/stack-template/docs/ai/recipes.md +956 -0
- package/stack-template/docs/ai/table-Theming.md +25 -0
- package/stack-template/docs/ai/table-datadisplay-mz.md +20 -0
- package/stack-template/docs/ai/table-feedback.md +20 -0
- package/stack-template/docs/ai/table-forms.md +26 -0
- package/stack-template/docs/git-flow.md +70 -0
- package/stack-template/docs/parity-matrix.md +102 -0
- package/stack-template/docs/superpowers/contexts/auth-real/gap-answer.md +195 -0
- package/stack-template/docs/superpowers/contexts/auth-real/sf-1.md +21 -0
- package/stack-template/docs/superpowers/contexts/auth-real/sf-2.md +21 -0
- package/stack-template/docs/superpowers/contexts/auth-real/sf-3.md +17 -0
- package/stack-template/docs/superpowers/contexts/auth-real/sf-4.md +20 -0
- package/stack-template/docs/superpowers/contexts/auth-real/sf-5.md +21 -0
- package/stack-template/docs/superpowers/contexts/experience-design.md +85 -0
- package/stack-template/docs/superpowers/contexts/sf-1.md +39 -0
- package/stack-template/docs/superpowers/contexts/sf-2.md +42 -0
- package/stack-template/docs/superpowers/contexts/sf-3.md +42 -0
- package/stack-template/docs/superpowers/contexts/sf-4.md +26 -0
- package/stack-template/docs/superpowers/contexts/sf-5.md +36 -0
- package/stack-template/docs/superpowers/contexts/sf-6.md +36 -0
- package/stack-template/docs/superpowers/contexts/sf-7.md +35 -0
- package/stack-template/docs/superpowers/contexts/sf-cin-overview.md +21 -0
- package/stack-template/docs/superpowers/contexts/ui-redesign/sf-1.md +46 -0
- package/stack-template/docs/superpowers/contexts/ui-redesign/sf-2.md +44 -0
- package/stack-template/docs/superpowers/contexts/ui-redesign/sf-3.md +47 -0
- package/stack-template/docs/superpowers/contexts/ui-redesign/sf-4.md +44 -0
- package/stack-template/docs/superpowers/contexts/ui-redesign/sf-5.md +36 -0
- package/stack-template/docs/superpowers/designs/direction-approved.md +11 -0
- package/stack-template/docs/superpowers/designs/ui-redesign/drafts/a-roulette-soundviz.html +353 -0
- package/stack-template/docs/superpowers/designs/ui-redesign/drafts/b-reference.html +347 -0
- package/stack-template/docs/superpowers/designs/ui-redesign/drafts/c-designer.html +375 -0
- package/stack-template/docs/superpowers/designs/ui-redesign/ds-demo.html +140 -0
- package/stack-template/docs/superpowers/designs/ui-redesign-direction.md +93 -0
- package/stack-template/docs/superpowers/improvements-log.md +158 -0
- package/stack-template/docs/superpowers/mindmaps/auth-real.wakii +115 -0
- package/stack-template/docs/superpowers/mindmaps/kafka-outbox-saga.wakii +110 -0
- package/stack-template/docs/superpowers/mindmaps/micro-boilerplate.wakii +171 -0
- package/stack-template/docs/superpowers/mindmaps/ui-redesign.wakii +116 -0
- package/stack-template/docs/superpowers/mindmaps/vu53-cinematic-experience.wakii +32 -0
- package/stack-template/docs/superpowers/plans/2026-10-12-sf-1-contracts-platform-plan.md +44 -0
- package/stack-template/docs/superpowers/plans/2026-10-12-sf-3-spring-svc-impact.md +69 -0
- package/stack-template/docs/superpowers/plans/2026-10-12-sf-3-spring-svc-plan.md +27 -0
- package/stack-template/docs/superpowers/plans/2026-10-12-sf-4-go-svc-plan.md +99 -0
- package/stack-template/docs/superpowers/plans/2026-10-12-sf-5-fe-shell-plan.md +64 -0
- package/stack-template/docs/superpowers/plans/2026-10-12-sf-6-fe-remotes-plan.md +83 -0
- package/stack-template/docs/superpowers/plans/2026-10-12-sf-7-convergence-plan.md +59 -0
- package/stack-template/docs/superpowers/plans/2026-10-12-sf2-node-svc-plan.md +19 -0
- package/stack-template/docs/superpowers/plans/2026-10-13-sf-1-kafka-foundation-plan.md +30 -0
- package/stack-template/docs/superpowers/plans/2026-10-13-sf-1-ui-redesign-plan.md +28 -0
- package/stack-template/docs/superpowers/plans/2026-10-13-sf-2-node-outbox-plan.md +46 -0
- package/stack-template/docs/superpowers/plans/2026-10-13-sf-3-go-consumer-plan.md +31 -0
- package/stack-template/docs/superpowers/plans/2026-10-13-sf-4-spring-tx-plan.md +96 -0
- package/stack-template/docs/superpowers/plans/2026-10-13-sf-5-convergence-plan.md +21 -0
- package/stack-template/docs/superpowers/plans/2026-10-14-sf-2-ui-redesign-plan.md +32 -0
- package/stack-template/docs/superpowers/plans/2026-10-14-sf-3-ui-redesign-plan.md +34 -0
- package/stack-template/docs/superpowers/plans/2026-10-14-sf-5-ui-redesign-plan.md +35 -0
- package/stack-template/docs/superpowers/plans/2026-10-17-auth-real-plan.md +112 -0
- package/stack-template/docs/superpowers/plans/2026-10-17-ui-kit-split-plan.md +18 -0
- package/stack-template/docs/superpowers/reviews/2026-10-18-data-display-coverage.md +52 -0
- package/stack-template/docs/superpowers/reviews/code-reviewer-sf-5-r1.md +65 -0
- package/stack-template/docs/superpowers/reviews/security-audit-sf-5-auth-real.md +39 -0
- package/stack-template/docs/superpowers/specs/2026-10-12-boilerplate-microservice-mfe.md +110 -0
- package/stack-template/docs/superpowers/specs/2026-10-12-sf-3-spring-svc-design.md +160 -0
- package/stack-template/docs/superpowers/specs/2026-10-12-sf-7-convergence-spec.md +114 -0
- package/stack-template/docs/superpowers/specs/2026-10-12-sf2-node-svc-spec.md +42 -0
- package/stack-template/docs/superpowers/specs/2026-10-13-kafka-outbox-saga.md +111 -0
- package/stack-template/docs/superpowers/specs/2026-10-13-ui-redesign.md +173 -0
- package/stack-template/docs/superpowers/specs/2026-10-14-sf-3-ui-redesign.md +46 -0
- package/stack-template/docs/superpowers/specs/2026-10-14-sf-5-ui-redesign.md +30 -0
- package/stack-template/docs/superpowers/specs/2026-10-17-antd-look-tokens.md +28 -0
- package/stack-template/docs/superpowers/specs/2026-10-17-auth-real-design.md +124 -0
- package/stack-template/docs/superpowers/specs/2026-10-17-tailwind-migration.md +32 -0
- package/stack-template/docs/superpowers/specs/2026-10-17-ui-kit-split.md +44 -0
- package/stack-template/docs/superpowers/specs/2026-10-18-0.3.0-release-notes.md +77 -0
- package/stack-template/docs/toolchain.md +28 -0
- package/stack-template/docs/wakii-playbook.md +172 -0
- package/stack-template/docs/walkthrough.md +204 -0
- package/stack-template/orca.yaml +146 -0
- package/stack-template/package.json +19 -0
- package/stack-template/platform/.env.example +72 -0
- package/stack-template/platform/conventions/01-dockerfile-pattern.md +78 -0
- package/stack-template/platform/conventions/02-healthcheck.md +26 -0
- package/stack-template/platform/conventions/03-logging.md +41 -0
- package/stack-template/platform/conventions/04-error-envelope.md +41 -0
- package/stack-template/platform/conventions/05-ports.md +38 -0
- package/stack-template/platform/conventions/06-configuration.md +25 -0
- package/stack-template/platform/conventions/07-cors.md +23 -0
- package/stack-template/platform/conventions/08-gateway-and-remotes.md +33 -0
- package/stack-template/platform/conventions/09-async-messaging.md +42 -0
- package/stack-template/platform/conventions/README.md +15 -0
- package/stack-template/platform/docker-compose.yml +255 -0
- package/stack-template/platform/gateway/nginx/nginx.conf +137 -0
- package/stack-template/platform/postgres/init/01-init.sh +55 -0
- package/stack-template/pnpm-lock.yaml +15992 -0
- package/stack-template/pnpm-workspace.yaml +24 -0
- package/stack-template/scripts/scaffold/scaffold.sh +110 -0
- package/stack-template/scripts/smoke/e2e.sh +305 -0
- package/stack-template/scripts/snapshot-stack-template.sh +84 -0
- package/stack-template/services/auth-svc/.dockerignore +5 -0
- package/stack-template/services/auth-svc/Dockerfile +32 -0
- package/stack-template/services/auth-svc/README.md +101 -0
- package/stack-template/services/auth-svc/drizzle/0000_init.sql +25 -0
- package/stack-template/services/auth-svc/drizzle/meta/0000_snapshot.json +190 -0
- package/stack-template/services/auth-svc/drizzle/meta/_journal.json +13 -0
- package/stack-template/services/auth-svc/drizzle.config.ts +10 -0
- package/stack-template/services/auth-svc/package.json +35 -0
- package/stack-template/services/auth-svc/pnpm-lock.yaml +2425 -0
- package/stack-template/services/auth-svc/src/app.test.ts +403 -0
- package/stack-template/services/auth-svc/src/app.ts +103 -0
- package/stack-template/services/auth-svc/src/auth-crypto.test.ts +32 -0
- package/stack-template/services/auth-svc/src/auth-crypto.ts +25 -0
- package/stack-template/services/auth-svc/src/db/client.ts +24 -0
- package/stack-template/services/auth-svc/src/db/migrate.ts +72 -0
- package/stack-template/services/auth-svc/src/db/schema.ts +39 -0
- package/stack-template/services/auth-svc/src/db/seed.ts +60 -0
- package/stack-template/services/auth-svc/src/env.test.ts +55 -0
- package/stack-template/services/auth-svc/src/env.ts +57 -0
- package/stack-template/services/auth-svc/src/logger.ts +31 -0
- package/stack-template/services/auth-svc/src/plugins/auth.ts +70 -0
- package/stack-template/services/auth-svc/src/repo.drizzle.integration.test.ts +182 -0
- package/stack-template/services/auth-svc/src/repo.drizzle.ts +144 -0
- package/stack-template/services/auth-svc/src/repo.test-support.ts +168 -0
- package/stack-template/services/auth-svc/src/repo.ts +60 -0
- package/stack-template/services/auth-svc/src/routes/auth.ts +193 -0
- package/stack-template/services/auth-svc/src/routes/health.ts +40 -0
- package/stack-template/services/auth-svc/src/server.ts +54 -0
- package/stack-template/services/auth-svc/tsconfig.json +20 -0
- package/stack-template/services/go-svc/.dockerignore +5 -0
- package/stack-template/services/go-svc/Dockerfile +19 -0
- package/stack-template/services/go-svc/README.md +93 -0
- package/stack-template/services/go-svc/cmd/server/main.go +105 -0
- package/stack-template/services/go-svc/go.mod +12 -0
- package/stack-template/services/go-svc/internal/api/auth.go +83 -0
- package/stack-template/services/go-svc/internal/api/auth_test.go +92 -0
- package/stack-template/services/go-svc/internal/api/envelope.go +61 -0
- package/stack-template/services/go-svc/internal/api/envelope_test.go +51 -0
- package/stack-template/services/go-svc/internal/api/fakes_test.go +105 -0
- package/stack-template/services/go-svc/internal/api/feed.go +98 -0
- package/stack-template/services/go-svc/internal/api/feed_test.go +118 -0
- package/stack-template/services/go-svc/internal/api/health.go +34 -0
- package/stack-template/services/go-svc/internal/api/health_test.go +46 -0
- package/stack-template/services/go-svc/internal/api/json.go +13 -0
- package/stack-template/services/go-svc/internal/api/middleware.go +82 -0
- package/stack-template/services/go-svc/internal/api/middleware_test.go +48 -0
- package/stack-template/services/go-svc/internal/api/openapi/activity.yaml +196 -0
- package/stack-template/services/go-svc/internal/api/openapi.go +29 -0
- package/stack-template/services/go-svc/internal/api/openapi_test.go +38 -0
- package/stack-template/services/go-svc/internal/api/router.go +86 -0
- package/stack-template/services/go-svc/internal/api/stats.go +63 -0
- package/stack-template/services/go-svc/internal/api/stats_test.go +83 -0
- package/stack-template/services/go-svc/internal/api/types.go +32 -0
- package/stack-template/services/go-svc/internal/apperr/apperr.go +9 -0
- package/stack-template/services/go-svc/internal/config/config.go +115 -0
- package/stack-template/services/go-svc/internal/config/config_test.go +92 -0
- package/stack-template/services/go-svc/internal/consumer/envelope.go +78 -0
- package/stack-template/services/go-svc/internal/consumer/envelope_test.go +154 -0
- package/stack-template/services/go-svc/internal/consumer/handler.go +91 -0
- package/stack-template/services/go-svc/internal/consumer/handler_test.go +136 -0
- package/stack-template/services/go-svc/internal/consumer/producer.go +117 -0
- package/stack-template/services/go-svc/internal/consumer/runner.go +194 -0
- package/stack-template/services/go-svc/internal/consumer/runner_test.go +351 -0
- package/stack-template/services/go-svc/internal/logging/logging.go +49 -0
- package/stack-template/services/go-svc/internal/model/model.go +37 -0
- package/stack-template/services/go-svc/internal/resolve/resolver.go +134 -0
- package/stack-template/services/go-svc/internal/resolve/resolver_test.go +82 -0
- package/stack-template/services/go-svc/internal/resolve/token.go +130 -0
- package/stack-template/services/go-svc/internal/resolve/token_test.go +151 -0
- package/stack-template/services/go-svc/internal/store/events.go +71 -0
- package/stack-template/services/go-svc/internal/store/migrate.go +90 -0
- package/stack-template/services/go-svc/internal/store/migrate_test.go +34 -0
- package/stack-template/services/go-svc/internal/store/migrations/0001_create_events.sql +20 -0
- package/stack-template/services/go-svc/internal/store/migrations/0002_widen_action_cascade.sql +14 -0
- package/stack-template/services/go-svc/internal/store/store.go +65 -0
- package/stack-template/services/go-svc/internal/store/tasks.go +109 -0
- package/stack-template/services/go-svc/internal/swagger/assets/LICENSE +202 -0
- package/stack-template/services/go-svc/internal/swagger/assets/NOTICE +2 -0
- package/stack-template/services/go-svc/internal/swagger/assets/favicon-16x16.png +0 -0
- package/stack-template/services/go-svc/internal/swagger/assets/favicon-32x32.png +0 -0
- package/stack-template/services/go-svc/internal/swagger/assets/swagger-ui-bundle.js +2 -0
- package/stack-template/services/go-svc/internal/swagger/assets/swagger-ui.css +3 -0
- package/stack-template/services/go-svc/internal/swagger/index.html +28 -0
- package/stack-template/services/go-svc/internal/swagger/swagger.go +38 -0
- package/stack-template/services/go-svc/test/integration/integration_test.go +523 -0
- package/stack-template/services/node-svc/.dockerignore +5 -0
- package/stack-template/services/node-svc/Dockerfile +27 -0
- package/stack-template/services/node-svc/README.md +155 -0
- package/stack-template/services/node-svc/drizzle/0000_init.sql +17 -0
- package/stack-template/services/node-svc/drizzle/0001_status-assignment-failed.sql +2 -0
- package/stack-template/services/node-svc/drizzle/0002_outbox-table.sql +7 -0
- package/stack-template/services/node-svc/drizzle/meta/0000_snapshot.json +136 -0
- package/stack-template/services/node-svc/drizzle/meta/0001_snapshot.json +136 -0
- package/stack-template/services/node-svc/drizzle/meta/0002_snapshot.json +180 -0
- package/stack-template/services/node-svc/drizzle/meta/_journal.json +27 -0
- package/stack-template/services/node-svc/drizzle.config.ts +10 -0
- package/stack-template/services/node-svc/package.json +39 -0
- package/stack-template/services/node-svc/pnpm-lock.yaml +2706 -0
- package/stack-template/services/node-svc/src/app.test.ts +611 -0
- package/stack-template/services/node-svc/src/app.ts +126 -0
- package/stack-template/services/node-svc/src/clients/spring.ts +53 -0
- package/stack-template/services/node-svc/src/compensation-consumer.test.ts +157 -0
- package/stack-template/services/node-svc/src/compensation-consumer.ts +170 -0
- package/stack-template/services/node-svc/src/db/client.ts +23 -0
- package/stack-template/services/node-svc/src/db/migrate.ts +63 -0
- package/stack-template/services/node-svc/src/db/schema-diff.test.ts +252 -0
- package/stack-template/services/node-svc/src/db/schema.ts +64 -0
- package/stack-template/services/node-svc/src/env.ts +52 -0
- package/stack-template/services/node-svc/src/logger.ts +18 -0
- package/stack-template/services/node-svc/src/outbox-relay.test.ts +141 -0
- package/stack-template/services/node-svc/src/outbox-relay.ts +182 -0
- package/stack-template/services/node-svc/src/plugins/auth.ts +76 -0
- package/stack-template/services/node-svc/src/repo.drizzle.test.ts +182 -0
- package/stack-template/services/node-svc/src/repo.drizzle.ts +158 -0
- package/stack-template/services/node-svc/src/repo.ts +73 -0
- package/stack-template/services/node-svc/src/routes/health.ts +42 -0
- package/stack-template/services/node-svc/src/routes/tasks.ts +287 -0
- package/stack-template/services/node-svc/src/server.ts +91 -0
- package/stack-template/services/node-svc/src/types/api.d.ts +391 -0
- package/stack-template/services/node-svc/src/types/log.ts +3 -0
- package/stack-template/services/node-svc/tsconfig.json +20 -0
- package/stack-template/services/spring-svc/.dockerignore +5 -0
- package/stack-template/services/spring-svc/.mvn/wrapper/maven-wrapper.properties +20 -0
- package/stack-template/services/spring-svc/Dockerfile +22 -0
- package/stack-template/services/spring-svc/README.md +121 -0
- package/stack-template/services/spring-svc/mvnw +332 -0
- package/stack-template/services/spring-svc/mvnw.cmd +206 -0
- package/stack-template/services/spring-svc/pom.xml +144 -0
- package/stack-template/services/spring-svc/src/main/java/com/example/springsvc/SpringSvcApplication.java +12 -0
- package/stack-template/services/spring-svc/src/main/java/com/example/springsvc/domain/Team.java +64 -0
- package/stack-template/services/spring-svc/src/main/java/com/example/springsvc/domain/TeamRepository.java +34 -0
- package/stack-template/services/spring-svc/src/main/java/com/example/springsvc/domain/User.java +72 -0
- package/stack-template/services/spring-svc/src/main/java/com/example/springsvc/domain/UserRepository.java +10 -0
- package/stack-template/services/spring-svc/src/main/java/com/example/springsvc/logging/LowercaseLevelJsonProvider.java +24 -0
- package/stack-template/services/spring-svc/src/main/java/com/example/springsvc/security/JwtAuthFilter.java +89 -0
- package/stack-template/services/spring-svc/src/main/java/com/example/springsvc/security/JwtVerifier.java +48 -0
- package/stack-template/services/spring-svc/src/main/java/com/example/springsvc/service/TeamService.java +84 -0
- package/stack-template/services/spring-svc/src/main/java/com/example/springsvc/web/ApiError.java +15 -0
- package/stack-template/services/spring-svc/src/main/java/com/example/springsvc/web/ApiException.java +37 -0
- package/stack-template/services/spring-svc/src/main/java/com/example/springsvc/web/DevCorsConfig.java +41 -0
- package/stack-template/services/spring-svc/src/main/java/com/example/springsvc/web/ErrorEnvelope.java +27 -0
- package/stack-template/services/spring-svc/src/main/java/com/example/springsvc/web/GlobalExceptionHandler.java +90 -0
- package/stack-template/services/spring-svc/src/main/java/com/example/springsvc/web/HealthController.java +46 -0
- package/stack-template/services/spring-svc/src/main/java/com/example/springsvc/web/ReadinessService.java +40 -0
- package/stack-template/services/spring-svc/src/main/java/com/example/springsvc/web/TeamController.java +79 -0
- package/stack-template/services/spring-svc/src/main/java/com/example/springsvc/web/UserController.java +187 -0
- package/stack-template/services/spring-svc/src/main/java/db/migration/V2__SeedUsers.java +66 -0
- package/stack-template/services/spring-svc/src/main/resources/application.yml +42 -0
- package/stack-template/services/spring-svc/src/main/resources/db/migration/V1__init.sql +24 -0
- package/stack-template/services/spring-svc/src/main/resources/logback-spring.xml +34 -0
- package/stack-template/services/spring-svc/src/main/resources/openapi/users.yaml +345 -0
- package/stack-template/services/spring-svc/src/test/java/com/example/springsvc/logging/LogShapeTest.java +39 -0
- package/stack-template/services/spring-svc/src/test/java/com/example/springsvc/security/JwtAuthFilterTest.java +106 -0
- package/stack-template/services/spring-svc/src/test/java/com/example/springsvc/seed/SeedMatchIntegrationTest.java +68 -0
- package/stack-template/services/spring-svc/src/test/java/com/example/springsvc/service/TeamServiceRollbackTest.java +122 -0
- package/stack-template/services/spring-svc/src/test/java/com/example/springsvc/web/DevCorsTest.java +45 -0
- package/stack-template/services/spring-svc/src/test/java/com/example/springsvc/web/HealthCheckTest.java +56 -0
- package/stack-template/services/spring-svc/src/test/java/com/example/springsvc/web/TeamApiTest.java +139 -0
- package/stack-template/services/spring-svc/src/test/java/com/example/springsvc/web/TestPingController.java +21 -0
- package/stack-template/services/spring-svc/src/test/java/com/example/springsvc/web/UserApiTest.java +182 -0
- package/stack-template/stack-manifest.json +285 -0
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
# Improvements Log (Principle 6 — flag, KHÔNG tự sửa skill)
|
|
2
|
+
|
|
3
|
+
| Date | Task | What | Where | Suggested change |
|
|
4
|
+
|------|------|------|-------|------------------|
|
|
5
|
+
| 2026-10-12 | FI-71 (SF-3) | `story-plan-validate` W1 báo "spec không có tiêu chí nghiệm thu" dù task spec có dòng `Exit: …` — keyword grep không khớp format "Exit:" | ~/.claude/bin/story-plan-validate | Thêm pattern `Exit:`/`tiêu chí` vào detector W1 |
|
|
6
|
+
| 2026-10-12 | FI-71 (SF-3) | orca CLI rất chậm (~10-15s/call) — batch task-create 9 task vượt timeout 120s phải chạy background; task-update tương tự | orca orchestration | Không phải skill bug — ghi nhận để batch lệnh orca vào 1 lệnh background từ đầu |
|
|
7
|
+
| 2026-10-12 | FI-71 (SF-3) | Gotcha TDD-in-CI: dev machine không JDK/Docker → `tdd: RED→GREEN` bất khả thi; convention B1+ nên có dạng `tdd: skipped-tdd: CI-only <reason>` chuẩn hoá | post-task-ritual / kit evidence convention | Ghi shape evidence cho CI-only runs |
|
|
8
|
+
| 2026-10-12 | FI-71 (SF-3) | openapi-generator `interfaceOnly` KHÔNG gắn class-level base path — implementor phải tự thêm `@RequestMapping("${openapi.<svc>API.base-path:/api/<svc>}")` (root cause 1 vòng CI) | SF-2 node-svc (nếu dùng pattern tương tự), kit patterns | Ghi pattern vào conventions hoặc plan template cho service codegen sau |
|
|
9
|
+
|
|
10
|
+
## 2026-10-12 — SF-2 node-svc (FI-70)
|
|
11
|
+
- [p6-flag] `.github/workflow-templates/services-ci.yml.example` (SF-1 sở hữu): pnpm/action-setup@v4 fail ERR_PNPM_BAD_PM_VERSION khi workflow khai `version:` trùng với `packageManager` trong package.json — nên comment hướng dẫn bỏ `version` khi repo đã pin packageManager. Gặp ở run 38227939477.
|
|
12
|
+
- [p6-flag] conventions/01-dockerfile-pattern.md: pattern `COPY pnpm-lock.yaml` bất khả thi cho workspace member (build context = thư mục con, root lockfile ngoài context) — cần thêm variant "local standalone lockfile" (auth-mock precedent). Đã fix trong services/node-svc (spec D2), conventions cần sync ở SF-7.
|
|
13
|
+
- [p6-flag] drizzle-orm migrator (node-postgres, 0.44) luôn phát `CREATE SCHEMA IF NOT EXISTS "<migrationsSchema>"` — cần CREATE trên DATABASE, không chỉ schema → với per-service DB role (grant schema-only) boot crash. Pattern fix: custom SQL runner skip CREATE SCHEMA khi to_regnamespace tồn tại (services/node-svc/src/db/migrate.ts). Nên thành ADR/knowledge cho SF-3 (Flyway không vấn đề này nhưng Spring Boot role-only grant tương tự).
|
|
14
|
+
- [p6-flag] CI log-dump step gọi lại `docker compose` phải truyền cùng `--env-file` nếu không interpolation fail che mất log thật (run 38228924847). services-ci.yml.example nên note.
|
|
15
|
+
- [p6-flag] Fastify v5: pino ≥9.14 `Logger` type không gán được vào `loggerInstance` (thiếu msgPrefix) — cast qua FastifyBaseLogger; HttpError phải expose field `statusCode` (không phải `status`) để error handler đọc. P2 chờ: additionalProperties:false chặt hơn contract OpenAPI mặc định — cần quyết chung cho 3 service (FE decodeErrorEnvelope phụ thuộc code catalog).
|
|
16
|
+
|
|
17
|
+
## 2026-10-12 — SF-4 go-svc (FI-72)
|
|
18
|
+
|
|
19
|
+
1. **story-plan-validate crash cp1252** — `~/.claude/bin/story-verify` và `story-plan-validate` crash `UnicodeEncodeError` khi task spec chứa tiếng Việt trên Windows (PYTHONIOENCODING=utf-8 workaround được). Suggested: script set `sys.stdout.reconfigure(encoding='utf-8')` sẵn. (bin: story-plan-validate, story-verify)
|
|
20
|
+
2. **orca orchestration task-create rapid-fire fail** — 9 task-create gọi liên tiếp không sleep → tất cả fail `ok:false` không 'result' (mutation lock/rate?). Suggested: skill hướng dẫn pacing ≥3-4s giữa các mutation call hoặc batch API. (skill: orca-superpowers-workflow Phase 3 DAG wiring)
|
|
21
|
+
3. **story-verify B4 vs SF checklist "KHÔNG merge"** — B4 check "HEAD là ancestor của story dest" nhưng SF executor bị cấm merge (brief bước 3) → B4 luôn FAIL ở executor handoff; "sạch" chỉ đạt được sau khi story-hub merge. Suggested: story-verify thêm flag `--executor-view` (B4 report PENDING-MERGE thay vì FAIL khi SF chưa report merged). (bin: story-verify)
|
|
22
|
+
4. **schemathesis + healthcheck paths** — spec OpenAPI khai /healthz+/readyz dưới servers.url prefix nhưng conventions quy định naked path → schemathesis 404. Auth-mock precedent = mirror cả hai dạng; SF-4 phải tự discover điều này (tốn 1 vòng CI). Suggested: conventions/02 ghi rõ mirror rule cho MỌI service mới. (doc: platform/conventions/02-healthcheck.md — SF-1 sở hữu, flag lên coordinator)
|
|
23
|
+
5. **CREATE SCHEMA IF NOT EXISTS permission-denied** — role có CREATE trên schema nhưng không có CREATE trên database → CREATE SCHEMA IF NOT EXISTS vẫn denied dù schema tồn tại. Canonical DDL nên tách CREATE SCHEMA khỏi phần table (hoặc note cho CI apply-as-role). (doc: contracts/db/tasks-schema.sql — SF-1 sở hữu)
|
|
24
|
+
|
|
25
|
+
## 2026-10-12 — SF-5 (FI-73) run
|
|
26
|
+
- **orca CLI id-capture gotcha (lặp lại FI-459 class)**: `run-create` trả top-level `id` = request id, run thật ở `.result.run.id` (format `run_*`); `gate-create` tương tự (`.result.gate.id`). task-create chấp nhận `--run <uuid-không-tồn-tại>` âm thầm → 9 tasks orphan trong run invisible. Suggested: task-create nên validate run id tồn tại; skill nên có helper capture id qua `.result.*` path thay vì grep-first-id. (learned-date 2026-10-12)
|
|
27
|
+
- **task-update status vocabulary**: `done` không hợp lệ — phải là `completed` (pending/ready/dispatched/completed/failed/blocked). Suggested: ghi rõ trong SKILL.md Phase 4 examples. (learned-date 2026-10-12)
|
|
28
|
+
- **story-plan-validate encode lỗi trên Windows**: cần `PYTHONIOENCODING=utf-8` khi output có tiếng Việt (cp1252 UnicodeEncodeError). Suggested: set trong script itself. (learned-date 2026-10-12)
|
|
29
|
+
|
|
30
|
+
## 2026-10-12 — SF-6 FE remotes (FI-74)
|
|
31
|
+
- **fe-shared loadRemoteModule defect** (mf-bootstrap.ts): native `import()` với specifier BIẾN không được bundler rewrite; runtime API `loadRemote` cần key không có './' prefix. Bug tiềm ẩn suốt SF-1/SF-5 vì chỉ test remote-DOWN. Suggested change: SF-1 thêm unit characterization test + ghi pattern vào fe-shared README. (Đã fix + FLAG, commit c81309d.)
|
|
32
|
+
- **pnpm `catalog:` literal rò vào mf-enhanced requiredVersion** — singleton remote nên khai `requiredVersion: false` tường minh. Suggested: conventions/08 thêm 1 dòng.
|
|
33
|
+
- **story-guard-secrets hook**: chặn inline `JWT_SECRET=...` kể cả khi có WAKII_GUARD_OFF=1 inline — cần export qua script file. Suggested: hook tôn trọng WAKII_GUARD_OFF inline hoặc docs ghi rõ cách override.
|
|
34
|
+
- **evidence hash gate (B1)**: test-run.txt phải ghi HEAD tại lúc ghi (hash đổi sau commit mới → B1 flip FAIL). Suggested: story-verify chấp nhận docs-only commit sau evidence hash.
|
|
35
|
+
|
|
36
|
+
## 2026-10-13 — SF-7 convergence (FI-75)
|
|
37
|
+
- **GitHub Actions YAML block-scalar gotchas (3 vòng CI đỡ được nếu biết)**: (1) `name:` chứa `": "` trong ngoặc → YAML parse error, phải quote; (2) heredoc terminator/JSON ở cột 0 bên trong `run: |` block PHÁ block scalar (scalar đòi indent > key) — dùng CLI flags hoặc `printf` thay heredoc trong workflow; (3) sửa step trong block scalar dễ xoá nhầm `mkdir` đường dẫn của step trước (regression run 38289733584 — copy-dir chết 6s).
|
|
38
|
+
- **pnpm `catalog:` + standalone copy**: `--ignore-workspace` tắt luôn catalog (workspace feature) → ERR_PNPM_CATALOG_ENTRY_NOT_FOUND dù đã copy pnpm-workspace.yaml. Fix: mini workspace (catalog block) + `pnpm install` KHÔNG ignore-workspace. Pattern: `sed -n '/^catalog:/,$p' root-workspace > tmp/pnpm-workspace.yaml` (giả định catalog là section cuối — đúng hiện tại).
|
|
39
|
+
- **Repo-con standalone test đọc repo-relative contracts** (node-svc schema-diff.test resolve 4 cấp lên): copy-dir job phải kèm đúng cấu trúc thư mục mà test resolve tới. FLAG SF-2: README node-svc mục standalone nên ghi dependency `contracts/db/tasks-schema.sql`.
|
|
40
|
+
- **[p6-flag] orca CLI PATH/class FI-459 lần 3**: script bash gọi orca phải set PATH MSYS-style + gọi `orca.cmd` absolute; `python` capture id fail âm thầm → deps rỗng → task-create im lặng rơi ra khỏi run. Suggested: helper script chuẩn hoá (bin: story-* hoặc kit).
|
|
41
|
+
- **[p6-flag] story-verify + story-plan-validate cần python3**: Windows không có python3 (chỉ python.exe 3.12) → B3 UNKNOWN nếu không shim. Suggested: script dùng `python` fallback hoặc tự shim (bin: story-verify, story-plan-validate — trùng finding SF-4 #1, chưa fix).
|
|
42
|
+
- **MINI-RITUAL tổng (T1-T10)**: patterns → improvements-log (mục này) + ADR 0003 gotcha codegen + conventions/01|02|08 sync; compose env bug → DONE report (SF-1 fix trên dest); no-new-patterns cho ADR/docs tasks.
|
|
43
|
+
|
|
44
|
+
## 2026-10-13 — SF-1 FI-77 (kafka foundation)
|
|
45
|
+
- **Bash chết giữa phiên (msys add_item errno 1, 9 lần liên tiếp)**: work-around hiệu quả — dồn toàn bộ file-work (Write/Edit) lên trước, đặt cron session-only retry 4 phút, tự tiếp tục checklist khi bash sống lại. 0 work mất. Suggested change: orca-superpowers-workflow thêm 1 mục "environment blocker handling" vào rollback-ritual.md (bash-down playbook: file-first + cron retry + báo user với hướng unblock cụ thể).
|
|
46
|
+
- **Reviewer P1 trên commit pre-existing của session khác trong range diff**: c708e20 (.claude/settings.json) nằm trong range `base..HEAD` dù SF-1 không đụng. Resolved bằng ABSORB + commit-chronology evidence (timestamp + parent) thay vì revert. Suggested change: code-reviewer agent brief nên ghi rõ "commits pre-existing trên branch trước session start" để reviewer không flag P1 nhầm scope worker; hoặc coordinator brief liệt kê range commit CHÍNH XÁC (lần này briefing thiếu c708e20 → reviewer phải tự phát hiện).
|
|
47
|
+
MINI-RITUAL SF-1-FI77: 2 patterns → logged ở trên (chờ user review; không tự sửa skill)
|
|
48
|
+
|
|
49
|
+
## 2026-10-13 — SF-2 FI-79 (outbox + relay + compensation)
|
|
50
|
+
- **kafkajs subscribe() crash trước topic auto-create (SF-3 PHẢI áp)**: consumer `subscribe()` trước khi topic được broker auto-create xong → kafkajs 2.2.4 ném `UNKNOWN_TOPIC_OR_PARTITION` (retriable) RA NGOÀI subscribe() thay vì tự retry → unhandled rejection **crash cả process** (CI 38365465140: node-svc chết, readyz không bao giờ 200). Fix: bọc subscribe+run trong vòng retry backoff riêng (như connect) + `.catch` ở call site `void start()` (commit 6bcd3cb). go-svc consumer (SF-3) cùng pattern — giữa go workflow đã có kafka console producer tạo topic trước thì ít gặp, nhưng boot khi topic chưa có vẫn dính. (learned-date 2026-10-13)
|
|
51
|
+
- **Reviewer dispatch read-based khi bash down**: bash msys chết ~50' → dispatch code-reviewer với brief đọc file trực tiếp (Read/Glob/Grep, không git diff) song song với chờ bash — review không trễ, khi bash sống chỉ còn commit. Mở rộng bash-down playbook SF-1. (learned-date 2026-10-13)
|
|
52
|
+
- **schema-diff normalizer phải đi trước migration type mới**: drizzle-kit sinh `ALTER TABLE DROP/ADD CONSTRAINT` khi sửa CHECK — normalizer test throw ở DDL chưa handle → mở rộng normalizer CÙNG commit cascade (không để đỏ giữa chừng). Pattern cho mọi service có diff-test cấu trúc. (learned-date 2026-10-13)
|
|
53
|
+
MINI-RITUAL SF-2-FI79: 3 patterns → logged ở trên (kafkajs subscribe crash = flag cho SF-3 qua DONE message; không tự sửa skill)
|
|
54
|
+
|
|
55
|
+
## 2026-10-13 — SF-5 Convergence (FI-81, story FI-76)
|
|
56
|
+
- **docker exec fail âm thầm trong script CI**: `docker compose exec` trong e2e.sh fail 3 run liền vì path bug `../platform` (script ở scripts/smoke/ cần `../../platform`) + stderr bị `2>/dev/null` nuốt. Bài học: (1) resolve path relative-to-script phải assert tồn tại (`[ -f "$COMPOSE_ENV" ]`) ngay đầu script; (2) KHÔNG nuốt stderr ở bước chẩn đoán — surface stderr trong failure message tiết kiệm 2-3 CI run (25 phút/run).
|
|
57
|
+
- **Kafka group reader kẹt empty-assignment khi topic tạo sau subscribe**: tái xác nhận ở convergence (SF-3 đã hit ở go workflow — 8de8921). Composite boot order (pg+kafka → topics → full stack) nên là pattern chuẩn cho mọi compose-boot-smoke có Kafka.
|
|
58
|
+
- **B1 evidence hash loop**: story-verify B1 chỉ grep HEAD hoặc HEAD~1 trong test-run.txt. Nếu sau evidence commit còn commit khác (tick plan...), HEAD~1 lệch → FAIL. Cách đúng: commit cuối trước story-verify PHẢI là commit có hash ghi sẵn trong evidence; khi có >1 commit sau evidence, thêm hash commit mới nhất vào evidence rồi commit evidence-sync LẦN CUỐI.
|
|
59
|
+
- **worker_done cần dispatchId**: SF dispatch từ story bracket (không qua worker-start dispatch) gửi DONE bằng `--type status` --run <story-run-id> (precedent SF-1/SF-3); worker_done/type done sẽ reject thiếu dispatchId/taskId.
|
|
60
|
+
|
|
61
|
+
## 2026-10-14 — SF-1 Design-system nền móng (VU-54, story VU-53)
|
|
62
|
+
- **RUNTIME-006 cũng ăn vào REMOTE standalone entry (không chỉ host)**: mfToolkit $comment chỉ ghi lesson cho host (`import('./bootstrap')`); remote entry có JSX tĩnh (react/jsx-runtime shared) → loadShareSync trước share init → root trống ĐEN — đã crash trắng từ trước trên docker cũ ("trơ trụi" thực ra là crash, không phải chỉ thiếu style). mfToolkit READ-LOCKED nên lesson nằm ở: `remotes/*/src/index.tsx` comment + `evidence/sf-1-ui-redesign-dsys/spike-r2-result.md` addendum. Kit có thể thêm "remote entry async boundary" vào spike checklist.
|
|
63
|
+
- **orca `click --element <ref>` không trigger React form submit** (login form gọi được requestSubmit chứ click ref không ăn — nghi stale ref sau re-render). Fallback đáng tin: fill bằng `focus` + `clear` + `type` (trusted keyboard) rồi `requestSubmit()` qua eval, hoặc dispatch native `.click()` trong eval. Ghi cho mọi browser-verify sau này.
|
|
64
|
+
- **Consumer-provides-react khi lockfile freeze**: fe-shared JSX mà không được thêm dep → 3 lớp đối xứng bắt buộc: rspack `resolve.modules`, vitest `resolve.alias` + `esbuild.jsx:'automatic'`, tsconfig `paths` — thiếu lớp nào báo lỗi khác nhau (resolve fail / "React is not defined" / TS2307). Đã ghi contract vào fe-shared README.
|
|
65
|
+
|
|
66
|
+
## 2026-10-14 — SF-2 Shell restyle (VU-55, story VU-53)
|
|
67
|
+
- **Docker remoteEntry gateway-publicPath giết dev-loop direct-port**: remoteEntry build prod (:4001/:4002) mang publicPath `/remotes/<name>/` (gateway-shaped) — consume từ dev shell direct-port → chunk URL resolve về shell origin → 404 HTML → ChunkLoadError **giết cả bootstrap** (root trống, không console error rõ). Dev-loop spec: native dev remotes với `REMOTE_PUBLIC_PATH` tuyệt đối. SF-5 walkthrough compose :8080 không dính (gateway route khớp publicPath). (learned-date 2026-10-14)
|
|
68
|
+
- **MF manifest eager-preload poison cross-remote**: remoteEntry của 1 remote fail lúc load trang → `loadRemote()` remote KHÁC cũng fail cả session (manifest batch); "Thử lại" không hồi phục trong session — phải reload sau khi remote sống. Walkthrough 4.4 "remote còn lại vẫn chạy" cần đọc là "nav sống + slot còn lại load được khi reload". Candidate fix (ngoài scope SF-2): loadRemote fallback tự re-fetch remoteEntry, hoặc walkthrough ghi bước reload. (learned-date 2026-10-14)
|
|
69
|
+
- **DTS dev-worker đam port 4001 tùy hứng**: fork-dev-worker type-server đôi khi uncaughtException khi 4001 busy (docker) → giết dev server (1/4 lần); retry launch pass. Candidate: kit preflight check thêm "dev FE cluster cần 4001 free HOẶC retry". (learned-date 2026-10-14)
|
|
70
|
+
- **Cụm port song song giữa SF**: SF-2 dùng 3200/4201/4202 để không đụng 3100/4101/4102 (SF-1 precedent) vì SF-3/4 chạy song song — conventions nên quy định "mỗi SF dev-cluster = base-port + offset riêng" (env đã hỗ trợ hết: SHELL_PORT/REMOTE_*_PORT/REMOTE_PUBLIC_PATH/API_BASE_URL=''). (learned-date 2026-10-14)
|
|
71
|
+
MINI-RITUAL SF-2-VU55: 4 patterns → logged ở trên (2 flag SF-5/coordinator qua DONE message; không tự sửa skill)
|
|
72
|
+
|
|
73
|
+
## 2026-10-14 — SF-3 Tasks redesign (VU-56, story VU-53)
|
|
74
|
+
- **REMOTE_PUBLIC_PATH bắt buộc khi đổi port dev remote**: dev remote chạy port khác default (vd REMOTE_TASKS_PORT=4101) mà không set `REMOTE_PUBLIC_PATH=http://localhost:4101/` → remoteEntry advertised publicPath :4001 (default hardcode) → shell load expose xong nhưng chunk vendor fetch về compose container cũ → 404 im lặng → root TRỐNG, 0 console error. Diagnose tốn 1 vòng network-log. Config comment đã ghi nhưng nên nhắc trong context pack SF-4 (cùng sẽ chạy port lệch).
|
|
75
|
+
- **Remote phải import tokens.css trong PAGE ENTRY (không chỉ standalone)**: SF-1 chỉ wire standalone.tsx import tokens+base; remote load TRONG shell (pre-SF-2, shell chưa import global) → mọi `var(--*)` trong scoped css unresolved (gap: normal, nền trắng). Fix SF-3: `import '@boilerplate/fe-shared/styles/tokens.css'` trong TasksPage.tsx (idempotent theo epic quyết định #5). **SF-4 sẽ hit y hệt** — nên thêm 1 dòng vào context pack sf-4 trước khi nó start, hoặc check khi review SF-4.
|
|
76
|
+
- **Shell css cũ (pre-SF-2) có global `form{flex-direction:column;max-width:20rem}` đè implicit default của remote form**: class-scoped css không set `flex-direction`/`max-width` → rule global element cũ lấp vào → layout vỡ khó đoán. Pattern: remote scoped css nên explicit những property mà shell cũ từng set global (form/label/input). Tự hết khi SF-2 merge (shell css rewrite scoped) nhưng explicit không hại gì sau merge.
|
|
77
|
+
- **story-verify B2 match file ĐẦU TIÊN chứa token `sf-<n>` alphabetically trong plans/ — có thể trúng plan CỦA STORY CŨ**: worktree `sf-3-ui-redesign-tasks` match `2026-10-12-sf-3-spring-svc-impact.md` (FI-62, hoàn tất lâu rồi) TRƯỚC plan của mình. May là impact file 0 unchecked `- [ ]` → B2 PASS; nếu file trúng có unchecked → false-FAIL chặn oan mọi SF sau. Đề xuất kit: B2 nên match plan theo worktree basename đầy đủ (hoặc slug story hiện tại), không phải token chung.
|
|
78
|
+
- **use-swr-style race: mọi fetch cần stale-guard khi có 2 path ghi cùng state**: loadMore append + load replace cùng ghi `tasks/total` — response stale về sau phải bị bỏ qua sequence ref; và KHI thêm guard skip-toàn-phạm, check cả state-recovery (loadingMore bị skip reset → nút kẹt) — reviewer bắt được regression này ở round 2. Pattern: 1 flag async chỉ được reset ở ĐÚNG 1 owner; guard phải không phá ownership đó.
|
|
79
|
+
## 2026-10-14 — SF-4 Activity redesign (VU-57, story VU-53)
|
|
80
|
+
- **Verify 1 remote của mình qua shell dev → phải chạy DEV server cho TẤT CẢ remotes shell tham chiếu**: shell dev nạp eager remoteEntry + chunk của cả 2 remotes; remote compose (publicPath relative `/remotes/<name>/`) bị load cross-origin từ dev origin → chunk 404 → `ChunkLoadError` uncaught → bootstrap crash, root TRỐNG (nhầm là bug của remote mình). Pattern đúng = spike SF-1: mọi remote đều dev server riêng (absolute publicPath). Port :3100/:4101 dễ bị SF song song chiếm — chọn port lệch (3103/4103).
|
|
81
|
+
- **Shell dev pre-SF-2 cần `API_BASE_URL=''` (same-origin qua dev proxy)**: mặc định dev = auth-mock :8090 trực tiếp → CORS chặn origin lạ (:3103) → login fail "Không kết nối được". Same-origin qua proxy chain của shell thì sạch.
|
|
82
|
+
- **Orca browser screenshot có thể lag frame so với CSS async inject**: eval computed-style nói tokens đã load nhưng screenshot vẫn hiện frame cũ → "màu sai" ảo. Verify pixel-truth bằng decode PNG (đếm pixel trắng thuần ở vùng text) trước khi kết luận; không kết luận bug từ 1 nguồn (eval XOR screenshot).
|
|
83
|
+
- **Vitest pin TZ qua `test.env: { TZ: ... }`** — bắt buộc với mọi test phụ thuộc ranh giới ngày local (timeline "Hôm nay/Hôm qua"); môi trường dev +07 che bug đến khi contributor/CI chạy TZ âm (review round 1 bắt được — meta-test RED trên TZ=America/New_York).
|
|
84
|
+
|
|
85
|
+
## 2026-10-14 — SF-5 Convergence (VU-58, story VU-53)
|
|
86
|
+
- **Stale compose stack = bẫy 2 lớp trước walkthrough**: (1) container image build TRƯỚC khi SF merge — UI cũ chạy ngon, tưởng là UI mới; (2) browser tab giữ bundle/HTML stale sau khi image rebuild — goto cùng URL không refetch (CSS hash cũ 404 → unstyled, text mới + style cũ MUA được nhìn như bug). Quy trình bắt buộc: `docker ps` xem tuổi container vs merge-time → rebuild (`docker compose up -d --build`) → navigate với cache-bust query → ĐO `getComputedStyle(document.body).backgroundColor` khớp token (`#010102`) trước khi tin mắt. (learned-date 2026-10-14)
|
|
87
|
+
- **Mất platform/.env nhưng stack còn chạy → reconstruct từ container**: compose `name:` cố định (vd `boilerplate`) nên `up` từ worktree KHÁC vẫn vào cùng project; env thật đọc bằng `docker inspect <ctr> --format '{{range .Config.Env}}…'` (distroless go-svc không exec được). Viết lại .env (gitignored) là đủ để rebuild app containers mà không mất pgdata/topics (kafka không có volume — KHÔNG down). (learned-date 2026-10-14)
|
|
88
|
+
- **Orca browser input limits (mở rộng finding SF-1)**: ngoài stale-ref click, (a) trusted CDP mouse/keypress KHÔNG route vào page nền (Enter trên button focused cũng không fire); (b) element-click theo snapshot-coords miss khi element dưới fold/sau scroll/reset. Verification pattern thay thế (trung thực, khai báo trong evidence): JS activation (`.click()`) + `elementFromPoint` (chứng minh không overlay) + requestlog (`performance.getEntriesByType('resource')`) + suite coverage. Phân biệt app-bug vs tool-artifact bằng CONTROL test trên element cùng loại. (learned-date 2026-10-14)
|
|
89
|
+
- **Standalone prod-build treo trắng = share-scope factory chunk ma (BUG-1)**: rspack MF build sinh factory react-dom `Promise.all([e("237"),e("221")])` mà "237" không nằm trong chunk map (local build thiếu "46" — id KHÔNG ổn định nhưng class lỗi ổn định). Chẩn đoán 5 phút: grep `__webpack_require__.e("N")` trong `dist/main.*.js` vs ids trong chunk-map `{N:"hash16"}` → thiếu = treo vô hạn KHÔNG fetch. In-shell không apparent vì host provide react (factory không chạy). Dev server OK (chunking khác) → acceptance chỉ nhìn compose sẽ miss nếu không test standalone prod. Kit: thêm "grep phantom chunk" vào spike checklist MF. (learned-date 2026-10-14)
|
|
90
|
+
- **Phân loại bằng chứng "retry không ăn"**: skeleton flash 300ms (handler CHẠY, lazy recreate) + 0 request mới (import fail tức thì) + raw `import(remoteEntry)` cùng page FETCH được → sticky layer nằm trong MF runtime (khớp finding SF-2 "manifest eager-preload poison"). Không cần đọc code shell để kết luận — 3 đo này đủ định vị owner. (learned-date 2026-10-14)
|
|
91
|
+
- **Story-diff security scan cần timeline check**: `merge-base(origin/main)..HEAD` chứa commit infra của coordinator (c3b1499 — nginx lazy-map + BSD-sed) 19' SAU story CREATE → report "untouched violation" nhầm nếu không `git log -- <file>` so thời điểm. CSP/security headers mới là đối tượng scan, không phải mọi delta vs main. (learned-date 2026-10-14)
|
|
92
|
+
- **scaffold.sh macOS portability (pre-existing SF-7)**: `realpath -m` (line 40, BSD không có) + `sed -i` GNU syntax (rename step chết sớm, rename thành no-op). Verify-only workaround: PATH-shim realpath; copy+prune+design-system+install+build OK, rename skip. CI Linux không ảnh hưởng. (learned-date 2026-10-14)
|
|
93
|
+
MINI-RITUAL SF-5-VU58: 7 patterns → logged ở trên (BUG-1/BUG-2 report coordinator qua worktree comment; không tự sửa skill)
|
|
94
|
+
|
|
95
|
+
## 2026-10-14 — SF-5b fix round (VU-58 round 2, story VU-53)
|
|
96
|
+
- **BUG-1 là 2 bug xếp lớp, không phải 1**: phantom-chunk (build output stale ids) + alias-nginx (index.html/runtime chunk fetch dùng publicPath gateway-shaped trong khi standalone nginx chỉ serve root). Fix lớp 1 xong trang VẪN trắng nếu chỉ nhìn "có fetch" — phải nhìn MIME/text/html-as-js. Fix đứng ở nginx (`location /remotes/<name>/` alias về root) thay vì đổi publicPath vì runtime `.p` compile-time bắt buộc gateway-shaped cho in-shell — một dist phục vụ 2 đường. (learned-date 2026-10-14)
|
|
97
|
+
- **Workaround toolchain cho phantom chunk mà không bump pin: 2-entry split** — entry `index` giữ async boundary làm anchor MF container (RUNTIME-006), entry `standalone` STATIC bundle cả graph vào 1 chunk self-contained (shared eager:true inline sync) → async chunk cho shared không còn tồn tại → phantom không thể sinh. Static grep sau fix: standalone.*.js refs=[] ở cả 2 remote. (learned-date 2026-10-14)
|
|
98
|
+
- **Sticky rejection BUG-2 = memoized-promise không clear-on-reject**: runtime-core 0.21.6 `getRemoteEntry()` cache load-promise trong `globalLoading` (window.__GLOBAL_LOADING_REMOTE_ENTRY__, key name+entry) — rejected promise ở lại mãi → mọi loadRemote sau nhận lại rejection cũ, 0 fetch. Đường sanctioned reset: `registerRemotes([{name, entry, type:'global', shareScope:'default'}], {force:true})` → removeRemote xoá globalLoading + manifestCache + moduleCache + container global (crux: moduleCache.set xảy ra TRƯỚC fetch nên lần load fail vẫn có cache → cleanup chạy được — reviewer verify với source). Def retry PHẢI khớp registration gốc: type 'global' (def 'module' → fetch 200 xong chết RUNTIME_002 — bắt bằng cách attach .catch lên chính rejected promise trong globalLoading qua eval). (learned-date 2026-10-14)
|
|
99
|
+
- **Phân loại residual stale refs: so sánh với build cũ đang chạy OK** — docker cp remoteEntry từ container cũ cho thấy old expose map cũng await phantom "237" mà in-shell vẫn chạy → in-shell không đi qua container.get của remote (mf runtime host-side drive) → residual cùng class = vô hại, không phải regression. Đừng "sạch hoá" residual vô hại bằng thay đổi risk-ô. (learned-date 2026-10-14)
|
|
100
|
+
MINI-RITUAL SF-5B-VU58: 4 patterns → logged ở trên (kit MF spike checklist: thêm "retry def phải khớp registration gốc" + "alias 2 lớp"; không tự sửa skill — Principle 6)
|
|
101
|
+
|
|
102
|
+
## 2026-10-17 — cross-session day (renames app/@wakii + skills + CI copy-dir)
|
|
103
|
+
- **Reproduce CI bug ở local phải pin ĐÚNG version tool**: copy-dir fail 22s trên CI nhưng local PASS — vì local pnpm 12.8.1 chịu mini-workspace catalog-only, còn CI pnpm 9.15.9 chết ngay `ERROR packages field missing or empty`. 3 iteration fix sai lớp (corepack pin, $REPO_ROOT) vì tín hiệu local sai. Quy tắc: trước khi tuyên bố "reproduced", chạy tool đúng version CI (`npx pnpm@<ver>`); fix thật = `packages: ['.']` + `add -Dw` — run 39014478754 PASS 37s. (learned-date 2026-10-17)
|
|
104
|
+
- **Mutation orca từ pane ngoài = consumer_fenced (by design)**: task-update/gate-resolve trên run của coordinator-pane khác bị fence. Với state stale (SF-5 'ready' dù story đã merge): chuẩn bị sẵn lệnh + result-text trỏ evidence cho pane gốc chạy; nhớ `--run run_xxx` tường minh không có là run_required. (learned-date 2026-10-17)
|
|
105
|
+
- **Shared-worktree multi-session: commit pathspec + kiểm tra trước mỗi lệnh git**: nhánh đổi dưới chân liên tục (5 nhánh/1 ngày, session khác commit/xóa/rebase song song) — `git commit -- <paths>` chặn nuốt staged của người khác (đã xảy ra 1 lần, tách lại được); bắt đầu mỗi thao tác bằng `git log --oneline -3 && git status`. (learned-date 2026-10-17)
|
|
106
|
+
|
|
107
|
+
## 2026-10-17 — SWEEP toàn bộ flags (đợt đầu tiên; tiêu chí lọc từ wakii-playbook §6: lặp ≥2 → conventions, một-lần → đóng khi đã fix)
|
|
108
|
+
|
|
109
|
+
**ĐÓNG — đã materialize ở nơi khác (verify bằng grep ngày sweep):**
|
|
110
|
+
|
|
111
|
+
| Flag gốc | Đã ở đâu |
|
|
112
|
+
|---|---|
|
|
113
|
+
| conventions/01 thiếu variant standalone lockfile | conventions/01 dòng 76 (Local standalone lockfile) |
|
|
114
|
+
| schemathesis mirror rule healthz/readyz | conventions/02 rule 6 |
|
|
115
|
+
| requiredVersion: false cho singleton remote | conventions/08 rule 4 |
|
|
116
|
+
| README node-svc thiếu dep contracts/db | node-svc README dòng 5 + 152 |
|
|
117
|
+
| fe-shared loadRemoteModule defect | fix c81309d + test mf-retry shell |
|
|
118
|
+
| kafkajs subscribe() crash trước topic | fix 6bcd3cb + pattern tạo-topic-trước (convergence + playbook NS) |
|
|
119
|
+
| consumer-provides-react 3 lớp đối xứng | fe-shared README |
|
|
120
|
+
| B1 evidence hash loop (HEAD~1) | story-verify có accommodation HEAD~1; playbook anti-patterns |
|
|
121
|
+
| catalog + standalone mini workspace | convergence.yml (nâng cấp 2026-10-17: + packages:['.'] cho pnpm 9.15.9) + playbook IN |
|
|
122
|
+
| schema-diff normalizer đi trước migration | skill sync-contracts (quy tắc đồng bộ cặp) |
|
|
123
|
+
| orca id-capture .result.* / B4 executor-view / sed BSD | playbook anti-patterns (flag kit-helper vẫn mở — xem dưới) |
|
|
124
|
+
| story-guard WAKII_GUARD_OFF | hook message giờ tự ghi hướng dẫn override |
|
|
125
|
+
| MF manifest poison / REMOTE_PUBLIC_PATH | fix sf-5b (retry bust) + comment config + playbook |
|
|
126
|
+
|
|
127
|
+
**MỞ — owner ngoài repo này (kit `~/.claude/bin` / orca CLI / skill repo), giữ nguyên:**
|
|
128
|
+
- pino/FastifyBaseLogger cast + quyết `additionalProperties` chung 3 service (P2 kiến trúc — cần coordinator)
|
|
129
|
+
- story-plan-validate + story-verify: cp1252/python3 fallback (dup 2 mục) · B4 `--executor-view`
|
|
130
|
+
- orca CLI: helper capture `.result.*` id · pacing task-create · PATH MSYS/class · python shim Windows
|
|
131
|
+
- workflow-templates: note action-setup `version:` · note `--env-file` cho log-dump · YAML block-scalar gotchas
|
|
132
|
+
- bash-down playbook → rollback-ritual.md · reviewer brief "pre-existing commits" · task-update vocabulary vào SKILL.md
|
|
133
|
+
|
|
134
|
+
**Kết luận:** không có lesson nào đủ điều kiện lên conventions mới — 9 conventions hiện tại phủ hết các pattern lặp. Nợ duy nhất mang tính quyết định: `additionalProperties` P2 (C-hàng, cần 1 quyết định coordinator ghi vào conventions/04).
|
|
135
|
+
|
|
136
|
+
## 2026-10-17 — SF-1 auth-real (VU-60)
|
|
137
|
+
- [p6-flag] Context pack gap-item viết shorthand CLI thiếu precision: sf-1.md ghi "Exclude register|refresh|logout" → session trước implement `--exclude-path "login|register|refresh|logout"` nhưng schemathesis 3.39 `--exclude-path` là EXACT match (không filter path nào → /login vẫn bị fuzz → CI đỏ oan). Đúng: `--exclude-path-regex` + phải exclude cả `/login` (shape v2 decision #8 vs auth-mock v1). Fix tại chỗ: contracts.yml comment + chạy thật chứng minh 8→3 ops. Suggested: context-pack/gap-item nhúng CLI flag + semantics đúng theo `--help` của version pin, không viết shorthand regex-ngoài-hình.
|
|
138
|
+
- [p6-flag] CI contracts job boot-smoke vẫn assert TTL=28800/iss trên auth-mock (đúng design chuyển tiếp — SF-5 swap); SF-5 phải nhớ bỏ/nới các assert này khi boot auth-svc (đã ghi trong spec CI ownership, reviewer xác nhận không phải sót).
|
|
139
|
+
|
|
140
|
+
## 2026-10-17 — SF-2 auth-real (VU-61)
|
|
141
|
+
- [pattern] Fastify route-level `preHandler` dạng SYNC arrow (không async) làm hook-runner STALL khi guard PASS (request không hoàn tất — timeout), còn path throw chạy bình thường (403 về đúng). A/B probe xác nhận: sync → treo, async → full chain 204. Fix: luôn `async` cho preHandler trong route options. Áp dụng cho mọi service Fastify trong boilerplate (node-svc hiện tại + auth-svc SF-2 mirror).
|
|
142
|
+
- [gotcha] Máy dev này: brew postgresql@16 bind 127.0.0.1/::1:5432 → docker container postgres (compose) KHÔNG với được từ host qua localhost — kết nối luôn rơi vào brew cluster. Boot service cục bộ cần DB: dùng scratch DB trên brew cluster (hoặc docker exec trong container). Drizzle nuốt pg error gốc — moi qua `err.cause` (code 28000 = auth/role).
|
|
143
|
+
- [p6-flag] Epic-level gap: RBAC 403 chưa khai trong tasks.yaml (SF-1 gap-answer 8 mục miss mục contracts tasks.yaml; plan Task 3 cũng không có step contracts). Đã route REQUIREMENT-GAP VU-59 (comment 8ac61a18) với patch 5 bước + 2 options; merge-level condition: patch phải land trước merge SF-3/trước SF-5. Suggested: context-pack template cho SF kiểu "thêm response code mới" phải có mục contracts-sync trong touch map (nguyên tắc vàng #1 — contracts trước code).
|
|
144
|
+
## 2026-10-17 — SF-4 auth-real (VU-63)
|
|
145
|
+
- [p6-flag] drizzle-kit 0.31 generate `CREATE SCHEMA "auth";` KHÔNG có IF NOT EXISTS (node-svc 0000 là bản cũ có IF NOT EXISTS) + migrations_history nằm TRONG schema auth → migrate runner PHẢI ensure schema TRƯỚC khi tạo history table (fresh DB nổ 3F000). Pattern "service mới có schema riêng" = copy auth-svc db/migrate.ts (ensureAuthSchema try/verify to_regnamespace) chứ không copy node-svc nguyên trạng. Suggested: skill sync-contracts/add-service thêm note 2 dòng.
|
|
146
|
+
- [p6-flag] Multi-SF song song: session SF-4 spawn stub (`/tmp/auth-stub-*.mjs`) chiếm :8091 → port clash khi 2 SF cùng dev boot. Lesson: trước khi boot dev, `lsof -iTCP:<port> -sTCP:LISTEN` + `ps <pid>` xác định chủ process — process session KHÁC thì đổi port mình, KHÔNG kill. Suggested: playbook multi-SF note "port etiquette".
|
|
147
|
+
- [lesson] DrizzleQueryError (drizzle-orm ≥0.44) bọc PG code vào `err.cause.code` — route check `err.code === '23505'` sẽ không bao giờ match. Normalize ở repo layer (DrizzleAuthRepo.createUser rethrow .code='23505') để giữ contract AuthRepo.
|
|
148
|
+
## 2026-10-17 — SF-4 auth-real (VU-63)
|
|
149
|
+
- [p6-flag] Evidence/docs path phải tạo bằng đường TUYỆT ĐỐI từ repo root: session chạy `mkdir -p docs/superpowers/evidence/...` khi CWD đang là `app/shell` → evidence rơi `app/shell/docs/...`, ngoài touch map (code-reviewer bắt ở P1). Suggested: story-workflow/task-executor briefing ghi sẵn lệnh evidence với `$REPO_ROOT` absolute; hoặc kit thêm pre-commit guard chặn `app/*/docs/`.
|
|
150
|
+
- [p6-flag] B3 gate cần literal `VERDICT...APPROVED` trong comment Linear — DONE-report comment chỉ viết "Round 2 **APPROVED**" (không có từ VERDICT) → B3 kẹt OUTBOX 1 vòng, phải post comment verdict riêng. Suggested: checklist DONE-comment của task-executor thêm dòng bắt buộc `VERDICT: APPROVED` (copy nguyên từ verdict file) thay vì paraphrase.
|
|
151
|
+
## 2026-10-17 — SF-5 auth-real (VU-64)
|
|
152
|
+
- [p6-flag] Plan prose assert sai contract: plan Task 5 Step 2 ghi "alice DELETE → 200" nhưng tasks.yaml + node-svc trả **204** (DELETE No Content) — e2e fail bước 12 lần chạy đầu vì assert theo prose. Fix tại chỗ: e2e assert 204 theo tasks.yaml (nguồn sự thật — nguyên tắc vàng #1). Suggested: writing-plans-linear template — assert trong plan PHẢI quote status code từ spec (kèm path §section), không viết prose "→ 200" theo cảm tính.
|
|
153
|
+
- [p6-flag] Orca browser coordinate-clicks thỉnh thoảng trượt trên element do REMOTE mount (shell element ổn, remote tasks element "Clicked" OK nhưng handler không nhận — kể cả keypress Enter). Workaround đã verify: `requestSubmit()` cho form + `HTMLElement.click()` từ eval (React synthetic không cần isTrusted). Suggested: kit story-test/browser task thêm pattern "remote element không nhận trusted click → fallback requestSubmit/element.click() + khai báo trong evidence" (lặp lại class bug FI-464 CDP-screenshot — cùng họ "Orca browser không surface trusted input xuống remote MF").
|
|
154
|
+
- [pattern] Schemathesis FULL pass nguyên vẹn khi auth-svc implement đúng spec đủ response codes (104/104) — bỏ exclude SF-1 an toàn vì auth.yaml v2 khai đủ 201/400/401/409/204/403... Pattern: "nới schemathesis scope" chỉ cần assert lần đầu local trước khi commit CI diff, không cần thêm exclude bảo thủ.
|
|
155
|
+
- [gotcha] Compose project name `boilerplate` DÙNG CHUNG giữa các worktree story (không per-worktree) — down -v ở 1 worktree giết volume stack worktree khác đang chạy. SF convergence phải down -v → warn trong briefing + kiểm `docker ps` trước.
|
|
156
|
+
- [pattern] Renumber nhiều bước script: LABEL và EXIT CODE là 2 mặt của cùng contract — renumber 1 trong 2 thôi tạo collision im lặng (SF-5: thêm 6 bước renumber say-label nhưng quên fail N → exit 7/8/9/10 mỗi code 2 bước; code-reviewer bắt P1). Meta-test nhỏ: `grep fail N | sed | sort | uniq -c` rồi đối chiếu block — mỗi exit code đúng 1 block bước. Suggested: task-executor checklist khi đổi step numbering "label ↔ exit map bảng 2 cột, sửa cả 2 cột cùng lúc".
|
|
157
|
+
|
|
158
|
+
> **Disposition SF-5 (ritual 2026-10-17)**: plan-assert quote-spec → flagged cho writing-plans-linear (chờ user duyệt); exit-code label↔exit map → PATCHED ~/.claude/agents/task-executor.md (Label↔exit map rule); remote-click fallback → PATCHED orca-superpowers-workflow SKILL.md (blockquote CDP fallback); compose-shared gotcha → user auto-memory (compose-project-shared-across-worktrees) + ghi walkthrough evidence; schemathesis-nới → không cần update (one-off assert local); heredoc-quote → no-op (generic bash, skip trung thực).
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
{
|
|
2
|
+
"wakiiMindmap": 1,
|
|
3
|
+
"meta": {
|
|
4
|
+
"story": "VU-59",
|
|
5
|
+
"generator": "story-workflow CREATE",
|
|
6
|
+
"generatedAt": "2026-10-17T17:30:00+07:00",
|
|
7
|
+
"dest": "story-vu59-auth-real",
|
|
8
|
+
"worktreeModel": "story-hub"
|
|
9
|
+
},
|
|
10
|
+
"nodes": [
|
|
11
|
+
{
|
|
12
|
+
"id": "epic",
|
|
13
|
+
"kind": "epic",
|
|
14
|
+
"title": "Auth thật thay auth-mock — register/login/refresh/RBAC",
|
|
15
|
+
"summary": "Thay auth-mock bằng auth-svc thật giữ nguyên surface :8090 /api/auth/*. Spec rev2: docs/superpowers/specs/2026-10-17-auth-real-design.md · Plan rev2: docs/superpowers/plans/2026-10-17-auth-real-plan.md · Epic đầu tiên áp dụng wakii-playbook (archetype CC). Linear: VU-59."
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"id": "sf-1",
|
|
19
|
+
"kind": "sf",
|
|
20
|
+
"title": "Contracts + hiệp ước + gap-answer",
|
|
21
|
+
"tier": 0,
|
|
22
|
+
"summary": "auth.yaml v2 (register/refresh/logout + giữ GET /users, drop openid stub, response shape {user,accessToken,refreshToken}) + token-contract v2 (iss PINNED auth-mock, access 30m/refresh 7d, CAS rotation + reuse strict all-user, bp.rt rationale) + schemathesis scope contracts.yml + gap-answer 8 mục cho shared files. Gate: spectral + schemathesis scoped.",
|
|
23
|
+
"linear": "VU-60"
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"id": "sf-2",
|
|
27
|
+
"kind": "sf",
|
|
28
|
+
"title": "auth-svc — schema + seed + 5 endpoints",
|
|
29
|
+
"tier": 1,
|
|
30
|
+
"summary": "Phase 1/2 — shippable: auth-svc (Fastify+TS+Drizzle, mirror node-svc) boot độc lập: register→login→refresh (CAS rotation + reuse strict)→logout hoạt động đầu-cuối qua integration test; seed 5 user fixture giữ UUID; workflow services-auth-svc.yml xanh.",
|
|
31
|
+
"linear": "VU-61"
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
"id": "sf-3",
|
|
35
|
+
"kind": "sf",
|
|
36
|
+
"title": "node-svc RBAC — DELETE admin-only",
|
|
37
|
+
"tier": 1,
|
|
38
|
+
"summary": "DELETE /api/tasks/:id yêu cầu roles admin: bob 403 envelope FORBIDDEN, alice 200 — unit test RED→GREEN chứng minh. Chạy tier Standard (SF nhỏ, vùng file tách bạch).",
|
|
39
|
+
"linear": "VU-62"
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
"id": "sf-4",
|
|
43
|
+
"kind": "sf",
|
|
44
|
+
"title": "FE refresh-client + LoginPage register",
|
|
45
|
+
"tier": 1,
|
|
46
|
+
"summary": "refresh-client.ts (file mới, READ-LOCKED nguyên vẹn): login/register lưu cặp token, 401 → auto-refresh single-flight → retry; LoginPage tab Register (Tailwind v4 đã trên main — theo pattern mới); logout clear sạch. Coverage gate 90/90/80/90 + a11y giữ.",
|
|
47
|
+
"linear": "VU-63"
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
"id": "sf-5",
|
|
51
|
+
"kind": "sf",
|
|
52
|
+
"title": "Convergence + decommission + CI swap + docs",
|
|
53
|
+
"tier": 2,
|
|
54
|
+
"summary": "Phase 2/2 — shippable: auth-mock out, auth-svc thay vị trí :8090 (thực thi gap-answer 8 mục); e2e mở rộng register→refresh→reuse→401→RBAC 403; CI swap 3 workflows — toàn main xanh; docs sync rộng + gotcha down-v; security pass 0 P0/P1; human walkthrough 2 tab.",
|
|
55
|
+
"linear": "VU-64"
|
|
56
|
+
}
|
|
57
|
+
],
|
|
58
|
+
"edges": [
|
|
59
|
+
{
|
|
60
|
+
"from": "epic",
|
|
61
|
+
"to": "sf-1",
|
|
62
|
+
"rel": "contains"
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
"from": "epic",
|
|
66
|
+
"to": "sf-2",
|
|
67
|
+
"rel": "contains"
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
"from": "epic",
|
|
71
|
+
"to": "sf-3",
|
|
72
|
+
"rel": "contains"
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
"from": "epic",
|
|
76
|
+
"to": "sf-4",
|
|
77
|
+
"rel": "contains"
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
"from": "epic",
|
|
81
|
+
"to": "sf-5",
|
|
82
|
+
"rel": "contains"
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
"from": "sf-2",
|
|
86
|
+
"to": "sf-1",
|
|
87
|
+
"rel": "depends-on"
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
"from": "sf-3",
|
|
91
|
+
"to": "sf-1",
|
|
92
|
+
"rel": "depends-on"
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
"from": "sf-4",
|
|
96
|
+
"to": "sf-1",
|
|
97
|
+
"rel": "depends-on"
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
"from": "sf-5",
|
|
101
|
+
"to": "sf-2",
|
|
102
|
+
"rel": "depends-on"
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
"from": "sf-5",
|
|
106
|
+
"to": "sf-3",
|
|
107
|
+
"rel": "depends-on"
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
"from": "sf-5",
|
|
111
|
+
"to": "sf-4",
|
|
112
|
+
"rel": "depends-on"
|
|
113
|
+
}
|
|
114
|
+
]
|
|
115
|
+
}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
{
|
|
2
|
+
"wakiiMindmap": 1,
|
|
3
|
+
"meta": {
|
|
4
|
+
"story": "FI-76",
|
|
5
|
+
"generator": "story-workflow CREATE",
|
|
6
|
+
"generatedAt": "2026-10-13T03:20:00+07:00",
|
|
7
|
+
"dest": "story-fi76-kafka-outbox-saga",
|
|
8
|
+
"worktreeModel": "story-hub"
|
|
9
|
+
},
|
|
10
|
+
"nodes": [
|
|
11
|
+
{
|
|
12
|
+
"id": "epic",
|
|
13
|
+
"kind": "epic",
|
|
14
|
+
"title": "Kafka + Transactional Outbox + Saga (mở rộng FI-62)",
|
|
15
|
+
"summary": "Nâng luồng event từ REST fire-and-forget lên Kafka KRaft + Transactional Outbox + Saga choreography; thêm @Transactional demo spring. Spec: docs/superpowers/specs/2026-10-13-kafka-outbox-saga.md rev 3 (spec-critic + plan-critic FIX-P0-FIRST đã áp). CI-only verify."
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"id": "sf-1",
|
|
19
|
+
"kind": "sf",
|
|
20
|
+
"title": "Kafka foundation + async contracts",
|
|
21
|
+
"tier": 0,
|
|
22
|
+
"summary": "Phase 1/2 — shippable: nền tảng. Compose kafka KRaft (apache/kafka, heap 512m, healthcheck full-path, internal-only, không depend_on); PRE-ADD env consumers (KAFKA_BROKERS node+go, AUTH_MOCK_URL + SVC_ACTIVITY_PASSWORD go) đúng 1 lần sửa compose; contracts/events/task-events.md (envelope + payload shapes + filter-by-type) + golden fixtures/*.json (2 đầu test load chung); conventions/09; fixtures svc-fail + svc-activity users.json; ADR-0008 supersede 0006. KHÔNG đụng DDL/tasks.yaml/activity.yaml. Context pack: docs/superpowers/contexts/sf-1.md",
|
|
23
|
+
"linear": "FI-77"
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"id": "sf-4",
|
|
27
|
+
"kind": "sf",
|
|
28
|
+
"title": "spring-svc @Transactional demo",
|
|
29
|
+
"tier": 0,
|
|
30
|
+
"summary": "Phase 1/2 — shippable độc lập (false dep đã cắt — dùng alice@demo.local có sẵn, không dính Kafka). TeamService service layer: tạo team + members N step, fail giữa chừng (email trùng alice) → rollback toàn bộ; tests happy + rollback assert; README Situation A vs B. Context pack: docs/superpowers/contexts/sf-4.md",
|
|
31
|
+
"linear": "FI-78"
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
"id": "sf-2",
|
|
35
|
+
"kind": "sf",
|
|
36
|
+
"title": "node-svc Outbox + Producer + compensation consumer",
|
|
37
|
+
"tier": 1,
|
|
38
|
+
"summary": "Phase 1/2 — shippable: node publish qua Kafka thật. Cụm nguyên tử node-side cascade (canonical DDL CHECK + schema.ts + migration + tasks.yaml TaskStatus split writable/extended); outbox table (envelope id trong repo, presence-based event matrix); relay 500ms kafkajs đúng golden fixture; xóa clients/activity.ts; compensation consumer conditional UPDATE; services-node-svc.yml kafka boot-smoke (assert published_at NOT NULL); pin schema-diff.test whitelist outbox. Context pack: docs/superpowers/contexts/sf-2.md",
|
|
39
|
+
"linear": "FI-79"
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
"id": "sf-3",
|
|
43
|
+
"kind": "sf",
|
|
44
|
+
"title": "go-svc Consumer + Saga + thanh lý ingest",
|
|
45
|
+
"tier": 1,
|
|
46
|
+
"summary": "Phase 1/2 — shippable: go consume Kafka thật. Cụm nguyên tử activity-side cascade (migration 0002 varchar(40)+CHECK; activity.yaml ×2 file trọn gói + diff-guard; store/tasks.go map; FE remote-tasks badge + remote-activity labels); consumer segmentio manual-commit ON CONFLICT filter-by-type; retry×3 → compensating → DLQ; resolver svc-activity backoff + lazy re-login; xóa ingest; services-go-svc.yml 3 điểm chạm (console producer golden fixture + kafka subset + topics tường minh + stats nới). Context pack: docs/superpowers/contexts/sf-3.md",
|
|
47
|
+
"linear": "FI-80"
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
"id": "sf-5",
|
|
51
|
+
"kind": "sf",
|
|
52
|
+
"title": "Convergence + ADR sync + docs",
|
|
53
|
+
"tier": 2,
|
|
54
|
+
"summary": "Phase 2/2 — shippable: STORY-COMPLETE candidates. convergence.yml 10 services + poll nới; e2e 2 chiều: happy (tạo task → feed) + saga (assign svc-fail → status assignment_failed + assert DLQ kafka-console-consumer); FE verify tổng thể; walkthrough + down -v note; security pass (9092 internal, secrets không vào envelope); scaffold probe. Context pack: docs/superpowers/contexts/sf-5.md",
|
|
55
|
+
"linear": "FI-81"
|
|
56
|
+
}
|
|
57
|
+
],
|
|
58
|
+
"edges": [
|
|
59
|
+
{
|
|
60
|
+
"from": "epic",
|
|
61
|
+
"to": "sf-1",
|
|
62
|
+
"rel": "contains"
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
"from": "epic",
|
|
66
|
+
"to": "sf-4",
|
|
67
|
+
"rel": "contains"
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
"from": "epic",
|
|
71
|
+
"to": "sf-2",
|
|
72
|
+
"rel": "contains"
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
"from": "epic",
|
|
76
|
+
"to": "sf-3",
|
|
77
|
+
"rel": "contains"
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
"from": "epic",
|
|
81
|
+
"to": "sf-5",
|
|
82
|
+
"rel": "contains"
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
"from": "sf-2",
|
|
86
|
+
"to": "sf-1",
|
|
87
|
+
"rel": "depends-on"
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
"from": "sf-3",
|
|
91
|
+
"to": "sf-1",
|
|
92
|
+
"rel": "depends-on"
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
"from": "sf-5",
|
|
96
|
+
"to": "sf-2",
|
|
97
|
+
"rel": "depends-on"
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
"from": "sf-5",
|
|
101
|
+
"to": "sf-3",
|
|
102
|
+
"rel": "depends-on"
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
"from": "sf-5",
|
|
106
|
+
"to": "sf-4",
|
|
107
|
+
"rel": "depends-on"
|
|
108
|
+
}
|
|
109
|
+
]
|
|
110
|
+
}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
{
|
|
2
|
+
"wakiiMindmap": 1,
|
|
3
|
+
"meta": {
|
|
4
|
+
"story": "FI-62",
|
|
5
|
+
"generator": "story-workflow CREATE",
|
|
6
|
+
"generatedAt": "2026-10-12T10:30:00+07:00",
|
|
7
|
+
"dest": "story-fi62-micro-boilerplate",
|
|
8
|
+
"worktreeModel": "story-hub"
|
|
9
|
+
},
|
|
10
|
+
"nodes": [
|
|
11
|
+
{
|
|
12
|
+
"id": "epic",
|
|
13
|
+
"kind": "epic",
|
|
14
|
+
"title": "Boilerplate Microservice + Micro-frontend",
|
|
15
|
+
"summary": "Template nội bộ copy-able: mixed-stack services (Node/Spring/Go) + Module Federation FE, demo e2e task management qua nginx gateway, Docker Compose + CI. Spec: docs/superpowers/specs/2026-10-12-boilerplate-microservice-mfe.md rev 3."
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"id": "sf-1",
|
|
19
|
+
"kind": "sf",
|
|
20
|
+
"title": "Contracts & Platform Foundation",
|
|
21
|
+
"tier": 0,
|
|
22
|
+
"summary": "Phase 1/3 — shippable: nền tảng. OpenAPI specs + canonical tasks DDL + users fixture + token contract; conventions (healthcheck, JSON log, error envelope, port table, CORS dev); compose PRE-SEED đủ khung 6 services + postgres init (readonly grants qua default privileges); nginx gateway; auth-mock; fe-shared kèm spike MF/Rspack pin versions; CI templates (path-filter + boot-smoke + gitleaks). Demo: swagger auth-mock login nhận JWT hợp lệ; CI contract lint xanh. Context pack: docs/superpowers/contexts/sf-1.md",
|
|
23
|
+
"linear": "FI-64"
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"id": "sf-2",
|
|
27
|
+
"kind": "sf",
|
|
28
|
+
"title": "node-svc — task API (Fastify + TS)",
|
|
29
|
+
"tier": 1,
|
|
30
|
+
"summary": "Phase 1/3 — shippable: task CRUD qua gateway, user validate qua spring (timeout 2s, fail-closed 503), event push fire-and-forget sang go-svc, migration khớp canonical DDL, boot-smoke CI. Demo: swagger tạo/list task. Context pack: docs/superpowers/contexts/sf-2.md",
|
|
31
|
+
"linear": "FI-70"
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
"id": "sf-3",
|
|
35
|
+
"kind": "sf",
|
|
36
|
+
"title": "spring-svc — user API (Spring Boot 3)",
|
|
37
|
+
"tier": 1,
|
|
38
|
+
"summary": "Phase 1/3 — shippable: users + teams CRUD, seed đọc users fixture (id khớp 100%), JWT service-side verify, Flyway migration, mvnw wrapper, boot-smoke CI. Demo: swagger GET fixture user. Context pack: docs/superpowers/contexts/sf-3.md",
|
|
39
|
+
"linear": "FI-71"
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
"id": "sf-4",
|
|
43
|
+
"kind": "sf",
|
|
44
|
+
"title": "go-svc — activity API (Go 1.24 + chi)",
|
|
45
|
+
"tier": 1,
|
|
46
|
+
"summary": "Phase 1/3 — shippable: nhận POST /activity/events, feed + stats (đọc readonly schema tasks theo canonical DDL), tự migrate schema activity, readonly-read exit criterion (seed qua owner role), boot-smoke CI. Demo: swagger-ui POST event → feed. Context pack: docs/superpowers/contexts/sf-4.md",
|
|
47
|
+
"linear": "FI-72"
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
"id": "sf-5",
|
|
51
|
+
"kind": "sf",
|
|
52
|
+
"title": "FE shell — MF host (Rspack)",
|
|
53
|
+
"tier": 1,
|
|
54
|
+
"summary": "Phase 2/3 — shippable: shell login mock JWT, nav + routing, load remotes theo registry, error boundary remote-down, a11y baseline có test (route focus + skip link). Task đầu: re-validation spike SF-1 + fe-shared fit-check. Context pack: docs/superpowers/contexts/sf-5.md",
|
|
55
|
+
"linear": "FI-73"
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
"id": "sf-6",
|
|
59
|
+
"kind": "sf",
|
|
60
|
+
"title": "FE remotes — tasks + activity",
|
|
61
|
+
"tier": 2,
|
|
62
|
+
"summary": "Phase 2/3 — shippable: 2 remote gọi service thật qua gateway (tạo task qua node-svc; feed/stats qua go-svc), shared singletons theo catalog, boot-smoke per remote (remoteEntry fetch được). Context pack: docs/superpowers/contexts/sf-6.md",
|
|
63
|
+
"linear": "FI-74"
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
"id": "sf-7",
|
|
67
|
+
"kind": "sf",
|
|
68
|
+
"title": "Convergence & Scaffold",
|
|
69
|
+
"tier": 3,
|
|
70
|
+
"summary": "Phase 3/3 — shippable: e2e smoke script committed + CI job (login → tạo task → đọc feed qua gateway), copy-dir standalone smoke, health-gated compose, docs + ADR + fresh-clone walkthrough, scaffold script (trễ = scope-flag, không auto-complete), security-audit checkpoint. Context pack: docs/superpowers/contexts/sf-7.md",
|
|
71
|
+
"linear": "FI-75"
|
|
72
|
+
}
|
|
73
|
+
],
|
|
74
|
+
"edges": [
|
|
75
|
+
{
|
|
76
|
+
"from": "epic",
|
|
77
|
+
"to": "sf-1",
|
|
78
|
+
"rel": "contains"
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
"from": "epic",
|
|
82
|
+
"to": "sf-2",
|
|
83
|
+
"rel": "contains"
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
"from": "epic",
|
|
87
|
+
"to": "sf-3",
|
|
88
|
+
"rel": "contains"
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
"from": "epic",
|
|
92
|
+
"to": "sf-4",
|
|
93
|
+
"rel": "contains"
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
"from": "epic",
|
|
97
|
+
"to": "sf-5",
|
|
98
|
+
"rel": "contains"
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
"from": "epic",
|
|
102
|
+
"to": "sf-6",
|
|
103
|
+
"rel": "contains"
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
"from": "epic",
|
|
107
|
+
"to": "sf-7",
|
|
108
|
+
"rel": "contains"
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
"from": "sf-2",
|
|
112
|
+
"to": "sf-1",
|
|
113
|
+
"rel": "depends-on"
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
"from": "sf-3",
|
|
117
|
+
"to": "sf-1",
|
|
118
|
+
"rel": "depends-on"
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
"from": "sf-4",
|
|
122
|
+
"to": "sf-1",
|
|
123
|
+
"rel": "depends-on"
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
"from": "sf-5",
|
|
127
|
+
"to": "sf-1",
|
|
128
|
+
"rel": "depends-on"
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
"from": "sf-6",
|
|
132
|
+
"to": "sf-1",
|
|
133
|
+
"rel": "depends-on"
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
"from": "sf-6",
|
|
137
|
+
"to": "sf-2",
|
|
138
|
+
"rel": "depends-on"
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
"from": "sf-6",
|
|
142
|
+
"to": "sf-4",
|
|
143
|
+
"rel": "depends-on"
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
"from": "sf-7",
|
|
147
|
+
"to": "sf-2",
|
|
148
|
+
"rel": "depends-on"
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
"from": "sf-7",
|
|
152
|
+
"to": "sf-3",
|
|
153
|
+
"rel": "depends-on"
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
"from": "sf-7",
|
|
157
|
+
"to": "sf-4",
|
|
158
|
+
"rel": "depends-on"
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
"from": "sf-7",
|
|
162
|
+
"to": "sf-5",
|
|
163
|
+
"rel": "depends-on"
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
"from": "sf-7",
|
|
167
|
+
"to": "sf-6",
|
|
168
|
+
"rel": "depends-on"
|
|
169
|
+
}
|
|
170
|
+
]
|
|
171
|
+
}
|