agentvibes 2.0.17 → 2.0.20
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/.bmad-core/agent-teams/team-all.yaml +15 -0
- package/.bmad-core/agent-teams/team-fullstack.yaml +19 -0
- package/.bmad-core/agent-teams/team-ide-minimal.yaml +11 -0
- package/.bmad-core/agent-teams/team-no-ui.yaml +14 -0
- package/.bmad-core/agents/analyst.md +84 -0
- package/.bmad-core/agents/architect.md +85 -0
- package/.bmad-core/agents/bmad-master.md +110 -0
- package/.bmad-core/agents/bmad-orchestrator.md +147 -0
- package/.bmad-core/agents/dev.md +81 -0
- package/.bmad-core/agents/pm.md +84 -0
- package/.bmad-core/agents/po.md +79 -0
- package/.bmad-core/agents/qa.md +87 -0
- package/.bmad-core/agents/sm.md +65 -0
- package/.bmad-core/agents/ux-expert.md +69 -0
- package/.bmad-core/checklists/architect-checklist.md +440 -0
- package/.bmad-core/checklists/change-checklist.md +184 -0
- package/.bmad-core/checklists/pm-checklist.md +372 -0
- package/.bmad-core/checklists/po-master-checklist.md +434 -0
- package/.bmad-core/checklists/story-dod-checklist.md +96 -0
- package/.bmad-core/checklists/story-draft-checklist.md +155 -0
- package/.bmad-core/core-config.yaml +22 -0
- package/.bmad-core/data/bmad-kb.md +809 -0
- package/.bmad-core/data/brainstorming-techniques.md +38 -0
- package/.bmad-core/data/elicitation-methods.md +156 -0
- package/.bmad-core/data/technical-preferences.md +5 -0
- package/.bmad-core/data/test-levels-framework.md +148 -0
- package/.bmad-core/data/test-priorities-matrix.md +174 -0
- package/.bmad-core/enhanced-ide-development-workflow.md +248 -0
- package/.bmad-core/install-manifest.yaml +230 -0
- package/.bmad-core/tasks/advanced-elicitation.md +119 -0
- package/.bmad-core/tasks/apply-qa-fixes.md +150 -0
- package/.bmad-core/tasks/brownfield-create-epic.md +162 -0
- package/.bmad-core/tasks/brownfield-create-story.md +149 -0
- package/.bmad-core/tasks/correct-course.md +72 -0
- package/.bmad-core/tasks/create-brownfield-story.md +314 -0
- package/.bmad-core/tasks/create-deep-research-prompt.md +280 -0
- package/.bmad-core/tasks/create-doc.md +103 -0
- package/.bmad-core/tasks/create-next-story.md +114 -0
- package/.bmad-core/tasks/document-project.md +345 -0
- package/.bmad-core/tasks/execute-checklist.md +88 -0
- package/.bmad-core/tasks/facilitate-brainstorming-session.md +138 -0
- package/.bmad-core/tasks/generate-ai-frontend-prompt.md +53 -0
- package/.bmad-core/tasks/index-docs.md +175 -0
- package/.bmad-core/tasks/kb-mode-interaction.md +77 -0
- package/.bmad-core/tasks/nfr-assess.md +345 -0
- package/.bmad-core/tasks/qa-gate.md +163 -0
- package/.bmad-core/tasks/review-story.md +316 -0
- package/.bmad-core/tasks/risk-profile.md +355 -0
- package/.bmad-core/tasks/shard-doc.md +187 -0
- package/.bmad-core/tasks/test-design.md +176 -0
- package/.bmad-core/tasks/trace-requirements.md +266 -0
- package/.bmad-core/tasks/validate-next-story.md +136 -0
- package/.bmad-core/templates/architecture-tmpl.yaml +651 -0
- package/.bmad-core/templates/brainstorming-output-tmpl.yaml +156 -0
- package/.bmad-core/templates/brownfield-architecture-tmpl.yaml +477 -0
- package/.bmad-core/templates/brownfield-prd-tmpl.yaml +281 -0
- package/.bmad-core/templates/competitor-analysis-tmpl.yaml +307 -0
- package/.bmad-core/templates/front-end-architecture-tmpl.yaml +219 -0
- package/.bmad-core/templates/front-end-spec-tmpl.yaml +350 -0
- package/.bmad-core/templates/fullstack-architecture-tmpl.yaml +824 -0
- package/.bmad-core/templates/market-research-tmpl.yaml +253 -0
- package/.bmad-core/templates/prd-tmpl.yaml +203 -0
- package/.bmad-core/templates/project-brief-tmpl.yaml +222 -0
- package/.bmad-core/templates/qa-gate-tmpl.yaml +103 -0
- package/.bmad-core/templates/story-tmpl.yaml +138 -0
- package/.bmad-core/user-guide.md +577 -0
- package/.bmad-core/utils/bmad-doc-template.md +327 -0
- package/.bmad-core/utils/workflow-management.md +71 -0
- package/.bmad-core/workflows/brownfield-fullstack.yaml +298 -0
- package/.bmad-core/workflows/brownfield-service.yaml +188 -0
- package/.bmad-core/workflows/brownfield-ui.yaml +198 -0
- package/.bmad-core/workflows/greenfield-fullstack.yaml +241 -0
- package/.bmad-core/workflows/greenfield-service.yaml +207 -0
- package/.bmad-core/workflows/greenfield-ui.yaml +236 -0
- package/.bmad-core/working-in-the-brownfield.md +606 -0
- package/.claude/activation-instructions +54 -0
- package/.claude/commands/BMad/agents/analyst.md +88 -0
- package/.claude/commands/BMad/agents/architect.md +89 -0
- package/.claude/commands/BMad/agents/bmad-master.md +114 -0
- package/.claude/commands/BMad/agents/bmad-orchestrator.md +151 -0
- package/.claude/commands/BMad/agents/dev.md +85 -0
- package/.claude/commands/BMad/agents/pm.md +88 -0
- package/.claude/commands/BMad/agents/po.md +83 -0
- package/.claude/commands/BMad/agents/qa.md +91 -0
- package/.claude/commands/BMad/agents/sm.md +69 -0
- package/.claude/commands/BMad/agents/ux-expert.md +73 -0
- package/.claude/commands/BMad/tasks/advanced-elicitation.md +123 -0
- package/.claude/commands/BMad/tasks/apply-qa-fixes.md +154 -0
- package/.claude/commands/BMad/tasks/brownfield-create-epic.md +166 -0
- package/.claude/commands/BMad/tasks/brownfield-create-story.md +153 -0
- package/.claude/commands/BMad/tasks/correct-course.md +76 -0
- package/.claude/commands/BMad/tasks/create-brownfield-story.md +318 -0
- package/.claude/commands/BMad/tasks/create-deep-research-prompt.md +284 -0
- package/.claude/commands/BMad/tasks/create-doc.md +107 -0
- package/.claude/commands/BMad/tasks/create-next-story.md +118 -0
- package/.claude/commands/BMad/tasks/document-project.md +349 -0
- package/.claude/commands/BMad/tasks/execute-checklist.md +92 -0
- package/.claude/commands/BMad/tasks/facilitate-brainstorming-session.md +142 -0
- package/.claude/commands/BMad/tasks/generate-ai-frontend-prompt.md +57 -0
- package/.claude/commands/BMad/tasks/index-docs.md +179 -0
- package/.claude/commands/BMad/tasks/kb-mode-interaction.md +81 -0
- package/.claude/commands/BMad/tasks/nfr-assess.md +349 -0
- package/.claude/commands/BMad/tasks/qa-gate.md +167 -0
- package/.claude/commands/BMad/tasks/review-story.md +320 -0
- package/.claude/commands/BMad/tasks/risk-profile.md +359 -0
- package/.claude/commands/BMad/tasks/shard-doc.md +191 -0
- package/.claude/commands/BMad/tasks/test-design.md +180 -0
- package/.claude/commands/BMad/tasks/trace-requirements.md +270 -0
- package/.claude/commands/BMad/tasks/validate-next-story.md +140 -0
- package/.claude/github-star-reminder.txt +1 -1
- package/.claude/hooks/bmad-tts-injector.sh +33 -4
- package/.claude/hooks/bmad-voice-manager.sh +146 -10
- package/.claude/hooks/check-output-style.sh +60 -8
- package/.claude/hooks/github-star-reminder.sh +67 -7
- package/.claude/hooks/language-manager.sh +34 -2
- package/.claude/hooks/learn-manager.sh +34 -2
- package/.claude/hooks/personality-manager.sh +34 -1
- package/.claude/hooks/piper-download-voices.sh +131 -9
- package/.claude/hooks/piper-installer.sh +38 -4
- package/.claude/hooks/piper-voice-manager.sh +102 -36
- package/.claude/hooks/play-tts-elevenlabs.sh +32 -6
- package/.claude/hooks/play-tts-piper.sh +79 -18
- package/.claude/hooks/play-tts.sh +34 -3
- package/.claude/hooks/provider-commands.sh +36 -1
- package/.claude/hooks/provider-manager.sh +32 -1
- package/.claude/hooks/replay-target-audio.sh +34 -3
- package/.claude/hooks/sentiment-manager.sh +39 -1
- package/.claude/hooks/speed-manager.sh +36 -2
- package/.claude/hooks/voice-manager.sh +85 -6
- package/.claude/hooks/voices-config.sh +39 -2
- package/README.md +77 -137
- package/RELEASE_NOTES.md +269 -0
- package/RELEASE_NOTES_v2.0.17_DRAFT.md +650 -0
- package/agentvibes.org/.claude/audio/tts-padded-1760744118.mp3 +0 -0
- package/agentvibes.org/.claude/audio/tts-padded-1760748535.mp3 +0 -0
- package/agentvibes.org/.claude/audio/tts-padded-1760748676.mp3 +0 -0
- package/agentvibes.org/.claude/audio/tts-padded-1760750748.mp3 +0 -0
- package/agentvibes.org/.claude/audio/tts-padded-1760750947.mp3 +0 -0
- package/agentvibes.org/.claude/audio/tts-padded-1760752718.mp3 +0 -0
- package/agentvibes.org/.claude/audio/tts-padded-1760752907.mp3 +0 -0
- package/agentvibes.org/.claude/audio/tts-padded-1760753017.mp3 +0 -0
- package/agentvibes.org/.claude/audio/tts-padded-1760753045.mp3 +0 -0
- package/agentvibes.org/.claude/audio/tts-padded-1760753241.mp3 +0 -0
- package/agentvibes.org/.claude/audio/tts-padded-1760753315.mp3 +0 -0
- package/agentvibes.org/.claude/audio/tts-padded-1760753382.mp3 +0 -0
- package/agentvibes.org/.claude/audio/tts-padded-1760753408.mp3 +0 -0
- package/agentvibes.org/.claude/audio/tts-padded-1760753426.mp3 +0 -0
- package/agentvibes.org/.claude/audio/tts-padded-1760753446.mp3 +0 -0
- package/agentvibes.org/.claude/audio/tts-padded-1760753541.mp3 +0 -0
- package/agentvibes.org/.claude/audio/tts-padded-1760753553.mp3 +0 -0
- package/agentvibes.org/.claude/audio/tts-padded-1760753577.mp3 +0 -0
- package/agentvibes.org/.claude/commands/agent-vibes/add.md +21 -0
- package/agentvibes.org/.claude/commands/agent-vibes/agent-vibes.md +68 -0
- package/agentvibes.org/.claude/commands/agent-vibes/bmad.md +196 -0
- package/agentvibes.org/.claude/commands/agent-vibes/commands.json +77 -0
- package/agentvibes.org/.claude/commands/agent-vibes/get.md +9 -0
- package/agentvibes.org/.claude/commands/agent-vibes/language.md +23 -0
- package/agentvibes.org/.claude/commands/agent-vibes/learn.md +67 -0
- package/agentvibes.org/.claude/commands/agent-vibes/list.md +13 -0
- package/agentvibes.org/.claude/commands/agent-vibes/personality.md +79 -0
- package/agentvibes.org/.claude/commands/agent-vibes/preview.md +17 -0
- package/agentvibes.org/.claude/commands/agent-vibes/provider.md +54 -0
- package/agentvibes.org/.claude/commands/agent-vibes/replay-target.md +14 -0
- package/agentvibes.org/.claude/commands/agent-vibes/replay.md +19 -0
- package/agentvibes.org/.claude/commands/agent-vibes/sample.md +12 -0
- package/agentvibes.org/.claude/commands/agent-vibes/sentiment.md +52 -0
- package/agentvibes.org/.claude/commands/agent-vibes/set-language.md +47 -0
- package/agentvibes.org/.claude/commands/agent-vibes/set-pretext.md +65 -0
- package/agentvibes.org/.claude/commands/agent-vibes/set-speed.md +41 -0
- package/agentvibes.org/.claude/commands/agent-vibes/switch.md +53 -0
- package/agentvibes.org/.claude/commands/agent-vibes/target-voice.md +26 -0
- package/agentvibes.org/.claude/commands/agent-vibes/target.md +30 -0
- package/agentvibes.org/.claude/commands/agent-vibes/update.md +20 -0
- package/agentvibes.org/.claude/commands/agent-vibes/version.md +10 -0
- package/agentvibes.org/.claude/commands/agent-vibes/whoami.md +7 -0
- package/agentvibes.org/.claude/hooks/bmad-tts-injector.sh +386 -0
- package/agentvibes.org/.claude/hooks/bmad-voice-manager.sh +375 -0
- package/agentvibes.org/.claude/hooks/check-output-style.sh +60 -0
- package/agentvibes.org/.claude/hooks/github-star-reminder.sh +94 -0
- package/agentvibes.org/.claude/hooks/language-manager.sh +360 -0
- package/agentvibes.org/.claude/hooks/learn-manager.sh +443 -0
- package/agentvibes.org/.claude/hooks/personality-manager.sh +324 -0
- package/agentvibes.org/.claude/hooks/piper-download-voices.sh +133 -0
- package/agentvibes.org/.claude/hooks/piper-installer.sh +144 -0
- package/agentvibes.org/.claude/hooks/piper-voice-manager.sh +227 -0
- package/agentvibes.org/.claude/hooks/play-tts-elevenlabs.sh +376 -0
- package/agentvibes.org/.claude/hooks/play-tts-piper.sh +281 -0
- package/agentvibes.org/.claude/hooks/play-tts.sh +69 -0
- package/agentvibes.org/.claude/hooks/provider-commands.sh +505 -0
- package/agentvibes.org/.claude/hooks/provider-manager.sh +248 -0
- package/agentvibes.org/.claude/hooks/replay-target-audio.sh +64 -0
- package/agentvibes.org/.claude/hooks/sentiment-manager.sh +163 -0
- package/agentvibes.org/.claude/hooks/speed-manager.sh +259 -0
- package/agentvibes.org/.claude/hooks/voice-manager.sh +477 -0
- package/agentvibes.org/.claude/hooks/voices-config.sh +33 -0
- package/agentvibes.org/.claude/journal/2025-10-07.html +373 -0
- package/agentvibes.org/.claude/journal/index.html +91 -0
- package/agentvibes.org/.claude/output-styles/agent-vibes.md +203 -0
- package/agentvibes.org/.claude/personalities/angry.md +17 -0
- package/agentvibes.org/.claude/personalities/annoying.md +17 -0
- package/agentvibes.org/.claude/personalities/crass.md +17 -0
- package/agentvibes.org/.claude/personalities/dramatic.md +17 -0
- package/agentvibes.org/.claude/personalities/dry-humor.md +53 -0
- package/agentvibes.org/.claude/personalities/flirty.md +23 -0
- package/agentvibes.org/.claude/personalities/funny.md +17 -0
- package/agentvibes.org/.claude/personalities/grandpa.md +35 -0
- package/agentvibes.org/.claude/personalities/millennial.md +17 -0
- package/agentvibes.org/.claude/personalities/moody.md +17 -0
- package/agentvibes.org/.claude/personalities/normal.md +19 -0
- package/agentvibes.org/.claude/personalities/pirate.md +17 -0
- package/agentvibes.org/.claude/personalities/poetic.md +17 -0
- package/agentvibes.org/.claude/personalities/professional.md +17 -0
- package/agentvibes.org/.claude/personalities/robot.md +17 -0
- package/agentvibes.org/.claude/personalities/sarcastic.md +41 -0
- package/agentvibes.org/.claude/personalities/sassy.md +17 -0
- package/agentvibes.org/.claude/personalities/surfer-dude.md +17 -0
- package/agentvibes.org/.claude/personalities/zen.md +17 -0
- package/agentvibes.org/.claude/piper-voices-dir.txt +1 -0
- package/agentvibes.org/.claude/plugins/bmad-voices.md +42 -0
- package/agentvibes.org/.claude/tts-provider.txt +1 -0
- package/agentvibes.org/.mcp-minimal.json +60 -0
- package/agentvibes.org/CHANGELOG.md +56 -0
- package/agentvibes.org/README.md +93 -0
- package/agentvibes.org/app/(auth)/layout.tsx +15 -0
- package/agentvibes.org/app/(auth)/reset-password/page.tsx +45 -0
- package/agentvibes.org/app/(auth)/signin/page.tsx +82 -0
- package/agentvibes.org/app/(auth)/signup/page.tsx +104 -0
- package/agentvibes.org/app/(default)/blog/[slug]/page.tsx +128 -0
- package/agentvibes.org/app/(default)/blog/page.tsx +95 -0
- package/agentvibes.org/app/(default)/layout.tsx +31 -0
- package/agentvibes.org/app/(default)/page.tsx +20 -0
- package/agentvibes.org/app/api/hello/route.ts +3 -0
- package/agentvibes.org/app/css/additional-styles/theme.css +82 -0
- package/agentvibes.org/app/css/additional-styles/utility-patterns.css +55 -0
- package/agentvibes.org/app/css/style.css +100 -0
- package/agentvibes.org/app/layout.tsx +63 -0
- package/agentvibes.org/components/code-block.tsx +27 -0
- package/agentvibes.org/components/cta.tsx +58 -0
- package/agentvibes.org/components/features.tsx +256 -0
- package/agentvibes.org/components/hero-home.tsx +133 -0
- package/agentvibes.org/components/mdx-components.tsx +128 -0
- package/agentvibes.org/components/modal-video.tsx +137 -0
- package/agentvibes.org/components/page-illustration.tsx +55 -0
- package/agentvibes.org/components/spotlight.tsx +77 -0
- package/agentvibes.org/components/testimonials.tsx +282 -0
- package/agentvibes.org/components/ui/footer.tsx +82 -0
- package/agentvibes.org/components/ui/header.tsx +68 -0
- package/agentvibes.org/components/ui/logo.tsx +10 -0
- package/agentvibes.org/components/workflows.tsx +176 -0
- package/agentvibes.org/content/blog/discovering-new-piper-voices.mdx +253 -0
- package/agentvibes.org/content/blog/getting-started-agentvibes.mdx +228 -0
- package/agentvibes.org/content/blog/introducing-agentvibes-v2.mdx +250 -0
- package/agentvibes.org/content/blog/language-learning-with-agentvibes.mdx +142 -0
- package/agentvibes.org/content/blog/voice-personalities-guide.mdx +119 -0
- package/agentvibes.org/lib/blog.ts +73 -0
- package/agentvibes.org/next.config.js +6 -0
- package/agentvibes.org/package-lock.json +4285 -0
- package/agentvibes.org/package.json +40 -0
- package/agentvibes.org/pnpm-lock.yaml +1141 -0
- package/agentvibes.org/postcss.config.js +5 -0
- package/agentvibes.org/public/audio/02-sarcastic.mp3 +0 -0
- package/agentvibes.org/public/audio/03-angry.mp3 +0 -0
- package/agentvibes.org/public/audio/04-grandpa.mp3 +0 -0
- package/agentvibes.org/public/audio/05-sarcastic-example2.mp3 +0 -0
- package/agentvibes.org/public/audio/french-rachel.mp3 +0 -0
- package/agentvibes.org/public/audio/piper-voices/speaker_0_Cori_Samuel.wav +0 -0
- package/agentvibes.org/public/audio/piper-voices/speaker_10_Steve_C.wav +0 -0
- package/agentvibes.org/public/audio/piper-voices/speaker_11_Owlivia.wav +0 -0
- package/agentvibes.org/public/audio/piper-voices/speaker_12_Paul_Hampton.wav +0 -0
- package/agentvibes.org/public/audio/piper-voices/speaker_13_Jennifer_Dorr.wav +0 -0
- package/agentvibes.org/public/audio/piper-voices/speaker_14_Emily_Cripps.wav +0 -0
- package/agentvibes.org/public/audio/piper-voices/speaker_15_Martin_Clifton.wav +0 -0
- package/agentvibes.org/public/audio/piper-voices/speaker_1_Kara_Shallenberg.wav +0 -0
- package/agentvibes.org/public/audio/piper-voices/speaker_2_Kristin_Hughes.wav +0 -0
- package/agentvibes.org/public/audio/piper-voices/speaker_3_Maria_Kasper.wav +0 -0
- package/agentvibes.org/public/audio/piper-voices/speaker_4_Mike_Pelton.wav +0 -0
- package/agentvibes.org/public/audio/piper-voices/speaker_5_Mark_Nelson.wav +0 -0
- package/agentvibes.org/public/audio/piper-voices/speaker_6_Michael_Scherer.wav +0 -0
- package/agentvibes.org/public/audio/piper-voices/speaker_7_James_K_White.wav +0 -0
- package/agentvibes.org/public/audio/piper-voices/speaker_8_Rose_Ibex.wav +0 -0
- package/agentvibes.org/public/audio/piper-voices/speaker_9_progressingamerica.wav +0 -0
- package/agentvibes.org/public/audio/spanish-antoni.mp3 +0 -0
- package/agentvibes.org/public/favicon.ico +0 -0
- package/agentvibes.org/public/fonts/nacelle-italic.woff2 +0 -0
- package/agentvibes.org/public/fonts/nacelle-regular.woff2 +0 -0
- package/agentvibes.org/public/fonts/nacelle-semibold.woff2 +0 -0
- package/agentvibes.org/public/fonts/nacelle-semibolditalic.woff2 +0 -0
- package/agentvibes.org/public/images/blurred-shape-gray.svg +1 -0
- package/agentvibes.org/public/images/blurred-shape.svg +1 -0
- package/agentvibes.org/public/images/client-logo-01.svg +1 -0
- package/agentvibes.org/public/images/client-logo-02.svg +1 -0
- package/agentvibes.org/public/images/client-logo-03.svg +1 -0
- package/agentvibes.org/public/images/client-logo-04.svg +1 -0
- package/agentvibes.org/public/images/client-logo-05.svg +1 -0
- package/agentvibes.org/public/images/client-logo-06.svg +1 -0
- package/agentvibes.org/public/images/client-logo-07.svg +1 -0
- package/agentvibes.org/public/images/client-logo-08.svg +1 -0
- package/agentvibes.org/public/images/client-logo-09.svg +1 -0
- package/agentvibes.org/public/images/features.png +0 -0
- package/agentvibes.org/public/images/footer-illustration.svg +1 -0
- package/agentvibes.org/public/images/hero-image-01.jpg +0 -0
- package/agentvibes.org/public/images/logo.svg +1 -0
- package/agentvibes.org/public/images/page-illustration.svg +1 -0
- package/agentvibes.org/public/images/secondary-illustration.svg +1 -0
- package/agentvibes.org/public/images/testimonial-01.jpg +0 -0
- package/agentvibes.org/public/images/testimonial-02.jpg +0 -0
- package/agentvibes.org/public/images/testimonial-03.jpg +0 -0
- package/agentvibes.org/public/images/testimonial-04.jpg +0 -0
- package/agentvibes.org/public/images/testimonial-05.jpg +0 -0
- package/agentvibes.org/public/images/testimonial-06.jpg +0 -0
- package/agentvibes.org/public/images/testimonial-07.jpg +0 -0
- package/agentvibes.org/public/images/testimonial-08.jpg +0 -0
- package/agentvibes.org/public/images/testimonial-09.jpg +0 -0
- package/agentvibes.org/public/images/workflow-01.png +0 -0
- package/agentvibes.org/public/images/workflow-02.png +0 -0
- package/agentvibes.org/public/images/workflow-03.png +0 -0
- package/agentvibes.org/public/videos/video.mp4 +0 -0
- package/agentvibes.org/tsconfig.json +28 -0
- package/agentvibes.org/utils/useMasonry.tsx +67 -0
- package/agentvibes.org/utils/useMousePosition.tsx +27 -0
- package/docs/ai-optimized-documentation-standards.md +78 -4
- package/docs/bryce-beattie-voice-licensing.md +131 -0
- package/docs/commands.md +21 -1
- package/docs/mcp-setup.md +1 -6
- package/github-star-reminder.txt +1 -0
- package/linkedin/vibe-coding-and-pulseaudio.md +121 -0
- package/mcp-server/WINDOWS_SETUP.md +182 -199
- package/mcp-server/docs/elevenlabs-setup.md +213 -0
- package/mcp-server/docs/troubleshooting-audio.md +316 -0
- package/mcp-server/server.py +38 -4
- package/mcp-server/test_server.py +38 -3
- package/package.json +1 -1
- package/scripts/audio-tunnel.config +17 -0
- package/test/helpers/test-helper.bash +31 -4
- package/test/unit/personality-manager.bats +22 -6
- package/test/unit/play-tts.bats +21 -3
- package/test/unit/provider-manager.bats +508 -0
- package/test/unit/speed-manager.bats +436 -0
- package/test/unit/voice-manager.bats +4 -1
- package/.claude/piper-voices/en_US-lessac-medium.onnx +0 -0
- package/.claude/piper-voices/en_US-lessac-medium.onnx.json +0 -493
|
@@ -0,0 +1,508 @@
|
|
|
1
|
+
#!/usr/bin/env bats
|
|
2
|
+
# Unit tests for provider-manager.sh
|
|
3
|
+
|
|
4
|
+
load ../helpers/test-helper
|
|
5
|
+
|
|
6
|
+
setup() {
|
|
7
|
+
setup_test_env
|
|
8
|
+
setup_agentvibes_scripts
|
|
9
|
+
mock_curl
|
|
10
|
+
mock_audio_players
|
|
11
|
+
|
|
12
|
+
PROVIDER_MANAGER="$TEST_CLAUDE_DIR/hooks/provider-manager.sh"
|
|
13
|
+
PROVIDER_FILE="$CLAUDE_PROJECT_DIR/.claude/tts-provider.txt"
|
|
14
|
+
VOICE_FILE="$CLAUDE_PROJECT_DIR/.claude/tts-voice.txt"
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
teardown() {
|
|
18
|
+
teardown_test_env
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
# ============================================================================
|
|
22
|
+
# Provider Listing Tests
|
|
23
|
+
# ============================================================================
|
|
24
|
+
|
|
25
|
+
@test "provider-manager list shows available providers" {
|
|
26
|
+
run "$PROVIDER_MANAGER" list
|
|
27
|
+
|
|
28
|
+
[ "$status" -eq 0 ]
|
|
29
|
+
|
|
30
|
+
# Should show at least elevenlabs and piper
|
|
31
|
+
assert_output_contains "elevenlabs"
|
|
32
|
+
assert_output_contains "piper"
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
@test "provider-manager list finds providers from play-tts files" {
|
|
36
|
+
run "$PROVIDER_MANAGER" list
|
|
37
|
+
|
|
38
|
+
[ "$status" -eq 0 ]
|
|
39
|
+
|
|
40
|
+
# Verify it's detecting actual provider scripts
|
|
41
|
+
# Both elevenlabs and piper should be present
|
|
42
|
+
[[ "$output" =~ "elevenlabs" ]]
|
|
43
|
+
[[ "$output" =~ "piper" ]]
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
@test "provider-manager list works with no providers (edge case)" {
|
|
47
|
+
# Temporarily rename provider files to test no providers case
|
|
48
|
+
local hooks_dir="$TEST_CLAUDE_DIR/hooks"
|
|
49
|
+
mv "$hooks_dir/play-tts-elevenlabs.sh" "$hooks_dir/play-tts-elevenlabs.sh.bak" 2>/dev/null || true
|
|
50
|
+
mv "$hooks_dir/play-tts-piper.sh" "$hooks_dir/play-tts-piper.sh.bak" 2>/dev/null || true
|
|
51
|
+
|
|
52
|
+
run "$PROVIDER_MANAGER" list
|
|
53
|
+
|
|
54
|
+
[ "$status" -eq 0 ]
|
|
55
|
+
assert_output_contains "No providers found"
|
|
56
|
+
|
|
57
|
+
# Restore files
|
|
58
|
+
mv "$hooks_dir/play-tts-elevenlabs.sh.bak" "$hooks_dir/play-tts-elevenlabs.sh" 2>/dev/null || true
|
|
59
|
+
mv "$hooks_dir/play-tts-piper.sh.bak" "$hooks_dir/play-tts-piper.sh" 2>/dev/null || true
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
# ============================================================================
|
|
63
|
+
# Provider Switching Tests
|
|
64
|
+
# ============================================================================
|
|
65
|
+
|
|
66
|
+
@test "provider-manager switch to elevenlabs" {
|
|
67
|
+
run "$PROVIDER_MANAGER" switch "elevenlabs"
|
|
68
|
+
|
|
69
|
+
[ "$status" -eq 0 ]
|
|
70
|
+
assert_output_contains "Active provider set to: elevenlabs"
|
|
71
|
+
|
|
72
|
+
# Verify provider was saved
|
|
73
|
+
assert_file_exists "$PROVIDER_FILE"
|
|
74
|
+
assert_file_contains "$PROVIDER_FILE" "elevenlabs"
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
@test "provider-manager switch to piper" {
|
|
78
|
+
run "$PROVIDER_MANAGER" switch "piper"
|
|
79
|
+
|
|
80
|
+
[ "$status" -eq 0 ]
|
|
81
|
+
assert_output_contains "Active provider set to: piper"
|
|
82
|
+
|
|
83
|
+
assert_file_exists "$PROVIDER_FILE"
|
|
84
|
+
assert_file_contains "$PROVIDER_FILE" "piper"
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
@test "provider-manager set command works like switch" {
|
|
88
|
+
run "$PROVIDER_MANAGER" set "elevenlabs"
|
|
89
|
+
|
|
90
|
+
[ "$status" -eq 0 ]
|
|
91
|
+
assert_output_contains "Active provider set to: elevenlabs"
|
|
92
|
+
assert_file_contains "$PROVIDER_FILE" "elevenlabs"
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
@test "provider-manager switch with invalid provider fails" {
|
|
96
|
+
run "$PROVIDER_MANAGER" switch "nonexistent"
|
|
97
|
+
|
|
98
|
+
[ "$status" -eq 1 ]
|
|
99
|
+
assert_output_contains "Error: Provider 'nonexistent' not found"
|
|
100
|
+
assert_output_contains "Available providers:"
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
@test "provider-manager switch requires provider name" {
|
|
104
|
+
run "$PROVIDER_MANAGER" switch
|
|
105
|
+
|
|
106
|
+
[ "$status" -eq 1 ]
|
|
107
|
+
assert_output_contains "Error: Provider name required"
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
@test "provider-manager switch resets voice to default" {
|
|
111
|
+
# Set a voice first
|
|
112
|
+
echo "TestVoice" > "$VOICE_FILE"
|
|
113
|
+
|
|
114
|
+
run "$PROVIDER_MANAGER" switch "piper"
|
|
115
|
+
|
|
116
|
+
[ "$status" -eq 0 ]
|
|
117
|
+
assert_output_contains "voice reset to default"
|
|
118
|
+
|
|
119
|
+
# Voice file should be removed
|
|
120
|
+
[[ ! -f "$VOICE_FILE" ]]
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
@test "provider-manager switching providers removes voice file" {
|
|
124
|
+
# Create voice file
|
|
125
|
+
mkdir -p "$(dirname "$VOICE_FILE")"
|
|
126
|
+
echo "Jessica Anne Bogart" > "$VOICE_FILE"
|
|
127
|
+
|
|
128
|
+
"$PROVIDER_MANAGER" switch "elevenlabs"
|
|
129
|
+
|
|
130
|
+
# Voice file should be removed to force default for new provider
|
|
131
|
+
[[ ! -f "$VOICE_FILE" ]]
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
# ============================================================================
|
|
135
|
+
# Provider Persistence Tests
|
|
136
|
+
# ============================================================================
|
|
137
|
+
|
|
138
|
+
@test "provider-manager provider setting persists" {
|
|
139
|
+
# Set provider
|
|
140
|
+
"$PROVIDER_MANAGER" switch "elevenlabs"
|
|
141
|
+
|
|
142
|
+
# Read it back
|
|
143
|
+
run "$PROVIDER_MANAGER" get
|
|
144
|
+
|
|
145
|
+
[ "$status" -eq 0 ]
|
|
146
|
+
[[ "$output" =~ "elevenlabs" ]]
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
@test "provider-manager multiple switches persist correctly" {
|
|
150
|
+
# Switch back and forth
|
|
151
|
+
"$PROVIDER_MANAGER" switch "elevenlabs"
|
|
152
|
+
"$PROVIDER_MANAGER" switch "piper"
|
|
153
|
+
|
|
154
|
+
run "$PROVIDER_MANAGER" get
|
|
155
|
+
|
|
156
|
+
[ "$status" -eq 0 ]
|
|
157
|
+
[[ "$output" =~ "piper" ]]
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
# ============================================================================
|
|
161
|
+
# Provider Detection Tests
|
|
162
|
+
# ============================================================================
|
|
163
|
+
|
|
164
|
+
@test "provider-manager get returns current provider" {
|
|
165
|
+
# Set provider
|
|
166
|
+
echo "elevenlabs" > "$PROVIDER_FILE"
|
|
167
|
+
|
|
168
|
+
run "$PROVIDER_MANAGER" get
|
|
169
|
+
|
|
170
|
+
[ "$status" -eq 0 ]
|
|
171
|
+
[[ "$output" =~ "elevenlabs" ]]
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
@test "provider-manager get returns default when no config exists" {
|
|
175
|
+
# Ensure no provider file exists
|
|
176
|
+
rm -f "$PROVIDER_FILE"
|
|
177
|
+
|
|
178
|
+
run "$PROVIDER_MANAGER" get
|
|
179
|
+
|
|
180
|
+
[ "$status" -eq 0 ]
|
|
181
|
+
# Default is piper (free, offline)
|
|
182
|
+
[[ "$output" =~ "piper" ]]
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
@test "provider-manager get trims whitespace from provider name" {
|
|
186
|
+
# Write provider with extra whitespace
|
|
187
|
+
echo " elevenlabs " > "$PROVIDER_FILE"
|
|
188
|
+
|
|
189
|
+
run "$PROVIDER_MANAGER" get
|
|
190
|
+
|
|
191
|
+
[ "$status" -eq 0 ]
|
|
192
|
+
# Should return clean provider name (may have newline)
|
|
193
|
+
[[ "$output" =~ "elevenlabs" ]]
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
# ============================================================================
|
|
197
|
+
# Provider Validation Tests
|
|
198
|
+
# ============================================================================
|
|
199
|
+
|
|
200
|
+
@test "provider-manager validate checks if provider exists" {
|
|
201
|
+
run "$PROVIDER_MANAGER" validate "elevenlabs"
|
|
202
|
+
|
|
203
|
+
[ "$status" -eq 0 ]
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
@test "provider-manager validate fails for non-existent provider" {
|
|
207
|
+
run "$PROVIDER_MANAGER" validate "fake_provider"
|
|
208
|
+
|
|
209
|
+
[ "$status" -eq 1 ]
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
@test "provider-manager validate requires provider name" {
|
|
213
|
+
run "$PROVIDER_MANAGER" validate
|
|
214
|
+
|
|
215
|
+
[ "$status" -eq 1 ]
|
|
216
|
+
assert_output_contains "Error: Provider name required"
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
# ============================================================================
|
|
220
|
+
# File Location Tests
|
|
221
|
+
# ============================================================================
|
|
222
|
+
|
|
223
|
+
@test "provider-manager uses project-local directory when CLAUDE_PROJECT_DIR is set" {
|
|
224
|
+
# CLAUDE_PROJECT_DIR is set in setup_test_env
|
|
225
|
+
"$PROVIDER_MANAGER" switch "piper"
|
|
226
|
+
|
|
227
|
+
# Should save to project directory
|
|
228
|
+
assert_file_exists "$CLAUDE_PROJECT_DIR/.claude/tts-provider.txt"
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
@test "provider-manager creates parent directory if missing" {
|
|
232
|
+
# Test that mkdir -p works by using a fresh subdirectory
|
|
233
|
+
local test_dir="$TEST_HOME/.claude/subdir"
|
|
234
|
+
rm -rf "$test_dir"
|
|
235
|
+
|
|
236
|
+
# Create provider file in this location
|
|
237
|
+
mkdir -p "$test_dir"
|
|
238
|
+
echo "elevenlabs" > "$test_dir/tts-provider.txt"
|
|
239
|
+
|
|
240
|
+
# Verify directory and file were created
|
|
241
|
+
[[ -d "$test_dir" ]]
|
|
242
|
+
[[ -f "$test_dir/tts-provider.txt" ]]
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
@test "provider-manager falls back to HOME when no project directory" {
|
|
246
|
+
unset CLAUDE_PROJECT_DIR
|
|
247
|
+
|
|
248
|
+
# cd to test home to ensure we're not in a .claude directory tree
|
|
249
|
+
cd "$TEST_HOME"
|
|
250
|
+
|
|
251
|
+
run "$PROVIDER_MANAGER" switch "piper"
|
|
252
|
+
|
|
253
|
+
[ "$status" -eq 0 ]
|
|
254
|
+
|
|
255
|
+
# Should save to HOME
|
|
256
|
+
assert_file_exists "$HOME/.claude/tts-provider.txt"
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
@test "provider-manager searches up directory tree for .claude" {
|
|
260
|
+
unset CLAUDE_PROJECT_DIR
|
|
261
|
+
|
|
262
|
+
# Create .claude in parent directory
|
|
263
|
+
local parent_dir="$TEST_HOME/projects/myproject"
|
|
264
|
+
mkdir -p "$parent_dir/subdir"
|
|
265
|
+
mkdir -p "$TEST_HOME/projects/.claude"
|
|
266
|
+
|
|
267
|
+
cd "$parent_dir/subdir"
|
|
268
|
+
|
|
269
|
+
"$PROVIDER_MANAGER" switch "elevenlabs"
|
|
270
|
+
|
|
271
|
+
# Should find .claude in parent tree
|
|
272
|
+
assert_file_exists "$TEST_HOME/projects/.claude/tts-provider.txt"
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
# ============================================================================
|
|
276
|
+
# Provider Script Path Tests
|
|
277
|
+
# ============================================================================
|
|
278
|
+
|
|
279
|
+
@test "provider-manager returns correct script path for elevenlabs" {
|
|
280
|
+
# Source the provider manager to use its functions
|
|
281
|
+
source "$PROVIDER_MANAGER"
|
|
282
|
+
|
|
283
|
+
run get_provider_script_path "elevenlabs"
|
|
284
|
+
|
|
285
|
+
[ "$status" -eq 0 ]
|
|
286
|
+
[[ "$output" =~ "play-tts-elevenlabs.sh" ]]
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
@test "provider-manager returns correct script path for piper" {
|
|
290
|
+
source "$PROVIDER_MANAGER"
|
|
291
|
+
|
|
292
|
+
run get_provider_script_path "piper"
|
|
293
|
+
|
|
294
|
+
[ "$status" -eq 0 ]
|
|
295
|
+
[[ "$output" =~ "play-tts-piper.sh" ]]
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
@test "provider-manager script path fails for invalid provider" {
|
|
299
|
+
source "$PROVIDER_MANAGER"
|
|
300
|
+
|
|
301
|
+
run get_provider_script_path "invalid"
|
|
302
|
+
|
|
303
|
+
[ "$status" -eq 1 ]
|
|
304
|
+
# Error should go to stderr, captured in output
|
|
305
|
+
[[ "$output" =~ "Error: Provider 'invalid' not found" ]]
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
@test "provider-manager script path requires provider name" {
|
|
309
|
+
source "$PROVIDER_MANAGER"
|
|
310
|
+
|
|
311
|
+
run get_provider_script_path
|
|
312
|
+
|
|
313
|
+
[ "$status" -eq 1 ]
|
|
314
|
+
[[ "$output" =~ "Error: Provider name required" ]]
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
# ============================================================================
|
|
318
|
+
# Config Path Resolution Tests
|
|
319
|
+
# ============================================================================
|
|
320
|
+
|
|
321
|
+
@test "provider-manager config path prioritizes CLAUDE_PROJECT_DIR" {
|
|
322
|
+
source "$PROVIDER_MANAGER"
|
|
323
|
+
|
|
324
|
+
run get_provider_config_path
|
|
325
|
+
|
|
326
|
+
[ "$status" -eq 0 ]
|
|
327
|
+
[[ "$output" =~ "$CLAUDE_PROJECT_DIR/.claude/tts-provider.txt" ]]
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
@test "provider-manager config path searches directory tree" {
|
|
331
|
+
source "$PROVIDER_MANAGER"
|
|
332
|
+
unset CLAUDE_PROJECT_DIR
|
|
333
|
+
|
|
334
|
+
# Create .claude in parent
|
|
335
|
+
mkdir -p "$TEST_HOME/workspace/project/.claude"
|
|
336
|
+
cd "$TEST_HOME/workspace/project"
|
|
337
|
+
|
|
338
|
+
run get_provider_config_path
|
|
339
|
+
|
|
340
|
+
[ "$status" -eq 0 ]
|
|
341
|
+
[[ "$output" =~ "$TEST_HOME/workspace/project/.claude/tts-provider.txt" ]]
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
@test "provider-manager config path falls back to HOME" {
|
|
345
|
+
source "$PROVIDER_MANAGER"
|
|
346
|
+
unset CLAUDE_PROJECT_DIR
|
|
347
|
+
|
|
348
|
+
cd "$TEST_HOME"
|
|
349
|
+
|
|
350
|
+
run get_provider_config_path
|
|
351
|
+
|
|
352
|
+
[ "$status" -eq 0 ]
|
|
353
|
+
[[ "$output" =~ "$HOME/.claude/tts-provider.txt" ]]
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
# ============================================================================
|
|
357
|
+
# Provider Manager as Sourced Library Tests
|
|
358
|
+
# ============================================================================
|
|
359
|
+
|
|
360
|
+
@test "provider-manager functions work when sourced" {
|
|
361
|
+
source "$PROVIDER_MANAGER"
|
|
362
|
+
|
|
363
|
+
# Test get_active_provider function
|
|
364
|
+
echo "elevenlabs" > "$PROVIDER_FILE"
|
|
365
|
+
|
|
366
|
+
run get_active_provider
|
|
367
|
+
|
|
368
|
+
[ "$status" -eq 0 ]
|
|
369
|
+
[[ "$output" == "elevenlabs" ]]
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
@test "provider-manager list_providers returns all providers" {
|
|
373
|
+
source "$PROVIDER_MANAGER"
|
|
374
|
+
|
|
375
|
+
run list_providers
|
|
376
|
+
|
|
377
|
+
[ "$status" -eq 0 ]
|
|
378
|
+
[[ "$output" =~ "elevenlabs" ]]
|
|
379
|
+
[[ "$output" =~ "piper" ]]
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
@test "provider-manager validate_provider returns exit code" {
|
|
383
|
+
source "$PROVIDER_MANAGER"
|
|
384
|
+
|
|
385
|
+
# Valid provider - should return 0
|
|
386
|
+
validate_provider "elevenlabs"
|
|
387
|
+
[ "$?" -eq 0 ]
|
|
388
|
+
|
|
389
|
+
# Invalid provider - should return non-zero
|
|
390
|
+
# Use ! to invert but keep exit code check simple
|
|
391
|
+
run validate_provider "nonexistent"
|
|
392
|
+
[ "$status" -ne 0 ]
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
# ============================================================================
|
|
396
|
+
# Empty and Malformed Config Tests
|
|
397
|
+
# ============================================================================
|
|
398
|
+
|
|
399
|
+
@test "provider-manager handles empty provider file" {
|
|
400
|
+
# Create empty file
|
|
401
|
+
touch "$PROVIDER_FILE"
|
|
402
|
+
|
|
403
|
+
run "$PROVIDER_MANAGER" get
|
|
404
|
+
|
|
405
|
+
[ "$status" -eq 0 ]
|
|
406
|
+
# Should return default
|
|
407
|
+
[[ "$output" =~ "piper" ]]
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
@test "provider-manager handles file with only whitespace" {
|
|
411
|
+
echo " " > "$PROVIDER_FILE"
|
|
412
|
+
|
|
413
|
+
run "$PROVIDER_MANAGER" get
|
|
414
|
+
|
|
415
|
+
[ "$status" -eq 0 ]
|
|
416
|
+
# Should return default
|
|
417
|
+
[[ "$output" =~ "piper" ]]
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
@test "provider-manager handles newlines in provider file" {
|
|
421
|
+
echo -e "elevenlabs\n\n" > "$PROVIDER_FILE"
|
|
422
|
+
|
|
423
|
+
run "$PROVIDER_MANAGER" get
|
|
424
|
+
|
|
425
|
+
[ "$status" -eq 0 ]
|
|
426
|
+
[[ "$output" =~ "elevenlabs" ]]
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
# ============================================================================
|
|
430
|
+
# Help/Usage Tests
|
|
431
|
+
# ============================================================================
|
|
432
|
+
|
|
433
|
+
@test "provider-manager shows usage with invalid command" {
|
|
434
|
+
run "$PROVIDER_MANAGER" invalid_command
|
|
435
|
+
|
|
436
|
+
[ "$status" -eq 1 ]
|
|
437
|
+
assert_output_contains "Usage:"
|
|
438
|
+
assert_output_contains "{get|switch|list|validate}"
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
@test "provider-manager usage shows all commands" {
|
|
442
|
+
run "$PROVIDER_MANAGER" --help
|
|
443
|
+
|
|
444
|
+
[ "$status" -eq 1 ]
|
|
445
|
+
assert_output_contains "get"
|
|
446
|
+
assert_output_contains "switch"
|
|
447
|
+
assert_output_contains "list"
|
|
448
|
+
assert_output_contains "validate"
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
# ============================================================================
|
|
452
|
+
# Integration Tests with Other Scripts
|
|
453
|
+
# ============================================================================
|
|
454
|
+
|
|
455
|
+
@test "provider-manager provider persists and can be read by get command" {
|
|
456
|
+
# Switch to elevenlabs
|
|
457
|
+
"$PROVIDER_MANAGER" switch "elevenlabs"
|
|
458
|
+
|
|
459
|
+
# Verify get returns same provider
|
|
460
|
+
local result=$("$PROVIDER_MANAGER" get)
|
|
461
|
+
|
|
462
|
+
[[ "$result" == "elevenlabs" ]]
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
@test "provider-manager multiple provider switches work correctly" {
|
|
466
|
+
"$PROVIDER_MANAGER" switch "elevenlabs"
|
|
467
|
+
local first=$("$PROVIDER_MANAGER" get)
|
|
468
|
+
|
|
469
|
+
"$PROVIDER_MANAGER" switch "piper"
|
|
470
|
+
local second=$("$PROVIDER_MANAGER" get)
|
|
471
|
+
|
|
472
|
+
"$PROVIDER_MANAGER" switch "elevenlabs"
|
|
473
|
+
local third=$("$PROVIDER_MANAGER" get)
|
|
474
|
+
|
|
475
|
+
[[ "$first" == "elevenlabs" ]]
|
|
476
|
+
[[ "$second" == "piper" ]]
|
|
477
|
+
[[ "$third" == "elevenlabs" ]]
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
# ============================================================================
|
|
481
|
+
# Error Handling Tests
|
|
482
|
+
# ============================================================================
|
|
483
|
+
|
|
484
|
+
@test "provider-manager switch handles empty provider name gracefully" {
|
|
485
|
+
run "$PROVIDER_MANAGER" switch ""
|
|
486
|
+
|
|
487
|
+
[ "$status" -eq 1 ]
|
|
488
|
+
assert_output_contains "Error: Provider name required"
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
@test "provider-manager validate handles empty provider name" {
|
|
492
|
+
run "$PROVIDER_MANAGER" validate ""
|
|
493
|
+
|
|
494
|
+
[ "$status" -eq 1 ]
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
@test "provider-manager handles missing hooks directory gracefully" {
|
|
498
|
+
# This should not happen in practice, but test defensive coding
|
|
499
|
+
local broken_script="$BATS_TEST_TMPDIR/broken-provider-manager.sh"
|
|
500
|
+
|
|
501
|
+
# Copy script and modify BASH_SOURCE simulation
|
|
502
|
+
cp "$PROVIDER_MANAGER" "$broken_script"
|
|
503
|
+
|
|
504
|
+
# Try to run validate on non-existent provider
|
|
505
|
+
run bash "$broken_script" validate "fake"
|
|
506
|
+
|
|
507
|
+
[ "$status" -eq 1 ]
|
|
508
|
+
}
|