opencode-agent-kit 1.0.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.
- package/README.md +796 -0
- package/bin/commands/init.mjs +221 -0
- package/bin/init.mjs +21 -0
- package/package.json +22 -0
- package/template/.opencode/agent-docs/backend/README.md +0 -0
- package/template/.opencode/agent-docs/backend/node/BACKEND_PATTERNS.md +82 -0
- package/template/.opencode/agent-docs/backend/node/BACKEND_QUICK_START.md +49 -0
- package/template/.opencode/agent-docs/frontend/next/README.md +0 -0
- package/template/.opencode/agent-docs/frontend/nuxt/API_PATTERNS.md +807 -0
- package/template/.opencode/agent-docs/frontend/nuxt/CHEATSHEET.md +676 -0
- package/template/.opencode/agent-docs/frontend/nuxt/COMPLETION_REPORT.md +613 -0
- package/template/.opencode/agent-docs/frontend/nuxt/EXAMPLES.md +956 -0
- package/template/.opencode/agent-docs/frontend/nuxt/INDEX.md +596 -0
- package/template/.opencode/agent-docs/frontend/nuxt/MCP_GUIDE.md +881 -0
- package/template/.opencode/agent-docs/frontend/nuxt/MENTOR_CURRICULUM_30_DAYS.md +256 -0
- package/template/.opencode/agent-docs/frontend/nuxt/MENTOR_CURRICULUM_CHECKLIST.md +156 -0
- package/template/.opencode/agent-docs/frontend/nuxt/MENTOR_WEEKLY_ASSIGNMENTS.md +191 -0
- package/template/.opencode/agent-docs/frontend/nuxt/QUICK_START.md +509 -0
- package/template/.opencode/agent-docs/frontend/nuxt/README.md +506 -0
- package/template/.opencode/agent-docs/frontend/nuxt/README_AGENTS.md +140 -0
- package/template/.opencode/agent-docs/frontend/nuxt/README_DOCS.md +65 -0
- package/template/.opencode/agent-docs/frontend/nuxt/SUMMARY.md +474 -0
- package/template/.opencode/agent-docs/frontend/nuxt/TEAM_OPERATING_GUIDE.md +54 -0
- package/template/.opencode/agent-docs/frontend/nuxt/TESTING_GUIDE.md +904 -0
- package/template/.opencode/agent-docs/frontend/nuxt/WORKFLOWS.md +758 -0
- package/template/.opencode/agent-docs/frontend/react/API_PATTERNS.md +187 -0
- package/template/.opencode/agent-docs/frontend/react/CHEATSHEET.md +87 -0
- package/template/.opencode/agent-docs/frontend/react/INDEX.md +45 -0
- package/template/.opencode/agent-docs/frontend/react/QUICK_START.md +43 -0
- package/template/.opencode/agent-docs/frontend/react/README.md +159 -0
- package/template/.opencode/agent-docs/frontend/vue/README.md +0 -0
- package/template/.opencode/agent-docs/mobile/android/README.md +45 -0
- package/template/.opencode/agent-docs/mobile/flutter/README.md +44 -0
- package/template/.opencode/agents/android-developer.md +418 -0
- package/template/.opencode/agents/code-igniter-3-fullstack.md +345 -0
- package/template/.opencode/agents/code-reviewer.md +517 -0
- package/template/.opencode/agents/database-specialist.md +455 -0
- package/template/.opencode/agents/devops-specialist.md +562 -0
- package/template/.opencode/agents/flutter-developer.md +556 -0
- package/template/.opencode/agents/it-leader.md +911 -0
- package/template/.opencode/agents/laravel-advanced.md +691 -0
- package/template/.opencode/agents/node-backend-developer.md +343 -0
- package/template/.opencode/agents/nuxt-frontend-developer-mentor.md +402 -0
- package/template/.opencode/agents/nuxt-frontend-developer.md +1573 -0
- package/template/.opencode/agents/react-frontend-developer.md +1017 -0
- package/template/.opencode/agents/seo-specialist.md +681 -0
- package/template/.opencode/agents/ui-ux-designer.md +783 -0
- package/template/.opencode/commands/android-build/command.md +25 -0
- package/template/.opencode/commands/android-test/command.md +23 -0
- package/template/.opencode/commands/build-fix.md +29 -0
- package/template/.opencode/commands/checkpoint.md +74 -0
- package/template/.opencode/commands/code-review.md +40 -0
- package/template/.opencode/commands/e2e.md +363 -0
- package/template/.opencode/commands/eval.md +120 -0
- package/template/.opencode/commands/evolve.md +193 -0
- package/template/.opencode/commands/flutter-build/command.md +25 -0
- package/template/.opencode/commands/flutter-test/command.md +24 -0
- package/template/.opencode/commands/go-build.md +183 -0
- package/template/.opencode/commands/go-review.md +148 -0
- package/template/.opencode/commands/go-test.md +268 -0
- package/template/.opencode/commands/gpc-release/command.md +30 -0
- package/template/.opencode/commands/instinct-export.md +91 -0
- package/template/.opencode/commands/instinct-import.md +142 -0
- package/template/.opencode/commands/instinct-status.md +86 -0
- package/template/.opencode/commands/learn.md +70 -0
- package/template/.opencode/commands/multi-backend.md +158 -0
- package/template/.opencode/commands/multi-execute.md +310 -0
- package/template/.opencode/commands/multi-frontend.md +158 -0
- package/template/.opencode/commands/multi-plan.md +261 -0
- package/template/.opencode/commands/multi-workflow.md +183 -0
- package/template/.opencode/commands/orchestrate.md +172 -0
- package/template/.opencode/commands/plan.md +113 -0
- package/template/.opencode/commands/pm2.md +271 -0
- package/template/.opencode/commands/python-review.md +297 -0
- package/template/.opencode/commands/refactor-clean.md +28 -0
- package/template/.opencode/commands/sessions.md +305 -0
- package/template/.opencode/commands/setup-pm.md +80 -0
- package/template/.opencode/commands/skill-create.md +174 -0
- package/template/.opencode/commands/tdd.md +326 -0
- package/template/.opencode/commands/test-coverage.md +27 -0
- package/template/.opencode/commands/update-codemaps.md +17 -0
- package/template/.opencode/commands/update-docs.md +31 -0
- package/template/.opencode/commands/verify.md +59 -0
- package/template/.opencode/config.example.json +309 -0
- package/template/.opencode/config.json +341 -0
- package/template/.opencode/contexts/dev.md +20 -0
- package/template/.opencode/contexts/research.md +26 -0
- package/template/.opencode/contexts/review.md +22 -0
- package/template/.opencode/hooks/hooks.json +169 -0
- package/template/.opencode/instructions/INSTRUCTIONS.md +388 -0
- package/template/.opencode/package.json +5 -0
- package/template/.opencode/rules/README.md +82 -0
- package/template/.opencode/rules/android/gradle.md +62 -0
- package/template/.opencode/rules/android/testing.md +27 -0
- package/template/.opencode/rules/common/agents.md +49 -0
- package/template/.opencode/rules/common/coding-style.md +48 -0
- package/template/.opencode/rules/common/git-workflow.md +45 -0
- package/template/.opencode/rules/common/hooks.md +30 -0
- package/template/.opencode/rules/common/patterns.md +31 -0
- package/template/.opencode/rules/common/performance.md +55 -0
- package/template/.opencode/rules/common/security.md +29 -0
- package/template/.opencode/rules/common/testing.md +29 -0
- package/template/.opencode/rules/flutter/state-management.md +57 -0
- package/template/.opencode/rules/flutter/testing.md +42 -0
- package/template/.opencode/rules/golang/coding-style.md +26 -0
- package/template/.opencode/rules/golang/hooks.md +11 -0
- package/template/.opencode/rules/golang/patterns.md +39 -0
- package/template/.opencode/rules/golang/security.md +28 -0
- package/template/.opencode/rules/golang/testing.md +25 -0
- package/template/.opencode/rules/mobile/performance.md +36 -0
- package/template/.opencode/rules/python/coding-style.md +37 -0
- package/template/.opencode/rules/python/hooks.md +14 -0
- package/template/.opencode/rules/python/patterns.md +34 -0
- package/template/.opencode/rules/python/security.md +25 -0
- package/template/.opencode/rules/python/testing.md +33 -0
- package/template/.opencode/rules/typescript/coding-style.md +58 -0
- package/template/.opencode/rules/typescript/hooks.md +15 -0
- package/template/.opencode/rules/typescript/patterns.md +45 -0
- package/template/.opencode/rules/typescript/security.md +21 -0
- package/template/.opencode/rules/typescript/testing.md +11 -0
- package/template/.opencode/skills/api-documentation/SKILL.md +188 -0
- package/template/.opencode/skills/backend-patterns/SKILL.md +587 -0
- package/template/.opencode/skills/building-components/SKILL.md +37 -0
- package/template/.opencode/skills/building-components/references/accessibility.mdx +819 -0
- package/template/.opencode/skills/building-components/references/as-child.mdx +324 -0
- package/template/.opencode/skills/building-components/references/composition.mdx +239 -0
- package/template/.opencode/skills/building-components/references/data-attributes.mdx +413 -0
- package/template/.opencode/skills/building-components/references/definitions.mdx +258 -0
- package/template/.opencode/skills/building-components/references/design-tokens.mdx +57 -0
- package/template/.opencode/skills/building-components/references/docs.mdx +155 -0
- package/template/.opencode/skills/building-components/references/marketplaces.mdx +144 -0
- package/template/.opencode/skills/building-components/references/npm.mdx +166 -0
- package/template/.opencode/skills/building-components/references/polymorphism.mdx +583 -0
- package/template/.opencode/skills/building-components/references/principles.mdx +61 -0
- package/template/.opencode/skills/building-components/references/registry.mdx +169 -0
- package/template/.opencode/skills/building-components/references/state.mdx +99 -0
- package/template/.opencode/skills/building-components/references/styling.mdx +286 -0
- package/template/.opencode/skills/building-components/references/types.mdx +191 -0
- package/template/.opencode/skills/clickhouse-io/SKILL.md +429 -0
- package/template/.opencode/skills/coding-standards/SKILL.md +520 -0
- package/template/.opencode/skills/configure-ecc/SKILL.md +298 -0
- package/template/.opencode/skills/continuous-learning/SKILL.md +110 -0
- package/template/.opencode/skills/continuous-learning/config.json +18 -0
- package/template/.opencode/skills/continuous-learning/evaluate-session.sh +60 -0
- package/template/.opencode/skills/continuous-learning-v2/SKILL.md +284 -0
- package/template/.opencode/skills/continuous-learning-v2/agents/observer.md +137 -0
- package/template/.opencode/skills/continuous-learning-v2/agents/start-observer.sh +134 -0
- package/template/.opencode/skills/continuous-learning-v2/config.json +41 -0
- package/template/.opencode/skills/continuous-learning-v2/hooks/observe.sh +153 -0
- package/template/.opencode/skills/continuous-learning-v2/scripts/instinct-cli.py +489 -0
- package/template/.opencode/skills/continuous-learning-v2/scripts/test_parse_instinct.py +82 -0
- package/template/.opencode/skills/dart-add-unit-test/SKILL.md +122 -0
- package/template/.opencode/skills/dart-build-cli-app/SKILL.md +185 -0
- package/template/.opencode/skills/dart-collect-coverage/SKILL.md +141 -0
- package/template/.opencode/skills/dart-fix-runtime-errors/SKILL.md +166 -0
- package/template/.opencode/skills/dart-generate-test-mocks/SKILL.md +155 -0
- package/template/.opencode/skills/dart-migrate-to-checks-package/SKILL.md +126 -0
- package/template/.opencode/skills/dart-resolve-package-conflicts/SKILL.md +116 -0
- package/template/.opencode/skills/dart-run-static-analysis/SKILL.md +104 -0
- package/template/.opencode/skills/dart-use-pattern-matching/SKILL.md +146 -0
- package/template/.opencode/skills/django-patterns/SKILL.md +733 -0
- package/template/.opencode/skills/django-security/SKILL.md +592 -0
- package/template/.opencode/skills/django-tdd/SKILL.md +728 -0
- package/template/.opencode/skills/django-verification/SKILL.md +460 -0
- package/template/.opencode/skills/eval-harness/SKILL.md +227 -0
- package/template/.opencode/skills/firebase-basics/SKILL.md +103 -0
- package/template/.opencode/skills/firebase-basics/references/additional-skills.md +113 -0
- package/template/.opencode/skills/firebase-basics/references/cli-usage.md +31 -0
- package/template/.opencode/skills/firebase-basics/references/client-library-usage.md +45 -0
- package/template/.opencode/skills/firebase-basics/references/core-concepts.md +61 -0
- package/template/.opencode/skills/firebase-basics/references/iac-usage.md +40 -0
- package/template/.opencode/skills/firebase-basics/references/iam-security.md +74 -0
- package/template/.opencode/skills/firebase-basics/references/mcp-usage.md +63 -0
- package/template/.opencode/skills/flutter/SKILL.md +292 -0
- package/template/.opencode/skills/flutter-add-integration-test/SKILL.md +163 -0
- package/template/.opencode/skills/flutter-add-widget-preview/SKILL.md +145 -0
- package/template/.opencode/skills/flutter-add-widget-test/SKILL.md +154 -0
- package/template/.opencode/skills/flutter-apply-architecture-best-practices/SKILL.md +162 -0
- package/template/.opencode/skills/flutter-build-responsive-layout/SKILL.md +139 -0
- package/template/.opencode/skills/flutter-fix-layout-issues/SKILL.md +130 -0
- package/template/.opencode/skills/flutter-implement-json-serialization/SKILL.md +153 -0
- package/template/.opencode/skills/flutter-setup-declarative-routing/SKILL.md +255 -0
- package/template/.opencode/skills/flutter-setup-localization/SKILL.md +210 -0
- package/template/.opencode/skills/flutter-use-http-package/SKILL.md +174 -0
- package/template/.opencode/skills/frontend-design/SKILL.md +89 -0
- package/template/.opencode/skills/frontend-patterns/SKILL.md +631 -0
- package/template/.opencode/skills/golang-patterns/SKILL.md +673 -0
- package/template/.opencode/skills/golang-testing/SKILL.md +719 -0
- package/template/.opencode/skills/impeccable/SKILL.md +165 -0
- package/template/.opencode/skills/impeccable/agents/impeccable-asset-producer.md +101 -0
- package/template/.opencode/skills/impeccable/reference/adapt.md +190 -0
- package/template/.opencode/skills/impeccable/reference/animate.md +175 -0
- package/template/.opencode/skills/impeccable/reference/audit.md +133 -0
- package/template/.opencode/skills/impeccable/reference/bolder.md +113 -0
- package/template/.opencode/skills/impeccable/reference/brand.md +118 -0
- package/template/.opencode/skills/impeccable/reference/clarify.md +174 -0
- package/template/.opencode/skills/impeccable/reference/codex.md +105 -0
- package/template/.opencode/skills/impeccable/reference/cognitive-load.md +106 -0
- package/template/.opencode/skills/impeccable/reference/color-and-contrast.md +105 -0
- package/template/.opencode/skills/impeccable/reference/colorize.md +154 -0
- package/template/.opencode/skills/impeccable/reference/craft.md +123 -0
- package/template/.opencode/skills/impeccable/reference/critique.md +273 -0
- package/template/.opencode/skills/impeccable/reference/delight.md +302 -0
- package/template/.opencode/skills/impeccable/reference/distill.md +111 -0
- package/template/.opencode/skills/impeccable/reference/document.md +427 -0
- package/template/.opencode/skills/impeccable/reference/extract.md +69 -0
- package/template/.opencode/skills/impeccable/reference/harden.md +347 -0
- package/template/.opencode/skills/impeccable/reference/heuristics-scoring.md +234 -0
- package/template/.opencode/skills/impeccable/reference/interaction-design.md +195 -0
- package/template/.opencode/skills/impeccable/reference/layout.md +141 -0
- package/template/.opencode/skills/impeccable/reference/live.md +622 -0
- package/template/.opencode/skills/impeccable/reference/motion-design.md +109 -0
- package/template/.opencode/skills/impeccable/reference/onboard.md +234 -0
- package/template/.opencode/skills/impeccable/reference/optimize.md +258 -0
- package/template/.opencode/skills/impeccable/reference/overdrive.md +130 -0
- package/template/.opencode/skills/impeccable/reference/personas.md +179 -0
- package/template/.opencode/skills/impeccable/reference/polish.md +242 -0
- package/template/.opencode/skills/impeccable/reference/product.md +62 -0
- package/template/.opencode/skills/impeccable/reference/quieter.md +99 -0
- package/template/.opencode/skills/impeccable/reference/responsive-design.md +114 -0
- package/template/.opencode/skills/impeccable/reference/shape.md +165 -0
- package/template/.opencode/skills/impeccable/reference/spatial-design.md +100 -0
- package/template/.opencode/skills/impeccable/reference/teach.md +156 -0
- package/template/.opencode/skills/impeccable/reference/typeset.md +124 -0
- package/template/.opencode/skills/impeccable/reference/typography.md +159 -0
- package/template/.opencode/skills/impeccable/reference/ux-writing.md +107 -0
- package/template/.opencode/skills/impeccable/scripts/cleanup-deprecated.mjs +284 -0
- package/template/.opencode/skills/impeccable/scripts/command-metadata.json +94 -0
- package/template/.opencode/skills/impeccable/scripts/critique-storage.mjs +242 -0
- package/template/.opencode/skills/impeccable/scripts/design-parser.mjs +820 -0
- package/template/.opencode/skills/impeccable/scripts/detect-csp.mjs +198 -0
- package/template/.opencode/skills/impeccable/scripts/detect.mjs +21 -0
- package/template/.opencode/skills/impeccable/scripts/impeccable-paths.mjs +110 -0
- package/template/.opencode/skills/impeccable/scripts/is-generated.mjs +69 -0
- package/template/.opencode/skills/impeccable/scripts/live-accept.mjs +595 -0
- package/template/.opencode/skills/impeccable/scripts/live-browser-session.js +123 -0
- package/template/.opencode/skills/impeccable/scripts/live-browser.js +4860 -0
- package/template/.opencode/skills/impeccable/scripts/live-complete.mjs +75 -0
- package/template/.opencode/skills/impeccable/scripts/live-completion.mjs +18 -0
- package/template/.opencode/skills/impeccable/scripts/live-inject.mjs +446 -0
- package/template/.opencode/skills/impeccable/scripts/live-poll.mjs +200 -0
- package/template/.opencode/skills/impeccable/scripts/live-resume.mjs +48 -0
- package/template/.opencode/skills/impeccable/scripts/live-server.mjs +838 -0
- package/template/.opencode/skills/impeccable/scripts/live-session-store.mjs +254 -0
- package/template/.opencode/skills/impeccable/scripts/live-status.mjs +47 -0
- package/template/.opencode/skills/impeccable/scripts/live-wrap.mjs +632 -0
- package/template/.opencode/skills/impeccable/scripts/live.mjs +247 -0
- package/template/.opencode/skills/impeccable/scripts/load-context.mjs +141 -0
- package/template/.opencode/skills/impeccable/scripts/modern-screenshot.umd.js +14 -0
- package/template/.opencode/skills/impeccable/scripts/pin.mjs +214 -0
- package/template/.opencode/skills/iterative-retrieval/SKILL.md +202 -0
- package/template/.opencode/skills/java-coding-standards/SKILL.md +138 -0
- package/template/.opencode/skills/jetpack-compose/.skillfish.json +10 -0
- package/template/.opencode/skills/jetpack-compose/SKILL.md +420 -0
- package/template/.opencode/skills/jpa-patterns/SKILL.md +141 -0
- package/template/.opencode/skills/nutrient-document-processing/SKILL.md +165 -0
- package/template/.opencode/skills/nuxt-ui/SKILL.md +334 -0
- package/template/.opencode/skills/nuxt-ui/references/components.md +377 -0
- package/template/.opencode/skills/nuxt-ui/references/composables.md +127 -0
- package/template/.opencode/skills/nuxt-ui/references/layouts/chat.md +266 -0
- package/template/.opencode/skills/nuxt-ui/references/layouts/dashboard.md +220 -0
- package/template/.opencode/skills/nuxt-ui/references/layouts/docs.md +141 -0
- package/template/.opencode/skills/nuxt-ui/references/layouts/editor.md +168 -0
- package/template/.opencode/skills/nuxt-ui/references/layouts/page.md +260 -0
- package/template/.opencode/skills/nuxt-ui/references/theming.md +427 -0
- package/template/.opencode/skills/postgres-patterns/SKILL.md +146 -0
- package/template/.opencode/skills/project-guidelines-example/SKILL.md +345 -0
- package/template/.opencode/skills/python-patterns/SKILL.md +749 -0
- package/template/.opencode/skills/python-testing/SKILL.md +815 -0
- package/template/.opencode/skills/security-review/SKILL.md +494 -0
- package/template/.opencode/skills/security-review/cloud-infrastructure-security.md +361 -0
- package/template/.opencode/skills/shadcn-ui/README.md +248 -0
- package/template/.opencode/skills/shadcn-ui/SKILL.md +326 -0
- package/template/.opencode/skills/shadcn-ui/examples/auth-layout.tsx +177 -0
- package/template/.opencode/skills/shadcn-ui/examples/data-table.tsx +313 -0
- package/template/.opencode/skills/shadcn-ui/examples/form-pattern.tsx +177 -0
- package/template/.opencode/skills/shadcn-ui/resources/component-catalog.md +481 -0
- package/template/.opencode/skills/shadcn-ui/resources/customization-guide.md +516 -0
- package/template/.opencode/skills/shadcn-ui/resources/migration-guide.md +463 -0
- package/template/.opencode/skills/shadcn-ui/resources/setup-guide.md +412 -0
- package/template/.opencode/skills/shadcn-ui/scripts/verify-setup.sh +134 -0
- package/template/.opencode/skills/springboot-patterns/SKILL.md +304 -0
- package/template/.opencode/skills/springboot-security/SKILL.md +119 -0
- package/template/.opencode/skills/springboot-tdd/SKILL.md +157 -0
- package/template/.opencode/skills/springboot-verification/SKILL.md +100 -0
- package/template/.opencode/skills/strategic-compact/SKILL.md +63 -0
- package/template/.opencode/skills/strategic-compact/suggest-compact.sh +52 -0
- package/template/.opencode/skills/tdd-workflow/SKILL.md +409 -0
- package/template/.opencode/skills/vercel-composition-patterns/AGENTS.md +946 -0
- package/template/.opencode/skills/vercel-composition-patterns/SKILL.md +89 -0
- package/template/.opencode/skills/vercel-composition-patterns/rules/architecture-avoid-boolean-props.md +100 -0
- package/template/.opencode/skills/vercel-composition-patterns/rules/architecture-compound-components.md +112 -0
- package/template/.opencode/skills/vercel-composition-patterns/rules/patterns-children-over-render-props.md +87 -0
- package/template/.opencode/skills/vercel-composition-patterns/rules/patterns-explicit-variants.md +100 -0
- package/template/.opencode/skills/vercel-composition-patterns/rules/react19-no-forwardref.md +42 -0
- package/template/.opencode/skills/vercel-composition-patterns/rules/state-context-interface.md +191 -0
- package/template/.opencode/skills/vercel-composition-patterns/rules/state-decouple-implementation.md +113 -0
- package/template/.opencode/skills/vercel-composition-patterns/rules/state-lift-state.md +125 -0
- package/template/.opencode/skills/vercel-react-best-practices/AGENTS.md +2934 -0
- package/template/.opencode/skills/vercel-react-best-practices/SKILL.md +136 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/advanced-event-handler-refs.md +55 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/advanced-init-once.md +42 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/advanced-use-latest.md +39 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/async-api-routes.md +38 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/async-defer-await.md +80 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/async-dependencies.md +51 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/async-parallel.md +28 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/async-suspense-boundaries.md +99 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/bundle-barrel-imports.md +59 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/bundle-conditional.md +31 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/bundle-defer-third-party.md +49 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/bundle-dynamic-imports.md +35 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/bundle-preload.md +50 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/client-event-listeners.md +74 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/client-localstorage-schema.md +71 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/client-passive-event-listeners.md +48 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/client-swr-dedup.md +56 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/js-batch-dom-css.md +107 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/js-cache-function-results.md +80 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/js-cache-property-access.md +28 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/js-cache-storage.md +70 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/js-combine-iterations.md +32 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/js-early-exit.md +50 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/js-hoist-regexp.md +45 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/js-index-maps.md +37 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/js-length-check-first.md +49 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/js-min-max-loop.md +82 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/js-set-map-lookups.md +24 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/js-tosorted-immutable.md +57 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/rendering-activity.md +26 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/rendering-conditional-render.md +40 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/rendering-content-visibility.md +38 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/rendering-hoist-jsx.md +46 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/rendering-hydration-suppress-warning.md +30 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/rendering-svg-precision.md +28 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/rendering-usetransition-loading.md +75 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/rerender-defer-reads.md +39 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/rerender-dependencies.md +45 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/rerender-derived-state-no-effect.md +40 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/rerender-derived-state.md +29 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/rerender-functional-setstate.md +74 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/rerender-lazy-state-init.md +58 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/rerender-memo-with-default-value.md +38 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/rerender-memo.md +44 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/rerender-move-effect-to-event.md +45 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/rerender-simple-expression-in-memo.md +35 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/rerender-transitions.md +40 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/rerender-use-ref-transient-values.md +73 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/server-after-nonblocking.md +73 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/server-auth-actions.md +96 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/server-cache-lru.md +41 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/server-cache-react.md +76 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/server-dedup-props.md +65 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/server-parallel-fetching.md +83 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/server-serialization.md +38 -0
- package/template/.opencode/skills/verification-loop/SKILL.md +120 -0
- package/template/.opencode/skills/web-design-guidelines/SKILL.md +39 -0
- package/template/AGENTS.md +32 -0
- package/template/opencode.json +354 -0
|
@@ -0,0 +1,758 @@
|
|
|
1
|
+
# Frontend Developer Agent - Example Workflows
|
|
2
|
+
|
|
3
|
+
Contoh-contoh workflow konkret untuk berbagai skenario development.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 🎨 Workflow 1: Membuat Component Library
|
|
8
|
+
|
|
9
|
+
### Scenario
|
|
10
|
+
|
|
11
|
+
Anda ingin membuat design system dengan reusable components.
|
|
12
|
+
|
|
13
|
+
### Step-by-step
|
|
14
|
+
|
|
15
|
+
**Step 1: Inisialisasi**
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
@frontend-developer Kita akan buat component library untuk project ini.
|
|
19
|
+
Framework: Nuxt 4 + TypeScript
|
|
20
|
+
Design system: Custom dengan Tailwind CSS
|
|
21
|
+
Components yang dibutuhkan:
|
|
22
|
+
- Button (5 variants, 3 sizes)
|
|
23
|
+
- Input (text, email, password, search)
|
|
24
|
+
- Card (dengan header, body, footer slots)
|
|
25
|
+
- Modal (dengan backdrop, close button)
|
|
26
|
+
- Dropdown (dengan keyboard navigation)
|
|
27
|
+
|
|
28
|
+
Load skill `building-components` dan buatkan structure folder yang optimal.
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
**Step 2: Design Tokens**
|
|
32
|
+
|
|
33
|
+
```
|
|
34
|
+
@frontend-developer Sebelum buat components, define design tokens dulu:
|
|
35
|
+
|
|
36
|
+
Colors:
|
|
37
|
+
- Primary: Blue (#3b82f6)
|
|
38
|
+
- Secondary: Purple (#8b5cf6)
|
|
39
|
+
- Success: Green (#10b981)
|
|
40
|
+
- Error: Red (#ef4444)
|
|
41
|
+
- Warning: Yellow (#f59e0b)
|
|
42
|
+
|
|
43
|
+
Typography:
|
|
44
|
+
- Display: "Space Grotesk"
|
|
45
|
+
- Body: "Inter"
|
|
46
|
+
|
|
47
|
+
Spacing scale: 4px base (4, 8, 12, 16, 24, 32, 48, 64)
|
|
48
|
+
|
|
49
|
+
Buat CSS variables di app/assets/styles/design-tokens.css
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
**Step 3: Component Creation**
|
|
53
|
+
|
|
54
|
+
```
|
|
55
|
+
@frontend-developer Buat Button component di app/components/ui/Button.vue dengan:
|
|
56
|
+
|
|
57
|
+
Props:
|
|
58
|
+
- variant: 'primary' | 'secondary' | 'success' | 'error' | 'ghost'
|
|
59
|
+
- size: 'sm' | 'md' | 'lg'
|
|
60
|
+
- disabled: boolean
|
|
61
|
+
- loading: boolean
|
|
62
|
+
- fullWidth: boolean
|
|
63
|
+
- leftIcon: Component (optional)
|
|
64
|
+
- rightIcon: Component (optional)
|
|
65
|
+
|
|
66
|
+
Features:
|
|
67
|
+
- Ripple effect on click
|
|
68
|
+
- Focus visible state
|
|
69
|
+
- Loading spinner
|
|
70
|
+
- Disabled state dengan opacity
|
|
71
|
+
- Accessible (ARIA labels, keyboard support)
|
|
72
|
+
|
|
73
|
+
Gunakan design tokens yang sudah dibuat.
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
**Step 4: Documentation**
|
|
77
|
+
|
|
78
|
+
```
|
|
79
|
+
@frontend-developer Buat storybook-style documentation di:
|
|
80
|
+
app/pages/components/button.vue
|
|
81
|
+
|
|
82
|
+
Include:
|
|
83
|
+
- All variants showcase
|
|
84
|
+
- All sizes showcase
|
|
85
|
+
- Interactive playground
|
|
86
|
+
- Props table
|
|
87
|
+
- Code examples
|
|
88
|
+
- Accessibility notes
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
## ⚡ Workflow 2: Performance Optimization
|
|
94
|
+
|
|
95
|
+
### Scenario
|
|
96
|
+
|
|
97
|
+
Dashboard dengan 500+ items terasa lambat saat scroll dan filter.
|
|
98
|
+
|
|
99
|
+
### Step-by-step
|
|
100
|
+
|
|
101
|
+
**Step 1: Performance Audit**
|
|
102
|
+
|
|
103
|
+
```
|
|
104
|
+
@frontend-developer Load skill `frontend-patterns` dan analyze:
|
|
105
|
+
|
|
106
|
+
Files:
|
|
107
|
+
- app/pages/dashboard.vue
|
|
108
|
+
- app/components/MarketList.vue
|
|
109
|
+
- app/components/MarketCard.vue
|
|
110
|
+
|
|
111
|
+
Cari:
|
|
112
|
+
- Unnecessary re-renders
|
|
113
|
+
- Missing memoization
|
|
114
|
+
- Large bundle imports
|
|
115
|
+
- N+1 rendering patterns
|
|
116
|
+
- Unoptimized data fetching
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
**Step 2: Implement Virtualization**
|
|
120
|
+
|
|
121
|
+
```
|
|
122
|
+
@frontend-developer MarketList render 500+ items. Implement virtualization:
|
|
123
|
+
|
|
124
|
+
- Gunakan @tanstack/vue-virtual atau library serupa
|
|
125
|
+
- Hanya render visible items + overscan
|
|
126
|
+
- Maintain scroll position
|
|
127
|
+
- Support dynamic heights
|
|
128
|
+
- Preserve keyboard navigation
|
|
129
|
+
|
|
130
|
+
Update app/components/MarketList.vue
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
**Step 3: Optimize Re-renders**
|
|
134
|
+
|
|
135
|
+
```
|
|
136
|
+
@frontend-developer Optimize re-renders di MarketCard:
|
|
137
|
+
|
|
138
|
+
Current issue: Every card re-renders saat user filter/sort
|
|
139
|
+
|
|
140
|
+
Solutions:
|
|
141
|
+
- Isolate expensive subcomponents and pass minimal reactive props
|
|
142
|
+
- Stabilize data flow with computed values and avoid unnecessary watchers
|
|
143
|
+
- Move filter logic to parent
|
|
144
|
+
- Use key prop correctly
|
|
145
|
+
|
|
146
|
+
Implement changes.
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
**Step 4: Bundle Optimization**
|
|
150
|
+
|
|
151
|
+
```
|
|
152
|
+
@frontend-developer Analyze bundle dan optimize:
|
|
153
|
+
|
|
154
|
+
1. Check import statements - avoid barrel imports
|
|
155
|
+
2. Lazy load heavy components (charts, editors)
|
|
156
|
+
3. Code split routes
|
|
157
|
+
4. Defer non-critical third-party scripts
|
|
158
|
+
|
|
159
|
+
Generate bundle analysis report dan implement optimizations.
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
**Step 5: Data Fetching**
|
|
163
|
+
|
|
164
|
+
```
|
|
165
|
+
@frontend-developer Optimize data fetching pattern:
|
|
166
|
+
|
|
167
|
+
Current: Sequential fetches causing waterfall
|
|
168
|
+
New: Parallel fetches dengan Promise.all
|
|
169
|
+
|
|
170
|
+
Also implement:
|
|
171
|
+
- Request deduplication dengan useSWR
|
|
172
|
+
- Optimistic updates
|
|
173
|
+
- Stale-while-revalidate
|
|
174
|
+
- Proper error boundaries
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
---
|
|
178
|
+
|
|
179
|
+
## 🎯 Workflow 3: Implementasi Design Figma
|
|
180
|
+
|
|
181
|
+
### Scenario
|
|
182
|
+
|
|
183
|
+
Designer memberikan Figma file untuk landing page baru.
|
|
184
|
+
|
|
185
|
+
### Step-by-step
|
|
186
|
+
|
|
187
|
+
**Step 1: Design Analysis**
|
|
188
|
+
|
|
189
|
+
```
|
|
190
|
+
@frontend-developer Analyze Figma design (attach screenshot atau link):
|
|
191
|
+
|
|
192
|
+
[Drag & drop Figma screenshot ke terminal]
|
|
193
|
+
|
|
194
|
+
Identify:
|
|
195
|
+
- Color palette dan typography
|
|
196
|
+
- Spacing system
|
|
197
|
+
- Component patterns
|
|
198
|
+
- Animation opportunities
|
|
199
|
+
- Responsive breakpoints
|
|
200
|
+
|
|
201
|
+
Load skill `frontend-design` untuk aesthetic analysis.
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
**Step 2: Setup Structure**
|
|
205
|
+
|
|
206
|
+
```
|
|
207
|
+
@frontend-developer Based on design, setup page structure:
|
|
208
|
+
|
|
209
|
+
Create:
|
|
210
|
+
- app/pages/landing.vue (main page)
|
|
211
|
+
- app/components/landing/Hero.vue
|
|
212
|
+
- app/components/landing/Features.vue
|
|
213
|
+
- app/components/landing/Testimonials.vue
|
|
214
|
+
- app/components/landing/CTA.vue
|
|
215
|
+
- app/components/landing/Footer.vue
|
|
216
|
+
|
|
217
|
+
Extract design tokens ke CSS variables.
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
**Step 3: Implement Hero Section**
|
|
221
|
+
|
|
222
|
+
```
|
|
223
|
+
@frontend-developer Implement Hero section dengan:
|
|
224
|
+
|
|
225
|
+
Layout:
|
|
226
|
+
- Full viewport height
|
|
227
|
+
- Text left, visual right (desktop)
|
|
228
|
+
- Stacked (mobile)
|
|
229
|
+
|
|
230
|
+
Typography:
|
|
231
|
+
- H1: 72px bold dengan gradient text
|
|
232
|
+
- Subtitle: 24px regular
|
|
233
|
+
- CTA buttons: Primary + Secondary
|
|
234
|
+
|
|
235
|
+
Animations:
|
|
236
|
+
- Text fade-in from bottom (stagger 100ms)
|
|
237
|
+
- Visual fade-in from right
|
|
238
|
+
- Parallax background effect
|
|
239
|
+
- Smooth scroll to sections
|
|
240
|
+
|
|
241
|
+
Ensure responsive dan accessible.
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
**Step 4: Interactive Elements**
|
|
245
|
+
|
|
246
|
+
```
|
|
247
|
+
@frontend-developer Add micro-interactions:
|
|
248
|
+
|
|
249
|
+
Buttons:
|
|
250
|
+
- Hover: Scale 1.05 + shadow increase
|
|
251
|
+
- Active: Scale 0.98
|
|
252
|
+
- Ripple effect on click
|
|
253
|
+
|
|
254
|
+
Cards:
|
|
255
|
+
- Hover: Lift effect (translate + shadow)
|
|
256
|
+
- Focus: Visible outline
|
|
257
|
+
- Tilt on mouse move (subtle 3D effect)
|
|
258
|
+
|
|
259
|
+
Navigation:
|
|
260
|
+
- Sticky header on scroll
|
|
261
|
+
- Active section indicator
|
|
262
|
+
- Smooth scroll to anchors
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
**Step 5: Performance Check**
|
|
266
|
+
|
|
267
|
+
```
|
|
268
|
+
@frontend-developer Before shipping, verify:
|
|
269
|
+
|
|
270
|
+
✓ Images optimized (use <NuxtImg>)
|
|
271
|
+
✓ Fonts preloaded
|
|
272
|
+
✓ Animations use transform/opacity only
|
|
273
|
+
✓ No layout shift (CLS)
|
|
274
|
+
✓ Lazy load below-fold content
|
|
275
|
+
✓ Critical CSS inlined
|
|
276
|
+
|
|
277
|
+
Run Lighthouse audit dan fix issues.
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
---
|
|
281
|
+
|
|
282
|
+
## 🔐 Workflow 4: Form dengan Validation
|
|
283
|
+
|
|
284
|
+
### Scenario
|
|
285
|
+
|
|
286
|
+
Complex form untuk create market prediction.
|
|
287
|
+
|
|
288
|
+
### Step-by-step
|
|
289
|
+
|
|
290
|
+
**Step 1: Schema Definition**
|
|
291
|
+
|
|
292
|
+
```
|
|
293
|
+
@frontend-developer Setup form validation dengan Zod:
|
|
294
|
+
|
|
295
|
+
Fields:
|
|
296
|
+
- title: string (required, 5-200 chars)
|
|
297
|
+
- description: string (required, 20-2000 chars)
|
|
298
|
+
- category: enum (required, dari predefined list)
|
|
299
|
+
- endDate: datetime (required, future date)
|
|
300
|
+
- options: array of strings (min 2, max 10 options)
|
|
301
|
+
- tags: array of strings (optional, max 5)
|
|
302
|
+
|
|
303
|
+
Create schema di app/schemas/market.schema.ts
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
**Step 2: Form Component**
|
|
307
|
+
|
|
308
|
+
```
|
|
309
|
+
@frontend-developer Build form di app/components/forms/CreateMarketForm.vue:
|
|
310
|
+
|
|
311
|
+
Features:
|
|
312
|
+
- Real-time validation (onChange)
|
|
313
|
+
- Error messages below each field
|
|
314
|
+
- Submit disabled until valid
|
|
315
|
+
- Loading state during submission
|
|
316
|
+
- Success/error toast notifications
|
|
317
|
+
|
|
318
|
+
Use Nuxt UI form components sebagai base.
|
|
319
|
+
Load skill `security-review` untuk validation best practices.
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
**Step 3: Field Components**
|
|
323
|
+
|
|
324
|
+
```
|
|
325
|
+
@frontend-developer Create custom field components:
|
|
326
|
+
|
|
327
|
+
1. TextInput.vue
|
|
328
|
+
- Label + input + error message
|
|
329
|
+
- Character counter
|
|
330
|
+
- Helper text support
|
|
331
|
+
- Icon support (left/right)
|
|
332
|
+
|
|
333
|
+
2. SelectInput.vue
|
|
334
|
+
- Custom styled select
|
|
335
|
+
- Search functionality
|
|
336
|
+
- Keyboard navigation
|
|
337
|
+
- Multiple selection support
|
|
338
|
+
|
|
339
|
+
3. DateTimePicker.vue
|
|
340
|
+
- Calendar popup
|
|
341
|
+
- Time picker
|
|
342
|
+
- Min/max date constraints
|
|
343
|
+
- Timezone aware
|
|
344
|
+
|
|
345
|
+
4. TagInput.vue
|
|
346
|
+
- Add tags with Enter
|
|
347
|
+
- Remove tags with backspace
|
|
348
|
+
- Max tags limit
|
|
349
|
+
- Duplicate prevention
|
|
350
|
+
```
|
|
351
|
+
|
|
352
|
+
**Step 4: Submit Handler**
|
|
353
|
+
|
|
354
|
+
```
|
|
355
|
+
@frontend-developer Implement submit logic:
|
|
356
|
+
|
|
357
|
+
async function handleSubmit() {
|
|
358
|
+
// 1. Validate form
|
|
359
|
+
const validated = await schema.parseAsync(formData)
|
|
360
|
+
|
|
361
|
+
// 2. Optimistic update
|
|
362
|
+
addMarketOptimistic(validated)
|
|
363
|
+
|
|
364
|
+
// 3. API call
|
|
365
|
+
try {
|
|
366
|
+
const result = await $fetch('/api/markets', {
|
|
367
|
+
method: 'POST',
|
|
368
|
+
body: validated
|
|
369
|
+
})
|
|
370
|
+
|
|
371
|
+
// 4. Success handling
|
|
372
|
+
toast.success('Market created!')
|
|
373
|
+
router.push(`/markets/${result.id}`)
|
|
374
|
+
|
|
375
|
+
} catch (error) {
|
|
376
|
+
// 5. Error handling
|
|
377
|
+
revertOptimisticUpdate()
|
|
378
|
+
handleApiError(error)
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
Include proper error handling dan loading states.
|
|
383
|
+
```
|
|
384
|
+
|
|
385
|
+
**Step 5: Accessibility**
|
|
386
|
+
|
|
387
|
+
```
|
|
388
|
+
@frontend-developer Ensure form accessibility:
|
|
389
|
+
|
|
390
|
+
✓ All inputs have labels
|
|
391
|
+
✓ Error messages associated with inputs (aria-describedby)
|
|
392
|
+
✓ Focus management (focus first error on submit)
|
|
393
|
+
✓ Keyboard navigation works
|
|
394
|
+
✓ Screen reader announcements
|
|
395
|
+
✓ Required fields marked (aria-required)
|
|
396
|
+
✓ Fieldset for related inputs
|
|
397
|
+
|
|
398
|
+
Test dengan keyboard only dan screen reader.
|
|
399
|
+
```
|
|
400
|
+
|
|
401
|
+
---
|
|
402
|
+
|
|
403
|
+
## 🧪 Workflow 5: Testing Integration
|
|
404
|
+
|
|
405
|
+
### Scenario
|
|
406
|
+
|
|
407
|
+
Add comprehensive tests untuk critical user flow.
|
|
408
|
+
|
|
409
|
+
### Step-by-step
|
|
410
|
+
|
|
411
|
+
**Step 1: Test Setup**
|
|
412
|
+
|
|
413
|
+
```
|
|
414
|
+
@frontend-developer Load skill `tdd-workflow` dan setup testing:
|
|
415
|
+
|
|
416
|
+
Install:
|
|
417
|
+
- @nuxt/test-utils
|
|
418
|
+
- @vue/test-utils
|
|
419
|
+
- vitest
|
|
420
|
+
- @testing-library/vue
|
|
421
|
+
|
|
422
|
+
Create test file structure:
|
|
423
|
+
- tests/unit/components/
|
|
424
|
+
- tests/integration/pages/
|
|
425
|
+
- tests/e2e/flows/
|
|
426
|
+
|
|
427
|
+
Setup test config di vitest.config.ts
|
|
428
|
+
```
|
|
429
|
+
|
|
430
|
+
**Step 2: Component Tests**
|
|
431
|
+
|
|
432
|
+
```
|
|
433
|
+
@frontend-developer Write unit tests untuk Button component:
|
|
434
|
+
|
|
435
|
+
Test cases:
|
|
436
|
+
✓ Renders with correct variant classes
|
|
437
|
+
✓ Calls onClick when clicked
|
|
438
|
+
✓ Shows loading spinner when loading=true
|
|
439
|
+
✓ Disabled state prevents clicks
|
|
440
|
+
✓ Keyboard (Enter/Space) triggers onClick
|
|
441
|
+
✓ Icon slots render correctly
|
|
442
|
+
✓ Ripple effect applies
|
|
443
|
+
|
|
444
|
+
Target: 80%+ coverage
|
|
445
|
+
```
|
|
446
|
+
|
|
447
|
+
**Step 3: Integration Tests**
|
|
448
|
+
|
|
449
|
+
```
|
|
450
|
+
@frontend-developer Write integration test untuk CreateMarketForm:
|
|
451
|
+
|
|
452
|
+
Test flow:
|
|
453
|
+
1. Form renders with empty fields
|
|
454
|
+
2. Fill title → no error
|
|
455
|
+
3. Fill invalid description (too short) → error shown
|
|
456
|
+
4. Fix description → error clears
|
|
457
|
+
5. Select category → dropdown works
|
|
458
|
+
6. Add tags → tag chips appear
|
|
459
|
+
7. Submit form → loading state → success redirect
|
|
460
|
+
|
|
461
|
+
Mock API calls dengan MSW.
|
|
462
|
+
```
|
|
463
|
+
|
|
464
|
+
**Step 4: E2E Tests**
|
|
465
|
+
|
|
466
|
+
```
|
|
467
|
+
@frontend-developer Setup Playwright E2E test untuk user journey:
|
|
468
|
+
|
|
469
|
+
Scenario: "User creates and bets on market"
|
|
470
|
+
|
|
471
|
+
Steps:
|
|
472
|
+
1. Navigate to /markets/create
|
|
473
|
+
2. Fill form with valid data
|
|
474
|
+
3. Submit and verify redirect to market page
|
|
475
|
+
4. Click "Place Bet" button
|
|
476
|
+
5. Select outcome and amount
|
|
477
|
+
6. Confirm bet
|
|
478
|
+
7. Verify bet appears in "My Bets"
|
|
479
|
+
|
|
480
|
+
Include visual regression testing.
|
|
481
|
+
```
|
|
482
|
+
|
|
483
|
+
---
|
|
484
|
+
|
|
485
|
+
## 🎭 Workflow 6: Dark Mode Implementation
|
|
486
|
+
|
|
487
|
+
### Scenario
|
|
488
|
+
|
|
489
|
+
Add dark mode support dengan smooth transition.
|
|
490
|
+
|
|
491
|
+
### Step-by-step
|
|
492
|
+
|
|
493
|
+
**Step 1: Setup Theme System**
|
|
494
|
+
|
|
495
|
+
```
|
|
496
|
+
@frontend-developer Setup theme system dengan CSS variables:
|
|
497
|
+
|
|
498
|
+
Create app/assets/styles/themes.css:
|
|
499
|
+
|
|
500
|
+
:root {
|
|
501
|
+
/* Light theme */
|
|
502
|
+
--color-bg-primary: #ffffff;
|
|
503
|
+
--color-bg-secondary: #f9fafb;
|
|
504
|
+
--color-text-primary: #111827;
|
|
505
|
+
--color-text-secondary: #6b7280;
|
|
506
|
+
--color-border: #e5e7eb;
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
[data-theme="dark"] {
|
|
510
|
+
/* Dark theme */
|
|
511
|
+
--color-bg-primary: #111827;
|
|
512
|
+
--color-bg-secondary: #1f2937;
|
|
513
|
+
--color-text-primary: #f9fafb;
|
|
514
|
+
--color-text-secondary: #9ca3af;
|
|
515
|
+
--color-border: #374151;
|
|
516
|
+
}
|
|
517
|
+
|
|
518
|
+
Ensure all components use CSS variables.
|
|
519
|
+
```
|
|
520
|
+
|
|
521
|
+
**Step 2: Theme Toggle Component**
|
|
522
|
+
|
|
523
|
+
```
|
|
524
|
+
@frontend-developer Create ThemeToggle.vue component:
|
|
525
|
+
|
|
526
|
+
Features:
|
|
527
|
+
- Sun icon (light mode)
|
|
528
|
+
- Moon icon (dark mode)
|
|
529
|
+
- Smooth icon transition
|
|
530
|
+
- Persist preference (localStorage)
|
|
531
|
+
- Sync across tabs (storage event)
|
|
532
|
+
- Respect system preference (prefers-color-scheme)
|
|
533
|
+
- No flash on page load
|
|
534
|
+
|
|
535
|
+
Add to navigation bar.
|
|
536
|
+
```
|
|
537
|
+
|
|
538
|
+
**Step 3: Theme Composable**
|
|
539
|
+
|
|
540
|
+
```
|
|
541
|
+
@frontend-developer Create useTheme composable:
|
|
542
|
+
|
|
543
|
+
export function useTheme() {
|
|
544
|
+
const theme = ref<'light' | 'dark'>('light')
|
|
545
|
+
|
|
546
|
+
const setTheme = (newTheme: 'light' | 'dark') => {
|
|
547
|
+
theme.value = newTheme
|
|
548
|
+
document.documentElement.dataset.theme = newTheme
|
|
549
|
+
localStorage.setItem('theme', newTheme)
|
|
550
|
+
}
|
|
551
|
+
|
|
552
|
+
const toggleTheme = () => {
|
|
553
|
+
setTheme(theme.value === 'light' ? 'dark' : 'light')
|
|
554
|
+
}
|
|
555
|
+
|
|
556
|
+
// Initialize from localStorage or system preference
|
|
557
|
+
onMounted(() => {
|
|
558
|
+
const saved = localStorage.getItem('theme')
|
|
559
|
+
const system = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'
|
|
560
|
+
setTheme((saved as any) || system)
|
|
561
|
+
})
|
|
562
|
+
|
|
563
|
+
return { theme, setTheme, toggleTheme }
|
|
564
|
+
}
|
|
565
|
+
```
|
|
566
|
+
|
|
567
|
+
**Step 4: Update Components**
|
|
568
|
+
|
|
569
|
+
```
|
|
570
|
+
@frontend-developer Update all components untuk support dark mode:
|
|
571
|
+
|
|
572
|
+
Priority components:
|
|
573
|
+
1. Button (hover states, disabled states)
|
|
574
|
+
2. Card (borders, shadows)
|
|
575
|
+
3. Input (focus states, placeholders)
|
|
576
|
+
4. Modal (backdrop, close button)
|
|
577
|
+
5. Dropdown (hover, active states)
|
|
578
|
+
|
|
579
|
+
Ensure proper contrast ratios in both themes (WCAG AA).
|
|
580
|
+
```
|
|
581
|
+
|
|
582
|
+
**Step 5: Smooth Transitions**
|
|
583
|
+
|
|
584
|
+
```
|
|
585
|
+
@frontend-developer Add smooth theme transitions:
|
|
586
|
+
|
|
587
|
+
CSS:
|
|
588
|
+
* {
|
|
589
|
+
transition:
|
|
590
|
+
background-color 200ms ease,
|
|
591
|
+
border-color 200ms ease,
|
|
592
|
+
color 200ms ease;
|
|
593
|
+
}
|
|
594
|
+
|
|
595
|
+
Exceptions (no transition):
|
|
596
|
+
- Animations (keep them snappy)
|
|
597
|
+
- Interactive elements (buttons, links)
|
|
598
|
+
- Transform/translate properties
|
|
599
|
+
|
|
600
|
+
Test transitions don't cause jank.
|
|
601
|
+
```
|
|
602
|
+
|
|
603
|
+
---
|
|
604
|
+
|
|
605
|
+
## 🚀 Workflow 7: Progressive Enhancement
|
|
606
|
+
|
|
607
|
+
### Scenario
|
|
608
|
+
|
|
609
|
+
Ensure app works tanpa JavaScript (SSR + hydration).
|
|
610
|
+
|
|
611
|
+
### Step-by-step
|
|
612
|
+
|
|
613
|
+
**Step 1: SSR Audit**
|
|
614
|
+
|
|
615
|
+
```
|
|
616
|
+
@frontend-developer Audit SSR compatibility:
|
|
617
|
+
|
|
618
|
+
Check:
|
|
619
|
+
✓ No direct access to window/document in <script setup>
|
|
620
|
+
✓ Use process.client for browser-only code
|
|
621
|
+
✓ useFetch for data (not mounted + fetch)
|
|
622
|
+
✓ No localStorage in server context
|
|
623
|
+
✓ Proper error handling for missing APIs
|
|
624
|
+
|
|
625
|
+
Scan all components dan fix issues.
|
|
626
|
+
```
|
|
627
|
+
|
|
628
|
+
**Step 2: Progressive Forms**
|
|
629
|
+
|
|
630
|
+
```
|
|
631
|
+
@frontend-developer Make forms work tanpa JS:
|
|
632
|
+
|
|
633
|
+
1. Use native form submission
|
|
634
|
+
2. Add action="/api/markets/create" method="POST"
|
|
635
|
+
3. Server handles form data
|
|
636
|
+
4. Redirect to result page
|
|
637
|
+
5. Enhance dengan JS (preventDefault, fetch, optimistic updates)
|
|
638
|
+
|
|
639
|
+
This way form works even if JS fails to load.
|
|
640
|
+
```
|
|
641
|
+
|
|
642
|
+
**Step 3: Lazy Hydration**
|
|
643
|
+
|
|
644
|
+
```
|
|
645
|
+
@frontend-developer Implement lazy hydration untuk non-critical components:
|
|
646
|
+
|
|
647
|
+
Components to defer:
|
|
648
|
+
- Marketing sections (testimonials, features)
|
|
649
|
+
- Footer
|
|
650
|
+
- Non-interactive content
|
|
651
|
+
- Below-fold elements
|
|
652
|
+
|
|
653
|
+
Use:
|
|
654
|
+
- <ClientOnly> for truly optional components
|
|
655
|
+
- Intersection Observer untuk lazy hydration
|
|
656
|
+
- requestIdleCallback untuk low priority hydration
|
|
657
|
+
```
|
|
658
|
+
|
|
659
|
+
---
|
|
660
|
+
|
|
661
|
+
## 📊 Workflow 8: Analytics Integration
|
|
662
|
+
|
|
663
|
+
### Scenario
|
|
664
|
+
|
|
665
|
+
Add analytics tracking untuk user behavior.
|
|
666
|
+
|
|
667
|
+
### Step-by-step
|
|
668
|
+
|
|
669
|
+
**Step 1: Setup Analytics**
|
|
670
|
+
|
|
671
|
+
```
|
|
672
|
+
@frontend-developer Setup analytics dengan privacy-first approach:
|
|
673
|
+
|
|
674
|
+
Tools:
|
|
675
|
+
- Plausible Analytics (GDPR compliant)
|
|
676
|
+
- Custom event tracking
|
|
677
|
+
- Page view tracking
|
|
678
|
+
- Error tracking
|
|
679
|
+
|
|
680
|
+
Create app/plugins/analytics.client.ts
|
|
681
|
+
```
|
|
682
|
+
|
|
683
|
+
**Step 2: Event Tracking**
|
|
684
|
+
|
|
685
|
+
```
|
|
686
|
+
@frontend-developer Create useAnalytics composable:
|
|
687
|
+
|
|
688
|
+
Events to track:
|
|
689
|
+
- market_viewed (marketId, category)
|
|
690
|
+
- bet_placed (marketId, amount, outcome)
|
|
691
|
+
- search_performed (query, resultsCount)
|
|
692
|
+
- filter_applied (filterType, value)
|
|
693
|
+
- share_clicked (marketId, platform)
|
|
694
|
+
|
|
695
|
+
Usage:
|
|
696
|
+
const { track } = useAnalytics()
|
|
697
|
+
track('market_viewed', { marketId: 123, category: 'sports' })
|
|
698
|
+
```
|
|
699
|
+
|
|
700
|
+
**Step 3: Performance Monitoring**
|
|
701
|
+
|
|
702
|
+
```
|
|
703
|
+
@frontend-developer Track web vitals:
|
|
704
|
+
|
|
705
|
+
Metrics:
|
|
706
|
+
- LCP (Largest Contentful Paint)
|
|
707
|
+
- FID (First Input Delay)
|
|
708
|
+
- CLS (Cumulative Layout Shift)
|
|
709
|
+
- TTFB (Time to First Byte)
|
|
710
|
+
|
|
711
|
+
Send to analytics untuk monitoring.
|
|
712
|
+
```
|
|
713
|
+
|
|
714
|
+
---
|
|
715
|
+
|
|
716
|
+
## 💡 Tips Umum untuk Semua Workflows
|
|
717
|
+
|
|
718
|
+
### 1. Iterative Approach
|
|
719
|
+
|
|
720
|
+
Jangan minta semua sekaligus. Break down menjadi small tasks.
|
|
721
|
+
|
|
722
|
+
### 2. Review Checkpoints
|
|
723
|
+
|
|
724
|
+
Setelah setiap major step, minta agent review:
|
|
725
|
+
|
|
726
|
+
```
|
|
727
|
+
@frontend-developer Review yang sudah dibuat, ada yang bisa diimprove?
|
|
728
|
+
```
|
|
729
|
+
|
|
730
|
+
### 3. Ask for Alternatives
|
|
731
|
+
|
|
732
|
+
Jika tidak puas dengan approach:
|
|
733
|
+
|
|
734
|
+
```
|
|
735
|
+
@frontend-developer Ada alternative approach yang lebih simple/performant?
|
|
736
|
+
```
|
|
737
|
+
|
|
738
|
+
### 4. Documentation
|
|
739
|
+
|
|
740
|
+
Selalu minta dokumentasi:
|
|
741
|
+
|
|
742
|
+
```
|
|
743
|
+
@frontend-developer Tambahkan JSDoc comments dan usage examples
|
|
744
|
+
```
|
|
745
|
+
|
|
746
|
+
### 5. Accessibility First
|
|
747
|
+
|
|
748
|
+
Selalu remind accessibility:
|
|
749
|
+
|
|
750
|
+
```
|
|
751
|
+
@frontend-developer CRITICAL: Ensure WCAG 2.1 AA compliance
|
|
752
|
+
```
|
|
753
|
+
|
|
754
|
+
---
|
|
755
|
+
|
|
756
|
+
**Happy Building! 🎉**
|
|
757
|
+
|
|
758
|
+
Workflows ini bisa dicustomize sesuai kebutuhan project Anda.
|