From abb472c83dd91c3c10f4863e142be2fdabd8125a Mon Sep 17 00:00:00 2001 From: Dmytro Stanchiev Date: Sun, 24 May 2026 21:03:49 -0400 Subject: [PATCH] chore: ruler files update Signed-off-by: Dmytro Stanchiev --- .claude/skills/agent-browser/.openskills.json | 6 +- .claude/skills/agent-browser/SKILL.md | 4 + .claude/skills/agentcore/.openskills.json | 6 - .claude/skills/agentcore/SKILL.md | 115 -- .../.openskills.json | 6 - .../auth-implementation-patterns/SKILL.md | 638 ------ .../skills/bun-development/.openskills.json | 6 - .claude/skills/bun-development/SKILL.md | 696 ------- .claude/skills/core/.openskills.json | 6 - .claude/skills/core/SKILL.md | 476 ----- .../skills/core/references/authentication.md | 303 --- .claude/skills/core/references/commands.md | 389 ---- .claude/skills/core/references/profiling.md | 120 -- .../skills/core/references/proxy-support.md | 194 -- .../core/references/session-management.md | 193 -- .../skills/core/references/snapshot-refs.md | 219 --- .../core/references/trust-boundaries.md | 89 - .../skills/core/references/video-recording.md | 173 -- .../core/templates/authenticated-session.sh | 105 - .../skills/core/templates/capture-workflow.sh | 69 - .../skills/core/templates/form-automation.sh | 62 - .claude/skills/create-agent/.openskills.json | 6 - .claude/skills/create-agent/SKILL.md | 852 -------- .claude/skills/create-agent/metadata.json | 13 - .claude/skills/dogfood/.openskills.json | 6 - .claude/skills/dogfood/SKILL.md | 220 --- .../dogfood/references/issue-taxonomy.md | 109 -- .../templates/dogfood-report-template.md | 53 - .../drizzle-orm-expert/.openskills.json | 6 - .claude/skills/drizzle-orm-expert/SKILL.md | 363 ---- .../skills/frontend-design/.openskills.json | 6 - .claude/skills/frontend-design/LICENSE.txt | 177 -- .claude/skills/frontend-design/SKILL.md | 277 --- .../frontend-ui-dark-ts/.openskills.json | 6 - .claude/skills/frontend-ui-dark-ts/SKILL.md | 594 ------ .claude/skills/grill-me/.openskills.json | 10 +- .claude/skills/huashu-design/.env.example | 6 + .claude/skills/huashu-design/.gitignore | 30 + .claude/skills/huashu-design/.openskills.json | 6 + .claude/skills/huashu-design/LICENSE | 21 + .claude/skills/huashu-design/README.md | 309 +++ .claude/skills/huashu-design/README.zh.md | 321 +++ .claude/skills/huashu-design/SKILL.md | 814 ++++++++ .../huashu-design/assets/android_frame.jsx | 175 ++ .../huashu-design/assets/animations.jsx | 340 ++++ .../skills/huashu-design/assets/banner.svg | 198 ++ .../skills/huashu-design/assets/bgm-ad.mp3 | Bin 0 -> 4950071 bytes .../assets/bgm-educational-alt.mp3 | Bin 0 -> 4468765 bytes .../huashu-design/assets/bgm-educational.mp3 | Bin 0 -> 4047162 bytes .../skills/huashu-design/assets/bgm-tech.mp3 | Bin 0 -> 4818429 bytes .../huashu-design/assets/bgm-tutorial-alt.mp3 | Bin 0 -> 3937926 bytes .../huashu-design/assets/bgm-tutorial.mp3 | Bin 0 -> 5542744 bytes .../huashu-design/assets/browser_window.jsx | 166 ++ .../huashu-design/assets/deck_index.html | 237 +++ .../skills/huashu-design/assets/deck_stage.js | 420 ++++ .../huashu-design/assets/design_canvas.jsx | 205 ++ .../launch-film-30s-sample.md | 1713 +++++++++++++++++ .../skills/huashu-design/assets/ios_frame.jsx | 192 ++ .../huashu-design/assets/macos_window.jsx | 96 + .../huashu-design/assets/narration_stage.jsx | 470 +++++ .../assets/personal-asset-index.example.json | 71 + .../assets/sfx/container/card-flip.mp3 | Bin 0 -> 12164 bytes .../assets/sfx/container/card-snap.mp3 | Bin 0 -> 8821 bytes .../assets/sfx/container/modal-open.mp3 | Bin 0 -> 10493 bytes .../assets/sfx/container/stack-collapse.mp3 | Bin 0 -> 13836 bytes .../assets/sfx/feedback/achievement.mp3 | Bin 0 -> 24703 bytes .../assets/sfx/feedback/error-tone.mp3 | Bin 0 -> 12164 bytes .../assets/sfx/feedback/notification-pop.mp3 | Bin 0 -> 10493 bytes .../assets/sfx/feedback/success-chime.mp3 | Bin 0 -> 17180 bytes .../assets/sfx/impact/brand-stamp.mp3 | Bin 0 -> 17180 bytes .../assets/sfx/impact/drop-thud.mp3 | Bin 0 -> 12164 bytes .../assets/sfx/impact/logo-reveal-v2.mp3 | Bin 0 -> 24703 bytes .../assets/sfx/impact/logo-reveal.mp3 | Bin 0 -> 24703 bytes .../assets/sfx/keyboard/delete-key.mp3 | Bin 0 -> 8821 bytes .../assets/sfx/keyboard/enter.mp3 | Bin 0 -> 8821 bytes .../assets/sfx/keyboard/space-tap.mp3 | Bin 0 -> 8821 bytes .../assets/sfx/keyboard/type-fast.mp3 | Bin 0 -> 24703 bytes .../assets/sfx/keyboard/type.mp3 | Bin 0 -> 13836 bytes .../assets/sfx/magic/ai-process.mp3 | Bin 0 -> 20106 bytes .../assets/sfx/magic/sparkle.mp3 | Bin 0 -> 13836 bytes .../assets/sfx/magic/transform.mp3 | Bin 0 -> 17180 bytes .../assets/sfx/progress/complete-done.mp3 | Bin 0 -> 13836 bytes .../assets/sfx/progress/generate-start.mp3 | Bin 0 -> 13836 bytes .../assets/sfx/progress/loading-tick.mp3 | Bin 0 -> 8821 bytes .../assets/sfx/terminal/command-execute.mp3 | Bin 0 -> 8821 bytes .../assets/sfx/terminal/cursor-blink.mp3 | Bin 0 -> 8821 bytes .../assets/sfx/terminal/output-appear.mp3 | Bin 0 -> 10493 bytes .../assets/sfx/transition/dissolve.mp3 | Bin 0 -> 13836 bytes .../assets/sfx/transition/slide-in.mp3 | Bin 0 -> 10493 bytes .../sfx/transition/swipe-horizontal.mp3 | Bin 0 -> 12164 bytes .../assets/sfx/transition/whoosh-fast.mp3 | Bin 0 -> 8821 bytes .../assets/sfx/transition/whoosh.mp3 | Bin 0 -> 10493 bytes .../assets/sfx/ui/click-soft.mp3 | Bin 0 -> 8821 bytes .../huashu-design/assets/sfx/ui/click.mp3 | Bin 0 -> 8821 bytes .../huashu-design/assets/sfx/ui/focus.mp3 | Bin 0 -> 8821 bytes .../assets/sfx/ui/hover-subtle.mp3 | Bin 0 -> 8821 bytes .../assets/sfx/ui/tap-finger.mp3 | Bin 0 -> 8821 bytes .../huashu-design/assets/sfx/ui/toggle-on.mp3 | Bin 0 -> 8821 bytes .../huashu-design/assets/showcases/INDEX.md | 115 ++ .../assets/showcases/cover/cover-build.html | 235 +++ .../assets/showcases/cover/cover-build.png | Bin 0 -> 116336 bytes .../showcases/cover/cover-pentagram.html | 229 +++ .../showcases/cover/cover-pentagram.png | Bin 0 -> 36047 bytes .../assets/showcases/cover/cover-takram.html | 288 +++ .../assets/showcases/cover/cover-takram.png | Bin 0 -> 155362 bytes .../infographic/infographic-build.html | 503 +++++ .../infographic/infographic-build.png | Bin 0 -> 108710 bytes .../infographic/infographic-pentagram.html | 600 ++++++ .../infographic/infographic-pentagram.png | Bin 0 -> 159021 bytes .../infographic/infographic-takram.html | 670 +++++++ .../infographic/infographic-takram.png | Bin 0 -> 162976 bytes .../assets/showcases/ppt/ppt-build.html | 382 ++++ .../assets/showcases/ppt/ppt-build.png | Bin 0 -> 84423 bytes .../assets/showcases/ppt/ppt-pentagram.html | 536 ++++++ .../assets/showcases/ppt/ppt-pentagram.png | Bin 0 -> 101335 bytes .../assets/showcases/ppt/ppt-takram.html | 497 +++++ .../assets/showcases/ppt/ppt-takram.png | Bin 0 -> 467187 bytes .../showcases/website-ai-nav/ainav-build.html | 385 ++++ .../showcases/website-ai-nav/ainav-build.png | Bin 0 -> 85064 bytes .../website-ai-nav/ainav-pentagram.html | 422 ++++ .../website-ai-nav/ainav-pentagram.png | Bin 0 -> 105575 bytes .../website-ai-nav/ainav-takram.html | 499 +++++ .../showcases/website-ai-nav/ainav-takram.png | Bin 0 -> 121675 bytes .../website-ai-writing/aiwriting-build.html | 562 ++++++ .../website-ai-writing/aiwriting-build.png | Bin 0 -> 130604 bytes .../aiwriting-pentagram.html | 548 ++++++ .../aiwriting-pentagram.png | Bin 0 -> 150195 bytes .../website-ai-writing/aiwriting-takram.html | 696 +++++++ .../website-ai-writing/aiwriting-takram.png | Bin 0 -> 157158 bytes .../website-devdocs/devdocs-build.html | 372 ++++ .../website-devdocs/devdocs-build.png | Bin 0 -> 68230 bytes .../website-devdocs/devdocs-pentagram.html | 460 +++++ .../website-devdocs/devdocs-pentagram.png | Bin 0 -> 117051 bytes .../website-devdocs/devdocs-takram.html | 494 +++++ .../website-devdocs/devdocs-takram.png | Bin 0 -> 111854 bytes .../website-homepage/homepage-build.html | 367 ++++ .../website-homepage/homepage-build.png | Bin 0 -> 61708 bytes .../website-homepage/homepage-pentagram.html | 368 ++++ .../website-homepage/homepage-pentagram.png | Bin 0 -> 57093 bytes .../website-homepage/homepage-takram.html | 459 +++++ .../website-homepage/homepage-takram.png | Bin 0 -> 127610 bytes .../showcases/website-saas/saas-build.html | 493 +++++ .../showcases/website-saas/saas-build.png | Bin 0 -> 99745 bytes .../website-saas/saas-pentagram.html | 556 ++++++ .../showcases/website-saas/saas-pentagram.png | Bin 0 -> 96559 bytes .../showcases/website-saas/saas-takram.html | 604 ++++++ .../showcases/website-saas/saas-takram.png | Bin 0 -> 123532 bytes .../demos/c1-ios-prototype-en.html | 1145 +++++++++++ .../huashu-design/demos/c1-ios-prototype.html | 1142 +++++++++++ .../demos/c2-slides-pptx-en.html | 1055 ++++++++++ .../huashu-design/demos/c2-slides-pptx.html | 1055 ++++++++++ .../demos/c3-motion-design-en.html | 1134 +++++++++++ .../huashu-design/demos/c3-motion-design.html | 1134 +++++++++++ .../huashu-design/demos/c4-tweaks-en.html | 989 ++++++++++ .../skills/huashu-design/demos/c4-tweaks.html | 989 ++++++++++ .../demos/c5-infographic-en.html | 816 ++++++++ .../huashu-design/demos/c5-infographic.html | 813 ++++++++ .../demos/c6-expert-review-en.html | 885 +++++++++ .../huashu-design/demos/c6-expert-review.html | 894 +++++++++ .../demos/hero-animation-v10-en.html | 1498 ++++++++++++++ .../demos/md-html-narration/md-html-demo.html | 615 ++++++ .../demos/md-html-narration/script.md | 69 + .../demos/voiceover-demo/script.md | 17 + .../demos/voiceover-demo/什么是token.html | 201 ++ .../demos/w1-brand-protocol-en.html | 684 +++++++ .../demos/w1-brand-protocol.html | 696 +++++++ .../demos/w2-junior-designer-en.html | 983 ++++++++++ .../demos/w2-junior-designer.html | 994 ++++++++++ .../demos/w3-fallback-advisor-en.html | 647 +++++++ .../demos/w3-fallback-advisor.html | 704 +++++++ .../references/animation-best-practices.md | 506 +++++ .../references/animation-pitfalls.md | 380 ++++ .../huashu-design/references/animations.md | 249 +++ .../references/apple-gallery-showcase.md | 338 ++++ .../references/audio-design-rules.md | 260 +++ .../references/cinematic-patterns.md | 264 +++ .../references/content-guidelines.md | 260 +++ .../references/critique-guide.md | 199 ++ .../references/design-context.md | 213 ++ .../huashu-design/references/design-styles.md | 591 ++++++ .../huashu-design/references/editable-pptx.md | 334 ++++ .../references/hero-animation-case-study.md | 250 +++ .../references/launch-film-director-notes.md | 293 +++ .../multi-perspective-parallel-case-study.md | 267 +++ .../huashu-design/references/react-setup.md | 276 +++ .../references/scene-templates.md | 262 +++ .../huashu-design/references/sfx-library.md | 226 +++ .../huashu-design/references/slide-decks.md | 726 +++++++ .../huashu-design/references/tweaks-system.md | 313 +++ .../huashu-design/references/verification.md | 189 ++ .../huashu-design/references/video-export.md | 209 ++ .../references/voiceover-pipeline.md | 397 ++++ .../huashu-design/references/workflow.md | 216 +++ .../skills/huashu-design/scripts/add-music.sh | 108 ++ .../huashu-design/scripts/convert-formats.sh | 83 + .../huashu-design/scripts/export_deck_pdf.mjs | 98 + .../scripts/export_deck_pptx.mjs | 107 + .../scripts/export_deck_stage_pdf.mjs | 130 ++ .../skills/huashu-design/scripts/html2pptx.js | 1178 ++++++++++++ .../huashu-design/scripts/mix-voiceover.sh | 127 ++ .../scripts/narrate-pipeline.mjs | 315 +++ .../huashu-design/scripts/render-narration.sh | 136 ++ .../huashu-design/scripts/render-video.js | 289 +++ .../huashu-design/scripts/tts-doubao.mjs | 184 ++ .../skills/huashu-design/scripts/verify.py | 154 ++ .../skills/huashu-design/test-prompts.json | 38 + .../.openskills.json | 6 - .../nextjs-app-router-patterns/SKILL.md | 537 ------ .../nextjs-best-practices/.openskills.json | 6 - .claude/skills/nextjs-best-practices/SKILL.md | 208 -- .../skills/nextjs-developer/.openskills.json | 6 - .claude/skills/nextjs-developer/SKILL.md | 143 -- .../nextjs-developer/references/app-router.md | 311 --- .../references/data-fetching.md | 482 ----- .../nextjs-developer/references/deployment.md | 545 ------ .../references/server-actions.md | 462 ----- .../references/server-components.md | 384 ---- .../.openskills.json | 6 - .../skills/openrouter-typescript-sdk/SKILL.md | 1249 ------------ .../openrouter-typescript-sdk/metadata.json | 13 - .../react-nextjs-development/.openskills.json | 6 - .../skills/react-nextjs-development/SKILL.md | 228 --- .../skills/react-ui-patterns/.openskills.json | 6 - .claude/skills/react-ui-patterns/SKILL.md | 295 --- .../skills/responsive-design/.openskills.json | 6 - .claude/skills/responsive-design/SKILL.md | 516 ----- .../references/breakpoint-strategies.md | 591 ------ .../references/container-queries.md | 564 ------ .../references/fluid-layouts.md | 538 ------ .../tailwind-design-system/.openskills.json | 6 - .../skills/tailwind-design-system/SKILL.md | 36 - .../resources/implementation-playbook.md | 665 ------- .claude/skills/tdd/.openskills.json | 10 +- .claude/skills/tdd/SKILL.md | 2 + .../.openskills.json | 6 - .../skills/typescript-advanced-types/SKILL.md | 717 ------- .../skills/typescript-expert/.openskills.json | 6 - .claude/skills/typescript-expert/SKILL.md | 426 ---- .../references/tsconfig-strict.json | 92 - .../references/typescript-cheatsheet.md | 383 ---- .../references/utility-types.ts | 334 ---- .../scripts/ts_diagnostic.py | 203 -- .../skills/typescript-pro/.openskills.json | 6 - .claude/skills/typescript-pro/SKILL.md | 145 -- .../references/advanced-types.md | 259 --- .../references/configuration.md | 445 ----- .../typescript-pro/references/patterns.md | 484 ----- .../typescript-pro/references/type-guards.md | 352 ---- .../references/utility-types.md | 329 ---- .../skills/ui-ux-designer/.openskills.json | 6 - .claude/skills/ui-ux-designer/SKILL.md | 207 -- .claude/skills/ui-ux-pro-max/.openskills.json | 6 - .claude/skills/ui-ux-pro-max/SKILL.md | 356 ---- .claude/skills/ui-ux-pro-max/data/charts.csv | 26 - .claude/skills/ui-ux-pro-max/data/colors.csv | 97 - .claude/skills/ui-ux-pro-max/data/icons.csv | 101 - .claude/skills/ui-ux-pro-max/data/landing.csv | 31 - .../skills/ui-ux-pro-max/data/products.csv | 97 - .claude/skills/ui-ux-pro-max/data/prompts.csv | 24 - .../ui-ux-pro-max/data/react-performance.csv | 45 - .../ui-ux-pro-max/data/stacks/flutter.csv | 53 - .../data/stacks/html-tailwind.csv | 56 - .../ui-ux-pro-max/data/stacks/nextjs.csv | 53 - .../ui-ux-pro-max/data/stacks/nuxt-ui.csv | 51 - .../ui-ux-pro-max/data/stacks/nuxtjs.csv | 59 - .../data/stacks/react-native.csv | 52 - .../ui-ux-pro-max/data/stacks/react.csv | 54 - .../ui-ux-pro-max/data/stacks/shadcn.csv | 61 - .../ui-ux-pro-max/data/stacks/svelte.csv | 54 - .../ui-ux-pro-max/data/stacks/swiftui.csv | 51 - .../skills/ui-ux-pro-max/data/stacks/vue.csv | 50 - .claude/skills/ui-ux-pro-max/data/styles.csv | 59 - .../skills/ui-ux-pro-max/data/typography.csv | 58 - .../ui-ux-pro-max/data/ui-reasoning.csv | 101 - .../ui-ux-pro-max/data/ux-guidelines.csv | 100 - .../ui-ux-pro-max/data/web-interface.csv | 31 - .../scripts/__pycache__/core.cpython-312.pyc | Bin 11764 -> 0 bytes .../__pycache__/design_system.cpython-312.pyc | Bin 27859 -> 0 bytes .claude/skills/ui-ux-pro-max/scripts/core.py | 257 --- .../ui-ux-pro-max/scripts/design_system.py | 487 ----- .../skills/ui-ux-pro-max/scripts/search.py | 76 - .../skills/uxui-principles/.openskills.json | 6 - .claude/skills/uxui-principles/SKILL.md | 48 - .../.openskills.json | 6 - .../skills/visual-design-foundations/SKILL.md | 318 --- .../references/color-systems.md | 417 ---- .../references/spacing-iconography.md | 425 ---- .../references/typography-systems.md | 432 ----- .../web-component-design/.openskills.json | 6 - .claude/skills/web-component-design/SKILL.md | 271 --- .../references/accessibility-patterns.md | 642 ------ .../references/component-patterns.md | 437 ----- .../references/css-styling-approaches.md | 590 ------ .../web-design-guidelines/.openskills.json | 6 - .claude/skills/web-design-guidelines/SKILL.md | 41 - .../zod-validation-expert/.openskills.json | 6 - .claude/skills/zod-validation-expert/SKILL.md | 267 --- .gitignore | 11 +- .ruler/02-BUN-GUIDE.md | 80 + .ruler/10-KARPATHY-GUIDELINES.md | 61 + .ruler/99-OPENSKILLS.md | 118 -- .ruler/chrome-devtools-openurl.sh | 46 + .ruler/skill-selector.yaml | 5 +- 303 files changed, 46670 insertions(+), 25369 deletions(-) delete mode 100644 .claude/skills/agentcore/.openskills.json delete mode 100644 .claude/skills/agentcore/SKILL.md delete mode 100644 .claude/skills/auth-implementation-patterns/.openskills.json delete mode 100644 .claude/skills/auth-implementation-patterns/SKILL.md delete mode 100644 .claude/skills/bun-development/.openskills.json delete mode 100644 .claude/skills/bun-development/SKILL.md delete mode 100644 .claude/skills/core/.openskills.json delete mode 100644 .claude/skills/core/SKILL.md delete mode 100644 .claude/skills/core/references/authentication.md delete mode 100644 .claude/skills/core/references/commands.md delete mode 100644 .claude/skills/core/references/profiling.md delete mode 100644 .claude/skills/core/references/proxy-support.md delete mode 100644 .claude/skills/core/references/session-management.md delete mode 100644 .claude/skills/core/references/snapshot-refs.md delete mode 100644 .claude/skills/core/references/trust-boundaries.md delete mode 100644 .claude/skills/core/references/video-recording.md delete mode 100755 .claude/skills/core/templates/authenticated-session.sh delete mode 100755 .claude/skills/core/templates/capture-workflow.sh delete mode 100755 .claude/skills/core/templates/form-automation.sh delete mode 100644 .claude/skills/create-agent/.openskills.json delete mode 100644 .claude/skills/create-agent/SKILL.md delete mode 100644 .claude/skills/create-agent/metadata.json delete mode 100644 .claude/skills/dogfood/.openskills.json delete mode 100644 .claude/skills/dogfood/SKILL.md delete mode 100644 .claude/skills/dogfood/references/issue-taxonomy.md delete mode 100644 .claude/skills/dogfood/templates/dogfood-report-template.md delete mode 100644 .claude/skills/drizzle-orm-expert/.openskills.json delete mode 100644 .claude/skills/drizzle-orm-expert/SKILL.md delete mode 100644 .claude/skills/frontend-design/.openskills.json delete mode 100644 .claude/skills/frontend-design/LICENSE.txt delete mode 100644 .claude/skills/frontend-design/SKILL.md delete mode 100644 .claude/skills/frontend-ui-dark-ts/.openskills.json delete mode 100644 .claude/skills/frontend-ui-dark-ts/SKILL.md create mode 100644 .claude/skills/huashu-design/.env.example create mode 100644 .claude/skills/huashu-design/.gitignore create mode 100644 .claude/skills/huashu-design/.openskills.json create mode 100644 .claude/skills/huashu-design/LICENSE create mode 100644 .claude/skills/huashu-design/README.md create mode 100644 .claude/skills/huashu-design/README.zh.md create mode 100644 .claude/skills/huashu-design/SKILL.md create mode 100644 .claude/skills/huashu-design/assets/android_frame.jsx create mode 100644 .claude/skills/huashu-design/assets/animations.jsx create mode 100644 .claude/skills/huashu-design/assets/banner.svg create mode 100644 .claude/skills/huashu-design/assets/bgm-ad.mp3 create mode 100644 .claude/skills/huashu-design/assets/bgm-educational-alt.mp3 create mode 100644 .claude/skills/huashu-design/assets/bgm-educational.mp3 create mode 100644 .claude/skills/huashu-design/assets/bgm-tech.mp3 create mode 100644 .claude/skills/huashu-design/assets/bgm-tutorial-alt.mp3 create mode 100644 .claude/skills/huashu-design/assets/bgm-tutorial.mp3 create mode 100644 .claude/skills/huashu-design/assets/browser_window.jsx create mode 100644 .claude/skills/huashu-design/assets/deck_index.html create mode 100644 .claude/skills/huashu-design/assets/deck_stage.js create mode 100644 .claude/skills/huashu-design/assets/design_canvas.jsx create mode 100644 .claude/skills/huashu-design/assets/director-notes-samples/launch-film-30s-sample.md create mode 100644 .claude/skills/huashu-design/assets/ios_frame.jsx create mode 100644 .claude/skills/huashu-design/assets/macos_window.jsx create mode 100644 .claude/skills/huashu-design/assets/narration_stage.jsx create mode 100644 .claude/skills/huashu-design/assets/personal-asset-index.example.json create mode 100644 .claude/skills/huashu-design/assets/sfx/container/card-flip.mp3 create mode 100644 .claude/skills/huashu-design/assets/sfx/container/card-snap.mp3 create mode 100644 .claude/skills/huashu-design/assets/sfx/container/modal-open.mp3 create mode 100644 .claude/skills/huashu-design/assets/sfx/container/stack-collapse.mp3 create mode 100644 .claude/skills/huashu-design/assets/sfx/feedback/achievement.mp3 create mode 100644 .claude/skills/huashu-design/assets/sfx/feedback/error-tone.mp3 create mode 100644 .claude/skills/huashu-design/assets/sfx/feedback/notification-pop.mp3 create mode 100644 .claude/skills/huashu-design/assets/sfx/feedback/success-chime.mp3 create mode 100644 .claude/skills/huashu-design/assets/sfx/impact/brand-stamp.mp3 create mode 100644 .claude/skills/huashu-design/assets/sfx/impact/drop-thud.mp3 create mode 100644 .claude/skills/huashu-design/assets/sfx/impact/logo-reveal-v2.mp3 create mode 100644 .claude/skills/huashu-design/assets/sfx/impact/logo-reveal.mp3 create mode 100644 .claude/skills/huashu-design/assets/sfx/keyboard/delete-key.mp3 create mode 100644 .claude/skills/huashu-design/assets/sfx/keyboard/enter.mp3 create mode 100644 .claude/skills/huashu-design/assets/sfx/keyboard/space-tap.mp3 create mode 100644 .claude/skills/huashu-design/assets/sfx/keyboard/type-fast.mp3 create mode 100644 .claude/skills/huashu-design/assets/sfx/keyboard/type.mp3 create mode 100644 .claude/skills/huashu-design/assets/sfx/magic/ai-process.mp3 create mode 100644 .claude/skills/huashu-design/assets/sfx/magic/sparkle.mp3 create mode 100644 .claude/skills/huashu-design/assets/sfx/magic/transform.mp3 create mode 100644 .claude/skills/huashu-design/assets/sfx/progress/complete-done.mp3 create mode 100644 .claude/skills/huashu-design/assets/sfx/progress/generate-start.mp3 create mode 100644 .claude/skills/huashu-design/assets/sfx/progress/loading-tick.mp3 create mode 100644 .claude/skills/huashu-design/assets/sfx/terminal/command-execute.mp3 create mode 100644 .claude/skills/huashu-design/assets/sfx/terminal/cursor-blink.mp3 create mode 100644 .claude/skills/huashu-design/assets/sfx/terminal/output-appear.mp3 create mode 100644 .claude/skills/huashu-design/assets/sfx/transition/dissolve.mp3 create mode 100644 .claude/skills/huashu-design/assets/sfx/transition/slide-in.mp3 create mode 100644 .claude/skills/huashu-design/assets/sfx/transition/swipe-horizontal.mp3 create mode 100644 .claude/skills/huashu-design/assets/sfx/transition/whoosh-fast.mp3 create mode 100644 .claude/skills/huashu-design/assets/sfx/transition/whoosh.mp3 create mode 100644 .claude/skills/huashu-design/assets/sfx/ui/click-soft.mp3 create mode 100644 .claude/skills/huashu-design/assets/sfx/ui/click.mp3 create mode 100644 .claude/skills/huashu-design/assets/sfx/ui/focus.mp3 create mode 100644 .claude/skills/huashu-design/assets/sfx/ui/hover-subtle.mp3 create mode 100644 .claude/skills/huashu-design/assets/sfx/ui/tap-finger.mp3 create mode 100644 .claude/skills/huashu-design/assets/sfx/ui/toggle-on.mp3 create mode 100644 .claude/skills/huashu-design/assets/showcases/INDEX.md create mode 100644 .claude/skills/huashu-design/assets/showcases/cover/cover-build.html create mode 100644 .claude/skills/huashu-design/assets/showcases/cover/cover-build.png create mode 100644 .claude/skills/huashu-design/assets/showcases/cover/cover-pentagram.html create mode 100644 .claude/skills/huashu-design/assets/showcases/cover/cover-pentagram.png create mode 100644 .claude/skills/huashu-design/assets/showcases/cover/cover-takram.html create mode 100644 .claude/skills/huashu-design/assets/showcases/cover/cover-takram.png create mode 100644 .claude/skills/huashu-design/assets/showcases/infographic/infographic-build.html create mode 100644 .claude/skills/huashu-design/assets/showcases/infographic/infographic-build.png create mode 100644 .claude/skills/huashu-design/assets/showcases/infographic/infographic-pentagram.html create mode 100644 .claude/skills/huashu-design/assets/showcases/infographic/infographic-pentagram.png create mode 100644 .claude/skills/huashu-design/assets/showcases/infographic/infographic-takram.html create mode 100644 .claude/skills/huashu-design/assets/showcases/infographic/infographic-takram.png create mode 100644 .claude/skills/huashu-design/assets/showcases/ppt/ppt-build.html create mode 100644 .claude/skills/huashu-design/assets/showcases/ppt/ppt-build.png create mode 100644 .claude/skills/huashu-design/assets/showcases/ppt/ppt-pentagram.html create mode 100644 .claude/skills/huashu-design/assets/showcases/ppt/ppt-pentagram.png create mode 100644 .claude/skills/huashu-design/assets/showcases/ppt/ppt-takram.html create mode 100644 .claude/skills/huashu-design/assets/showcases/ppt/ppt-takram.png create mode 100644 .claude/skills/huashu-design/assets/showcases/website-ai-nav/ainav-build.html create mode 100644 .claude/skills/huashu-design/assets/showcases/website-ai-nav/ainav-build.png create mode 100644 .claude/skills/huashu-design/assets/showcases/website-ai-nav/ainav-pentagram.html create mode 100644 .claude/skills/huashu-design/assets/showcases/website-ai-nav/ainav-pentagram.png create mode 100644 .claude/skills/huashu-design/assets/showcases/website-ai-nav/ainav-takram.html create mode 100644 .claude/skills/huashu-design/assets/showcases/website-ai-nav/ainav-takram.png create mode 100644 .claude/skills/huashu-design/assets/showcases/website-ai-writing/aiwriting-build.html create mode 100644 .claude/skills/huashu-design/assets/showcases/website-ai-writing/aiwriting-build.png create mode 100644 .claude/skills/huashu-design/assets/showcases/website-ai-writing/aiwriting-pentagram.html create mode 100644 .claude/skills/huashu-design/assets/showcases/website-ai-writing/aiwriting-pentagram.png create mode 100644 .claude/skills/huashu-design/assets/showcases/website-ai-writing/aiwriting-takram.html create mode 100644 .claude/skills/huashu-design/assets/showcases/website-ai-writing/aiwriting-takram.png create mode 100644 .claude/skills/huashu-design/assets/showcases/website-devdocs/devdocs-build.html create mode 100644 .claude/skills/huashu-design/assets/showcases/website-devdocs/devdocs-build.png create mode 100644 .claude/skills/huashu-design/assets/showcases/website-devdocs/devdocs-pentagram.html create mode 100644 .claude/skills/huashu-design/assets/showcases/website-devdocs/devdocs-pentagram.png create mode 100644 .claude/skills/huashu-design/assets/showcases/website-devdocs/devdocs-takram.html create mode 100644 .claude/skills/huashu-design/assets/showcases/website-devdocs/devdocs-takram.png create mode 100644 .claude/skills/huashu-design/assets/showcases/website-homepage/homepage-build.html create mode 100644 .claude/skills/huashu-design/assets/showcases/website-homepage/homepage-build.png create mode 100644 .claude/skills/huashu-design/assets/showcases/website-homepage/homepage-pentagram.html create mode 100644 .claude/skills/huashu-design/assets/showcases/website-homepage/homepage-pentagram.png create mode 100644 .claude/skills/huashu-design/assets/showcases/website-homepage/homepage-takram.html create mode 100644 .claude/skills/huashu-design/assets/showcases/website-homepage/homepage-takram.png create mode 100644 .claude/skills/huashu-design/assets/showcases/website-saas/saas-build.html create mode 100644 .claude/skills/huashu-design/assets/showcases/website-saas/saas-build.png create mode 100644 .claude/skills/huashu-design/assets/showcases/website-saas/saas-pentagram.html create mode 100644 .claude/skills/huashu-design/assets/showcases/website-saas/saas-pentagram.png create mode 100644 .claude/skills/huashu-design/assets/showcases/website-saas/saas-takram.html create mode 100644 .claude/skills/huashu-design/assets/showcases/website-saas/saas-takram.png create mode 100644 .claude/skills/huashu-design/demos/c1-ios-prototype-en.html create mode 100644 .claude/skills/huashu-design/demos/c1-ios-prototype.html create mode 100644 .claude/skills/huashu-design/demos/c2-slides-pptx-en.html create mode 100644 .claude/skills/huashu-design/demos/c2-slides-pptx.html create mode 100644 .claude/skills/huashu-design/demos/c3-motion-design-en.html create mode 100644 .claude/skills/huashu-design/demos/c3-motion-design.html create mode 100644 .claude/skills/huashu-design/demos/c4-tweaks-en.html create mode 100644 .claude/skills/huashu-design/demos/c4-tweaks.html create mode 100644 .claude/skills/huashu-design/demos/c5-infographic-en.html create mode 100644 .claude/skills/huashu-design/demos/c5-infographic.html create mode 100644 .claude/skills/huashu-design/demos/c6-expert-review-en.html create mode 100644 .claude/skills/huashu-design/demos/c6-expert-review.html create mode 100644 .claude/skills/huashu-design/demos/hero-animation-v10-en.html create mode 100644 .claude/skills/huashu-design/demos/md-html-narration/md-html-demo.html create mode 100644 .claude/skills/huashu-design/demos/md-html-narration/script.md create mode 100644 .claude/skills/huashu-design/demos/voiceover-demo/script.md create mode 100644 .claude/skills/huashu-design/demos/voiceover-demo/什么是token.html create mode 100644 .claude/skills/huashu-design/demos/w1-brand-protocol-en.html create mode 100644 .claude/skills/huashu-design/demos/w1-brand-protocol.html create mode 100644 .claude/skills/huashu-design/demos/w2-junior-designer-en.html create mode 100644 .claude/skills/huashu-design/demos/w2-junior-designer.html create mode 100644 .claude/skills/huashu-design/demos/w3-fallback-advisor-en.html create mode 100644 .claude/skills/huashu-design/demos/w3-fallback-advisor.html create mode 100644 .claude/skills/huashu-design/references/animation-best-practices.md create mode 100644 .claude/skills/huashu-design/references/animation-pitfalls.md create mode 100644 .claude/skills/huashu-design/references/animations.md create mode 100644 .claude/skills/huashu-design/references/apple-gallery-showcase.md create mode 100644 .claude/skills/huashu-design/references/audio-design-rules.md create mode 100644 .claude/skills/huashu-design/references/cinematic-patterns.md create mode 100644 .claude/skills/huashu-design/references/content-guidelines.md create mode 100644 .claude/skills/huashu-design/references/critique-guide.md create mode 100644 .claude/skills/huashu-design/references/design-context.md create mode 100644 .claude/skills/huashu-design/references/design-styles.md create mode 100644 .claude/skills/huashu-design/references/editable-pptx.md create mode 100644 .claude/skills/huashu-design/references/hero-animation-case-study.md create mode 100644 .claude/skills/huashu-design/references/launch-film-director-notes.md create mode 100644 .claude/skills/huashu-design/references/multi-perspective-parallel-case-study.md create mode 100644 .claude/skills/huashu-design/references/react-setup.md create mode 100644 .claude/skills/huashu-design/references/scene-templates.md create mode 100644 .claude/skills/huashu-design/references/sfx-library.md create mode 100644 .claude/skills/huashu-design/references/slide-decks.md create mode 100644 .claude/skills/huashu-design/references/tweaks-system.md create mode 100644 .claude/skills/huashu-design/references/verification.md create mode 100644 .claude/skills/huashu-design/references/video-export.md create mode 100644 .claude/skills/huashu-design/references/voiceover-pipeline.md create mode 100644 .claude/skills/huashu-design/references/workflow.md create mode 100755 .claude/skills/huashu-design/scripts/add-music.sh create mode 100755 .claude/skills/huashu-design/scripts/convert-formats.sh create mode 100644 .claude/skills/huashu-design/scripts/export_deck_pdf.mjs create mode 100644 .claude/skills/huashu-design/scripts/export_deck_pptx.mjs create mode 100644 .claude/skills/huashu-design/scripts/export_deck_stage_pdf.mjs create mode 100755 .claude/skills/huashu-design/scripts/html2pptx.js create mode 100755 .claude/skills/huashu-design/scripts/mix-voiceover.sh create mode 100755 .claude/skills/huashu-design/scripts/narrate-pipeline.mjs create mode 100755 .claude/skills/huashu-design/scripts/render-narration.sh create mode 100755 .claude/skills/huashu-design/scripts/render-video.js create mode 100755 .claude/skills/huashu-design/scripts/tts-doubao.mjs create mode 100644 .claude/skills/huashu-design/scripts/verify.py create mode 100644 .claude/skills/huashu-design/test-prompts.json delete mode 100644 .claude/skills/nextjs-app-router-patterns/.openskills.json delete mode 100644 .claude/skills/nextjs-app-router-patterns/SKILL.md delete mode 100644 .claude/skills/nextjs-best-practices/.openskills.json delete mode 100644 .claude/skills/nextjs-best-practices/SKILL.md delete mode 100644 .claude/skills/nextjs-developer/.openskills.json delete mode 100644 .claude/skills/nextjs-developer/SKILL.md delete mode 100644 .claude/skills/nextjs-developer/references/app-router.md delete mode 100644 .claude/skills/nextjs-developer/references/data-fetching.md delete mode 100644 .claude/skills/nextjs-developer/references/deployment.md delete mode 100644 .claude/skills/nextjs-developer/references/server-actions.md delete mode 100644 .claude/skills/nextjs-developer/references/server-components.md delete mode 100644 .claude/skills/openrouter-typescript-sdk/.openskills.json delete mode 100644 .claude/skills/openrouter-typescript-sdk/SKILL.md delete mode 100644 .claude/skills/openrouter-typescript-sdk/metadata.json delete mode 100644 .claude/skills/react-nextjs-development/.openskills.json delete mode 100644 .claude/skills/react-nextjs-development/SKILL.md delete mode 100644 .claude/skills/react-ui-patterns/.openskills.json delete mode 100644 .claude/skills/react-ui-patterns/SKILL.md delete mode 100644 .claude/skills/responsive-design/.openskills.json delete mode 100644 .claude/skills/responsive-design/SKILL.md delete mode 100644 .claude/skills/responsive-design/references/breakpoint-strategies.md delete mode 100644 .claude/skills/responsive-design/references/container-queries.md delete mode 100644 .claude/skills/responsive-design/references/fluid-layouts.md delete mode 100644 .claude/skills/tailwind-design-system/.openskills.json delete mode 100644 .claude/skills/tailwind-design-system/SKILL.md delete mode 100644 .claude/skills/tailwind-design-system/resources/implementation-playbook.md delete mode 100644 .claude/skills/typescript-advanced-types/.openskills.json delete mode 100644 .claude/skills/typescript-advanced-types/SKILL.md delete mode 100644 .claude/skills/typescript-expert/.openskills.json delete mode 100644 .claude/skills/typescript-expert/SKILL.md delete mode 100644 .claude/skills/typescript-expert/references/tsconfig-strict.json delete mode 100644 .claude/skills/typescript-expert/references/typescript-cheatsheet.md delete mode 100644 .claude/skills/typescript-expert/references/utility-types.ts delete mode 100644 .claude/skills/typescript-expert/scripts/ts_diagnostic.py delete mode 100644 .claude/skills/typescript-pro/.openskills.json delete mode 100644 .claude/skills/typescript-pro/SKILL.md delete mode 100644 .claude/skills/typescript-pro/references/advanced-types.md delete mode 100644 .claude/skills/typescript-pro/references/configuration.md delete mode 100644 .claude/skills/typescript-pro/references/patterns.md delete mode 100644 .claude/skills/typescript-pro/references/type-guards.md delete mode 100644 .claude/skills/typescript-pro/references/utility-types.md delete mode 100644 .claude/skills/ui-ux-designer/.openskills.json delete mode 100644 .claude/skills/ui-ux-designer/SKILL.md delete mode 100644 .claude/skills/ui-ux-pro-max/.openskills.json delete mode 100644 .claude/skills/ui-ux-pro-max/SKILL.md delete mode 100644 .claude/skills/ui-ux-pro-max/data/charts.csv delete mode 100644 .claude/skills/ui-ux-pro-max/data/colors.csv delete mode 100644 .claude/skills/ui-ux-pro-max/data/icons.csv delete mode 100644 .claude/skills/ui-ux-pro-max/data/landing.csv delete mode 100644 .claude/skills/ui-ux-pro-max/data/products.csv delete mode 100644 .claude/skills/ui-ux-pro-max/data/prompts.csv delete mode 100644 .claude/skills/ui-ux-pro-max/data/react-performance.csv delete mode 100644 .claude/skills/ui-ux-pro-max/data/stacks/flutter.csv delete mode 100644 .claude/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv delete mode 100644 .claude/skills/ui-ux-pro-max/data/stacks/nextjs.csv delete mode 100644 .claude/skills/ui-ux-pro-max/data/stacks/nuxt-ui.csv delete mode 100644 .claude/skills/ui-ux-pro-max/data/stacks/nuxtjs.csv delete mode 100644 .claude/skills/ui-ux-pro-max/data/stacks/react-native.csv delete mode 100644 .claude/skills/ui-ux-pro-max/data/stacks/react.csv delete mode 100644 .claude/skills/ui-ux-pro-max/data/stacks/shadcn.csv delete mode 100644 .claude/skills/ui-ux-pro-max/data/stacks/svelte.csv delete mode 100644 .claude/skills/ui-ux-pro-max/data/stacks/swiftui.csv delete mode 100644 .claude/skills/ui-ux-pro-max/data/stacks/vue.csv delete mode 100644 .claude/skills/ui-ux-pro-max/data/styles.csv delete mode 100644 .claude/skills/ui-ux-pro-max/data/typography.csv delete mode 100644 .claude/skills/ui-ux-pro-max/data/ui-reasoning.csv delete mode 100644 .claude/skills/ui-ux-pro-max/data/ux-guidelines.csv delete mode 100644 .claude/skills/ui-ux-pro-max/data/web-interface.csv delete mode 100644 .claude/skills/ui-ux-pro-max/scripts/__pycache__/core.cpython-312.pyc delete mode 100644 .claude/skills/ui-ux-pro-max/scripts/__pycache__/design_system.cpython-312.pyc delete mode 100644 .claude/skills/ui-ux-pro-max/scripts/core.py delete mode 100644 .claude/skills/ui-ux-pro-max/scripts/design_system.py delete mode 100644 .claude/skills/ui-ux-pro-max/scripts/search.py delete mode 100644 .claude/skills/uxui-principles/.openskills.json delete mode 100644 .claude/skills/uxui-principles/SKILL.md delete mode 100644 .claude/skills/visual-design-foundations/.openskills.json delete mode 100644 .claude/skills/visual-design-foundations/SKILL.md delete mode 100644 .claude/skills/visual-design-foundations/references/color-systems.md delete mode 100644 .claude/skills/visual-design-foundations/references/spacing-iconography.md delete mode 100644 .claude/skills/visual-design-foundations/references/typography-systems.md delete mode 100644 .claude/skills/web-component-design/.openskills.json delete mode 100644 .claude/skills/web-component-design/SKILL.md delete mode 100644 .claude/skills/web-component-design/references/accessibility-patterns.md delete mode 100644 .claude/skills/web-component-design/references/component-patterns.md delete mode 100644 .claude/skills/web-component-design/references/css-styling-approaches.md delete mode 100644 .claude/skills/web-design-guidelines/.openskills.json delete mode 100644 .claude/skills/web-design-guidelines/SKILL.md delete mode 100644 .claude/skills/zod-validation-expert/.openskills.json delete mode 100644 .claude/skills/zod-validation-expert/SKILL.md create mode 100644 .ruler/10-KARPATHY-GUIDELINES.md delete mode 100644 .ruler/99-OPENSKILLS.md create mode 100755 .ruler/chrome-devtools-openurl.sh diff --git a/.claude/skills/agent-browser/.openskills.json b/.claude/skills/agent-browser/.openskills.json index f7d1be0..b92f7b6 100644 --- a/.claude/skills/agent-browser/.openskills.json +++ b/.claude/skills/agent-browser/.openskills.json @@ -1,6 +1,6 @@ { - "source": "/tmp/skill-selector-curated-184743624", + "source": "/var/folders/vz/qhq7c61947bgqh97s4d3qnb80000gn/T/skill-selector-curated-2029108525", "sourceType": "local", - "localPath": "/tmp/skill-selector-curated-184743624/agent-browser", - "installedAt": "2026-04-21T04:29:26.875Z" + "localPath": "/var/folders/vz/qhq7c61947bgqh97s4d3qnb80000gn/T/skill-selector-curated-2029108525/agent-browser", + "installedAt": "2026-05-25T01:03:03.711Z" } \ No newline at end of file diff --git a/.claude/skills/agent-browser/SKILL.md b/.claude/skills/agent-browser/SKILL.md index 997b66e..cefd752 100644 --- a/.claude/skills/agent-browser/SKILL.md +++ b/.claude/skills/agent-browser/SKILL.md @@ -49,3 +49,7 @@ installed version. - Accessibility-tree snapshots with element refs for reliable interaction - Sessions, authentication vault, state persistence, video recording - Specialized skills for Electron apps, Slack, exploratory testing, cloud providers + +## Observability Dashboard + +The dashboard runs independently of browser sessions on port 4848 and can also be opened through a proxied or forwarded URL such as `https://dashboard.agent-browser.localhost`. Agents should stay on the dashboard origin: session tabs, status, and stream traffic are proxied internally, so session ports do not need to be exposed. diff --git a/.claude/skills/agentcore/.openskills.json b/.claude/skills/agentcore/.openskills.json deleted file mode 100644 index 25b76db..0000000 --- a/.claude/skills/agentcore/.openskills.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "source": "/tmp/skill-selector-curated-184743624", - "sourceType": "local", - "localPath": "/tmp/skill-selector-curated-184743624/agentcore", - "installedAt": "2026-04-21T04:29:26.883Z" -} \ No newline at end of file diff --git a/.claude/skills/agentcore/SKILL.md b/.claude/skills/agentcore/SKILL.md deleted file mode 100644 index 421f695..0000000 --- a/.claude/skills/agentcore/SKILL.md +++ /dev/null @@ -1,115 +0,0 @@ ---- -name: agentcore -description: Run agent-browser on AWS Bedrock AgentCore cloud browsers. Use when the user wants to use AgentCore, run browser automation on AWS, use a cloud browser with AWS credentials, or needs a managed browser session backed by AWS infrastructure. Triggers include "use agentcore", "run on AWS", "cloud browser with AWS", "bedrock browser", "agentcore session", or any task requiring AWS-hosted browser automation. -allowed-tools: Bash(agent-browser:*), Bash(npx agent-browser:*) ---- - -# AWS Bedrock AgentCore - -Run agent-browser on cloud browser sessions hosted by AWS Bedrock AgentCore. All standard agent-browser commands work identically; the only difference is where the browser runs. - -## Setup - -Credentials are resolved automatically: - -1. Environment variables (`AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY`, optionally `AWS_SESSION_TOKEN`) -2. AWS CLI fallback (`aws configure export-credentials`), which supports SSO, IAM roles, and named profiles - -No additional setup is needed if the user already has working AWS credentials. - -## Core Workflow - -```bash -# Open a page on an AgentCore cloud browser -agent-browser -p agentcore open https://example.com - -# Everything else is the same as local Chrome -agent-browser snapshot -i -agent-browser click @e1 -agent-browser screenshot page.png -agent-browser close -``` - -## Environment Variables - -| Variable | Description | Default | -|----------|-------------|---------| -| `AGENTCORE_REGION` | AWS region | `us-east-1` | -| `AGENTCORE_BROWSER_ID` | Browser identifier | `aws.browser.v1` | -| `AGENTCORE_PROFILE_ID` | Persistent browser profile (cookies, localStorage) | (none) | -| `AGENTCORE_SESSION_TIMEOUT` | Session timeout in seconds | `3600` | -| `AWS_PROFILE` | AWS CLI profile for credential resolution | `default` | - -## Persistent Profiles - -Use `AGENTCORE_PROFILE_ID` to persist browser state across sessions. This is useful for maintaining login sessions: - -```bash -# First run: log in -AGENTCORE_PROFILE_ID=my-app agent-browser -p agentcore open https://app.example.com/login -agent-browser snapshot -i -agent-browser fill @e1 "user@example.com" -agent-browser fill @e2 "password" -agent-browser click @e3 -agent-browser close - -# Future runs: already authenticated -AGENTCORE_PROFILE_ID=my-app agent-browser -p agentcore open https://app.example.com/dashboard -``` - -## Live View - -When a session starts, AgentCore prints a Live View URL to stderr. Open it in a browser to watch the session in real time from the AWS Console: - -``` -Session: abc123-def456 -Live View: https://us-east-1.console.aws.amazon.com/bedrock-agentcore/browser/aws.browser.v1/session/abc123-def456# -``` - -## Region Selection - -```bash -# Default: us-east-1 -agent-browser -p agentcore open https://example.com - -# Explicit region -AGENTCORE_REGION=eu-west-1 agent-browser -p agentcore open https://example.com -``` - -## Credential Patterns - -```bash -# Explicit credentials (CI/CD, scripts) -export AWS_ACCESS_KEY_ID=AKIA... -export AWS_SECRET_ACCESS_KEY=... -agent-browser -p agentcore open https://example.com - -# SSO (interactive) -aws sso login --profile my-profile -AWS_PROFILE=my-profile agent-browser -p agentcore open https://example.com - -# IAM role / default credential chain -agent-browser -p agentcore open https://example.com -``` - -## Using with AGENT_BROWSER_PROVIDER - -Set the provider via environment variable to avoid passing `-p agentcore` on every command: - -```bash -export AGENT_BROWSER_PROVIDER=agentcore -export AGENTCORE_REGION=us-east-2 - -agent-browser open https://example.com -agent-browser snapshot -i -agent-browser click @e1 -agent-browser close -``` - -## Common Issues - -**"Failed to run aws CLI"** means AWS CLI is not installed or not in PATH. Either install it or set `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY` directly. - -**"AWS CLI failed: ... Run 'aws sso login'"** means SSO credentials have expired. Run `aws sso login` to refresh them. - -**Session timeout:** The default is 3600 seconds (1 hour). For longer tasks, increase with `AGENTCORE_SESSION_TIMEOUT=7200`. diff --git a/.claude/skills/auth-implementation-patterns/.openskills.json b/.claude/skills/auth-implementation-patterns/.openskills.json deleted file mode 100644 index f54cc82..0000000 --- a/.claude/skills/auth-implementation-patterns/.openskills.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "source": "/tmp/skill-selector-curated-3423638041", - "sourceType": "local", - "localPath": "/tmp/skill-selector-curated-3423638041/auth-implementation-patterns", - "installedAt": "2026-04-07T00:45:24.777Z" -} diff --git a/.claude/skills/auth-implementation-patterns/SKILL.md b/.claude/skills/auth-implementation-patterns/SKILL.md deleted file mode 100644 index 09d8e60..0000000 --- a/.claude/skills/auth-implementation-patterns/SKILL.md +++ /dev/null @@ -1,638 +0,0 @@ ---- -name: auth-implementation-patterns -description: Master authentication and authorization patterns including JWT, OAuth2, session management, and RBAC to build secure, scalable access control systems. Use when implementing auth systems, securing APIs, or debugging security issues. ---- - -# Authentication & Authorization Implementation Patterns - -Build secure, scalable authentication and authorization systems using industry-standard patterns and modern best practices. - -## When to Use This Skill - -- Implementing user authentication systems -- Securing REST or GraphQL APIs -- Adding OAuth2/social login -- Implementing role-based access control (RBAC) -- Designing session management -- Migrating authentication systems -- Debugging auth issues -- Implementing SSO or multi-tenancy - -## Core Concepts - -### 1. Authentication vs Authorization - -**Authentication (AuthN)**: Who are you? - -- Verifying identity (username/password, OAuth, biometrics) -- Issuing credentials (sessions, tokens) -- Managing login/logout - -**Authorization (AuthZ)**: What can you do? - -- Permission checking -- Role-based access control (RBAC) -- Resource ownership validation -- Policy enforcement - -### 2. Authentication Strategies - -**Session-Based:** - -- Server stores session state -- Session ID in cookie -- Traditional, simple, stateful - -**Token-Based (JWT):** - -- Stateless, self-contained -- Scales horizontally -- Can store claims - -**OAuth2/OpenID Connect:** - -- Delegate authentication -- Social login (Google, GitHub) -- Enterprise SSO - -## JWT Authentication - -### Pattern 1: JWT Implementation - -```typescript -// JWT structure: header.payload.signature -import jwt from "jsonwebtoken"; -import { Request, Response, NextFunction } from "express"; - -interface JWTPayload { - userId: string; - email: string; - role: string; - iat: number; - exp: number; -} - -// Generate JWT -function generateTokens(userId: string, email: string, role: string) { - const accessToken = jwt.sign( - { userId, email, role }, - process.env.JWT_SECRET!, - { expiresIn: "15m" }, // Short-lived - ); - - const refreshToken = jwt.sign( - { userId }, - process.env.JWT_REFRESH_SECRET!, - { expiresIn: "7d" }, // Long-lived - ); - - return { accessToken, refreshToken }; -} - -// Verify JWT -function verifyToken(token: string): JWTPayload { - try { - return jwt.verify(token, process.env.JWT_SECRET!) as JWTPayload; - } catch (error) { - if (error instanceof jwt.TokenExpiredError) { - throw new Error("Token expired"); - } - if (error instanceof jwt.JsonWebTokenError) { - throw new Error("Invalid token"); - } - throw error; - } -} - -// Middleware -function authenticate(req: Request, res: Response, next: NextFunction) { - const authHeader = req.headers.authorization; - if (!authHeader?.startsWith("Bearer ")) { - return res.status(401).json({ error: "No token provided" }); - } - - const token = authHeader.substring(7); - try { - const payload = verifyToken(token); - req.user = payload; // Attach user to request - next(); - } catch (error) { - return res.status(401).json({ error: "Invalid token" }); - } -} - -// Usage -app.get("/api/profile", authenticate, (req, res) => { - res.json({ user: req.user }); -}); -``` - -### Pattern 2: Refresh Token Flow - -```typescript -interface StoredRefreshToken { - token: string; - userId: string; - expiresAt: Date; - createdAt: Date; -} - -class RefreshTokenService { - // Store refresh token in database - async storeRefreshToken(userId: string, refreshToken: string) { - const expiresAt = new Date(Date.now() + 7 * 24 * 60 * 60 * 1000); - await db.refreshTokens.create({ - token: await hash(refreshToken), // Hash before storing - userId, - expiresAt, - }); - } - - // Refresh access token - async refreshAccessToken(refreshToken: string) { - // Verify refresh token - let payload; - try { - payload = jwt.verify(refreshToken, process.env.JWT_REFRESH_SECRET!) as { - userId: string; - }; - } catch { - throw new Error("Invalid refresh token"); - } - - // Check if token exists in database - const storedToken = await db.refreshTokens.findOne({ - where: { - token: await hash(refreshToken), - userId: payload.userId, - expiresAt: { $gt: new Date() }, - }, - }); - - if (!storedToken) { - throw new Error("Refresh token not found or expired"); - } - - // Get user - const user = await db.users.findById(payload.userId); - if (!user) { - throw new Error("User not found"); - } - - // Generate new access token - const accessToken = jwt.sign( - { userId: user.id, email: user.email, role: user.role }, - process.env.JWT_SECRET!, - { expiresIn: "15m" }, - ); - - return { accessToken }; - } - - // Revoke refresh token (logout) - async revokeRefreshToken(refreshToken: string) { - await db.refreshTokens.deleteOne({ - token: await hash(refreshToken), - }); - } - - // Revoke all user tokens (logout all devices) - async revokeAllUserTokens(userId: string) { - await db.refreshTokens.deleteMany({ userId }); - } -} - -// API endpoints -app.post("/api/auth/refresh", async (req, res) => { - const { refreshToken } = req.body; - try { - const { accessToken } = - await refreshTokenService.refreshAccessToken(refreshToken); - res.json({ accessToken }); - } catch (error) { - res.status(401).json({ error: "Invalid refresh token" }); - } -}); - -app.post("/api/auth/logout", authenticate, async (req, res) => { - const { refreshToken } = req.body; - await refreshTokenService.revokeRefreshToken(refreshToken); - res.json({ message: "Logged out successfully" }); -}); -``` - -## Session-Based Authentication - -### Pattern 1: Express Session - -```typescript -import session from "express-session"; -import RedisStore from "connect-redis"; -import { createClient } from "redis"; - -// Setup Redis for session storage -const redisClient = createClient({ - url: process.env.REDIS_URL, -}); -await redisClient.connect(); - -app.use( - session({ - store: new RedisStore({ client: redisClient }), - secret: process.env.SESSION_SECRET!, - resave: false, - saveUninitialized: false, - cookie: { - secure: process.env.NODE_ENV === "production", // HTTPS only - httpOnly: true, // No JavaScript access - maxAge: 24 * 60 * 60 * 1000, // 24 hours - sameSite: "strict", // CSRF protection - }, - }), -); - -// Login -app.post("/api/auth/login", async (req, res) => { - const { email, password } = req.body; - - const user = await db.users.findOne({ email }); - if (!user || !(await verifyPassword(password, user.passwordHash))) { - return res.status(401).json({ error: "Invalid credentials" }); - } - - // Store user in session - req.session.userId = user.id; - req.session.role = user.role; - - res.json({ user: { id: user.id, email: user.email, role: user.role } }); -}); - -// Session middleware -function requireAuth(req: Request, res: Response, next: NextFunction) { - if (!req.session.userId) { - return res.status(401).json({ error: "Not authenticated" }); - } - next(); -} - -// Protected route -app.get("/api/profile", requireAuth, async (req, res) => { - const user = await db.users.findById(req.session.userId); - res.json({ user }); -}); - -// Logout -app.post("/api/auth/logout", (req, res) => { - req.session.destroy((err) => { - if (err) { - return res.status(500).json({ error: "Logout failed" }); - } - res.clearCookie("connect.sid"); - res.json({ message: "Logged out successfully" }); - }); -}); -``` - -## OAuth2 / Social Login - -### Pattern 1: OAuth2 with Passport.js - -```typescript -import passport from "passport"; -import { Strategy as GoogleStrategy } from "passport-google-oauth20"; -import { Strategy as GitHubStrategy } from "passport-github2"; - -// Google OAuth -passport.use( - new GoogleStrategy( - { - clientID: process.env.GOOGLE_CLIENT_ID!, - clientSecret: process.env.GOOGLE_CLIENT_SECRET!, - callbackURL: "/api/auth/google/callback", - }, - async (accessToken, refreshToken, profile, done) => { - try { - // Find or create user - let user = await db.users.findOne({ - googleId: profile.id, - }); - - if (!user) { - user = await db.users.create({ - googleId: profile.id, - email: profile.emails?.[0]?.value, - name: profile.displayName, - avatar: profile.photos?.[0]?.value, - }); - } - - return done(null, user); - } catch (error) { - return done(error, undefined); - } - }, - ), -); - -// Routes -app.get( - "/api/auth/google", - passport.authenticate("google", { - scope: ["profile", "email"], - }), -); - -app.get( - "/api/auth/google/callback", - passport.authenticate("google", { session: false }), - (req, res) => { - // Generate JWT - const tokens = generateTokens(req.user.id, req.user.email, req.user.role); - // Redirect to frontend with token - res.redirect( - `${process.env.FRONTEND_URL}/auth/callback?token=${tokens.accessToken}`, - ); - }, -); -``` - -## Authorization Patterns - -### Pattern 1: Role-Based Access Control (RBAC) - -```typescript -enum Role { - USER = "user", - MODERATOR = "moderator", - ADMIN = "admin", -} - -const roleHierarchy: Record = { - [Role.ADMIN]: [Role.ADMIN, Role.MODERATOR, Role.USER], - [Role.MODERATOR]: [Role.MODERATOR, Role.USER], - [Role.USER]: [Role.USER], -}; - -function hasRole(userRole: Role, requiredRole: Role): boolean { - return roleHierarchy[userRole].includes(requiredRole); -} - -// Middleware -function requireRole(...roles: Role[]) { - return (req: Request, res: Response, next: NextFunction) => { - if (!req.user) { - return res.status(401).json({ error: "Not authenticated" }); - } - - if (!roles.some((role) => hasRole(req.user.role, role))) { - return res.status(403).json({ error: "Insufficient permissions" }); - } - - next(); - }; -} - -// Usage -app.delete( - "/api/users/:id", - authenticate, - requireRole(Role.ADMIN), - async (req, res) => { - // Only admins can delete users - await db.users.delete(req.params.id); - res.json({ message: "User deleted" }); - }, -); -``` - -### Pattern 2: Permission-Based Access Control - -```typescript -enum Permission { - READ_USERS = "read:users", - WRITE_USERS = "write:users", - DELETE_USERS = "delete:users", - READ_POSTS = "read:posts", - WRITE_POSTS = "write:posts", -} - -const rolePermissions: Record = { - [Role.USER]: [Permission.READ_POSTS, Permission.WRITE_POSTS], - [Role.MODERATOR]: [ - Permission.READ_POSTS, - Permission.WRITE_POSTS, - Permission.READ_USERS, - ], - [Role.ADMIN]: Object.values(Permission), -}; - -function hasPermission(userRole: Role, permission: Permission): boolean { - return rolePermissions[userRole]?.includes(permission) ?? false; -} - -function requirePermission(...permissions: Permission[]) { - return (req: Request, res: Response, next: NextFunction) => { - if (!req.user) { - return res.status(401).json({ error: "Not authenticated" }); - } - - const hasAllPermissions = permissions.every((permission) => - hasPermission(req.user.role, permission), - ); - - if (!hasAllPermissions) { - return res.status(403).json({ error: "Insufficient permissions" }); - } - - next(); - }; -} - -// Usage -app.get( - "/api/users", - authenticate, - requirePermission(Permission.READ_USERS), - async (req, res) => { - const users = await db.users.findAll(); - res.json({ users }); - }, -); -``` - -### Pattern 3: Resource Ownership - -```typescript -// Check if user owns resource -async function requireOwnership( - resourceType: "post" | "comment", - resourceIdParam: string = "id", -) { - return async (req: Request, res: Response, next: NextFunction) => { - if (!req.user) { - return res.status(401).json({ error: "Not authenticated" }); - } - - const resourceId = req.params[resourceIdParam]; - - // Admins can access anything - if (req.user.role === Role.ADMIN) { - return next(); - } - - // Check ownership - let resource; - if (resourceType === "post") { - resource = await db.posts.findById(resourceId); - } else if (resourceType === "comment") { - resource = await db.comments.findById(resourceId); - } - - if (!resource) { - return res.status(404).json({ error: "Resource not found" }); - } - - if (resource.userId !== req.user.userId) { - return res.status(403).json({ error: "Not authorized" }); - } - - next(); - }; -} - -// Usage -app.put( - "/api/posts/:id", - authenticate, - requireOwnership("post"), - async (req, res) => { - // User can only update their own posts - const post = await db.posts.update(req.params.id, req.body); - res.json({ post }); - }, -); -``` - -## Security Best Practices - -### Pattern 1: Password Security - -```typescript -import bcrypt from "bcrypt"; -import { z } from "zod"; - -// Password validation schema -const passwordSchema = z - .string() - .min(12, "Password must be at least 12 characters") - .regex(/[A-Z]/, "Password must contain uppercase letter") - .regex(/[a-z]/, "Password must contain lowercase letter") - .regex(/[0-9]/, "Password must contain number") - .regex(/[^A-Za-z0-9]/, "Password must contain special character"); - -// Hash password -async function hashPassword(password: string): Promise { - const saltRounds = 12; // 2^12 iterations - return bcrypt.hash(password, saltRounds); -} - -// Verify password -async function verifyPassword( - password: string, - hash: string, -): Promise { - return bcrypt.compare(password, hash); -} - -// Registration with password validation -app.post("/api/auth/register", async (req, res) => { - try { - const { email, password } = req.body; - - // Validate password - passwordSchema.parse(password); - - // Check if user exists - const existingUser = await db.users.findOne({ email }); - if (existingUser) { - return res.status(400).json({ error: "Email already registered" }); - } - - // Hash password - const passwordHash = await hashPassword(password); - - // Create user - const user = await db.users.create({ - email, - passwordHash, - }); - - // Generate tokens - const tokens = generateTokens(user.id, user.email, user.role); - - res.status(201).json({ - user: { id: user.id, email: user.email }, - ...tokens, - }); - } catch (error) { - if (error instanceof z.ZodError) { - return res.status(400).json({ error: error.errors[0].message }); - } - res.status(500).json({ error: "Registration failed" }); - } -}); -``` - -### Pattern 2: Rate Limiting - -```typescript -import rateLimit from "express-rate-limit"; -import RedisStore from "rate-limit-redis"; - -// Login rate limiter -const loginLimiter = rateLimit({ - store: new RedisStore({ client: redisClient }), - windowMs: 15 * 60 * 1000, // 15 minutes - max: 5, // 5 attempts - message: "Too many login attempts, please try again later", - standardHeaders: true, - legacyHeaders: false, -}); - -// API rate limiter -const apiLimiter = rateLimit({ - windowMs: 60 * 1000, // 1 minute - max: 100, // 100 requests per minute - standardHeaders: true, -}); - -// Apply to routes -app.post("/api/auth/login", loginLimiter, async (req, res) => { - // Login logic -}); - -app.use("/api/", apiLimiter); -``` - -## Best Practices - -1. **Never Store Plain Passwords**: Always hash with bcrypt/argon2 -2. **Use HTTPS**: Encrypt data in transit -3. **Short-Lived Access Tokens**: 15-30 minutes max -4. **Secure Cookies**: httpOnly, secure, sameSite flags -5. **Validate All Input**: Email format, password strength -6. **Rate Limit Auth Endpoints**: Prevent brute force attacks -7. **Implement CSRF Protection**: For session-based auth -8. **Rotate Secrets Regularly**: JWT secrets, session secrets -9. **Log Security Events**: Login attempts, failed auth -10. **Use MFA When Possible**: Extra security layer - -## Common Pitfalls - -- **Weak Passwords**: Enforce strong password policies -- **JWT in localStorage**: Vulnerable to XSS, use httpOnly cookies -- **No Token Expiration**: Tokens should expire -- **Client-Side Auth Checks Only**: Always validate server-side -- **Insecure Password Reset**: Use secure tokens with expiration -- **No Rate Limiting**: Vulnerable to brute force -- **Trusting Client Data**: Always validate on server diff --git a/.claude/skills/bun-development/.openskills.json b/.claude/skills/bun-development/.openskills.json deleted file mode 100644 index ffb1625..0000000 --- a/.claude/skills/bun-development/.openskills.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "source": "/tmp/skill-selector-curated-3423638041", - "sourceType": "local", - "localPath": "/tmp/skill-selector-curated-3423638041/bun-development", - "installedAt": "2026-04-07T00:45:24.781Z" -} diff --git a/.claude/skills/bun-development/SKILL.md b/.claude/skills/bun-development/SKILL.md deleted file mode 100644 index 40566da..0000000 --- a/.claude/skills/bun-development/SKILL.md +++ /dev/null @@ -1,696 +0,0 @@ ---- -name: bun-development -description: "Fast, modern JavaScript/TypeScript development with the Bun runtime, inspired by [oven-sh/bun](https://github.com/oven-sh/bun)." -risk: critical -source: community -date_added: "2026-02-27" ---- - - - -# ⚡ Bun Development - -> Fast, modern JavaScript/TypeScript development with the Bun runtime, inspired by [oven-sh/bun](https://github.com/oven-sh/bun). - -## When to Use This Skill - -Use this skill when: - -- Starting new JS/TS projects with Bun -- Migrating from Node.js to Bun -- Optimizing development speed -- Using Bun's built-in tools (bundler, test runner) -- Troubleshooting Bun-specific issues - ---- - -## 1. Getting Started - -### 1.1 Installation - -```bash -# macOS / Linux -curl -fsSL https://bun.sh/install | bash - -# Windows -powershell -c "irm bun.sh/install.ps1 | iex" - -# Homebrew -brew tap oven-sh/bun -brew install bun - -# npm (if needed) -npm install -g bun - -# Upgrade -bun upgrade -``` - -### 1.2 Why Bun? - -| Feature | Bun | Node.js | -| :-------------- | :------------- | :-------------------------- | -| Startup time | ~25ms | ~100ms+ | -| Package install | 10-100x faster | Baseline | -| TypeScript | Native | Requires transpiler | -| JSX | Native | Requires transpiler | -| Test runner | Built-in | External (Jest, Vitest) | -| Bundler | Built-in | External (Webpack, esbuild) | - ---- - -## 2. Project Setup - -### 2.1 Create New Project - -```bash -# Initialize project -bun init - -# Creates: -# ├── package.json -# ├── tsconfig.json -# ├── index.ts -# └── README.md - -# With specific template -bun create