Gangtise Copilot One-command installer, credential configurator, and diagnostic layer for the full Gangtise (岗底斯投研) OpenAPI skill suite. --- 🚀 One-shot installation (complete flow) This is the only section you need to read to go from zero to fully working Gangtise. Follow steps in order. Step 1 — Download this skill to your agent's skills directory Primary method (git clone): Fallback method (when git clone times out or is unavailable — use GitHub API directly): Important : Network to GitHub may be unstable. If any file fails, retry the specific file up to 3 times with a 2-second delay betwe…

\\n__HTTP_STATUS__:%{http_code}' 2>/dev/null)\n curl_rc=$?\n\n if [ \"$curl_rc\" -ne 0 ] || [[ \"$response\" != *

Gangtise Copilot One-command installer, credential configurator, and diagnostic layer for the full Gangtise (岗底斯投研) OpenAPI skill suite. --- 🚀 One-shot installation (complete flow) This is the only section you need to read to go from zero to fully working Gangtise. Follow steps in order. Step 1 — Download this skill to your agent's skills directory Primary method (git clone): Fallback method (when git clone times out or is unavailable — use GitHub API directly): Important : Network to GitHub may be unstable. If any file fails, retry the specific file up to 3 times with a 2-second delay betwe…

\\n__HTTP_STATUS__:'* ]]; then\n status_diag_fail \"Cannot reach Gangtise auth server — network or firewall issue\"\n elif [ ! -f \"$CLASSIFIER\" ]; then\n :\n else\n auth_http=\"${response##*

Gangtise Copilot One-command installer, credential configurator, and diagnostic layer for the full Gangtise (岗底斯投研) OpenAPI skill suite. --- 🚀 One-shot installation (complete flow) This is the only section you need to read to go from zero to fully working Gangtise. Follow steps in order. Step 1 — Download this skill to your agent's skills directory Primary method (git clone): Fallback method (when git clone times out or is unavailable — use GitHub API directly): Important : Network to GitHub may be unstable. If any file fails, retry the specific file up to 3 times with a 2-second delay betwe…

\\n__HTTP_STATUS__:'}\"\n auth_body=\"${response%

Gangtise Copilot One-command installer, credential configurator, and diagnostic layer for the full Gangtise (岗底斯投研) OpenAPI skill suite. --- 🚀 One-shot installation (complete flow) This is the only section you need to read to go from zero to fully working Gangtise. Follow steps in order. Step 1 — Download this skill to your agent's skills directory Primary method (git clone): Fallback method (when git clone times out or is unavailable — use GitHub API directly): Important : Network to GitHub may be unstable. If any file fails, retry the specific file up to 3 times with a 2-second delay betwe…

\\n__HTTP_STATUS__:'*}\"\n IFS=

Gangtise Copilot One-command installer, credential configurator, and diagnostic layer for the full Gangtise (岗底斯投研) OpenAPI skill suite. --- 🚀 One-shot installation (complete flow) This is the only section you need to read to go from zero to fully working Gangtise. Follow steps in order. Step 1 — Download this skill to your agent's skills directory Primary method (git clone): Fallback method (when git clone times out or is unavailable — use GitHub API directly): Important : Network to GitHub may be unstable. If any file fails, retry the specific file up to 3 times with a 2-second delay betwe…

\\t' read -r auth_state auth_category _ auth_code auth_error_type auth_trace_id auth_message _ auth_missing \u003c \u003c(\n printf '%s' \"$auth_body\" | python3 \"$CLASSIFIER\" auth --http-status \"$auth_http\"\n )\n if [ \"$auth_state\" = \"success\" ]; then\n status_ok \"OAuth liveness (scope: auth) — credentials accepted\"\n if [ \"$auth_missing\" != \"-\" ]; then\n status_info \"Auth response omitted optional headers: $auth_missing (accessToken remains usable)\"\n fi\n\n # Extract token for the next liveness check\n TOKEN=$(printf '%s' \"$auth_body\" | python3 -c 'import json,sys; d=json.load(sys.stdin); print(d[\"data\"][\"accessToken\"])' 2>/dev/null || echo \"\")\n UID_HEADER=$(printf '%s' \"$auth_body\" | python3 -c 'import json,sys; d=json.load(sys.stdin); print(d[\"data\"].get(\"uid\", \"\"))' 2>/dev/null || echo \"\")\n TENANT_HEADER=$(printf '%s' \"$auth_body\" | python3 -c 'import json,sys; d=json.load(sys.stdin); print(d[\"data\"].get(\"tenantId\", \"\"))' 2>/dev/null || echo \"\")\n PRODUCT_HEADER=$(printf '%s' \"$auth_body\" | python3 -c 'import json,sys; d=json.load(sys.stdin); print(d[\"data\"].get(\"productCode\", \"\"))' 2>/dev/null || echo \"\")\n\n # ================================================================\n # Liveness check 2: RAG endpoint (proves 'rag' scope works —\n # this is the scope most Gangtise skills need)\n # ================================================================\n if [ -n \"$TOKEN\" ]; then\n rag_args=(-H \"Authorization: $TOKEN\" -H \"Content-Type: application/json\")\n [ -z \"$UID_HEADER\" ] || rag_args+=(-H \"uid: $UID_HEADER\")\n [ -z \"$TENANT_HEADER\" ] || rag_args+=(-H \"tenantid: $TENANT_HEADER\")\n [ -z \"$PRODUCT_HEADER\" ] || rag_args+=(-H \"productcode: $PRODUCT_HEADER\")\n rag_response=$(curl -sS -X POST \"$RAG_ENDPOINT\" \\\n \"${rag_args[@]}\" \\\n --data '{\"query\":\"test\",\"top\":1}' \\\n --max-time 20 \\\n -w

Gangtise Copilot One-command installer, credential configurator, and diagnostic layer for the full Gangtise (岗底斯投研) OpenAPI skill suite. --- 🚀 One-shot installation (complete flow) This is the only section you need to read to go from zero to fully working Gangtise. Follow steps in order. Step 1 — Download this skill to your agent's skills directory Primary method (git clone): Fallback method (when git clone times out or is unavailable — use GitHub API directly): Important : Network to GitHub may be unstable. If any file fails, retry the specific file up to 3 times with a 2-second delay betwe…

\\n__HTTP_STATUS__:%{http_code}' 2>/dev/null)\n rag_curl_rc=$?\n\n if [ \"$rag_curl_rc\" -ne 0 ] || [[ \"$rag_response\" != *

Gangtise Copilot One-command installer, credential configurator, and diagnostic layer for the full Gangtise (岗底斯投研) OpenAPI skill suite. --- 🚀 One-shot installation (complete flow) This is the only section you need to read to go from zero to fully working Gangtise. Follow steps in order. Step 1 — Download this skill to your agent's skills directory Primary method (git clone): Fallback method (when git clone times out or is unavailable — use GitHub API directly): Important : Network to GitHub may be unstable. If any file fails, retry the specific file up to 3 times with a 2-second delay betwe…

\\n__HTTP_STATUS__:'* ]]; then\n status_diag_fail \"Cannot reach RAG endpoint — network issue on scoped liveness check\"\n else\n rag_http=\"${rag_response##*

Gangtise Copilot One-command installer, credential configurator, and diagnostic layer for the full Gangtise (岗底斯投研) OpenAPI skill suite. --- 🚀 One-shot installation (complete flow) This is the only section you need to read to go from zero to fully working Gangtise. Follow steps in order. Step 1 — Download this skill to your agent's skills directory Primary method (git clone): Fallback method (when git clone times out or is unavailable — use GitHub API directly): Important : Network to GitHub may be unstable. If any file fails, retry the specific file up to 3 times with a 2-second delay betwe…

\\n__HTTP_STATUS__:'}\"\n rag_body=\"${rag_response%

Gangtise Copilot One-command installer, credential configurator, and diagnostic layer for the full Gangtise (岗底斯投研) OpenAPI skill suite. --- 🚀 One-shot installation (complete flow) This is the only section you need to read to go from zero to fully working Gangtise. Follow steps in order. Step 1 — Download this skill to your agent's skills directory Primary method (git clone): Fallback method (when git clone times out or is unavailable — use GitHub API directly): Important : Network to GitHub may be unstable. If any file fails, retry the specific file up to 3 times with a 2-second delay betwe…

\\n__HTTP_STATUS__:'*}\"\n IFS=

Gangtise Copilot One-command installer, credential configurator, and diagnostic layer for the full Gangtise (岗底斯投研) OpenAPI skill suite. --- 🚀 One-shot installation (complete flow) This is the only section you need to read to go from zero to fully working Gangtise. Follow steps in order. Step 1 — Download this skill to your agent's skills directory Primary method (git clone): Fallback method (when git clone times out or is unavailable — use GitHub API directly): Important : Network to GitHub may be unstable. If any file fails, retry the specific file up to 3 times with a 2-second delay betwe…

\\t' read -r rag_state rag_category _ rag_code rag_error_type rag_trace_id rag_message rag_empty _ \u003c \u003c(\n printf '%s' \"$rag_body\" | python3 \"$CLASSIFIER\" rag --http-status \"$rag_http\"\n )\n rag_meta=$(diagnostic_fields \"$rag_http\" \"$rag_code\" \"$rag_error_type\" \"$rag_trace_id\")\n if [ \"$rag_state\" = \"success\" ] && [ \"$rag_empty\" = \"true\" ]; then\n status_ok \"RAG liveness (scope: rag) — reachable; query returned 0 results [$rag_meta]\"\n elif [ \"$rag_state\" = \"success\" ]; then\n status_ok \"RAG liveness (scope: rag) — reachable [$rag_meta]\"\n elif [ \"$rag_category\" = \"quota\" ]; then\n status_fail \"RAG rejected with a quota/entitlement response [$rag_meta]\"\n elif [ \"$rag_category\" = \"permission\" ]; then\n status_fail \"RAG permission denied [$rag_meta]\"\n elif [ \"$rag_category\" = \"auth\" ]; then\n status_fail \"RAG authentication rejected [$rag_meta]\"\n else\n status_fail \"RAG request failed (category=$rag_category) [$rag_meta]\"\n fi\n fi\n fi\n else\n auth_meta=$(diagnostic_fields \"$auth_http\" \"$auth_code\" \"$auth_error_type\" \"$auth_trace_id\")\n if [ \"$auth_category\" = \"auth\" ]; then\n status_fail \"Credentials rejected by Gangtise auth server [$auth_meta]\"\n status_info \"Run: bash configure_auth.sh --verify-only after correcting the credential source\"\n elif [ \"$auth_category\" = \"permission\" ]; then\n status_fail \"Gangtise auth endpoint denied permission [$auth_meta]\"\n elif [ \"$auth_category\" = \"response\" ]; then\n status_diag_fail \"Gangtise auth endpoint returned a malformed response [$auth_meta]\"\n else\n status_fail \"Gangtise auth request failed (category=$auth_category) [$auth_meta]\"\n fi\n fi\n fi\n fi\nfi\n\necho\n\n# ============================================================================\n# Summary\n# ============================================================================\n\necho \"--- Summary ---\"\necho \" ✅ ${PASS} pass ⚠️ ${WARN} warn ❌ ${FAIL} fail\"\necho\n\nif [ \"$DIAG_ERROR\" -gt 0 ]; then\n echo \"The diagnostic could not complete. Resolve the diagnostic error, then re-run diagnose.sh.\"\n exit 2\nfi\n\nif [ \"$FAIL\" -gt 0 ]; then\n echo \"Next step: fix the ❌ items above, then re-run diagnose.sh.\"\n echo \"If you're not sure what a specific item means, check references/known_issues.md\"\n exit 1\nfi\n\nif [ \"$WARN\" -gt 0 ]; then\n echo \"Warnings are non-blocking, but the affected capabilities may not work.\"\n echo \"Review the ⚠️ items above and follow the suggested fix, or ignore if you're\"\n echo \"aware of why they apply to your install.\"\n exit 1\nfi\n\necho \"All checks passed. Gangtise Copilot install is healthy.\"\nexit 0\n","content_type":"application/x-sh; charset=utf-8","language":"bash","size":15416,"content_sha256":"c04b880e84effc0d71deb6ef76b9009cd2026ba01e28bec0549f604fc72b2620"},{"filename":"scripts/install_gangtise.sh","content":"#!/usr/bin/env bash\n#\n# install_gangtise.sh — Install the Gangtise (岗底斯投研) OpenAPI skill suite to\n# detected local agents (Claude Code / OpenClaw / Codex).\n#\n# Flow:\n# 1. Parse flags (--preset / --only / --target / --no-openclaw)\n# 2. Detect which target agents are installed locally\n# 3. Download 4 archives from the official Gangtise OBS bucket:\n# - gangtise-skills-client.zip (5 skills: data-client, kb-client,\n# file-client, file-client-no-download, stockpool-client)\n# - gangtise-research.zip (10 research workflow skills)\n# - gangtise-skills.zip (3 legacy minimal skills)\n# - gangtise-web-client.zip (1 standalone)\n# 4. Extract to a staging directory\n# 5. Select the skills the preset / --only list asks for\n# 6. For each selected skill, link or copy it into each detected agent's\n# skills directory using a shared canonical install location.\n# 7. Clean up the staging dir on exit\n#\n# Re-run safely — every step is idempotent.\n#\n# Distilled from a real discovery session (April 2026) that enumerated the\n# Gangtise skill ecosystem by hand. There are no upstream bugs to fix — the\n# friction this script removes is the 5-round enumeration process required to\n# discover all 19 skills in the first place, plus the orchestration work of\n# downloading 4 archives and distributing 19 skill directories.\n\nset -euo pipefail\n\n# ============================================================================\n# Configuration\n# ============================================================================\n\nBASE_URL=\"https://gts-download.obs.myhuaweicloud.com/skills\"\nSTAGING_ROOT=\"/tmp/gangtise-copilot-staging\"\nSTAGING_DIR=\"${STAGING_ROOT}/$(date +%s)-$\"\nCANONICAL_ROOT=\"${GANGTISE_COPILOT_HOME:-$HOME/.local/share/gangtise-copilot}\"\nCANONICAL_SKILLS_DIR=\"${CANONICAL_ROOT}/skills\"\n\n# ============================================================================\n# Bundle map — what each archive contains (canonical source of truth)\n# ============================================================================\n\n# Format: \u003cbundle-zip-name>:\u003cskill1>,\u003cskill2>,...\nBUNDLES=(\n \"gangtise-skills-client:gangtise-data-client,gangtise-file-client,gangtise-file-client-no-download,gangtise-kb-client,gangtise-stockpool-client\"\n \"gangtise-research:gangtise-announcement-digest,gangtise-data-processor,gangtise-event-review,gangtise-interview-outline,gangtise-opinion-pk,gangtise-opinion-summarizer,gangtise-stock-research,gangtise-stock-selector,gangtise-thematic-research,gangtise-wechat-summary\"\n \"gangtise-skills:gangtise-data,gangtise-file,gangtise-kb\"\n \"gangtise-web-client:gangtise-web-client\"\n)\n\n# Presets — which skills each mode installs\nPRESET_FULL=\"gangtise-data-client gangtise-file-client gangtise-file-client-no-download gangtise-kb-client gangtise-stockpool-client gangtise-announcement-digest gangtise-data-processor gangtise-event-review gangtise-interview-outline gangtise-opinion-pk gangtise-opinion-summarizer gangtise-stock-research gangtise-stock-selector gangtise-thematic-research gangtise-wechat-summary gangtise-data gangtise-file gangtise-kb gangtise-web-client\"\n\nPRESET_MINIMAL=\"gangtise-data gangtise-file gangtise-kb\"\n\n# `workshop` is intentionally an alias for `minimal`. The historical workshop preset\n# bundled 7 -client-heavy skills, but those are blocked by ISSUE-007 on most accounts,\n# making them a footgun in live demos. The 3 legacy minimal skills are the realistic\n# working surface for any live workshop, so the preset now points at the same set.\nPRESET_WORKSHOP=\"$PRESET_MINIMAL\"\n\n# ============================================================================\n# Cleanup trap\n# ============================================================================\n\ncleanup() {\n if [ -n \"${STAGING_DIR:-}\" ] && [ -d \"$STAGING_DIR\" ]; then\n rm -rf \"$STAGING_DIR\"\n fi\n}\ntrap cleanup EXIT\n\n# ============================================================================\n# Usage\n# ============================================================================\n\nusage() {\n cat \u003c\u003c'EOF'\nUsage: install_gangtise.sh [OPTIONS]\n\nInstall the Gangtise OpenAPI skill suite to detected local agents.\n\nOptions:\n --preset MODE Install preset: minimal (default) | workshop | full\n minimal — 3 legacy skills (data, file, kb) using public\n open-* endpoints. Works on every account that\n can authenticate. Recommended default — see\n ISSUE-007 in references/known_issues.md for\n why this is the safe choice.\n workshop — Alias for minimal. The historical -client-heavy\n workshop preset is a footgun on accounts blocked\n by ISSUE-007; it now installs the same 3 skills.\n full — all 19 skills (mix of both lines). Most -client\n skills will fail at runtime if your account\n lacks skills-backend/* ACL.\n --only LIST Comma-separated list of skill names to install (overrides\n --preset). Example: --only gangtise-data-client,gangtise-kb-client\n --target AGENT Force a single target agent: claude-code | openclaw | codex\n Default: install to every detected agent.\n --no-openclaw Skip OpenClaw even if detected.\n --list-skills List all known Gangtise skills and exit.\n -h, --help Show this help and exit.\n\nExamples:\n bash install_gangtise.sh # Default minimal (3 skills)\n bash install_gangtise.sh --preset workshop # alias for minimal (same 3 skills)\n bash install_gangtise.sh --preset full # All 19 skills\n bash install_gangtise.sh --only gangtise-data-client,gangtise-kb-client\n bash install_gangtise.sh --target claude-code # Only Claude Code\nEOF\n}\n\n# ============================================================================\n# Parse flags\n# ============================================================================\n\nPRESET=\"minimal\"\nONLY_LIST=\"\"\nFORCE_TARGET=\"\"\nSKIP_OPENCLAW=0\n\nwhile [ $# -gt 0 ]; do\n case \"$1\" in\n --preset) PRESET=\"$2\"; shift 2 ;;\n --preset=*) PRESET=\"${1#*=}\"; shift ;;\n --only) ONLY_LIST=\"$2\"; shift 2 ;;\n --only=*) ONLY_LIST=\"${1#*=}\"; shift ;;\n --target) FORCE_TARGET=\"$2\"; shift 2 ;;\n --target=*) FORCE_TARGET=\"${1#*=}\"; shift ;;\n --no-openclaw) SKIP_OPENCLAW=1; shift ;;\n --list-skills)\n echo \"Known Gangtise skills (19 total):\"\n echo\n echo \" Data layer (6):\"\n echo \" gangtise-data-client — Full data skill (9 capabilities, supports 简称)\"\n echo \" gangtise-data — Legacy minimal data skill (4 capabilities, requires 标准代码)\"\n echo \" gangtise-kb-client — Full knowledge base semantic search\"\n echo \" gangtise-kb — Legacy minimal KB search\"\n echo \" gangtise-file-client — Full file index (18 scripts)\"\n echo \" gangtise-file — Legacy minimal file index (11 scripts)\"\n echo\n echo \" Web layer (1):\"\n echo \" gangtise-web-client — Gangtise's own public web search\"\n echo\n echo \" Utility (2, only distributed inside gangtise-skills-client bundle):\"\n echo \" gangtise-stockpool-client — Stock pool CRUD + constituent management\"\n echo \" gangtise-file-client-no-download — file-client variant with downloads disabled\"\n echo\n echo \" Research workflows (10):\"\n echo \" gangtise-stock-research — Individual stock research L1-L4\"\n echo \" gangtise-opinion-pk — Adversarial opinion analysis\"\n echo \" gangtise-thematic-research — Sector / theme research\"\n echo \" gangtise-stock-selector — Stock screening methodology\"\n echo \" gangtise-event-review — Market event post-mortem (800-1000 字)\"\n echo \" gangtise-interview-outline — Company interview outline generator\"\n echo \" gangtise-announcement-digest — Announcement tracking + digest\"\n echo \" gangtise-opinion-summarizer — Chief analyst opinion digest\"\n echo \" gangtise-wechat-summary — WeChat group → investment daily\"\n echo \" gangtise-data-processor — Data processing methodology guide\"\n exit 0\n ;;\n -h|--help) usage; exit 0 ;;\n *) echo \"✗ unknown argument: $1\" >&2; usage >&2; exit 1 ;;\n esac\ndone\n\n# ============================================================================\n# Resolve requested skill list\n# ============================================================================\n\nif [ -n \"$ONLY_LIST\" ]; then\n # --only takes precedence over --preset\n REQUESTED=$(echo \"$ONLY_LIST\" | tr ',' ' ')\nelse\n case \"$PRESET\" in\n full) REQUESTED=\"$PRESET_FULL\" ;;\n workshop) REQUESTED=\"$PRESET_WORKSHOP\" ;;\n minimal) REQUESTED=\"$PRESET_MINIMAL\" ;;\n *) echo \"✗ unknown preset: $PRESET (valid: full, workshop, minimal)\" >&2; exit 1 ;;\n esac\nfi\n\nREQUESTED=$(echo \"$REQUESTED\" | tr -s ' ')\n\n# ============================================================================\n# Prerequisite checks — fail fast with actionable messages\n# ============================================================================\n\nfor tool in curl unzip; do\n if ! command -v \"$tool\" >/dev/null 2>&1; then\n echo \"✗ Required tool not found on PATH: $tool\" >&2\n echo \" Install via your package manager (brew install $tool, apt install $tool, etc.)\" >&2\n exit 1\n fi\ndone\n\n# ============================================================================\n# Target agent detection\n# ============================================================================\n\nAGENTS=()\n\ndetect_agents() {\n local a\n if [ -n \"$FORCE_TARGET\" ]; then\n AGENTS=(\"$FORCE_TARGET\")\n return\n fi\n [ -d \"$HOME/.claude\" ] && AGENTS+=(\"claude-code\")\n [ -d \"$HOME/.agents\" ] && AGENTS+=(\"codex\")\n if [ \"$SKIP_OPENCLAW\" -eq 0 ]; then\n if [ -d \"$HOME/.openclaw\" ] || command -v openclaw >/dev/null 2>&1; then\n AGENTS+=(\"openclaw\")\n fi\n fi\n if [ ${#AGENTS[@]} -eq 0 ]; then\n # Zero-agents fallback — default to claude-code with a loud warning.\n # Alternative strategies considered:\n # (a) Abort with a \"nothing to install into\" error — too strict; a user\n # who just installed Claude Code and hasn't restarted their shell\n # might hit this and be confused.\n # (b) Silently install nothing — most surprising, hardest to debug.\n # (c) Default to claude-code after explaining what we looked for ← chosen\n echo \"\" >&2\n echo \"⚠ No supported agent detected. Looked for:\" >&2\n echo \" ~/.claude (Claude Code)\" >&2\n echo \" ~/.openclaw (OpenClaw)\" >&2\n echo \" ~/.agents (Codex)\" >&2\n echo \" Defaulting to claude-code as the most common install target.\" >&2\n echo \" If claude-code isn't installed either, re-run after installing it, or pass --target \u003cagent>.\" >&2\n echo \"\" >&2\n AGENTS=(\"claude-code\")\n fi\n}\n\nagent_skills_dir() {\n local agent=\"$1\"\n case \"$agent\" in\n claude-code) echo \"$HOME/.claude/skills\" ;;\n codex) echo \"$HOME/.agents/skills\" ;;\n openclaw)\n # OpenClaw's skill directory layout has not fully stabilized — try a\n # few candidate paths in order and return the first existing one.\n # If none exist yet, default to ~/.openclaw/skills/ (most common).\n local p\n for p in \"$HOME/.openclaw/skills\" \"$HOME/.config/openclaw/skills\" \"$HOME/.local/share/openclaw/skills\"; do\n if [ -d \"$p\" ]; then echo \"$p\"; return; fi\n done\n echo \"$HOME/.openclaw/skills\"\n ;;\n *) echo \"$HOME/.claude/skills\" ;;\n esac\n}\n\ndetect_agents\n\necho \"▶ Target agent(s): ${AGENTS[*]}\"\necho \"▶ Requested skills (preset=$PRESET): $(echo $REQUESTED | wc -w | tr -d ' ') skill(s)\"\n\n# ============================================================================\n# Download archives\n# ============================================================================\n\ndownload_bundle() {\n local bundle_name=\"$1\"\n local zip_url=\"${BASE_URL}/${bundle_name}.zip\"\n local zip_path=\"${STAGING_DIR}/${bundle_name}.zip\"\n\n echo \" ↓ ${bundle_name}.zip\"\n local http_code\n http_code=$(curl -sS -L --fail -o \"$zip_path\" -w \"%{http_code}\" \"$zip_url\" 2>/dev/null || echo \"000\")\n if [ \"$http_code\" != \"200\" ]; then\n echo \"\" >&2\n echo \"✗ Download failed (HTTP ${http_code}) for ${zip_url}\" >&2\n echo \" This usually means the Gangtise OBS bucket has moved or renamed the file.\" >&2\n echo \" Report this to the gangtise-copilot maintainer — the bundle list may be out of date.\" >&2\n return 1\n fi\n\n # Size sanity check — Huawei Cloud OBS sometimes returns \"200\" with an HTML\n # error body when authentication/region routing fails. Reject tiny downloads\n # before extraction.\n local actual_size\n actual_size=$(wc -c \u003c \"$zip_path\" | tr -d ' ')\n if [ \"$actual_size\" -lt 1000 ]; then\n echo \"✗ Downloaded $bundle_name.zip is suspiciously small (${actual_size}B) — aborting\" >&2\n return 1\n fi\n\n unzip -q -o \"$zip_path\" -d \"$STAGING_DIR\"\n}\n\nmkdir -p \"$STAGING_DIR\"\n\necho \"▶ Staging to $STAGING_DIR\"\n\n# Figure out which bundles we actually need based on REQUESTED\nNEEDED_BUNDLES=\"\"\nfor line in \"${BUNDLES[@]}\"; do\n local_bundle=\"${line%%:*}\"\n local_contents=\"${line#*:}\"\n local_contents_sp=$(echo \"$local_contents\" | tr ',' ' ')\n for req in $REQUESTED; do\n for cont in $local_contents_sp; do\n if [ \"$req\" = \"$cont\" ]; then\n case \" $NEEDED_BUNDLES \" in\n *\" $local_bundle \"*) ;;\n *) NEEDED_BUNDLES=\"$NEEDED_BUNDLES $local_bundle\" ;;\n esac\n fi\n done\n done\ndone\n\nfor b in $NEEDED_BUNDLES; do\n download_bundle \"$b\"\ndone\n\n# ============================================================================\n# Locate each requested skill in the staging directory\n# ============================================================================\n\n# After unzipping, each skill's files live at one of these layouts inside\n# $STAGING_DIR (the layout depends on whether the zip is a bundle or a\n# standalone):\n# - $STAGING_DIR/\u003cskill-name>/SKILL.md (most bundles)\n# - $STAGING_DIR/\u003cbundle-name>/\u003cskill-name>/SKILL.md (some bundles)\n# We scan for SKILL.md files and index them by directory name.\n\nlocate_skill_src() {\n local skill_name=\"$1\"\n # Prefer the direct layout first, then fall back to a nested layout.\n if [ -f \"$STAGING_DIR/$skill_name/SKILL.md\" ]; then\n echo \"$STAGING_DIR/$skill_name\"\n return 0\n fi\n # Nested fallback — depth-2 find, prefer shallowest match.\n local candidate\n candidate=$(find \"$STAGING_DIR\" -maxdepth 3 -type d -name \"$skill_name\" 2>/dev/null | head -1)\n if [ -n \"$candidate\" ] && [ -f \"$candidate/SKILL.md\" ]; then\n echo \"$candidate\"\n return 0\n fi\n return 1\n}\n\n# ============================================================================\n# Install each requested skill\n# ============================================================================\n\nmkdir -p \"$CANONICAL_SKILLS_DIR\"\n\nINSTALLED=()\nSKIPPED=()\n\nfor skill in $REQUESTED; do\n src=\"\"\n if src=$(locate_skill_src \"$skill\"); then\n # Copy to canonical location (fresh each run — idempotent replace)\n canonical_dest=\"$CANONICAL_SKILLS_DIR/$skill\"\n if [ -d \"$canonical_dest\" ]; then\n command rm -rf \"$canonical_dest\"\n fi\n command cp -r \"$src\" \"$canonical_dest\"\n\n # For each target agent, create a symlink from its skills/ dir to the\n # canonical location. Using symlinks means credential file rotations and\n # upstream upgrades propagate to all agents automatically.\n for agent in \"${AGENTS[@]}\"; do\n target_dir=$(agent_skills_dir \"$agent\")\n mkdir -p \"$target_dir\"\n link_path=\"$target_dir/$skill\"\n\n # If an existing non-symlink installation is present, back it up before\n # overwriting — the user may have done a manual install.\n if [ -e \"$link_path\" ] && [ ! -L \"$link_path\" ]; then\n backup_dir=\"/tmp/gangtise-copilot-backups/$(date +%Y%m%d-%H%M%S)\"\n mkdir -p \"$backup_dir\"\n command mv \"$link_path\" \"$backup_dir/$skill\"\n echo \" ℹ Backed up pre-existing $agent/$skill → $backup_dir/$skill\"\n fi\n\n # Idempotent symlink creation\n command ln -sfn \"$canonical_dest\" \"$link_path\"\n done\n\n INSTALLED+=(\"$skill\")\n else\n SKIPPED+=(\"$skill\")\n fi\ndone\n\n# ============================================================================\n# Report\n# ============================================================================\n\necho \"\"\necho \"✓ Installed ${#INSTALLED[@]} skill(s) to ${#AGENTS[@]} agent(s):\"\nfor skill in \"${INSTALLED[@]}\"; do\n echo \" ✓ $skill\"\ndone\n\nif [ ${#SKIPPED[@]} -gt 0 ]; then\n echo \"\"\n echo \"⚠ Skipped (not found in downloaded bundles — likely a typo or the upstream moved):\"\n for skill in \"${SKIPPED[@]}\"; do\n echo \" ✗ $skill\"\n done\nfi\n\necho \"\"\necho \"Canonical install: $CANONICAL_SKILLS_DIR\"\necho \"\"\necho \"Next steps:\"\necho \" 1) Configure your Gangtise credentials:\"\necho \" bash $(dirname \"$0\")/configure_auth.sh\"\necho \" 2) Verify the install:\"\necho \" bash $(dirname \"$0\")/diagnose.sh\"\necho \"\"\n","content_type":"application/x-sh; charset=utf-8","language":"bash","size":17552,"content_sha256":"75067b9ae47748932df606d9dcaa536b78e41d1c8d5ba8222019a71c9d0c99e5"},{"filename":"tests/README.md","content":"# Diagnostic tests\n\nRun the deterministic response-classification suite from `gangtise-copilot`:\n\n```bash\npython3 -m unittest discover -s tests -v\n```\n\nThe fixtures cover the current `loginV2` shape with no `uid`, `tenantId`, or `productCode`; malformed auth success; authentication and permission rejection; the observed quota/entitlement response; and a successful RAG response with no matches. The suite never reads credentials or calls Gangtise.\n","content_type":"text/markdown; charset=utf-8","language":"markdown","size":450,"content_sha256":"339422352a28cb73627496495fc872a92a97f0bc9c3fef60cba0f506624c7bde"},{"filename":"tests/test_classify_response.py","content":"import importlib.util\nfrom pathlib import Path\nimport unittest\n\n\nSCRIPT = Path(__file__).resolve().parents[1] / \"scripts\" / \"classify_response.py\"\nSPEC = importlib.util.spec_from_file_location(\"classify_response\", SCRIPT)\nMODULE = importlib.util.module_from_spec(SPEC)\nSPEC.loader.exec_module(MODULE)\n\n\nclass ResponseClassifierTests(unittest.TestCase):\n def test_auth_success_allows_observed_missing_optional_fields(self):\n result = MODULE.classify(\n \"auth\",\n {\n \"code\": \"000000\",\n \"status\": True,\n \"data\": {\"accessToken\": \"Bearer secret\", \"expiresIn\": 10800},\n },\n 200,\n )\n self.assertEqual(result[\"state\"], \"success\")\n self.assertEqual(result[\"missing_optional\"], \"uid,tenantId,productCode\")\n self.assertNotIn(\"secret\", str(result))\n\n def test_success_without_token_is_response_failure(self):\n result = MODULE.classify(\n \"auth\", {\"code\": \"000000\", \"status\": True, \"data\": {}}, 200\n )\n self.assertEqual(result[\"category\"], \"response\")\n self.assertIn(\"accessToken\", result[\"message\"])\n\n def test_quota_preserves_support_metadata(self):\n result = MODULE.classify(\n \"rag\",\n {\n \"code\": 999005,\n \"status\": False,\n \"errorType\": \"POINT_NOT_ENOUGH\",\n \"msg\": \"积分不足\",\n \"traceId\": \"trace-1\",\n \"data\": \"\",\n },\n 402,\n )\n self.assertEqual(result[\"category\"], \"quota\")\n self.assertEqual(result[\"code\"], \"999005\")\n self.assertEqual(result[\"error_type\"], \"POINT_NOT_ENOUGH\")\n self.assertEqual(result[\"trace_id\"], \"trace-1\")\n\n def test_permission_and_auth_are_distinct(self):\n permission = MODULE.classify(\n \"rag\", {\"code\": \"0000001009\", \"status\": False, \"msg\": \"the uri can't be accessed\"}, 403\n )\n auth = MODULE.classify(\n \"rag\", {\"code\": \"0000001008\", \"status\": False, \"msg\": \"token is invalid\"}, 401\n )\n self.assertEqual(permission[\"category\"], \"permission\")\n self.assertEqual(auth[\"category\"], \"auth\")\n\n def test_successful_empty_rag_response_is_not_failure(self):\n result = MODULE.classify(\n \"rag\", {\"code\": \"000000\", \"status\": True, \"data\": []}, 200\n )\n self.assertEqual(result[\"state\"], \"success\")\n self.assertEqual(result[\"empty\"], \"true\")\n\nif __name__ == \"__main__\":\n unittest.main()\n","content_type":"text/x-python; charset=utf-8","language":"python","size":2545,"content_sha256":"2f3a4d087bfce6bdcd972983894aed0712d3544fbc37857b20fbe246832a47a8"}],"content_json":{"type":"doc","content":[{"type":"heading","attrs":{"level":1},"content":[{"text":"Gangtise Copilot","type":"text"}]},{"type":"paragraph","content":[{"text":"One-command installer, credential configurator, and diagnostic layer for the full Gangtise (岗底斯投研) OpenAPI skill suite.","type":"text"}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"🚀 One-shot installation (complete flow)","type":"text"}]},{"type":"paragraph","content":[{"text":"This is the ","type":"text"},{"text":"only section you need to read","type":"text","marks":[{"type":"strong"}]},{"text":" to go from zero to fully working Gangtise. Follow steps in order.","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Step 1 — Download this skill to your agent's skills directory","type":"text"}]},{"type":"paragraph","content":[{"text":"Primary method","type":"text","marks":[{"type":"strong"}]},{"text":" (git clone):","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"git clone --depth 1 https://github.com/daymade/claude-code-skills.git /tmp/gangtise-repo\ncp -r /tmp/gangtise-repo/daymade-financial/gangtise-copilot \u003cyour-agent-skills-dir>/","type":"text"}]},{"type":"paragraph","content":[{"text":"Fallback method","type":"text","marks":[{"type":"strong"}]},{"text":" (when git clone times out or is unavailable — use GitHub API directly):","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"python"},"content":[{"text":"# Python one-liner to download and write any file from GitHub:\nimport urllib.request, json, base64, os\ndef fetch_github_file(repo_path, local_path):\n url = f\"https://api.github.com/repos/daymade/claude-code-skills/contents/{repo_path}\"\n req = urllib.request.Request(url, headers={\"User-Agent\": \"Mozilla/5.0\"})\n d = json.loads(urllib.request.urlopen(req, timeout=20).read())\n content = base64.b64decode(d[\"content\"]).decode(\"utf-8\")\n os.makedirs(os.path.dirname(local_path), exist_ok=True)\n open(local_path, \"w\").write(content)\n return len(content)\n\n# Download all files:\nfor path, local in [\n (\"daymade-financial/gangtise-copilot/SKILL.md\", \"\u003cskills-dir>/gangtise-copilot/SKILL.md\"),\n (\"daymade-financial/gangtise-copilot/scripts/install_gangtise.sh\", \"\u003cskills-dir>/gangtise-copilot/scripts/install_gangtise.sh\"),\n (\"daymade-financial/gangtise-copilot/scripts/configure_auth.sh\", \"\u003cskills-dir>/gangtise-copilot/scripts/configure_auth.sh\"),\n (\"daymade-financial/gangtise-copilot/scripts/diagnose.sh\", \"\u003cskills-dir>/gangtise-copilot/scripts/diagnose.sh\"),\n (\"daymade-financial/gangtise-copilot/scripts/classify_response.py\", \"\u003cskills-dir>/gangtise-copilot/scripts/classify_response.py\"),\n (\"daymade-financial/gangtise-copilot/references/installation_flow.md\", \"\u003cskills-dir>/gangtise-copilot/references/installation_flow.md\"),\n (\"daymade-financial/gangtise-copilot/references/credentials_setup.md\", \"\u003cskills-dir>/gangtise-copilot/references/credentials_setup.md\"),\n (\"daymade-financial/gangtise-copilot/references/skill_registry.md\", \"\u003cskills-dir>/gangtise-copilot/references/skill_registry.md\"),\n (\"daymade-financial/gangtise-copilot/references/known_issues.md\", \"\u003cskills-dir>/gangtise-copilot/references/known_issues.md\"),\n (\"daymade-financial/gangtise-copilot/references/best_practices.md\", \"\u003cskills-dir>/gangtise-copilot/references/best_practices.md\"),\n (\"daymade-financial/gangtise-copilot/config-template/authorization.json.example\", \"\u003cskills-dir>/gangtise-copilot/config-template/authorization.json.example\"),\n]:\n size = fetch_github_file(path, local)\n print(f\"OK {path} → {local} ({size} bytes)\")","type":"text"}]},{"type":"blockquote","content":[{"type":"paragraph","content":[{"text":"Important","type":"text","marks":[{"type":"strong"}]},{"text":": Network to GitHub may be unstable. If any file fails, retry the specific file up to 3 times with a 2-second delay between attempts. Do NOT abort the whole process for a single file failure.","type":"text"}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Step 2 — Register this skill with your agent","type":"text"}]},{"type":"paragraph","content":[{"text":"For ","type":"text"},{"text":"OpenClaw","type":"text","marks":[{"type":"strong"}]},{"text":": create a symlink in the agent's skills directory and enable it in gateway config:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"# Find the OpenClaw skills directory\nls ~/workspace/agent/skills/ # or ls ~/.openclaw/skills/\n\n# Symlink this skill\nln -sf \u003cgangtise-copilot-source-dir> \u003copenclaw-skills-dir>/gangtise-copilot\n\n# Enable in OpenClaw gateway config (if the agent supports skill entries in config)\n# Run: openclaw config set 'skills.entries.gangtise-copilot' '{}'\n# Then restart the gateway using OpenClaw's own script, not this skill's:\n# sh \u003copenclaw-install-dir>/scripts/restart.sh","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Step 3 — Install all 19 Gangtise official skills","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"bash \u003cgangtise-copilot-dir>/scripts/install_gangtise.sh --preset full","type":"text"}]},{"type":"paragraph","content":[{"text":"What it does","type":"text","marks":[{"type":"strong"}]},{"text":": Downloads 4 ZIP bundles from the official Huawei Cloud OBS bucket, extracts 19 skill directories, and symlinks them into detected agent skills directories (","type":"text"},{"text":"~/.openclaw/skills/","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"~/.claude/skills/","type":"text","marks":[{"type":"code_inline"}]},{"text":", etc.).","type":"text"}]},{"type":"paragraph","content":[{"text":"Known agent skills directory paths","type":"text","marks":[{"type":"strong"}]},{"text":" (if auto-detection misses yours):","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Agent","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Skills directory","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Claude Code","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"~/.claude/skills/","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Codex","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"~/.agents/skills/","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"OpenClaw","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"~/.openclaw/skills/","type":"text","marks":[{"type":"code_inline"}]},{"text":" or ","type":"text"},{"text":"\u003cagent-workspace>/skills/","type":"text","marks":[{"type":"code_inline"}]}]}]}]}]},{"type":"paragraph","content":[{"text":"If install fails, check ","type":"text"},{"text":"references/installation_flow.md","type":"text","marks":[{"type":"code_inline"}]},{"text":".","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Step 4 — Configure credentials","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"bash \u003cgangtise-copilot-dir>/scripts/configure_auth.sh \\\n --access-key \u003cyour-accessKey> \\\n --secret-key \u003cyour-secretAccessKey>","type":"text"}]},{"type":"paragraph","content":[{"text":"What it does","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Writes ","type":"text"},{"text":"~/.config/gangtise/authorization.json","type":"text","marks":[{"type":"code_inline"}]},{"text":" (mode 600)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Performs live auth call to verify credentials work","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Writes ","type":"text"},{"text":"~/.GTS_AUTHORIZATION","type":"text","marks":[{"type":"code_inline"}]},{"text":" runtime token","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Creates symlinks","type":"text","marks":[{"type":"strong"}]},{"text":" from each installed skill's own ","type":"text"},{"text":"\u003cgangtise-skill-dir>/scripts/.authorization","type":"text","marks":[{"type":"code_inline"}]},{"text":" to the shared credential file","type":"text"}]}]}]},{"type":"blockquote","content":[{"type":"paragraph","content":[{"text":"⚠️ ","type":"text"},{"text":"Critical","type":"text","marks":[{"type":"strong"}]},{"text":": After Step 3, ","type":"text"},{"text":"diagnose.sh","type":"text","marks":[{"type":"code_inline"}]},{"text":" may report \"19 skill(s) missing .authorization\" even if credentials exist. Run Step 4 even when ","type":"text"},{"text":"~/.config/gangtise/authorization.json","type":"text","marks":[{"type":"code_inline"}]},{"text":" already exists — ","type":"text"},{"text":"configure_auth.sh","type":"text","marks":[{"type":"code_inline"}]},{"text":" creates the missing symlinks.","type":"text"}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Step 5 — Verify installation","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"bash \u003cgangtise-copilot-dir>/scripts/diagnose.sh","type":"text"}]},{"type":"paragraph","content":[{"text":"Expected output: no ","type":"text"},{"text":"❌","type":"text","marks":[{"type":"code_inline"}]},{"text":" lines. The exact pass count depends on which agents and preset are installed. A successful OAuth check only proves that the credentials can mint a token; the RAG line separately reports reachable, empty success, permission denial, authentication rejection, or a quota/entitlement response.","type":"text"}]},{"type":"paragraph","content":[{"text":"If any ❌ or ⚠️ remains, cross-reference with ","type":"text"},{"text":"references/known_issues.md","type":"text","marks":[{"type":"code_inline"}]},{"text":".","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Step 6 — Test with a real query","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"# Example: query latest research report for 宁德时代\n# Use gangtise-file-client with its report runner:\ncd \u003cgangtise-copilot-dir>/references/\n# See skill_registry.md for the exact command per skill","type":"text"}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"Overview","type":"text"}]},{"type":"paragraph","content":[{"text":"Gangtise is a Chinese professional investment-research data platform. It publishes an OpenAPI that covers research reports, company announcements, meeting summaries, chief analyst opinions, financial statements, valuation metrics, OHLC market data, shareholder data, industry indicators, and a catalog of pre-built research workflow skills. The underlying API is well-designed, but the skill ecosystem is ","type":"text"},{"text":"not discoverable","type":"text","marks":[{"type":"strong"}]},{"text":": there is no public manifest listing the 19 skills, the skills are distributed as independent ZIP files on a Huawei Cloud OBS bucket with listing permission disabled, and the skills live in two parallel naming conventions (","type":"text"},{"text":"gangtise-\u003cname>","type":"text","marks":[{"type":"code_inline"}]},{"text":" for the minimal line, ","type":"text"},{"text":"gangtise-\u003cname>-client","type":"text","marks":[{"type":"code_inline"}]},{"text":" for the full-capability line) that carry different feature sets. A first-time user has to reverse-engineer the complete skill inventory before they can install it.","type":"text"}]},{"type":"paragraph","content":[{"text":"Gangtise Copilot solves this in one command:","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Installs all 19 official Gangtise skills to Claude Code, OpenClaw, and Codex via a single bundled-download + distribute pipeline.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Walks the user through accessKey + secretAccessKey setup with a live authentication call against ","type":"text"},{"text":"open.gangtise.com/application/auth/oauth/open/loginV2","type":"text","marks":[{"type":"code_inline"}]},{"text":".","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Provides a read-only diagnostic script that reports which skills are installed, which credentials are valid, and which capability tiers are reachable.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Exposes preset install modes (","type":"text"},{"text":"minimal","type":"text","marks":[{"type":"code_inline"}]},{"text":" / ","type":"text"},{"text":"workshop","type":"text","marks":[{"type":"code_inline"}]},{"text":" / ","type":"text"},{"text":"full","type":"text","marks":[{"type":"code_inline"}]},{"text":") so users can match the install size to what their account license actually permits — see ISSUE-007 in ","type":"text"},{"text":"references/known_issues.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" for why \"biggest install\" is not the safe default.","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Runtime note from April 2026 usage","type":"text","marks":[{"type":"strong"}]},{"text":": after installing skills, run ","type":"text"},{"text":"configure_auth.sh","type":"text","marks":[{"type":"code_inline"}]},{"text":" even if ","type":"text"},{"text":"~/.config/gangtise/authorization.json","type":"text","marks":[{"type":"code_inline"}]},{"text":" already exists. Upstream CLI scripts also read ","type":"text"},{"text":"~/.GTS_AUTHORIZATION","type":"text","marks":[{"type":"code_inline"}]},{"text":", a bare runtime token file. The configurator refreshes both files.","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Architectural principles (do not violate)","type":"text"}]},{"type":"paragraph","content":[{"text":"This skill is a ","type":"text"},{"text":"wrapper layer","type":"text","marks":[{"type":"strong"}]},{"text":" around the Gangtise OpenAPI skill suite. The wrapper contract is non-negotiable:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Never vendor upstream files.","type":"text","marks":[{"type":"strong"}]},{"text":" This skill directory contains no copy, fork, or excerpt of any Gangtise skill content. When Gangtise ships a new release, users get the new release without any interference from this wrapper — the installer re-downloads from the canonical OBS URL every run.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Repairs (if any arise) happen at runtime, not at ship time.","type":"text","marks":[{"type":"strong"}]},{"text":" This wrapper was distilled from a session that encountered no actual upstream bugs — the friction was discoverability and install orchestration, not broken files. If future upstream bugs arise, they will be added to ","type":"text"},{"text":"references/known_issues.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" with runtime repair instructions, not patched at ship time.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Always ask before touching upstream files.","type":"text","marks":[{"type":"strong"}]},{"text":" Modifying any installed ","type":"text"},{"text":"gangtise-*","type":"text","marks":[{"type":"code_inline"}]},{"text":" skill directory requires explicit user consent via AskUserQuestion.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Teach rather than hide.","type":"text","marks":[{"type":"strong"}]},{"text":" Every installation step shows the user exactly which skills were downloaded, from where, and where the credential file was saved. This is how users learn to maintain their own installs.","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"What this skill does","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Capability","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Entry point","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Detail","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"1. Install Gangtise skills (minimal default, workshop alias, full, or ","type":"text"},{"text":"--only","type":"text","marks":[{"type":"code_inline"}]},{"text":" custom)","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"scripts/install_gangtise.sh","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"See ","type":"text"},{"text":"references/installation_flow.md","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"2. Configure accessKey + secretAccessKey credentials","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"scripts/configure_auth.sh","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"See ","type":"text"},{"text":"references/credentials_setup.md","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"3. Diagnose install state, credential validity, and capability tiers","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"scripts/diagnose.sh","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"See ","type":"text"},{"text":"references/known_issues.md","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"4. Look up which Gangtise skill answers a specific data question","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Skill registry below + ","type":"text"},{"text":"references/skill_registry.md","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"—","type":"text"}]}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Routing","type":"text"}]},{"type":"paragraph","content":[{"text":"When this skill is triggered, classify the user's intent and jump to the corresponding capability:","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"User says something like…","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Go to","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"装 gangtise\"、\"install gangtise\"、\"我想用 gangtise 的数据\"、\"把 gangtise 的 skill 都装上\"","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"One-shot installation (Step 1–5 above)","type":"text","marks":[{"type":"strong"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"配 gangtise 的 key\"、\"configure gangtise credentials\"、\"gangtise accessKey\"、\"secretAccessKey\"","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Capability 2","type":"text","marks":[{"type":"strong"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"gangtise 报错\"、\"token is invalid\"、\"接口地址错误\"、\"gangtise skill 加载失败\"、\"我的 gangtise 装得不对\"","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Capability 3","type":"text","marks":[{"type":"strong"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"宁德时代的研报\"、\"过去 30 天的首席观点\"、\"OHLC 蜡烛图\"、\"个股研究报告 L2\"、\"对宁德时代做观点 PK\"","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Capability 4","type":"text","marks":[{"type":"strong"}]},{"text":" → skill registry → invoke the matching upstream skill","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"帮我从头跑一遍 gangtise\"","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"One-shot installation (Step 1–5 in sequence)","type":"text"}]}]}]}]},{"type":"paragraph","content":[{"text":"When in doubt, start with ","type":"text"},{"text":"Capability 3","type":"text","marks":[{"type":"strong"}]},{"text":" (","type":"text"},{"text":"diagnose.sh","type":"text","marks":[{"type":"code_inline"}]},{"text":") — it is the only read-only entry point and it surfaces exactly which installs and credentials are currently blocked. Running it never has a destructive side effect.","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Capability 1: Install Gangtise skills","type":"text"}]},{"type":"paragraph","content":[{"text":"Gangtise publishes 19 independent skills on a Huawei Cloud OBS bucket. They are organized into 3 bundle ZIPs plus 1 standalone ZIP. The installer downloads the 4 archives, extracts the 19 skill directories, and symlinks each one into the detected agents' skills directories.","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Distribution source","type":"text"}]},{"type":"paragraph","content":[{"text":"All skills come from the official Gangtise OBS bucket:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"https://gts-download.obs.myhuaweicloud.com/skills/","type":"text"}]},{"type":"paragraph","content":[{"text":"No mirrors. The installer uses this URL directly.","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Bundle map","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Bundle","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Size","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Contains","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"gangtise-skills-client.zip","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"160 KB","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"data-client, kb-client, file-client, ","type":"text"},{"text":"file-client-no-download","type":"text","marks":[{"type":"strong"}]},{"text":", ","type":"text"},{"text":"stockpool-client","type":"text","marks":[{"type":"strong"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"gangtise-research.zip","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"220 KB","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"stock-research, opinion-pk, thematic-research, stock-selector, event-review, interview-outline, announcement-digest, opinion-summarizer, wechat-summary, data-processor","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"gangtise-skills.zip","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"118 KB","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"data (v1.2.0), file, kb — the legacy \"minimal\" parallel line","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"gangtise-web-client.zip","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"8 KB","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"web-client (standalone, not in any bundle)","type":"text"}]}]}]}]},{"type":"paragraph","content":[{"text":"Total","type":"text","marks":[{"type":"strong"}]},{"text":": 4 HTTP requests → 19 skill directories.","type":"text"}]},{"type":"paragraph","content":[{"text":"Two skills (","type":"text"},{"text":"gangtise-file-client-no-download","type":"text","marks":[{"type":"code_inline"}]},{"text":" and ","type":"text"},{"text":"gangtise-stockpool-client","type":"text","marks":[{"type":"code_inline"}]},{"text":") ","type":"text"},{"text":"only exist inside the ","type":"text","marks":[{"type":"strong"}]},{"text":"gangtise-skills-client","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":" bundle","type":"text","marks":[{"type":"strong"}]},{"text":" — they do not have standalone ZIPs. A naive \"list the standalone ZIP for each skill\" approach would miss them entirely. See ","type":"text"},{"text":"references/known_issues.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" ISSUE-002 for the full explanation.","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"One-command install","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"bash scripts/install_gangtise.sh","type":"text"}]},{"type":"paragraph","content":[{"text":"Flags:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"bash scripts/install_gangtise.sh --preset minimal # default — 3 skills via public open-* endpoints\nbash scripts/install_gangtise.sh --preset workshop # alias for minimal (same 3 skills)\nbash scripts/install_gangtise.sh --preset full # all 19 skills (most -client will fail without skills-backend ACL)\nbash scripts/install_gangtise.sh --only data-client,kb-client,file-client # custom subset\nbash scripts/install_gangtise.sh --no-openclaw # skip OpenClaw even if detected\nbash scripts/install_gangtise.sh --target claude-code # force single target","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Preset contents","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Preset","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Skills","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Intended for","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"minimal","type":"text","marks":[{"type":"strong"}]},{"text":" (default)","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"gangtise-data","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"gangtise-file","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"gangtise-kb","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Conservative install for accounts with access to the public ","type":"text"},{"text":"open-*","type":"text","marks":[{"type":"code_inline"}]},{"text":" endpoints. It avoids the ISSUE-007 ","type":"text"},{"text":"skills-backend/*","type":"text","marks":[{"type":"code_inline"}]},{"text":" ACL, while API points and product permissions still apply. Covers OHLC, financials, announcements, foreign reports, and RAG retrieval.","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"workshop","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"(alias for ","type":"text"},{"text":"minimal","type":"text","marks":[{"type":"code_inline"}]},{"text":" — same 3 skills)","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Historical preset bundled 7 ","type":"text"},{"text":"-client","type":"text","marks":[{"type":"code_inline"}]},{"text":"-heavy skills, but those are blocked by ISSUE-007 on most accounts and produce a broken live demo. The preset now points at the same 3 skills as ","type":"text"},{"text":"minimal","type":"text","marks":[{"type":"code_inline"}]},{"text":" so it can no longer footgun a workshop.","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"full","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"All 19 skills","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Both lines side-by-side. Useful for exploring the full Gangtise catalog. ","type":"text"},{"text":"Most ","type":"text","marks":[{"type":"strong"}]},{"text":"-client","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":" skills will fail at runtime if your account lacks ","type":"text","marks":[{"type":"strong"}]},{"text":"skills-backend/*","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":" ACL","type":"text","marks":[{"type":"strong"}]},{"text":" — confirm with the diagnostic in ISSUE-007 first.","type":"text"}]}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Capability 2: Configure credentials","type":"text"}]},{"type":"paragraph","content":[{"text":"Every Gangtise skill needs an ","type":"text"},{"text":".authorization","type":"text","marks":[{"type":"code_inline"}]},{"text":" credential file colocated with its Python runtime, in one of two shapes:","type":"text"}]},{"type":"paragraph","content":[{"text":"Shape A","type":"text","marks":[{"type":"strong"}]},{"text":" — accessKey + secretAccessKey (most common, auto-refreshes tokens):","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"json"},"content":[{"text":"{\n \"accessKey\": \"\u003cyour-accessKey>\",\n \"secretAccessKey\": \"\u003cyour-secretAccessKey>\"\n}","type":"text"}]},{"type":"paragraph","content":[{"text":"Shape B","type":"text","marks":[{"type":"strong"}]},{"text":" — long-term token (advanced, for pre-generated long-lived tokens):","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"json"},"content":[{"text":"{\n \"long-term-token\": \"Bearer \u003ctoken>\"\n}","type":"text"}]},{"type":"paragraph","content":[{"text":"Because 19 skills each need the same ","type":"text"},{"text":".authorization","type":"text","marks":[{"type":"code_inline"}]},{"text":" file, the wrapper stores ","type":"text"},{"text":"one shared file","type":"text","marks":[{"type":"strong"}]},{"text":" at ","type":"text"},{"text":"~/.config/gangtise/authorization.json","type":"text","marks":[{"type":"code_inline"}]},{"text":" (XDG standard, mode 600) and symlinks every skill's local credential file to it. Rotating credentials means editing one file, not 19.","type":"text"}]},{"type":"paragraph","content":[{"text":"Run the configurator:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"bash scripts/configure_auth.sh","type":"text"}]},{"type":"paragraph","content":[{"text":"It will:","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Prompt for accessKey and secretAccessKey (or read from the ","type":"text"},{"text":"GANGTISE_ACCESS_KEY","type":"text","marks":[{"type":"code_inline"}]},{"text":" / ","type":"text"},{"text":"GANGTISE_SECRET_KEY","type":"text","marks":[{"type":"code_inline"}]},{"text":" environment variables if set).","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Write to ","type":"text"},{"text":"~/.config/gangtise/authorization.json","type":"text","marks":[{"type":"code_inline"}]},{"text":" with mode 600.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Perform a ","type":"text"},{"text":"live authentication call","type":"text","marks":[{"type":"strong"}]},{"text":" to ","type":"text"},{"text":"https://open.gangtise.com/application/auth/oauth/open/loginV2","type":"text","marks":[{"type":"code_inline"}]},{"text":" to verify the credentials actually work.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Write ","type":"text"},{"text":"~/.GTS_AUTHORIZATION","type":"text","marks":[{"type":"code_inline"}]},{"text":" with the bare runtime token required by upstream CLI scripts.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Create symlinks from every installed skill's local credential file to the shared XDG file.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Report success with the uid + userName returned by the Gangtise auth server.","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Credential rotation","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"# Edit one file:\n$EDITOR ~/.config/gangtise/authorization.json\n\n# Re-verify against the live server:\nbash scripts/configure_auth.sh --verify-only","type":"text"}]},{"type":"paragraph","content":[{"text":"No other files need to change — the symlinks still point at the updated file.","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Capability 3: Diagnose install state","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"bash scripts/diagnose.sh","type":"text"}]},{"type":"paragraph","content":[{"text":"The diagnostic script is ","type":"text"},{"text":"strictly read-only","type":"text","marks":[{"type":"strong"}]},{"text":". It checks:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Which of the 19 skills are present in each detected agent's ","type":"text"},{"text":"skills/","type":"text","marks":[{"type":"code_inline"}]},{"text":" directory","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Whether ","type":"text"},{"text":"~/.config/gangtise/authorization.json","type":"text","marks":[{"type":"code_inline"}]},{"text":" exists with mode 600","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Whether each skill's local credential file is a valid symlink pointing at the shared XDG file","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Whether the stored credentials pass a live authentication call (short probe that only needs ","type":"text"},{"text":"oauth/open/loginV2","type":"text","marks":[{"type":"code_inline"}]},{"text":")","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Whether the canonical RAG endpoint responds to a minimal query. The result distinguishes a successful response with matches, a successful empty response, authentication rejection, permission denial, a quota/entitlement response, malformed response, and network failure. It retains HTTP status, API code, ","type":"text"},{"text":"errorType","type":"text","marks":[{"type":"code_inline"}]},{"text":", and ","type":"text"},{"text":"traceId","type":"text","marks":[{"type":"code_inline"}]},{"text":" without printing credentials or the complete token response.","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Exit codes:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"0","type":"text","marks":[{"type":"code_inline"}]},{"text":" — all healthy","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"1","type":"text","marks":[{"type":"code_inline"}]},{"text":" — one or more issues need user action","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"2","type":"text","marks":[{"type":"code_inline"}]},{"text":" — diagnostic itself failed (network error, no internet, etc.)","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"If diagnose reports issues, cross-reference the output against ","type":"text"},{"text":"references/known_issues.md","type":"text","marks":[{"type":"code_inline"}]},{"text":". Each reported issue maps to a specific remediation section.","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Capability 4: Skill registry — \"which skill answers my data question?\"","type":"text"}]},{"type":"paragraph","content":[{"text":"This is the non-obvious value of the wrapper. Gangtise's 19 skills form a ","type":"text"},{"text":"two-dimensional matrix","type":"text","marks":[{"type":"strong"}]},{"text":" (data tier × operation type) that is not clearly documented. Use this table to route a user question to the right skill:","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Data-layer skills (6)","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Want to…","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Upstream skill","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Invoke","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Query semantic content across knowledge base (reports + opinions + minutes)","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"gangtise-kb-client","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"kb","type":"text","marks":[{"type":"code_inline"}]},{"text":" runner with ","type":"text"},{"text":"-q","type":"text","marks":[{"type":"code_inline"}]},{"text":" query + optional ","type":"text"},{"text":"--file-types","type":"text","marks":[{"type":"code_inline"}]},{"text":" / ","type":"text"},{"text":"--securities","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"List documents by type + date + security (reports, announcements, summaries, opinions, roadshows)","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"gangtise-file-client","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"dedicated runners per document type (report / opinion / summary / announcement / investment_calendar / foreign_report / internal_report / wechat_message)","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Pull OHLC daily candles for an A-share or HK stock","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"gangtise-data-client","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"quote","type":"text","marks":[{"type":"code_inline"}]},{"text":" runner with ","type":"text"},{"text":"--securities {name}","type":"text","marks":[{"type":"code_inline"}]},{"text":" + ","type":"text"},{"text":"-sd","type":"text","marks":[{"type":"code_inline"}]},{"text":" / ","type":"text"},{"text":"-ed","type":"text","marks":[{"type":"code_inline"}]},{"text":" date range","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Pull financial statements (income / balance / cash flow indicators)","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"gangtise-data-client","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"financial","type":"text","marks":[{"type":"code_inline"}]},{"text":" runner with ","type":"text"},{"text":"--securities {name}","type":"text","marks":[{"type":"code_inline"}]},{"text":" + ","type":"text"},{"text":"--indicators","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Pull valuation metrics (PE / PS / PB / PEG + historical percentiles)","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"gangtise-data-client","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"valuation","type":"text","marks":[{"type":"code_inline"}]},{"text":" runner with ","type":"text"},{"text":"--securities {name}","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Pull main business composition (by product / industry / region)","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"gangtise-data-client","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"main_business","type":"text","marks":[{"type":"code_inline"}]},{"text":" runner with ","type":"text"},{"text":"--securities {name}","type":"text","marks":[{"type":"code_inline"}]},{"text":" + ","type":"text"},{"text":"--classify-method","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Pull shareholder / top-holder data","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"gangtise-data-client","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"shareholder","type":"text","marks":[{"type":"code_inline"}]},{"text":" runner with ","type":"text"},{"text":"--securities {name}","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Pull macro / industry indicators (GDP, CPI, vehicle sales, commodity prices)","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"gangtise-data-client","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"industry_indicator","type":"text","marks":[{"type":"code_inline"}]},{"text":" runner with ","type":"text"},{"text":"-k {keyword}","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Look up security standard codes by name","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"gangtise-data-client","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"security","type":"text","marks":[{"type":"code_inline"}]},{"text":" runner with ","type":"text"},{"text":"-k {name}","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"List sector constituent stocks by theme or industry","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"gangtise-data-client","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"block_component","type":"text","marks":[{"type":"code_inline"}]},{"text":" runner with ","type":"text"},{"text":"-k {theme}","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"List index members by category","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"gangtise-data-client","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"index","type":"text","marks":[{"type":"code_inline"}]},{"text":" runner with ","type":"text"},{"text":"-k {index type}","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Search the open web for public information not in Gangtise's internal KB","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"gangtise-web-client","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"web","type":"text","marks":[{"type":"code_inline"}]},{"text":" runner with ","type":"text"},{"text":"-q {query}","type":"text","marks":[{"type":"code_inline"}]}]}]}]}]},{"type":"paragraph","content":[{"text":"See ","type":"text"},{"text":"references/skill_registry.md","type":"text","marks":[{"type":"link","attrs":{"href":"references/skill_registry.md","title":null}},{"type":"code_inline"}]},{"text":" for the full per-runner parameter reference and cross-skill composition examples.","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Workflow-layer skills (10) — higher-order research workflows","type":"text"}]},{"type":"paragraph","content":[{"text":"These skills ","type":"text"},{"text":"orchestrate","type":"text","marks":[{"type":"strong"}]},{"text":" the data-layer skills into end-to-end research workflows. They produce Markdown + HTML reports following Gangtise's professional investment-research templates and built-in compliance guardrails (no \"买入 / 卖出 / 目标价 / 推荐\" language).","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Want to…","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Use","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Generate a stock research report at L1-L4 depth (L1 = 1-page framework, L4 = full institutional coverage)","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"gangtise-stock-research","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Do adversarial analysis on an investment thesis (\"play devil's advocate for this long call\")","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"gangtise-opinion-pk","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Do thematic / sector research (driver analysis, enumeration phase, stock screening, performance check)","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"gangtise-thematic-research","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Screen stocks based on research criteria","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"gangtise-stock-selector","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Write an 800-1000 word event review / post-mortem for a market event","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"gangtise-event-review","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Generate a company-meeting outline (3-step workflow: data → topics → questions)","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"gangtise-interview-outline","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Track recent announcements for a stock pool and produce a daily digest","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"gangtise-announcement-digest","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Summarize a chief analyst's recent opinions","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"gangtise-opinion-summarizer","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Turn a WeChat chat-group discussion log into a structured investment daily","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"gangtise-wechat-summary","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Get methodology guidance on how to design a custom data-processing workflow","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"gangtise-data-processor","type":"text","marks":[{"type":"code_inline"}]}]}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Utility skills (3)","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Skill","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Purpose","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"gangtise-stockpool-client","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Create / rename / delete a stock pool; add or remove stocks from it. Only distributed inside ","type":"text"},{"text":"gangtise-skills-client.zip","type":"text","marks":[{"type":"code_inline"}]},{"text":".","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"gangtise-file-client-no-download","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Variant of ","type":"text"},{"text":"file-client","type":"text","marks":[{"type":"code_inline"}]},{"text":" that disables the download capability — useful in read-only environments or compliance-sensitive contexts.","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Legacy ","type":"text"},{"text":"gangtise-data","type":"text","marks":[{"type":"code_inline"}]},{"text":" / ","type":"text"},{"text":"gangtise-file","type":"text","marks":[{"type":"code_inline"}]},{"text":" / ","type":"text"},{"text":"gangtise-kb","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"The older minimal parallel line. ","type":"text"},{"text":"data","type":"text","marks":[{"type":"code_inline"}]},{"text":" is v1.2.0 with strictly-typed security codes (no name resolution). Only install if the user wants the smaller feature footprint.","type":"text"}]}]}]}]},{"type":"paragraph","content":[{"text":"See ","type":"text"},{"text":"references/skill_registry.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" for the full per-skill script catalog, versions, and capability matrix.","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"What this skill refuses to do","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Vendor, fork, or mirror any ","type":"text"},{"text":"gangtise-*","type":"text","marks":[{"type":"code_inline"}]},{"text":" skill's content into this directory — only the canonical OBS URLs are referenced.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Pin an upstream skill version in SKILL.md — the installer always downloads the current OBS artifact.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Silently patch upstream files — every modification path (if any are ever added) would require explicit consent via AskUserQuestion.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Hardcode personal accessKey / secretAccessKey values.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Make investment recommendations or trading decisions. Gangtise's own skills already enforce these compliance rules; this wrapper strictly delegates.","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"File layout","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"gangtise-copilot/\n├── SKILL.md # This file\n├── scripts/\n│ ├── install_gangtise.sh # Download bundles → stage → distribute\n│ ├── configure_auth.sh # Set up + verify credentials\n│ └── diagnose.sh # Read-only health report\n├── references/\n│ ├── installation_flow.md # How the installer works, flag reference, troubleshooting\n│ ├── credentials_setup.md # accessKey / secretAccessKey, XDG paths, liveness check\n│ ├── skill_registry.md # Complete per-skill capability matrix\n│ ├── known_issues.md # Two parallel product lines, bundle-only skills, and other gotchas\n│ └── best_practices.md # How to combine stock-research + opinion-pk + data-client effectively\n└── config-template/\n └── authorization.json.example # Credential file template (placeholder values only)","type":"text"}]}]},"metadata":{"date":"2026-11-02","name":"gangtise-copilot","author":"@skillopedia","source":{"stars":1511,"repo_name":"claude-code-skills","origin_url":"https://github.com/daymade/claude-code-skills/blob/HEAD/daymade-financial/gangtise-copilot/SKILL.md","repo_owner":"daymade","body_sha256":"82b10f860b0b3c6291dd5747d879a1c4b4d9065dd93ceb18a29ddd43472c65c7","cluster_key":"679c9e07f65d4233f80f226788bced2b4878ee2078b71fb9a32e00e1d74c93a7","clean_bundle":{"format":"clean-skill-bundle-v1","source":"daymade/claude-code-skills/daymade-financial/gangtise-copilot/SKILL.md","text_bytes":123362,"source_commit":"0633c92cdf1192ebed0b550384ea2a56f0abd520","skills_sh_rank":15961,"attachment_count":11,"text_attachments":11,"attachment_storage":"skill_attachments","binary_attachments":0},"cluster_size":1,"skill_md_path":"daymade-financial/gangtise-copilot/SKILL.md","import_metadata":{"date":"2026-11-02","author":"@skillopedia","version":"v1","category":"integrations-apis","category_label":"Integrations"},"exact_dupes_collapsed_into_this":0},"version":"v1","category":"integrations-apis","import_tag":"skills-sh-top20k-2026-11","description":"Gangtise (岗底斯投研) OpenAPI skill suite installer and diagnostic tool. One-click install 19 official skills (data, research, utility), configure accessKey/secretAccessKey, run health diagnostics. Trigger when user mentions Gangtise, 岗底斯, any gangtise-* skill, credential setup, or reports errors like 'token is invalid' / '接口地址错误'.","disable-model-invocation":true}},"renderedAt":1793666593117}

Gangtise Copilot One-command installer, credential configurator, and diagnostic layer for the full Gangtise (岗底斯投研) OpenAPI skill suite. --- 🚀 One-shot installation (complete flow) This is the only section you need to read to go from zero to fully working Gangtise. Follow steps in order. Step 1 — Download this skill to your agent's skills directory Primary method (git clone): Fallback method (when git clone times out or is unavailable — use GitHub API directly): Important : Network to GitHub may be unstable. If any file fails, retry the specific file up to 3 times with a 2-second delay betwe…