@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.
- package/LICENSE +21 -0
- package/README.md +91 -0
- package/dist/index.js +220545 -0
- package/dist/package.json +4 -0
- package/dist/skills/builtin/briefing/SKILL.md +77 -0
- package/dist/skills/builtin/clawhub/SKILL.md +50 -0
- package/dist/skills/builtin/event-judge/SKILL.md +122 -0
- package/dist/skills/builtin/market-intel/SKILL.md +160 -0
- package/dist/skills/builtin/position-monitor/SKILL.md +84 -0
- package/dist/skills/builtin/pre-trade-advisory/SKILL.md +203 -0
- package/dist/skills/builtin/risk-manager/SKILL.md +124 -0
- package/dist/skills/builtin/skill-creator/SKILL.md +68 -0
- package/dist/skills/builtin/skill-creator/references/guide.md +158 -0
- package/dist/skills/builtin/skill-creator/scripts/init_skill.py +378 -0
- package/dist/skills/builtin/skill-creator/scripts/package_skill.py +154 -0
- package/dist/skills/builtin/skill-creator/scripts/quick_validate.py +213 -0
- package/dist/skills/builtin/skills-sh/SKILL.md +56 -0
- package/dist/skills/builtin/technical-analysis/SKILL.md +242 -0
- package/dist/skills/builtin/trade-executor/SKILL.md +179 -0
- package/dist/templates/SOUL.md +73 -0
- package/dist/web/dist/assets/Chart-DwirCj9o.js +1 -0
- package/dist/web/dist/assets/Config-Csnvaqpn.js +1 -0
- package/dist/web/dist/assets/Cost-BSD_2GYX.js +6 -0
- package/dist/web/dist/assets/Cron-BVKdKUFN.js +16 -0
- package/dist/web/dist/assets/Dashboard-Ccr5J95V.js +21 -0
- package/dist/web/dist/assets/Logs-CUgA7IGb.js +21 -0
- package/dist/web/dist/assets/Memory-C_Q_iNlN.js +12 -0
- package/dist/web/dist/assets/SF-Pro-Display-Bold-CkqE-6tD.otf +0 -0
- package/dist/web/dist/assets/SF-Pro-Display-Medium-DSttQARu.otf +0 -0
- package/dist/web/dist/assets/SF-Pro-Display-Regular-DF_3XEGl.otf +0 -0
- package/dist/web/dist/assets/SF-Pro-Display-Semibold-Dg2-djaL.otf +0 -0
- package/dist/web/dist/assets/Sessions-KDhnYDnX.js +11 -0
- package/dist/web/dist/assets/Skills-BK-V7HFa.js +1 -0
- package/dist/web/dist/assets/Tools-a3aqqugu.js +1 -0
- package/dist/web/dist/assets/abap-BdImnpbu.js +1 -0
- package/dist/web/dist/assets/actionscript-3-CoDkCxhg.js +1 -0
- package/dist/web/dist/assets/activity-DsxRdk-G.js +6 -0
- package/dist/web/dist/assets/ada-bCR0ucgS.js +1 -0
- package/dist/web/dist/assets/andromeeda-C4gqWexZ.js +1 -0
- package/dist/web/dist/assets/angular-html-CU67Zn6k.js +1 -0
- package/dist/web/dist/assets/angular-ts-BwZT4LLn.js +1 -0
- package/dist/web/dist/assets/apache-Pmp26Uib.js +1 -0
- package/dist/web/dist/assets/apex-D8_7TLub.js +1 -0
- package/dist/web/dist/assets/apl-dKokRX4l.js +1 -0
- package/dist/web/dist/assets/applescript-Co6uUVPk.js +1 -0
- package/dist/web/dist/assets/ara-BRHolxvo.js +1 -0
- package/dist/web/dist/assets/asciidoc-Ve4PFQV2.js +1 -0
- package/dist/web/dist/assets/asm-D_Q5rh1f.js +1 -0
- package/dist/web/dist/assets/astro-CbQHKStN.js +1 -0
- package/dist/web/dist/assets/aurora-x-D-2ljcwZ.js +1 -0
- package/dist/web/dist/assets/awk-DMzUqQB5.js +1 -0
- package/dist/web/dist/assets/ayu-dark-DYE7WIF3.js +1 -0
- package/dist/web/dist/assets/ayu-light-BA47KaF1.js +1 -0
- package/dist/web/dist/assets/ayu-mirage-32ctXXKs.js +1 -0
- package/dist/web/dist/assets/ballerina-BFfxhgS-.js +1 -0
- package/dist/web/dist/assets/bat-BkioyH1T.js +1 -0
- package/dist/web/dist/assets/beancount-k_qm7-4y.js +1 -0
- package/dist/web/dist/assets/berry-uYugtg8r.js +1 -0
- package/dist/web/dist/assets/bibtex-CHM0blh-.js +1 -0
- package/dist/web/dist/assets/bicep-Bmn6On1c.js +1 -0
- package/dist/web/dist/assets/bird2-DPOp833l.js +1 -0
- package/dist/web/dist/assets/blade-D4QpJJKB.js +1 -0
- package/dist/web/dist/assets/bsl-BO_Y6i37.js +1 -0
- package/dist/web/dist/assets/c-BIGW1oBm.js +1 -0
- package/dist/web/dist/assets/c3-eo99z4R2.js +1 -0
- package/dist/web/dist/assets/cadence-Bv_4Rxtq.js +1 -0
- package/dist/web/dist/assets/cairo-KRGpt6FW.js +1 -0
- package/dist/web/dist/assets/catppuccin-frappe-DFWUc33u.js +1 -0
- package/dist/web/dist/assets/catppuccin-latte-C9dUb6Cb.js +1 -0
- package/dist/web/dist/assets/catppuccin-macchiato-DQyhUUbL.js +1 -0
- package/dist/web/dist/assets/catppuccin-mocha-D87Tk5Gz.js +1 -0
- package/dist/web/dist/assets/clarity-D53aC0YG.js +1 -0
- package/dist/web/dist/assets/clock-DCbfDkWu.js +6 -0
- package/dist/web/dist/assets/clojure-P80f7IUj.js +1 -0
- package/dist/web/dist/assets/cmake-D1j8_8rp.js +1 -0
- package/dist/web/dist/assets/cobol-nwyudZeR.js +1 -0
- package/dist/web/dist/assets/codeowners-Bp6g37R7.js +1 -0
- package/dist/web/dist/assets/codeql-DsOJ9woJ.js +1 -0
- package/dist/web/dist/assets/coffee-Ch7k5sss.js +1 -0
- package/dist/web/dist/assets/common-lisp-Cg-RD9OK.js +1 -0
- package/dist/web/dist/assets/coq-DkFqJrB1.js +1 -0
- package/dist/web/dist/assets/cpp-CofmeUqb.js +1 -0
- package/dist/web/dist/assets/crystal-tKQVLTB8.js +1 -0
- package/dist/web/dist/assets/csharp-COcwbKMJ.js +1 -0
- package/dist/web/dist/assets/css-DPfMkruS.js +1 -0
- package/dist/web/dist/assets/csv-fuZLfV_i.js +1 -0
- package/dist/web/dist/assets/cue-D82EKSYY.js +1 -0
- package/dist/web/dist/assets/cypher-COkxafJQ.js +1 -0
- package/dist/web/dist/assets/d-85-TOEBH.js +1 -0
- package/dist/web/dist/assets/dark-plus-C3mMm8J8.js +1 -0
- package/dist/web/dist/assets/dart-CF10PKvl.js +1 -0
- package/dist/web/dist/assets/dax-CEL-wOlO.js +1 -0
- package/dist/web/dist/assets/desktop-BmXAJ9_W.js +1 -0
- package/dist/web/dist/assets/diff-D97Zzqfu.js +1 -0
- package/dist/web/dist/assets/docker-BcOcwvcX.js +1 -0
- package/dist/web/dist/assets/dotenv-Da5cRb03.js +1 -0
- package/dist/web/dist/assets/dracula-BzJJZx-M.js +1 -0
- package/dist/web/dist/assets/dracula-soft-BXkSAIEj.js +1 -0
- package/dist/web/dist/assets/dream-maker-BtqSS_iP.js +1 -0
- package/dist/web/dist/assets/edge-BkV0erSs.js +1 -0
- package/dist/web/dist/assets/elixir-CDX3lj18.js +1 -0
- package/dist/web/dist/assets/elm-DbKCFpqz.js +1 -0
- package/dist/web/dist/assets/emacs-lisp-C9XAeP06.js +1 -0
- package/dist/web/dist/assets/erb-B12qg9BL.js +1 -0
- package/dist/web/dist/assets/erlang-DsQrWhSR.js +1 -0
- package/dist/web/dist/assets/everforest-dark-BgDCqdQA.js +1 -0
- package/dist/web/dist/assets/everforest-light-C8M2exoo.js +1 -0
- package/dist/web/dist/assets/fennel-BYunw83y.js +1 -0
- package/dist/web/dist/assets/fish-BvzEVeQv.js +1 -0
- package/dist/web/dist/assets/fluent-C4IJs8-o.js +1 -0
- package/dist/web/dist/assets/fortran-fixed-form-CkoXwp7k.js +1 -0
- package/dist/web/dist/assets/fortran-free-form-BxgE0vQu.js +1 -0
- package/dist/web/dist/assets/fsharp-CXgrBDvD.js +1 -0
- package/dist/web/dist/assets/gdresource-BOOCDP_w.js +1 -0
- package/dist/web/dist/assets/gdscript-C5YyOfLZ.js +1 -0
- package/dist/web/dist/assets/gdshader-DkwncUOv.js +1 -0
- package/dist/web/dist/assets/genie-D0YGMca9.js +1 -0
- package/dist/web/dist/assets/gherkin-DyxjwDmM.js +1 -0
- package/dist/web/dist/assets/ghost-symbol-xItVvoCA.svg +5 -0
- package/dist/web/dist/assets/git-commit-F4YmCXRG.js +1 -0
- package/dist/web/dist/assets/git-rebase-r7XF79zn.js +1 -0
- package/dist/web/dist/assets/github-dark-DHJKELXO.js +1 -0
- package/dist/web/dist/assets/github-dark-default-Cuk6v7N8.js +1 -0
- package/dist/web/dist/assets/github-dark-dimmed-DH5Ifo-i.js +1 -0
- package/dist/web/dist/assets/github-dark-high-contrast-E3gJ1_iC.js +1 -0
- package/dist/web/dist/assets/github-light-DAi9KRSo.js +1 -0
- package/dist/web/dist/assets/github-light-default-D7oLnXFd.js +1 -0
- package/dist/web/dist/assets/github-light-high-contrast-BfjtVDDH.js +1 -0
- package/dist/web/dist/assets/gleam-BspZqrRM.js +1 -0
- package/dist/web/dist/assets/glimmer-js-Rg0-pVw9.js +1 -0
- package/dist/web/dist/assets/glimmer-ts-U6CK756n.js +1 -0
- package/dist/web/dist/assets/glsl-DplSGwfg.js +1 -0
- package/dist/web/dist/assets/gn-n2N0HUVH.js +1 -0
- package/dist/web/dist/assets/gnuplot-DdkO51Og.js +1 -0
- package/dist/web/dist/assets/go-CxLEBnE3.js +1 -0
- package/dist/web/dist/assets/graphql-ChdNCCLP.js +1 -0
- package/dist/web/dist/assets/groovy-gcz8RCvz.js +1 -0
- package/dist/web/dist/assets/gruvbox-dark-hard-CFHQjOhq.js +1 -0
- package/dist/web/dist/assets/gruvbox-dark-medium-GsRaNv29.js +1 -0
- package/dist/web/dist/assets/gruvbox-dark-soft-CVdnzihN.js +1 -0
- package/dist/web/dist/assets/gruvbox-light-hard-CH1njM8p.js +1 -0
- package/dist/web/dist/assets/gruvbox-light-medium-DRw_LuNl.js +1 -0
- package/dist/web/dist/assets/gruvbox-light-soft-hJgmCMqR.js +1 -0
- package/dist/web/dist/assets/hack-CaT9iCJl.js +1 -0
- package/dist/web/dist/assets/haml-B8DHNrY2.js +1 -0
- package/dist/web/dist/assets/handlebars-BL8al0AC.js +1 -0
- package/dist/web/dist/assets/haskell-Df6bDoY_.js +1 -0
- package/dist/web/dist/assets/haxe-CzTSHFRz.js +1 -0
- package/dist/web/dist/assets/hcl-BWvSN4gD.js +1 -0
- package/dist/web/dist/assets/highlighted-body-OFNGDK62-C8yP3qbm.js +1 -0
- package/dist/web/dist/assets/hjson-D5-asLiD.js +1 -0
- package/dist/web/dist/assets/hlsl-D3lLCCz7.js +1 -0
- package/dist/web/dist/assets/horizon-BUw7H-hv.js +1 -0
- package/dist/web/dist/assets/horizon-bright-Cn-bp-IR.js +1 -0
- package/dist/web/dist/assets/houston-DnULxvSX.js +1 -0
- package/dist/web/dist/assets/html-GMplVEZG.js +1 -0
- package/dist/web/dist/assets/html-derivative-BFtXZ54Q.js +1 -0
- package/dist/web/dist/assets/http-jrhK8wxY.js +1 -0
- package/dist/web/dist/assets/hurl-irOxFIW8.js +1 -0
- package/dist/web/dist/assets/hxml-Bvhsp5Yf.js +1 -0
- package/dist/web/dist/assets/hy-DFXneXwc.js +1 -0
- package/dist/web/dist/assets/hyperliquid-logo-Blr66fIk.svg +9 -0
- package/dist/web/dist/assets/imba-DGztddWO.js +1 -0
- package/dist/web/dist/assets/index-3q7g734D.js +54 -0
- package/dist/web/dist/assets/index-DRvGorcf.css +1 -0
- package/dist/web/dist/assets/ini-BEwlwnbL.js +1 -0
- package/dist/web/dist/assets/java-CylS5w8V.js +1 -0
- package/dist/web/dist/assets/javascript-wDzz0qaB.js +1 -0
- package/dist/web/dist/assets/jinja-4LBKfQ-Z.js +1 -0
- package/dist/web/dist/assets/jison-wvAkD_A8.js +1 -0
- package/dist/web/dist/assets/json-Cp-IABpG.js +1 -0
- package/dist/web/dist/assets/json5-C9tS-k6U.js +1 -0
- package/dist/web/dist/assets/jsonc-Des-eS-w.js +1 -0
- package/dist/web/dist/assets/jsonl-DcaNXYhu.js +1 -0
- package/dist/web/dist/assets/jsonnet-DFQXde-d.js +1 -0
- package/dist/web/dist/assets/jssm-C2t-YnRu.js +1 -0
- package/dist/web/dist/assets/jsx-g9-lgVsj.js +1 -0
- package/dist/web/dist/assets/julia-CxzCAyBv.js +1 -0
- package/dist/web/dist/assets/just-Cw27pwNe.js +1 -0
- package/dist/web/dist/assets/kanagawa-dragon-CkXjmgJE.js +1 -0
- package/dist/web/dist/assets/kanagawa-lotus-CfQXZHmo.js +1 -0
- package/dist/web/dist/assets/kanagawa-wave-DWedfzmr.js +1 -0
- package/dist/web/dist/assets/kdl-DV7GczEv.js +1 -0
- package/dist/web/dist/assets/kotlin-BdnUsdx6.js +1 -0
- package/dist/web/dist/assets/kusto-DZf3V79B.js +1 -0
- package/dist/web/dist/assets/laserwave-DUszq2jm.js +1 -0
- package/dist/web/dist/assets/latex-CWtU0Tv5.js +1 -0
- package/dist/web/dist/assets/lean-BZvkOJ9d.js +1 -0
- package/dist/web/dist/assets/less-B1dDrJ26.js +1 -0
- package/dist/web/dist/assets/light-plus-B7mTdjB0.js +1 -0
- package/dist/web/dist/assets/liquid-DYVedYrR.js +1 -0
- package/dist/web/dist/assets/llvm-DjAJT7YJ.js +1 -0
- package/dist/web/dist/assets/log-2UxHyX5q.js +1 -0
- package/dist/web/dist/assets/logo-BtOb2qkB.js +1 -0
- package/dist/web/dist/assets/lua-BaeVxFsk.js +1 -0
- package/dist/web/dist/assets/luau-C-HG3fhB.js +1 -0
- package/dist/web/dist/assets/make-CHLpvVh8.js +1 -0
- package/dist/web/dist/assets/markdown-Cvjx9yec.js +1 -0
- package/dist/web/dist/assets/marko-CnJfTvn9.js +1 -0
- package/dist/web/dist/assets/material-theme-D5KoaKCx.js +1 -0
- package/dist/web/dist/assets/material-theme-darker-BfHTSMKl.js +1 -0
- package/dist/web/dist/assets/material-theme-lighter-B0m2ddpp.js +1 -0
- package/dist/web/dist/assets/material-theme-ocean-CyktbL80.js +1 -0
- package/dist/web/dist/assets/material-theme-palenight-Csfq5Kiy.js +1 -0
- package/dist/web/dist/assets/matlab-D7o27uSR.js +1 -0
- package/dist/web/dist/assets/mdc-BMNejdWA.js +1 -0
- package/dist/web/dist/assets/mdx-Cmh6b_Ma.js +1 -0
- package/dist/web/dist/assets/mermaid-GHXKKRXX-CbzD1Jp7.js +282 -0
- package/dist/web/dist/assets/mermaid-mWjccvbQ.js +1 -0
- package/dist/web/dist/assets/min-dark-CafNBF8u.js +1 -0
- package/dist/web/dist/assets/min-light-CTRr51gU.js +1 -0
- package/dist/web/dist/assets/mipsasm-CKIfxQSi.js +1 -0
- package/dist/web/dist/assets/mojo-rZm6bMo-.js +1 -0
- package/dist/web/dist/assets/monokai-D4h5O-jR.js +1 -0
- package/dist/web/dist/assets/moonbit-_H4v1dQx.js +1 -0
- package/dist/web/dist/assets/move-IF9eRakj.js +1 -0
- package/dist/web/dist/assets/narrat-DRg8JJMk.js +1 -0
- package/dist/web/dist/assets/nextflow-Zz6hmt5N.js +1 -0
- package/dist/web/dist/assets/nextflow-groovy-BeH2EWoN.js +1 -0
- package/dist/web/dist/assets/nginx-BpAMiNFr.js +1 -0
- package/dist/web/dist/assets/night-owl-C39BiMTA.js +1 -0
- package/dist/web/dist/assets/night-owl-light-CMTm3GFP.js +1 -0
- package/dist/web/dist/assets/nim-CVrawwO9.js +1 -0
- package/dist/web/dist/assets/nix-CwoSXNpI.js +1 -0
- package/dist/web/dist/assets/nord-Ddv68eIx.js +1 -0
- package/dist/web/dist/assets/nushell-Cz2AlsmD.js +1 -0
- package/dist/web/dist/assets/objective-c-DXmwc3jG.js +1 -0
- package/dist/web/dist/assets/objective-cpp-CLxacb5B.js +1 -0
- package/dist/web/dist/assets/ocaml-C0hk2d4L.js +1 -0
- package/dist/web/dist/assets/odin-BBf5iR-q.js +1 -0
- package/dist/web/dist/assets/one-dark-pro-DVMEJ2y_.js +1 -0
- package/dist/web/dist/assets/one-light-C3Wv6jpd.js +1 -0
- package/dist/web/dist/assets/openscad-C4EeE6gA.js +1 -0
- package/dist/web/dist/assets/pascal-D93ZcfNL.js +1 -0
- package/dist/web/dist/assets/perl-C0TMdlhV.js +1 -0
- package/dist/web/dist/assets/php-Dhbhpdrm.js +1 -0
- package/dist/web/dist/assets/pkl-u5AG7uiY.js +1 -0
- package/dist/web/dist/assets/plastic-3e1v2bzS.js +1 -0
- package/dist/web/dist/assets/plsql-ChMvpjG-.js +1 -0
- package/dist/web/dist/assets/po-BTJTHyun.js +1 -0
- package/dist/web/dist/assets/poimandres-CS3Unz2-.js +1 -0
- package/dist/web/dist/assets/polar-C0HS_06l.js +1 -0
- package/dist/web/dist/assets/postcss-CXtECtnM.js +1 -0
- package/dist/web/dist/assets/powerquery-CEu0bR-o.js +1 -0
- package/dist/web/dist/assets/powershell-Dpen1YoG.js +1 -0
- package/dist/web/dist/assets/prisma-Dd19v3D-.js +1 -0
- package/dist/web/dist/assets/prolog-CbFg5uaA.js +1 -0
- package/dist/web/dist/assets/proto-C7zT0LnQ.js +1 -0
- package/dist/web/dist/assets/pug-CGlum2m_.js +1 -0
- package/dist/web/dist/assets/puppet-BMWR74SV.js +1 -0
- package/dist/web/dist/assets/purescript-CklMAg4u.js +1 -0
- package/dist/web/dist/assets/python-B6aJPvgy.js +1 -0
- package/dist/web/dist/assets/qml-3beO22l8.js +1 -0
- package/dist/web/dist/assets/qmldir-C8lEn-DE.js +1 -0
- package/dist/web/dist/assets/qss-IeuSbFQv.js +1 -0
- package/dist/web/dist/assets/r-Dspwwk_N.js +1 -0
- package/dist/web/dist/assets/racket-BqYA7rlc.js +1 -0
- package/dist/web/dist/assets/raku-DXvB9xmW.js +1 -0
- package/dist/web/dist/assets/razor-Uh8Bk_45.js +1 -0
- package/dist/web/dist/assets/red-bN70gL4F.js +1 -0
- package/dist/web/dist/assets/refresh-cw-B9ZNJZIb.js +6 -0
- package/dist/web/dist/assets/reg-C-SQnVFl.js +1 -0
- package/dist/web/dist/assets/regexp-CDVJQ6XC.js +1 -0
- package/dist/web/dist/assets/rel-C3B-1QV4.js +1 -0
- package/dist/web/dist/assets/riscv-BM1_JUlF.js +1 -0
- package/dist/web/dist/assets/ron-D8l8udqQ.js +1 -0
- package/dist/web/dist/assets/rose-pine-dawn-DHQR4-dF.js +1 -0
- package/dist/web/dist/assets/rose-pine-moon-D4_iv3hh.js +1 -0
- package/dist/web/dist/assets/rose-pine-qdsjHGoJ.js +1 -0
- package/dist/web/dist/assets/rosmsg-BJDFO7_C.js +1 -0
- package/dist/web/dist/assets/rst-BrH8l1NY.js +1 -0
- package/dist/web/dist/assets/ruby-Dw2BHqvy.js +1 -0
- package/dist/web/dist/assets/rust-B1yitclQ.js +1 -0
- package/dist/web/dist/assets/sas-cz2c8ADy.js +1 -0
- package/dist/web/dist/assets/sass-Cj5Yp3dK.js +1 -0
- package/dist/web/dist/assets/scala-C151Ov-r.js +1 -0
- package/dist/web/dist/assets/scheme-C98Dy4si.js +1 -0
- package/dist/web/dist/assets/scss-OYdSNvt2.js +1 -0
- package/dist/web/dist/assets/sdbl-DVxCFoDh.js +1 -0
- package/dist/web/dist/assets/shaderlab-Dg9Lc6iA.js +1 -0
- package/dist/web/dist/assets/shellscript-Yzrsuije.js +1 -0
- package/dist/web/dist/assets/shellsession-BADoaaVG.js +1 -0
- package/dist/web/dist/assets/slack-dark-BthQWCQV.js +1 -0
- package/dist/web/dist/assets/slack-ochin-DqwNpetd.js +1 -0
- package/dist/web/dist/assets/smalltalk-BERRCDM3.js +1 -0
- package/dist/web/dist/assets/snazzy-light-Bw305WKR.js +1 -0
- package/dist/web/dist/assets/solarized-dark-DXbdFlpD.js +1 -0
- package/dist/web/dist/assets/solarized-light-L9t79GZl.js +1 -0
- package/dist/web/dist/assets/solidity-rGO070M0.js +1 -0
- package/dist/web/dist/assets/soy-Brmx7dQM.js +1 -0
- package/dist/web/dist/assets/sparql-rVzFXLq3.js +1 -0
- package/dist/web/dist/assets/splunk-BtCnVYZw.js +1 -0
- package/dist/web/dist/assets/sql-BLtJtn59.js +1 -0
- package/dist/web/dist/assets/ssh-config-_ykCGR6B.js +1 -0
- package/dist/web/dist/assets/stata-BH5u7GGu.js +1 -0
- package/dist/web/dist/assets/stylus-BEDo0Tqx.js +1 -0
- package/dist/web/dist/assets/surrealql-Bq5Q-fJD.js +1 -0
- package/dist/web/dist/assets/svelte-C_ipcX3V.js +1 -0
- package/dist/web/dist/assets/swift-D82vCrfD.js +1 -0
- package/dist/web/dist/assets/synthwave-84-CbfX1IO0.js +1 -0
- package/dist/web/dist/assets/system-verilog-CnnmHF94.js +1 -0
- package/dist/web/dist/assets/systemd-4A_iFExJ.js +1 -0
- package/dist/web/dist/assets/talonscript-CkByrt1z.js +1 -0
- package/dist/web/dist/assets/tasl-QIJgUcNo.js +1 -0
- package/dist/web/dist/assets/tcl-dwOrl1Do.js +1 -0
- package/dist/web/dist/assets/templ-P3uqSqPl.js +1 -0
- package/dist/web/dist/assets/terraform-BETggiCN.js +1 -0
- package/dist/web/dist/assets/tex-idrVyKtj.js +1 -0
- package/dist/web/dist/assets/tokyo-night-hegEt444.js +1 -0
- package/dist/web/dist/assets/toml-vGWfd6FD.js +1 -0
- package/dist/web/dist/assets/ts-tags-zn1MmPIZ.js +1 -0
- package/dist/web/dist/assets/tsv-B_m7g4N7.js +1 -0
- package/dist/web/dist/assets/tsx-COt5Ahok.js +1 -0
- package/dist/web/dist/assets/turtle-BsS91CYL.js +1 -0
- package/dist/web/dist/assets/twig-DNn4PbVi.js +1 -0
- package/dist/web/dist/assets/typescript-BPQ3VLAy.js +1 -0
- package/dist/web/dist/assets/typespec-BGHnOYBU.js +1 -0
- package/dist/web/dist/assets/typst-DHCkPAjA.js +1 -0
- package/dist/web/dist/assets/v-BcVCzyr7.js +1 -0
- package/dist/web/dist/assets/vala-CsfeWuGM.js +1 -0
- package/dist/web/dist/assets/vb-D17OF-Vu.js +1 -0
- package/dist/web/dist/assets/vendor-charts-CfOL2F-E.js +6 -0
- package/dist/web/dist/assets/vendor-react-B0mWfPOm.js +60 -0
- package/dist/web/dist/assets/vendor-viem-wp7lz4Hc.js +22 -0
- package/dist/web/dist/assets/verilog-BQ8w6xss.js +1 -0
- package/dist/web/dist/assets/vesper-DU1UobuO.js +1 -0
- package/dist/web/dist/assets/vhdl-CeAyd5Ju.js +1 -0
- package/dist/web/dist/assets/viml-CJc9bBzg.js +1 -0
- package/dist/web/dist/assets/vitesse-black-Bkuqu6BP.js +1 -0
- package/dist/web/dist/assets/vitesse-dark-D0r3Knsf.js +1 -0
- package/dist/web/dist/assets/vitesse-light-CVO1_9PV.js +1 -0
- package/dist/web/dist/assets/vue-DN_0RTcg.js +1 -0
- package/dist/web/dist/assets/vue-html-AaS7Mt5G.js +1 -0
- package/dist/web/dist/assets/vue-vine-CQOfvN7w.js +1 -0
- package/dist/web/dist/assets/vyper-CDx5xZoG.js +1 -0
- package/dist/web/dist/assets/wasm-CG6Dc4jp.js +1 -0
- package/dist/web/dist/assets/wasm-MzD3tlZU.js +1 -0
- package/dist/web/dist/assets/welcome-illustration-B8_SJ7In.svg +319 -0
- package/dist/web/dist/assets/wenyan-BV7otONQ.js +1 -0
- package/dist/web/dist/assets/wgsl-Dx-B1_4e.js +1 -0
- package/dist/web/dist/assets/wikitext-BhOHFoWU.js +1 -0
- package/dist/web/dist/assets/wit-5i3qLPDT.js +1 -0
- package/dist/web/dist/assets/wolfram-lXgVvXCa.js +1 -0
- package/dist/web/dist/assets/xml-sdJ4AIDG.js +1 -0
- package/dist/web/dist/assets/xsl-CtQFsRM5.js +1 -0
- package/dist/web/dist/assets/yaml-Buea-lGh.js +1 -0
- package/dist/web/dist/assets/zenscript-DVFEvuxE.js +1 -0
- package/dist/web/dist/assets/zig-VOosw3JB.js +1 -0
- package/dist/web/dist/favicon.svg +4 -0
- package/dist/web/dist/index.html +18 -0
- 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
|
+
```
|