@hyperflow.fun/ghost 0.0.1

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 (351) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +91 -0
  3. package/dist/index.js +220545 -0
  4. package/dist/package.json +4 -0
  5. package/dist/skills/builtin/briefing/SKILL.md +77 -0
  6. package/dist/skills/builtin/clawhub/SKILL.md +50 -0
  7. package/dist/skills/builtin/event-judge/SKILL.md +122 -0
  8. package/dist/skills/builtin/market-intel/SKILL.md +160 -0
  9. package/dist/skills/builtin/position-monitor/SKILL.md +84 -0
  10. package/dist/skills/builtin/pre-trade-advisory/SKILL.md +203 -0
  11. package/dist/skills/builtin/risk-manager/SKILL.md +124 -0
  12. package/dist/skills/builtin/skill-creator/SKILL.md +68 -0
  13. package/dist/skills/builtin/skill-creator/references/guide.md +158 -0
  14. package/dist/skills/builtin/skill-creator/scripts/init_skill.py +378 -0
  15. package/dist/skills/builtin/skill-creator/scripts/package_skill.py +154 -0
  16. package/dist/skills/builtin/skill-creator/scripts/quick_validate.py +213 -0
  17. package/dist/skills/builtin/skills-sh/SKILL.md +56 -0
  18. package/dist/skills/builtin/technical-analysis/SKILL.md +242 -0
  19. package/dist/skills/builtin/trade-executor/SKILL.md +179 -0
  20. package/dist/templates/SOUL.md +73 -0
  21. package/dist/web/dist/assets/Chart-DwirCj9o.js +1 -0
  22. package/dist/web/dist/assets/Config-Csnvaqpn.js +1 -0
  23. package/dist/web/dist/assets/Cost-BSD_2GYX.js +6 -0
  24. package/dist/web/dist/assets/Cron-BVKdKUFN.js +16 -0
  25. package/dist/web/dist/assets/Dashboard-Ccr5J95V.js +21 -0
  26. package/dist/web/dist/assets/Logs-CUgA7IGb.js +21 -0
  27. package/dist/web/dist/assets/Memory-C_Q_iNlN.js +12 -0
  28. package/dist/web/dist/assets/SF-Pro-Display-Bold-CkqE-6tD.otf +0 -0
  29. package/dist/web/dist/assets/SF-Pro-Display-Medium-DSttQARu.otf +0 -0
  30. package/dist/web/dist/assets/SF-Pro-Display-Regular-DF_3XEGl.otf +0 -0
  31. package/dist/web/dist/assets/SF-Pro-Display-Semibold-Dg2-djaL.otf +0 -0
  32. package/dist/web/dist/assets/Sessions-KDhnYDnX.js +11 -0
  33. package/dist/web/dist/assets/Skills-BK-V7HFa.js +1 -0
  34. package/dist/web/dist/assets/Tools-a3aqqugu.js +1 -0
  35. package/dist/web/dist/assets/abap-BdImnpbu.js +1 -0
  36. package/dist/web/dist/assets/actionscript-3-CoDkCxhg.js +1 -0
  37. package/dist/web/dist/assets/activity-DsxRdk-G.js +6 -0
  38. package/dist/web/dist/assets/ada-bCR0ucgS.js +1 -0
  39. package/dist/web/dist/assets/andromeeda-C4gqWexZ.js +1 -0
  40. package/dist/web/dist/assets/angular-html-CU67Zn6k.js +1 -0
  41. package/dist/web/dist/assets/angular-ts-BwZT4LLn.js +1 -0
  42. package/dist/web/dist/assets/apache-Pmp26Uib.js +1 -0
  43. package/dist/web/dist/assets/apex-D8_7TLub.js +1 -0
  44. package/dist/web/dist/assets/apl-dKokRX4l.js +1 -0
  45. package/dist/web/dist/assets/applescript-Co6uUVPk.js +1 -0
  46. package/dist/web/dist/assets/ara-BRHolxvo.js +1 -0
  47. package/dist/web/dist/assets/asciidoc-Ve4PFQV2.js +1 -0
  48. package/dist/web/dist/assets/asm-D_Q5rh1f.js +1 -0
  49. package/dist/web/dist/assets/astro-CbQHKStN.js +1 -0
  50. package/dist/web/dist/assets/aurora-x-D-2ljcwZ.js +1 -0
  51. package/dist/web/dist/assets/awk-DMzUqQB5.js +1 -0
  52. package/dist/web/dist/assets/ayu-dark-DYE7WIF3.js +1 -0
  53. package/dist/web/dist/assets/ayu-light-BA47KaF1.js +1 -0
  54. package/dist/web/dist/assets/ayu-mirage-32ctXXKs.js +1 -0
  55. package/dist/web/dist/assets/ballerina-BFfxhgS-.js +1 -0
  56. package/dist/web/dist/assets/bat-BkioyH1T.js +1 -0
  57. package/dist/web/dist/assets/beancount-k_qm7-4y.js +1 -0
  58. package/dist/web/dist/assets/berry-uYugtg8r.js +1 -0
  59. package/dist/web/dist/assets/bibtex-CHM0blh-.js +1 -0
  60. package/dist/web/dist/assets/bicep-Bmn6On1c.js +1 -0
  61. package/dist/web/dist/assets/bird2-DPOp833l.js +1 -0
  62. package/dist/web/dist/assets/blade-D4QpJJKB.js +1 -0
  63. package/dist/web/dist/assets/bsl-BO_Y6i37.js +1 -0
  64. package/dist/web/dist/assets/c-BIGW1oBm.js +1 -0
  65. package/dist/web/dist/assets/c3-eo99z4R2.js +1 -0
  66. package/dist/web/dist/assets/cadence-Bv_4Rxtq.js +1 -0
  67. package/dist/web/dist/assets/cairo-KRGpt6FW.js +1 -0
  68. package/dist/web/dist/assets/catppuccin-frappe-DFWUc33u.js +1 -0
  69. package/dist/web/dist/assets/catppuccin-latte-C9dUb6Cb.js +1 -0
  70. package/dist/web/dist/assets/catppuccin-macchiato-DQyhUUbL.js +1 -0
  71. package/dist/web/dist/assets/catppuccin-mocha-D87Tk5Gz.js +1 -0
  72. package/dist/web/dist/assets/clarity-D53aC0YG.js +1 -0
  73. package/dist/web/dist/assets/clock-DCbfDkWu.js +6 -0
  74. package/dist/web/dist/assets/clojure-P80f7IUj.js +1 -0
  75. package/dist/web/dist/assets/cmake-D1j8_8rp.js +1 -0
  76. package/dist/web/dist/assets/cobol-nwyudZeR.js +1 -0
  77. package/dist/web/dist/assets/codeowners-Bp6g37R7.js +1 -0
  78. package/dist/web/dist/assets/codeql-DsOJ9woJ.js +1 -0
  79. package/dist/web/dist/assets/coffee-Ch7k5sss.js +1 -0
  80. package/dist/web/dist/assets/common-lisp-Cg-RD9OK.js +1 -0
  81. package/dist/web/dist/assets/coq-DkFqJrB1.js +1 -0
  82. package/dist/web/dist/assets/cpp-CofmeUqb.js +1 -0
  83. package/dist/web/dist/assets/crystal-tKQVLTB8.js +1 -0
  84. package/dist/web/dist/assets/csharp-COcwbKMJ.js +1 -0
  85. package/dist/web/dist/assets/css-DPfMkruS.js +1 -0
  86. package/dist/web/dist/assets/csv-fuZLfV_i.js +1 -0
  87. package/dist/web/dist/assets/cue-D82EKSYY.js +1 -0
  88. package/dist/web/dist/assets/cypher-COkxafJQ.js +1 -0
  89. package/dist/web/dist/assets/d-85-TOEBH.js +1 -0
  90. package/dist/web/dist/assets/dark-plus-C3mMm8J8.js +1 -0
  91. package/dist/web/dist/assets/dart-CF10PKvl.js +1 -0
  92. package/dist/web/dist/assets/dax-CEL-wOlO.js +1 -0
  93. package/dist/web/dist/assets/desktop-BmXAJ9_W.js +1 -0
  94. package/dist/web/dist/assets/diff-D97Zzqfu.js +1 -0
  95. package/dist/web/dist/assets/docker-BcOcwvcX.js +1 -0
  96. package/dist/web/dist/assets/dotenv-Da5cRb03.js +1 -0
  97. package/dist/web/dist/assets/dracula-BzJJZx-M.js +1 -0
  98. package/dist/web/dist/assets/dracula-soft-BXkSAIEj.js +1 -0
  99. package/dist/web/dist/assets/dream-maker-BtqSS_iP.js +1 -0
  100. package/dist/web/dist/assets/edge-BkV0erSs.js +1 -0
  101. package/dist/web/dist/assets/elixir-CDX3lj18.js +1 -0
  102. package/dist/web/dist/assets/elm-DbKCFpqz.js +1 -0
  103. package/dist/web/dist/assets/emacs-lisp-C9XAeP06.js +1 -0
  104. package/dist/web/dist/assets/erb-B12qg9BL.js +1 -0
  105. package/dist/web/dist/assets/erlang-DsQrWhSR.js +1 -0
  106. package/dist/web/dist/assets/everforest-dark-BgDCqdQA.js +1 -0
  107. package/dist/web/dist/assets/everforest-light-C8M2exoo.js +1 -0
  108. package/dist/web/dist/assets/fennel-BYunw83y.js +1 -0
  109. package/dist/web/dist/assets/fish-BvzEVeQv.js +1 -0
  110. package/dist/web/dist/assets/fluent-C4IJs8-o.js +1 -0
  111. package/dist/web/dist/assets/fortran-fixed-form-CkoXwp7k.js +1 -0
  112. package/dist/web/dist/assets/fortran-free-form-BxgE0vQu.js +1 -0
  113. package/dist/web/dist/assets/fsharp-CXgrBDvD.js +1 -0
  114. package/dist/web/dist/assets/gdresource-BOOCDP_w.js +1 -0
  115. package/dist/web/dist/assets/gdscript-C5YyOfLZ.js +1 -0
  116. package/dist/web/dist/assets/gdshader-DkwncUOv.js +1 -0
  117. package/dist/web/dist/assets/genie-D0YGMca9.js +1 -0
  118. package/dist/web/dist/assets/gherkin-DyxjwDmM.js +1 -0
  119. package/dist/web/dist/assets/ghost-symbol-xItVvoCA.svg +5 -0
  120. package/dist/web/dist/assets/git-commit-F4YmCXRG.js +1 -0
  121. package/dist/web/dist/assets/git-rebase-r7XF79zn.js +1 -0
  122. package/dist/web/dist/assets/github-dark-DHJKELXO.js +1 -0
  123. package/dist/web/dist/assets/github-dark-default-Cuk6v7N8.js +1 -0
  124. package/dist/web/dist/assets/github-dark-dimmed-DH5Ifo-i.js +1 -0
  125. package/dist/web/dist/assets/github-dark-high-contrast-E3gJ1_iC.js +1 -0
  126. package/dist/web/dist/assets/github-light-DAi9KRSo.js +1 -0
  127. package/dist/web/dist/assets/github-light-default-D7oLnXFd.js +1 -0
  128. package/dist/web/dist/assets/github-light-high-contrast-BfjtVDDH.js +1 -0
  129. package/dist/web/dist/assets/gleam-BspZqrRM.js +1 -0
  130. package/dist/web/dist/assets/glimmer-js-Rg0-pVw9.js +1 -0
  131. package/dist/web/dist/assets/glimmer-ts-U6CK756n.js +1 -0
  132. package/dist/web/dist/assets/glsl-DplSGwfg.js +1 -0
  133. package/dist/web/dist/assets/gn-n2N0HUVH.js +1 -0
  134. package/dist/web/dist/assets/gnuplot-DdkO51Og.js +1 -0
  135. package/dist/web/dist/assets/go-CxLEBnE3.js +1 -0
  136. package/dist/web/dist/assets/graphql-ChdNCCLP.js +1 -0
  137. package/dist/web/dist/assets/groovy-gcz8RCvz.js +1 -0
  138. package/dist/web/dist/assets/gruvbox-dark-hard-CFHQjOhq.js +1 -0
  139. package/dist/web/dist/assets/gruvbox-dark-medium-GsRaNv29.js +1 -0
  140. package/dist/web/dist/assets/gruvbox-dark-soft-CVdnzihN.js +1 -0
  141. package/dist/web/dist/assets/gruvbox-light-hard-CH1njM8p.js +1 -0
  142. package/dist/web/dist/assets/gruvbox-light-medium-DRw_LuNl.js +1 -0
  143. package/dist/web/dist/assets/gruvbox-light-soft-hJgmCMqR.js +1 -0
  144. package/dist/web/dist/assets/hack-CaT9iCJl.js +1 -0
  145. package/dist/web/dist/assets/haml-B8DHNrY2.js +1 -0
  146. package/dist/web/dist/assets/handlebars-BL8al0AC.js +1 -0
  147. package/dist/web/dist/assets/haskell-Df6bDoY_.js +1 -0
  148. package/dist/web/dist/assets/haxe-CzTSHFRz.js +1 -0
  149. package/dist/web/dist/assets/hcl-BWvSN4gD.js +1 -0
  150. package/dist/web/dist/assets/highlighted-body-OFNGDK62-C8yP3qbm.js +1 -0
  151. package/dist/web/dist/assets/hjson-D5-asLiD.js +1 -0
  152. package/dist/web/dist/assets/hlsl-D3lLCCz7.js +1 -0
  153. package/dist/web/dist/assets/horizon-BUw7H-hv.js +1 -0
  154. package/dist/web/dist/assets/horizon-bright-Cn-bp-IR.js +1 -0
  155. package/dist/web/dist/assets/houston-DnULxvSX.js +1 -0
  156. package/dist/web/dist/assets/html-GMplVEZG.js +1 -0
  157. package/dist/web/dist/assets/html-derivative-BFtXZ54Q.js +1 -0
  158. package/dist/web/dist/assets/http-jrhK8wxY.js +1 -0
  159. package/dist/web/dist/assets/hurl-irOxFIW8.js +1 -0
  160. package/dist/web/dist/assets/hxml-Bvhsp5Yf.js +1 -0
  161. package/dist/web/dist/assets/hy-DFXneXwc.js +1 -0
  162. package/dist/web/dist/assets/hyperliquid-logo-Blr66fIk.svg +9 -0
  163. package/dist/web/dist/assets/imba-DGztddWO.js +1 -0
  164. package/dist/web/dist/assets/index-3q7g734D.js +54 -0
  165. package/dist/web/dist/assets/index-DRvGorcf.css +1 -0
  166. package/dist/web/dist/assets/ini-BEwlwnbL.js +1 -0
  167. package/dist/web/dist/assets/java-CylS5w8V.js +1 -0
  168. package/dist/web/dist/assets/javascript-wDzz0qaB.js +1 -0
  169. package/dist/web/dist/assets/jinja-4LBKfQ-Z.js +1 -0
  170. package/dist/web/dist/assets/jison-wvAkD_A8.js +1 -0
  171. package/dist/web/dist/assets/json-Cp-IABpG.js +1 -0
  172. package/dist/web/dist/assets/json5-C9tS-k6U.js +1 -0
  173. package/dist/web/dist/assets/jsonc-Des-eS-w.js +1 -0
  174. package/dist/web/dist/assets/jsonl-DcaNXYhu.js +1 -0
  175. package/dist/web/dist/assets/jsonnet-DFQXde-d.js +1 -0
  176. package/dist/web/dist/assets/jssm-C2t-YnRu.js +1 -0
  177. package/dist/web/dist/assets/jsx-g9-lgVsj.js +1 -0
  178. package/dist/web/dist/assets/julia-CxzCAyBv.js +1 -0
  179. package/dist/web/dist/assets/just-Cw27pwNe.js +1 -0
  180. package/dist/web/dist/assets/kanagawa-dragon-CkXjmgJE.js +1 -0
  181. package/dist/web/dist/assets/kanagawa-lotus-CfQXZHmo.js +1 -0
  182. package/dist/web/dist/assets/kanagawa-wave-DWedfzmr.js +1 -0
  183. package/dist/web/dist/assets/kdl-DV7GczEv.js +1 -0
  184. package/dist/web/dist/assets/kotlin-BdnUsdx6.js +1 -0
  185. package/dist/web/dist/assets/kusto-DZf3V79B.js +1 -0
  186. package/dist/web/dist/assets/laserwave-DUszq2jm.js +1 -0
  187. package/dist/web/dist/assets/latex-CWtU0Tv5.js +1 -0
  188. package/dist/web/dist/assets/lean-BZvkOJ9d.js +1 -0
  189. package/dist/web/dist/assets/less-B1dDrJ26.js +1 -0
  190. package/dist/web/dist/assets/light-plus-B7mTdjB0.js +1 -0
  191. package/dist/web/dist/assets/liquid-DYVedYrR.js +1 -0
  192. package/dist/web/dist/assets/llvm-DjAJT7YJ.js +1 -0
  193. package/dist/web/dist/assets/log-2UxHyX5q.js +1 -0
  194. package/dist/web/dist/assets/logo-BtOb2qkB.js +1 -0
  195. package/dist/web/dist/assets/lua-BaeVxFsk.js +1 -0
  196. package/dist/web/dist/assets/luau-C-HG3fhB.js +1 -0
  197. package/dist/web/dist/assets/make-CHLpvVh8.js +1 -0
  198. package/dist/web/dist/assets/markdown-Cvjx9yec.js +1 -0
  199. package/dist/web/dist/assets/marko-CnJfTvn9.js +1 -0
  200. package/dist/web/dist/assets/material-theme-D5KoaKCx.js +1 -0
  201. package/dist/web/dist/assets/material-theme-darker-BfHTSMKl.js +1 -0
  202. package/dist/web/dist/assets/material-theme-lighter-B0m2ddpp.js +1 -0
  203. package/dist/web/dist/assets/material-theme-ocean-CyktbL80.js +1 -0
  204. package/dist/web/dist/assets/material-theme-palenight-Csfq5Kiy.js +1 -0
  205. package/dist/web/dist/assets/matlab-D7o27uSR.js +1 -0
  206. package/dist/web/dist/assets/mdc-BMNejdWA.js +1 -0
  207. package/dist/web/dist/assets/mdx-Cmh6b_Ma.js +1 -0
  208. package/dist/web/dist/assets/mermaid-GHXKKRXX-CbzD1Jp7.js +282 -0
  209. package/dist/web/dist/assets/mermaid-mWjccvbQ.js +1 -0
  210. package/dist/web/dist/assets/min-dark-CafNBF8u.js +1 -0
  211. package/dist/web/dist/assets/min-light-CTRr51gU.js +1 -0
  212. package/dist/web/dist/assets/mipsasm-CKIfxQSi.js +1 -0
  213. package/dist/web/dist/assets/mojo-rZm6bMo-.js +1 -0
  214. package/dist/web/dist/assets/monokai-D4h5O-jR.js +1 -0
  215. package/dist/web/dist/assets/moonbit-_H4v1dQx.js +1 -0
  216. package/dist/web/dist/assets/move-IF9eRakj.js +1 -0
  217. package/dist/web/dist/assets/narrat-DRg8JJMk.js +1 -0
  218. package/dist/web/dist/assets/nextflow-Zz6hmt5N.js +1 -0
  219. package/dist/web/dist/assets/nextflow-groovy-BeH2EWoN.js +1 -0
  220. package/dist/web/dist/assets/nginx-BpAMiNFr.js +1 -0
  221. package/dist/web/dist/assets/night-owl-C39BiMTA.js +1 -0
  222. package/dist/web/dist/assets/night-owl-light-CMTm3GFP.js +1 -0
  223. package/dist/web/dist/assets/nim-CVrawwO9.js +1 -0
  224. package/dist/web/dist/assets/nix-CwoSXNpI.js +1 -0
  225. package/dist/web/dist/assets/nord-Ddv68eIx.js +1 -0
  226. package/dist/web/dist/assets/nushell-Cz2AlsmD.js +1 -0
  227. package/dist/web/dist/assets/objective-c-DXmwc3jG.js +1 -0
  228. package/dist/web/dist/assets/objective-cpp-CLxacb5B.js +1 -0
  229. package/dist/web/dist/assets/ocaml-C0hk2d4L.js +1 -0
  230. package/dist/web/dist/assets/odin-BBf5iR-q.js +1 -0
  231. package/dist/web/dist/assets/one-dark-pro-DVMEJ2y_.js +1 -0
  232. package/dist/web/dist/assets/one-light-C3Wv6jpd.js +1 -0
  233. package/dist/web/dist/assets/openscad-C4EeE6gA.js +1 -0
  234. package/dist/web/dist/assets/pascal-D93ZcfNL.js +1 -0
  235. package/dist/web/dist/assets/perl-C0TMdlhV.js +1 -0
  236. package/dist/web/dist/assets/php-Dhbhpdrm.js +1 -0
  237. package/dist/web/dist/assets/pkl-u5AG7uiY.js +1 -0
  238. package/dist/web/dist/assets/plastic-3e1v2bzS.js +1 -0
  239. package/dist/web/dist/assets/plsql-ChMvpjG-.js +1 -0
  240. package/dist/web/dist/assets/po-BTJTHyun.js +1 -0
  241. package/dist/web/dist/assets/poimandres-CS3Unz2-.js +1 -0
  242. package/dist/web/dist/assets/polar-C0HS_06l.js +1 -0
  243. package/dist/web/dist/assets/postcss-CXtECtnM.js +1 -0
  244. package/dist/web/dist/assets/powerquery-CEu0bR-o.js +1 -0
  245. package/dist/web/dist/assets/powershell-Dpen1YoG.js +1 -0
  246. package/dist/web/dist/assets/prisma-Dd19v3D-.js +1 -0
  247. package/dist/web/dist/assets/prolog-CbFg5uaA.js +1 -0
  248. package/dist/web/dist/assets/proto-C7zT0LnQ.js +1 -0
  249. package/dist/web/dist/assets/pug-CGlum2m_.js +1 -0
  250. package/dist/web/dist/assets/puppet-BMWR74SV.js +1 -0
  251. package/dist/web/dist/assets/purescript-CklMAg4u.js +1 -0
  252. package/dist/web/dist/assets/python-B6aJPvgy.js +1 -0
  253. package/dist/web/dist/assets/qml-3beO22l8.js +1 -0
  254. package/dist/web/dist/assets/qmldir-C8lEn-DE.js +1 -0
  255. package/dist/web/dist/assets/qss-IeuSbFQv.js +1 -0
  256. package/dist/web/dist/assets/r-Dspwwk_N.js +1 -0
  257. package/dist/web/dist/assets/racket-BqYA7rlc.js +1 -0
  258. package/dist/web/dist/assets/raku-DXvB9xmW.js +1 -0
  259. package/dist/web/dist/assets/razor-Uh8Bk_45.js +1 -0
  260. package/dist/web/dist/assets/red-bN70gL4F.js +1 -0
  261. package/dist/web/dist/assets/refresh-cw-B9ZNJZIb.js +6 -0
  262. package/dist/web/dist/assets/reg-C-SQnVFl.js +1 -0
  263. package/dist/web/dist/assets/regexp-CDVJQ6XC.js +1 -0
  264. package/dist/web/dist/assets/rel-C3B-1QV4.js +1 -0
  265. package/dist/web/dist/assets/riscv-BM1_JUlF.js +1 -0
  266. package/dist/web/dist/assets/ron-D8l8udqQ.js +1 -0
  267. package/dist/web/dist/assets/rose-pine-dawn-DHQR4-dF.js +1 -0
  268. package/dist/web/dist/assets/rose-pine-moon-D4_iv3hh.js +1 -0
  269. package/dist/web/dist/assets/rose-pine-qdsjHGoJ.js +1 -0
  270. package/dist/web/dist/assets/rosmsg-BJDFO7_C.js +1 -0
  271. package/dist/web/dist/assets/rst-BrH8l1NY.js +1 -0
  272. package/dist/web/dist/assets/ruby-Dw2BHqvy.js +1 -0
  273. package/dist/web/dist/assets/rust-B1yitclQ.js +1 -0
  274. package/dist/web/dist/assets/sas-cz2c8ADy.js +1 -0
  275. package/dist/web/dist/assets/sass-Cj5Yp3dK.js +1 -0
  276. package/dist/web/dist/assets/scala-C151Ov-r.js +1 -0
  277. package/dist/web/dist/assets/scheme-C98Dy4si.js +1 -0
  278. package/dist/web/dist/assets/scss-OYdSNvt2.js +1 -0
  279. package/dist/web/dist/assets/sdbl-DVxCFoDh.js +1 -0
  280. package/dist/web/dist/assets/shaderlab-Dg9Lc6iA.js +1 -0
  281. package/dist/web/dist/assets/shellscript-Yzrsuije.js +1 -0
  282. package/dist/web/dist/assets/shellsession-BADoaaVG.js +1 -0
  283. package/dist/web/dist/assets/slack-dark-BthQWCQV.js +1 -0
  284. package/dist/web/dist/assets/slack-ochin-DqwNpetd.js +1 -0
  285. package/dist/web/dist/assets/smalltalk-BERRCDM3.js +1 -0
  286. package/dist/web/dist/assets/snazzy-light-Bw305WKR.js +1 -0
  287. package/dist/web/dist/assets/solarized-dark-DXbdFlpD.js +1 -0
  288. package/dist/web/dist/assets/solarized-light-L9t79GZl.js +1 -0
  289. package/dist/web/dist/assets/solidity-rGO070M0.js +1 -0
  290. package/dist/web/dist/assets/soy-Brmx7dQM.js +1 -0
  291. package/dist/web/dist/assets/sparql-rVzFXLq3.js +1 -0
  292. package/dist/web/dist/assets/splunk-BtCnVYZw.js +1 -0
  293. package/dist/web/dist/assets/sql-BLtJtn59.js +1 -0
  294. package/dist/web/dist/assets/ssh-config-_ykCGR6B.js +1 -0
  295. package/dist/web/dist/assets/stata-BH5u7GGu.js +1 -0
  296. package/dist/web/dist/assets/stylus-BEDo0Tqx.js +1 -0
  297. package/dist/web/dist/assets/surrealql-Bq5Q-fJD.js +1 -0
  298. package/dist/web/dist/assets/svelte-C_ipcX3V.js +1 -0
  299. package/dist/web/dist/assets/swift-D82vCrfD.js +1 -0
  300. package/dist/web/dist/assets/synthwave-84-CbfX1IO0.js +1 -0
  301. package/dist/web/dist/assets/system-verilog-CnnmHF94.js +1 -0
  302. package/dist/web/dist/assets/systemd-4A_iFExJ.js +1 -0
  303. package/dist/web/dist/assets/talonscript-CkByrt1z.js +1 -0
  304. package/dist/web/dist/assets/tasl-QIJgUcNo.js +1 -0
  305. package/dist/web/dist/assets/tcl-dwOrl1Do.js +1 -0
  306. package/dist/web/dist/assets/templ-P3uqSqPl.js +1 -0
  307. package/dist/web/dist/assets/terraform-BETggiCN.js +1 -0
  308. package/dist/web/dist/assets/tex-idrVyKtj.js +1 -0
  309. package/dist/web/dist/assets/tokyo-night-hegEt444.js +1 -0
  310. package/dist/web/dist/assets/toml-vGWfd6FD.js +1 -0
  311. package/dist/web/dist/assets/ts-tags-zn1MmPIZ.js +1 -0
  312. package/dist/web/dist/assets/tsv-B_m7g4N7.js +1 -0
  313. package/dist/web/dist/assets/tsx-COt5Ahok.js +1 -0
  314. package/dist/web/dist/assets/turtle-BsS91CYL.js +1 -0
  315. package/dist/web/dist/assets/twig-DNn4PbVi.js +1 -0
  316. package/dist/web/dist/assets/typescript-BPQ3VLAy.js +1 -0
  317. package/dist/web/dist/assets/typespec-BGHnOYBU.js +1 -0
  318. package/dist/web/dist/assets/typst-DHCkPAjA.js +1 -0
  319. package/dist/web/dist/assets/v-BcVCzyr7.js +1 -0
  320. package/dist/web/dist/assets/vala-CsfeWuGM.js +1 -0
  321. package/dist/web/dist/assets/vb-D17OF-Vu.js +1 -0
  322. package/dist/web/dist/assets/vendor-charts-CfOL2F-E.js +6 -0
  323. package/dist/web/dist/assets/vendor-react-B0mWfPOm.js +60 -0
  324. package/dist/web/dist/assets/vendor-viem-wp7lz4Hc.js +22 -0
  325. package/dist/web/dist/assets/verilog-BQ8w6xss.js +1 -0
  326. package/dist/web/dist/assets/vesper-DU1UobuO.js +1 -0
  327. package/dist/web/dist/assets/vhdl-CeAyd5Ju.js +1 -0
  328. package/dist/web/dist/assets/viml-CJc9bBzg.js +1 -0
  329. package/dist/web/dist/assets/vitesse-black-Bkuqu6BP.js +1 -0
  330. package/dist/web/dist/assets/vitesse-dark-D0r3Knsf.js +1 -0
  331. package/dist/web/dist/assets/vitesse-light-CVO1_9PV.js +1 -0
  332. package/dist/web/dist/assets/vue-DN_0RTcg.js +1 -0
  333. package/dist/web/dist/assets/vue-html-AaS7Mt5G.js +1 -0
  334. package/dist/web/dist/assets/vue-vine-CQOfvN7w.js +1 -0
  335. package/dist/web/dist/assets/vyper-CDx5xZoG.js +1 -0
  336. package/dist/web/dist/assets/wasm-CG6Dc4jp.js +1 -0
  337. package/dist/web/dist/assets/wasm-MzD3tlZU.js +1 -0
  338. package/dist/web/dist/assets/welcome-illustration-B8_SJ7In.svg +319 -0
  339. package/dist/web/dist/assets/wenyan-BV7otONQ.js +1 -0
  340. package/dist/web/dist/assets/wgsl-Dx-B1_4e.js +1 -0
  341. package/dist/web/dist/assets/wikitext-BhOHFoWU.js +1 -0
  342. package/dist/web/dist/assets/wit-5i3qLPDT.js +1 -0
  343. package/dist/web/dist/assets/wolfram-lXgVvXCa.js +1 -0
  344. package/dist/web/dist/assets/xml-sdJ4AIDG.js +1 -0
  345. package/dist/web/dist/assets/xsl-CtQFsRM5.js +1 -0
  346. package/dist/web/dist/assets/yaml-Buea-lGh.js +1 -0
  347. package/dist/web/dist/assets/zenscript-DVFEvuxE.js +1 -0
  348. package/dist/web/dist/assets/zig-VOosw3JB.js +1 -0
  349. package/dist/web/dist/favicon.svg +4 -0
  350. package/dist/web/dist/index.html +18 -0
  351. package/package.json +73 -0
@@ -0,0 +1,213 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Minimal validator for Ghost skill folders.
4
+ """
5
+
6
+ import re
7
+ import sys
8
+ from pathlib import Path
9
+ from typing import Optional
10
+
11
+ try:
12
+ import yaml
13
+ except ModuleNotFoundError:
14
+ yaml = None
15
+
16
+ MAX_SKILL_NAME_LENGTH = 64
17
+ ALLOWED_FRONTMATTER_KEYS = {
18
+ "name",
19
+ "description",
20
+ "metadata",
21
+ "always",
22
+ "license",
23
+ "allowed-tools",
24
+ }
25
+ ALLOWED_RESOURCE_DIRS = {"scripts", "references", "assets"}
26
+ PLACEHOLDER_MARKERS = ("[todo", "todo:")
27
+
28
+
29
+ def _extract_frontmatter(content: str) -> Optional[str]:
30
+ lines = content.splitlines()
31
+ if not lines or lines[0].strip() != "---":
32
+ return None
33
+ for i in range(1, len(lines)):
34
+ if lines[i].strip() == "---":
35
+ return "\n".join(lines[1:i])
36
+ return None
37
+
38
+
39
+ def _parse_simple_frontmatter(frontmatter_text: str) -> Optional[dict[str, str]]:
40
+ """Fallback parser for simple frontmatter when PyYAML is unavailable."""
41
+ parsed: dict[str, str] = {}
42
+ current_key: Optional[str] = None
43
+ multiline_key: Optional[str] = None
44
+
45
+ for raw_line in frontmatter_text.splitlines():
46
+ stripped = raw_line.strip()
47
+ if not stripped or stripped.startswith("#"):
48
+ continue
49
+
50
+ is_indented = raw_line[:1].isspace()
51
+ if is_indented:
52
+ if current_key is None:
53
+ return None
54
+ current_value = parsed[current_key]
55
+ parsed[current_key] = f"{current_value}\n{stripped}" if current_value else stripped
56
+ continue
57
+
58
+ if ":" not in stripped:
59
+ return None
60
+
61
+ key, value = stripped.split(":", 1)
62
+ key = key.strip()
63
+ value = value.strip()
64
+ if not key:
65
+ return None
66
+
67
+ if value in {"|", ">"}:
68
+ parsed[key] = ""
69
+ current_key = key
70
+ multiline_key = key
71
+ continue
72
+
73
+ if (value.startswith('"') and value.endswith('"')) or (
74
+ value.startswith("'") and value.endswith("'")
75
+ ):
76
+ value = value[1:-1]
77
+ parsed[key] = value
78
+ current_key = key
79
+ multiline_key = None
80
+
81
+ if multiline_key is not None and multiline_key not in parsed:
82
+ return None
83
+ return parsed
84
+
85
+
86
+ def _load_frontmatter(frontmatter_text: str) -> tuple[Optional[dict], Optional[str]]:
87
+ if yaml is not None:
88
+ try:
89
+ frontmatter = yaml.safe_load(frontmatter_text)
90
+ except yaml.YAMLError as exc:
91
+ return None, f"Invalid YAML in frontmatter: {exc}"
92
+ if not isinstance(frontmatter, dict):
93
+ return None, "Frontmatter must be a YAML dictionary"
94
+ return frontmatter, None
95
+
96
+ frontmatter = _parse_simple_frontmatter(frontmatter_text)
97
+ if frontmatter is None:
98
+ return None, "Invalid YAML in frontmatter: unsupported syntax without PyYAML installed"
99
+ return frontmatter, None
100
+
101
+
102
+ def _validate_skill_name(name: str, folder_name: str) -> Optional[str]:
103
+ if not re.fullmatch(r"[a-z0-9]+(?:-[a-z0-9]+)*", name):
104
+ return (
105
+ f"Name '{name}' should be hyphen-case "
106
+ "(lowercase letters, digits, and single hyphens only)"
107
+ )
108
+ if len(name) > MAX_SKILL_NAME_LENGTH:
109
+ return (
110
+ f"Name is too long ({len(name)} characters). "
111
+ f"Maximum is {MAX_SKILL_NAME_LENGTH} characters."
112
+ )
113
+ if name != folder_name:
114
+ return f"Skill name '{name}' must match directory name '{folder_name}'"
115
+ return None
116
+
117
+
118
+ def _validate_description(description: str) -> Optional[str]:
119
+ trimmed = description.strip()
120
+ if not trimmed:
121
+ return "Description cannot be empty"
122
+ lowered = trimmed.lower()
123
+ if any(marker in lowered for marker in PLACEHOLDER_MARKERS):
124
+ return "Description still contains TODO placeholder text"
125
+ if "<" in trimmed or ">" in trimmed:
126
+ return "Description cannot contain angle brackets (< or >)"
127
+ if len(trimmed) > 1024:
128
+ return f"Description is too long ({len(trimmed)} characters). Maximum is 1024 characters."
129
+ return None
130
+
131
+
132
+ def validate_skill(skill_path):
133
+ """Validate a skill folder structure and required frontmatter."""
134
+ skill_path = Path(skill_path).resolve()
135
+
136
+ if not skill_path.exists():
137
+ return False, f"Skill folder not found: {skill_path}"
138
+ if not skill_path.is_dir():
139
+ return False, f"Path is not a directory: {skill_path}"
140
+
141
+ skill_md = skill_path / "SKILL.md"
142
+ if not skill_md.exists():
143
+ return False, "SKILL.md not found"
144
+
145
+ try:
146
+ content = skill_md.read_text(encoding="utf-8")
147
+ except OSError as exc:
148
+ return False, f"Could not read SKILL.md: {exc}"
149
+
150
+ frontmatter_text = _extract_frontmatter(content)
151
+ if frontmatter_text is None:
152
+ return False, "Invalid frontmatter format"
153
+
154
+ frontmatter, error = _load_frontmatter(frontmatter_text)
155
+ if error:
156
+ return False, error
157
+
158
+ unexpected_keys = sorted(set(frontmatter.keys()) - ALLOWED_FRONTMATTER_KEYS)
159
+ if unexpected_keys:
160
+ allowed = ", ".join(sorted(ALLOWED_FRONTMATTER_KEYS))
161
+ unexpected = ", ".join(unexpected_keys)
162
+ return (
163
+ False,
164
+ f"Unexpected key(s) in SKILL.md frontmatter: {unexpected}. Allowed properties are: {allowed}",
165
+ )
166
+
167
+ if "name" not in frontmatter:
168
+ return False, "Missing 'name' in frontmatter"
169
+ if "description" not in frontmatter:
170
+ return False, "Missing 'description' in frontmatter"
171
+
172
+ name = frontmatter["name"]
173
+ if not isinstance(name, str):
174
+ return False, f"Name must be a string, got {type(name).__name__}"
175
+ name_error = _validate_skill_name(name.strip(), skill_path.name)
176
+ if name_error:
177
+ return False, name_error
178
+
179
+ description = frontmatter["description"]
180
+ if not isinstance(description, str):
181
+ return False, f"Description must be a string, got {type(description).__name__}"
182
+ description_error = _validate_description(description)
183
+ if description_error:
184
+ return False, description_error
185
+
186
+ always = frontmatter.get("always")
187
+ if always is not None and not isinstance(always, bool):
188
+ return False, f"'always' must be a boolean, got {type(always).__name__}"
189
+
190
+ for child in skill_path.iterdir():
191
+ if child.name == "SKILL.md":
192
+ continue
193
+ if child.is_dir() and child.name in ALLOWED_RESOURCE_DIRS:
194
+ continue
195
+ if child.is_symlink():
196
+ continue
197
+ return (
198
+ False,
199
+ f"Unexpected file or directory in skill root: {child.name}. "
200
+ "Only SKILL.md, scripts/, references/, and assets/ are allowed.",
201
+ )
202
+
203
+ return True, "Skill is valid!"
204
+
205
+
206
+ if __name__ == "__main__":
207
+ if len(sys.argv) != 2:
208
+ print("Usage: python quick_validate.py <skill_directory>")
209
+ sys.exit(1)
210
+
211
+ valid, message = validate_skill(sys.argv[1])
212
+ print(message)
213
+ sys.exit(0 if valid else 1)
@@ -0,0 +1,56 @@
1
+ ---
2
+ name: skills-sh
3
+ description: "Search and install agent skills from skills.sh, the open skill directory. Triggers: find a skill, search skills, install skill, skills.sh, skill directory"
4
+ metadata: {"ghost":{"emoji":"🔮","requires":{"bins":["npx"]}}}
5
+ ---
6
+
7
+ # skills.sh
8
+
9
+ Open skill directory for AI agents (91,000+ skills). Search by keyword.
10
+
11
+ ## When to use
12
+
13
+ Use this skill when the user asks any of:
14
+ - "find a skill on skills.sh"
15
+ - "search skills.sh"
16
+ - "install a skill from skills.sh"
17
+ - "what skills are on skills.sh?"
18
+
19
+ ## Search
20
+
21
+ ```bash
22
+ npx --yes skills find react
23
+ ```
24
+
25
+ ## Install
26
+
27
+ **Step 1:** Install the skill globally:
28
+ ```bash
29
+ npx --yes skills add <owner/repo@skill-name> -g -y --copy
30
+ ```
31
+
32
+ **Step 2:** Move to Ghost workspace. The CLI installs to `$HOME/.agents/skills/` or `$HOME/.claude/skills/` depending on the detected agent. Check which one has the skill, then move:
33
+ ```bash
34
+ mv $HOME/.agents/skills/<skill-name> $HOME/.ghost/workspace/skills/ 2>/dev/null || mv $HOME/.claude/skills/<skill-name> $HOME/.ghost/workspace/skills/
35
+ ```
36
+
37
+ Replace `<owner/repo@skill-name>` with the source from search results. Replace `<skill-name>` with the installed directory name.
38
+
39
+ ## List installed (skills.sh registry)
40
+
41
+ ```bash
42
+ npx --yes skills list -g
43
+ ```
44
+
45
+ ## Update
46
+
47
+ ```bash
48
+ npx --yes skills update
49
+ ```
50
+
51
+ ## Notes
52
+
53
+ - Requires Node.js (`npx` comes with it).
54
+ - No API key needed for search and install.
55
+ - Always use `-g --copy` flags to install globally with real files (not symlinks).
56
+ - The CLI may install to `$HOME/.agents/skills/` or `$HOME/.claude/skills/` — always check both and move to `$HOME/.ghost/workspace/skills/`.
@@ -0,0 +1,242 @@
1
+ ---
2
+ name: technical-analysis
3
+ description: "Technical chart analysis — read indicators and levels, then share your view. Triggers: technical analysis, chart analysis, EMA, RSI, MACD, support, resistance, trend, levels, key levels, Ichimoku, Bollinger, Fibonacci, pivot, squeeze, ADX, ATR."
4
+ ---
5
+
6
+ # Technical Analysis
7
+
8
+ Read the chart and tell the trader what you see — with a clear view, not a data dump.
9
+
10
+ ## When to Activate
11
+
12
+ - "How does BTC look technically?"
13
+ - "Technical analysis on ETH"
14
+ - "Where's BTC support/resistance?"
15
+ - "Is BTC trending or sideways?"
16
+
17
+ ## Gather Data
18
+
19
+ Call in parallel:
20
+
21
+ ```
22
+ ghost_get_indicators(symbol, interval) → trend, momentum, volatility, volume
23
+ ghost_get_levels(symbol, interval) → S/R levels
24
+ ghost_get_price(symbol) → current price
25
+ ```
26
+
27
+ Default: 4h for structure. Add 1h if trader asks about short-term. Add 1d for big picture.
28
+
29
+ ## How to Analyze
30
+
31
+ **Step 1 — Form your view:** Look at all the data. What's the overall picture? Trending up, down, or sideways? Where is price relative to key levels? Any extreme signals?
32
+
33
+ **Step 2 — Pick what matters:** From 15 indicators and multiple levels, select the 3-5 data points that tell the story. Skip everything else.
34
+
35
+ **Step 3 — State your view clearly:** Lead with your conclusion. Then show the supporting data.
36
+
37
+ ## How to Communicate
38
+
39
+ **Lead with the view, support with data.** Don't list all indicators. Don't categorize levels as "Psychological", "Minor", "Immediate" — just say what matters.
40
+
41
+ **Keep it scannable — one idea per paragraph.** Don't chain 4 indicators into one dense block. Break after your view, after indicator data, after levels, and after your recommendation. Each paragraph should be 1-3 sentences max. Short paragraphs with whitespace between them are far easier to scan than a wall of text.
42
+
43
+ Good (note: indicator names wrapped in `<ind>`, price levels wrapped in `<lvl>` — see Indicator Mentions and Level Mentions sections):
44
+
45
+ ```
46
+ BTC is in a 4h downtrend — price below <ind name="ema">EMA50 and EMA200</ind>. <ind name="adx">ADX 32</ind> shows decent trend strength.
47
+
48
+ Nearest support at <lvl price="65000">$65,000</lvl> has been tested 3 times. If <lvl price="65000">$65k</lvl> breaks, next zone is $63,000-$64,000. Resistance above at <lvl price="68500">$68,500</lvl>.
49
+
50
+ <chart symbol="BTC" interval="4h" indicators="adx" levels="65000,68500" />
51
+ ```
52
+
53
+ ```
54
+ ETH has been sideways for 3 days, <ind name="bb">Bollinger Bands</ind> are squeezing — a big move is building. <ind name="rsi">RSI 48</ind>, neutral.
55
+
56
+ Wait for a clear breakout direction before entering.
57
+
58
+ <chart symbol="ETH" interval="4h" indicators="bb,rsi" />
59
+ ```
60
+
61
+ ```
62
+ SOL is retesting the daily <ind name="ema">EMA200</ind> at <lvl price="180">$180</lvl>. <ind name="rsi">RSI 35</ind>, near oversold.
63
+
64
+ If it holds the <ind name="ema">EMA200</ind>, this could be a decent entry point toward <lvl price="195">$195</lvl>.
65
+
66
+ <chart symbol="SOL" interval="1d" indicators="rsi" levels="180,195" />
67
+ ```
68
+
69
+ Bad:
70
+ - Tables listing every S/R level with categories (Psychological, Minor, Major, Immediate, Key)
71
+ - Listing all 15 indicators in a report format
72
+ - "Bullish Score: 7/10"
73
+ - "TECHNICAL ANALYSIS REPORT"
74
+ - Dumping raw numbers without a conclusion
75
+
76
+ ## S/R Levels
77
+
78
+ **Don't list all levels.** Pick the 1-2 most relevant:
79
+ - The nearest strong support below (for longs: where to SL)
80
+ - The nearest strong resistance above (for longs: target / for shorts: where to SL)
81
+ - Mention price distance naturally: "$65,000 support is 2.5% below"
82
+
83
+ ## Boundaries
84
+
85
+ - Have a view, but don't say "buy" or "sell". Say "bullish setup", "risky entry here", "could be a good entry".
86
+ - Don't predict exact moves. "RSI oversold, could bounce" — not "will bounce to $70k".
87
+ - Insufficient data (< 30 candles): say so.
88
+
89
+ ## Chart Visualization
90
+
91
+ `<chart>` tags render as a clickable pill inside the message bubble
92
+ (e.g. "BTC · 4h →"). Clicking the pill opens the full interactive
93
+ chart as a fullscreen overlay — that's the reading surface.
94
+
95
+ **This means**: the pill IS the render. It is always visible when the
96
+ tag is well-formed. If a trader ever says "the chart isn't showing" or
97
+ "can't see it", DO NOT apologise or blame a "frontend issue" — tell
98
+ them to click the pill to open the fullscreen view. The pill is how
99
+ charts have always rendered; there's no inline chart.
100
+
101
+ ### Chart emission
102
+
103
+ Every TA response MUST end with one `<chart ... />` self-closing tag on the very last line. No text after the tag.
104
+
105
+ **You MUST write at least one sentence of prose before the tag — a bare-pill response (chart tag with no text) reads as the assistant refusing to answer.** If the user only says "show chart BTC 4h" and you have nothing analytical to add, still write one short framing line before the tag (e.g. "BTC 4h — latest candles with EMAs and levels marked."). Never ship a response whose only visible content is the pill.
106
+
107
+ Every `<ind name="X">` you write MUST appear in the chart's `indicators="..."`. Every `<lvl price="Y">` MUST appear in `levels="..."`. Before sending, if the last line isn't `<chart .../>` and you wrote any `<ind>` or `<lvl>`, stop and add it.
108
+
109
+ This emission rule is the master contract — other skills (position-monitor, pre-trade-advisory, risk-manager, briefing) point back here.
110
+
111
+ ### When to Include
112
+
113
+ - Full technical analysis → YES (one chart is enough)
114
+ - Quick price check → NO
115
+ - Discussing specific patterns, levels, setups → YES
116
+ - Simple trend answer → NO
117
+
118
+ ### How to Emit
119
+
120
+ **ALWAYS place chart tags at the very end of your response — after ALL text.** Never put text after chart tags.
121
+
122
+ Your analysis text here...
123
+
124
+ <chart symbol="ETH" interval="4h" indicators="rsi"
125
+ levels="2400,2650"
126
+ focus-time="2026-04-01,2026-04-11"
127
+ focus-price="2350,2700" />
128
+
129
+ ### Attributes
130
+
131
+ - symbol (required): the asset
132
+ - interval: match timeframe you're discussing. Default 4h.
133
+ - indicators: which extras to fetch alongside base EMAs. Include every
134
+ indicator you reference in text so `<ind>` mentions have data to hover/click.
135
+ Main pane overlays: bb, ichimoku, keltner, vwap.
136
+ Sub-pane indicators: rsi, macd, adx, stochrsi, obv, williamsr, cci, atr.
137
+ No per-chart limit — the pill shows the count, and fullscreen-on-click
138
+ renders all indicators.
139
+ - levels: the 1-3 key S/R prices you highlight in text. Do NOT list every level — pick only the ones central to your thesis.
140
+ - focus-time: start,end dates — frame the time period of the pattern.
141
+ - focus-price: low,high prices — frame the price zone around key levels.
142
+
143
+ ### Rules — KEEP CHARTS CLEAN
144
+
145
+ - **Default chart = candles + EMAs + levels.** No extra indicators unless you discuss them.
146
+ - **ONE sub-pane indicator per chart.** Never combine rsi + macd + adx in one tag. If you discuss RSI divergence AND MACD crossover, use two separate chart tags.
147
+ - **ONE overlay per chart.** Don't stack bb + ichimoku + keltner.
148
+ - **Max 3 levels.** Pick the 1-3 S/R levels most relevant to your thesis. The backend already filters, but don't overload the `levels` attribute either.
149
+ - **Split by story, not by indicator count.** One chart showing the main setup is usually enough. Only add a second chart when you explicitly discuss a different indicator.
150
+ - Only include indicators you discuss in text.
151
+ - focus frames the story — zoom to where the action is.
152
+
153
+ ## Indicator Mentions (`<ind>`) — MANDATORY
154
+
155
+ **Every** indicator name you write in TA prose MUST be wrapped in `<ind name="...">` tags. **Every** indicator you wrap MUST also appear in your `<chart indicators="...">` attribute (so the data is fetched). The web UI renders each mention as a hoverable + clickable chart preview. Skipping a wrap or leaving an indicator out of the chart attribute = the trader loses the preview = defect.
156
+
157
+ Treat this as a strict output contract: count the indicator names in your draft prose, then count `<ind>` tags — they must match.
158
+
159
+ ### Allowed names (strict whitelist)
160
+
161
+ `ema`, `bb`, `ichimoku`, `keltner`, `vwap` (overlays), `rsi`, `macd`, `adx`, `stochrsi`, `obv`, `williamsr`, `cci`, `atr` (sub-panes)
162
+
163
+ ### Rules
164
+
165
+ - MANDATORY: every indicator name in prose MUST be wrapped — no exceptions, even brief mentions ("OBV is falling" → `<ind name="obv">OBV</ind> is falling`). This includes section labels and bullet starts: "Ichimoku: price above cloud" → `<ind name="ichimoku">Ichimoku</ind>: price above cloud`. "MACD histogram positive" → `<ind name="macd">MACD</ind> histogram positive`.
166
+ - MANDATORY: every wrapped indicator MUST be in your `<chart indicators="...">` attribute. If you mention 7 indicators, your chart attribute lists all 7.
167
+ - Wrap the shortest meaningful phrase (e.g. `<ind name="rsi">RSI 48</ind>`, not `<ind name="rsi">RSI 48 is neutral</ind>`).
168
+ - Use `<ind>` inline within prose — never on its own line.
169
+ - One `<ind>` per indicator mention. Don't nest tags.
170
+ - `<ind name="ema">` groups all EMAs (21/50/200) — no per-period tags. "All four EMAs", "EMA 50", "EMAs stacked bullish" all use `name="ema"`.
171
+ - If no `<chart>` tag in the message, don't use `<ind>` — they need chart data.
172
+
173
+ ### Good — every indicator wrapped, all listed in chart
174
+
175
+ ```
176
+ LINK is decisively weak — below all four <ind name="ema">EMAs</ind> with the bearish stack, below <ind name="ichimoku">Ichimoku cloud</ind>, and <ind name="vwap">VWAP</ind> overhead at <price>$9.06</price>.
177
+
178
+ Oscillators are oversold: <ind name="stochrsi">StochRSI</ind> 9.5/9.9, <ind name="williamsr">Williams %R</ind> -94.4, <ind name="cci">CCI</ind> -97.7. <ind name="rsi">RSI</ind> 41.9 also low.
179
+
180
+ <ind name="adx">ADX</ind> 13.7 — no trend. <ind name="obv">OBV</ind> falling confirms the weakness.
181
+
182
+ <chart symbol="LINK" interval="4h" indicators="ema,ichimoku,vwap,stochrsi,williamsr,cci,rsi,adx,obv" levels="8.72,9.06" />
183
+ ```
184
+
185
+ Count check: 9 indicator names in prose ↔ 9 `<ind>` tags ↔ 9 names in `indicators=`.
186
+
187
+ ### Bad
188
+
189
+ ```
190
+ <!-- Don't mention an indicator without wrapping (loses preview) -->
191
+ RSI 38 is neutral-bearish.
192
+ <chart symbol="BTC" interval="4h" indicators="rsi" />
193
+
194
+ <!-- Don't use <ind> for indicators not in chart's indicators= attribute -->
195
+ <ind name="ichimoku">Ichimoku</ind> looks bearish.
196
+ <chart symbol="BTC" interval="4h" indicators="rsi" />
197
+
198
+ <!-- Don't use unknown names -->
199
+ <ind name="fibonacci">Fibonacci</ind>
200
+
201
+ <!-- Don't use <ind> without a <chart> tag -->
202
+ <ind name="rsi">RSI</ind> is at 70.
203
+ ```
204
+
205
+ ## Level Mentions (`<lvl>`)
206
+
207
+ **ALWAYS wrap price levels in `<lvl price="...">` tags** when you mention a price that appears in your `<chart levels="...">` attribute. The web UI renders a hoverable mini-chart with a highlighted horizontal line at that price. Supports/resistance detected in the backend get colored automatically (green/red); other prices show as neutral.
208
+
209
+ ### Rules
210
+
211
+ - Wrap the visible price text (e.g. `<lvl price="65000">$65,000</lvl>`) — the `price` attribute must be the raw number without `$`, commas, or suffixes.
212
+ - Only wrap levels that are in your `<chart levels="...">` list — if not in the chart, leave as plain text.
213
+ - Use for: support, resistance, Fibonacci retracements, pivot points, swing highs/lows — any price-level discussion.
214
+ - You may wrap the SAME price multiple times in the same response (every mention is independent).
215
+ - Accept formats inside the tag: `$65,000`, `$65k`, `65,000`, `65000` — all fine as display text. The `price` attribute stays `65000`.
216
+
217
+ ### Good
218
+
219
+ ```
220
+ Support at <lvl price="65000">$65,000</lvl> has held 3 times. Break below opens up <lvl price="62500">$62,500</lvl>.
221
+
222
+ <chart symbol="BTC" interval="4h" indicators="adx" levels="65000,62500,68500" />
223
+ ```
224
+
225
+ ### Bad
226
+
227
+ ```
228
+ <!-- Don't wrap prices that aren't in the chart's levels attribute -->
229
+ Support at <lvl price="65000">$65,000</lvl>.
230
+ <chart symbol="BTC" interval="4h" levels="68500" />
231
+
232
+ <!-- Don't include formatting in the price attribute -->
233
+ <lvl price="$65,000">$65,000</lvl> (wrong — use price="65000")
234
+ ```
235
+
236
+ ## Tools
237
+
238
+ ```
239
+ ghost_get_indicators(symbol, interval?, indicators?)
240
+ ghost_get_levels(symbol, interval?, lookback?, method?)
241
+ ghost_get_price(symbol)
242
+ ```