vibes-plug 1.0.0 → 2.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (183) hide show
  1. package/.claude/rules/vibes-plug-core.md +32 -0
  2. package/.cursor/rules/vibes-plug-core.mdc +51 -0
  3. package/.cursorrules +42 -0
  4. package/AGENTS.md +96 -0
  5. package/BLUEPRINT.md +309 -125
  6. package/CHANGELOG.md +183 -1
  7. package/CLAUDE.md +70 -0
  8. package/LICENSE +1 -1
  9. package/README.md +641 -263
  10. package/index.js +19 -0
  11. package/package.json +61 -25
  12. package/plugin.json +24 -7
  13. package/scripts/generate_swarm_gif.py +295 -0
  14. package/scripts/install.js +201 -0
  15. package/skills/accessibility-testing-expert/SKILL.md +116 -0
  16. package/skills/ai-cost-token-optimizer/SKILL.md +82 -0
  17. package/skills/ai-evals-benchmark-expert/SKILL.md +188 -0
  18. package/skills/ai-llm-integration-expert/SKILL.md +147 -122
  19. package/skills/ai-media-generation-expert/SKILL.md +172 -0
  20. package/skills/ai-prompt-engineering-expert/SKILL.md +84 -0
  21. package/skills/angular-expert/SKILL.md +148 -0
  22. package/skills/api-design-expert/SKILL.md +316 -309
  23. package/skills/api-gateway-proxy-expert/SKILL.md +81 -0
  24. package/skills/app-analyzer-optimizer/SKILL.md +195 -188
  25. package/skills/apple-ecosystem-expert/SKILL.md +145 -0
  26. package/skills/{asisten_ramah → asisten-ramah}/SKILL.md +7 -1
  27. package/skills/astro-framework-expert/SKILL.md +200 -0
  28. package/skills/async-queue-temporal-expert/SKILL.md +240 -0
  29. package/skills/authentication-identity-expert/SKILL.md +279 -45
  30. package/skills/auto-doc-updater/SKILL.md +219 -203
  31. package/skills/autonomous-chaos-monkey/SKILL.md +63 -0
  32. package/skills/autonomous-red-teamer/SKILL.md +203 -0
  33. package/skills/autonomous-tdd-debugger/SKILL.md +71 -0
  34. package/skills/background-jobs-queue-expert/SKILL.md +235 -0
  35. package/skills/biome-linter-formatter-expert/SKILL.md +89 -0
  36. package/skills/blockchain-web3-expert/SKILL.md +115 -0
  37. package/skills/bootstrap-to-modern/SKILL.md +93 -86
  38. package/skills/brainstorming/SKILL.md +381 -353
  39. package/skills/browser-automation-expert/SKILL.md +222 -0
  40. package/skills/bun-runtime-expert/SKILL.md +7 -1
  41. package/skills/chatbot-messaging-expert/SKILL.md +114 -0
  42. package/skills/ci-cd-devops-architect/SKILL.md +81 -45
  43. package/skills/cloud-hosting-expert/SKILL.md +249 -243
  44. package/skills/coderabbit/SKILL.md +197 -191
  45. package/skills/compliance-gdpr-privacy-expert/SKILL.md +85 -0
  46. package/skills/cron-scheduler-expert/SKILL.md +304 -0
  47. package/skills/data-pipeline-etl-expert/SKILL.md +84 -0
  48. package/skills/data-telemetry-expert/SKILL.md +218 -212
  49. package/skills/data-visualization-expert/SKILL.md +154 -0
  50. package/skills/database-migration-versioning-expert/SKILL.md +90 -0
  51. package/skills/database-orm-expert/SKILL.md +303 -293
  52. package/skills/dependency-upgrade-migrator/SKILL.md +301 -0
  53. package/skills/design-system-architect/SKILL.md +278 -242
  54. package/skills/desktop-electron-expert/SKILL.md +128 -0
  55. package/skills/documentation-site-expert/SKILL.md +59 -0
  56. package/skills/doku-mcp-server/SKILL.md +257 -0
  57. package/skills/doku-payment-gateway/SKILL.md +233 -0
  58. package/skills/domain-driven-design-expert/SKILL.md +82 -0
  59. package/skills/e2e-testing-expert/SKILL.md +320 -314
  60. package/skills/ecommerce-expert/SKILL.md +87 -0
  61. package/skills/edge-serverless-db-expert/SKILL.md +99 -0
  62. package/skills/email-notification-expert/SKILL.md +368 -0
  63. package/skills/error-resilience-expert/SKILL.md +486 -0
  64. package/skills/event-driven-architect/SKILL.md +86 -80
  65. package/skills/feature-flag-analytics-expert/SKILL.md +66 -0
  66. package/skills/file-upload-media-expert/SKILL.md +437 -0
  67. package/skills/firebase-security-expert/SKILL.md +7 -1
  68. package/skills/form-validation-expert/SKILL.md +407 -0
  69. package/skills/fullstack-expert/SKILL.md +260 -201
  70. package/skills/fullstack-expert/references/api_design_guide.md +466 -466
  71. package/skills/fullstack-expert/references/multi_language_backend.md +528 -528
  72. package/skills/fullstack-expert/scripts/api_contract_validator.py +253 -253
  73. package/skills/fullstack-expert/scripts/architecture_analyzer.py +326 -326
  74. package/skills/gemini-agent-booster/SKILL.md +142 -104
  75. package/skills/geospatial-maps-expert/SKILL.md +80 -0
  76. package/skills/global-a11y-i18n-expert/SKILL.md +86 -80
  77. package/skills/glsl-shader-expert/SKILL.md +107 -0
  78. package/skills/go-programming-expert/SKILL.md +300 -294
  79. package/skills/graph-rag-knowledge-expert/SKILL.md +159 -0
  80. package/skills/graphql-apollo-expert/SKILL.md +114 -0
  81. package/skills/headless-cms-expert/SKILL.md +181 -0
  82. package/skills/hig/SKILL.md +193 -187
  83. package/skills/js-backend-expert/SKILL.md +218 -191
  84. package/skills/legacy-code-translator/SKILL.md +71 -0
  85. package/skills/local-slm-edge-ai-expert/SKILL.md +167 -0
  86. package/skills/logging-error-tracking-expert/SKILL.md +344 -0
  87. package/skills/mcp-client-orchestrator/SKILL.md +76 -0
  88. package/skills/mcp-server-architect/SKILL.md +226 -126
  89. package/skills/micro-frontend-architect/SKILL.md +112 -0
  90. package/skills/mobile-expo-expert/SKILL.md +191 -185
  91. package/skills/mobile-push-notification-expert/SKILL.md +71 -0
  92. package/skills/modern-css-native-expert/SKILL.md +189 -0
  93. package/skills/monday-design-aesthetic/SKILL.md +72 -66
  94. package/skills/monorepo-architect/SKILL.md +232 -226
  95. package/skills/mpa-orchestrator/SKILL.md +120 -101
  96. package/skills/multi-agent-orchestration/SKILL.md +173 -153
  97. package/skills/multiple-entry-points/SKILL.md +91 -55
  98. package/skills/mvc-expert/SKILL.md +237 -231
  99. package/skills/n8n-automation-expert/SKILL.md +89 -0
  100. package/skills/nextjs-app-router-expert/SKILL.md +148 -0
  101. package/skills/openapi-swagger-codegen-expert/SKILL.md +67 -0
  102. package/skills/payment-gateway-expert/SKILL.md +129 -45
  103. package/skills/pdf-document-generation-expert/SKILL.md +91 -0
  104. package/skills/performance-web-vitals/SKILL.md +337 -331
  105. package/skills/post-quantum-crypto-migrator/SKILL.md +57 -0
  106. package/skills/prd-architect/SKILL.md +206 -190
  107. package/skills/proactive-background-watcher/SKILL.md +68 -0
  108. package/skills/production-ready-hardener/PRODUCTION_READINESS_REPORT.md +67 -0
  109. package/skills/production-ready-hardener/SKILL.md +461 -468
  110. package/skills/production-ready-hardener/references/production_checklist.md +161 -161
  111. package/skills/production-ready-hardener/scripts/production_readiness_scanner.py +881 -875
  112. package/skills/project-context-mapper/SKILL.md +85 -0
  113. package/skills/pwa-offline-first-expert/SKILL.md +185 -0
  114. package/skills/python-programming-expert/SKILL.md +407 -270
  115. package/skills/rate-limit-abuse-prevention/SKILL.md +377 -0
  116. package/skills/realtime-collaboration-expert/SKILL.md +99 -45
  117. package/skills/rich-text-editor-expert/SKILL.md +177 -0
  118. package/skills/rust-programming-expert/SKILL.md +240 -234
  119. package/skills/saas-billing/SKILL.md +382 -376
  120. package/skills/saas-multi-tenant/SKILL.md +256 -236
  121. package/skills/saas-mvp-launcher/SKILL.md +30 -1
  122. package/skills/saas-transformer/SKILL.md +499 -445
  123. package/skills/saas-transformer/references/billing_integration_guide.md +401 -401
  124. package/skills/saas-transformer/references/feature_gating_patterns.md +137 -137
  125. package/skills/saas-transformer/references/saas_transformation_checklist.md +121 -121
  126. package/skills/saas-transformer/scripts/saas_transformation_scanner.py +39 -29
  127. package/skills/scalability-clean-code/SKILL.md +234 -228
  128. package/skills/search-engine-expert/SKILL.md +89 -0
  129. package/skills/secure-fuzz-testing/SKILL.md +7 -1
  130. package/skills/self-evolving-memory-graph/SKILL.md +91 -0
  131. package/skills/self-healing-cloud-orchestrator/SKILL.md +57 -0
  132. package/skills/senior-frontend/SKILL.md +85 -105
  133. package/skills/seo/SKILL.md +258 -224
  134. package/skills/session-context-loader/SKILL.md +83 -0
  135. package/skills/session-handoff-resume/SKILL.md +163 -157
  136. package/skills/{skill_baru → skill-baru}/SKILL.md +177 -146
  137. package/skills/solidjs-expert/SKILL.md +80 -0
  138. package/skills/spa-orchestrator/SKILL.md +306 -287
  139. package/skills/sse-websocket-streaming-expert/SKILL.md +93 -0
  140. package/skills/state-management-expert/SKILL.md +277 -271
  141. package/skills/supabase-migration/SKILL.md +47 -1
  142. package/skills/supabase-security-expert/SKILL.md +248 -242
  143. package/skills/svelte-sveltekit-expert/SKILL.md +91 -0
  144. package/skills/svg-animation-motion-expert/SKILL.md +115 -0
  145. package/skills/tailwind-expert/SKILL.md +139 -187
  146. package/skills/tanstack-query-expert/SKILL.md +204 -198
  147. package/skills/tauri-expert/SKILL.md +7 -1
  148. package/skills/token-saver/SKILL.md +118 -110
  149. package/skills/typescript-expert/SKILL.md +329 -278
  150. package/skills/ui-components-expert/SKILL.md +166 -63
  151. package/skills/ui-ux-pro-max/SKILL.md +221 -200
  152. package/skills/vector-db-rag-expert/SKILL.md +208 -0
  153. package/skills/vibe-code-gardener/SKILL.md +180 -172
  154. package/skills/visual-qa-vision-agent/SKILL.md +71 -0
  155. package/skills/voice-ai-realtime-agent/SKILL.md +202 -0
  156. package/skills/vue-frontend-expert/SKILL.md +132 -0
  157. package/skills/wasm-edge-computing-expert/SKILL.md +97 -0
  158. package/skills/web-3d-graphics-expert/SKILL.md +137 -0
  159. package/skills/web-game-engine-expert/SKILL.md +102 -0
  160. package/skills/web-scraper/SKILL.md +98 -146
  161. package/skills/website-design-cloner/SKILL.md +180 -0
  162. package/skills/webxr-ar-vr-expert/SKILL.md +123 -0
  163. package/skills/wordpress-headless-expert/SKILL.md +144 -0
  164. package/skills/zero-to-prod-orchestrator/SKILL.md +231 -180
  165. package/skills/zero-trust-secret-vault/SKILL.md +88 -0
  166. package/.github/ISSUE_TEMPLATE/feature_request.md +0 -20
  167. package/CONTRIBUTING.md +0 -199
  168. package/SECURITY.md +0 -21
  169. package/banner.png +0 -0
  170. package/skills/senior-fullstack/SKILL.md +0 -167
  171. package/skills/senior-fullstack/references/architecture_patterns.md +0 -160
  172. package/skills/senior-fullstack/references/development_workflows.md +0 -222
  173. package/skills/senior-fullstack/references/tech_stack_guide.md +0 -190
  174. package/skills/senior-fullstack/scripts/code_quality_analyzer.py +0 -114
  175. package/skills/senior-fullstack/scripts/fullstack_scaffolder.py +0 -114
  176. package/skills/senior-fullstack/scripts/project_scaffolder.py +0 -114
  177. package/skills/seo-aeo-landing-page-writer/SKILL.md +0 -97
  178. package/skills/seo-geo/SKILL.md +0 -188
  179. package/skills/ui-ux-pro-max/scripts/__pycache__/core.cpython-310.pyc +0 -0
  180. package/skills/ui-ux-pro-max/scripts/__pycache__/core.cpython-312.pyc +0 -0
  181. package/skills/ui-ux-pro-max/scripts/__pycache__/design_system.cpython-310.pyc +0 -0
  182. package/skills/ui-ux-pro-max/scripts/__pycache__/design_system.cpython-312.pyc +0 -0
  183. package/skills/ui_ux_expert/SKILL.md +0 -114
@@ -1,288 +1,307 @@
1
- ---
2
- name: spa-orchestrator
3
- description: "Orchestrates Single-Page Application (SPA) architecture, integrating frontend state management with API-driven backends / Mengorkestrasi arsitektur Single-Page Application (SPA), mengintegrasikan state management frontend dengan backend berbasis API."
1
+ ---
2
+ name: spa-orchestrator
3
+ description: "Orchestrates Single-Page Application (SPA) architecture, integrating frontend state management with API-driven backends / Mengorkestrasi arsitektur Single-Page Application (SPA), mengintegrasikan state management frontend dengan backend berbasis API."
4
4
  author: "Roedy Rustam"
5
- ---
6
-
7
- # Single-Page Application (SPA) Orchestrator (2026 Edition)
8
-
9
- [English](#english) | [Bahasa Indonesia](#bahasa-indonesia)
10
-
11
- ---
12
-
13
- <a name="english"></a>
14
- ## English
15
-
16
- ### Description
17
- Structured orchestration guide for building modern Single-Page Applications (SPAs). Coordinates frontend architecture (TanStack Router, React 19, TanStack Query v5) with decoupled API backends (Hono RPC, tRPC). Covers state management strategy, routing patterns, API layer design, build tooling (Vite + TanStack Start), and deployment strategies.
18
-
19
- ### Trigger Conditions
20
- - Building a highly interactive dashboard, admin panel, or data-heavy web application as a SPA.
21
- - Choosing between SPA vs SSR vs MPA for a new project.
22
- - Setting up client-side routing with **TanStack Router** (type-safe routes, loaders).
23
- - Structuring state management: server state (TanStack Query) vs client state (Zustand/Jotai).
24
- - Building a decoupled frontend that communicates with a separate backend via **Hono RPC** or tRPC.
25
- - Deploying a SPA to Cloudflare Pages, Vercel, or a CDN.
26
-
27
- ### SPA vs SSR vs MPA Decision Guide
28
- ```
29
- Choose SPA when:
30
- ✅ Highly interactive app (dashboard, editor, admin panel)
31
- Rich client-side state that persists across navigation
32
- ✅ Auth-gated app (SEO is not a primary concern)
33
- Already have a separate backend API
34
-
35
- Choose SSR (Next.js) when:
36
- ✅ SEO is critical (marketing pages, public content)
37
- Fast initial page load for unauthenticated users
38
- ✅ Mixed app: some public pages + some gated app pages
39
-
40
- Choose MPA (Astro, Django, Laravel) when:
41
- Mostly static content, minimal interactivity
42
- SEO is the primary concern
43
- ✅ Small team that wants to avoid JS complexity
44
- see mpa-orchestrator skill
45
- ```
46
-
47
- ### Recommended SPA Stack (2026)
48
-
49
- | Layer | Tool | Why |
50
- |---|---|---|
51
- | **Build** | Vite 6 / TanStack Start | Instant HMR, ES modules, fast builds |
52
- | **Routing** | TanStack Router | Fully type-safe routes, search params, loaders |
53
- | **Server State** | TanStack Query v5 | Data fetching, caching, mutations |
54
- | **Client State** | Zustand / Jotai | Lightweight, no boilerplate |
55
- | **API Layer** | Hono RPC / tRPC | End-to-end type-safe, no codegen |
56
- | **Forms** | React Hook Form + Zod | Performant, type-safe validation |
57
- | **Styling** | Tailwind CSS v4 | Utility-first, zero-runtime |
58
- | **Components** | shadcn/ui + Base UI | Headless, accessible, customizable |
59
- | **Animations** | GSAP | Complex, timeline-based, scroll-driven |
60
-
61
- ### TanStack Router File-Based Type-Safe Routing
62
-
63
- ```
64
- src/routes/
65
- __root.tsx # Root layout (providers, nav)
66
- index.tsx # / — landing/home
67
- _auth.tsx # Auth guard layout
68
- _auth/
69
- dashboard.tsx # /dashboard (auth required)
70
- settings/
71
- index.tsx # /settings
72
- profile.tsx # /settings/profile
73
- _public.tsx # Public layout
74
- _public/
75
- login.tsx # /login
76
- ```
77
-
78
- ```typescript
79
- // src/routes/__root.tsx
80
- import { createRootRouteWithContext, Outlet } from '@tanstack/react-router';
81
- import type { QueryClient } from '@tanstack/react-query';
82
-
83
- interface RouterContext {
84
- queryClient: QueryClient;
85
- auth: { user: User | null; isAuthenticated: boolean };
86
- }
87
-
88
- export const Route = createRootRouteWithContext<RouterContext>()({
89
- component: () => (
90
- <div>
91
- <Navbar />
92
- <Outlet />
93
- </div>
94
- ),
95
- });
96
- ```
97
-
98
- ```typescript
99
- // src/routes/_auth/dashboard.tsx — protected route with data preloading
100
- import { createFileRoute, redirect } from '@tanstack/react-router';
101
- import { workspacesQueryOptions } from '@/queries/workspaces';
102
-
103
- export const Route = createFileRoute('/_auth/dashboard')({
104
- // Runs before render — redirect if not authenticated
105
- beforeLoad: ({ context }) => {
106
- if (!context.auth.isAuthenticated) {
107
- throw redirect({ to: '/login' });
108
- }
109
- },
110
- // Prefetch data in loader — no loading state on initial render
111
- loader: ({ context: { queryClient } }) =>
112
- queryClient.ensureQueryData(workspacesQueryOptions()),
113
- component: DashboardPage,
114
- });
115
-
116
- function DashboardPage() {
117
- // Data is already available — no loading state
118
- const { data: workspaces } = useSuspenseQuery(workspacesQueryOptions());
119
- return <WorkspaceList workspaces={workspaces} />;
120
- }
121
- ```
122
-
123
- ### State Management Architecture
124
-
125
- ```
126
- State Layers:
127
- ┌─────────────────────────────────────┐
128
- │ Server State (TanStack Query v5) │ ← API data, cached, auto-refetch
129
- │ workspaces, users, projects, etc. │
130
- ├─────────────────────────────────────┤
131
- │ Client State (Zustand) │ ← UI state, sidebar open, theme
132
- modals, filters, UI preferences │
133
- ├─────────────────────────────────────┤
134
- │ Form State (React Hook Form) │ ← Active form inputs, validation
135
- Scoped to individual forms │
136
- ├─────────────────────────────────────┤
137
- │ URL State (TanStack Router) │ ← Shareable page state
138
- search params, active tab, page # │
139
- └─────────────────────────────────────┘
140
- ```
141
-
142
- ```typescript
143
- // URL State — persist filter state in URL (shareable)
144
- import { createFileRoute, useNavigate } from '@tanstack/react-router';
145
- import { z } from 'zod';
146
-
147
- const searchSchema = z.object({
148
- page: z.number().int().positive().default(1).catch(1),
149
- search: z.string().default('').catch(''),
150
- status: z.enum(['all', 'active', 'archived']).default('all').catch('all'),
151
- });
152
-
153
- export const Route = createFileRoute('/_auth/projects')({
154
- validateSearch: searchSchema,
155
- component: ProjectsPage,
156
- });
157
-
158
- function ProjectsPage() {
159
- const { page, search, status } = Route.useSearch();
160
- const navigate = useNavigate({ from: Route.fullPath });
161
-
162
- const setSearch = (q: string) =>
163
- navigate({ search: (prev) => ({ ...prev, search: q, page: 1 }) });
164
-
165
- return (
166
- <div>
167
- <SearchInput value={search} onChange={setSearch} />
168
- <ProjectList page={page} search={search} status={status} />
169
- </div>
170
- );
171
- }
172
- ```
173
-
174
- ### Hono RPC — Decoupled Type-Safe API
175
-
176
- ```typescript
177
- // apps/api/src/index.ts — backend Hono app
178
- import { Hono } from 'hono';
179
- import { zValidator } from '@hono/zod-validator';
180
-
181
- const workspacesRoute = new Hono()
182
- .get('/', async (c) => {
183
- const user = c.get('user');
184
- const workspaces = await db.workspace.findMany({
185
- where: { members: { some: { userId: user.id } } },
186
- });
187
- return c.json(workspaces);
188
- })
189
- .post('/', zValidator('json', CreateWorkspaceSchema), async (c) => {
190
- const data = c.req.valid('json');
191
- const workspace = await db.workspace.create({ data });
192
- return c.json(workspace, 201);
193
- });
194
-
195
- const app = new Hono()
196
- .use('*', authMiddleware)
197
- .route('/workspaces', workspacesRoute);
198
-
199
- export type AppType = typeof app;
200
- export default app;
201
- ```
202
-
203
- ```typescript
204
- // apps/web/src/lib/api.ts — type-safe client
205
- import { hc } from 'hono/client';
206
- import type { AppType } from '@myapp/api';
207
-
208
- export const api = hc<AppType>(import.meta.env.VITE_API_URL);
209
-
210
- // TanStack Query integration
211
- export const workspacesQueryOptions = () =>
212
- queryOptions({
213
- queryKey: ['workspaces'],
214
- queryFn: async () => {
215
- const res = await api.workspaces.$get();
216
- return res.json(); // Fully typed!
217
- },
218
- staleTime: 5 * 60 * 1000,
219
- });
220
- ```
221
-
222
- ### Build & Deployment
223
-
224
- ```typescript
225
- // vite.config.ts
226
- import { defineConfig } from 'vite';
227
- import react from '@vitejs/plugin-react';
228
- import { TanStackRouterVite } from '@tanstack/router-plugin/vite';
229
-
230
- export default defineConfig({
231
- plugins: [
232
- TanStackRouterVite(), // Auto-generates route tree
233
- react(),
234
- ],
235
- build: {
236
- rollupOptions: {
237
- output: {
238
- manualChunks: {
239
- 'vendor-react': ['react', 'react-dom'],
240
- 'vendor-query': ['@tanstack/react-query'],
241
- 'vendor-router': ['@tanstack/react-router'],
242
- },
243
- },
244
- },
245
- },
246
- });
247
- ```
248
-
249
- **Deployment target**: Cloudflare Pages or Vercel for CDN-served static SPA. Backend API deployed separately to Railway/Fly.io.
250
-
251
- ---
252
-
253
- <a name="bahasa-indonesia"></a>
254
- ## Bahasa Indonesia
255
-
256
- ### Deskripsi
257
- Panduan orkestrasi terstruktur untuk membangun Single-Page Application (SPA) modern. Mengkoordinasikan arsitektur frontend (TanStack Router, React 19, TanStack Query v5) dengan backend API terpisah (Hono RPC, tRPC). Mencakup strategi state management, pola routing, desain API layer, build tooling (Vite + TanStack Start), dan strategi deployment.
258
-
259
- ### Kondisi Pemicu
260
- - Membangun dashboard yang sangat interaktif, panel admin, atau aplikasi web berat data sebagai SPA.
261
- - Memilih antara SPA vs SSR vs MPA untuk proyek baru.
262
- - Menyiapkan client-side routing dengan **TanStack Router** (rute type-safe, loader).
263
- - Menyusun state management: server state (TanStack Query) vs client state (Zustand/Jotai).
264
- - Membangun frontend terpisah yang berkomunikasi dengan backend terpisah via **Hono RPC** atau tRPC.
265
- - Men-deploy SPA ke Cloudflare Pages, Vercel, atau CDN.
266
-
267
- ### SPA vs SSR vs MPA — Panduan Keputusan
268
-
269
- Pilih SPA saat: aplikasi sangat interaktif (dashboard, editor, panel admin), state sisi klien yang kaya, aplikasi yang dibatasi auth (SEO bukan perhatian utama).
270
-
271
- Pilih SSR (Next.js) saat: SEO sangat penting, load halaman awal yang cepat untuk pengguna yang tidak terautentikasi, aplikasi campuran.
272
-
273
- Pilih MPA (Astro, Django, Laravel) saat: konten sebagian besar statis, SEO adalah perhatian utama — lihat skill `mpa-orchestrator`.
274
-
275
- ### Stack SPA yang Direkomendasikan (2026)
276
- Vite 6 untuk build, TanStack Router untuk routing type-safe, TanStack Query v5 untuk server state, Zustand untuk client state, Hono RPC untuk API layer type-safe, React Hook Form + Zod untuk form, Tailwind CSS v4 untuk styling, dan GSAP untuk animasi kompleks.
277
-
278
- ### TanStack Router — Routing File-Based Type-Safe
279
- Atur rute dalam direktori `src/routes/` dengan layout bersarang. Gunakan `createFileRoute` dengan `beforeLoad` untuk guard autentikasi, `loader` untuk prefetch data, dan `validateSearch` untuk URL state yang dapat dibagikan.
280
-
281
- ### Arsitektur State Management
282
- Empat lapisan state yang saling melengkapi: Server State (TanStack Query), Client State (Zustand), Form State (React Hook Form), dan URL State (TanStack Router search params).
283
-
284
- ### Hono RPC API Type-Safe Terpisah
285
- Ekspor `AppType` dari backend Hono dan gunakan `hc<AppType>()` di frontend untuk panggilan API yang fully typed tanpa codegen.
286
-
287
- ### Build & Deployment
288
- Gunakan plugin `TanStackRouterVite` untuk auto-generate route tree. Konfigurasi `manualChunks` untuk code splitting yang optimal. Deploy SPA ke Cloudflare Pages atau Vercel; backend API ke Railway/Fly.io secara terpisah.
5
+ ---
6
+
7
+ # Single-Page Application (SPA) Orchestrator (2026 Edition)
8
+
9
+ [English](#english) | [Bahasa Indonesia](#bahasa-indonesia)
10
+
11
+ ---
12
+
13
+ <a name="english"></a>
14
+ ## English
15
+
16
+ ### Orchestration & Integration
17
+ Connects and orchestrates with relevant domain skills like `modern-web-guidance`, `brainstorming`, `zero-to-prod-orchestrator`, and `project-context-mapper` to ensure cohesive execution.
18
+ - **MANDATORY**: Execute `modern-web-guidance` FIRST for all HTML/CSS and client-side JS tasks to ensure modern web standards.
19
+
20
+ ### Description
21
+ Structured orchestration guide for building modern Single-Page Applications (SPAs). Coordinates frontend architecture (TanStack Router, React 19, TanStack Query v5) with decoupled API backends (Hono RPC, tRPC). Covers state management strategy, routing patterns, API layer design, build tooling (Vite + TanStack Start), and deployment strategies.
22
+
23
+ ### Trigger Conditions
24
+ - Building a highly interactive dashboard, admin panel, or data-heavy web application as a SPA.
25
+ - Choosing between SPA vs SSR vs MPA for a new project.
26
+ - Setting up client-side routing with **TanStack Router** (type-safe routes, loaders).
27
+ - Structuring state management: server state (TanStack Query) vs client state (Zustand/Jotai).
28
+ - Building a decoupled frontend that communicates with a separate backend via **Hono RPC** or tRPC.
29
+ - Deploying a SPA to Cloudflare Pages, Vercel, or a CDN.
30
+
31
+ ### SPA vs SSR vs MPA Decision Guide
32
+ ```
33
+ Choose SPA when:
34
+ ✅ Highly interactive app (dashboard, editor, admin panel)
35
+ Rich client-side state that persists across navigation
36
+ Auth-gated app (SEO is not a primary concern)
37
+ Already have a separate backend API
38
+
39
+ Choose SSR (Next.js) when:
40
+ SEO is critical (marketing pages, public content)
41
+ Fast initial page load for unauthenticated users
42
+ Mixed app: some public pages + some gated app pages
43
+
44
+ Choose MPA (Astro, Django, Laravel) when:
45
+ ✅ Mostly static content, minimal interactivity
46
+ ✅ SEO is the primary concern
47
+ Small team that wants to avoid JS complexity
48
+ → see mpa-orchestrator skill
49
+ ```
50
+
51
+ ### Recommended SPA Stack (2026)
52
+
53
+ | Layer | Tool | Why |
54
+ |---|---|---|
55
+ | **Build** | Vite 6 / TanStack Start | Instant HMR, ES modules, fast builds |
56
+ | **Routing** | TanStack Router | Fully type-safe routes, search params, loaders |
57
+ | **Server State** | TanStack Query v5 | Data fetching, caching, mutations |
58
+ | **Client State** | Zustand / Jotai | Lightweight, no boilerplate |
59
+ | **API Layer** | Hono RPC / tRPC | End-to-end type-safe, no codegen |
60
+ | **Forms** | React Hook Form + Zod | Performant, type-safe validation |
61
+ | **Styling** | Tailwind CSS v4 | Utility-first, zero-runtime |
62
+ | **Components** | shadcn/ui + Base UI | Headless, accessible, customizable |
63
+ | **Animations** | GSAP | Complex, timeline-based, scroll-driven |
64
+
65
+ ### TanStack Router File-Based Type-Safe Routing
66
+
67
+ ```
68
+ src/routes/
69
+ __root.tsx # Root layout (providers, nav)
70
+ index.tsx # / — landing/home
71
+ _auth.tsx # Auth guard layout
72
+ _auth/
73
+ dashboard.tsx # /dashboard (auth required)
74
+ settings/
75
+ index.tsx # /settings
76
+ profile.tsx # /settings/profile
77
+ _public.tsx # Public layout
78
+ _public/
79
+ login.tsx # /login
80
+ ```
81
+
82
+ ```typescript
83
+ // src/routes/__root.tsx
84
+ import { createRootRouteWithContext, Outlet } from '@tanstack/react-router';
85
+ import type { QueryClient } from '@tanstack/react-query';
86
+
87
+ interface RouterContext {
88
+ queryClient: QueryClient;
89
+ auth: { user: User | null; isAuthenticated: boolean };
90
+ }
91
+
92
+ export const Route = createRootRouteWithContext<RouterContext>()({
93
+ component: () => (
94
+ <div>
95
+ <Navbar />
96
+ <Outlet />
97
+ </div>
98
+ ),
99
+ });
100
+ ```
101
+
102
+ ```typescript
103
+ // src/routes/_auth/dashboard.tsx — protected route with data preloading
104
+ import { createFileRoute, redirect } from '@tanstack/react-router';
105
+ import { workspacesQueryOptions } from '@/queries/workspaces';
106
+
107
+ export const Route = createFileRoute('/_auth/dashboard')({
108
+ // Runs before render — redirect if not authenticated
109
+ beforeLoad: ({ context }) => {
110
+ if (!context.auth.isAuthenticated) {
111
+ throw redirect({ to: '/login' });
112
+ }
113
+ },
114
+ // Prefetch data in loader — no loading state on initial render
115
+ loader: ({ context: { queryClient } }) =>
116
+ queryClient.ensureQueryData(workspacesQueryOptions()),
117
+ component: DashboardPage,
118
+ });
119
+
120
+ function DashboardPage() {
121
+ // Data is already available — no loading state
122
+ const { data: workspaces } = useSuspenseQuery(workspacesQueryOptions());
123
+ return <WorkspaceList workspaces={workspaces} />;
124
+ }
125
+ ```
126
+
127
+ ### State Management Architecture
128
+
129
+ ```
130
+ State Layers:
131
+ ┌─────────────────────────────────────┐
132
+ Server State (TanStack Query v5) │ ← API data, cached, auto-refetch
133
+ │ workspaces, users, projects, etc. │
134
+ ├─────────────────────────────────────┤
135
+ Client State (Zustand) │ ← UI state, sidebar open, theme
136
+ │ modals, filters, UI preferences │
137
+ ├─────────────────────────────────────┤
138
+ Form State (React Hook Form) │ ← Active form inputs, validation
139
+ │ Scoped to individual forms │
140
+ ├─────────────────────────────────────┤
141
+ │ URL State (TanStack Router) │ ← Shareable page state
142
+ │ search params, active tab, page # │
143
+ └─────────────────────────────────────┘
144
+ ```
145
+
146
+ ```typescript
147
+ // URL State — persist filter state in URL (shareable)
148
+ import { createFileRoute, useNavigate } from '@tanstack/react-router';
149
+ import { z } from 'zod';
150
+
151
+ const searchSchema = z.object({
152
+ page: z.number().int().positive().default(1).catch(1),
153
+ search: z.string().default('').catch(''),
154
+ status: z.enum(['all', 'active', 'archived']).default('all').catch('all'),
155
+ });
156
+
157
+ export const Route = createFileRoute('/_auth/projects')({
158
+ validateSearch: searchSchema,
159
+ component: ProjectsPage,
160
+ });
161
+
162
+ function ProjectsPage() {
163
+ const { page, search, status } = Route.useSearch();
164
+ const navigate = useNavigate({ from: Route.fullPath });
165
+
166
+ const setSearch = (q: string) =>
167
+ navigate({ search: (prev) => ({ ...prev, search: q, page: 1 }) });
168
+
169
+ return (
170
+ <div>
171
+ <SearchInput value={search} onChange={setSearch} />
172
+ <ProjectList page={page} search={search} status={status} />
173
+ </div>
174
+ );
175
+ }
176
+ ```
177
+
178
+ ### Hono RPC Decoupled Type-Safe API
179
+
180
+ ```typescript
181
+ // apps/api/src/index.ts backend Hono app
182
+ import { Hono } from 'hono';
183
+ import { zValidator } from '@hono/zod-validator';
184
+
185
+ const workspacesRoute = new Hono()
186
+ .get('/', async (c) => {
187
+ const user = c.get('user');
188
+ const workspaces = await db.workspace.findMany({
189
+ where: { members: { some: { userId: user.id } } },
190
+ });
191
+ return c.json(workspaces);
192
+ })
193
+ .post('/', zValidator('json', CreateWorkspaceSchema), async (c) => {
194
+ const data = c.req.valid('json');
195
+ const workspace = await db.workspace.create({ data });
196
+ return c.json(workspace, 201);
197
+ });
198
+
199
+ const app = new Hono()
200
+ .use('*', authMiddleware)
201
+ .route('/workspaces', workspacesRoute);
202
+
203
+ export type AppType = typeof app;
204
+ export default app;
205
+ ```
206
+
207
+ ```typescript
208
+ // apps/web/src/lib/api.ts type-safe client
209
+ import { hc } from 'hono/client';
210
+ import type { AppType } from '@myapp/api';
211
+
212
+ export const api = hc<AppType>(import.meta.env.VITE_API_URL);
213
+
214
+ // TanStack Query integration
215
+ export const workspacesQueryOptions = () =>
216
+ queryOptions({
217
+ queryKey: ['workspaces'],
218
+ queryFn: async () => {
219
+ const res = await api.workspaces.$get();
220
+ return res.json(); // Fully typed!
221
+ },
222
+ staleTime: 5 * 60 * 1000,
223
+ });
224
+ ```
225
+
226
+ ### Build & Deployment
227
+
228
+ ```typescript
229
+ // vite.config.ts
230
+ import { defineConfig } from 'vite';
231
+ import react from '@vitejs/plugin-react';
232
+ import { TanStackRouterVite } from '@tanstack/router-plugin/vite';
233
+
234
+ export default defineConfig({
235
+ plugins: [
236
+ TanStackRouterVite(), // Auto-generates route tree
237
+ react(),
238
+ ],
239
+ build: {
240
+ rollupOptions: {
241
+ output: {
242
+ manualChunks: {
243
+ 'vendor-react': ['react', 'react-dom'],
244
+ 'vendor-query': ['@tanstack/react-query'],
245
+ 'vendor-router': ['@tanstack/react-router'],
246
+ },
247
+ },
248
+ },
249
+ },
250
+ });
251
+ ```
252
+
253
+ **Deployment target**: Cloudflare Pages or Vercel for CDN-served static SPA. Backend API deployed separately to Railway/Fly.io.
254
+
255
+ ---
256
+
257
+ <a name="bahasa-indonesia"></a>
258
+ ## Bahasa Indonesia
259
+
260
+ ### Integrasi Orkestrasi
261
+ Terhubung dan mengorkestrasi skill domain yang relevan seperti `modern-web-guidance`, `brainstorming`, `zero-to-prod-orchestrator`, dan `project-context-mapper` untuk memastikan eksekusi yang kohesif.
262
+ - **MANDATORY**: Eksekusi `modern-web-guidance` PERTAMA KALI untuk semua tugas HTML/CSS dan JS sisi klien guna memastikan standar web modern.
263
+
264
+ ### Deskripsi
265
+ Panduan orkestrasi terstruktur untuk membangun Single-Page Application (SPA) modern. Mengkoordinasikan arsitektur frontend (TanStack Router, React 19, TanStack Query v5) dengan backend API terpisah (Hono RPC, tRPC). Mencakup strategi state management, pola routing, desain API layer, build tooling (Vite + TanStack Start), dan strategi deployment.
266
+
267
+ ### Kondisi Pemicu
268
+ - Membangun dashboard yang sangat interaktif, panel admin, atau aplikasi web berat data sebagai SPA.
269
+ - Memilih antara SPA vs SSR vs MPA untuk proyek baru.
270
+ - Menyiapkan client-side routing dengan **TanStack Router** (rute type-safe, loader).
271
+ - Menyusun state management: server state (TanStack Query) vs client state (Zustand/Jotai).
272
+ - Membangun frontend terpisah yang berkomunikasi dengan backend terpisah via **Hono RPC** atau tRPC.
273
+ - Men-deploy SPA ke Cloudflare Pages, Vercel, atau CDN.
274
+
275
+ ### SPA vs SSR vs MPA — Panduan Keputusan
276
+
277
+ Pilih SPA saat: aplikasi sangat interaktif (dashboard, editor, panel admin), state sisi klien yang kaya, aplikasi yang dibatasi auth (SEO bukan perhatian utama).
278
+
279
+ Pilih SSR (Next.js) saat: SEO sangat penting, load halaman awal yang cepat untuk pengguna yang tidak terautentikasi, aplikasi campuran.
280
+
281
+ Pilih MPA (Astro, Django, Laravel) saat: konten sebagian besar statis, SEO adalah perhatian utama — lihat skill `mpa-orchestrator`.
282
+
283
+ ### Stack SPA yang Direkomendasikan (2026)
284
+ Vite 6 untuk build, TanStack Router untuk routing type-safe, TanStack Query v5 untuk server state, Zustand untuk client state, Hono RPC untuk API layer type-safe, React Hook Form + Zod untuk form, Tailwind CSS v4 untuk styling, dan GSAP untuk animasi kompleks.
285
+
286
+ ### TanStack Router — Routing File-Based Type-Safe
287
+ Atur rute dalam direktori `src/routes/` dengan layout bersarang. Gunakan `createFileRoute` dengan `beforeLoad` untuk guard autentikasi, `loader` untuk prefetch data, dan `validateSearch` untuk URL state yang dapat dibagikan.
288
+
289
+ ### Arsitektur State Management
290
+ Empat lapisan state yang saling melengkapi: Server State (TanStack Query), Client State (Zustand), Form State (React Hook Form), dan URL State (TanStack Router search params).
291
+
292
+ ### Hono RPC — API Type-Safe Terpisah
293
+ Ekspor `AppType` dari backend Hono dan gunakan `hc<AppType>()` di frontend untuk panggilan API yang fully typed tanpa codegen.
294
+
295
+ ### Build & Deployment
296
+ Gunakan plugin `TanStackRouterVite` untuk auto-generate route tree. Konfigurasi `manualChunks` untuk code splitting yang optimal. Deploy SPA ke Cloudflare Pages atau Vercel; backend API ke Railway/Fly.io secara terpisah.
297
+
298
+ ---
299
+ ### 📄 Standard Pages Mandate (CRITICAL)
300
+ **MANDATORY**: Whenever you are building a new application, landing page, or website, you MUST automatically create the following standard pages:
301
+ 1. **About Page** (`/about`)
302
+ 2. **Profile Page** (`/profile`)
303
+ 3. **Contact Page** (`/contact`)
304
+ 4. **Terms of Reference / Terms of Service** (`/terms`)
305
+ 5. **Privacy Policy** (`/privacy-policy`)
306
+
307
+ These pages must be generated with standard boilerplate content that can later be customized to fit the specific application. Do not wait for the user to ask for them; they are a strict requirement for all web projects. / **WAJIB**: Otomatis buatkan halaman standar (About, Profile, Contact, Terms, Privacy Policy) pada setiap pembuatan aplikasi/website baru dengan konten boilerplate yang bisa disesuaikan nanti.