cnhkmcp 2.1.4__py3-none-any.whl → 2.1.6__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (22) hide show
  1. cnhkmcp/__init__.py +126 -126
  2. cnhkmcp/untracked/back_up/forum_functions.py +998 -0
  3. cnhkmcp/untracked/back_up/platform_functions.py +2886 -0
  4. cnhkmcp/untracked/brain-consultant.md +31 -0
  5. cnhkmcp/untracked/forum_functions.py +350 -941
  6. cnhkmcp/untracked/platform_functions.py +445 -730
  7. cnhkmcp/untracked/skills/Claude_Skill_Creation_Guide.md +140 -0
  8. cnhkmcp/untracked/skills/expression_verifier/SKILL.md +51 -0
  9. cnhkmcp/untracked/skills/expression_verifier/scripts/validator.py +889 -0
  10. cnhkmcp/untracked/skills/expression_verifier/scripts/verify_expr.py +52 -0
  11. cnhkmcp/untracked/skills/pull_BRAINSkill/SKILL.md +51 -0
  12. cnhkmcp/untracked/skills/pull_BRAINSkill/scripts/pull_skills.py +188 -0
  13. cnhkmcp/untracked//321/211/320/225/320/235/321/207/342/225/234/320/276/321/205/320/231/320/235/321/210/342/224/220/320/240/321/210/320/261/320/234/321/206/320/230/320/241_/321/205/320/276/320/231/321/210/320/263/320/225/321/205/342/224/220/320/225/321/210/320/266/320/221/321/204/342/225/233/320/255/321/210/342/225/241/320/246/321/205/320/234/320/225.py +3 -1
  14. {cnhkmcp-2.1.4.dist-info → cnhkmcp-2.1.6.dist-info}/METADATA +1 -1
  15. {cnhkmcp-2.1.4.dist-info → cnhkmcp-2.1.6.dist-info}/RECORD +19 -13
  16. cnhkmcp/untracked/APP/Tranformer/ace.log +0 -0
  17. cnhkmcp/untracked/APP/Tranformer/parsetab.py +0 -60
  18. cnhkmcp/untracked/APP/simulator/wqb20260107015647.log +0 -57
  19. {cnhkmcp-2.1.4.dist-info → cnhkmcp-2.1.6.dist-info}/WHEEL +0 -0
  20. {cnhkmcp-2.1.4.dist-info → cnhkmcp-2.1.6.dist-info}/entry_points.txt +0 -0
  21. {cnhkmcp-2.1.4.dist-info → cnhkmcp-2.1.6.dist-info}/licenses/LICENSE +0 -0
  22. {cnhkmcp-2.1.4.dist-info → cnhkmcp-2.1.6.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,52 @@
1
+ import sys
2
+ import json
3
+ import os
4
+
5
+ # Ensure the current directory is in sys.path so we can import validator locally
6
+ current_dir = os.path.dirname(os.path.abspath(__file__))
7
+ if current_dir not in sys.path:
8
+ sys.path.insert(0, current_dir)
9
+
10
+ try:
11
+ from validator import ExpressionValidator
12
+ except ImportError as e:
13
+ print(json.dumps({
14
+ "valid": False,
15
+ "errors": [f"Error importing validator module: {e}. Ensure validator.py is in the same directory."],
16
+ "tokens": [],
17
+ "ast": None
18
+ }, ensure_ascii=False))
19
+ sys.exit(1)
20
+
21
+ def main():
22
+ if len(sys.argv) < 2:
23
+ print(json.dumps({
24
+ "valid": False,
25
+ "errors": ["No expression provided. Usage: python verify_expr.py 'expression'"],
26
+ "tokens": [],
27
+ "ast": None
28
+ }, ensure_ascii=False))
29
+ sys.exit(1)
30
+
31
+ # Combine arguments in case the expression was split by shell
32
+ expression = " ".join(sys.argv[1:])
33
+
34
+ try:
35
+ validator = ExpressionValidator()
36
+ result = validator.check_expression(expression)
37
+
38
+ # Serialize the result to JSON
39
+ # default=str is used to handle objects like tokens or AST nodes that might not be directly serializable
40
+ print(json.dumps(result, indent=2, ensure_ascii=False, default=str))
41
+
42
+ except Exception as e:
43
+ print(json.dumps({
44
+ "valid": False,
45
+ "errors": [f"Exception during validation: {str(e)}"],
46
+ "tokens": [],
47
+ "ast": None
48
+ }, ensure_ascii=False))
49
+ sys.exit(1)
50
+
51
+ if __name__ == "__main__":
52
+ main()
@@ -0,0 +1,51 @@
1
+ ---
2
+ name: pull_brainskill
3
+ description: Pulls valid Claude Skills from a ZIP URL (preferred), Git repository, or local directory. Only folders containing a strictly named SKILL.md file are imported.
4
+ allowed-tools: Bash
5
+ ---
6
+
7
+ # Pull BRAIN Skill
8
+
9
+ This skill imports skill folders from a remote source or local directory.
10
+
11
+ **Strict Validation**: A folder is considered a valid skill ONLY if it contains a `SKILL.md` file (strictly case-sensitive). Folders with `skill.md` or `Skill.md` will be skipped.
12
+
13
+ ## How to use
14
+
15
+ 1. **Locate the script**:
16
+ - Project path: `.claude/skills/pull_BRAINSkill/scripts/pull_skills.py`
17
+ - Global path (Windows): `%USERPROFILE%\.claude\skills\pull_BRAINSkill\scripts\pull_skills.py`
18
+
19
+ 2. **Run the script**: Provide a ZIP URL (Recommended), Git URL, or local path.
20
+
21
+ ### Example 1: Pull via ZIP (Recommended First Choice)
22
+ This method is faster and works best in restricted network environments. To do this, you must firstly parse the repository into a ZIP file URL by appending `/archive/refs/heads/main.zip` to the repo URL. For example, for a repository at `https://github.com/GitRepoAuthorName/RepoName`, the ZIP URL would be `https://github.com/GitRepoAuthorName/RepoName/archive/refs/heads/main.zip`.
23
+ ```bash
24
+ python ".claude/skills/pull_BRAINSkill/scripts/pull_skills.py" "https://github.com/GitRepoAuthorName/RepoName/archive/refs/heads/main.zip" --overwrite
25
+ ```
26
+
27
+ ### Example 2: Pull via Git
28
+ Use this if you need a specific branch or have git configured.
29
+ ```bash
30
+ python ".claude/skills/pull_BRAINSkill/scripts/pull_skills.py" "https://github.com/GitRepoAuthorName/RepoName.git"
31
+ ```
32
+
33
+ ### Example 3: Import from Local Directory
34
+ ```bash
35
+ python ".claude/skills/pull_BRAINSkill/scripts/pull_skills.py" "C:/Downloads/my-skills-repo"
36
+ ```
37
+
38
+ Options:
39
+ - `--dest <path>`: Destination directory for skills (default: `.claude/skills` relative to current project).
40
+ - `--branch <branch>`: Specify branch to checkout.
41
+ - `--overwrite`: Overwrite existing skill folders with the same name.
42
+
43
+ ## Behavior
44
+ - Clones the repository shallowly (`--depth 1`) into a temp directory.
45
+ - Scans top-level folders for `SKILL.md`.
46
+ - Copies valid skill folders into the destination `.claude/skills` directory.
47
+
48
+ ## Notes
49
+ - Paths use forward slashes for compatibility.
50
+ - Requires `git` in PATH.
51
+ - Only checks for the presence of `SKILL.md`, not content validity.
@@ -0,0 +1,188 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ """
4
+ Pull Skill Folders from a Git repository into a local .claude/skills directory.
5
+
6
+ Usage:
7
+ python pull_skills.py <git_repo_url> [--dest <dest_path>] [--branch <branch>] [--overwrite]
8
+
9
+ - git_repo_url: HTTPS git URL, e.g., https://github.com/GitRepoAuthorName/-.git
10
+ - dest_path: Destination folder for skills (default: <cwd>/.claude/skills)
11
+ - branch: Branch to checkout (default: auto, uses repo default)
12
+ - overwrite: If set, overwrite existing skill folders (default: off)
13
+
14
+ Behavior:
15
+ - Clones the repo into a temporary directory (depth=1)
16
+ - Scans top-level subfolders for a SKILL.md file
17
+ - Copies those folders into the destination .claude/skills directory
18
+
19
+ Notes:
20
+ - Requires Git installed and available in PATH.
21
+ - Only validates existence of SKILL.md, does not validate YAML content.
22
+ - Copies one level deep (top-level folders only).
23
+ """
24
+
25
+ import os
26
+ import sys
27
+ import json
28
+ import shutil
29
+ import tempfile
30
+ import subprocess
31
+ from typing import List, Dict
32
+
33
+
34
+ def run(cmd: List[str], cwd: str | None = None) -> subprocess.CompletedProcess:
35
+ return subprocess.run(cmd, cwd=cwd, capture_output=True, text=True)
36
+
37
+
38
+ def ensure_dir(path: str) -> None:
39
+ os.makedirs(path, exist_ok=True)
40
+
41
+
42
+ def copy_skill_folder(src_folder: str, dest_root: str, overwrite: bool) -> Dict[str, str]:
43
+ name = os.path.basename(src_folder.rstrip("/\\"))
44
+ dest_folder = os.path.join(dest_root, name)
45
+
46
+ # STRICT check for SKILL.md existence (case-sensitive)
47
+ # os.listdir returns the actual filename on the filesystem
48
+ if "SKILL.md" not in os.listdir(src_folder):
49
+ return {"status": "skipped", "folder": name, "reason": "no SKILL.md found (strictly case-sensitive)"}
50
+
51
+ if os.path.exists(dest_folder):
52
+ if overwrite:
53
+ shutil.rmtree(dest_folder)
54
+ else:
55
+ return {"status": "skipped", "folder": name, "reason": "exists"}
56
+
57
+ shutil.copytree(src_folder, dest_folder)
58
+
59
+ return {"status": "copied", "folder": name, "dest": dest_folder}
60
+
61
+
62
+ def main():
63
+ if len(sys.argv) < 2:
64
+ print(json.dumps({
65
+ "ok": False,
66
+ "error": "Missing git repo URL",
67
+ "usage": "python pull_skills.py <git_repo_url> [--dest <dest_path>] [--branch <branch>] [--overwrite]"
68
+ }, ensure_ascii=False))
69
+ sys.exit(1)
70
+
71
+ repo_url = sys.argv[1]
72
+ dest = None
73
+ branch = None
74
+ overwrite = False
75
+
76
+ # Parse optional args
77
+ args = sys.argv[2:]
78
+ i = 0
79
+ while i < len(args):
80
+ a = args[i]
81
+ if a == "--dest" and i + 1 < len(args):
82
+ dest = args[i + 1]
83
+ i += 2
84
+ elif a == "--branch" and i + 1 < len(args):
85
+ branch = args[i + 1]
86
+ i += 2
87
+ elif a == "--overwrite":
88
+ overwrite = True
89
+ i += 1
90
+ else:
91
+ i += 1
92
+
93
+ if not dest:
94
+ dest = os.path.join(os.getcwd(), ".claude", "skills")
95
+ ensure_dir(dest)
96
+
97
+ tempdir = tempfile.mkdtemp(prefix="pull_skills_")
98
+ repo_dir = os.path.join(tempdir, "repo")
99
+
100
+
101
+ # Handle local directory vs git URL vs ZIP URL
102
+ if os.path.isdir(repo_url):
103
+ # Case 1: Local directory
104
+ try:
105
+ shutil.copytree(repo_url, repo_dir, dirs_exist_ok=True)
106
+ except Exception as e:
107
+ print(json.dumps({"ok": False, "stage": "copy_local", "error": str(e)}, ensure_ascii=False))
108
+ sys.exit(2)
109
+
110
+ elif repo_url.lower().endswith(".zip"):
111
+ # Case 2: ZIP URL (direct download)
112
+ import urllib.request
113
+ import zipfile
114
+
115
+ try:
116
+ zip_path = os.path.join(tempdir, "repo.zip")
117
+ # print(f"Downloading {repo_url}...", file=sys.stderr)
118
+ urllib.request.urlretrieve(repo_url, zip_path)
119
+
120
+ extract_dir = os.path.join(tempdir, "extracted")
121
+ with zipfile.ZipFile(zip_path, 'r') as zip_ref:
122
+ zip_ref.extractall(extract_dir)
123
+
124
+ # Handle GitHub zip structure: usually extract_dir/<repo-branch>/...
125
+ # We want repo_dir to point to the folder containing the skills
126
+ contents = os.listdir(extract_dir)
127
+ if len(contents) == 1 and os.path.isdir(os.path.join(extract_dir, contents[0])):
128
+ # Move the inner content to repo_dir
129
+ shutil.move(os.path.join(extract_dir, contents[0]), repo_dir)
130
+ else:
131
+ shutil.move(extract_dir, repo_dir)
132
+
133
+ except Exception as e:
134
+ print(json.dumps({
135
+ "ok": False,
136
+ "stage": "download_zip",
137
+ "error": str(e),
138
+ "url": repo_url
139
+ }, ensure_ascii=False))
140
+ sys.exit(2)
141
+
142
+ else:
143
+ # Case 3: Git Clone
144
+ clone_cmd = ["git", "clone", "--depth", "1"]
145
+ if branch:
146
+ clone_cmd += ["--branch", branch]
147
+ clone_cmd += [repo_url, repo_dir]
148
+
149
+ cp = run(clone_cmd)
150
+ if cp.returncode != 0:
151
+ print(json.dumps({
152
+ "ok": False,
153
+ "stage": "clone",
154
+ "cmd": " ".join(clone_cmd),
155
+ "stderr": cp.stderr.strip(),
156
+ "stdout": cp.stdout.strip()
157
+ }, ensure_ascii=False))
158
+ sys.exit(2)
159
+
160
+ # Scan top-level subfolders
161
+ copied: List[Dict[str, str]] = []
162
+ skipped: List[Dict[str, str]] = []
163
+
164
+ for entry in os.listdir(repo_dir):
165
+ sub = os.path.join(repo_dir, entry)
166
+ if os.path.isdir(sub):
167
+ # Check for skill.md case-insensitively
168
+ res = copy_skill_folder(sub, dest, overwrite)
169
+ if res["status"] == "copied":
170
+ copied.append(res)
171
+ else:
172
+ # If "no SKILL.md found", we just skip silently effectively (or log as skipped)
173
+ # But to avoid cluttering output with non-skill folders, strict filtering is good.
174
+ pass
175
+
176
+ result = {
177
+ "ok": True,
178
+ "repo": repo_url,
179
+ "dest": dest,
180
+ "copied": copied,
181
+ "skipped": skipped
182
+ }
183
+
184
+ print(json.dumps(result, indent=2, ensure_ascii=False))
185
+
186
+
187
+ if __name__ == "__main__":
188
+ main()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cnhkmcp
3
- Version: 2.1.4
3
+ Version: 2.1.6
4
4
  Summary: A comprehensive Model Context Protocol (MCP) server for quantitative trading platform integration
5
5
  Home-page: https://github.com/cnhk/cnhkmcp
6
6
  Author: CNHK
@@ -1,9 +1,10 @@
1
- cnhkmcp/__init__.py,sha256=_lWrFPOIpgdmU010YgneR-byEAtRsBlTUILbjIQMIaw,2885
1
+ cnhkmcp/__init__.py,sha256=fp9yWADe1jqbEjs7fTd6zO9uISqJv_LSd1TIkv-roD8,2759
2
2
  cnhkmcp/untracked/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
3
  cnhkmcp/untracked/arXiv_API_Tool_Manual.md,sha256=I3hvI5mpmIjBuWptufoVSWFnuhyUc67oCGHEuR0p_xs,13552
4
4
  cnhkmcp/untracked/arxiv_api.py,sha256=-E-Ub9K-DXAYaCjrbobyfQ9H97gaZBc7pL6xPEyVHec,9020
5
- cnhkmcp/untracked/forum_functions.py,sha256=QW-CplAsqDkw-Wcwq-1tuZBq48dEO-vXZ8xw7X65EuE,42303
6
- cnhkmcp/untracked/platform_functions.py,sha256=M2U2BWXZsqLBCFlZo_wv-UARDn4bNEM598db7WeBL8I,123340
5
+ cnhkmcp/untracked/brain-consultant.md,sha256=6eqVPT-EVLZgP_kOt1HSibXixbIMeoubX8mS5o4OxBs,3696
6
+ cnhkmcp/untracked/forum_functions.py,sha256=VuyUaguA0OjJbVRN5Vy8UEFXSAviS3jhDSRWyyPOtfo,18975
7
+ cnhkmcp/untracked/platform_functions.py,sha256=bm7IOuUAfPqj9BmlViCD8e3J0mi3BGb4xh0vuL1H-Yk,111205
7
8
  cnhkmcp/untracked/sample_mcp_config.json,sha256=QSFvZ086bxUQsvmLjcE6pL9ObzKn4FGnt9npWPo7Eps,1044
8
9
  cnhkmcp/untracked/user_config.json,sha256=_INn1X1qIsITrmEno-BRlQOAGm9wnNCw-6B333DEvnk,695
9
10
  cnhkmcp/untracked/示例参考文档_BRAIN_Alpha_Test_Requirements_and_Tips.md,sha256=W4dtQrqoTN72UyvIsvkGRF0HFOJLHSDeeSlbR3gqQg0,17133
@@ -12,7 +13,7 @@ cnhkmcp/untracked/示例工作流_BRAIN_6_Tips_Datafield_Exploration_Guide.md,sh
12
13
  cnhkmcp/untracked/示例工作流_BRAIN_Alpha_Improvement_Workflow.md,sha256=XlWYREd_qXe1skdXIhkiGY05oDr_6KiBs1WkerY4S8U,5092
13
14
  cnhkmcp/untracked/示例工作流_Dataset_Exploration_Expert_Manual.md,sha256=-C4fWdaBe9UzA5BDZz0Do2z8RaPWLslb6D0nTz6fqk4,24403
14
15
  cnhkmcp/untracked/示例工作流_daily_report_workflow.md,sha256=6aNmPqWRn09XdQMRxoVTka9IYVOUv5LcWparHu16EfQ,9460
15
- cnhkmcp/untracked/配置前运行我_安装必要依赖包.py,sha256=BnUyL5g6PaC62yEuS-8vcDSJ0oKu3k6jqQxi2jginuQ,6612
16
+ cnhkmcp/untracked/配置前运行我_安装必要依赖包.py,sha256=OhIB-55xLcGov6KzWdl59NL5bmtveJXhRnHkk-5QvsY,6646
16
17
  cnhkmcp/untracked/AI桌面插件/README.md,sha256=HMeOogrMdlPCcbWoeCwJaWgnkmsEOO4bGyfzqpLP4h4,1246
17
18
  cnhkmcp/untracked/AI桌面插件/ace.log,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
18
19
  cnhkmcp/untracked/AI桌面插件/config.json,sha256=NzuPhGVv3YFDBHvsSDdIX15SCbesxI9P_L9YGh1ateE,1986
@@ -124,10 +125,8 @@ cnhkmcp/untracked/APP/ssrn-3332513.pdf,sha256=GEwf1Srtk-fTvF03dhTEjXJstHBARIUg31
124
125
  cnhkmcp/untracked/APP/usage.md,sha256=lPpA6qqAMvVsm41ikbRR1ZWFcuPSgqhMXOUig52eZCI,16164
125
126
  cnhkmcp/untracked/APP/运行打开我.py,sha256=hNZ6ohu4fe1ySiH_oE5FhRunAUPt_e_zq7BymsiRHzg,100143
126
127
  cnhkmcp/untracked/APP/Tranformer/Transformer.py,sha256=ViAu-YZjH3AVAQfZuaQx__w7KbhLNTghvauEiEWYAcc,189045
127
- cnhkmcp/untracked/APP/Tranformer/ace.log,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
128
128
  cnhkmcp/untracked/APP/Tranformer/ace_lib.py,sha256=nSnmM5zfI6lxIln1vctz7TCwjAWcljVXITy7R4gS3Q0,53947
129
129
  cnhkmcp/untracked/APP/Tranformer/helpful_functions.py,sha256=Jc8gclRkvGx7el0XgTmZ67qwMSHrSluYheCUvzd6mbg,6640
130
- cnhkmcp/untracked/APP/Tranformer/parsetab.py,sha256=29clH5xFEmKpqzRvrLN89QE8JFJNYFhH-gEFR4y7448,7650
131
130
  cnhkmcp/untracked/APP/Tranformer/template_summary.txt,sha256=gWz5LFlPtOmw0JnLj68hgWsoSFNyA18uCJWIYWHLbe8,111054
132
131
  cnhkmcp/untracked/APP/Tranformer/transformer_config.json,sha256=q3Io_1o_BAt-2GNAUKgCs_YR3exkiGFnUqykiPUC1jw,191
133
132
  cnhkmcp/untracked/APP/Tranformer/validator.py,sha256=bvQt55-n2FHkeBA6Ui7tc0oLk_cnriDxt5z-IgaeKZA,50789
@@ -154,7 +153,6 @@ cnhkmcp/untracked/APP/hkSimulator/autosimulator.py,sha256=KHiwi4tCoLeOKg-14ZW06g
154
153
  cnhkmcp/untracked/APP/hkSimulator/helpful_functions.py,sha256=Jc8gclRkvGx7el0XgTmZ67qwMSHrSluYheCUvzd6mbg,6640
155
154
  cnhkmcp/untracked/APP/simulator/alpha_submitter.py,sha256=Wxx7DyFr0VwH709JhxXPj1Jiz8dShaVaYar3HTVMgv4,15652
156
155
  cnhkmcp/untracked/APP/simulator/simulator_wqb.py,sha256=NsPSTs9jmVRguN5_y3qJRNr3hSFUs9JFQgh6y_mxyHw,23774
157
- cnhkmcp/untracked/APP/simulator/wqb20260107015647.log,sha256=MvR-vBL6dz_-ZBvxbXtzsiJ4VnyYPBpymIeD8s0Gc2w,2105
158
156
  cnhkmcp/untracked/APP/static/brain.js,sha256=pIRQdvyx6_LFzgRLiYfRhInr2WHd5dEjfM57-9VzUjg,20533
159
157
  cnhkmcp/untracked/APP/static/decoder.js,sha256=sKyfgsleHvokCMw6Zp-XfcjixkT8cyMvw6ASDhN6b9I,61987
160
158
  cnhkmcp/untracked/APP/static/feature_engineering.js,sha256=X6nis3FmytrNAE8mM-U6-VqmqZMAQ2X59Iy9RmOF5_8,73895
@@ -177,14 +175,22 @@ cnhkmcp/untracked/APP/templates/transformer_web.html,sha256=de5fNhtbdsMMyW5cygvv
177
175
  cnhkmcp/untracked/APP/缘分一道桥/ace_lib.py,sha256=nSnmM5zfI6lxIln1vctz7TCwjAWcljVXITy7R4gS3Q0,53947
178
176
  cnhkmcp/untracked/APP/缘分一道桥/brain_alpha_inspector.py,sha256=eSmGEPFQhqjR96hRCDMCbBSp3wmcwmymdC25Mxa5WdQ,24763
179
177
  cnhkmcp/untracked/APP/缘分一道桥/helpful_functions.py,sha256=Jc8gclRkvGx7el0XgTmZ67qwMSHrSluYheCUvzd6mbg,6640
178
+ cnhkmcp/untracked/back_up/forum_functions.py,sha256=QW-CplAsqDkw-Wcwq-1tuZBq48dEO-vXZ8xw7X65EuE,42303
179
+ cnhkmcp/untracked/back_up/platform_functions.py,sha256=M2U2BWXZsqLBCFlZo_wv-UARDn4bNEM598db7WeBL8I,123340
180
180
  cnhkmcp/untracked/mcp文件论坛版2_如果原版启动不了浏览器就试这个/forum_functions.py,sha256=VuyUaguA0OjJbVRN5Vy8UEFXSAviS3jhDSRWyyPOtfo,18975
181
181
  cnhkmcp/untracked/mcp文件论坛版2_如果原版启动不了浏览器就试这个/platform_functions.py,sha256=bm7IOuUAfPqj9BmlViCD8e3J0mi3BGb4xh0vuL1H-Yk,111205
182
182
  cnhkmcp/untracked/mcp文件论坛版2_如果原版启动不了浏览器就试这个/user_config.json,sha256=_INn1X1qIsITrmEno-BRlQOAGm9wnNCw-6B333DEvnk,695
183
183
  cnhkmcp/untracked/mcp文件论坛版2_如果原版启动不了浏览器就试这个/让AI读这个文档来学会下载浏览器.md,sha256=v5QPSMjRDh52ZjgC4h8QjImnaqlVRLjTHGxmGjTo36g,3396
184
184
  cnhkmcp/untracked/mcp文件论坛版2_如果原版启动不了浏览器就试这个/配置前运行我_安装必要依赖包.py,sha256=BnUyL5g6PaC62yEuS-8vcDSJ0oKu3k6jqQxi2jginuQ,6612
185
- cnhkmcp-2.1.4.dist-info/licenses/LICENSE,sha256=QLxO2eNMnJQEdI_R1UV2AOD-IvuA8zVrkHWA4D9gtoc,1081
186
- cnhkmcp-2.1.4.dist-info/METADATA,sha256=7FWndZ49Q2jFQnCno3LKS1eB-75UEkNZW-yZj6wvvyc,5171
187
- cnhkmcp-2.1.4.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
188
- cnhkmcp-2.1.4.dist-info/entry_points.txt,sha256=lTQieVyIvjhSMK4fT-XwnccY-JBC1H4vVQ3V9dDM-Pc,70
189
- cnhkmcp-2.1.4.dist-info/top_level.txt,sha256=x--ibUcSgOS9Z_RWK2Qc-vfs7DaXQN-WMaaxEETJ1Bw,8
190
- cnhkmcp-2.1.4.dist-info/RECORD,,
185
+ cnhkmcp/untracked/skills/Claude_Skill_Creation_Guide.md,sha256=Wx4w8deBkuw0UcSwzNNQdRIuCqDXGk3-fRQBWcPQivw,5025
186
+ cnhkmcp/untracked/skills/expression_verifier/SKILL.md,sha256=7oGzMIXUJzDCtbxND6QWmh6azkLqoFJNURIh-F-aPUQ,2213
187
+ cnhkmcp/untracked/skills/expression_verifier/scripts/validator.py,sha256=bvQt55-n2FHkeBA6Ui7tc0oLk_cnriDxt5z-IgaeKZA,50789
188
+ cnhkmcp/untracked/skills/expression_verifier/scripts/verify_expr.py,sha256=zDSlYf0XlkyML-fcL4wld445RMbztt4pDSP5b6W6JKQ,1659
189
+ cnhkmcp/untracked/skills/pull_BRAINSkill/SKILL.md,sha256=QyXQ0wr9LeZyKqkvSTto72bX33LgtB1UjoeUDj-3igg,2413
190
+ cnhkmcp/untracked/skills/pull_BRAINSkill/scripts/pull_skills.py,sha256=6v3Z3cc9_qKvBj7C6y2jWY1pAd76SA3JmiVj_KkZkmw,6341
191
+ cnhkmcp-2.1.6.dist-info/licenses/LICENSE,sha256=QLxO2eNMnJQEdI_R1UV2AOD-IvuA8zVrkHWA4D9gtoc,1081
192
+ cnhkmcp-2.1.6.dist-info/METADATA,sha256=Ghajp8I_BwXkG4SsH0MXPvEyD1VHh3KOdFNaSJ98FRg,5171
193
+ cnhkmcp-2.1.6.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
194
+ cnhkmcp-2.1.6.dist-info/entry_points.txt,sha256=lTQieVyIvjhSMK4fT-XwnccY-JBC1H4vVQ3V9dDM-Pc,70
195
+ cnhkmcp-2.1.6.dist-info/top_level.txt,sha256=x--ibUcSgOS9Z_RWK2Qc-vfs7DaXQN-WMaaxEETJ1Bw,8
196
+ cnhkmcp-2.1.6.dist-info/RECORD,,
File without changes
@@ -1,60 +0,0 @@
1
-
2
- # parsetab.py
3
- # This file is automatically generated. Do not edit.
4
- # pylint: disable=W,C,R
5
- _tabversion = '3.10'
6
-
7
- _lr_method = 'LALR'
8
-
9
- _lr_signature = 'ASSIGN BOOLEAN CATEGORY COMMA DIVIDE EQUAL FIELD FUNCTION GREATER GREATEREQUAL IDENTIFIER LESS LESSEQUAL LPAREN MINUS NOTEQUAL NUMBER PLUS RPAREN STRING TIMESexpression : comparison\n| expression EQUAL comparison\n| expression NOTEQUAL comparison\n| expression GREATER comparison\n| expression LESS comparison\n| expression GREATEREQUAL comparison\n| expression LESSEQUAL comparisoncomparison : term\n| comparison PLUS term\n| comparison MINUS termterm : factor\n| term TIMES factor\n| term DIVIDE factorfactor : NUMBER\n| STRING\n| FIELD\n| CATEGORY\n| IDENTIFIER\n| BOOLEAN\n| MINUS factor\n| LPAREN expression RPAREN\n| function_callfunction_call : FUNCTION LPAREN args RPARENargs : arg_list\n| emptyarg_list : arg\n| arg_list COMMA argarg : expression\n| IDENTIFIER ASSIGN expressionempty :'
10
-
11
- _lr_action_items = {'NUMBER':([0,4,12,15,16,17,18,19,20,21,22,23,24,27,46,47,],[6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,]),'STRING':([0,4,12,15,16,17,18,19,20,21,22,23,24,27,46,47,],[7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,]),'FIELD':([0,4,12,15,16,17,18,19,20,21,22,23,24,27,46,47,],[8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,]),'CATEGORY':([0,4,12,15,16,17,18,19,20,21,22,23,24,27,46,47,],[9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,]),'IDENTIFIER':([0,4,12,15,16,17,18,19,20,21,22,23,24,27,46,47,],[10,10,10,10,10,10,10,10,10,10,10,10,10,44,44,10,]),'BOOLEAN':([0,4,12,15,16,17,18,19,20,21,22,23,24,27,46,47,],[11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,]),'MINUS':([0,2,3,4,5,6,7,8,9,10,11,12,13,15,16,17,18,19,20,21,22,23,24,25,27,28,29,30,31,32,33,34,35,36,37,38,44,45,46,47,],[4,22,-8,4,-11,-14,-15,-16,-17,-18,-19,4,-22,4,4,4,4,4,4,4,4,4,4,-20,4,22,22,22,22,22,22,-9,-10,-12,-13,-21,-18,-23,4,4,]),'LPAREN':([0,4,12,14,15,16,17,18,19,20,21,22,23,24,27,46,47,],[12,12,12,27,12,12,12,12,12,12,12,12,12,12,12,12,12,]),'FUNCTION':([0,4,12,15,16,17,18,19,20,21,22,23,24,27,46,47,],[14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,]),'$end':([1,2,3,5,6,7,8,9,10,11,13,25,28,29,30,31,32,33,34,35,36,37,38,45,],[0,-1,-8,-11,-14,-15,-16,-17,-18,-19,-22,-20,-2,-3,-4,-5,-6,-7,-9,-10,-12,-13,-21,-23,]),'EQUAL':([1,2,3,5,6,7,8,9,10,11,13,25,26,28,29,30,31,32,33,34,35,36,37,38,43,44,45,49,],[15,-1,-8,-11,-14,-15,-16,-17,-18,-19,-22,-20,15,-2,-3,-4,-5,-6,-7,-9,-10,-12,-13,-21,15,-18,-23,15,]),'NOTEQUAL':([1,2,3,5,6,7,8,9,10,11,13,25,26,28,29,30,31,32,33,34,35,36,37,38,43,44,45,49,],[16,-1,-8,-11,-14,-15,-16,-17,-18,-19,-22,-20,16,-2,-3,-4,-5,-6,-7,-9,-10,-12,-13,-21,16,-18,-23,16,]),'GREATER':([1,2,3,5,6,7,8,9,10,11,13,25,26,28,29,30,31,32,33,34,35,36,37,38,43,44,45,49,],[17,-1,-8,-11,-14,-15,-16,-17,-18,-19,-22,-20,17,-2,-3,-4,-5,-6,-7,-9,-10,-12,-13,-21,17,-18,-23,17,]),'LESS':([1,2,3,5,6,7,8,9,10,11,13,25,26,28,29,30,31,32,33,34,35,36,37,38,43,44,45,49,],[18,-1,-8,-11,-14,-15,-16,-17,-18,-19,-22,-20,18,-2,-3,-4,-5,-6,-7,-9,-10,-12,-13,-21,18,-18,-23,18,]),'GREATEREQUAL':([1,2,3,5,6,7,8,9,10,11,13,25,26,28,29,30,31,32,33,34,35,36,37,38,43,44,45,49,],[19,-1,-8,-11,-14,-15,-16,-17,-18,-19,-22,-20,19,-2,-3,-4,-5,-6,-7,-9,-10,-12,-13,-21,19,-18,-23,19,]),'LESSEQUAL':([1,2,3,5,6,7,8,9,10,11,13,25,26,28,29,30,31,32,33,34,35,36,37,38,43,44,45,49,],[20,-1,-8,-11,-14,-15,-16,-17,-18,-19,-22,-20,20,-2,-3,-4,-5,-6,-7,-9,-10,-12,-13,-21,20,-18,-23,20,]),'RPAREN':([2,3,5,6,7,8,9,10,11,13,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,48,49,],[-1,-8,-11,-14,-15,-16,-17,-18,-19,-22,-20,38,-30,-2,-3,-4,-5,-6,-7,-9,-10,-12,-13,-21,45,-24,-25,-26,-28,-18,-23,-27,-29,]),'COMMA':([2,3,5,6,7,8,9,10,11,13,25,28,29,30,31,32,33,34,35,36,37,38,40,42,43,44,45,48,49,],[-1,-8,-11,-14,-15,-16,-17,-18,-19,-22,-20,-2,-3,-4,-5,-6,-7,-9,-10,-12,-13,-21,46,-26,-28,-18,-23,-27,-29,]),'PLUS':([2,3,5,6,7,8,9,10,11,13,25,28,29,30,31,32,33,34,35,36,37,38,44,45,],[21,-8,-11,-14,-15,-16,-17,-18,-19,-22,-20,21,21,21,21,21,21,-9,-10,-12,-13,-21,-18,-23,]),'TIMES':([3,5,6,7,8,9,10,11,13,25,34,35,36,37,38,44,45,],[23,-11,-14,-15,-16,-17,-18,-19,-22,-20,23,23,-12,-13,-21,-18,-23,]),'DIVIDE':([3,5,6,7,8,9,10,11,13,25,34,35,36,37,38,44,45,],[24,-11,-14,-15,-16,-17,-18,-19,-22,-20,24,24,-12,-13,-21,-18,-23,]),'ASSIGN':([44,],[47,]),}
12
-
13
- _lr_action = {}
14
- for _k, _v in _lr_action_items.items():
15
- for _x,_y in zip(_v[0],_v[1]):
16
- if not _x in _lr_action: _lr_action[_x] = {}
17
- _lr_action[_x][_k] = _y
18
- del _lr_action_items
19
-
20
- _lr_goto_items = {'expression':([0,12,27,46,47,],[1,26,43,43,49,]),'comparison':([0,12,15,16,17,18,19,20,27,46,47,],[2,2,28,29,30,31,32,33,2,2,2,]),'term':([0,12,15,16,17,18,19,20,21,22,27,46,47,],[3,3,3,3,3,3,3,3,34,35,3,3,3,]),'factor':([0,4,12,15,16,17,18,19,20,21,22,23,24,27,46,47,],[5,25,5,5,5,5,5,5,5,5,5,36,37,5,5,5,]),'function_call':([0,4,12,15,16,17,18,19,20,21,22,23,24,27,46,47,],[13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,]),'args':([27,],[39,]),'arg_list':([27,],[40,]),'empty':([27,],[41,]),'arg':([27,46,],[42,48,]),}
21
-
22
- _lr_goto = {}
23
- for _k, _v in _lr_goto_items.items():
24
- for _x, _y in zip(_v[0], _v[1]):
25
- if not _x in _lr_goto: _lr_goto[_x] = {}
26
- _lr_goto[_x][_k] = _y
27
- del _lr_goto_items
28
- _lr_productions = [
29
- ("S' -> expression","S'",1,None,None,None),
30
- ('expression -> comparison','expression',1,'p_expression','validator.py',383),
31
- ('expression -> expression EQUAL comparison','expression',3,'p_expression','validator.py',384),
32
- ('expression -> expression NOTEQUAL comparison','expression',3,'p_expression','validator.py',385),
33
- ('expression -> expression GREATER comparison','expression',3,'p_expression','validator.py',386),
34
- ('expression -> expression LESS comparison','expression',3,'p_expression','validator.py',387),
35
- ('expression -> expression GREATEREQUAL comparison','expression',3,'p_expression','validator.py',388),
36
- ('expression -> expression LESSEQUAL comparison','expression',3,'p_expression','validator.py',389),
37
- ('comparison -> term','comparison',1,'p_comparison','validator.py',396),
38
- ('comparison -> comparison PLUS term','comparison',3,'p_comparison','validator.py',397),
39
- ('comparison -> comparison MINUS term','comparison',3,'p_comparison','validator.py',398),
40
- ('term -> factor','term',1,'p_term','validator.py',405),
41
- ('term -> term TIMES factor','term',3,'p_term','validator.py',406),
42
- ('term -> term DIVIDE factor','term',3,'p_term','validator.py',407),
43
- ('factor -> NUMBER','factor',1,'p_factor','validator.py',414),
44
- ('factor -> STRING','factor',1,'p_factor','validator.py',415),
45
- ('factor -> FIELD','factor',1,'p_factor','validator.py',416),
46
- ('factor -> CATEGORY','factor',1,'p_factor','validator.py',417),
47
- ('factor -> IDENTIFIER','factor',1,'p_factor','validator.py',418),
48
- ('factor -> BOOLEAN','factor',1,'p_factor','validator.py',419),
49
- ('factor -> MINUS factor','factor',2,'p_factor','validator.py',420),
50
- ('factor -> LPAREN expression RPAREN','factor',3,'p_factor','validator.py',421),
51
- ('factor -> function_call','factor',1,'p_factor','validator.py',422),
52
- ('function_call -> FUNCTION LPAREN args RPAREN','function_call',4,'p_function_call','validator.py',450),
53
- ('args -> arg_list','args',1,'p_args','validator.py',454),
54
- ('args -> empty','args',1,'p_args','validator.py',455),
55
- ('arg_list -> arg','arg_list',1,'p_arg_list','validator.py',462),
56
- ('arg_list -> arg_list COMMA arg','arg_list',3,'p_arg_list','validator.py',463),
57
- ('arg -> expression','arg',1,'p_arg','validator.py',470),
58
- ('arg -> IDENTIFIER ASSIGN expression','arg',3,'p_arg','validator.py',471),
59
- ('empty -> <empty>','empty',0,'p_empty','validator.py',478),
60
- ]
@@ -1,57 +0,0 @@
1
- # INFO 2026-01-07 01:56:51,081
2
- <WQBSession ['1797590122@qq.com']>.locate_field(...) [
3
- https://api.worldquantbrain.com/data-fields/open
4
- ]:
5
-
6
- # INFO 2026-01-07 01:56:51,087
7
- ================================================================================
8
-
9
- # INFO 2026-01-07 01:56:51,088
10
- [MULTI-SIMULATION MODE] ������multi simulation�ļ�¼����������1��multi simulation����8��alpha������轫ʵ�ʻز������Ըó������ŵõ�ʵ������ɵ�Alpha������
11
-
12
- # INFO 2026-01-07 01:56:51,088
13
- ================================================================================
14
-
15
- # INFO 2026-01-07 01:56:51,130
16
- <WQBSession ['1797590122@qq.com']>.concurrent_simulate(...) [start 11828, 6]:
17
-
18
- # INFO 2026-01-07 02:08:55,694
19
- <WQBSession ['1797590122@qq.com']>.simulate(...) [
20
- https://api.worldquantbrain.com/simulations/2kWcHLe0Z4KkbAKGsKQxEsm
21
- ]: 10/11828 = 0%
22
-
23
- # INFO 2026-01-07 02:23:11,423
24
- <WQBSession ['1797590122@qq.com']>.simulate(...) [
25
- https://api.worldquantbrain.com/simulations/1Aky9lZk4PEcIh15zvdUIIf
26
- ]: 20/11828 = 0%
27
-
28
- # INFO 2026-01-07 02:29:55,485
29
- <WQBSession ['1797590122@qq.com']>.simulate(...) [
30
- https://api.worldquantbrain.com/simulations/1Umc6I7Ak4OD955sX7QaJIb
31
- ]: 30/11828 = 0%
32
-
33
- # INFO 2026-01-07 02:43:02,494
34
- <WQBSession ['1797590122@qq.com']>.simulate(...) [
35
- https://api.worldquantbrain.com/simulations/1Z61Kb2s651Vb5ObsDyLioG
36
- ]: 40/11828 = 0%
37
-
38
- # INFO 2026-01-07 02:56:54,333
39
- <WQBSession ['1797590122@qq.com']>.simulate(...) [
40
- https://api.worldquantbrain.com/simulations/2WFrTzgAq4z78E93OYPKyTf
41
- ]: 50/11828 = 0%
42
-
43
- # INFO 2026-01-07 03:08:02,952
44
- <WQBSession ['1797590122@qq.com']>.simulate(...) [
45
- https://api.worldquantbrain.com/simulations/4u1BUVfjX5eb8OU35Wdpg4y
46
- ]: 60/11828 = 0%
47
-
48
- # INFO 2026-01-07 03:16:42,206
49
- <WQBSession ['1797590122@qq.com']>.simulate(...) [
50
- https://api.worldquantbrain.com/simulations/1mTPB2bxk4FiaS111Xhc248m
51
- ]: 70/11828 = 0%
52
-
53
- # INFO 2026-01-07 03:27:58,031
54
- <WQBSession ['1797590122@qq.com']>.simulate(...) [
55
- https://api.worldquantbrain.com/simulations/1sRhFo2So4Uk96H185rAX3sq
56
- ]: 80/11828 = 0%
57
-