pipecat-ai-context-hub 0.2.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (189) hide show
  1. pipecat_ai_context_hub-0.2.0/.claude/settings.json +1 -0
  2. pipecat_ai_context_hub-0.2.0/.env.example +87 -0
  3. pipecat_ai_context_hub-0.2.0/.github/ISSUE_TEMPLATE/bug-report.yml +42 -0
  4. pipecat_ai_context_hub-0.2.0/.github/ISSUE_TEMPLATE/config.yml +5 -0
  5. pipecat_ai_context_hub-0.2.0/.github/ISSUE_TEMPLATE/retrieval-quality.yml +140 -0
  6. pipecat_ai_context_hub-0.2.0/.github/workflows/ci.yml +181 -0
  7. pipecat_ai_context_hub-0.2.0/.github/workflows/release.yml +169 -0
  8. pipecat_ai_context_hub-0.2.0/.github/workflows/security-audit.yml +86 -0
  9. pipecat_ai_context_hub-0.2.0/.github/workflows/smoke-drift.yml +89 -0
  10. pipecat_ai_context_hub-0.2.0/.gitignore +26 -0
  11. pipecat_ai_context_hub-0.2.0/AGENTS.md +395 -0
  12. pipecat_ai_context_hub-0.2.0/CHANGELOG.md +1203 -0
  13. pipecat_ai_context_hub-0.2.0/CLAUDE.md +214 -0
  14. pipecat_ai_context_hub-0.2.0/LICENSE +24 -0
  15. pipecat_ai_context_hub-0.2.0/PKG-INFO +360 -0
  16. pipecat_ai_context_hub-0.2.0/SECURITY.md +29 -0
  17. pipecat_ai_context_hub-0.2.0/config/clients/claude-code.json +9 -0
  18. pipecat_ai_context_hub-0.2.0/config/clients/cursor.json +9 -0
  19. pipecat_ai_context_hub-0.2.0/config/clients/vscode.json +10 -0
  20. pipecat_ai_context_hub-0.2.0/config/clients/zed.json +10 -0
  21. pipecat_ai_context_hub-0.2.0/dashboard/public/index.html +385 -0
  22. pipecat_ai_context_hub-0.2.0/dashboard/public/latent-space.html +831 -0
  23. pipecat_ai_context_hub-0.2.0/dashboard/scripts/compute_clusters.py +179 -0
  24. pipecat_ai_context_hub-0.2.0/dashboard/scripts/extract_dashboard.py +156 -0
  25. pipecat_ai_context_hub-0.2.0/dashboard/scripts/extract_embeddings.py +124 -0
  26. pipecat_ai_context_hub-0.2.0/dashboard/video-frames/narration-script.md +41 -0
  27. pipecat_ai_context_hub-0.2.0/docs/CONTRIBUTING.md +248 -0
  28. pipecat_ai_context_hub-0.2.0/docs/README.md +334 -0
  29. pipecat_ai_context_hub-0.2.0/docs/decisions/docs-source.md +45 -0
  30. pipecat_ai_context_hub-0.2.0/docs/decisions/vector-backend.md +41 -0
  31. pipecat_ai_context_hub-0.2.0/docs/dev_plans/20260218-design-pipecat-context-hub.md +1816 -0
  32. pipecat_ai_context_hub-0.2.0/docs/dev_plans/20260324-bug-chroma-index-recovery.md +78 -0
  33. pipecat_ai_context_hub-0.2.0/docs/dev_plans/20260325-chore-mcp-server-audit-hardening.md +182 -0
  34. pipecat_ai_context_hub-0.2.0/docs/dev_plans/20260330-feature-tree-sitter-ts-phase2.md +377 -0
  35. pipecat_ai_context_hub-0.2.0/docs/dev_plans/20260331-feature-version-aware-indexing.md +677 -0
  36. pipecat_ai_context_hub-0.2.0/docs/dev_plans/20260420-bug-windows-refresh-resilience.md +252 -0
  37. pipecat_ai_context_hub-0.2.0/docs/dev_plans/20260420-feature-reranker-model-selection.md +190 -0
  38. pipecat_ai_context_hub-0.2.0/docs/dev_plans/20260421-bug-serve-orphan-watchdog.md +167 -0
  39. pipecat_ai_context_hub-0.2.0/docs/dev_plans/20260422-feature-examples-topic-layout.md +322 -0
  40. pipecat_ai_context_hub-0.2.0/docs/dev_plans/20260529-chore-chromadb-1x-python-314.md +445 -0
  41. pipecat_ai_context_hub-0.2.0/docs/dev_plans/20260530-fix-serve-uv-run-grandparent-watchdog.md +82 -0
  42. pipecat_ai_context_hub-0.2.0/docs/dev_plans/20260612-chore-release-0-2-0.md +102 -0
  43. pipecat_ai_context_hub-0.2.0/docs/dev_plans/20260612-feature-cli-query-subcommands.md +263 -0
  44. pipecat_ai_context_hub-0.2.0/docs/dev_plans/20260612-feature-deprecations-json-consumer.md +81 -0
  45. pipecat_ai_context_hub-0.2.0/docs/dev_plans/README.md +34 -0
  46. pipecat_ai_context_hub-0.2.0/docs/security/threat-model.md +226 -0
  47. pipecat_ai_context_hub-0.2.0/docs/setup/README.md +46 -0
  48. pipecat_ai_context_hub-0.2.0/docs/setup/claude-code.md +102 -0
  49. pipecat_ai_context_hub-0.2.0/docs/setup/cursor.md +69 -0
  50. pipecat_ai_context_hub-0.2.0/docs/setup/vscode.md +88 -0
  51. pipecat_ai_context_hub-0.2.0/docs/setup/zed.md +68 -0
  52. pipecat_ai_context_hub-0.2.0/docs/sshot-dashboard-index.jpg +0 -0
  53. pipecat_ai_context_hub-0.2.0/docs/sshot-dashboard-latent-space.png +0 -0
  54. pipecat_ai_context_hub-0.2.0/justfile +110 -0
  55. pipecat_ai_context_hub-0.2.0/pyproject.toml +99 -0
  56. pipecat_ai_context_hub-0.2.0/scripts/check_pipecat_drift.py +343 -0
  57. pipecat_ai_context_hub-0.2.0/scripts/smoke_check_deprecation.py +138 -0
  58. pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/__init__.py +3 -0
  59. pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/__main__.py +6 -0
  60. pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/cli.py +985 -0
  61. pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/cli_query.py +560 -0
  62. pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/py.typed +0 -0
  63. pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/server/__init__.py +1 -0
  64. pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/server/main.py +312 -0
  65. pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/server/tools/__init__.py +1 -0
  66. pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/server/tools/check_deprecation.py +42 -0
  67. pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/server/tools/get_code_snippet.py +18 -0
  68. pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/server/tools/get_doc.py +18 -0
  69. pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/server/tools/get_example.py +18 -0
  70. pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/server/tools/get_hub_status.py +49 -0
  71. pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/server/tools/search_api.py +18 -0
  72. pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/server/tools/search_docs.py +18 -0
  73. pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/server/tools/search_examples.py +18 -0
  74. pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/server/transport.py +619 -0
  75. pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/services/__init__.py +0 -0
  76. pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/services/embedding.py +96 -0
  77. pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/services/index/__init__.py +8 -0
  78. pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/services/index/errors.py +61 -0
  79. pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/services/index/fts.py +546 -0
  80. pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/services/index/store.py +180 -0
  81. pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/services/index/vector.py +595 -0
  82. pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/services/ingest/__init__.py +0 -0
  83. pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/services/ingest/ast_extractor.py +606 -0
  84. pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/services/ingest/daily_type_map.py +77 -0
  85. pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/services/ingest/deprecation_map.py +890 -0
  86. pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/services/ingest/docs_crawler.py +412 -0
  87. pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/services/ingest/github_ingest.py +1281 -0
  88. pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/services/ingest/rst_type_parser.py +341 -0
  89. pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/services/ingest/source_ingest.py +857 -0
  90. pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/services/ingest/taxonomy.py +742 -0
  91. pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/services/ingest/ts_tree_sitter_parser.py +701 -0
  92. pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/services/retrieval/__init__.py +0 -0
  93. pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/services/retrieval/cross_encoder.py +184 -0
  94. pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/services/retrieval/decompose.py +50 -0
  95. pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/services/retrieval/evidence.py +293 -0
  96. pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/services/retrieval/hybrid.py +818 -0
  97. pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/services/retrieval/rerank.py +471 -0
  98. pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/shared/__init__.py +0 -0
  99. pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/shared/config.py +509 -0
  100. pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/shared/interfaces.py +91 -0
  101. pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/shared/model_loading.py +36 -0
  102. pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/shared/paths.py +74 -0
  103. pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/shared/reranker.py +49 -0
  104. pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/shared/staleness.py +121 -0
  105. pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/shared/tracking.py +51 -0
  106. pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/shared/types.py +711 -0
  107. pipecat_ai_context_hub-0.2.0/tests/__init__.py +0 -0
  108. pipecat_ai_context_hub-0.2.0/tests/_ingest_helpers.py +48 -0
  109. pipecat_ai_context_hub-0.2.0/tests/benchmarks/__init__.py +0 -0
  110. pipecat_ai_context_hub-0.2.0/tests/benchmarks/baselines/v0.0.20.json +17 -0
  111. pipecat_ai_context_hub-0.2.0/tests/benchmarks/conftest.py +129 -0
  112. pipecat_ai_context_hub-0.2.0/tests/benchmarks/engine_parity_check.py +163 -0
  113. pipecat_ai_context_hub-0.2.0/tests/benchmarks/test_chromadb_parity.py +296 -0
  114. pipecat_ai_context_hub-0.2.0/tests/benchmarks/test_chromadb_perf.py +351 -0
  115. pipecat_ai_context_hub-0.2.0/tests/benchmarks/test_latency.py +301 -0
  116. pipecat_ai_context_hub-0.2.0/tests/benchmarks/test_retrieval_quality.py +560 -0
  117. pipecat_ai_context_hub-0.2.0/tests/benchmarks/test_runtime_stability.py +314 -0
  118. pipecat_ai_context_hub-0.2.0/tests/conftest.py +131 -0
  119. pipecat_ai_context_hub-0.2.0/tests/fixtures/smoke/FIXTURE_PINS.json +16 -0
  120. pipecat_ai_context_hub-0.2.0/tests/fixtures/smoke/pipecat/README.md +4 -0
  121. pipecat_ai_context_hub-0.2.0/tests/fixtures/smoke/pipecat/examples/function-calling/gemini-tools/README.md +3 -0
  122. pipecat_ai_context_hub-0.2.0/tests/fixtures/smoke/pipecat/examples/function-calling/gemini-tools/bot.py +9 -0
  123. pipecat_ai_context_hub-0.2.0/tests/fixtures/smoke/pipecat/examples/function-calling/weather/README.md +4 -0
  124. pipecat_ai_context_hub-0.2.0/tests/fixtures/smoke/pipecat/examples/function-calling/weather/bot.py +13 -0
  125. pipecat_ai_context_hub-0.2.0/tests/fixtures/smoke/pipecat/examples/getting-started/hello.py +11 -0
  126. pipecat_ai_context_hub-0.2.0/tests/fixtures/smoke/pipecat/examples/getting-started/quickstart.py +9 -0
  127. pipecat_ai_context_hub-0.2.0/tests/fixtures/smoke/pipecat/examples/mcp/remote-mcp/README.md +3 -0
  128. pipecat_ai_context_hub-0.2.0/tests/fixtures/smoke/pipecat/examples/mcp/remote-mcp/bot.py +9 -0
  129. pipecat_ai_context_hub-0.2.0/tests/fixtures/smoke/pipecat/examples/realtime/openai-realtime/README.md +3 -0
  130. pipecat_ai_context_hub-0.2.0/tests/fixtures/smoke/pipecat/examples/realtime/openai-realtime/bot.py +9 -0
  131. pipecat_ai_context_hub-0.2.0/tests/fixtures/smoke/pipecat/examples/transports/daily/README.md +3 -0
  132. pipecat_ai_context_hub-0.2.0/tests/fixtures/smoke/pipecat/examples/transports/daily/bot.py +9 -0
  133. pipecat_ai_context_hub-0.2.0/tests/fixtures/smoke/pipecat/examples/transports/websocket/README.md +3 -0
  134. pipecat_ai_context_hub-0.2.0/tests/fixtures/smoke/pipecat/examples/transports/websocket/bot.py +9 -0
  135. pipecat_ai_context_hub-0.2.0/tests/fixtures/smoke/pipecat/examples/voice/cartesia-tts/README.md +3 -0
  136. pipecat_ai_context_hub-0.2.0/tests/fixtures/smoke/pipecat/examples/voice/cartesia-tts/bot.py +9 -0
  137. pipecat_ai_context_hub-0.2.0/tests/fixtures/smoke/pipecat/pyproject.toml +4 -0
  138. pipecat_ai_context_hub-0.2.0/tests/fixtures/smoke/pipecat/src/pipecat/__init__.py +1 -0
  139. pipecat_ai_context_hub-0.2.0/tests/fixtures/smoke/pipecat-examples/README.md +4 -0
  140. pipecat_ai_context_hub-0.2.0/tests/fixtures/smoke/pipecat-examples/pyproject.toml +4 -0
  141. pipecat_ai_context_hub-0.2.0/tests/fixtures/smoke/pipecat-examples/simple-chatbot/README.md +3 -0
  142. pipecat_ai_context_hub-0.2.0/tests/fixtures/smoke/pipecat-examples/simple-chatbot/bot.py +13 -0
  143. pipecat_ai_context_hub-0.2.0/tests/fixtures/smoke/pipecat-examples/storytelling/README.md +3 -0
  144. pipecat_ai_context_hub-0.2.0/tests/fixtures/smoke/pipecat-examples/storytelling/main.py +9 -0
  145. pipecat_ai_context_hub-0.2.0/tests/fixtures/smoke/pipecat-examples/voice-bot/README.md +3 -0
  146. pipecat_ai_context_hub-0.2.0/tests/fixtures/smoke/pipecat-examples/voice-bot/bot.py +9 -0
  147. pipecat_ai_context_hub-0.2.0/tests/integration/__init__.py +0 -0
  148. pipecat_ai_context_hub-0.2.0/tests/integration/conftest.py +52 -0
  149. pipecat_ai_context_hub-0.2.0/tests/integration/test_end_to_end.py +943 -0
  150. pipecat_ai_context_hub-0.2.0/tests/integration/test_no_telemetry_egress.sh +301 -0
  151. pipecat_ai_context_hub-0.2.0/tests/integration/test_serve_lifetime.py +530 -0
  152. pipecat_ai_context_hub-0.2.0/tests/smoke/README.md +90 -0
  153. pipecat_ai_context_hub-0.2.0/tests/smoke/__init__.py +5 -0
  154. pipecat_ai_context_hub-0.2.0/tests/smoke/conftest.py +35 -0
  155. pipecat_ai_context_hub-0.2.0/tests/smoke/invariants.py +136 -0
  156. pipecat_ai_context_hub-0.2.0/tests/smoke/refresh_fixtures.py +222 -0
  157. pipecat_ai_context_hub-0.2.0/tests/smoke/test_new_repo_layouts.py +72 -0
  158. pipecat_ai_context_hub-0.2.0/tests/smoke/test_pipecat_layout.py +73 -0
  159. pipecat_ai_context_hub-0.2.0/tests/unit/__init__.py +0 -0
  160. pipecat_ai_context_hub-0.2.0/tests/unit/test_ast_extractor.py +1225 -0
  161. pipecat_ai_context_hub-0.2.0/tests/unit/test_audit_sync.py +43 -0
  162. pipecat_ai_context_hub-0.2.0/tests/unit/test_cli.py +950 -0
  163. pipecat_ai_context_hub-0.2.0/tests/unit/test_cli_query.py +459 -0
  164. pipecat_ai_context_hub-0.2.0/tests/unit/test_config.py +423 -0
  165. pipecat_ai_context_hub-0.2.0/tests/unit/test_deprecation_map.py +354 -0
  166. pipecat_ai_context_hub-0.2.0/tests/unit/test_docs_crawler.py +554 -0
  167. pipecat_ai_context_hub-0.2.0/tests/unit/test_format_detection.py +171 -0
  168. pipecat_ai_context_hub-0.2.0/tests/unit/test_github_ingest.py +1366 -0
  169. pipecat_ai_context_hub-0.2.0/tests/unit/test_github_ingest_taxonomy.py +96 -0
  170. pipecat_ai_context_hub-0.2.0/tests/unit/test_hub_status.py +233 -0
  171. pipecat_ai_context_hub-0.2.0/tests/unit/test_index_store.py +1232 -0
  172. pipecat_ai_context_hub-0.2.0/tests/unit/test_mcp_tools.py +425 -0
  173. pipecat_ai_context_hub-0.2.0/tests/unit/test_metadata_types.py +140 -0
  174. pipecat_ai_context_hub-0.2.0/tests/unit/test_model_loading.py +32 -0
  175. pipecat_ai_context_hub-0.2.0/tests/unit/test_release_notes_deprecation.py +753 -0
  176. pipecat_ai_context_hub-0.2.0/tests/unit/test_retrieval.py +1517 -0
  177. pipecat_ai_context_hub-0.2.0/tests/unit/test_rst_type_parser.py +324 -0
  178. pipecat_ai_context_hub-0.2.0/tests/unit/test_server.py +450 -0
  179. pipecat_ai_context_hub-0.2.0/tests/unit/test_shared_types.py +449 -0
  180. pipecat_ai_context_hub-0.2.0/tests/unit/test_smoke_scaffold.py +306 -0
  181. pipecat_ai_context_hub-0.2.0/tests/unit/test_source_ingest.py +826 -0
  182. pipecat_ai_context_hub-0.2.0/tests/unit/test_staleness.py +159 -0
  183. pipecat_ai_context_hub-0.2.0/tests/unit/test_taxonomy.py +1350 -0
  184. pipecat_ai_context_hub-0.2.0/tests/unit/test_transport.py +542 -0
  185. pipecat_ai_context_hub-0.2.0/tests/unit/test_ts_source_parser.py +573 -0
  186. pipecat_ai_context_hub-0.2.0/tests/unit/test_version_extraction.py +327 -0
  187. pipecat_ai_context_hub-0.2.0/tests/unit/test_version_pinned_indexing.py +322 -0
  188. pipecat_ai_context_hub-0.2.0/tests/unit/test_version_scoring.py +286 -0
  189. pipecat_ai_context_hub-0.2.0/uv.lock +3787 -0
@@ -0,0 +1 @@
1
+ { "attribution": { "commit": "", "pr": "" } }
@@ -0,0 +1,87 @@
1
+ # Extra GitHub repos to ingest (comma-separated org/repo slugs).
2
+ # These are appended to the default repos:
3
+ # pipecat-ai/pipecat, pipecat-ai/pipecat-examples, pipecat-ai/pipecat-flows,
4
+ # daily-co/daily-python, pipecat-ai/pipecat-client-web,
5
+ # pipecat-ai/pipecat-client-web-transports,
6
+ # pipecat-ai/pipecat-client-react-native-transports,
7
+ # pipecat-ai/voice-ui-kit, pipecat-ai/pipecat-prebuilt
8
+ # PIPECAT_HUB_EXTRA_REPOS="your-org/repo-1,your-org/repo-2"
9
+ #
10
+ # NOTE: only Python (.py/.pyi), TypeScript (.ts/.tsx), and RST (docs/**.rst)
11
+ # are parsed. Swift/Kotlin/C++ client SDKs (pipecat-client-ios,
12
+ # pipecat-client-android, pipecat-client-cxx, pipecat-esp32) clone but yield
13
+ # ZERO source/API chunks (only a few README/config fallback chunks) until a
14
+ # grammar for those languages exists — they won't surface in search_api.
15
+ # Entries below that duplicate a default are deduped automatically — harmless
16
+ # to leave in.
17
+
18
+ # --------------------------------------------------------------------------
19
+ # Recommended extras — copy/uncomment what you need
20
+ # --------------------------------------------------------------------------
21
+
22
+ # Client SDKs & transports (web, mobile, native)
23
+ # PIPECAT_HUB_EXTRA_REPOS="pipecat-ai/pipecat-client-web,pipecat-ai/pipecat-client-web-transports,pipecat-ai/pipecat-client-react-native-transports,pipecat-ai/pipecat-websocket-transport,pipecat-ai/pipecat-client-ios,pipecat-ai/pipecat-client-ios-daily,pipecat-ai/pipecat-client-ios-small-webrtc,pipecat-ai/pipecat-client-android,pipecat-ai/pipecat-client-android-transports,pipecat-ai/pipecat-client-cxx,pipecat-ai/pipecat-client-cxx-daily,pipecat-ai/pipecat-esp32"
24
+
25
+ # UI components & voice UI kit
26
+ # PIPECAT_HUB_EXTRA_REPOS="pipecat-ai/voice-ui-kit,pipecat-ai/pipecat-ui"
27
+
28
+ # Conversation flows & structured dialogues
29
+ # PIPECAT_HUB_EXTRA_REPOS="pipecat-ai/pipecat-flows,pipecat-ai/pipecat-flows-editor"
30
+
31
+ # Cloud, CLI, and dev tools
32
+ # PIPECAT_HUB_EXTRA_REPOS="pipecat-ai/pipecat-cli,pipecat-ai/tail,pipecat-ai/whisker,pipecat-ai/skills"
33
+
34
+ # Quickstart templates
35
+ # (pipecat-quickstart* repos are archived — use the CLI: `uv tool install pipecat-ai-cli` then `pipecat init quickstart`)
36
+ # PIPECAT_HUB_EXTRA_REPOS="pipecat-ai/pipecat-prebuilt"
37
+
38
+ # Audio, turn detection & benchmarks
39
+ # PIPECAT_HUB_EXTRA_REPOS="pipecat-ai/smart-turn,pipecat-ai/hosted-smart-turn,pipecat-ai/pipecat-krisp,pipecat-ai/stt-benchmark,pipecat-ai/gb-benchmarks"
40
+
41
+ # Example apps & demos
42
+ # PIPECAT_HUB_EXTRA_REPOS="pipecat-ai/peekaboo,pipecat-ai/gemini-live-web-starter,pipecat-ai/instant-voice-demo,pipecat-ai/openai-realtime-todo-example,pipecat-ai/pipecat.ai-agents,pipecat-ai/pipecat-mcp-server"
43
+
44
+ # Gradient Bang ecosystem
45
+ # PIPECAT_HUB_EXTRA_REPOS="pipecat-ai/gradient-bang,pipecat-ai/gradient-bang-subagents,pipecat-ai/gradient-bang-synth-forge,pipecat-ai/gb-context-viewer"
46
+
47
+ # NVIDIA integrations
48
+ # PIPECAT_HUB_EXTRA_REPOS="pipecat-ai/nvidia-sgmaker"
49
+
50
+ # iOS demo apps
51
+ # PIPECAT_HUB_EXTRA_REPOS="pipecat-ai/pipecat-client-ios-gemini-live-websocket-demo,pipecat-ai/pipecat-client-ios-openai-realtime-webrtc-demo"
52
+
53
+ # --------------------------------------------------------------------------
54
+ # All recommended pipecat-ai repos in one line (copy and uncomment):
55
+ # PIPECAT_HUB_EXTRA_REPOS="pipecat-ai/pipecat-client-web,pipecat-ai/pipecat-client-web-transports,pipecat-ai/pipecat-client-react-native-transports,pipecat-ai/pipecat-websocket-transport,pipecat-ai/pipecat-client-ios,pipecat-ai/pipecat-client-ios-daily,pipecat-ai/pipecat-client-ios-small-webrtc,pipecat-ai/pipecat-client-ios-gemini-live-websocket-demo,pipecat-ai/pipecat-client-ios-openai-realtime-webrtc-demo,pipecat-ai/pipecat-client-android,pipecat-ai/pipecat-client-android-transports,pipecat-ai/pipecat-client-cxx,pipecat-ai/pipecat-client-cxx-daily,pipecat-ai/pipecat-esp32,pipecat-ai/voice-ui-kit,pipecat-ai/pipecat-ui,pipecat-ai/pipecat-flows,pipecat-ai/pipecat-flows-editor,pipecat-ai/pipecat-cli,pipecat-ai/tail,pipecat-ai/whisker,pipecat-ai/skills,pipecat-ai/pipecat-prebuilt,pipecat-ai/smart-turn,pipecat-ai/hosted-smart-turn,pipecat-ai/pipecat-krisp,pipecat-ai/stt-benchmark,pipecat-ai/gb-benchmarks,pipecat-ai/peekaboo,pipecat-ai/gemini-live-web-starter,pipecat-ai/instant-voice-demo,pipecat-ai/openai-realtime-todo-example,pipecat-ai/pipecat.ai-agents,pipecat-ai/pipecat-mcp-server,pipecat-ai/gradient-bang,pipecat-ai/gradient-bang-subagents,pipecat-ai/gradient-bang-synth-forge,pipecat-ai/gb-context-viewer,pipecat-ai/nvidia-sgmaker"
56
+ # --------------------------------------------------------------------------
57
+
58
+ # Entire repos to skip locally if an upstream source is tainted.
59
+ # PIPECAT_HUB_TAINTED_REPOS="your-org/bad-repo,other-org/paused-repo"
60
+
61
+ # Specific upstream refs to skip locally.
62
+ # Format: org/repo@ref where ref is a tag or commit SHA/prefix.
63
+ # PIPECAT_HUB_TAINTED_REFS="pipecat-ai/pipecat@v0.0.9,pipecat-ai/pipecat-examples@deadbeef"
64
+
65
+ # --------------------------------------------------------------------------
66
+ # Startup model pre-warm (default: on)
67
+ # --------------------------------------------------------------------------
68
+ # On `serve` boot, the hub loads the embedding model (and cross-encoder if
69
+ # enabled) so the first MCP query doesn't pay a cold-start cost. On Windows
70
+ # CPU this can otherwise hang the first query for 30-130s — longer than
71
+ # Claude Code's tool-permission window, which surfaces as a spurious
72
+ # disconnect.
73
+ #
74
+ # Set to 0 to skip pre-warm (faster boot, slower first query):
75
+ # PIPECAT_HUB_WARMUP=0
76
+
77
+ # --------------------------------------------------------------------------
78
+ # Index-staleness footer (default: 7 days)
79
+ # --------------------------------------------------------------------------
80
+ # When the local index is older than this many days, every tool response (MCP
81
+ # and the CLI subcommands) carries an `index_staleness` field nudging you to
82
+ # run `refresh`. The field is absent while the index is fresh.
83
+ #
84
+ # Set to 0 (or any value <= 0) to disable the footer entirely. Non-numeric or
85
+ # non-finite values (e.g. inf, nan) are rejected with a warning and fall back
86
+ # to the 7-day default.
87
+ # PIPECAT_HUB_STALE_AFTER_DAYS=7
@@ -0,0 +1,42 @@
1
+ name: Bug Report
2
+ description: Report a crash, error, or unexpected behavior
3
+ labels: ["bug"]
4
+ body:
5
+ - type: textarea
6
+ id: what-happened
7
+ attributes:
8
+ label: What happened?
9
+ description: Describe the bug and how to reproduce it.
10
+ placeholder: |
11
+ 1. Ran `pipecat-context-hub refresh --force`
12
+ 2. Got error: "ChromaDB collection not found"
13
+ validations:
14
+ required: true
15
+
16
+ - type: textarea
17
+ id: expected
18
+ attributes:
19
+ label: Expected behavior
20
+ description: What should have happened instead?
21
+ validations:
22
+ required: true
23
+
24
+ - type: textarea
25
+ id: environment
26
+ attributes:
27
+ label: Environment
28
+ description: |
29
+ Run this in your terminal and paste the output:
30
+ ```
31
+ echo "Python: $(python3 --version)" && echo "uv: $(uv --version)" && echo "OS: $(uname -srm)" && uv run pipecat-context-hub --version 2>/dev/null || echo "version: unknown"
32
+ ```
33
+ render: text
34
+ validations:
35
+ required: true
36
+
37
+ - type: textarea
38
+ id: logs
39
+ attributes:
40
+ label: Logs / error output
41
+ description: Paste any relevant error messages or stack traces.
42
+ render: text
@@ -0,0 +1,5 @@
1
+ blank_issues_enabled: true
2
+ contact_links:
3
+ - name: Pipecat Community
4
+ url: https://discord.gg/pipecat
5
+ about: Ask questions and get help from the Pipecat community
@@ -0,0 +1,140 @@
1
+ name: Retrieval Quality Issue
2
+ description: Report missing, irrelevant, or poorly ranked results from the MCP server
3
+ labels: ["retrieval-quality"]
4
+ body:
5
+ - type: markdown
6
+ attributes:
7
+ value: |
8
+ ## Before filing
9
+
10
+ Run the diagnostic prompt below in your coding agent (Claude Code, Cursor, etc.)
11
+ to generate a structured report. Paste the output in the **Diagnostic Report** field.
12
+
13
+ - type: textarea
14
+ id: what-happened
15
+ attributes:
16
+ label: What happened?
17
+ description: What did you search for, and what was wrong with the results?
18
+ placeholder: |
19
+ I searched for "WebSocket transport" using search_docs but got results
20
+ about HTTP transports instead. The actual WebSocket docs page wasn't
21
+ in the results at all.
22
+ validations:
23
+ required: true
24
+
25
+ - type: textarea
26
+ id: expected
27
+ attributes:
28
+ label: What did you expect?
29
+ description: What result or content should have been returned?
30
+ placeholder: |
31
+ I expected the docs page at /guides/learn/transports with the WebSocket
32
+ section to be the top result.
33
+ validations:
34
+ required: true
35
+
36
+ - type: dropdown
37
+ id: issue-type
38
+ attributes:
39
+ label: Issue type
40
+ options:
41
+ - Missing result (expected content not returned)
42
+ - Wrong ranking (right content buried below irrelevant results)
43
+ - Bad chunking (result truncated or split at wrong boundary)
44
+ - Stale content (result is outdated, index not reflecting latest)
45
+ - Other
46
+ validations:
47
+ required: true
48
+
49
+ - type: dropdown
50
+ id: tool
51
+ attributes:
52
+ label: Which MCP tool?
53
+ options:
54
+ - search_docs
55
+ - search_examples
56
+ - search_api
57
+ - get_doc
58
+ - get_example
59
+ - get_code_snippet
60
+ - check_deprecation
61
+ validations:
62
+ required: true
63
+
64
+ - type: textarea
65
+ id: diagnostic-report
66
+ attributes:
67
+ label: Diagnostic Report
68
+ description: |
69
+ Paste the output from the diagnostic prompt below. Copy the prompt into your
70
+ coding agent, fill in YOUR_QUERY and YOUR_TOOL, and paste the full output here.
71
+ render: markdown
72
+ validations:
73
+ required: true
74
+
75
+ - type: textarea
76
+ id: diagnostic-prompt
77
+ attributes:
78
+ label: Diagnostic Prompt (copy this into your agent)
79
+ description: Copy the prompt below, replace the placeholders, and run it in your coding agent.
80
+ render: markdown
81
+ value: |
82
+ ```
83
+ I'm diagnosing a retrieval quality issue with the pipecat-context-hub MCP server.
84
+ Run the following steps using the MCP tools and format the output as a single
85
+ markdown report I can paste into a GitHub issue.
86
+
87
+ ## Parameters
88
+ - Query: "YOUR_QUERY_HERE"
89
+ - Tool: YOUR_TOOL_HERE (search_docs | search_examples | search_api | get_code_snippet)
90
+ - Filters used: YOUR_FILTERS_HERE (e.g., area="guides", domain="backend", class_name="DailyTransport", or "none")
91
+ - Pipecat version (if applicable): YOUR_VERSION_HERE (e.g., "0.0.95" or "not set")
92
+
93
+ ## Steps
94
+
95
+ 1. **Hub status** — call `get_hub_status` and report:
96
+ - server_version
97
+ - last_refresh_at
98
+ - total_records and counts_by_type
99
+ - framework_version (if set)
100
+
101
+ 2. **Reproduce the search** — call the failing tool with the exact query and
102
+ filters above. For the results, report:
103
+ - Number of hits returned
104
+ - For each of the top 5 hits: score, title or chunk_id, snippet (first 100 chars),
105
+ match_type, version_compatibility (if present), citation.path
106
+ - The full evidence report: confidence, low_confidence, confidence_rationale,
107
+ next_retrieval_queries
108
+
109
+ 3. **Broaden the search** — re-run the same query with all filters removed and
110
+ limit=20. Report:
111
+ - Did the expected result appear? At what rank and score?
112
+ - If yes, which filter excluded it?
113
+ - If no, proceed to step 4.
114
+
115
+ 4. **Check if content is indexed** — if the expected result is a doc page, try
116
+ `get_doc(path="EXPECTED_PATH")`. If it's an API symbol, try
117
+ `search_api(query="SYMBOL_NAME", limit=5)`. If it's an example, try
118
+ `search_examples(query="EXAMPLE_NAME", limit=5)`. Report:
119
+ - Was the content found by direct lookup?
120
+ - If found: what was its chunk_id, content_type, and metadata?
121
+ - If not found: the content is likely not indexed.
122
+
123
+ 5. **Try alternative queries** — run 2-3 rephrased queries or multi-concept
124
+ queries (using ` + ` syntax) against the same tool. Report:
125
+ - Each query tried and the top 3 results (score, title/chunk_id)
126
+ - Did any alternative surface the expected result?
127
+
128
+ ## Output format
129
+
130
+ Format everything as a single markdown block with these sections:
131
+ - **Hub Status**: table of status fields
132
+ - **Original Query Results**: numbered list of top 5 hits with scores
133
+ - **Evidence Report**: confidence, rationale, and next queries
134
+ - **Broadened Search**: whether expected result appeared and at what rank
135
+ - **Direct Lookup**: whether content exists in the index
136
+ - **Alternative Queries**: table of queries tried and top results
137
+ - **Diagnosis**: your assessment of why the result is missing or poorly ranked
138
+ (e.g., "content not indexed", "filter too narrow", "embedding mismatch",
139
+ "chunking split the relevant content", "staleness penalty")
140
+ ```
@@ -0,0 +1,181 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - main
7
+ - "chore/**"
8
+ - "feature/**"
9
+ - "bug/**"
10
+ - "refactor/**"
11
+ pull_request:
12
+
13
+ permissions:
14
+ contents: read
15
+
16
+ jobs:
17
+ quality:
18
+ name: Quality (py${{ matrix.python-version }})
19
+ runs-on: ubuntu-latest
20
+ strategy:
21
+ fail-fast: false
22
+ matrix:
23
+ # Floor (3.12) + ceiling (3.14, the highest version requires-python allows).
24
+ python-version: ["3.12", "3.14"]
25
+ steps:
26
+ - uses: actions/checkout@v4
27
+
28
+ - uses: actions/setup-python@v5
29
+ with:
30
+ python-version: ${{ matrix.python-version }}
31
+
32
+ - name: Install uv
33
+ uses: astral-sh/setup-uv@v7.6.0
34
+ with:
35
+ version: "0.9.18"
36
+
37
+ - name: Sync dependencies
38
+ run: uv sync --frozen --extra dev --group dev
39
+
40
+ - name: Ruff
41
+ run: uv run ruff check src/ tests/
42
+
43
+ - name: Mypy
44
+ run: uv run mypy src/ tests/
45
+
46
+ - name: Pytest
47
+ run: uv run pytest tests/ -v
48
+
49
+ # Stable required-status-check name. Branch protection requires "Quality";
50
+ # the matrix above reports per-leg names ("Quality (py3.12)", …), so this
51
+ # gate aggregates them under the single name protection expects. Bump the
52
+ # matrix without touching branch-protection settings.
53
+ quality-gate:
54
+ name: Quality
55
+ runs-on: ubuntu-latest
56
+ needs: [quality]
57
+ if: always()
58
+ steps:
59
+ - name: Require all Quality matrix legs to pass
60
+ env:
61
+ RESULT: ${{ needs.quality.result }}
62
+ run: |
63
+ echo "Quality matrix aggregate result: $RESULT"
64
+ test "$RESULT" = "success"
65
+
66
+ windows-smoke:
67
+ name: Windows smoke (chromadb 1.x, py${{ matrix.python-version }})
68
+ runs-on: windows-latest
69
+ strategy:
70
+ fail-fast: false
71
+ matrix:
72
+ # 3.14 proves the cp314 compiled stack (torch/onnxruntime/tokenizers)
73
+ # installs and the chromadb 1.x index paths work on Windows — the platform
74
+ # where cp314 wheel availability was least certain.
75
+ python-version: ["3.12", "3.14"]
76
+ steps:
77
+ - uses: actions/checkout@v4
78
+
79
+ - uses: actions/setup-python@v5
80
+ with:
81
+ python-version: ${{ matrix.python-version }}
82
+
83
+ - name: Install uv
84
+ uses: astral-sh/setup-uv@v7.6.0
85
+ with:
86
+ version: "0.9.18"
87
+
88
+ - name: Sync dependencies
89
+ # Proves chromadb 1.5.9 (and the rest of the stack) resolves and installs
90
+ # from wheels on Windows — the primary cross-platform risk of the 1.x bump.
91
+ run: uv sync --frozen --extra dev --group dev
92
+
93
+ - name: ChromaDB index smoke
94
+ # Scope: the chromadb 1.5.9 cross-platform risk surface plus the
95
+ # path-handling tests that previously assumed POSIX separators. `Sync
96
+ # dependencies` above already proved the wheel installs on Windows; the
97
+ # chromadb tests then build real ChromaDB 1.x indexes in temp dirs and
98
+ # exercise the upsert/query/get paths + Client.close lifecycle, the
99
+ # non-mutating format-detection probe (reads chroma.sqlite3), and
100
+ # metadata typing.
101
+ #
102
+ # test_taxonomy / test_github_ingest / test_cli / test_hub_status are now
103
+ # included: the ingest layer normalizes logical repo-relative paths to
104
+ # forward slashes via Path.as_posix() (github_ingest.py, taxonomy.py), so
105
+ # stored `path` / `source_url` / taxonomy keys are "/"-separated on every
106
+ # platform and these tests pass under Windows "\\". tests/integration/ is
107
+ # still excluded (its serve tests use POSIX-only select() on pipes);
108
+ # Linux CI runs everything.
109
+ run: >-
110
+ uv run pytest -v
111
+ tests/unit/test_index_store.py
112
+ tests/unit/test_format_detection.py
113
+ tests/unit/test_metadata_types.py
114
+ tests/unit/test_taxonomy.py
115
+ tests/unit/test_github_ingest.py
116
+ tests/unit/test_cli.py
117
+ tests/unit/test_hub_status.py
118
+
119
+ security:
120
+ name: Security
121
+ runs-on: ubuntu-latest
122
+ steps:
123
+ - uses: actions/checkout@v4
124
+
125
+ - uses: actions/setup-python@v5
126
+ with:
127
+ python-version: "3.12"
128
+
129
+ - name: Install uv
130
+ uses: astral-sh/setup-uv@v7.6.0
131
+ with:
132
+ version: "0.9.18"
133
+
134
+ - name: Sync dependencies
135
+ run: uv sync --frozen --extra dev --group dev
136
+
137
+ - name: Dependency Audit
138
+ # KEEP IN SYNC with the `audit-deps` recipe in justfile — the local
139
+ # recipe must mirror this --ignore-vuln set exactly so `just audit-deps`
140
+ # passes iff this gate passes. Enforced by tests/unit/test_audit_sync.py
141
+ # (drift fails the suite).
142
+ #
143
+ # PYSEC-2026-139 (torch, CVE-2026-4538): local-only pt2-loader
144
+ # deserialization with no upstream fix released. Reached only via
145
+ # sentence-transformers; the hub never loads untrusted pt2 artifacts.
146
+ #
147
+ # CVE-2026-45829 (chromadb, GHSA-f4j7-r4q5-qw2c): pre-auth code injection
148
+ # in chromadb's HTTP SERVER mode — arbitrary code execution via the
149
+ # /api/v2/.../collections endpoint with a malicious model repo and
150
+ # trust_remote_code=true. Affects 1.0.0-1.5.9 with no fixed release yet
151
+ # (1.5.9 is the latest 1.x). Unreachable here: the hub runs the embedded
152
+ # PersistentClient only (no server, no HTTP endpoint, no listener) and
153
+ # never uses chromadb's embedding functions / trust_remote_code.
154
+ #
155
+ # CVE-2025-3000 (torch, GHSA-rrmf-rvhw-rf47 / PYSEC-2025-194): memory
156
+ # corruption in torch.jit.script. Low severity, local-only, and no
157
+ # upstream fix released (vulnerable range <= 2.12.0, no patched version).
158
+ # Unreachable here: the hub uses sentence-transformers embeddings and the
159
+ # cross-encoder reranker; it never calls torch.jit.script.
160
+ #
161
+ # The unfiltered biweekly security-audit.yml job re-surfaces all three so
162
+ # the ignores cannot silently outlive their upstream patches.
163
+ run: >-
164
+ uv run pip-audit --local --progress-spinner off
165
+ --ignore-vuln PYSEC-2026-139
166
+ --ignore-vuln CVE-2026-45829
167
+ --ignore-vuln CVE-2025-3000
168
+
169
+ - name: Bandit
170
+ run: uv run bandit -r src
171
+
172
+ - name: Generate SBOM
173
+ run: |
174
+ mkdir -p artifacts/security
175
+ uv run cyclonedx-py environment --output-reproducible --of JSON -o artifacts/security/sbom.json
176
+
177
+ - name: Upload SBOM
178
+ uses: actions/upload-artifact@v4
179
+ with:
180
+ name: sbom
181
+ path: artifacts/security/sbom.json
@@ -0,0 +1,169 @@
1
+ name: Release
2
+
3
+ # Publishes pipecat-context-hub to PyPI via trusted publishing (OIDC — no API
4
+ # tokens stored in the repo).
5
+ #
6
+ # Two entry points:
7
+ # - Publishing a GitHub release (the normal path, see docs/CONTRIBUTING.md
8
+ # "Release Process") builds, verifies, and uploads to PyPI.
9
+ # - workflow_dispatch publishes to TestPyPI — a dry-run path for verifying
10
+ # the build and the trusted-publishing wiring without touching the real
11
+ # index.
12
+ #
13
+ # Naming: the PyPI distribution is `pipecat-ai-context-hub` (org convention —
14
+ # official packages are pipecat-ai*); the command and MCP server name stay
15
+ # `pipecat-context-hub`. A console-script alias makes
16
+ # `uvx pipecat-ai-context-hub <cmd>` resolve.
17
+ #
18
+ # One-time setup: the project is published under the `pipecat` PyPI org
19
+ # (https://pypi.org/org/pipecat/). A PyPI org owner adds a GitHub trusted
20
+ # publisher — for the first release, as a "pending publisher" from the
21
+ # `pipecat` org's "Publishing" settings (the project does not exist yet) — with
22
+ # owner: pipecat-ai (GitHub org), repository: pipecat-context-hub,
23
+ # workflow: release.yml, environment: pypi (testpypi on test.pypi.org),
24
+ # project name: pipecat-ai-context-hub.
25
+ # See docs/CONTRIBUTING.md "Maintainer Setup" for the full flow.
26
+ # Until that exists, the publish jobs fail with an OIDC error — the build job
27
+ # still validates the artifacts.
28
+
29
+ on:
30
+ release:
31
+ types: [published]
32
+ workflow_dispatch:
33
+
34
+ permissions:
35
+ contents: read
36
+
37
+ # uv CLI version, single source of truth for all jobs below. Keep in sync with
38
+ # the `astral-sh/setup-uv` version pinned in `.github/workflows/ci.yml`.
39
+ env:
40
+ UV_VERSION: "0.9.18"
41
+
42
+ jobs:
43
+ build:
44
+ name: Build & verify artifacts
45
+ runs-on: ubuntu-latest
46
+ steps:
47
+ - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1
48
+
49
+ # Pinned to 3.12 for a reproducible release build; the published sdist +
50
+ # wheel are version-agnostic. Update alongside the ci.yml matrix floor.
51
+ - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
52
+ with:
53
+ python-version: "3.12"
54
+
55
+ - name: Install uv
56
+ uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7.6.0
57
+ with:
58
+ version: ${{ env.UV_VERSION }}
59
+
60
+ - name: Build sdist + wheel
61
+ run: uv build
62
+
63
+ - name: Check distribution metadata
64
+ run: uvx twine check --strict dist/*
65
+
66
+ - name: Tag matches package version (release only)
67
+ # Guards the "forgot to bump pyproject before tagging" release: the
68
+ # tag vX.Y.Z must equal the version baked into the wheel. The
69
+ # _SERVER_VERSION half of the pair is enforced by the unit suite
70
+ # (tests/unit/test_server.py::TestVersionConsistency) in regular CI.
71
+ if: github.event_name == 'release'
72
+ # TAG is passed via env (not interpolated into the script body) so a
73
+ # crafted tag name cannot inject shell — see GitHub's workflow-injection
74
+ # guidance.
75
+ env:
76
+ TAG: ${{ github.event.release.tag_name }}
77
+ run: |
78
+ wheels=(dist/*.whl)
79
+ test "${#wheels[@]}" -eq 1 || {
80
+ echo "::error::expected exactly one wheel in dist/, found ${#wheels[@]}: ${wheels[*]}"
81
+ exit 1
82
+ }
83
+ WHEEL_VERSION=$(unzip -p "${wheels[0]}" '*.dist-info/METADATA' | awk '/^Version:/{print $2; exit}')
84
+ echo "wheel=$WHEEL_VERSION tag=$TAG"
85
+ test "v$WHEEL_VERSION" = "$TAG" || {
86
+ echo "::error::Tag $TAG does not match package version $WHEEL_VERSION — bump pyproject.toml and _SERVER_VERSION before tagging."
87
+ exit 1
88
+ }
89
+
90
+ - name: Wheel smoke test (clean venv, away from the repo)
91
+ # Installs the built wheel into a fresh venv and exercises it from a
92
+ # directory outside the checkout, so works-only-in-repo assumptions
93
+ # (missing package data, path expectations) fail here instead of on
94
+ # users. `serve` on an empty index must exit 2 with the refresh hint —
95
+ # proving the console script, imports, and config defaults all work
96
+ # from the wheel alone.
97
+ run: |
98
+ uv venv /tmp/wheel-smoke
99
+ VIRTUAL_ENV=/tmp/wheel-smoke uv pip install dist/*.whl
100
+ cd /tmp
101
+ /tmp/wheel-smoke/bin/pipecat-context-hub --help
102
+ set +e
103
+ PIPECAT_HUB_DATA_DIR=$(mktemp -d) /tmp/wheel-smoke/bin/pipecat-context-hub serve 2>/tmp/serve-err.txt
104
+ code=$?
105
+ set -e
106
+ cat /tmp/serve-err.txt
107
+ test "$code" -eq 2 || { echo "::error::expected exit 2 on empty index, got $code"; exit 1; }
108
+ grep -q "refresh" /tmp/serve-err.txt
109
+
110
+ - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
111
+ with:
112
+ name: dist
113
+ path: dist/
114
+ if-no-files-found: error
115
+
116
+ publish-pypi:
117
+ name: Publish to PyPI
118
+ needs: build
119
+ if: github.event_name == 'release'
120
+ runs-on: ubuntu-latest
121
+ environment:
122
+ name: pypi
123
+ url: https://pypi.org/project/pipecat-ai-context-hub/
124
+ permissions:
125
+ # Trusted publishing: PyPI validates the workflow's OIDC token instead
126
+ # of an API key. Requires the trusted-publisher config described at the
127
+ # top of this file.
128
+ id-token: write
129
+ steps:
130
+ - name: Install uv
131
+ uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7.6.0
132
+ with:
133
+ version: ${{ env.UV_VERSION }}
134
+
135
+ - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
136
+ with:
137
+ name: dist
138
+ path: dist/
139
+
140
+ - name: Publish
141
+ run: uv publish
142
+
143
+ publish-testpypi:
144
+ name: Publish to TestPyPI (dry run)
145
+ needs: build
146
+ if: github.event_name == 'workflow_dispatch'
147
+ runs-on: ubuntu-latest
148
+ environment:
149
+ name: testpypi
150
+ url: https://test.pypi.org/project/pipecat-ai-context-hub/
151
+ permissions:
152
+ id-token: write
153
+ steps:
154
+ - name: Install uv
155
+ uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7.6.0
156
+ with:
157
+ version: ${{ env.UV_VERSION }}
158
+
159
+ - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
160
+ with:
161
+ name: dist
162
+ path: dist/
163
+
164
+ - name: Publish to TestPyPI
165
+ # TestPyPI rejects re-uploads of an existing version; for repeat dry
166
+ # runs bump the version locally or accept the failure as "already
167
+ # validated".
168
+ run: uv publish --publish-url https://test.pypi.org/legacy/
169
+