oh-my-agent-commandcode 0.0.0-stage → 20.38.3

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 (334) hide show
  1. package/README.md +35 -2
  2. package/filter-test-output.sh +52 -0
  3. package/mods/oma.ts +347 -0
  4. package/package.json +30 -4
  5. package/skills/_shared/conditional/experiment-ledger.md +28 -0
  6. package/skills/_shared/conditional/exploration-loop.md +22 -0
  7. package/skills/_shared/conditional/quality-score.md +33 -0
  8. package/skills/_shared/core/anti-ai-prose.md +191 -0
  9. package/skills/_shared/core/api-contracts/README.md +28 -0
  10. package/skills/_shared/core/api-contracts/template.md +90 -0
  11. package/skills/_shared/core/clarification-protocol.md +23 -0
  12. package/skills/_shared/core/code-intelligence.md +46 -0
  13. package/skills/_shared/core/collaboration-policy.md +28 -0
  14. package/skills/_shared/core/common-checklist.md +28 -0
  15. package/skills/_shared/core/context-budget.md +22 -0
  16. package/skills/_shared/core/context-loading.md +34 -0
  17. package/skills/_shared/core/difficulty-guide.md +26 -0
  18. package/skills/_shared/core/execution-policy.md +31 -0
  19. package/skills/_shared/core/lessons-learned.md +33 -0
  20. package/skills/_shared/core/prompt-structure.md +18 -0
  21. package/skills/_shared/core/quality-principles.md +11 -0
  22. package/skills/_shared/core/session-metrics.md +35 -0
  23. package/skills/_shared/core/skill-routing.md +39 -0
  24. package/skills/_shared/core/test-approach.md +54 -0
  25. package/skills/_shared/core/vendor-detection.md +52 -0
  26. package/skills/_shared/runtime/memory-protocol.md +118 -0
  27. package/skills/_shared/runtime/result-contract.md +64 -0
  28. package/skills/_shared/ui-interaction-quality.md +133 -0
  29. package/skills/oma-academic-writing/SKILL.md +181 -0
  30. package/skills/oma-academic-writing/resources/abstract-guide.md +51 -0
  31. package/skills/oma-academic-writing/resources/academic-verb-tiers.md +42 -0
  32. package/skills/oma-academic-writing/resources/anti-ai-checklist.md +52 -0
  33. package/skills/oma-academic-writing/resources/hedging-guide.md +132 -0
  34. package/skills/oma-academic-writing/resources/sentence-structure-reference.md +151 -0
  35. package/skills/oma-architecture/SKILL.md +203 -0
  36. package/skills/oma-architecture/resources/api-evolution.md +41 -0
  37. package/skills/oma-architecture/resources/checklist.md +42 -0
  38. package/skills/oma-architecture/resources/execution-protocol.md +115 -0
  39. package/skills/oma-architecture/resources/methodology-selection.md +92 -0
  40. package/skills/oma-architecture/resources/migration-patterns.md +28 -0
  41. package/skills/oma-architecture/resources/output-templates.md +111 -0
  42. package/skills/oma-architecture/resources/stakeholder-synthesis.md +80 -0
  43. package/skills/oma-backend/SKILL.md +202 -0
  44. package/skills/oma-backend/resources/checklist.md +45 -0
  45. package/skills/oma-backend/resources/error-playbook.md +97 -0
  46. package/skills/oma-backend/resources/execution-protocol.md +39 -0
  47. package/skills/oma-backend/resources/orm-reference.md +61 -0
  48. package/skills/oma-backend/variants/node/api-template.ts +315 -0
  49. package/skills/oma-backend/variants/node/snippets.md +475 -0
  50. package/skills/oma-backend/variants/node/stack.yaml +21 -0
  51. package/skills/oma-backend/variants/node/tech-stack.md +33 -0
  52. package/skills/oma-backend/variants/python/api-template.py +378 -0
  53. package/skills/oma-backend/variants/python/snippets.md +199 -0
  54. package/skills/oma-backend/variants/python/stack.yaml +18 -0
  55. package/skills/oma-backend/variants/python/tech-stack.md +45 -0
  56. package/skills/oma-backend/variants/rust/api-template.rs +635 -0
  57. package/skills/oma-backend/variants/rust/snippets.md +471 -0
  58. package/skills/oma-backend/variants/rust/stack.yaml +20 -0
  59. package/skills/oma-backend/variants/rust/tech-stack.md +36 -0
  60. package/skills/oma-backend/variants/stack.schema.json +73 -0
  61. package/skills/oma-brainstorm/SKILL.md +166 -0
  62. package/skills/oma-brainstorm/resources/triz-lite.md +117 -0
  63. package/skills/oma-coordination/SKILL.md +171 -0
  64. package/skills/oma-db/SKILL.md +201 -0
  65. package/skills/oma-db/resources/anti-patterns.md +177 -0
  66. package/skills/oma-db/resources/checklist.md +67 -0
  67. package/skills/oma-db/resources/document-templates.md +107 -0
  68. package/skills/oma-db/resources/error-playbook.md +50 -0
  69. package/skills/oma-db/resources/examples.md +170 -0
  70. package/skills/oma-db/resources/execution-protocol.md +127 -0
  71. package/skills/oma-db/resources/iso-controls.md +98 -0
  72. package/skills/oma-db/resources/migration-playbook.md +93 -0
  73. package/skills/oma-db/resources/query-tuning.md +57 -0
  74. package/skills/oma-db/resources/vector-db.md +159 -0
  75. package/skills/oma-debug/SKILL.md +146 -0
  76. package/skills/oma-debug/resources/bug-report-template.md +327 -0
  77. package/skills/oma-debug/resources/checklist.md +31 -0
  78. package/skills/oma-debug/resources/common-patterns.md +734 -0
  79. package/skills/oma-debug/resources/debugging-checklist.md +364 -0
  80. package/skills/oma-debug/resources/error-playbook.md +94 -0
  81. package/skills/oma-debug/resources/execution-protocol.md +40 -0
  82. package/skills/oma-design/SKILL.md +135 -0
  83. package/skills/oma-design/resources/asset-strategy.md +34 -0
  84. package/skills/oma-design/resources/checklist.md +63 -0
  85. package/skills/oma-design/resources/data-grid.md +48 -0
  86. package/skills/oma-design/resources/design-md-spec.md +107 -0
  87. package/skills/oma-design/resources/design-tokens.md +53 -0
  88. package/skills/oma-design/resources/error-playbook.md +18 -0
  89. package/skills/oma-design/resources/execution-protocol.md +95 -0
  90. package/skills/oma-design/resources/external-design-skills.md +130 -0
  91. package/skills/oma-design/resources/getdesign-fetcher.md +104 -0
  92. package/skills/oma-design/resources/product-interface-review.md +59 -0
  93. package/skills/oma-design/resources/redesign-protocol.md +52 -0
  94. package/skills/oma-design/resources/stitch-integration.md +244 -0
  95. package/skills/oma-dev-workflow/SKILL.md +375 -0
  96. package/skills/oma-dev-workflow/resources/affected-checks.py +58 -0
  97. package/skills/oma-dev-workflow/resources/api-workflows.md +58 -0
  98. package/skills/oma-dev-workflow/resources/database-patterns.md +107 -0
  99. package/skills/oma-dev-workflow/resources/i18n-patterns.md +63 -0
  100. package/skills/oma-dev-workflow/resources/release-coordination.md +240 -0
  101. package/skills/oma-dev-workflow/resources/tooling-profiles.md +217 -0
  102. package/skills/oma-dev-workflow/resources/troubleshooting.md +78 -0
  103. package/skills/oma-dev-workflow/resources/validation-pipeline.md +246 -0
  104. package/skills/oma-docs/SKILL.md +77 -0
  105. package/skills/oma-docs/resources/commands.md +76 -0
  106. package/skills/oma-explanation/SKILL.md +212 -0
  107. package/skills/oma-explanation/resources/document-structure.md +115 -0
  108. package/skills/oma-explanation/resources/draft-format.md +199 -0
  109. package/skills/oma-explanation/resources/html-contract.md +102 -0
  110. package/skills/oma-frontend/SKILL.md +227 -0
  111. package/skills/oma-frontend/resources/angular-rules.md +110 -0
  112. package/skills/oma-frontend/resources/checklist.md +76 -0
  113. package/skills/oma-frontend/resources/error-playbook.md +125 -0
  114. package/skills/oma-frontend/resources/execution-protocol.md +46 -0
  115. package/skills/oma-frontend/resources/snippets.md +354 -0
  116. package/skills/oma-frontend/resources/specialized-visual-implementation.md +193 -0
  117. package/skills/oma-frontend/resources/tailwind-rules.md +83 -0
  118. package/skills/oma-frontend/resources/tech-stack.md +156 -0
  119. package/skills/oma-hwp/SKILL.md +166 -0
  120. package/skills/oma-hwp/config/hwp-config.yaml +35 -0
  121. package/skills/oma-hwp/resources/balanced-tables.ts +39 -0
  122. package/skills/oma-hwp/resources/execution-protocol.md +145 -0
  123. package/skills/oma-hwp/resources/flatten-tables.ts +101 -0
  124. package/skills/oma-hwp/resources/package.json +13 -0
  125. package/skills/oma-hwp/resources/troubleshooting.md +70 -0
  126. package/skills/oma-hwp/resources/tsconfig.json +10 -0
  127. package/skills/oma-hwp/resources/turndown-plugin-gfm.d.ts +9 -0
  128. package/skills/oma-image/SKILL.md +142 -0
  129. package/skills/oma-image/config/image-config.yaml +70 -0
  130. package/skills/oma-image/resources/checklist.md +18 -0
  131. package/skills/oma-image/resources/execution-protocol.md +117 -0
  132. package/skills/oma-image/resources/invocation.md +105 -0
  133. package/skills/oma-image/resources/prompt-tips.md +71 -0
  134. package/skills/oma-image/resources/vendor-matrix.md +90 -0
  135. package/skills/oma-market/SKILL.md +142 -0
  136. package/skills/oma-market/resources/checklist.md +12 -0
  137. package/skills/oma-market/resources/error-playbook.md +12 -0
  138. package/skills/oma-market/resources/execution-protocol.md +60 -0
  139. package/skills/oma-market/resources/frameworks/pestel.md +101 -0
  140. package/skills/oma-market/resources/frameworks/porters-5f.md +90 -0
  141. package/skills/oma-market/resources/frameworks/swot.md +61 -0
  142. package/skills/oma-market/resources/intent-rules.md +35 -0
  143. package/skills/oma-market/resources/output-laws.md +53 -0
  144. package/skills/oma-mobile/SKILL.md +168 -0
  145. package/skills/oma-mobile/resources/checklist.md +77 -0
  146. package/skills/oma-mobile/resources/error-playbook.md +198 -0
  147. package/skills/oma-mobile/resources/execution-protocol.md +47 -0
  148. package/skills/oma-mobile/resources/screen-template.dart +331 -0
  149. package/skills/oma-mobile/resources/screen-template.swift +239 -0
  150. package/skills/oma-mobile/resources/screen-template.tsx +179 -0
  151. package/skills/oma-mobile/resources/tech-stack.md +69 -0
  152. package/skills/oma-mobile/variants/README.md +45 -0
  153. package/skills/oma-mobile/variants/flutter/api-template.dart +461 -0
  154. package/skills/oma-mobile/variants/flutter/snippets.md +1353 -0
  155. package/skills/oma-mobile/variants/flutter/stack.yaml +21 -0
  156. package/skills/oma-mobile/variants/flutter/tech-stack.md +201 -0
  157. package/skills/oma-mobile/variants/kotlin-android/api-template.kt +182 -0
  158. package/skills/oma-mobile/variants/kotlin-android/snippets.md +871 -0
  159. package/skills/oma-mobile/variants/kotlin-android/stack.yaml +32 -0
  160. package/skills/oma-mobile/variants/kotlin-android/tech-stack.md +159 -0
  161. package/skills/oma-mobile/variants/react-native/api-template.ts +531 -0
  162. package/skills/oma-mobile/variants/react-native/snippets.md +1014 -0
  163. package/skills/oma-mobile/variants/react-native/stack.yaml +22 -0
  164. package/skills/oma-mobile/variants/react-native/tech-stack.md +192 -0
  165. package/skills/oma-mobile/variants/stack.schema.json +68 -0
  166. package/skills/oma-mobile/variants/swift-ios/api-template.swift +165 -0
  167. package/skills/oma-mobile/variants/swift-ios/snippets.md +1028 -0
  168. package/skills/oma-mobile/variants/swift-ios/stack.yaml +25 -0
  169. package/skills/oma-mobile/variants/swift-ios/tech-stack.md +174 -0
  170. package/skills/oma-observability/SKILL.md +225 -0
  171. package/skills/oma-observability/resources/anti-patterns.md +555 -0
  172. package/skills/oma-observability/resources/boundaries/cross-application.md +348 -0
  173. package/skills/oma-observability/resources/boundaries/multi-tenant.md +290 -0
  174. package/skills/oma-observability/resources/boundaries/release.md +372 -0
  175. package/skills/oma-observability/resources/boundaries/slo.md +225 -0
  176. package/skills/oma-observability/resources/checklist.md +123 -0
  177. package/skills/oma-observability/resources/examples.md +448 -0
  178. package/skills/oma-observability/resources/execution-protocol.md +166 -0
  179. package/skills/oma-observability/resources/incident-forensics.md +348 -0
  180. package/skills/oma-observability/resources/intent-rules.md +307 -0
  181. package/skills/oma-observability/resources/layers/L3-network.md +281 -0
  182. package/skills/oma-observability/resources/layers/L4-transport.md +299 -0
  183. package/skills/oma-observability/resources/layers/L7-application/crash-analytics.md +359 -0
  184. package/skills/oma-observability/resources/layers/L7-application/mobile-rum.md +278 -0
  185. package/skills/oma-observability/resources/layers/L7-application/waf.md +246 -0
  186. package/skills/oma-observability/resources/layers/L7-application/web-rum.md +350 -0
  187. package/skills/oma-observability/resources/layers/mesh.md +368 -0
  188. package/skills/oma-observability/resources/matrix.md +177 -0
  189. package/skills/oma-observability/resources/meta-observability.md +605 -0
  190. package/skills/oma-observability/resources/observability-as-code.md +666 -0
  191. package/skills/oma-observability/resources/signals/audit.md +310 -0
  192. package/skills/oma-observability/resources/signals/cost.md +303 -0
  193. package/skills/oma-observability/resources/signals/logs.md +263 -0
  194. package/skills/oma-observability/resources/signals/metrics.md +478 -0
  195. package/skills/oma-observability/resources/signals/privacy.md +351 -0
  196. package/skills/oma-observability/resources/signals/profiles.md +245 -0
  197. package/skills/oma-observability/resources/signals/traces.md +360 -0
  198. package/skills/oma-observability/resources/standards.md +214 -0
  199. package/skills/oma-observability/resources/transport/collector-topology.md +308 -0
  200. package/skills/oma-observability/resources/transport/otlp-grpc-vs-http.md +256 -0
  201. package/skills/oma-observability/resources/transport/sampling-recipes.md +297 -0
  202. package/skills/oma-observability/resources/transport/udp-statsd-mtu.md +167 -0
  203. package/skills/oma-observability/resources/vendor-categories.md +352 -0
  204. package/skills/oma-orchestration/SKILL.md +302 -0
  205. package/skills/oma-orchestration/config/cli-config.yaml +92 -0
  206. package/skills/oma-orchestration/resources/memory-schema.md +232 -0
  207. package/skills/oma-orchestration/resources/subagent-prompt-template.md +30 -0
  208. package/skills/oma-orchestration/scripts/parallel-run.sh +6 -0
  209. package/skills/oma-orchestration/scripts/spawn-agent.sh +5 -0
  210. package/skills/oma-orchestration/scripts/verify.sh +20 -0
  211. package/skills/oma-orchestration/templates/backend-task.md +19 -0
  212. package/skills/oma-orchestration/templates/debug-task.md +16 -0
  213. package/skills/oma-orchestration/templates/frontend-task.md +18 -0
  214. package/skills/oma-orchestration/templates/mobile-task.md +18 -0
  215. package/skills/oma-orchestration/templates/qa-task.md +16 -0
  216. package/skills/oma-orchestration/templates/tasks-example.yaml +15 -0
  217. package/skills/oma-pdf/SKILL.md +162 -0
  218. package/skills/oma-pdf/config/pdf-config.yaml +27 -0
  219. package/skills/oma-pdf/resources/execution-protocol.md +127 -0
  220. package/skills/oma-pm/SKILL.md +157 -0
  221. package/skills/oma-pm/resources/error-playbook.md +75 -0
  222. package/skills/oma-pm/resources/examples.md +439 -0
  223. package/skills/oma-pm/resources/execution-protocol.md +62 -0
  224. package/skills/oma-pm/resources/iso-planning.md +110 -0
  225. package/skills/oma-pm/resources/plan-phase-protocol.md +66 -0
  226. package/skills/oma-pm/resources/task-template.json +86 -0
  227. package/skills/oma-qa/SKILL.md +141 -0
  228. package/skills/oma-qa/resources/checklist.md +339 -0
  229. package/skills/oma-qa/resources/error-playbook.md +98 -0
  230. package/skills/oma-qa/resources/execution-protocol.md +169 -0
  231. package/skills/oma-qa/resources/iso-quality.md +82 -0
  232. package/skills/oma-qa/resources/verify-ship-protocol.md +116 -0
  233. package/skills/oma-recap/SKILL.md +245 -0
  234. package/skills/oma-recap/resources/output-formats.md +83 -0
  235. package/skills/oma-refactor/SKILL.md +184 -0
  236. package/skills/oma-refactor/resources/definition.md +108 -0
  237. package/skills/oma-refactor/resources/governance.md +33 -0
  238. package/skills/oma-refactor/resources/hotspots.py +44 -0
  239. package/skills/oma-refactor/resources/measurement.md +93 -0
  240. package/skills/oma-scholar/SKILL.md +276 -0
  241. package/skills/oma-scholar/config/scholar-config.yaml +79 -0
  242. package/skills/oma-scholar/resources/api-endpoints.md +174 -0
  243. package/skills/oma-scholar/resources/checklist.md +92 -0
  244. package/skills/oma-scholar/resources/execution-protocol.md +224 -0
  245. package/skills/oma-scholar/resources/fallback-providers.md +143 -0
  246. package/skills/oma-scholar/resources/setup-openalex.md +85 -0
  247. package/skills/oma-scholar/resources/sidecar-spec.md +341 -0
  248. package/skills/oma-scholar/resources/upstream-spec-cache.md +972 -0
  249. package/skills/oma-scm/SKILL.md +103 -0
  250. package/skills/oma-scm/resources/cm-operations.md +56 -0
  251. package/skills/oma-scm/resources/codeowners-playbook.md +45 -0
  252. package/skills/oma-scm/resources/conventional-commits.md +108 -0
  253. package/skills/oma-scm/resources/merge-risk.md +76 -0
  254. package/skills/oma-scm/resources/onboarding-risk-signals.md +71 -0
  255. package/skills/oma-search/SKILL.md +125 -0
  256. package/skills/oma-search/resources/checklist.md +36 -0
  257. package/skills/oma-search/resources/error-playbook.md +66 -0
  258. package/skills/oma-search/resources/examples.md +80 -0
  259. package/skills/oma-search/resources/execution-protocol.md +86 -0
  260. package/skills/oma-search/resources/intent-rules.md +47 -0
  261. package/skills/oma-search/resources/trust-registry.md +53 -0
  262. package/skills/oma-security/SKILL.md +172 -0
  263. package/skills/oma-security/resources/artex.md +108 -0
  264. package/skills/oma-security/resources/ci.md +134 -0
  265. package/skills/oma-security/resources/cisco-source.md +108 -0
  266. package/skills/oma-security/resources/deepsec-config.md +45 -0
  267. package/skills/oma-security/resources/deepsec-matchers.md +35 -0
  268. package/skills/oma-security/resources/deepsec-scanning.md +45 -0
  269. package/skills/oma-security/resources/deepsec-setup.md +41 -0
  270. package/skills/oma-security/resources/findings-contract.md +408 -0
  271. package/skills/oma-security/resources/mcp-scanning.md +122 -0
  272. package/skills/oma-security/resources/skill-scanning.md +106 -0
  273. package/skills/oma-security/resources/validation.md +71 -0
  274. package/skills/oma-skill-creation/SKILL.md +84 -0
  275. package/skills/oma-skill-creation/resources/prompt-evaluation.md +36 -0
  276. package/skills/oma-skill-creation/resources/ssl-lite-template.md +108 -0
  277. package/skills/oma-skill-creation/resources/validation-checklist.md +101 -0
  278. package/skills/oma-slide/SKILL.md +277 -0
  279. package/skills/oma-slide/resources/animation-patterns.md +245 -0
  280. package/skills/oma-slide/resources/assets/deck-stage.js +514 -0
  281. package/skills/oma-slide/resources/assets/viewport-base.css +257 -0
  282. package/skills/oma-slide/resources/canva-integration.md +203 -0
  283. package/skills/oma-slide/resources/checklist.md +46 -0
  284. package/skills/oma-slide/resources/design-doctrine.md +260 -0
  285. package/skills/oma-slide/resources/fixed-stage.md +232 -0
  286. package/skills/oma-slide/resources/generation-protocol.md +393 -0
  287. package/skills/oma-slide/resources/native-pptx.md +84 -0
  288. package/skills/oma-slide/resources/selection-index.json +461 -0
  289. package/skills/oma-slide/resources/style-presets.LICENSE +10 -0
  290. package/skills/oma-slide/resources/style-presets.md +520 -0
  291. package/skills/oma-tf-infra/SKILL.md +201 -0
  292. package/skills/oma-tf-infra/resources/checklist.md +53 -0
  293. package/skills/oma-tf-infra/resources/cost-optimization.md +574 -0
  294. package/skills/oma-tf-infra/resources/error-playbook.md +68 -0
  295. package/skills/oma-tf-infra/resources/examples.md +38 -0
  296. package/skills/oma-tf-infra/resources/execution-protocol.md +129 -0
  297. package/skills/oma-tf-infra/resources/iso-42001-infra.md +229 -0
  298. package/skills/oma-tf-infra/resources/multi-cloud-examples.md +241 -0
  299. package/skills/oma-tf-infra/resources/policy-testing-examples.md +332 -0
  300. package/skills/oma-translation/SKILL.md +229 -0
  301. package/skills/oma-translation/resources/anti-ai-patterns.md +104 -0
  302. package/skills/oma-translation/resources/lang/_template.md +73 -0
  303. package/skills/oma-translation/resources/lang/en.md +123 -0
  304. package/skills/oma-translation/resources/lang/ja.md +274 -0
  305. package/skills/oma-translation/resources/lang/ko.md +228 -0
  306. package/skills/oma-translation/resources/lang/zh.md +285 -0
  307. package/skills/oma-translation/resources/style-skills.md +104 -0
  308. package/skills/oma-translation/resources/translation-rubric.md +126 -0
  309. package/skills/oma-video/SKILL.md +229 -0
  310. package/skills/oma-video/config/video-config.yaml +60 -0
  311. package/skills/oma-video/resources/checklist.md +26 -0
  312. package/skills/oma-video/resources/execution-protocol.md +122 -0
  313. package/skills/oma-video/resources/existing-media.md +185 -0
  314. package/skills/oma-video/resources/hyperframes-authoring/README.md +44 -0
  315. package/skills/oma-video/resources/hyperframes-authoring/demo.md +31 -0
  316. package/skills/oma-video/resources/hyperframes-authoring/explainer.md +10 -0
  317. package/skills/oma-video/resources/hyperframes-authoring/shorts.md +10 -0
  318. package/skills/oma-video/resources/motion-principles.md +81 -0
  319. package/skills/oma-video/resources/mpt/driver.py +301 -0
  320. package/skills/oma-video/resources/prompt-tips.md +75 -0
  321. package/skills/oma-video/resources/script-schema.md +81 -0
  322. package/skills/oma-video/resources/sound-design.md +127 -0
  323. package/skills/oma-video/resources/strudel/package.json +11 -0
  324. package/skills/oma-video/resources/strudel/page.html +87 -0
  325. package/skills/oma-video/resources/strudel/render.mjs +295 -0
  326. package/skills/oma-video/resources/vendor-matrix.md +124 -0
  327. package/skills/oma-voice/SKILL.md +249 -0
  328. package/skills/oma-voice/config/voice-config.yaml +30 -0
  329. package/skills/oma-voice/resources/audio-processing.md +119 -0
  330. package/skills/oma-voice/resources/checklist.md +47 -0
  331. package/skills/oma-voice/resources/execution-protocol.md +215 -0
  332. package/skills/oma-voice/resources/prompt-tips.md +43 -0
  333. package/skills/oma-voice/resources/voice-matrix.md +51 -0
  334. package/skills/oma-voice/resources/voicestudio.md +87 -0
@@ -0,0 +1,124 @@
1
+ # Vendor Matrix
2
+
3
+ oma-video is a **key-optional** router (backend rule 11). Each capability has a
4
+ provider `order` (a fallback chain). The orchestrator probes availability and
5
+ walks the chain: the first available provider wins; only chain exhaustion is a
6
+ stage failure. Paid providers auto-enable **only** when their env key is set;
7
+ otherwise the chain falls through to a key-free default.
8
+
9
+ ## Capabilities -> providers
10
+
11
+ | Capability | order (config) | real (key/resource) | key-free fallback | marker |
12
+ |------------|----------------|---------------------|-------------------|--------|
13
+ | script | `[agent-script]` | agent-authored script (agent-as-key) | — | — |
14
+ | voice | `[oma-voice]` | Voicebox MCP or VoiceStudio REST TTS + STT timing (`voice.backend`) | estimated timing (no wav) | — |
15
+ | visual | `[oma-image, pexels, pixelle]` | Pexels stock · Pixelle AIGC | static oma-image stills | `TODO(oma-deferred): pexels` / `pixelle` |
16
+ | caption | `[oma-captions]` | oma-translation for non-source locale | source-locale text from timing | `TODO(oma-deferred): oma-translation` |
17
+ | capture | Cap / guided capture | Human-recorded video ingestion | guided protocol + `--capture <path>` | `TODO(oma-deferred): cap` |
18
+ | compositor | `[hyperframes, mpt]` | HyperFrames live render (wired, default) · MPT custom-script | none: missing toolchain, failed render, or invalid output fails with diagnostics | — |
19
+
20
+ ## Tier model
21
+
22
+ | Tier | Surface | Providers | Notes |
23
+ |:---:|---------|-----------|-------|
24
+ | 1 | CLI-first (subprocess) | HyperFrames, MPT, oma-image, oma-slide, oma-voice (REST) | deterministic; preferred whenever a CLI can drive the work |
25
+ | 2 | MCP | Voicebox MCP, Pixelle-MCP | localhost MCP; Pixelle off by default, community-MCP consent + key |
26
+ | 3 | Guided (human) | Cap / human-recorded video | `demo` capture is performed by a human |
27
+
28
+ ## oma-voice (VoiceProvider + timing)
29
+
30
+ | Field | Value |
31
+ |-------|-------|
32
+ | Surface | Voicebox MCP (Streamable HTTP) at `127.0.0.1:17493/mcp`; REST on the same port |
33
+ | Synthesize | MCP `voicebox_speak{text, profile, language}` -> `generation_id` (REST `POST /speak` fallback) |
34
+ | Retrieve wav | REST `GET /audio/{generation_id}` (MCP has no save-to-disk) |
35
+ | Timing (real) | MCP `voicebox_transcribe{audio_path}` on the wav -> `source: voicebox-stt` (REST `POST /transcribe` fallback) |
36
+ | Timing (fallback) | `estimated` (no wav written, `audio` field empty); a whisper.cpp hop is reserved but not wired (`TODO(oma-deferred): whisper-cpp`) |
37
+ | Side effect | Narration plays on the speakers during synthesis |
38
+ | Health | exit 5 if MCP down; exit 3 if the named profile is missing |
39
+
40
+ ### VoiceStudio backend
41
+
42
+ `voice.backend` in oma-config selects the speech
43
+ backend behind the same `oma-voice` provider: `auto` (default) uses Voicebox
44
+ when healthy, otherwise VoiceStudio; `voicebox` and `voicestudio` never fall
45
+ through. Any live failure degrades to estimated timing with a warning.
46
+
47
+ | Field | Value |
48
+ |-------|-------|
49
+ | Surface | VoiceStudio REST at `OMA_VOICESTUDIO_URL` / `VOICESTUDIO_URL` (default `127.0.0.1:3900`) |
50
+ | Synthesize | `POST /v1/audio/speech{model: tts-1, voice: <profile id>, input, response_format: wav}`; a non-WAV body is rejected |
51
+ | Timing (real) | `POST /v1/audio/transcriptions` (`verbose_json`, word + segment timestamps) -> `source: voicestudio-stt`; a failed transcription keeps the wav with estimated segments |
52
+ | Auth | none on loopback; `OMNIVOICE_API_KEY` bearer only to a loopback or HTTPS backend |
53
+ | Side effect | none on the speakers; first use of an engine may download its model inside the backend |
54
+ | Doctor | `oma video doctor` reports `voicestudio` as an optional check |
55
+
56
+ ## oma-image (VisualProvider: generate) — default key-free visual
57
+
58
+ | Field | Value |
59
+ |-------|-------|
60
+ | Transport | `oma image generate "<prompt>" --vendor auto --size <16-multiple> --output json --output-dir <runDir>/visuals` |
61
+ | Aspect -> size | snapped to nearest 16-multiple: 9:16 -> 1088×1920, 16:9 -> 1920×1088, 1:1 -> 1088×1088 |
62
+ | Crop | HyperFrames crops the still to the exact frame; the still stays static |
63
+ | Cost | free defaults (pollinations / antigravity); codex per-image per oma-image config |
64
+
65
+ ## oma-slide (VisualProvider: slide, explainer) — key-free
66
+
67
+ | Field | Value |
68
+ |-------|-------|
69
+ | Transport | `oma slide` generate deck -> `oma slide export png --workspace <deck> --output-dir <runDir>/visuals` -> 1920×1080 frames |
70
+ | Layering | oma-slide internally calls oma-image (same key-free chain) |
71
+ | Use | explainer code/diagram frames |
72
+
73
+ ## Pexels (VisualProvider: stock) — paid, opt-in
74
+
75
+ | Field | Value |
76
+ |-------|-------|
77
+ | Auth | `PEXELS_API_KEY` env var |
78
+ | Enabled | only when the key is present (`providers.pexels.enabled` gate) |
79
+ | Fallback | absent key -> skip; chain falls to static oma-image stills |
80
+ | Marker | `TODO(oma-deferred): pexels` on the real-call branch until the key is provisioned |
81
+
82
+ ## Pixelle-MCP + RunningHub (VisualProvider: aigc) — paid, off by default
83
+
84
+ | Field | Value |
85
+ |-------|-------|
86
+ | Surface | MCP `http://localhost:9004/pixelle/mcp`; RunningHub cloud or local ComfyUI |
87
+ | Setup | `uvx pixelle@latest` + wizard; one-time **explicit consent + source review** |
88
+ | Auth | `RUNNINGHUB_API_KEY` env var; cost gates on RunningHub credits via `--max-usd` |
89
+ | Enabled | off by default (`providers.pixelle.enabled`); never auto-connects |
90
+ | Fallback | absent/declined -> oma-image stills |
91
+ | Marker | `TODO(oma-deferred): pixelle` on the real-call branch |
92
+
93
+ ## Cap (CaptureProvider, demo) — Tier 3 guided
94
+
95
+ | Field | Value |
96
+ |-------|-------|
97
+ | Real | Cap CLI trigger when installed |
98
+ | Fallback | guided protocol: instruct the human to record, then pass `--capture <path>` |
99
+ | Path safety | `--capture` is absolutized, `$PWD`-guarded, existence + format validated |
100
+ | Marker | `TODO(oma-deferred): cap` on the CLI-trigger branch |
101
+
102
+ ## Compositor: HyperFrames (default) / MPT (alt)
103
+
104
+ | Field | Value |
105
+ |-------|-------|
106
+ | Real | Agent-authored `<runDir>/hyperframes/index.html`; `compose` stages local assets and the authoring contract. `render` runs the cached CLI: lint → strict MP4 render → ffprobe. |
107
+ | Requires | Node + Chrome Headless Shell + FFmpeg (bootstrapped once via `oma video doctor --install`) |
108
+ | Failure | Missing toolchain, render error, missing video stream, or non-positive duration fails with diagnostics. `OMA_VIDEO_MOCK=1` may write a deterministic placeholder only for tests. |
109
+ | Determinism | Saved render spec, local assets, authored HTML, seed, recorded CLI version, and embedded font. Byte identity across different browser/OS versions is not guaranteed. |
110
+ | MPT alt | inject the agent-written script (custom-script mode); keys env-only + log masking; `--compositor mpt` |
111
+
112
+ ## Error Classification
113
+
114
+ | Error kind | Retry policy | Exit code when solo |
115
+ |------------|-------------|---------------------|
116
+ | `provider-unavailable` | try next provider in `order`; chain-exhaustion fails | 5 |
117
+ | `auth-required` | fail; hint tells the user how to authenticate | 5 |
118
+ | `compositor-bootstrap` | fail; point to `oma video doctor` or `oma video doctor --install-mpt` | 1 |
119
+ | `cost-guardrail` | confirm; decline -> stop | 1 |
120
+ | `capture-required` | guided protocol; not a hard error | (guided) |
121
+ | `schema-validation` | fail; identify the offending field | 4 |
122
+ | `safety-refused` | short-circuit (no fallback) | 2 |
123
+ | `not-found` | fail; missing profile / asset | 3 |
124
+ | `timeout` | record; fail | 6 |
@@ -0,0 +1,249 @@
1
+ ---
2
+ name: oma-voice
3
+ description: Generate or transcribe speech with Voicebox or VoiceStudio, or
4
+ process existing audio locally. Use for narration, transcripts, timed speech,
5
+ and loudness conversion; video editing uses oma-video.
6
+ ---
7
+
8
+ # Voice Skill - Speech and Local Audio Processing
9
+
10
+ ## Scheduling
11
+
12
+ ### Goal
13
+ Generate and transcribe speech through a local speech backend (the Voicebox app, or VoiceStudio per `voice.backend`), and process existing audio with local media tools. The backend owns synthesis engines and profiles; FFmpeg owns file conversion, duration adjustment, and loudness processing.
14
+
15
+ ### Intent signature
16
+ - User asks to generate speech, narrate text, produce a voiceover, create an mp3 or wav from text.
17
+ - User wants an audio file transcribed into text, meeting notes, or a transcript.
18
+ - User asks for a voice notification when a long task completes or a workflow step is blocked.
19
+ - Another skill needs local audio generation infrastructure.
20
+ - User needs existing speech fitted to a time window, resampled, converted, or loudness-normalized.
21
+
22
+ ### When to use
23
+ - Generating short notification audio for agent task completion or blockers.
24
+ - Producing voiceover, narration, or audio assets (mp3 or wav) for apps and content.
25
+ - Transcribing local audio files (mp3, wav, m4a, webm, flac) to Markdown.
26
+ - Comparing voice profiles by re-running the same text against different profile ids.
27
+ - Processing an existing audio asset, including speech used in an `oma-video` dubbing job.
28
+
29
+ ### When NOT to use
30
+ - Cloud TTS or high-fidelity multilingual cloud voices -> out of scope; future multi-vendor extension.
31
+ - Real-time microphone dictation loop in the terminal -> use Voicebox app's built-in hotkey dictation.
32
+ - Voice cloning sample upload and profile creation -> done in the Voicebox desktop app UI.
33
+ - Video editing and audio/video placement -> `oma-video`; music and sound design are out of scope.
34
+ - Stories Editor multi-voice timeline composition -> use the Voicebox app UI.
35
+
36
+ ### Expected inputs
37
+ - TTS: text (<= 5000 chars per call), optional profile id, optional engine, optional language, optional output path.
38
+ - STT: audio file path (absolute or relative to `$CWD`), optional language hint.
39
+ - Notification: short message (<= 240 chars), profile id resolved from config.
40
+ - Processing: existing audio path, requested operations, and any stated duration, sample rate, channel layout, loudness, or format constraints. Derive targets from the brief, not a universal mastering preset.
41
+
42
+ ### Expected outputs
43
+ - TTS: audio file (`wav` — Voicebox's native TTS output format; `mp3` optional via a local ffmpeg transcode) at `.agents/results/voice/{timestamp}-{shortid}/output.{wav|mp3}` plus `manifest.json`.
44
+ - STT: `transcript.md` at `.agents/results/voice/transcripts/{timestamp}-{shortid}/` plus `manifest.json`.
45
+ - Notification: ephemeral playback through Voicebox; no disk write by default.
46
+ - Processing: a separate processed audio file plus `manifest.json` containing source/output paths, operations, and measured audio properties. Keep the source intact. A generation id is present only when Voicebox actually generated the audio.
47
+
48
+ ### Dependencies
49
+ - Processing only: installed `ffmpeg` and `ffprobe`; no Voicebox app or voice profile is required.
50
+ - Generation/transcription: Voicebox desktop app installed and running locally, or a running VoiceStudio backend selected through `voice.backend` (`resources/voicestudio.md`).
51
+ - Generation/transcription only: Voicebox MCP registered (`claude mcp add --transport http voicebox http://127.0.0.1:17493/mcp`).
52
+ - TTS only: at least one voice profile created in the Voicebox app UI.
53
+ - TTS only: optionally pre-downloaded engine models for the selected profile.
54
+
55
+ ### Control-flow features
56
+ - Branches by mode (notify, asset, transcribe), language, and profile availability.
57
+ - Calls voicebox via MCP tools, with REST `GET /health` as the handshake probe.
58
+ - Reads input audio files and writes generated audio plus manifests.
59
+ - Caches discovered MCP tool names after the first successful `tools/list`.
60
+
61
+ ## Structural Flow
62
+
63
+ ### Entry
64
+ 1. Detect the requested mode: notification, asset TTS, transcription, or existing-audio processing. For processing, follow `resources/audio-processing.md` directly, before any Voicebox health, profile, or model lookup.
65
+ 2. Resolve `voice.backend` (`auto` tries Voicebox, then VoiceStudio). For VoiceStudio, follow `resources/voicestudio.md` from here; the steps below describe Voicebox. Verify Voicebox is reachable via MCP handshake or `GET /health`.
66
+ 3. On the first run only, call MCP `tools/list` and cache the resolved tool names.
67
+ 4. For notification or asset TTS, resolve the target voice profile id. For transcription,
68
+ validate the audio input and continue without a profile.
69
+
70
+ ### Scenes
71
+ 1. **PREPARE**: Resolve the operation and its inputs. Voicebox modes use text/audio and language; TTS additionally needs a profile. File processing uses the source and requested media properties.
72
+ 2. **ACQUIRE**: If a required signal is missing, run the clarification protocol once.
73
+ 3. **ACT**: Invoke the appropriate MCP tool (TTS or STT), or process the existing asset with local FFmpeg commands.
74
+ 4. **VERIFY**: Confirm the response carries audio output or transcript content. Validate manifest fields.
75
+ 5. **FINALIZE**: Write `manifest.json` alongside the output. Report the path or transcript to the user.
76
+
77
+ ### Transitions
78
+ - For generation/transcription, if Voicebox is unreachable, surface the install or launch hint and exit. Do not attempt auto-relaunch. Existing-file processing continues without it.
79
+ - Loopback addresses refer to the process's own host or container. Invoke a host Voicebox service from the host, then transfer the resulting file to the task container; a container's `127.0.0.1` does not probe the host app.
80
+ - For timed narration, keep the raw generation. Select a language-capable available profile, measure the raw duration, and use `resources/audio-processing.md` for fitting. A neural engine or correct loudness does not establish natural pronunciation or prosody.
81
+ - If a TTS request has no usable profile, point the user at the Voicebox app UI to create a profile, then exit. A transcription request never needs a profile.
82
+ - If a TTS request exceeds 5000 chars, ask whether to truncate or split. Do not auto-chunk in v1.
83
+ - If an STT input exceeds 30 minutes, ask whether to proceed. Do not auto-split.
84
+ - If the selected engine model is not loaded, ask the user before triggering a download.
85
+
86
+ ### Failure and recovery
87
+ | Failure | Recovery |
88
+ |---------|----------|
89
+ | No selected backend reachable | Print the Voicebox install/launch hint (and VoiceStudio for `auto`), exit code 5 |
90
+ | No voice profile for TTS | Print "create a profile in Voicebox" hint, exit code 3 |
91
+ | Engine model missing | Ask before triggering download |
92
+ | Output path outside `$PWD` | Use an explicitly requested path; ask only if the destination is ambiguous or overwrites unrelated data |
93
+ | TTS over 5000 chars | Ask the user to split or truncate |
94
+ | STT over 30 minutes | Confirm only if the requested duration or resource cost is unresolved |
95
+ | MCP tool name drift | Re-run `tools/list` and update the cache |
96
+ | SIGINT | Abort the MCP call, write no partial output |
97
+ | Local media executable missing | Report the missing tool for the requested operation; do not start Voicebox or replace audio with a placeholder |
98
+ | Speech cannot fit naturally | Retain the raw audio; adjust generation pacing when synthesis is available and authorized, or report the unresolved timing constraint instead of clipping words |
99
+
100
+ ### Exit
101
+ - Success: audio file or transcript exists with a complete manifest, and the path is reported.
102
+ - Partial success: output exists but a guardrail warning is surfaced (length, disk, model fallback).
103
+ - Failure: no output, the blocker (auth, profile, engine, network) is explicit.
104
+
105
+ ## Logical Operations
106
+
107
+ ### Actions
108
+ | Action | SSL primitive | Evidence |
109
+ |--------|---------------|----------|
110
+ | Validate mode and inputs | `VALIDATE` | Clarification protocol in execution-protocol.md |
111
+ | Resolve TTS voice profile | `SELECT` | `voicebox_list_profiles` + config defaults |
112
+ | Health check | `READ` | MCP handshake or `GET /health` |
113
+ | Generate speech | `CALL_TOOL` | MCP `voicebox_speak` |
114
+ | Transcribe audio | `CALL_TOOL` | MCP `voicebox_transcribe` |
115
+ | Write output and manifest | `WRITE` | Audio or transcript plus `manifest.json` |
116
+ | Inspect result | `VALIDATE` | Output presence, duration, manifest fields |
117
+ | Report result | `NOTIFY` | Final user-facing summary |
118
+
119
+ ### Tools and instruments
120
+ - Voicebox MCP server at `http://127.0.0.1:17493/mcp` for generation/transcription; local FFmpeg and ffprobe for existing audio.
121
+ - REST surface for health and audio retrieval (`GET /health`, `GET /audio/{generation_id}`).
122
+ - Resource references: voice matrix, prompt tips, execution protocol, checklist.
123
+
124
+ ### Canonical command path
125
+
126
+ Dispatch existing-audio work to `resources/audio-processing.md`. The path below
127
+ is for Voicebox generation/transcription only; timed TTS follows the processing
128
+ reference after fetching the raw WAV.
129
+
130
+ ```text
131
+ # 1. MCP handshake or REST health
132
+ GET http://127.0.0.1:17493/health -> 200 OK
133
+
134
+ # 2. Discover tool names on first run
135
+ MCP tools/list -> cache real names
136
+
137
+ # 3. TTS only: resolve profile
138
+ MCP voicebox_list_profiles -> pick profile by name or config default
139
+
140
+ # 4. Generate or transcribe (STT skips profile lookup and model-status check)
141
+ MCP voicebox_speak { text, profile, language?, engine?, personality? }
142
+ MCP voicebox_transcribe { audio_path | audio_base64, language?, model? }
143
+
144
+ # 5. Fetch the generated audio (MCP has no save-to-disk; TTS output is wav)
145
+ GET http://127.0.0.1:17493/audio/{generation_id} -> wav bytes
146
+
147
+ # 6. Persist output + manifest
148
+ .agents/results/voice/<timestamp>-<shortid>/output.wav + manifest.json
149
+ .agents/results/voice/transcripts/<timestamp>-<shortid>/transcript.md + manifest.json
150
+ ```
151
+
152
+ ### MCP tool mapping (verified against Voicebox 0.5.0)
153
+
154
+ | Use case | MCP tool | REST backing |
155
+ |---|---|---|
156
+ | TTS generation | `voicebox_speak` | `POST /speak` |
157
+ | STT transcription | `voicebox_transcribe` | `POST /transcribe` |
158
+ | Profile listing | `voicebox_list_profiles` | `GET /profiles` |
159
+ | Captures listing | `voicebox_list_captures` | `GET /history` (captures view) |
160
+
161
+ Tools not exposed via MCP (REST only): model status (`GET /models/status`), audio file serving (`GET /audio/{generation_id}`), per-version audio (`GET /audio/version/{version_id}`). The skill calls those over loopback HTTP when needed.
162
+
163
+ **Notes on `voicebox_speak`:**
164
+ - Required: `text`. Optional: `profile`, `engine`, `language`, `personality` (bool).
165
+ - Audio plays on the user speakers and is saved to the Captures / History panel automatically. There is no `save_to_disk` toggle on the MCP tool itself; to persist a local copy, fetch `GET /audio/{generation_id}` (Voicebox TTS always stores `wav`).
166
+ - Without a default profile set in Voicebox Settings, `profile=` is required.
167
+
168
+ **Notes on `voicebox_transcribe`:**
169
+ - Accepts exactly one of `audio_base64` or `audio_path` (loopback only). Optional `language`, `model`.
170
+
171
+ ### Resource scope
172
+ | Scope | Resource target |
173
+ |-------|-----------------|
174
+ | `LOCAL_FS` | Input audio, generated audio, transcripts, manifests |
175
+ | `PROCESS` | Local Voicebox app (managed by the user), FFmpeg/ffprobe processing |
176
+ | `NETWORK` | Loopback HTTP to Voicebox `127.0.0.1:17493`, or the user's configured VoiceStudio backend (default `127.0.0.1:3900`) |
177
+ | `MEMORY` | Cached MCP tool names, resolved profile metadata |
178
+ | `CREDENTIALS` | None for Voicebox. A protected VoiceStudio backend uses the user's `OMNIVOICE_API_KEY`; never print it. |
179
+
180
+ ### Preconditions
181
+ - Processing: local `ffmpeg` and `ffprobe` can read the source asset.
182
+ - Generation/transcription: Voicebox app is running and the MCP handshake succeeds.
183
+ - TTS only: at least one voice profile exists.
184
+ - TTS only: the selected engine model is loaded or the user approves a download.
185
+ - Output directory is inside `$PWD` unless explicitly allowed.
186
+
187
+ ### Effects and side effects
188
+ - Creates audio files, transcripts, and manifests under `.agents/results/voice/`.
189
+ - Existing-audio processing runs local media subprocesses and preserves the input file.
190
+ - Triggers local Voicebox generation, which consumes CPU or GPU.
191
+ - May trigger an engine model download when the user approves.
192
+ - Does not call any cloud service. VoiceStudio cloud features and remote backends run only when the user chooses them.
193
+
194
+ ### Guardrails
195
+
196
+ 1. **Voicebox modes**: generation/transcription requires the MCP handshake or `GET /health`. On failure, exit with a one-shot install or launch hint; do not retry or auto-relaunch. Local processing does not require Voicebox.
197
+ 2. **Profile required for TTS only**: resolve a profile and check the TTS engine only for notification or asset mode. Transcription proceeds with a valid audio input and optional STT model even when no profile exists.
198
+ 3. **Tool-name discovery**: on the first Voicebox invocation, call MCP `tools/list` and cache the resolved names. Reuse the cache for subsequent calls in the same session.
199
+ 4. **Length limits**: TTS calls cap at 5000 chars per call; warn at 2000. STT inputs cap at 30 minutes. v1 does not auto-chunk or auto-split.
200
+ 5. **Auto-invocation transparency**: notifications fire automatically only when the active task exceeds `auto_notify_after_sec` (default 60s). This threshold is agent-enforced guidance — no hook measures task duration — so apply it by judgment when a long task completes or blocks. Always announce intent in one short line before generating audio.
201
+ 6. **Path safety**: an explicitly requested output path authorizes writing there. Resolve ambiguity or unrelated-data replacement before the dependent write; preserve required CLI path flags.
202
+ 7. **Cancellation**: SIGINT aborts the MCP call and writes no partial output.
203
+ 8. **Manifest required for persisted output**: asset TTS and transcription modes write `manifest.json` with at minimum: `skill`, `mode`, `voicebox_generation_id`, `text` (or `transcript_preview`), `profile`, `engine`, `language`, `format` (TTS only), `created_at`. Processing records the source, operations, and measured output properties as specified in `resources/audio-processing.md`; it never invents Voicebox provenance. Notification mode is exempt because Voicebox Captures is its system of record and no disk output is written by default.
204
+ 9. **Out of scope**: the Voicebox cloning UI, captures archive, stories editor, microphone dictation loop, and cloud vendors are intentionally not exposed. VoiceStudio cloning and voice design run only on an explicit request with the voice owner's permission (`resources/voicestudio.md`).
205
+ 10. **No cost guard**: Voicebox is free. The cost guardrail from `oma-image` does not apply.
206
+
207
+ ### Clarification protocol
208
+
209
+ Before invoking a TTS or STT call, the agent checks the following. If any required signal is missing, clarify with the user first.
210
+
211
+ **TTS (asset mode) required:**
212
+ - [ ] Text content provided?
213
+ - [ ] Voice profile id or tone description provided?
214
+
215
+ **TTS strongly recommended:**
216
+ - [ ] Language explicit or detectable from the text?
217
+ - [ ] Output format (wav default; mp3 requires a local ffmpeg transcode)?
218
+
219
+ **STT required:**
220
+ - [ ] Audio path provided and the file exists?
221
+ - [ ] Duration within 30 minutes, or user approves splitting?
222
+
223
+ **Notification mode skips clarification.** It uses `notification_profile` from config and language is auto-detected from the message.
224
+
225
+ ### Invocation
226
+
227
+ #### Standalone
228
+ ```text
229
+ /oma-voice "build succeeded, 4 minor warnings"
230
+ /oma-voice transcribe ~/Downloads/standup.m4a
231
+ /oma-voice --profile prof_warm_korean "다음 단계 진행 준비됐어요"
232
+ ```
233
+
234
+ #### Shared infrastructure (other skills)
235
+
236
+ Other skills can request audio output by calling the same MCP tools directly, or by invoking `/oma-voice` with their text. There is no separate CLI; the skill is MCP-native.
237
+
238
+ ## References
239
+
240
+ - Voice engine matrix: `resources/voice-matrix.md` (TTS profile/engine selection)
241
+ - Prompt writing rules: `resources/prompt-tips.md` (TTS text)
242
+ - Execution protocol: `resources/execution-protocol.md` (Voicebox generation/transcription)
243
+ - VoiceStudio backend: `resources/voicestudio.md` (backend resolution, upstream skill routing, consent)
244
+ - Existing audio and timed narration: `resources/audio-processing.md` (processing, duration fitting, or requested loudness conversion)
245
+ - Pre-flight checklist: `resources/checklist.md` (Voicebox calls)
246
+ - Configuration: read the `voice:` section of `.agents/oma-config.yaml` first, then fall back to `config/voice-config.yaml` for any key it does not set. `voice.backend` (`auto` | `voicebox` | `voicestudio`, default `auto`) lives only in oma-config. Both profiles ship as `null` and must be set per machine — write them to `.agents/oma-config.yaml`, since `oma update` overwrites the skill config.
247
+ - Context loading: `../_shared/core/context-loading.md`
248
+ - Quality principles: `../_shared/core/quality-principles.md`
249
+ - Design reference: `../../../docs/plans/designs/012-oma-voice.md` (source repo only; absent in global-mode installs)
@@ -0,0 +1,30 @@
1
+ # oma-voice configuration
2
+ # Design reference: docs/plans/designs/012-oma-voice.md
3
+ #
4
+ # NOT the place to put your settings: `oma update` overwrites this file. Put
5
+ # overrides under `voice:` in .agents/oma-config.yaml, which is preserved —
6
+ # that section wins, and this file supplies only the shipped defaults the skill
7
+ # falls back to. Migration 022 moves anything you changed here for you.
8
+ #
9
+
10
+ # Speech backend: set `voice.backend` in oma-config (auto | voicebox |
11
+ # voicestudio). It is not a key in this file; the shipped default is auto.
12
+
13
+ # Profile names returned by `voicebox_list_profiles`. Set after creating a
14
+ # profile in the Voicebox app (Profiles tab → + New Profile). When null, the
15
+ # skill asks the user which profile to use, or disables auto-notification.
16
+ notification_profile: null
17
+ asset_profile: null
18
+
19
+ # Where TTS asset audio and STT transcripts are written.
20
+ output_dir: .agents/results/voice
21
+
22
+ # Trigger automatic voice notifications when the active task exceeds this many
23
+ # seconds. Set to null to disable auto-notification.
24
+ # NOTE: agent-enforced guidance — no hook measures task duration, so the agent
25
+ # applies this threshold by judgment when a long task completes or blocks.
26
+ auto_notify_after_sec: 60
27
+
28
+ # Hard limits. Above these the skill asks the user to split or truncate.
29
+ max_tts_chars: 5000
30
+ max_stt_minutes: 30
@@ -0,0 +1,119 @@
1
+ # Existing Audio and Timed Speech
2
+
3
+ Load for conversion, speech duration fitting, loudness processing, or dubbing
4
+ audio. These are local FFmpeg operations, not new `oma` CLI subcommands.
5
+ Video cuts and placement belong to `oma-video`.
6
+
7
+ ## Source and targets
8
+
9
+ Keep the source and raw TTS generation. Write separate working/output files
10
+ under the requested destination or `.agents/results/voice/<run>/`. Use
11
+ `ffmpeg -n` to avoid replacing an unrelated output.
12
+
13
+ Inspect the audio stream before selecting operations:
14
+
15
+ ```bash
16
+ ffprobe -v error -select_streams a:0 \
17
+ -show_entries stream=codec_name,sample_rate,channels,start_time,duration:format=duration \
18
+ -of json "$INPUT"
19
+ ```
20
+
21
+ Use the brief's time window, channel layout, sample rate, and delivery profile.
22
+ If no conversion is requested, preserve those properties. Keep source stream
23
+ offsets when handing audio to a video timeline. A container duration can include
24
+ other streams or padding; use decoded audio duration for speech fitting.
25
+
26
+ ## Generating speech for a window
27
+
28
+ Resolve an available language-capable Voicebox profile before synthesizing.
29
+ Run host-local Voicebox calls on the host, even when the media work is in a
30
+ container; transfer the fetched WAV into that workspace. A failed container
31
+ loopback probe is not evidence that the host service is unavailable. Do not
32
+ launch the app, expose its port, download a model, or substitute a provider
33
+ outside existing authorization.
34
+
35
+ Measure the raw utterance, including its audible beginning and ending. Prefer
36
+ generation pacing appropriate to the window before stretching the waveform.
37
+ Changing the transcript, repeating words, or truncating speech is not duration
38
+ control unless the user requested those edits.
39
+
40
+ For a modest pitch-preserving adjustment, set `TEMPO` to raw speech duration
41
+ divided by target speech duration. Use the duration of the actual input WAV:
42
+ if leading/trailing silence has been removed, point `INPUT` at that trimmed
43
+ working copy before calculating the ratio. Do not use an unpadded duration
44
+ with a file that still contains padding.
45
+
46
+ ```bash
47
+ ffmpeg -hide_banner -n -i "$INPUT" -map 0:a:0 \
48
+ -af "atempo=${TEMPO},asetpts=PTS-STARTPTS" \
49
+ -c:a pcm_f32le "$FITTED_WAV"
50
+ ```
51
+
52
+ For ratios outside one filter's useful range, compose supported `atempo`
53
+ factors rather than replacing sample-rate metadata. Large changes can still
54
+ damage pronunciation and rhythm: change generation pacing or retain the
55
+ unresolved timing constraint instead of forcing a fit. Only trim identified
56
+ leading/trailing silence; pad unused time with silence after speech ends.
57
+ Keep a segment's unpadded speech duration distinct from its timeline slot.
58
+
59
+ When choosing pacing or processing parameters, compare the raw and processed
60
+ speech through an available audio inspection tool, focusing on pronunciation,
61
+ rhythm, and clipped beginnings/endings. Engine names, pitch variation, ASR
62
+ agreement, and loudness measurements do not establish naturalness. If speech
63
+ quality cannot be assessed, state that limit. Preserve the raw asset so a
64
+ different setting can be tried without repeated lossy encodes.
65
+
66
+ ## Loudness and format
67
+
68
+ Apply only a requested or stated delivery profile. Set `TARGET_I`,
69
+ `TARGET_LRA`, `TARGET_TP`, `SAMPLE_RATE`, and `CHANNELS` from that profile.
70
+ Measure the actual fitted/edited input, not a different raw generation:
71
+
72
+ ```bash
73
+ ffmpeg -hide_banner -nostats -i "$INPUT" -map 0:a:0 \
74
+ -af "loudnorm=I=${TARGET_I}:LRA=${TARGET_LRA}:TP=${TARGET_TP}:print_format=json" \
75
+ -f null - 2> "$LOUDNESS_LOG"
76
+ ```
77
+
78
+ Use the final JSON block's `input_i`, `input_lra`, `input_tp`, `input_thresh`,
79
+ and `target_offset` as the corresponding `MEASURED_*` and `OFFSET` values:
80
+
81
+ ```bash
82
+ ffmpeg -hide_banner -n -i "$INPUT" -map 0:a:0 \
83
+ -af "loudnorm=I=${TARGET_I}:LRA=${TARGET_LRA}:TP=${TARGET_TP}:measured_I=${MEASURED_I}:measured_LRA=${MEASURED_LRA}:measured_TP=${MEASURED_TP}:measured_thresh=${MEASURED_THRESH}:offset=${OFFSET}:linear=true:print_format=json" \
84
+ -ar "$SAMPLE_RATE" -ac "$CHANNELS" -c:a pcm_s24le "$OUTPUT_WAV" \
85
+ 2> "$NORMALIZATION_LOG"
86
+ ```
87
+
88
+ Do not pass non-finite measurements from a silent asset into the second pass
89
+ or amplify silence into a replacement voice. FFmpeg can fall back to dynamic
90
+ normalization when linear-mode conditions are not met; record the actual
91
+ mode and measured result. Set the output sample rate explicitly because the
92
+ normalizer can change it. Encode the requested delivery format once from
93
+ the PCM working asset; do not repeatedly transcode a lossy result.
94
+
95
+ ## Handoff and recovery
96
+
97
+ Pass the processed audio and its intended position to `oma-video` for muxing.
98
+ A shorter audio file must not shorten the original video automatically.
99
+ For basic conversion, no TTS profile, transcript, or model is needed.
100
+
101
+ Persist `manifest.json` with `skill: "oma-voice"`, `mode: "process"`,
102
+ `source_path`, `output_path`, `operations` and their parameters,
103
+ `duration_sec`, `sample_rate_hz`, `channels`, and `created_at`. Include
104
+ Voicebox generation/profile/engine identifiers only when they are real.
105
+ Record requested constraints that could not be met without changing speech.
106
+
107
+ | Failure mechanism | Recovery |
108
+ |---|---|
109
+ | Timing correction changes pitch | Use pitch-preserving tempo processing; do not relabel the sample rate |
110
+ | Speech sounds distorted after fitting | Return to the raw utterance and adjust pacing or the allowed window |
111
+ | Silence gives infinite loudness measurements | Stop normalization of that input; locate the missing or silent source |
112
+ | An asset plays but its duration differs from its report | Read duration and stream properties from the actual output file |
113
+ | Voicebox is unreachable but an input WAV exists | Process the WAV locally; resolve synthesis availability only if new speech is needed |
114
+
115
+ ## Command reference
116
+
117
+ - [FFmpeg atempo](https://ffmpeg.org/ffmpeg-filters.html#atempo)
118
+ - [FFmpeg loudnorm](https://ffmpeg.org/ffmpeg-filters.html#loudnorm)
119
+ - [FFprobe options](https://ffmpeg.org/ffprobe.html)
@@ -0,0 +1,47 @@
1
+ # Pre-flight Checklist
2
+
3
+ This checklist applies to Voicebox TTS/STT calls. On the VoiceStudio backend, replace the Environment and profile checks with `voicestudio.md` and record `backend: voicestudio` instead of `voicebox_generation_id`. Existing-file processing uses `audio-processing.md` and does not run Voicebox health, profile, or model checks.
4
+
5
+ ## Environment
6
+
7
+ - [ ] Voicebox desktop app is running.
8
+ - [ ] `GET http://127.0.0.1:17493/health` returned 200 within 5 seconds.
9
+ - [ ] Voicebox MCP server is registered with the host CLI.
10
+
11
+ ## Profiles and models (TTS only)
12
+
13
+ - [ ] At least one voice profile exists (cached from `voicebox_list_profiles`).
14
+ - [ ] Target profile id is resolved for notify or asset TTS (explicit > config default > user choice).
15
+ - [ ] Engine model for the resolved profile is loaded, or the user approved a download.
16
+
17
+ Transcription skips profile lookup and the TTS engine check.
18
+
19
+ ## Inputs
20
+
21
+ - [ ] Mode (notify, asset, transcribe) is identified.
22
+ - [ ] TTS text length is within the mode limit (notify <= 240, asset <= 5000).
23
+ - [ ] STT audio path exists and is one of the supported formats.
24
+ - [ ] STT audio duration is within 30 minutes, or the handling of a longer recording is explicitly resolved; v1 does not auto-split.
25
+ - [ ] Language is set to auto or to a single explicit BCP-47 code.
26
+
27
+ ## Output
28
+
29
+ - [ ] Output directory is inside `$PWD`, or the user explicitly confirmed an external path.
30
+
31
+ ## Safety
32
+
33
+ - [ ] Auto-invocation announcement was emitted (one short pre-line) if the call is automatic.
34
+ - [ ] The user has not asked to suppress notifications in the current session.
35
+ - [ ] No partial output from a prior cancellation is being overwritten.
36
+
37
+ ## Manifest
38
+
39
+ - [ ] Persisted output has `skill`, `mode`, `voicebox_generation_id`, `language`, and `created_at`. For TTS, resolve `profile` and `engine`; for STT, use `profile: null` and the actual STT engine/model when returned, otherwise `engine: null`. Notification mode needs no disk manifest.
40
+ - [ ] Mode-specific field is set: `text` for TTS, `transcript_preview` for STT.
41
+ - [ ] `format` is set for TTS manifests.
42
+
43
+ ## Post-call
44
+
45
+ - [ ] Output file exists and is non-empty.
46
+ - [ ] Duration in the manifest matches the audio (or the transcript word count looks plausible).
47
+ - [ ] User-facing report includes mode, path, duration, and any warning.