@symerian/symi 3.0.17 → 3.0.19

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 (259) hide show
  1. package/dist/{audio-preflight-CBDFctZN.js → audio-preflight-BfmZbg4Y.js} +4 -4
  2. package/dist/{audio-preflight-gsZSpG-6.js → audio-preflight-DcuC-liM.js} +4 -4
  3. package/dist/build-info.json +3 -3
  4. package/dist/bundled/boot-md/handler.js +8 -8
  5. package/dist/bundled/session-memory/handler.js +7 -7
  6. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  7. package/dist/{chrome-nPMY1XTJ.js → chrome-Bo7cbvFK.js} +5 -5
  8. package/dist/{chrome-BjVab8gM.js → chrome-DYp18Q0t.js} +5 -5
  9. package/dist/{deliver-D-QFqm31.js → deliver-ChSIbiMM.js} +1 -1
  10. package/dist/{deliver-B4-bcot9.js → deliver-DEgRQM4J.js} +1 -1
  11. package/dist/extensionAPI.js +7 -7
  12. package/dist/{image-CDwtQjmt.js → image-Bx-hvoNJ.js} +1 -1
  13. package/dist/{image-CcS-vzTA.js → image-CQl_mjWk.js} +1 -1
  14. package/dist/llm-slug-generator.js +7 -7
  15. package/dist/{manager-BnEdHzmO.js → manager-D_pn0urG.js} +1 -1
  16. package/dist/{manager-09r0qPze.js → manager-YQxK2t0C.js} +1 -1
  17. package/dist/{pi-embedded-CWsY69-4.js → pi-embedded-CLw_ZzEZ.js} +16 -16
  18. package/dist/{pi-embedded-helpers-BBMy-lqr.js → pi-embedded-helpers-B5I53aw6.js} +4 -4
  19. package/dist/{pi-embedded-helpers-ChEYbgVj.js → pi-embedded-helpers-sUAEIC9X.js} +4 -4
  20. package/dist/plugin-sdk/{accounts-BfyWsC_i.js → accounts-CWFytwbR.js} +3 -3
  21. package/dist/plugin-sdk/{active-listener-DcJW7xAT.js → active-listener-BkZ4jHrL.js} +2 -2
  22. package/dist/plugin-sdk/{agent-scope-ChbGV6of.js → agent-scope-C9gfY_Gk.js} +2 -2
  23. package/dist/plugin-sdk/{audio-preflight-D3GtNLqW.js → audio-preflight-HKbdzXLZ.js} +21 -21
  24. package/dist/plugin-sdk/{bindings-CN2Qmefj.js → bindings-BaKIqPPy.js} +2 -2
  25. package/dist/plugin-sdk/{channel-web-DTyqujjA.js → channel-web-D5nWiTH1.js} +18 -18
  26. package/dist/plugin-sdk/{chrome-BKzAKr3K.js → chrome-klTSnz-9.js} +3 -3
  27. package/dist/plugin-sdk/{chunk-DhDkBujV.js → chunk-BbrYSny_.js} +1 -1
  28. package/dist/plugin-sdk/{command-format-CVrYFyZS.js → command-format-BN6tyZt6.js} +1 -1
  29. package/dist/plugin-sdk/{commands-registry-17yfZkHZ.js → commands-registry-CTzKKtY6.js} +4 -4
  30. package/dist/plugin-sdk/{config-7wk65zKC.js → config-Crv2qEdJ.js} +9 -9
  31. package/dist/plugin-sdk/{consolidate-exbAW0ml.js → consolidate-DT1QH65Q.js} +2 -2
  32. package/dist/plugin-sdk/{deliver-TxAcw7J5.js → deliver-7rOvAlrc.js} +12 -12
  33. package/dist/plugin-sdk/{diagnostic-Debx4frd.js → diagnostic-0nsxhWp7.js} +1 -1
  34. package/dist/plugin-sdk/{fs-safe-wBYbAkJF.js → fs-safe-DfWYBeWF.js} +1 -1
  35. package/dist/plugin-sdk/{gemini-auth-7U2pm2Ky.js → gemini-auth-C0N0_u49.js} +1 -1
  36. package/dist/plugin-sdk/{image-BtDVmYA5.js → image-WOSl2apK.js} +4 -4
  37. package/dist/plugin-sdk/index.js +43 -43
  38. package/dist/plugin-sdk/{ir-CKMvRrGW.js → ir-9J84MTls.js} +4 -4
  39. package/dist/plugin-sdk/{local-roots-c_gaPs01.js → local-roots-OLRDbvyY.js} +3 -3
  40. package/dist/plugin-sdk/{login-DUym1Jy0.js → login-C7x4q0i2.js} +7 -7
  41. package/dist/plugin-sdk/{login-qr-B-WBdvrX.js → login-qr-Dv5_MoAW.js} +9 -9
  42. package/dist/plugin-sdk/{manager-B71SCzos.js → manager-C83tK17x.js} +8 -8
  43. package/dist/plugin-sdk/{manifest-registry-Dnic6Chh.js → manifest-registry-CJMV-PI7.js} +1 -1
  44. package/dist/plugin-sdk/{markdown-tables-Dur7OTlM.js → markdown-tables-DXNKz5y_.js} +1 -1
  45. package/dist/plugin-sdk/{message-channel-BrAhJJV_.js → message-channel-aGy1HbQQ.js} +1 -1
  46. package/dist/plugin-sdk/{model-selection-B9qaVQSJ.js → model-selection-C-3-tpe7.js} +4 -4
  47. package/dist/plugin-sdk/{outbound-DB1wDM8b.js → outbound-DquCeSy5.js} +6 -6
  48. package/dist/plugin-sdk/{pi-auth-json-ZO118hoy.js → pi-auth-json-D9PDCXGn.js} +1 -1
  49. package/dist/plugin-sdk/{pi-embedded-helpers-s_U0Un7j.js → pi-embedded-helpers-D3ygfH7l.js} +16 -16
  50. package/dist/plugin-sdk/{plugins-DF81oSaI.js → plugins-DOwnSg9D.js} +4 -4
  51. package/dist/plugin-sdk/{pw-ai-CTwP02uv.js → pw-ai-rlengLjb.js} +8 -8
  52. package/dist/plugin-sdk/{qmd-manager-CBaSGant.js → qmd-manager-BzxFjRFa.js} +4 -4
  53. package/dist/plugin-sdk/{registry-CZVURNhF.js → registry-5iFfixlB.js} +2 -2
  54. package/dist/plugin-sdk/{replies-hwRbkU3z.js → replies-BXOzO_H5.js} +7 -7
  55. package/dist/plugin-sdk/{reply-prefix-CaXmzZlx.js → reply-prefix-INAKTqCU.js} +1 -1
  56. package/dist/plugin-sdk/{resolve-outbound-target-fxVSOBmk.js → resolve-outbound-target-DvbxHtqp.js} +2 -2
  57. package/dist/plugin-sdk/{resolve-route-ClCyiOeu.js → resolve-route-URXlY3AK.js} +3 -3
  58. package/dist/plugin-sdk/{runner-Cq5jvwQ7.js → runner-Bv0_DWoH.js} +9 -9
  59. package/dist/plugin-sdk/{session-B_TkB65Y.js → session-C3r8l7ou.js} +4 -4
  60. package/dist/plugin-sdk/{skill-commands-0LF9HTGr.js → skill-commands-KjLUGIdZ.js} +5 -5
  61. package/dist/plugin-sdk/{skills-BIT_O7J0.js → skills-BrsD4L5c.js} +7 -7
  62. package/dist/plugin-sdk/{sqlite-Bx5Y5U5X.js → sqlite-CjW7ME1H.js} +1 -1
  63. package/dist/plugin-sdk/{subsystem-CXqYeDy-.js → subsystem-DcOg1xJr.js} +1 -1
  64. package/dist/plugin-sdk/{synthesis-DtsYAj1E.js → synthesis-CY7YAasV.js} +38 -38
  65. package/dist/plugin-sdk/{target-errors-B8mokOeH.js → target-errors-BVWJGWFq.js} +2 -2
  66. package/dist/plugin-sdk/{thinking-Ca0DhqzO.js → thinking-CtsTDPOi.js} +3 -3
  67. package/dist/plugin-sdk/{tokens-CvlONEqh.js → tokens-8lqOTZCB.js} +1 -1
  68. package/dist/plugin-sdk/{tool-images-DpBaWEHT.js → tool-images-Cl_rGIUZ.js} +2 -2
  69. package/dist/plugin-sdk/{tool-loop-detection-BOvUFa0f.js → tool-loop-detection-Da4WUT_P.js} +2 -2
  70. package/dist/plugin-sdk/{unified-runner-CnM7lyNd.js → unified-runner-nwMnsZyj.js} +60 -60
  71. package/dist/plugin-sdk/web-BlweOZDp.js +54 -0
  72. package/dist/plugin-sdk/{whatsapp-actions-CvnfsFJm.js → whatsapp-actions-DpfaGYs7.js} +21 -21
  73. package/dist/{pw-ai-BW8_KeDf.js → pw-ai-BqxJG-Wh.js} +1 -1
  74. package/dist/{pw-ai-j9IE1K0-.js → pw-ai-C-NSGye0.js} +1 -1
  75. package/dist/{runner-8ALr2UII.js → runner-COGFTeDw.js} +1 -1
  76. package/dist/{runner-C4-9kFdR.js → runner-DhCi2lT1.js} +1 -1
  77. package/dist/{synthesis-Cph3LhA1.js → synthesis-CXZu24Vx.js} +7 -7
  78. package/dist/{synthesis-Cus0A2dL.js → synthesis-DrPxcMlQ.js} +7 -7
  79. package/dist/{unified-runner-CX80YMTk.js → unified-runner-iByUazvW.js} +16 -16
  80. package/dist/{web-ChozvJ7I.js → web-EsMQBIYf.js} +7 -7
  81. package/dist/{web-DFlsbXmQ.js → web-PPg5y6xI.js} +7 -7
  82. package/package.json +1 -1
  83. package/dist/plugin-sdk/web-CIPJBHAU.js +0 -54
  84. package/extensions/copilot-proxy/README.md +0 -24
  85. package/extensions/copilot-proxy/index.ts +0 -154
  86. package/extensions/copilot-proxy/node_modules/.bin/symi +0 -21
  87. package/extensions/copilot-proxy/package.json +0 -15
  88. package/extensions/copilot-proxy/symi.plugin.json +0 -9
  89. package/extensions/device-pair/index.ts +0 -642
  90. package/extensions/device-pair/symi.plugin.json +0 -20
  91. package/extensions/diagnostics-otel/index.ts +0 -15
  92. package/extensions/diagnostics-otel/node_modules/.bin/acorn +0 -21
  93. package/extensions/diagnostics-otel/node_modules/.bin/symi +0 -21
  94. package/extensions/diagnostics-otel/package.json +0 -27
  95. package/extensions/diagnostics-otel/src/service.test.ts +0 -290
  96. package/extensions/diagnostics-otel/src/service.ts +0 -666
  97. package/extensions/diagnostics-otel/symi.plugin.json +0 -8
  98. package/extensions/google-antigravity-auth/README.md +0 -24
  99. package/extensions/google-antigravity-auth/index.ts +0 -424
  100. package/extensions/google-antigravity-auth/node_modules/.bin/symi +0 -21
  101. package/extensions/google-antigravity-auth/package.json +0 -15
  102. package/extensions/google-antigravity-auth/symi.plugin.json +0 -9
  103. package/extensions/google-gemini-cli-auth/README.md +0 -35
  104. package/extensions/google-gemini-cli-auth/index.ts +0 -75
  105. package/extensions/google-gemini-cli-auth/node_modules/.bin/symi +0 -21
  106. package/extensions/google-gemini-cli-auth/oauth.test.ts +0 -162
  107. package/extensions/google-gemini-cli-auth/oauth.ts +0 -636
  108. package/extensions/google-gemini-cli-auth/package.json +0 -15
  109. package/extensions/google-gemini-cli-auth/symi.plugin.json +0 -9
  110. package/extensions/learning-loop/index.ts +0 -159
  111. package/extensions/learning-loop/node_modules/.bin/symi +0 -21
  112. package/extensions/learning-loop/package.json +0 -18
  113. package/extensions/learning-loop/src/analytics/gateway-methods.ts +0 -230
  114. package/extensions/learning-loop/src/analytics/metrics-aggregator.ts +0 -153
  115. package/extensions/learning-loop/src/capture/run-tracker.ts +0 -181
  116. package/extensions/learning-loop/src/capture/serializer.ts +0 -74
  117. package/extensions/learning-loop/src/db.ts +0 -583
  118. package/extensions/learning-loop/src/feedback/explicit-feedback.ts +0 -58
  119. package/extensions/learning-loop/src/feedback/implicit-signals.ts +0 -89
  120. package/extensions/learning-loop/src/graph/edge-inference.ts +0 -189
  121. package/extensions/learning-loop/src/graph/graph-retrieval.ts +0 -144
  122. package/extensions/learning-loop/src/graph/graph-store.ts +0 -183
  123. package/extensions/learning-loop/src/hooks.ts +0 -244
  124. package/extensions/learning-loop/src/injection/cache.ts +0 -73
  125. package/extensions/learning-loop/src/injection/context-injector.ts +0 -104
  126. package/extensions/learning-loop/src/injection/prompt-builder.ts +0 -43
  127. package/extensions/learning-loop/src/learning/embedding-bridge.ts +0 -54
  128. package/extensions/learning-loop/src/learning/learning-extractor.ts +0 -217
  129. package/extensions/learning-loop/src/learning/learning-store.ts +0 -158
  130. package/extensions/learning-loop/src/learning/retrieval.ts +0 -87
  131. package/extensions/learning-loop/src/math/confidence-intervals.ts +0 -62
  132. package/extensions/learning-loop/src/math/ewma.ts +0 -51
  133. package/extensions/learning-loop/src/math/weighted-scorer.ts +0 -42
  134. package/extensions/learning-loop/src/schema.ts +0 -176
  135. package/extensions/learning-loop/src/scoring/normalization.ts +0 -32
  136. package/extensions/learning-loop/src/scoring/quality-engine.ts +0 -78
  137. package/extensions/learning-loop/src/scoring/signal-extractors.ts +0 -155
  138. package/extensions/learning-loop/src/test/context-injector.test.ts +0 -142
  139. package/extensions/learning-loop/src/test/fixes.test.ts +0 -1286
  140. package/extensions/learning-loop/src/test/graph.test.ts +0 -711
  141. package/extensions/learning-loop/src/test/integration.test.ts +0 -312
  142. package/extensions/learning-loop/src/test/learning-store.test.ts +0 -191
  143. package/extensions/learning-loop/src/test/math.test.ts +0 -148
  144. package/extensions/learning-loop/src/test/quality-engine.test.ts +0 -231
  145. package/extensions/learning-loop/src/test/run-tracker.test.ts +0 -143
  146. package/extensions/learning-loop/src/types.ts +0 -281
  147. package/extensions/learning-loop/symi.plugin.json +0 -46
  148. package/extensions/llm-task/README.md +0 -97
  149. package/extensions/llm-task/index.ts +0 -6
  150. package/extensions/llm-task/package.json +0 -12
  151. package/extensions/llm-task/src/llm-task-tool.test.ts +0 -138
  152. package/extensions/llm-task/src/llm-task-tool.ts +0 -249
  153. package/extensions/llm-task/symi.plugin.json +0 -21
  154. package/extensions/memory-lancedb/config.ts +0 -161
  155. package/extensions/memory-lancedb/index.test.ts +0 -330
  156. package/extensions/memory-lancedb/index.ts +0 -670
  157. package/extensions/memory-lancedb/node_modules/.bin/arrow2csv +0 -21
  158. package/extensions/memory-lancedb/node_modules/.bin/openai +0 -21
  159. package/extensions/memory-lancedb/node_modules/.bin/symi +0 -21
  160. package/extensions/memory-lancedb/package.json +0 -20
  161. package/extensions/memory-lancedb/symi.plugin.json +0 -71
  162. package/extensions/minimax-portal-auth/README.md +0 -33
  163. package/extensions/minimax-portal-auth/index.ts +0 -161
  164. package/extensions/minimax-portal-auth/node_modules/.bin/symi +0 -21
  165. package/extensions/minimax-portal-auth/oauth.ts +0 -247
  166. package/extensions/minimax-portal-auth/package.json +0 -15
  167. package/extensions/minimax-portal-auth/symi.plugin.json +0 -9
  168. package/extensions/model-equalizer/index.ts +0 -80
  169. package/extensions/model-equalizer/skills/model-equalizer/SKILL.md +0 -58
  170. package/extensions/model-equalizer/src/detection.ts +0 -62
  171. package/extensions/model-equalizer/src/enhancer.ts +0 -63
  172. package/extensions/model-equalizer/src/test/detection.test.ts +0 -218
  173. package/extensions/model-equalizer/src/test/enhancer.test.ts +0 -137
  174. package/extensions/model-equalizer/src/test/integration.test.ts +0 -185
  175. package/extensions/model-equalizer/src/types.ts +0 -24
  176. package/extensions/model-equalizer/symi.plugin.json +0 -12
  177. package/extensions/phone-control/index.ts +0 -421
  178. package/extensions/phone-control/symi.plugin.json +0 -10
  179. package/extensions/pipeline/README.md +0 -75
  180. package/extensions/pipeline/SKILL.md +0 -97
  181. package/extensions/pipeline/index.ts +0 -18
  182. package/extensions/pipeline/package.json +0 -11
  183. package/extensions/pipeline/src/pipeline-tool.test.ts +0 -345
  184. package/extensions/pipeline/src/pipeline-tool.ts +0 -266
  185. package/extensions/pipeline/src/windows-spawn.test.ts +0 -148
  186. package/extensions/pipeline/src/windows-spawn.ts +0 -193
  187. package/extensions/pipeline/symi.plugin.json +0 -10
  188. package/extensions/qwen-portal-auth/README.md +0 -24
  189. package/extensions/qwen-portal-auth/index.ts +0 -134
  190. package/extensions/qwen-portal-auth/oauth.ts +0 -190
  191. package/extensions/qwen-portal-auth/symi.plugin.json +0 -9
  192. package/extensions/talk-voice/index.ts +0 -150
  193. package/extensions/talk-voice/symi.plugin.json +0 -10
  194. package/extensions/thread-ownership/index.test.ts +0 -180
  195. package/extensions/thread-ownership/index.ts +0 -133
  196. package/extensions/thread-ownership/symi.plugin.json +0 -28
  197. package/skills/1password/SKILL.md +0 -71
  198. package/skills/1password/references/cli-examples.md +0 -29
  199. package/skills/1password/references/get-started.md +0 -17
  200. package/skills/apple-notes/SKILL.md +0 -78
  201. package/skills/apple-reminders/SKILL.md +0 -119
  202. package/skills/bear-notes/SKILL.md +0 -108
  203. package/skills/blogwatcher/SKILL.md +0 -70
  204. package/skills/blucli/SKILL.md +0 -48
  205. package/skills/bluebubbles/SKILL.md +0 -132
  206. package/skills/camsnap/SKILL.md +0 -46
  207. package/skills/canvas/SKILL.md +0 -204
  208. package/skills/connect-email/SKILL.md +0 -142
  209. package/skills/document-generation/SKILL.md +0 -83
  210. package/skills/eightctl/SKILL.md +0 -51
  211. package/skills/food-order/SKILL.md +0 -49
  212. package/skills/gemini/SKILL.md +0 -44
  213. package/skills/gh-issues/SKILL.md +0 -865
  214. package/skills/gifgrep/SKILL.md +0 -80
  215. package/skills/github/SKILL.md +0 -164
  216. package/skills/gog/SKILL.md +0 -117
  217. package/skills/goplaces/SKILL.md +0 -53
  218. package/skills/healthcheck/SKILL.md +0 -246
  219. package/skills/himalaya/SKILL.md +0 -258
  220. package/skills/himalaya/references/configuration.md +0 -184
  221. package/skills/himalaya/references/message-composition.md +0 -199
  222. package/skills/imsg/SKILL.md +0 -122
  223. package/skills/long-task/SKILL.md +0 -58
  224. package/skills/long-task/scripts/detach-task.sh +0 -187
  225. package/skills/nano-banana-pro/SKILL.md +0 -59
  226. package/skills/nano-banana-pro/scripts/generate_image.py +0 -184
  227. package/skills/nano-pdf/SKILL.md +0 -39
  228. package/skills/notion/SKILL.md +0 -173
  229. package/skills/obsidian/SKILL.md +0 -82
  230. package/skills/openai-image-gen/SKILL.md +0 -90
  231. package/skills/openai-image-gen/scripts/gen.py +0 -240
  232. package/skills/openai-whisper/SKILL.md +0 -39
  233. package/skills/openai-whisper-api/SKILL.md +0 -53
  234. package/skills/openai-whisper-api/scripts/transcribe.sh +0 -85
  235. package/skills/openhue/SKILL.md +0 -113
  236. package/skills/oracle/SKILL.md +0 -126
  237. package/skills/ordercli/SKILL.md +0 -79
  238. package/skills/peekaboo/SKILL.md +0 -191
  239. package/skills/reactions-extensive/SKILL.md +0 -30
  240. package/skills/reactions-minimal/SKILL.md +0 -31
  241. package/skills/safe-edit/SKILL.md +0 -51
  242. package/skills/sag/SKILL.md +0 -88
  243. package/skills/sherpa-onnx-tts/SKILL.md +0 -104
  244. package/skills/sherpa-onnx-tts/bin/sherpa-onnx-tts +0 -178
  245. package/skills/songsee/SKILL.md +0 -50
  246. package/skills/sonoscli/SKILL.md +0 -66
  247. package/skills/spotify-player/SKILL.md +0 -65
  248. package/skills/symihub/SKILL.md +0 -78
  249. package/skills/things-mac/SKILL.md +0 -87
  250. package/skills/tmux/SKILL.md +0 -153
  251. package/skills/tmux/scripts/find-sessions.sh +0 -112
  252. package/skills/tmux/scripts/wait-for-text.sh +0 -83
  253. package/skills/trello/SKILL.md +0 -96
  254. package/skills/video-frames/SKILL.md +0 -47
  255. package/skills/video-frames/scripts/frame.sh +0 -81
  256. package/skills/voice-call/SKILL.md +0 -46
  257. package/skills/wacli/SKILL.md +0 -73
  258. package/skills/weather/SKILL.md +0 -113
  259. package/skills/xurl/SKILL.md +0 -462
@@ -1,51 +0,0 @@
1
- ---
2
- name: safe-edit
3
- description: Best practices for the edit tool plus recovery patterns when oldText doesn't match. Read before editing, use shortest unique snippets, prefer distinctive lines, never skip past a failed match. Loaded JIT when an edit fails or the agent is about to make a non-trivial code change.
4
- triggers: [edit, oldtext, recovery, match, failed, wrong, snippet, hallucinated]
5
- ---
6
-
7
- # Safe Edit — best practices and recovery patterns
8
-
9
- The `edit` tool replaces an exact `oldText` snippet with `newText`. When `oldText` doesn't match, the call fails. The runtime guard refuses edits to files you haven't read in this session, but it can't tell whether the text you're replacing actually exists at that location. This skill is the discipline that prevents wasted turns.
10
-
11
- ## Before any edit
12
-
13
- 1. **Read the file first.** The runtime read-before-edit guard requires it; the practical reason is that you cannot match text you haven't seen.
14
- 2. **Locate the exact text** in the read output. Copy-paste it directly — do not retype, do not "remember" it.
15
- 3. **Choose the shortest unique snippet** that identifies the location. 1-3 lines is usually right. Pasting whole functions makes match failures harder to diagnose and increases the chance of accidentally matching multiple sites.
16
- 4. **Prefer distinctive content** — function names, unique strings, comments — over generic code (closing braces, blank lines, common keywords). Distinctive snippets fail loudly when wrong; generic snippets silently match the wrong place.
17
-
18
- ## When an edit fails
19
-
20
- If `edit` returns an error like "Could not find the exact text", do NOT:
21
-
22
- - Skip to a different file or task.
23
- - Paraphrase the oldText and retry.
24
- - Try with whitespace tweaks ("maybe it's tabs not spaces").
25
-
26
- Instead:
27
-
28
- 1. **Re-read the file** with `read`. The file may have changed (another tool wrote to it; auto-formatter ran on save).
29
- 2. **Copy the exact text from the fresh read output** into your retry. Whitespace, indentation, line endings — match precisely.
30
- 3. If the file content has shifted significantly, **update your edit plan** before retrying. Don't bash on the same wrong text.
31
-
32
- ## When the file content surprises you
33
-
34
- If the read output doesn't look like what you expected:
35
-
36
- - Check the path is right (relative vs absolute, workspace vs sandbox).
37
- - Confirm you're in the right session (workspace dir matches your assumption).
38
- - Look for a recent `write` that may have replaced the file content wholesale.
39
-
40
- ## Multi-edit workflow
41
-
42
- If you need several edits to the same file:
43
-
44
- - Make them one at a time, re-reading between non-adjacent edits.
45
- - For tightly-coupled edits (e.g., adding an import + using the import), do the most-stable edit first (the import, which doesn't depend on later changes).
46
- - After each successful edit, the file's content has changed — older snippets you saved from an earlier read may no longer match.
47
-
48
- ## What this skill is not
49
-
50
- - **Not a refactoring strategy.** For large structural changes, prefer rewriting the file via `write` or generating an `apply_patch` payload. The edit tool is for surgical replacements, not whole-section rewrites.
51
- - **Not a substitute for reading.** Even with this skill loaded, you still must `read` first.
@@ -1,88 +0,0 @@
1
- ---
2
- name: sag
3
- description: ElevenLabs text-to-speech with mac-style say UX.
4
- homepage: https://sag.sh
5
- metadata:
6
- {
7
- "symi":
8
- {
9
- "emoji": "🗣️",
10
- "requires": { "bins": ["sag"], "env": ["ELEVENLABS_API_KEY"] },
11
- "primaryEnv": "ELEVENLABS_API_KEY",
12
- "install":
13
- [
14
- {
15
- "id": "brew",
16
- "kind": "brew",
17
- "formula": "steipete/tap/sag",
18
- "bins": ["sag"],
19
- "label": "Install sag (brew)",
20
- },
21
- ],
22
- },
23
- }
24
- triggers: [sag]
25
- ---
26
-
27
- # sag
28
-
29
- Use `sag` for ElevenLabs TTS with local playback.
30
-
31
- API key (required)
32
-
33
- - `ELEVENLABS_API_KEY` (preferred)
34
- - `SAG_API_KEY` also supported by the CLI
35
-
36
- Quick start
37
-
38
- - `sag "Hello there"`
39
- - `sag speak -v "Roger" "Hello"`
40
- - `sag voices`
41
- - `sag prompting` (model-specific tips)
42
-
43
- Model notes
44
-
45
- - Default: `eleven_v3` (expressive)
46
- - Stable: `eleven_multilingual_v2`
47
- - Fast: `eleven_flash_v2_5`
48
-
49
- Pronunciation + delivery rules
50
-
51
- - First fix: respell (e.g. "key-note"), add hyphens, adjust casing.
52
- - Numbers/units/URLs: `--normalize auto` (or `off` if it harms names).
53
- - Language bias: `--lang en|de|fr|...` to guide normalization.
54
- - v3: SSML `<break>` not supported; use `[pause]`, `[short pause]`, `[long pause]`.
55
- - v2/v2.5: SSML `<break time="1.5s" />` supported; `<phoneme>` not exposed in `sag`.
56
-
57
- v3 audio tags (put at the entrance of a line)
58
-
59
- - `[whispers]`, `[shouts]`, `[sings]`
60
- - `[laughs]`, `[starts laughing]`, `[sighs]`, `[exhales]`
61
- - `[sarcastic]`, `[curious]`, `[excited]`, `[crying]`, `[mischievously]`
62
- - Example: `sag "[whispers] keep this quiet. [short pause] ok?"`
63
-
64
- Voice defaults
65
-
66
- - `ELEVENLABS_VOICE_ID` or `SAG_VOICE_ID`
67
-
68
- Confirm voice + speaker before long output.
69
-
70
- ## Chat voice responses
71
-
72
- When Peter asks for a "voice" reply (e.g., "crazy scientist voice", "explain in voice"), generate audio and send it:
73
-
74
- ```bash
75
- # Generate audio file
76
- sag -v Symi -o /tmp/voice-reply.mp3 "Your message here"
77
-
78
- # Then include in reply:
79
- # MEDIA:/tmp/voice-reply.mp3
80
- ```
81
-
82
- Voice character tips:
83
-
84
- - Crazy scientist: Use `[excited]` tags, dramatic pauses `[short pause]`, vary intensity
85
- - Calm: Use `[whispers]` or slower pacing
86
- - Dramatic: Use `[sings]` or `[shouts]` sparingly
87
-
88
- Default voice for Symi: `lj2rcrvANS3gaWWnczSX` (or just `-v Symi`)
@@ -1,104 +0,0 @@
1
- ---
2
- name: sherpa-onnx-tts
3
- description: Local text-to-speech via sherpa-onnx (offline, no cloud)
4
- metadata:
5
- {
6
- "symi":
7
- {
8
- "emoji": "🗣️",
9
- "os": ["darwin", "linux", "win32"],
10
- "requires": { "env": ["SHERPA_ONNX_RUNTIME_DIR", "SHERPA_ONNX_MODEL_DIR"] },
11
- "install":
12
- [
13
- {
14
- "id": "download-runtime-macos",
15
- "kind": "download",
16
- "os": ["darwin"],
17
- "url": "https://github.com/k2-fsa/sherpa-onnx/releases/download/v1.12.23/sherpa-onnx-v1.12.23-osx-universal2-shared.tar.bz2",
18
- "archive": "tar.bz2",
19
- "extract": true,
20
- "stripComponents": 1,
21
- "targetDir": "runtime",
22
- "label": "Download sherpa-onnx runtime (macOS)",
23
- },
24
- {
25
- "id": "download-runtime-linux-x64",
26
- "kind": "download",
27
- "os": ["linux"],
28
- "url": "https://github.com/k2-fsa/sherpa-onnx/releases/download/v1.12.23/sherpa-onnx-v1.12.23-linux-x64-shared.tar.bz2",
29
- "archive": "tar.bz2",
30
- "extract": true,
31
- "stripComponents": 1,
32
- "targetDir": "runtime",
33
- "label": "Download sherpa-onnx runtime (Linux x64)",
34
- },
35
- {
36
- "id": "download-runtime-win-x64",
37
- "kind": "download",
38
- "os": ["win32"],
39
- "url": "https://github.com/k2-fsa/sherpa-onnx/releases/download/v1.12.23/sherpa-onnx-v1.12.23-win-x64-shared.tar.bz2",
40
- "archive": "tar.bz2",
41
- "extract": true,
42
- "stripComponents": 1,
43
- "targetDir": "runtime",
44
- "label": "Download sherpa-onnx runtime (Windows x64)",
45
- },
46
- {
47
- "id": "download-model-lessac",
48
- "kind": "download",
49
- "url": "https://github.com/k2-fsa/sherpa-onnx/releases/download/tts-models/vits-piper-en_US-lessac-high.tar.bz2",
50
- "archive": "tar.bz2",
51
- "extract": true,
52
- "targetDir": "models",
53
- "label": "Download Piper en_US lessac (high)",
54
- },
55
- ],
56
- },
57
- }
58
- triggers: [sherpa-onnx-tts, sherpa, onnx, tts]
59
- ---
60
-
61
- # sherpa-onnx-tts
62
-
63
- Local TTS using the sherpa-onnx offline CLI.
64
-
65
- ## Install
66
-
67
- 1. Download the runtime for your OS (extracts into `~/.symi/tools/sherpa-onnx-tts/runtime`)
68
- 2. Download a voice model (extracts into `~/.symi/tools/sherpa-onnx-tts/models`)
69
-
70
- Update `~/.symi/symi.json`:
71
-
72
- ```json5
73
- {
74
- skills: {
75
- entries: {
76
- "sherpa-onnx-tts": {
77
- env: {
78
- SHERPA_ONNX_RUNTIME_DIR: "~/.symi/tools/sherpa-onnx-tts/runtime",
79
- SHERPA_ONNX_MODEL_DIR: "~/.symi/tools/sherpa-onnx-tts/models/vits-piper-en_US-lessac-high",
80
- },
81
- },
82
- },
83
- },
84
- }
85
- ```
86
-
87
- The wrapper lives in this skill folder. Run it directly, or add the wrapper to PATH:
88
-
89
- ```bash
90
- export PATH="{baseDir}/bin:$PATH"
91
- ```
92
-
93
- ## Usage
94
-
95
- ```bash
96
- {baseDir}/bin/sherpa-onnx-tts -o ./tts.wav "Hello from local TTS."
97
- ```
98
-
99
- Notes:
100
-
101
- - Pick a different model from the sherpa-onnx `tts-models` release if you want another voice.
102
- - If the model dir has multiple `.onnx` files, set `SHERPA_ONNX_MODEL_FILE` or pass `--model-file`.
103
- - You can also pass `--tokens-file` or `--data-dir` to override the defaults.
104
- - Windows: run `node {baseDir}\\bin\\sherpa-onnx-tts -o tts.wav "Hello from local TTS."`
@@ -1,178 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- const fs = require("node:fs");
4
- const path = require("node:path");
5
- const { spawnSync } = require("node:child_process");
6
-
7
- function usage(message) {
8
- if (message) {
9
- console.error(message);
10
- }
11
- console.error(
12
- "\nUsage: sherpa-onnx-tts [--runtime-dir <dir>] [--model-dir <dir>] [--model-file <file>] [--tokens-file <file>] [--data-dir <dir>] [--output <file>] \"text\"",
13
- );
14
- console.error("\nRequired env (or flags):\n SHERPA_ONNX_RUNTIME_DIR\n SHERPA_ONNX_MODEL_DIR");
15
- process.exit(1);
16
- }
17
-
18
- function resolveRuntimeDir(explicit) {
19
- const value = explicit || process.env.SHERPA_ONNX_RUNTIME_DIR || "";
20
- return value.trim();
21
- }
22
-
23
- function resolveModelDir(explicit) {
24
- const value = explicit || process.env.SHERPA_ONNX_MODEL_DIR || "";
25
- return value.trim();
26
- }
27
-
28
- function resolveModelFile(modelDir, explicitFlag) {
29
- const explicit = (explicitFlag || process.env.SHERPA_ONNX_MODEL_FILE || "").trim();
30
- if (explicit) return explicit;
31
- try {
32
- const candidates = fs
33
- .readdirSync(modelDir)
34
- .filter((entry) => entry.endsWith(".onnx"))
35
- .map((entry) => path.join(modelDir, entry));
36
- if (candidates.length === 1) return candidates[0];
37
- } catch {
38
- return "";
39
- }
40
- return "";
41
- }
42
-
43
- function resolveTokensFile(modelDir, explicitFlag) {
44
- const explicit = (explicitFlag || process.env.SHERPA_ONNX_TOKENS_FILE || "").trim();
45
- if (explicit) return explicit;
46
- const candidate = path.join(modelDir, "tokens.txt");
47
- return fs.existsSync(candidate) ? candidate : "";
48
- }
49
-
50
- function resolveDataDir(modelDir, explicitFlag) {
51
- const explicit = (explicitFlag || process.env.SHERPA_ONNX_DATA_DIR || "").trim();
52
- if (explicit) return explicit;
53
- const candidate = path.join(modelDir, "espeak-ng-data");
54
- return fs.existsSync(candidate) ? candidate : "";
55
- }
56
-
57
- function resolveBinary(runtimeDir) {
58
- const binName = process.platform === "win32" ? "sherpa-onnx-offline-tts.exe" : "sherpa-onnx-offline-tts";
59
- return path.join(runtimeDir, "bin", binName);
60
- }
61
-
62
- function prependEnvPath(current, next) {
63
- if (!next) return current;
64
- if (!current) return next;
65
- return `${next}${path.delimiter}${current}`;
66
- }
67
-
68
- const args = process.argv.slice(2);
69
- let runtimeDir = "";
70
- let modelDir = "";
71
- let modelFile = "";
72
- let tokensFile = "";
73
- let dataDir = "";
74
- let output = "tts.wav";
75
- const textParts = [];
76
-
77
- for (let i = 0; i < args.length; i += 1) {
78
- const arg = args[i];
79
- if (arg === "--runtime-dir") {
80
- runtimeDir = args[i + 1] || "";
81
- i += 1;
82
- continue;
83
- }
84
- if (arg === "--model-dir") {
85
- modelDir = args[i + 1] || "";
86
- i += 1;
87
- continue;
88
- }
89
- if (arg === "--model-file") {
90
- modelFile = args[i + 1] || "";
91
- i += 1;
92
- continue;
93
- }
94
- if (arg === "--tokens-file") {
95
- tokensFile = args[i + 1] || "";
96
- i += 1;
97
- continue;
98
- }
99
- if (arg === "--data-dir") {
100
- dataDir = args[i + 1] || "";
101
- i += 1;
102
- continue;
103
- }
104
- if (arg === "-o" || arg === "--output") {
105
- output = args[i + 1] || output;
106
- i += 1;
107
- continue;
108
- }
109
- if (arg === "--text") {
110
- textParts.push(args[i + 1] || "");
111
- i += 1;
112
- continue;
113
- }
114
- textParts.push(arg);
115
- }
116
-
117
- runtimeDir = resolveRuntimeDir(runtimeDir);
118
- modelDir = resolveModelDir(modelDir);
119
-
120
- if (!runtimeDir || !modelDir) {
121
- usage("Missing runtime/model directory.");
122
- }
123
-
124
- modelFile = resolveModelFile(modelDir, modelFile);
125
- tokensFile = resolveTokensFile(modelDir, tokensFile);
126
- dataDir = resolveDataDir(modelDir, dataDir);
127
-
128
- if (!modelFile || !tokensFile || !dataDir) {
129
- usage(
130
- "Model directory is missing required files. Set SHERPA_ONNX_MODEL_FILE, SHERPA_ONNX_TOKENS_FILE, SHERPA_ONNX_DATA_DIR or pass --model-file/--tokens-file/--data-dir.",
131
- );
132
- }
133
-
134
- const text = textParts.join(" ").trim();
135
- if (!text) {
136
- usage("Missing text.");
137
- }
138
-
139
- const bin = resolveBinary(runtimeDir);
140
- if (!fs.existsSync(bin)) {
141
- usage(`TTS binary not found: ${bin}`);
142
- }
143
-
144
- const env = { ...process.env };
145
- const libDir = path.join(runtimeDir, "lib");
146
- if (process.platform === "darwin") {
147
- env.DYLD_LIBRARY_PATH = prependEnvPath(env.DYLD_LIBRARY_PATH || "", libDir);
148
- } else if (process.platform === "win32") {
149
- env.PATH = prependEnvPath(env.PATH || "", [path.join(runtimeDir, "bin"), libDir].join(path.delimiter));
150
- } else {
151
- env.LD_LIBRARY_PATH = prependEnvPath(env.LD_LIBRARY_PATH || "", libDir);
152
- }
153
-
154
- const outputPath = path.isAbsolute(output) ? output : path.join(process.cwd(), output);
155
- fs.mkdirSync(path.dirname(outputPath), { recursive: true });
156
-
157
- const child = spawnSync(
158
- bin,
159
- [
160
- `--vits-model=${modelFile}`,
161
- `--vits-tokens=${tokensFile}`,
162
- `--vits-data-dir=${dataDir}`,
163
- `--output-filename=${outputPath}`,
164
- text,
165
- ],
166
- {
167
- stdio: "inherit",
168
- env,
169
- },
170
- );
171
-
172
- if (typeof child.status === "number") {
173
- process.exit(child.status);
174
- }
175
- if (child.error) {
176
- console.error(child.error.message || String(child.error));
177
- }
178
- process.exit(1);
@@ -1,50 +0,0 @@
1
- ---
2
- name: songsee
3
- description: Generate spectrograms and feature-panel visualizations from audio with the songsee CLI.
4
- homepage: https://github.com/steipete/songsee
5
- metadata:
6
- {
7
- "symi":
8
- {
9
- "emoji": "🌊",
10
- "requires": { "bins": ["songsee"] },
11
- "install":
12
- [
13
- {
14
- "id": "brew",
15
- "kind": "brew",
16
- "formula": "steipete/tap/songsee",
17
- "bins": ["songsee"],
18
- "label": "Install songsee (brew)",
19
- },
20
- ],
21
- },
22
- }
23
- triggers: [songsee]
24
- ---
25
-
26
- # songsee
27
-
28
- Generate spectrograms + feature panels from audio.
29
-
30
- Quick start
31
-
32
- - Spectrogram: `songsee track.mp3`
33
- - Multi-panel: `songsee track.mp3 --viz spectrogram,mel,chroma,hpss,selfsim,loudness,tempogram,mfcc,flux`
34
- - Time slice: `songsee track.mp3 --start 12.5 --duration 8 -o slice.jpg`
35
- - Stdin: `cat track.mp3 | songsee - --format png -o out.png`
36
-
37
- Common flags
38
-
39
- - `--viz` list (repeatable or comma-separated)
40
- - `--style` palette (classic, magma, inferno, viridis, gray)
41
- - `--width` / `--height` output size
42
- - `--window` / `--hop` FFT settings
43
- - `--min-freq` / `--max-freq` frequency range
44
- - `--start` / `--duration` time slice
45
- - `--format` jpg|png
46
-
47
- Notes
48
-
49
- - WAV/MP3 decode native; other formats use ffmpeg if available.
50
- - Multiple `--viz` renders a grid.
@@ -1,66 +0,0 @@
1
- ---
2
- name: sonoscli
3
- description: Control Sonos speakers (discover/status/play/volume/group).
4
- homepage: https://sonoscli.sh
5
- metadata:
6
- {
7
- "symi":
8
- {
9
- "emoji": "🔊",
10
- "requires": { "bins": ["sonos"] },
11
- "install":
12
- [
13
- {
14
- "id": "go",
15
- "kind": "go",
16
- "module": "github.com/steipete/sonoscli/cmd/sonos@latest",
17
- "bins": ["sonos"],
18
- "label": "Install sonoscli (go)",
19
- },
20
- ],
21
- },
22
- }
23
- triggers: [sonoscli]
24
- ---
25
-
26
- # Sonos CLI
27
-
28
- Use `sonos` to control Sonos speakers on the local network.
29
-
30
- ## Quick start
31
-
32
- - `sonos discover`
33
- - `sonos status --name "Kitchen"`
34
- - `sonos play|pause|stop --name "Kitchen"`
35
- - `sonos volume set 15 --name "Kitchen"`
36
-
37
- ## Common tasks
38
-
39
- - Grouping: `sonos group status|join|unjoin|party|solo`
40
- - Favorites: `sonos favorites list|open`
41
- - Queue: `sonos queue list|play|clear`
42
- - Spotify search (via SMAPI): `sonos smapi search --service "Spotify" --category tracks "query"`
43
-
44
- ## Notes
45
-
46
- - If SSDP fails, specify `--ip <speaker-ip>`.
47
- - Spotify Web API search is optional and requires `SPOTIFY_CLIENT_ID/SECRET`.
48
- - If there is an error, check the troubleshooting section and offer advice if there is a decent match.
49
-
50
- ## Troubleshooting
51
-
52
- ### `sonos discover` - `no route to host`
53
-
54
- - On error `Error: write udp4 0.0.0.0:64326->239.255.255.250:1900: sendto: no route to host (Command exited with code 1)`
55
- - Note that the port number after `0.0.0.0:` is ephemeral and will change and the netmask may not match exactly either
56
- - The `sendto: no route to host` should stay consistent
57
- - Advise the user that in `direct` (no Docker sandbox) mode on Mac OS that Settings -> Privacy & Security -> Local Network will need to be enabled for the top-level host parent process of the Gateway
58
- - `node` if running via `launchd`
59
- - `Terminal` if running the gateway directly in the terminal
60
- - `Visual Studio Code` if running via terminal in VS Code
61
- - An alternative option is to use `sandbox` (docker container) with network access allowed for that sandbox
62
-
63
- ### `sonos discover` - `bind: operation not permitted`
64
-
65
- - On error `Error: listen udp4 0.0.0.0:0: bind: operation not permitted`
66
- - Advise the user that they may be running via a Codex or other sandbox that does not permit network access (this can be replicated by running `sonos discover` within a Codex CLI session with sandbox enabled and not approving the escalation request)
@@ -1,65 +0,0 @@
1
- ---
2
- name: spotify-player
3
- description: Terminal Spotify playback/search via spogo (preferred) or spotify_player.
4
- homepage: https://www.spotify.com
5
- metadata:
6
- {
7
- "symi":
8
- {
9
- "emoji": "🎵",
10
- "requires": { "anyBins": ["spogo", "spotify_player"] },
11
- "install":
12
- [
13
- {
14
- "id": "brew",
15
- "kind": "brew",
16
- "formula": "spogo",
17
- "tap": "steipete/tap",
18
- "bins": ["spogo"],
19
- "label": "Install spogo (brew)",
20
- },
21
- {
22
- "id": "brew",
23
- "kind": "brew",
24
- "formula": "spotify_player",
25
- "bins": ["spotify_player"],
26
- "label": "Install spotify_player (brew)",
27
- },
28
- ],
29
- },
30
- }
31
- triggers: [spotify-player, spotify, player]
32
- ---
33
-
34
- # spogo / spotify_player
35
-
36
- Use `spogo` **(preferred)** for Spotify playback/search. Fall back to `spotify_player` if needed.
37
-
38
- Requirements
39
-
40
- - Spotify Premium account.
41
- - Either `spogo` or `spotify_player` installed.
42
-
43
- spogo setup
44
-
45
- - Import cookies: `spogo auth import --browser chrome`
46
-
47
- Common CLI commands
48
-
49
- - Search: `spogo search track "query"`
50
- - Playback: `spogo play|pause|next|prev`
51
- - Devices: `spogo device list`, `spogo device set "<name|id>"`
52
- - Status: `spogo status`
53
-
54
- spotify_player commands (fallback)
55
-
56
- - Search: `spotify_player search "query"`
57
- - Playback: `spotify_player playback play|pause|next|previous`
58
- - Connect device: `spotify_player connect`
59
- - Like track: `spotify_player like`
60
-
61
- Notes
62
-
63
- - Config folder: `~/.config/spotify-player` (e.g., `app.toml`).
64
- - For Spotify Connect integration, set a user `client_id` in config.
65
- - TUI shortcuts are available via `?` in the app.
@@ -1,78 +0,0 @@
1
- ---
2
- name: symihub
3
- description: Use the SymiHub CLI to search, install, update, and publish agent skills from symihub.com. Use when you need to fetch new skills on the fly, sync installed skills to latest or a specific version, or publish new/updated skill folders with the npm-installed symihub CLI.
4
- metadata:
5
- {
6
- "symi":
7
- {
8
- "requires": { "bins": ["symihub"] },
9
- "install":
10
- [
11
- {
12
- "id": "node",
13
- "kind": "node",
14
- "package": "symihub",
15
- "bins": ["symihub"],
16
- "label": "Install SymiHub CLI (npm)",
17
- },
18
- ],
19
- },
20
- }
21
- triggers: [symihub]
22
- ---
23
-
24
- # SymiHub CLI
25
-
26
- Install
27
-
28
- ```bash
29
- npm i -g symihub
30
- ```
31
-
32
- Auth (publish)
33
-
34
- ```bash
35
- symihub login
36
- symihub whoami
37
- ```
38
-
39
- Search
40
-
41
- ```bash
42
- symihub search "postgres backups"
43
- ```
44
-
45
- Install
46
-
47
- ```bash
48
- symihub install my-skill
49
- symihub install my-skill --version 1.2.3
50
- ```
51
-
52
- Update (hash-based match + upgrade)
53
-
54
- ```bash
55
- symihub update my-skill
56
- symihub update my-skill --version 1.2.3
57
- symihub update --all
58
- symihub update my-skill --force
59
- symihub update --all --no-input --force
60
- ```
61
-
62
- List
63
-
64
- ```bash
65
- symihub list
66
- ```
67
-
68
- Publish
69
-
70
- ```bash
71
- symihub publish ./my-skill --slug my-skill --name "My Skill" --version 1.2.0 --changelog "Fixes + docs"
72
- ```
73
-
74
- Notes
75
-
76
- - Default registry: https://symihub.com (override with SYMIHUB_REGISTRY or --registry)
77
- - Default workdir: cwd (falls back to Symi workspace); install dir: ./skills (override with --workdir / --dir / SYMIHUB_WORKDIR)
78
- - Update command hashes local files, resolves matching version, and upgrades to latest unless --version is set