clodds 1.2.8 → 1.3.0

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 (232) hide show
  1. package/dist/skills/bundled/acp/SKILL.md +188 -0
  2. package/dist/skills/bundled/acp/index.d.ts +0 -3
  3. package/dist/skills/bundled/acp/index.js +1 -1
  4. package/dist/skills/bundled/acp/index.js.map +1 -1
  5. package/dist/skills/bundled/agentbets/SKILL.md +19 -0
  6. package/dist/skills/bundled/ai-strategy/SKILL.md +111 -0
  7. package/dist/skills/bundled/ai-strategy/index.js +1 -1
  8. package/dist/skills/bundled/ai-strategy/index.js.map +1 -1
  9. package/dist/skills/bundled/alerts/SKILL.md +87 -0
  10. package/dist/skills/bundled/analytics/SKILL.md +252 -0
  11. package/dist/skills/bundled/analytics/index.js +2 -2
  12. package/dist/skills/bundled/analytics/index.js.map +1 -1
  13. package/dist/skills/bundled/arbitrage/SKILL.md +287 -0
  14. package/dist/skills/bundled/auto-reply/SKILL.md +285 -0
  15. package/dist/skills/bundled/auto-reply/index.js +2 -2
  16. package/dist/skills/bundled/auto-reply/index.js.map +1 -1
  17. package/dist/skills/bundled/automation/SKILL.md +242 -0
  18. package/dist/skills/bundled/automation/index.js +2 -2
  19. package/dist/skills/bundled/automation/index.js.map +1 -1
  20. package/dist/skills/bundled/backtest/SKILL.md +225 -0
  21. package/dist/skills/bundled/bags/SKILL.md +131 -0
  22. package/dist/skills/bundled/bankr/SKILL.md +114 -0
  23. package/dist/skills/bundled/betfair/SKILL.md +113 -0
  24. package/dist/skills/bundled/binance-futures/SKILL.md +84 -0
  25. package/dist/skills/bundled/binance-futures/index.d.ts +0 -3
  26. package/dist/skills/bundled/binance-futures/index.js +1 -2
  27. package/dist/skills/bundled/binance-futures/index.js.map +1 -1
  28. package/dist/skills/bundled/botchan/SKILL.md +66 -0
  29. package/dist/skills/bundled/botchan/index.d.ts +0 -3
  30. package/dist/skills/bundled/botchan/index.js +0 -1
  31. package/dist/skills/bundled/botchan/index.js.map +1 -1
  32. package/dist/skills/bundled/bridge/SKILL.md +215 -0
  33. package/dist/skills/bundled/bybit-futures/SKILL.md +84 -0
  34. package/dist/skills/bundled/bybit-futures/index.d.ts +0 -3
  35. package/dist/skills/bundled/bybit-futures/index.js +0 -1
  36. package/dist/skills/bundled/bybit-futures/index.js.map +1 -1
  37. package/dist/skills/bundled/clanker/SKILL.md +125 -0
  38. package/dist/skills/bundled/clanker/index.d.ts +0 -3
  39. package/dist/skills/bundled/clanker/index.js +0 -1
  40. package/dist/skills/bundled/clanker/index.js.map +1 -1
  41. package/dist/skills/bundled/copy-trading/SKILL.md +285 -0
  42. package/dist/skills/bundled/copy-trading/index.js +2 -2
  43. package/dist/skills/bundled/copy-trading/index.js.map +1 -1
  44. package/dist/skills/bundled/copy-trading-solana/SKILL.md +66 -0
  45. package/dist/skills/bundled/credentials/SKILL.md +261 -0
  46. package/dist/skills/bundled/crypto-hft/SKILL.md +121 -0
  47. package/dist/skills/bundled/dca/SKILL.md +27 -0
  48. package/dist/skills/bundled/dex/SKILL.md +87 -0
  49. package/dist/skills/bundled/dex/index.d.ts +36 -0
  50. package/dist/skills/bundled/dex/index.js +537 -0
  51. package/dist/skills/bundled/dex/index.js.map +1 -0
  52. package/dist/skills/bundled/divergence/SKILL.md +83 -0
  53. package/dist/skills/bundled/doctor/SKILL.md +267 -0
  54. package/dist/skills/bundled/doctor/index.js +2 -8
  55. package/dist/skills/bundled/doctor/index.js.map +1 -1
  56. package/dist/skills/bundled/drift/SKILL.md +53 -0
  57. package/dist/skills/bundled/drift-sdk/SKILL.md +103 -0
  58. package/dist/skills/bundled/drift-sdk/index.d.ts +0 -3
  59. package/dist/skills/bundled/drift-sdk/index.js +0 -1
  60. package/dist/skills/bundled/drift-sdk/index.js.map +1 -1
  61. package/dist/skills/bundled/edge/SKILL.md +84 -0
  62. package/dist/skills/bundled/embeddings/SKILL.md +244 -0
  63. package/dist/skills/bundled/endaoment/SKILL.md +65 -0
  64. package/dist/skills/bundled/endaoment/index.d.ts +0 -3
  65. package/dist/skills/bundled/endaoment/index.js +0 -1
  66. package/dist/skills/bundled/endaoment/index.js.map +1 -1
  67. package/dist/skills/bundled/ens/SKILL.md +63 -0
  68. package/dist/skills/bundled/ens/index.d.ts +0 -3
  69. package/dist/skills/bundled/ens/index.js +0 -1
  70. package/dist/skills/bundled/ens/index.js.map +1 -1
  71. package/dist/skills/bundled/erc8004/SKILL.md +79 -0
  72. package/dist/skills/bundled/erc8004/index.d.ts +0 -3
  73. package/dist/skills/bundled/erc8004/index.js +0 -1
  74. package/dist/skills/bundled/erc8004/index.js.map +1 -1
  75. package/dist/skills/bundled/execution/SKILL.md +278 -0
  76. package/dist/skills/bundled/farcaster/SKILL.md +80 -0
  77. package/dist/skills/bundled/features/SKILL.md +20 -0
  78. package/dist/skills/bundled/feeds/SKILL.md +288 -0
  79. package/dist/skills/bundled/harden/SKILL.md +74 -0
  80. package/dist/skills/bundled/history/SKILL.md +257 -0
  81. package/dist/skills/bundled/hyperliquid/SKILL.md +200 -0
  82. package/dist/skills/bundled/hyperliquid/index.d.ts +0 -3
  83. package/dist/skills/bundled/hyperliquid/index.js +0 -1
  84. package/dist/skills/bundled/hyperliquid/index.js.map +1 -1
  85. package/dist/skills/bundled/identity/SKILL.md +228 -0
  86. package/dist/skills/bundled/identity/index.js +2 -2
  87. package/dist/skills/bundled/identity/index.js.map +1 -1
  88. package/dist/skills/bundled/integrations/SKILL.md +321 -0
  89. package/dist/skills/bundled/integrations/index.js +2 -2
  90. package/dist/skills/bundled/integrations/index.js.map +1 -1
  91. package/dist/skills/bundled/jupiter/SKILL.md +163 -0
  92. package/dist/skills/bundled/kamino/SKILL.md +69 -0
  93. package/dist/skills/bundled/ledger/SKILL.md +20 -0
  94. package/dist/skills/bundled/lighter/SKILL.md +83 -0
  95. package/dist/skills/bundled/lighter/index.d.ts +0 -3
  96. package/dist/skills/bundled/lighter/index.js +0 -1
  97. package/dist/skills/bundled/lighter/index.js.map +1 -1
  98. package/dist/skills/bundled/marginfi/SKILL.md +62 -0
  99. package/dist/skills/bundled/market-index/SKILL.md +242 -0
  100. package/dist/skills/bundled/market-index/index.js +1 -3
  101. package/dist/skills/bundled/market-index/index.js.map +1 -1
  102. package/dist/skills/bundled/markets/SKILL.md +49 -0
  103. package/dist/skills/bundled/mcp/SKILL.md +235 -0
  104. package/dist/skills/bundled/mcp/index.js +1 -3
  105. package/dist/skills/bundled/mcp/index.js.map +1 -1
  106. package/dist/skills/bundled/memory/SKILL.md +209 -0
  107. package/dist/skills/bundled/metaculus/SKILL.md +62 -0
  108. package/dist/skills/bundled/meteora/SKILL.md +28 -0
  109. package/dist/skills/bundled/meteora-dbc/SKILL.md +25 -0
  110. package/dist/skills/bundled/metrics/SKILL.md +338 -0
  111. package/dist/skills/bundled/mev/SKILL.md +239 -0
  112. package/dist/skills/bundled/mev/index.js +2 -2
  113. package/dist/skills/bundled/mev/index.js.map +1 -1
  114. package/dist/skills/bundled/mexc-futures/SKILL.md +86 -0
  115. package/dist/skills/bundled/mexc-futures/index.d.ts +0 -3
  116. package/dist/skills/bundled/mexc-futures/index.js +0 -1
  117. package/dist/skills/bundled/mexc-futures/index.js.map +1 -1
  118. package/dist/skills/bundled/mm/SKILL.md +142 -0
  119. package/dist/skills/bundled/monitoring/SKILL.md +249 -0
  120. package/dist/skills/bundled/news/SKILL.md +95 -0
  121. package/dist/skills/bundled/onchainkit/SKILL.md +83 -0
  122. package/dist/skills/bundled/opinion/SKILL.md +87 -0
  123. package/dist/skills/bundled/opportunity/SKILL.md +308 -0
  124. package/dist/skills/bundled/orca/SKILL.md +28 -0
  125. package/dist/skills/bundled/pairing/SKILL.md +275 -0
  126. package/dist/skills/bundled/pancakeswap/SKILL.md +93 -0
  127. package/dist/skills/bundled/pancakeswap/index.d.ts +0 -3
  128. package/dist/skills/bundled/pancakeswap/index.js +0 -1
  129. package/dist/skills/bundled/pancakeswap/index.js.map +1 -1
  130. package/dist/skills/bundled/percolator/SKILL.md +22 -0
  131. package/dist/skills/bundled/permissions/SKILL.md +269 -0
  132. package/dist/skills/bundled/permissions/index.js +2 -2
  133. package/dist/skills/bundled/permissions/index.js.map +1 -1
  134. package/dist/skills/bundled/plugins/SKILL.md +263 -0
  135. package/dist/skills/bundled/plugins/index.js +2 -2
  136. package/dist/skills/bundled/plugins/index.js.map +1 -1
  137. package/dist/skills/bundled/portfolio/SKILL.md +161 -0
  138. package/dist/skills/bundled/portfolio/index.js +1 -1
  139. package/dist/skills/bundled/portfolio/index.js.map +1 -1
  140. package/dist/skills/bundled/portfolio-sync/SKILL.md +466 -0
  141. package/dist/skills/bundled/positions/SKILL.md +262 -0
  142. package/dist/skills/bundled/predictfun/SKILL.md +109 -0
  143. package/dist/skills/bundled/predictfun/index.js +1 -1
  144. package/dist/skills/bundled/predictfun/index.js.map +1 -1
  145. package/dist/skills/bundled/predictit/SKILL.md +66 -0
  146. package/dist/skills/bundled/presence/SKILL.md +217 -0
  147. package/dist/skills/bundled/presence/index.js +2 -2
  148. package/dist/skills/bundled/presence/index.js.map +1 -1
  149. package/dist/skills/bundled/processes/SKILL.md +254 -0
  150. package/dist/skills/bundled/pump-swarm/SKILL.md +309 -0
  151. package/dist/skills/bundled/pumpfun/SKILL.md +145 -0
  152. package/dist/skills/bundled/pumpfun/index.d.ts +8 -1
  153. package/dist/skills/bundled/pumpfun/index.js +221 -11
  154. package/dist/skills/bundled/pumpfun/index.js.map +1 -1
  155. package/dist/skills/bundled/qmd/SKILL.md +129 -0
  156. package/dist/skills/bundled/qrcoin/SKILL.md +60 -0
  157. package/dist/skills/bundled/qrcoin/index.d.ts +0 -3
  158. package/dist/skills/bundled/qrcoin/index.js +0 -1
  159. package/dist/skills/bundled/qrcoin/index.js.map +1 -1
  160. package/dist/skills/bundled/raydium/SKILL.md +198 -0
  161. package/dist/skills/bundled/remote/SKILL.md +201 -0
  162. package/dist/skills/bundled/research/SKILL.md +83 -0
  163. package/dist/skills/bundled/research/index.js +2 -2
  164. package/dist/skills/bundled/research/index.js.map +1 -1
  165. package/dist/skills/bundled/risk/SKILL.md +323 -0
  166. package/dist/skills/bundled/router/SKILL.md +233 -0
  167. package/dist/skills/bundled/routing/SKILL.md +258 -0
  168. package/dist/skills/bundled/sandbox/SKILL.md +257 -0
  169. package/dist/skills/bundled/search-config/SKILL.md +257 -0
  170. package/dist/skills/bundled/search-config/index.js +2 -2
  171. package/dist/skills/bundled/search-config/index.js.map +1 -1
  172. package/dist/skills/bundled/sessions/SKILL.md +251 -0
  173. package/dist/skills/bundled/sessions/index.js +1 -1
  174. package/dist/skills/bundled/sessions/index.js.map +1 -1
  175. package/dist/skills/bundled/setup/SKILL.md +53 -0
  176. package/dist/skills/bundled/shield/SKILL.md +21 -0
  177. package/dist/skills/bundled/signals/SKILL.md +106 -0
  178. package/dist/skills/bundled/signals/index.d.ts +0 -3
  179. package/dist/skills/bundled/signals/index.js +3 -4
  180. package/dist/skills/bundled/signals/index.js.map +1 -1
  181. package/dist/skills/bundled/sizing/SKILL.md +238 -0
  182. package/dist/skills/bundled/slippage/SKILL.md +306 -0
  183. package/dist/skills/bundled/smarkets/SKILL.md +107 -0
  184. package/dist/skills/bundled/solend/SKILL.md +63 -0
  185. package/dist/skills/bundled/strategy/SKILL.md +266 -0
  186. package/dist/skills/bundled/streaming/SKILL.md +150 -0
  187. package/dist/skills/bundled/streaming/index.js +2 -2
  188. package/dist/skills/bundled/streaming/index.js.map +1 -1
  189. package/dist/skills/bundled/tailscale/SKILL.md +249 -0
  190. package/dist/skills/bundled/tailscale/index.js +2 -2
  191. package/dist/skills/bundled/tailscale/index.js.map +1 -1
  192. package/dist/skills/bundled/ticks/SKILL.md +61 -0
  193. package/dist/skills/bundled/token-security/SKILL.md +18 -0
  194. package/dist/skills/bundled/trading-evm/SKILL.md +329 -0
  195. package/dist/skills/bundled/trading-futures/SKILL.md +865 -0
  196. package/dist/skills/bundled/trading-kalshi/SKILL.md +629 -0
  197. package/dist/skills/bundled/trading-manifold/SKILL.md +387 -0
  198. package/dist/skills/bundled/trading-polymarket/SKILL.md +1080 -0
  199. package/dist/skills/bundled/trading-solana/SKILL.md +418 -0
  200. package/dist/skills/bundled/trading-system/SKILL.md +290 -0
  201. package/dist/skills/bundled/triggers/SKILL.md +433 -0
  202. package/dist/skills/bundled/tts/SKILL.md +220 -0
  203. package/dist/skills/bundled/tweet-ideas/SKILL.md +77 -0
  204. package/dist/skills/bundled/usage/SKILL.md +239 -0
  205. package/dist/skills/bundled/usage/index.js +2 -2
  206. package/dist/skills/bundled/usage/index.js.map +1 -1
  207. package/dist/skills/bundled/veil/SKILL.md +76 -0
  208. package/dist/skills/bundled/veil/index.d.ts +0 -3
  209. package/dist/skills/bundled/veil/index.js +0 -1
  210. package/dist/skills/bundled/veil/index.js.map +1 -1
  211. package/dist/skills/bundled/verify/SKILL.md +199 -0
  212. package/dist/skills/bundled/verify/index.d.ts +0 -3
  213. package/dist/skills/bundled/verify/index.js +0 -1
  214. package/dist/skills/bundled/verify/index.js.map +1 -1
  215. package/dist/skills/bundled/virtuals/SKILL.md +82 -0
  216. package/dist/skills/bundled/voice/SKILL.md +217 -0
  217. package/dist/skills/bundled/voice/index.js +2 -2
  218. package/dist/skills/bundled/voice/index.js.map +1 -1
  219. package/dist/skills/bundled/weather/SKILL.md +80 -0
  220. package/dist/skills/bundled/webhooks/SKILL.md +297 -0
  221. package/dist/skills/bundled/webhooks/index.js +2 -2
  222. package/dist/skills/bundled/webhooks/index.js.map +1 -1
  223. package/dist/skills/bundled/whale-tracking/SKILL.md +287 -0
  224. package/dist/skills/bundled/whale-tracking/index.js +2 -2
  225. package/dist/skills/bundled/whale-tracking/index.js.map +1 -1
  226. package/dist/skills/bundled/yoink/SKILL.md +54 -0
  227. package/dist/skills/bundled/yoink/index.d.ts +0 -3
  228. package/dist/skills/bundled/yoink/index.js +0 -1
  229. package/dist/skills/bundled/yoink/index.js.map +1 -1
  230. package/dist/skills/executor.js +5 -3
  231. package/dist/skills/executor.js.map +1 -1
  232. package/package.json +2 -2
@@ -0,0 +1,266 @@
1
+ ---
2
+ name: strategy
3
+ description: "Build and manage custom trading strategies with natural language"
4
+ emoji: "🎯"
5
+ ---
6
+
7
+ # Strategy - Complete API Reference
8
+
9
+ Create custom trading strategies using natural language or templates, then deploy to live trading.
10
+
11
+ ---
12
+
13
+ ## Chat Commands
14
+
15
+ ### Create Strategy
16
+
17
+ ```
18
+ /strategy create "Buy when price drops 5% in 1 hour"
19
+ /strategy create momentum --lookback 14 --threshold 2%
20
+ /strategy from-template mean-reversion
21
+ ```
22
+
23
+ ### Manage Strategies
24
+
25
+ ```
26
+ /strategies List all strategies
27
+ /strategy <name> View strategy details
28
+ /strategy edit <name> Modify strategy
29
+ /strategy delete <name> Remove strategy
30
+ ```
31
+
32
+ ### Activate/Deactivate
33
+
34
+ ```
35
+ /strategy activate <name> Start running strategy
36
+ /strategy deactivate <name> Stop strategy
37
+ /strategy pause <name> Pause temporarily
38
+ /strategy resume <name> Resume paused strategy
39
+ ```
40
+
41
+ ### Test & Validate
42
+
43
+ ```
44
+ /strategy test <name> --dry-run Test without real trades
45
+ /strategy backtest <name> Run backtest
46
+ /strategy validate <name> Check for errors
47
+ ```
48
+
49
+ ---
50
+
51
+ ## TypeScript API Reference
52
+
53
+ ### Create Strategy Builder
54
+
55
+ ```typescript
56
+ import { createStrategyBuilder } from 'clodds/strategy';
57
+
58
+ const builder = createStrategyBuilder({
59
+ // Validation
60
+ requireDryRun: true,
61
+ validateParameters: true,
62
+
63
+ // Storage
64
+ storage: 'sqlite',
65
+ dbPath: './strategies.db',
66
+ });
67
+ ```
68
+
69
+ ### Natural Language Strategy
70
+
71
+ ```typescript
72
+ // Create from natural language
73
+ const strategy = await builder.fromNaturalLanguage({
74
+ description: `
75
+ Buy YES on any market when:
76
+ - Price drops more than 5% in the last hour
77
+ - Volume is above average
78
+ - Spread is less than 2%
79
+
80
+ Sell when:
81
+ - Price recovers 3% from entry
82
+ - Or after 24 hours (timeout)
83
+
84
+ Risk: Max 5% of portfolio per trade
85
+ `,
86
+ name: 'dip-buyer',
87
+ });
88
+
89
+ console.log(`Created: ${strategy.name}`);
90
+ console.log(`Conditions: ${strategy.conditions.length}`);
91
+ ```
92
+
93
+ ### Template-Based Strategy
94
+
95
+ ```typescript
96
+ // Momentum strategy
97
+ const momentum = await builder.fromTemplate('momentum', {
98
+ lookbackPeriod: 14,
99
+ entryThreshold: 0.02,
100
+ exitThreshold: 0.01,
101
+ stopLoss: 0.05,
102
+ takeProfit: 0.10,
103
+ maxPositionPct: 10,
104
+ });
105
+
106
+ // Mean reversion strategy
107
+ const meanReversion = await builder.fromTemplate('mean-reversion', {
108
+ lookbackPeriod: 20,
109
+ deviationThreshold: 2, // Standard deviations
110
+ exitOnMean: true,
111
+ stopLoss: 0.08,
112
+ });
113
+
114
+ // Arbitrage strategy
115
+ const arbitrage = await builder.fromTemplate('arbitrage', {
116
+ minSpread: 0.02,
117
+ platforms: ['polymarket', 'kalshi'],
118
+ maxSlippage: 0.01,
119
+ });
120
+
121
+ // Breakout strategy
122
+ const breakout = await builder.fromTemplate('breakout', {
123
+ rangePeriod: '7d',
124
+ breakoutThreshold: 0.05,
125
+ confirmationVolume: 1.5, // 1.5x average volume
126
+ });
127
+ ```
128
+
129
+ ### Custom Strategy Code
130
+
131
+ ```typescript
132
+ // Full custom strategy
133
+ const custom = await builder.create({
134
+ name: 'my-custom-strategy',
135
+ description: 'Buy low-priced markets with high volume',
136
+
137
+ // Entry conditions (all must be true)
138
+ entryConditions: [
139
+ { type: 'price', operator: '<', value: 0.30 },
140
+ { type: 'volume24h', operator: '>', value: 50000 },
141
+ { type: 'spread', operator: '<', value: 0.02 },
142
+ ],
143
+
144
+ // Exit conditions (any triggers exit)
145
+ exitConditions: [
146
+ { type: 'profit', operator: '>=', value: 0.15 },
147
+ { type: 'loss', operator: '>=', value: 0.10 },
148
+ { type: 'holdTime', operator: '>=', value: '48h' },
149
+ ],
150
+
151
+ // Risk management
152
+ risk: {
153
+ maxPositionPct: 5,
154
+ stopLoss: 0.10,
155
+ takeProfit: 0.20,
156
+ maxConcurrentPositions: 5,
157
+ },
158
+
159
+ // Execution
160
+ execution: {
161
+ orderType: 'limit',
162
+ limitBuffer: 0.005,
163
+ retries: 3,
164
+ },
165
+ });
166
+ ```
167
+
168
+ ### Validate Strategy
169
+
170
+ ```typescript
171
+ const validation = await builder.validate(strategy);
172
+
173
+ if (validation.valid) {
174
+ console.log('✅ Strategy is valid');
175
+ } else {
176
+ console.log('❌ Validation errors:');
177
+ for (const error of validation.errors) {
178
+ console.log(` - ${error}`);
179
+ }
180
+ }
181
+
182
+ // Warnings (not blocking)
183
+ for (const warning of validation.warnings) {
184
+ console.log(`⚠️ ${warning}`);
185
+ }
186
+ ```
187
+
188
+ ### Activate Strategy
189
+
190
+ ```typescript
191
+ // Start with dry-run first (required)
192
+ await builder.activate(strategy.name, {
193
+ dryRun: true,
194
+ notifyOnTrade: true,
195
+ });
196
+
197
+ // After validation, go live
198
+ await builder.activate(strategy.name, {
199
+ dryRun: false,
200
+ capital: 5000, // Allocate $5000
201
+ });
202
+ ```
203
+
204
+ ### Monitor Strategy
205
+
206
+ ```typescript
207
+ const status = await builder.getStatus(strategy.name);
208
+
209
+ console.log(`Status: ${status.status}`); // 'active' | 'paused' | 'stopped'
210
+ console.log(`Trades: ${status.trades}`);
211
+ console.log(`P&L: $${status.pnl}`);
212
+ console.log(`Win Rate: ${status.winRate}%`);
213
+ console.log(`Active Positions: ${status.activePositions}`);
214
+ console.log(`Last Signal: ${status.lastSignal}`);
215
+ ```
216
+
217
+ ### List Strategies
218
+
219
+ ```typescript
220
+ const strategies = await builder.list();
221
+
222
+ for (const s of strategies) {
223
+ console.log(`${s.name}: ${s.status}`);
224
+ console.log(` Type: ${s.template || 'custom'}`);
225
+ console.log(` P&L: $${s.pnl}`);
226
+ console.log(` Trades: ${s.trades}`);
227
+ }
228
+ ```
229
+
230
+ ---
231
+
232
+ ## Built-in Templates
233
+
234
+ | Template | Description |
235
+ |----------|-------------|
236
+ | `momentum` | Follow price trends |
237
+ | `mean-reversion` | Buy dips, sell rallies |
238
+ | `arbitrage` | Cross-platform spreads |
239
+ | `breakout` | Range breakout entries |
240
+ | `pairs` | Correlated market pairs |
241
+ | `news-reactive` | React to news events |
242
+ | `volume-spike` | Trade on volume surges |
243
+
244
+ ---
245
+
246
+ ## Condition Types
247
+
248
+ | Type | Description | Example |
249
+ |------|-------------|---------|
250
+ | `price` | Current price | `< 0.30` |
251
+ | `volume24h` | 24h volume | `> 50000` |
252
+ | `spread` | Bid-ask spread | `< 0.02` |
253
+ | `profit` | Unrealized profit | `>= 0.15` |
254
+ | `loss` | Unrealized loss | `>= 0.10` |
255
+ | `holdTime` | Time in position | `>= 48h` |
256
+ | `priceChange` | Price change % | `< -0.05` (5% drop) |
257
+
258
+ ---
259
+
260
+ ## Best Practices
261
+
262
+ 1. **Always dry-run first** — Test before real money
263
+ 2. **Start small** — Low capital until proven
264
+ 3. **Set stop-losses** — Protect against bad trades
265
+ 4. **Monitor actively** — Check strategy performance
266
+ 5. **Iterate** — Improve based on results
@@ -0,0 +1,150 @@
1
+ ---
2
+ name: streaming
3
+ description: "Response streaming configuration and real-time output"
4
+ emoji: "📡"
5
+ ---
6
+
7
+ # Streaming - Complete API Reference
8
+
9
+ Configure response streaming, typing indicators, and real-time message delivery.
10
+
11
+ ---
12
+
13
+ ## Chat Commands
14
+
15
+ ### View Settings
16
+
17
+ ```
18
+ /streaming Show current settings
19
+ /streaming status Streaming status
20
+ ```
21
+
22
+ ### Configure Streaming
23
+
24
+ ```
25
+ /streaming enable Enable streaming
26
+ /streaming disable Disable streaming
27
+ /streaming chunk-size 50 Set chunk size (chars)
28
+ /streaming delay 100 Set delay between chunks (ms)
29
+ ```
30
+
31
+ ### Typing Indicators
32
+
33
+ ```
34
+ /streaming typing on Enable typing indicators
35
+ /streaming typing off Disable typing indicators
36
+ /streaming typing duration 3000 Typing duration (ms)
37
+ ```
38
+
39
+ ### Platform Settings
40
+
41
+ ```
42
+ /streaming platforms Show platform limits
43
+ /streaming platform telegram chunk 100 Set per-platform
44
+ ```
45
+
46
+ ---
47
+
48
+ ## TypeScript API Reference
49
+
50
+ ### Create Streaming Config
51
+
52
+ ```typescript
53
+ import { createStreamingConfig } from 'clodds/streaming';
54
+
55
+ const streaming = createStreamingConfig({
56
+ // Enable streaming
57
+ enabled: true,
58
+
59
+ // Chunk settings
60
+ minChunkSize: 20, // Min chars per chunk
61
+ maxChunkSize: 200, // Max chars per chunk
62
+ chunkDelayMs: 50, // Delay between chunks
63
+
64
+ // Typing indicators
65
+ showTyping: true,
66
+ typingDurationMs: 3000,
67
+
68
+ // Platform-specific limits
69
+ platformLimits: {
70
+ telegram: { maxMessageLength: 4096, maxChunkSize: 100 },
71
+ discord: { maxMessageLength: 2000, maxChunkSize: 150 },
72
+ slack: { maxMessageLength: 40000, maxChunkSize: 200 },
73
+ },
74
+ });
75
+ ```
76
+
77
+ ### Enable/Disable
78
+
79
+ ```typescript
80
+ // Enable streaming
81
+ streaming.enable();
82
+
83
+ // Disable streaming
84
+ streaming.disable();
85
+
86
+ // Check status
87
+ const enabled = streaming.isEnabled();
88
+ ```
89
+
90
+ ### Configure Chunks
91
+
92
+ ```typescript
93
+ // Set chunk size
94
+ streaming.setChunkSize(100);
95
+
96
+ // Set delay
97
+ streaming.setChunkDelay(75);
98
+
99
+ // Get current settings
100
+ const settings = streaming.getSettings();
101
+ console.log(`Chunk size: ${settings.chunkSize}`);
102
+ console.log(`Delay: ${settings.chunkDelayMs}ms`);
103
+ ```
104
+
105
+ ### Platform Settings
106
+
107
+ ```typescript
108
+ // Set platform-specific limit
109
+ streaming.setPlatformLimit('telegram', {
110
+ maxMessageLength: 4096,
111
+ maxChunkSize: 80,
112
+ });
113
+
114
+ // Get platform limits
115
+ const limits = streaming.getPlatformLimits();
116
+ ```
117
+
118
+ ### Typing Indicators
119
+
120
+ ```typescript
121
+ // Enable typing
122
+ streaming.enableTyping();
123
+
124
+ // Disable typing
125
+ streaming.disableTyping();
126
+
127
+ // Set duration
128
+ streaming.setTypingDuration(5000);
129
+ ```
130
+
131
+ ---
132
+
133
+ ## Platform Limits
134
+
135
+ | Platform | Max Message | Recommended Chunk |
136
+ |----------|-------------|-------------------|
137
+ | Telegram | 4,096 chars | 80-100 |
138
+ | Discord | 2,000 chars | 100-150 |
139
+ | Slack | 40,000 chars | 150-200 |
140
+ | WhatsApp | 65,536 chars | 100-150 |
141
+ | WebChat | Unlimited | 150-200 |
142
+
143
+ ---
144
+
145
+ ## Best Practices
146
+
147
+ 1. **Smaller chunks for mobile** — Better UX on slow connections
148
+ 2. **Adjust delay for readability** — 50-100ms feels natural
149
+ 3. **Disable for short responses** — Don't stream "OK"
150
+ 4. **Monitor performance** — Streaming adds overhead
@@ -124,8 +124,8 @@ async function execute(args) {
124
124
  return helpText();
125
125
  }
126
126
  }
127
- catch {
128
- return helpText();
127
+ catch (error) {
128
+ return `Error: ${error instanceof Error ? error.message : String(error)}`;
129
129
  }
130
130
  }
131
131
  function helpText() {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/skills/bundled/streaming/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/skills/bundled/streaming/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,249 @@
1
+ ---
2
+ name: tailscale
3
+ description: "Tailscale VPN sharing, Serve, and Funnel for remote access"
4
+ emoji: "🔗"
5
+ gates:
6
+ envs:
7
+ anyOf:
8
+ - TAILSCALE_AUTHKEY
9
+ ---
10
+
11
+ # Tailscale - Complete API Reference
12
+
13
+ Share local services via Tailscale Serve (private) and Funnel (public internet access).
14
+
15
+ ---
16
+
17
+ ## Chat Commands
18
+
19
+ ### Share Local Services (Private)
20
+
21
+ ```
22
+ /tailscale serve 3000 Share port on tailnet
23
+ /tailscale serve 3000 --path /api Share at specific path
24
+ /tailscale serve stop 3000 Stop sharing port
25
+ /tailscale serve status View active shares
26
+ ```
27
+
28
+ ### Public Access (Funnel)
29
+
30
+ ```
31
+ /tailscale funnel 3000 Expose to internet
32
+ /tailscale funnel 3000 --https Force HTTPS
33
+ /tailscale funnel stop 3000 Stop public access
34
+ /tailscale funnel status View funnels
35
+ ```
36
+
37
+ ### Network Status
38
+
39
+ ```
40
+ /tailscale status Network status
41
+ /tailscale ip Show Tailscale IP
42
+ /tailscale peers List connected peers
43
+ /tailscale ping <peer> Ping a peer
44
+ ```
45
+
46
+ ### File Transfer
47
+
48
+ ```
49
+ /tailscale send <file> <peer> Send file to peer
50
+ /tailscale receive Receive incoming files
51
+ ```
52
+
53
+ ---
54
+
55
+ ## TypeScript API Reference
56
+
57
+ ### Create Tailscale Client
58
+
59
+ ```typescript
60
+ import { createTailscaleClient } from 'clodds/tailscale';
61
+
62
+ const tailscale = createTailscaleClient({
63
+ // Auth (optional if already logged in)
64
+ authKey: process.env.TAILSCALE_AUTHKEY,
65
+
66
+ // Socket path
67
+ socketPath: '/var/run/tailscale/tailscaled.sock',
68
+ });
69
+ ```
70
+
71
+ ### Serve (Private Sharing)
72
+
73
+ ```typescript
74
+ // Share local port on tailnet
75
+ await tailscale.serve({
76
+ port: 3000,
77
+ protocol: 'https', // 'http' | 'https'
78
+ });
79
+
80
+ console.log(`Shared at: https://${tailscale.hostname}:3000`);
81
+
82
+ // Share at specific path
83
+ await tailscale.serve({
84
+ port: 8080,
85
+ path: '/api',
86
+ protocol: 'https',
87
+ });
88
+
89
+ // Share with custom hostname
90
+ await tailscale.serve({
91
+ port: 3000,
92
+ hostname: 'clodds', // clodds.tailnet-name.ts.net
93
+ });
94
+
95
+ // Stop sharing
96
+ await tailscale.serveStop(3000);
97
+
98
+ // Get serve status
99
+ const serves = await tailscale.serveStatus();
100
+ for (const serve of serves) {
101
+ console.log(`Port ${serve.port} → ${serve.url}`);
102
+ }
103
+ ```
104
+
105
+ ### Funnel (Public Internet)
106
+
107
+ ```typescript
108
+ // Expose to public internet
109
+ await tailscale.funnel({
110
+ port: 3000,
111
+ protocol: 'https',
112
+ });
113
+
114
+ console.log(`Public URL: https://${tailscale.hostname}.ts.net`);
115
+
116
+ // With custom domain (if configured)
117
+ await tailscale.funnel({
118
+ port: 3000,
119
+ hostname: 'api.example.com',
120
+ });
121
+
122
+ // Stop funnel
123
+ await tailscale.funnelStop(3000);
124
+
125
+ // Get funnel status
126
+ const funnels = await tailscale.funnelStatus();
127
+ for (const funnel of funnels) {
128
+ console.log(`Port ${funnel.port} → ${funnel.publicUrl}`);
129
+ }
130
+ ```
131
+
132
+ ### Network Status
133
+
134
+ ```typescript
135
+ // Get status
136
+ const status = await tailscale.status();
137
+
138
+ console.log(`Hostname: ${status.hostname}`);
139
+ console.log(`IP: ${status.ip}`);
140
+ console.log(`Tailnet: ${status.tailnet}`);
141
+ console.log(`Online: ${status.online}`);
142
+
143
+ // List peers
144
+ const peers = await tailscale.peers();
145
+ for (const peer of peers) {
146
+ console.log(`${peer.hostname} (${peer.ip})`);
147
+ console.log(` OS: ${peer.os}`);
148
+ console.log(` Online: ${peer.online}`);
149
+ console.log(` Last seen: ${peer.lastSeen}`);
150
+ }
151
+
152
+ // Ping peer
153
+ const ping = await tailscale.ping('other-machine');
154
+ console.log(`Latency: ${ping.latencyMs}ms`);
155
+ ```
156
+
157
+ ### File Transfer
158
+
159
+ ```typescript
160
+ // Send file to peer
161
+ await tailscale.sendFile({
162
+ file: '/path/to/file.zip',
163
+ peer: 'other-machine',
164
+ });
165
+
166
+ // Receive files (returns when file received)
167
+ const received = await tailscale.receiveFile({
168
+ savePath: '/downloads',
169
+ timeout: 60000,
170
+ });
171
+
172
+ console.log(`Received: ${received.filename}`);
173
+ console.log(`From: ${received.sender}`);
174
+ console.log(`Size: ${received.size} bytes`);
175
+ ```
176
+
177
+ ### Get Tailscale IP
178
+
179
+ ```typescript
180
+ const ip = await tailscale.getIP();
181
+ console.log(`Tailscale IP: ${ip}`); // 100.x.x.x
182
+ ```
183
+
184
+ ---
185
+
186
+ ## Serve vs Funnel
187
+
188
+ | Feature | Serve | Funnel |
189
+ |---------|-------|--------|
190
+ | **Access** | Tailnet only | Public internet |
191
+ | **Auth** | Tailscale identity | None (public) |
192
+ | **URL** | machine.tailnet.ts.net | machine.ts.net |
193
+ | **Use case** | Internal tools | Public APIs |
194
+
195
+ ---
196
+
197
+ ## URL Formats
198
+
199
+ | Type | Format |
200
+ |------|--------|
201
+ | **Serve** | `https://machine.tailnet-name.ts.net:port` |
202
+ | **Funnel** | `https://machine.ts.net` |
203
+ | **Custom domain** | `https://your-domain.com` |
204
+
205
+ ---
206
+
207
+ ## Use Cases
208
+
209
+ ### Share Dev Server
210
+
211
+ ```typescript
212
+ // Share local dev server with team
213
+ await tailscale.serve({ port: 3000 });
214
+ // Team can access at https://your-machine.tailnet.ts.net:3000
215
+ ```
216
+
217
+ ### Expose Webhook Endpoint
218
+
219
+ ```typescript
220
+ // Make webhook publicly accessible
221
+ await tailscale.funnel({ port: 3000, path: '/webhooks' });
222
+ // External services can POST to https://your-machine.ts.net/webhooks
223
+ ```
224
+
225
+ ### Share Bot with Phone
226
+
227
+ ```typescript
228
+ // Access bot from phone while away from desk
229
+ await tailscale.serve({ port: 18789 });
230
+ // Open https://your-machine.tailnet.ts.net:18789/webchat on phone
231
+ ```
232
+
233
+ ---
234
+
235
+ ## Requirements
236
+
237
+ - Tailscale installed and running
238
+ - Logged into a Tailnet
239
+ - For Funnel: Funnel enabled in Tailscale admin
240
+
241
+ ---
242
+
243
+ ## Best Practices
244
+
245
+ 1. **Use Serve for internal** — Keep private services private
246
+ 2. **Use Funnel sparingly** — Only for truly public endpoints
247
+ 3. **Add authentication** — Funnel bypasses Tailscale auth
248
+ 4. **Monitor access** — Check who's connecting
249
+ 5. **Stop when done** — Don't leave services exposed
@@ -149,8 +149,8 @@ async function execute(args) {
149
149
  return helpText();
150
150
  }
151
151
  }
152
- catch {
153
- return helpText();
152
+ catch (error) {
153
+ return `Error: ${error instanceof Error ? error.message : String(error)}`;
154
154
  }
155
155
  }
156
156
  function helpText() {