@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.
- package/dist/{audio-preflight-CBDFctZN.js → audio-preflight-BfmZbg4Y.js} +4 -4
- package/dist/{audio-preflight-gsZSpG-6.js → audio-preflight-DcuC-liM.js} +4 -4
- package/dist/build-info.json +3 -3
- package/dist/bundled/boot-md/handler.js +8 -8
- package/dist/bundled/session-memory/handler.js +7 -7
- package/dist/canvas-host/a2ui/.bundle.hash +1 -1
- package/dist/{chrome-nPMY1XTJ.js → chrome-Bo7cbvFK.js} +5 -5
- package/dist/{chrome-BjVab8gM.js → chrome-DYp18Q0t.js} +5 -5
- package/dist/{deliver-D-QFqm31.js → deliver-ChSIbiMM.js} +1 -1
- package/dist/{deliver-B4-bcot9.js → deliver-DEgRQM4J.js} +1 -1
- package/dist/extensionAPI.js +7 -7
- package/dist/{image-CDwtQjmt.js → image-Bx-hvoNJ.js} +1 -1
- package/dist/{image-CcS-vzTA.js → image-CQl_mjWk.js} +1 -1
- package/dist/llm-slug-generator.js +7 -7
- package/dist/{manager-BnEdHzmO.js → manager-D_pn0urG.js} +1 -1
- package/dist/{manager-09r0qPze.js → manager-YQxK2t0C.js} +1 -1
- package/dist/{pi-embedded-CWsY69-4.js → pi-embedded-CLw_ZzEZ.js} +16 -16
- package/dist/{pi-embedded-helpers-BBMy-lqr.js → pi-embedded-helpers-B5I53aw6.js} +4 -4
- package/dist/{pi-embedded-helpers-ChEYbgVj.js → pi-embedded-helpers-sUAEIC9X.js} +4 -4
- package/dist/plugin-sdk/{accounts-BfyWsC_i.js → accounts-CWFytwbR.js} +3 -3
- package/dist/plugin-sdk/{active-listener-DcJW7xAT.js → active-listener-BkZ4jHrL.js} +2 -2
- package/dist/plugin-sdk/{agent-scope-ChbGV6of.js → agent-scope-C9gfY_Gk.js} +2 -2
- package/dist/plugin-sdk/{audio-preflight-D3GtNLqW.js → audio-preflight-HKbdzXLZ.js} +21 -21
- package/dist/plugin-sdk/{bindings-CN2Qmefj.js → bindings-BaKIqPPy.js} +2 -2
- package/dist/plugin-sdk/{channel-web-DTyqujjA.js → channel-web-D5nWiTH1.js} +18 -18
- package/dist/plugin-sdk/{chrome-BKzAKr3K.js → chrome-klTSnz-9.js} +3 -3
- package/dist/plugin-sdk/{chunk-DhDkBujV.js → chunk-BbrYSny_.js} +1 -1
- package/dist/plugin-sdk/{command-format-CVrYFyZS.js → command-format-BN6tyZt6.js} +1 -1
- package/dist/plugin-sdk/{commands-registry-17yfZkHZ.js → commands-registry-CTzKKtY6.js} +4 -4
- package/dist/plugin-sdk/{config-7wk65zKC.js → config-Crv2qEdJ.js} +9 -9
- package/dist/plugin-sdk/{consolidate-exbAW0ml.js → consolidate-DT1QH65Q.js} +2 -2
- package/dist/plugin-sdk/{deliver-TxAcw7J5.js → deliver-7rOvAlrc.js} +12 -12
- package/dist/plugin-sdk/{diagnostic-Debx4frd.js → diagnostic-0nsxhWp7.js} +1 -1
- package/dist/plugin-sdk/{fs-safe-wBYbAkJF.js → fs-safe-DfWYBeWF.js} +1 -1
- package/dist/plugin-sdk/{gemini-auth-7U2pm2Ky.js → gemini-auth-C0N0_u49.js} +1 -1
- package/dist/plugin-sdk/{image-BtDVmYA5.js → image-WOSl2apK.js} +4 -4
- package/dist/plugin-sdk/index.js +43 -43
- package/dist/plugin-sdk/{ir-CKMvRrGW.js → ir-9J84MTls.js} +4 -4
- package/dist/plugin-sdk/{local-roots-c_gaPs01.js → local-roots-OLRDbvyY.js} +3 -3
- package/dist/plugin-sdk/{login-DUym1Jy0.js → login-C7x4q0i2.js} +7 -7
- package/dist/plugin-sdk/{login-qr-B-WBdvrX.js → login-qr-Dv5_MoAW.js} +9 -9
- package/dist/plugin-sdk/{manager-B71SCzos.js → manager-C83tK17x.js} +8 -8
- package/dist/plugin-sdk/{manifest-registry-Dnic6Chh.js → manifest-registry-CJMV-PI7.js} +1 -1
- package/dist/plugin-sdk/{markdown-tables-Dur7OTlM.js → markdown-tables-DXNKz5y_.js} +1 -1
- package/dist/plugin-sdk/{message-channel-BrAhJJV_.js → message-channel-aGy1HbQQ.js} +1 -1
- package/dist/plugin-sdk/{model-selection-B9qaVQSJ.js → model-selection-C-3-tpe7.js} +4 -4
- package/dist/plugin-sdk/{outbound-DB1wDM8b.js → outbound-DquCeSy5.js} +6 -6
- package/dist/plugin-sdk/{pi-auth-json-ZO118hoy.js → pi-auth-json-D9PDCXGn.js} +1 -1
- package/dist/plugin-sdk/{pi-embedded-helpers-s_U0Un7j.js → pi-embedded-helpers-D3ygfH7l.js} +16 -16
- package/dist/plugin-sdk/{plugins-DF81oSaI.js → plugins-DOwnSg9D.js} +4 -4
- package/dist/plugin-sdk/{pw-ai-CTwP02uv.js → pw-ai-rlengLjb.js} +8 -8
- package/dist/plugin-sdk/{qmd-manager-CBaSGant.js → qmd-manager-BzxFjRFa.js} +4 -4
- package/dist/plugin-sdk/{registry-CZVURNhF.js → registry-5iFfixlB.js} +2 -2
- package/dist/plugin-sdk/{replies-hwRbkU3z.js → replies-BXOzO_H5.js} +7 -7
- package/dist/plugin-sdk/{reply-prefix-CaXmzZlx.js → reply-prefix-INAKTqCU.js} +1 -1
- package/dist/plugin-sdk/{resolve-outbound-target-fxVSOBmk.js → resolve-outbound-target-DvbxHtqp.js} +2 -2
- package/dist/plugin-sdk/{resolve-route-ClCyiOeu.js → resolve-route-URXlY3AK.js} +3 -3
- package/dist/plugin-sdk/{runner-Cq5jvwQ7.js → runner-Bv0_DWoH.js} +9 -9
- package/dist/plugin-sdk/{session-B_TkB65Y.js → session-C3r8l7ou.js} +4 -4
- package/dist/plugin-sdk/{skill-commands-0LF9HTGr.js → skill-commands-KjLUGIdZ.js} +5 -5
- package/dist/plugin-sdk/{skills-BIT_O7J0.js → skills-BrsD4L5c.js} +7 -7
- package/dist/plugin-sdk/{sqlite-Bx5Y5U5X.js → sqlite-CjW7ME1H.js} +1 -1
- package/dist/plugin-sdk/{subsystem-CXqYeDy-.js → subsystem-DcOg1xJr.js} +1 -1
- package/dist/plugin-sdk/{synthesis-DtsYAj1E.js → synthesis-CY7YAasV.js} +38 -38
- package/dist/plugin-sdk/{target-errors-B8mokOeH.js → target-errors-BVWJGWFq.js} +2 -2
- package/dist/plugin-sdk/{thinking-Ca0DhqzO.js → thinking-CtsTDPOi.js} +3 -3
- package/dist/plugin-sdk/{tokens-CvlONEqh.js → tokens-8lqOTZCB.js} +1 -1
- package/dist/plugin-sdk/{tool-images-DpBaWEHT.js → tool-images-Cl_rGIUZ.js} +2 -2
- package/dist/plugin-sdk/{tool-loop-detection-BOvUFa0f.js → tool-loop-detection-Da4WUT_P.js} +2 -2
- package/dist/plugin-sdk/{unified-runner-CnM7lyNd.js → unified-runner-nwMnsZyj.js} +60 -60
- package/dist/plugin-sdk/web-BlweOZDp.js +54 -0
- package/dist/plugin-sdk/{whatsapp-actions-CvnfsFJm.js → whatsapp-actions-DpfaGYs7.js} +21 -21
- package/dist/{pw-ai-BW8_KeDf.js → pw-ai-BqxJG-Wh.js} +1 -1
- package/dist/{pw-ai-j9IE1K0-.js → pw-ai-C-NSGye0.js} +1 -1
- package/dist/{runner-8ALr2UII.js → runner-COGFTeDw.js} +1 -1
- package/dist/{runner-C4-9kFdR.js → runner-DhCi2lT1.js} +1 -1
- package/dist/{synthesis-Cph3LhA1.js → synthesis-CXZu24Vx.js} +7 -7
- package/dist/{synthesis-Cus0A2dL.js → synthesis-DrPxcMlQ.js} +7 -7
- package/dist/{unified-runner-CX80YMTk.js → unified-runner-iByUazvW.js} +16 -16
- package/dist/{web-ChozvJ7I.js → web-EsMQBIYf.js} +7 -7
- package/dist/{web-DFlsbXmQ.js → web-PPg5y6xI.js} +7 -7
- package/package.json +1 -1
- package/dist/plugin-sdk/web-CIPJBHAU.js +0 -54
- package/extensions/copilot-proxy/README.md +0 -24
- package/extensions/copilot-proxy/index.ts +0 -154
- package/extensions/copilot-proxy/node_modules/.bin/symi +0 -21
- package/extensions/copilot-proxy/package.json +0 -15
- package/extensions/copilot-proxy/symi.plugin.json +0 -9
- package/extensions/device-pair/index.ts +0 -642
- package/extensions/device-pair/symi.plugin.json +0 -20
- package/extensions/diagnostics-otel/index.ts +0 -15
- package/extensions/diagnostics-otel/node_modules/.bin/acorn +0 -21
- package/extensions/diagnostics-otel/node_modules/.bin/symi +0 -21
- package/extensions/diagnostics-otel/package.json +0 -27
- package/extensions/diagnostics-otel/src/service.test.ts +0 -290
- package/extensions/diagnostics-otel/src/service.ts +0 -666
- package/extensions/diagnostics-otel/symi.plugin.json +0 -8
- package/extensions/google-antigravity-auth/README.md +0 -24
- package/extensions/google-antigravity-auth/index.ts +0 -424
- package/extensions/google-antigravity-auth/node_modules/.bin/symi +0 -21
- package/extensions/google-antigravity-auth/package.json +0 -15
- package/extensions/google-antigravity-auth/symi.plugin.json +0 -9
- package/extensions/google-gemini-cli-auth/README.md +0 -35
- package/extensions/google-gemini-cli-auth/index.ts +0 -75
- package/extensions/google-gemini-cli-auth/node_modules/.bin/symi +0 -21
- package/extensions/google-gemini-cli-auth/oauth.test.ts +0 -162
- package/extensions/google-gemini-cli-auth/oauth.ts +0 -636
- package/extensions/google-gemini-cli-auth/package.json +0 -15
- package/extensions/google-gemini-cli-auth/symi.plugin.json +0 -9
- package/extensions/learning-loop/index.ts +0 -159
- package/extensions/learning-loop/node_modules/.bin/symi +0 -21
- package/extensions/learning-loop/package.json +0 -18
- package/extensions/learning-loop/src/analytics/gateway-methods.ts +0 -230
- package/extensions/learning-loop/src/analytics/metrics-aggregator.ts +0 -153
- package/extensions/learning-loop/src/capture/run-tracker.ts +0 -181
- package/extensions/learning-loop/src/capture/serializer.ts +0 -74
- package/extensions/learning-loop/src/db.ts +0 -583
- package/extensions/learning-loop/src/feedback/explicit-feedback.ts +0 -58
- package/extensions/learning-loop/src/feedback/implicit-signals.ts +0 -89
- package/extensions/learning-loop/src/graph/edge-inference.ts +0 -189
- package/extensions/learning-loop/src/graph/graph-retrieval.ts +0 -144
- package/extensions/learning-loop/src/graph/graph-store.ts +0 -183
- package/extensions/learning-loop/src/hooks.ts +0 -244
- package/extensions/learning-loop/src/injection/cache.ts +0 -73
- package/extensions/learning-loop/src/injection/context-injector.ts +0 -104
- package/extensions/learning-loop/src/injection/prompt-builder.ts +0 -43
- package/extensions/learning-loop/src/learning/embedding-bridge.ts +0 -54
- package/extensions/learning-loop/src/learning/learning-extractor.ts +0 -217
- package/extensions/learning-loop/src/learning/learning-store.ts +0 -158
- package/extensions/learning-loop/src/learning/retrieval.ts +0 -87
- package/extensions/learning-loop/src/math/confidence-intervals.ts +0 -62
- package/extensions/learning-loop/src/math/ewma.ts +0 -51
- package/extensions/learning-loop/src/math/weighted-scorer.ts +0 -42
- package/extensions/learning-loop/src/schema.ts +0 -176
- package/extensions/learning-loop/src/scoring/normalization.ts +0 -32
- package/extensions/learning-loop/src/scoring/quality-engine.ts +0 -78
- package/extensions/learning-loop/src/scoring/signal-extractors.ts +0 -155
- package/extensions/learning-loop/src/test/context-injector.test.ts +0 -142
- package/extensions/learning-loop/src/test/fixes.test.ts +0 -1286
- package/extensions/learning-loop/src/test/graph.test.ts +0 -711
- package/extensions/learning-loop/src/test/integration.test.ts +0 -312
- package/extensions/learning-loop/src/test/learning-store.test.ts +0 -191
- package/extensions/learning-loop/src/test/math.test.ts +0 -148
- package/extensions/learning-loop/src/test/quality-engine.test.ts +0 -231
- package/extensions/learning-loop/src/test/run-tracker.test.ts +0 -143
- package/extensions/learning-loop/src/types.ts +0 -281
- package/extensions/learning-loop/symi.plugin.json +0 -46
- package/extensions/llm-task/README.md +0 -97
- package/extensions/llm-task/index.ts +0 -6
- package/extensions/llm-task/package.json +0 -12
- package/extensions/llm-task/src/llm-task-tool.test.ts +0 -138
- package/extensions/llm-task/src/llm-task-tool.ts +0 -249
- package/extensions/llm-task/symi.plugin.json +0 -21
- package/extensions/memory-lancedb/config.ts +0 -161
- package/extensions/memory-lancedb/index.test.ts +0 -330
- package/extensions/memory-lancedb/index.ts +0 -670
- package/extensions/memory-lancedb/node_modules/.bin/arrow2csv +0 -21
- package/extensions/memory-lancedb/node_modules/.bin/openai +0 -21
- package/extensions/memory-lancedb/node_modules/.bin/symi +0 -21
- package/extensions/memory-lancedb/package.json +0 -20
- package/extensions/memory-lancedb/symi.plugin.json +0 -71
- package/extensions/minimax-portal-auth/README.md +0 -33
- package/extensions/minimax-portal-auth/index.ts +0 -161
- package/extensions/minimax-portal-auth/node_modules/.bin/symi +0 -21
- package/extensions/minimax-portal-auth/oauth.ts +0 -247
- package/extensions/minimax-portal-auth/package.json +0 -15
- package/extensions/minimax-portal-auth/symi.plugin.json +0 -9
- package/extensions/model-equalizer/index.ts +0 -80
- package/extensions/model-equalizer/skills/model-equalizer/SKILL.md +0 -58
- package/extensions/model-equalizer/src/detection.ts +0 -62
- package/extensions/model-equalizer/src/enhancer.ts +0 -63
- package/extensions/model-equalizer/src/test/detection.test.ts +0 -218
- package/extensions/model-equalizer/src/test/enhancer.test.ts +0 -137
- package/extensions/model-equalizer/src/test/integration.test.ts +0 -185
- package/extensions/model-equalizer/src/types.ts +0 -24
- package/extensions/model-equalizer/symi.plugin.json +0 -12
- package/extensions/phone-control/index.ts +0 -421
- package/extensions/phone-control/symi.plugin.json +0 -10
- package/extensions/pipeline/README.md +0 -75
- package/extensions/pipeline/SKILL.md +0 -97
- package/extensions/pipeline/index.ts +0 -18
- package/extensions/pipeline/package.json +0 -11
- package/extensions/pipeline/src/pipeline-tool.test.ts +0 -345
- package/extensions/pipeline/src/pipeline-tool.ts +0 -266
- package/extensions/pipeline/src/windows-spawn.test.ts +0 -148
- package/extensions/pipeline/src/windows-spawn.ts +0 -193
- package/extensions/pipeline/symi.plugin.json +0 -10
- package/extensions/qwen-portal-auth/README.md +0 -24
- package/extensions/qwen-portal-auth/index.ts +0 -134
- package/extensions/qwen-portal-auth/oauth.ts +0 -190
- package/extensions/qwen-portal-auth/symi.plugin.json +0 -9
- package/extensions/talk-voice/index.ts +0 -150
- package/extensions/talk-voice/symi.plugin.json +0 -10
- package/extensions/thread-ownership/index.test.ts +0 -180
- package/extensions/thread-ownership/index.ts +0 -133
- package/extensions/thread-ownership/symi.plugin.json +0 -28
- package/skills/1password/SKILL.md +0 -71
- package/skills/1password/references/cli-examples.md +0 -29
- package/skills/1password/references/get-started.md +0 -17
- package/skills/apple-notes/SKILL.md +0 -78
- package/skills/apple-reminders/SKILL.md +0 -119
- package/skills/bear-notes/SKILL.md +0 -108
- package/skills/blogwatcher/SKILL.md +0 -70
- package/skills/blucli/SKILL.md +0 -48
- package/skills/bluebubbles/SKILL.md +0 -132
- package/skills/camsnap/SKILL.md +0 -46
- package/skills/canvas/SKILL.md +0 -204
- package/skills/connect-email/SKILL.md +0 -142
- package/skills/document-generation/SKILL.md +0 -83
- package/skills/eightctl/SKILL.md +0 -51
- package/skills/food-order/SKILL.md +0 -49
- package/skills/gemini/SKILL.md +0 -44
- package/skills/gh-issues/SKILL.md +0 -865
- package/skills/gifgrep/SKILL.md +0 -80
- package/skills/github/SKILL.md +0 -164
- package/skills/gog/SKILL.md +0 -117
- package/skills/goplaces/SKILL.md +0 -53
- package/skills/healthcheck/SKILL.md +0 -246
- package/skills/himalaya/SKILL.md +0 -258
- package/skills/himalaya/references/configuration.md +0 -184
- package/skills/himalaya/references/message-composition.md +0 -199
- package/skills/imsg/SKILL.md +0 -122
- package/skills/long-task/SKILL.md +0 -58
- package/skills/long-task/scripts/detach-task.sh +0 -187
- package/skills/nano-banana-pro/SKILL.md +0 -59
- package/skills/nano-banana-pro/scripts/generate_image.py +0 -184
- package/skills/nano-pdf/SKILL.md +0 -39
- package/skills/notion/SKILL.md +0 -173
- package/skills/obsidian/SKILL.md +0 -82
- package/skills/openai-image-gen/SKILL.md +0 -90
- package/skills/openai-image-gen/scripts/gen.py +0 -240
- package/skills/openai-whisper/SKILL.md +0 -39
- package/skills/openai-whisper-api/SKILL.md +0 -53
- package/skills/openai-whisper-api/scripts/transcribe.sh +0 -85
- package/skills/openhue/SKILL.md +0 -113
- package/skills/oracle/SKILL.md +0 -126
- package/skills/ordercli/SKILL.md +0 -79
- package/skills/peekaboo/SKILL.md +0 -191
- package/skills/reactions-extensive/SKILL.md +0 -30
- package/skills/reactions-minimal/SKILL.md +0 -31
- package/skills/safe-edit/SKILL.md +0 -51
- package/skills/sag/SKILL.md +0 -88
- package/skills/sherpa-onnx-tts/SKILL.md +0 -104
- package/skills/sherpa-onnx-tts/bin/sherpa-onnx-tts +0 -178
- package/skills/songsee/SKILL.md +0 -50
- package/skills/sonoscli/SKILL.md +0 -66
- package/skills/spotify-player/SKILL.md +0 -65
- package/skills/symihub/SKILL.md +0 -78
- package/skills/things-mac/SKILL.md +0 -87
- package/skills/tmux/SKILL.md +0 -153
- package/skills/tmux/scripts/find-sessions.sh +0 -112
- package/skills/tmux/scripts/wait-for-text.sh +0 -83
- package/skills/trello/SKILL.md +0 -96
- package/skills/video-frames/SKILL.md +0 -47
- package/skills/video-frames/scripts/frame.sh +0 -81
- package/skills/voice-call/SKILL.md +0 -46
- package/skills/wacli/SKILL.md +0 -73
- package/skills/weather/SKILL.md +0 -113
- 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.
|
package/skills/sag/SKILL.md
DELETED
|
@@ -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);
|
package/skills/songsee/SKILL.md
DELETED
|
@@ -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.
|
package/skills/sonoscli/SKILL.md
DELETED
|
@@ -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.
|
package/skills/symihub/SKILL.md
DELETED
|
@@ -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
|