@mison/ag-kit-cn 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (237) hide show
  1. package/.agent/.shared/ui-ux-pro-max/data/charts.csv +26 -0
  2. package/.agent/.shared/ui-ux-pro-max/data/colors.csv +97 -0
  3. package/.agent/.shared/ui-ux-pro-max/data/icons.csv +101 -0
  4. package/.agent/.shared/ui-ux-pro-max/data/landing.csv +31 -0
  5. package/.agent/.shared/ui-ux-pro-max/data/products.csv +97 -0
  6. package/.agent/.shared/ui-ux-pro-max/data/prompts.csv +24 -0
  7. package/.agent/.shared/ui-ux-pro-max/data/react-performance.csv +45 -0
  8. package/.agent/.shared/ui-ux-pro-max/data/stacks/flutter.csv +53 -0
  9. package/.agent/.shared/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -0
  10. package/.agent/.shared/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -0
  11. package/.agent/.shared/ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
  12. package/.agent/.shared/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -0
  13. package/.agent/.shared/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -0
  14. package/.agent/.shared/ui-ux-pro-max/data/stacks/react-native.csv +52 -0
  15. package/.agent/.shared/ui-ux-pro-max/data/stacks/react.csv +54 -0
  16. package/.agent/.shared/ui-ux-pro-max/data/stacks/shadcn.csv +61 -0
  17. package/.agent/.shared/ui-ux-pro-max/data/stacks/svelte.csv +54 -0
  18. package/.agent/.shared/ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
  19. package/.agent/.shared/ui-ux-pro-max/data/stacks/vue.csv +50 -0
  20. package/.agent/.shared/ui-ux-pro-max/data/styles.csv +59 -0
  21. package/.agent/.shared/ui-ux-pro-max/data/typography.csv +58 -0
  22. package/.agent/.shared/ui-ux-pro-max/data/ui-reasoning.csv +101 -0
  23. package/.agent/.shared/ui-ux-pro-max/data/ux-guidelines.csv +100 -0
  24. package/.agent/.shared/ui-ux-pro-max/data/web-interface.csv +31 -0
  25. package/.agent/.shared/ui-ux-pro-max/scripts/core.py +258 -0
  26. package/.agent/.shared/ui-ux-pro-max/scripts/design_system.py +1067 -0
  27. package/.agent/.shared/ui-ux-pro-max/scripts/search.py +106 -0
  28. package/.agent/ARCHITECTURE.md +285 -0
  29. package/.agent/agents/backend-specialist.md +268 -0
  30. package/.agent/agents/code-archaeologist.md +106 -0
  31. package/.agent/agents/database-architect.md +225 -0
  32. package/.agent/agents/debugger.md +225 -0
  33. package/.agent/agents/devops-engineer.md +242 -0
  34. package/.agent/agents/documentation-writer.md +104 -0
  35. package/.agent/agents/explorer-agent.md +73 -0
  36. package/.agent/agents/frontend-specialist.md +618 -0
  37. package/.agent/agents/game-developer.md +162 -0
  38. package/.agent/agents/mobile-developer.md +382 -0
  39. package/.agent/agents/orchestrator.md +438 -0
  40. package/.agent/agents/penetration-tester.md +188 -0
  41. package/.agent/agents/performance-optimizer.md +187 -0
  42. package/.agent/agents/product-manager.md +112 -0
  43. package/.agent/agents/product-owner.md +95 -0
  44. package/.agent/agents/project-planner.md +405 -0
  45. package/.agent/agents/qa-automation-engineer.md +103 -0
  46. package/.agent/agents/security-auditor.md +170 -0
  47. package/.agent/agents/seo-specialist.md +111 -0
  48. package/.agent/agents/test-engineer.md +158 -0
  49. package/.agent/mcp_config.json +12 -0
  50. package/.agent/rules/GEMINI.md +273 -0
  51. package/.agent/scripts/auto_preview.py +148 -0
  52. package/.agent/scripts/checklist.py +217 -0
  53. package/.agent/scripts/session_manager.py +120 -0
  54. package/.agent/scripts/verify_all.py +327 -0
  55. package/.agent/skills/api-patterns/SKILL.md +84 -0
  56. package/.agent/skills/api-patterns/api-style.md +42 -0
  57. package/.agent/skills/api-patterns/auth.md +24 -0
  58. package/.agent/skills/api-patterns/documentation.md +26 -0
  59. package/.agent/skills/api-patterns/graphql.md +41 -0
  60. package/.agent/skills/api-patterns/rate-limiting.md +31 -0
  61. package/.agent/skills/api-patterns/response.md +37 -0
  62. package/.agent/skills/api-patterns/rest.md +40 -0
  63. package/.agent/skills/api-patterns/scripts/api_validator.py +211 -0
  64. package/.agent/skills/api-patterns/security-testing.md +122 -0
  65. package/.agent/skills/api-patterns/trpc.md +41 -0
  66. package/.agent/skills/api-patterns/versioning.md +22 -0
  67. package/.agent/skills/app-builder/SKILL.md +75 -0
  68. package/.agent/skills/app-builder/agent-coordination.md +74 -0
  69. package/.agent/skills/app-builder/feature-building.md +53 -0
  70. package/.agent/skills/app-builder/project-detection.md +34 -0
  71. package/.agent/skills/app-builder/scaffolding.md +118 -0
  72. package/.agent/skills/app-builder/tech-stack.md +40 -0
  73. package/.agent/skills/app-builder/templates/SKILL.md +39 -0
  74. package/.agent/skills/app-builder/templates/astro-static/TEMPLATE.md +76 -0
  75. package/.agent/skills/app-builder/templates/chrome-extension/TEMPLATE.md +92 -0
  76. package/.agent/skills/app-builder/templates/cli-tool/TEMPLATE.md +88 -0
  77. package/.agent/skills/app-builder/templates/electron-desktop/TEMPLATE.md +88 -0
  78. package/.agent/skills/app-builder/templates/express-api/TEMPLATE.md +83 -0
  79. package/.agent/skills/app-builder/templates/flutter-app/TEMPLATE.md +90 -0
  80. package/.agent/skills/app-builder/templates/monorepo-turborepo/TEMPLATE.md +90 -0
  81. package/.agent/skills/app-builder/templates/nextjs-fullstack/TEMPLATE.md +122 -0
  82. package/.agent/skills/app-builder/templates/nextjs-saas/TEMPLATE.md +122 -0
  83. package/.agent/skills/app-builder/templates/nextjs-static/TEMPLATE.md +169 -0
  84. package/.agent/skills/app-builder/templates/nuxt-app/TEMPLATE.md +134 -0
  85. package/.agent/skills/app-builder/templates/python-fastapi/TEMPLATE.md +83 -0
  86. package/.agent/skills/app-builder/templates/react-native-app/TEMPLATE.md +119 -0
  87. package/.agent/skills/architecture/SKILL.md +57 -0
  88. package/.agent/skills/architecture/context-discovery.md +43 -0
  89. package/.agent/skills/architecture/examples.md +94 -0
  90. package/.agent/skills/architecture/pattern-selection.md +68 -0
  91. package/.agent/skills/architecture/patterns-reference.md +50 -0
  92. package/.agent/skills/architecture/trade-off-analysis.md +77 -0
  93. package/.agent/skills/bash-linux/SKILL.md +201 -0
  94. package/.agent/skills/behavioral-modes/SKILL.md +264 -0
  95. package/.agent/skills/brainstorming/SKILL.md +164 -0
  96. package/.agent/skills/brainstorming/dynamic-questioning.md +359 -0
  97. package/.agent/skills/clean-code/SKILL.md +200 -0
  98. package/.agent/skills/code-review-checklist/SKILL.md +125 -0
  99. package/.agent/skills/database-design/SKILL.md +54 -0
  100. package/.agent/skills/database-design/database-selection.md +43 -0
  101. package/.agent/skills/database-design/indexing.md +39 -0
  102. package/.agent/skills/database-design/migrations.md +50 -0
  103. package/.agent/skills/database-design/optimization.md +36 -0
  104. package/.agent/skills/database-design/orm-selection.md +30 -0
  105. package/.agent/skills/database-design/schema-design.md +56 -0
  106. package/.agent/skills/database-design/scripts/schema_validator.py +172 -0
  107. package/.agent/skills/deployment-procedures/SKILL.md +241 -0
  108. package/.agent/skills/doc.md +177 -0
  109. package/.agent/skills/documentation-templates/SKILL.md +194 -0
  110. package/.agent/skills/frontend-design/SKILL.md +418 -0
  111. package/.agent/skills/frontend-design/animation-guide.md +331 -0
  112. package/.agent/skills/frontend-design/color-system.md +307 -0
  113. package/.agent/skills/frontend-design/decision-trees.md +418 -0
  114. package/.agent/skills/frontend-design/motion-graphics.md +306 -0
  115. package/.agent/skills/frontend-design/scripts/accessibility_checker.py +183 -0
  116. package/.agent/skills/frontend-design/scripts/ux_audit.py +727 -0
  117. package/.agent/skills/frontend-design/typography-system.md +345 -0
  118. package/.agent/skills/frontend-design/ux-psychology.md +1118 -0
  119. package/.agent/skills/frontend-design/visual-effects.md +383 -0
  120. package/.agent/skills/game-development/2d-games/SKILL.md +119 -0
  121. package/.agent/skills/game-development/3d-games/SKILL.md +135 -0
  122. package/.agent/skills/game-development/SKILL.md +167 -0
  123. package/.agent/skills/game-development/game-art/SKILL.md +185 -0
  124. package/.agent/skills/game-development/game-audio/SKILL.md +190 -0
  125. package/.agent/skills/game-development/game-design/SKILL.md +129 -0
  126. package/.agent/skills/game-development/mobile-games/SKILL.md +108 -0
  127. package/.agent/skills/game-development/multiplayer/SKILL.md +132 -0
  128. package/.agent/skills/game-development/pc-games/SKILL.md +144 -0
  129. package/.agent/skills/game-development/vr-ar/SKILL.md +123 -0
  130. package/.agent/skills/game-development/web-games/SKILL.md +150 -0
  131. package/.agent/skills/geo-fundamentals/SKILL.md +155 -0
  132. package/.agent/skills/geo-fundamentals/scripts/geo_checker.py +289 -0
  133. package/.agent/skills/i18n-localization/SKILL.md +154 -0
  134. package/.agent/skills/i18n-localization/scripts/i18n_checker.py +241 -0
  135. package/.agent/skills/intelligent-routing/SKILL.md +335 -0
  136. package/.agent/skills/lint-and-validate/SKILL.md +44 -0
  137. package/.agent/skills/lint-and-validate/scripts/lint_runner.py +184 -0
  138. package/.agent/skills/lint-and-validate/scripts/type_coverage.py +173 -0
  139. package/.agent/skills/mcp-builder/SKILL.md +176 -0
  140. package/.agent/skills/mobile-design/SKILL.md +394 -0
  141. package/.agent/skills/mobile-design/decision-trees.md +516 -0
  142. package/.agent/skills/mobile-design/mobile-backend.md +491 -0
  143. package/.agent/skills/mobile-design/mobile-color-system.md +420 -0
  144. package/.agent/skills/mobile-design/mobile-debugging.md +122 -0
  145. package/.agent/skills/mobile-design/mobile-design-thinking.md +355 -0
  146. package/.agent/skills/mobile-design/mobile-navigation.md +458 -0
  147. package/.agent/skills/mobile-design/mobile-performance.md +767 -0
  148. package/.agent/skills/mobile-design/mobile-testing.md +356 -0
  149. package/.agent/skills/mobile-design/mobile-typography.md +432 -0
  150. package/.agent/skills/mobile-design/platform-android.md +666 -0
  151. package/.agent/skills/mobile-design/platform-ios.md +561 -0
  152. package/.agent/skills/mobile-design/scripts/mobile_audit.py +670 -0
  153. package/.agent/skills/mobile-design/touch-psychology.md +537 -0
  154. package/.agent/skills/nextjs-react-expert/1-async-eliminating-waterfalls.md +311 -0
  155. package/.agent/skills/nextjs-react-expert/2-bundle-bundle-size-optimization.md +241 -0
  156. package/.agent/skills/nextjs-react-expert/3-server-server-side-performance.md +489 -0
  157. package/.agent/skills/nextjs-react-expert/4-client-client-side-data-fetching.md +263 -0
  158. package/.agent/skills/nextjs-react-expert/5-rerender-re-render-optimization.md +581 -0
  159. package/.agent/skills/nextjs-react-expert/6-rendering-rendering-performance.md +431 -0
  160. package/.agent/skills/nextjs-react-expert/7-js-javascript-performance.md +683 -0
  161. package/.agent/skills/nextjs-react-expert/8-advanced-advanced-patterns.md +149 -0
  162. package/.agent/skills/nextjs-react-expert/SKILL.md +286 -0
  163. package/.agent/skills/nextjs-react-expert/scripts/convert_rules.py +222 -0
  164. package/.agent/skills/nextjs-react-expert/scripts/react_performance_checker.py +252 -0
  165. package/.agent/skills/nodejs-best-practices/SKILL.md +333 -0
  166. package/.agent/skills/parallel-agents/SKILL.md +194 -0
  167. package/.agent/skills/performance-profiling/SKILL.md +149 -0
  168. package/.agent/skills/performance-profiling/scripts/lighthouse_audit.py +76 -0
  169. package/.agent/skills/plan-writing/SKILL.md +152 -0
  170. package/.agent/skills/powershell-windows/SKILL.md +166 -0
  171. package/.agent/skills/python-patterns/SKILL.md +441 -0
  172. package/.agent/skills/red-team-tactics/SKILL.md +203 -0
  173. package/.agent/skills/rust-pro/SKILL.md +190 -0
  174. package/.agent/skills/seo-fundamentals/SKILL.md +135 -0
  175. package/.agent/skills/seo-fundamentals/scripts/seo_checker.py +215 -0
  176. package/.agent/skills/server-management/SKILL.md +161 -0
  177. package/.agent/skills/systematic-debugging/SKILL.md +114 -0
  178. package/.agent/skills/tailwind-patterns/SKILL.md +269 -0
  179. package/.agent/skills/tdd-workflow/SKILL.md +149 -0
  180. package/.agent/skills/testing-patterns/SKILL.md +178 -0
  181. package/.agent/skills/testing-patterns/scripts/test_runner.py +219 -0
  182. package/.agent/skills/vulnerability-scanner/SKILL.md +276 -0
  183. package/.agent/skills/vulnerability-scanner/checklists.md +131 -0
  184. package/.agent/skills/vulnerability-scanner/scripts/security_scan.py +459 -0
  185. package/.agent/skills/web-design-guidelines/SKILL.md +57 -0
  186. package/.agent/skills/webapp-testing/SKILL.md +187 -0
  187. package/.agent/skills/webapp-testing/scripts/playwright_runner.py +173 -0
  188. package/.agent/workflows/brainstorm.md +113 -0
  189. package/.agent/workflows/create.md +59 -0
  190. package/.agent/workflows/debug.md +103 -0
  191. package/.agent/workflows/deploy.md +176 -0
  192. package/.agent/workflows/enhance.md +63 -0
  193. package/.agent/workflows/orchestrate.md +242 -0
  194. package/.agent/workflows/plan.md +89 -0
  195. package/.agent/workflows/preview.md +80 -0
  196. package/.agent/workflows/restore-localize-compat.md +525 -0
  197. package/.agent/workflows/status.md +86 -0
  198. package/.agent/workflows/test.md +144 -0
  199. package/.agent/workflows/ui-ux-pro-max.md +295 -0
  200. package/AGENT_FLOW.md +609 -0
  201. package/CHANGELOG.md +68 -0
  202. package/LICENSE +21 -0
  203. package/README.md +260 -0
  204. package/bin/adapters/base.js +63 -0
  205. package/bin/adapters/codex.js +391 -0
  206. package/bin/adapters/gemini.js +137 -0
  207. package/bin/ag-kit.js +1336 -0
  208. package/bin/core/builder.js +80 -0
  209. package/bin/core/generator.js +59 -0
  210. package/bin/core/resource-loader.js +64 -0
  211. package/bin/core/transformer.js +208 -0
  212. package/bin/interactive.js +65 -0
  213. package/bin/utils/atomic-writer.js +97 -0
  214. package/bin/utils/git-helper.js +68 -0
  215. package/bin/utils/managed-block.js +65 -0
  216. package/bin/utils/manifest.js +241 -0
  217. package/bin/utils.js +82 -0
  218. package/docs/codex-rules-template.md +36 -0
  219. package/docs/mapping-spec.md +68 -0
  220. package/docs/multi-target-adapter.md +80 -0
  221. package/docs/official/README.md +53 -0
  222. package/docs/official/antigravity/agent-modes-settings.md +64 -0
  223. package/docs/official/antigravity/rules-workflows.md +96 -0
  224. package/docs/official/antigravity/skills.md +147 -0
  225. package/docs/official/codex/agents-md.md +119 -0
  226. package/docs/official/codex/config-advanced.md +358 -0
  227. package/docs/official/codex/config-basic.md +141 -0
  228. package/docs/official/codex/config-reference.md +223 -0
  229. package/docs/official/codex/config-sample.md +216 -0
  230. package/docs/official/codex/mcp.md +107 -0
  231. package/docs/official/codex/rules.md +79 -0
  232. package/docs/official/codex/skills.md +114 -0
  233. package/docs/official/sources-index.md +32 -0
  234. package/docs/operations.md +145 -0
  235. package/docs/terminology-style-guide.md +69 -0
  236. package/package.json +51 -0
  237. package/scripts/postinstall-check.js +112 -0
@@ -0,0 +1,184 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Lint Runner - Unified linting and type checking
4
+ Runs appropriate linters based on project type.
5
+
6
+ Usage:
7
+ python lint_runner.py <project_path>
8
+
9
+ Supports:
10
+ - Node.js: npm run lint, npx tsc --noEmit
11
+ - Python: ruff check, mypy
12
+ """
13
+
14
+ import subprocess
15
+ import sys
16
+ import json
17
+ import platform
18
+ import shutil
19
+ from pathlib import Path
20
+ from datetime import datetime
21
+
22
+ # Fix Windows console encoding
23
+ try:
24
+ sys.stdout.reconfigure(encoding='utf-8', errors='replace')
25
+ except:
26
+ pass
27
+
28
+
29
+ def detect_project_type(project_path: Path) -> dict:
30
+ """Detect project type and available linters."""
31
+ result = {
32
+ "type": "unknown",
33
+ "linters": []
34
+ }
35
+
36
+ # Node.js project
37
+ package_json = project_path / "package.json"
38
+ if package_json.exists():
39
+ result["type"] = "node"
40
+ try:
41
+ pkg = json.loads(package_json.read_text(encoding='utf-8'))
42
+ scripts = pkg.get("scripts", {})
43
+ deps = {**pkg.get("dependencies", {}), **pkg.get("devDependencies", {})}
44
+
45
+ # Check for lint script
46
+ if "lint" in scripts:
47
+ result["linters"].append({"name": "npm lint", "cmd": ["npm", "run", "lint"]})
48
+ elif "eslint" in deps:
49
+ result["linters"].append({"name": "eslint", "cmd": ["npx", "eslint", "."]})
50
+
51
+ # Check for TypeScript
52
+ if "typescript" in deps or (project_path / "tsconfig.json").exists():
53
+ result["linters"].append({"name": "tsc", "cmd": ["npx", "tsc", "--noEmit"]})
54
+
55
+ except:
56
+ pass
57
+
58
+ # Python project
59
+ if (project_path / "pyproject.toml").exists() or (project_path / "requirements.txt").exists():
60
+ result["type"] = "python"
61
+
62
+ # Check for ruff
63
+ result["linters"].append({"name": "ruff", "cmd": ["ruff", "check", "."]})
64
+
65
+ # Check for mypy
66
+ if (project_path / "mypy.ini").exists() or (project_path / "pyproject.toml").exists():
67
+ result["linters"].append({"name": "mypy", "cmd": ["mypy", "."]})
68
+
69
+ return result
70
+
71
+
72
+ def run_linter(linter: dict, cwd: Path) -> dict:
73
+ """Run a single linter and return results."""
74
+ result = {
75
+ "name": linter["name"],
76
+ "passed": False,
77
+ "output": "",
78
+ "error": ""
79
+ }
80
+
81
+ try:
82
+ cmd = linter["cmd"]
83
+
84
+ # Windows compatibility for npm/npx
85
+ if platform.system() == "Windows":
86
+ if cmd[0] in ["npm", "npx"]:
87
+ # Force .cmd extension on Windows
88
+ if not cmd[0].lower().endswith(".cmd"):
89
+ cmd[0] = f"{cmd[0]}.cmd"
90
+
91
+ proc = subprocess.run(
92
+ cmd,
93
+ cwd=str(cwd),
94
+ capture_output=True,
95
+ text=True,
96
+ encoding='utf-8',
97
+ errors='replace',
98
+ timeout=120,
99
+ shell=platform.system() == "Windows" # Shell=True often helps with path resolution on Windows
100
+ )
101
+
102
+ result["output"] = proc.stdout[:2000] if proc.stdout else ""
103
+ result["error"] = proc.stderr[:500] if proc.stderr else ""
104
+ result["passed"] = proc.returncode == 0
105
+
106
+ except FileNotFoundError:
107
+ result["error"] = f"Command not found: {linter['cmd'][0]}"
108
+ except subprocess.TimeoutExpired:
109
+ result["error"] = "Timeout after 120s"
110
+ except Exception as e:
111
+ result["error"] = str(e)
112
+
113
+ return result
114
+
115
+
116
+ def main():
117
+ project_path = Path(sys.argv[1] if len(sys.argv) > 1 else ".").resolve()
118
+
119
+ print(f"\n{'='*60}")
120
+ print(f"[LINT RUNNER] Unified Linting")
121
+ print(f"{'='*60}")
122
+ print(f"Project: {project_path}")
123
+ print(f"Time: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
124
+
125
+ # Detect project type
126
+ project_info = detect_project_type(project_path)
127
+ print(f"Type: {project_info['type']}")
128
+ print(f"Linters: {len(project_info['linters'])}")
129
+ print("-"*60)
130
+
131
+ if not project_info["linters"]:
132
+ print("No linters found for this project type.")
133
+ output = {
134
+ "script": "lint_runner",
135
+ "project": str(project_path),
136
+ "type": project_info["type"],
137
+ "checks": [],
138
+ "passed": True,
139
+ "message": "No linters configured"
140
+ }
141
+ print(json.dumps(output, indent=2))
142
+ sys.exit(0)
143
+
144
+ # Run each linter
145
+ results = []
146
+ all_passed = True
147
+
148
+ for linter in project_info["linters"]:
149
+ print(f"\nRunning: {linter['name']}...")
150
+ result = run_linter(linter, project_path)
151
+ results.append(result)
152
+
153
+ if result["passed"]:
154
+ print(f" [PASS] {linter['name']}")
155
+ else:
156
+ print(f" [FAIL] {linter['name']}")
157
+ if result["error"]:
158
+ print(f" Error: {result['error'][:200]}")
159
+ all_passed = False
160
+
161
+ # Summary
162
+ print("\n" + "="*60)
163
+ print("SUMMARY")
164
+ print("="*60)
165
+
166
+ for r in results:
167
+ icon = "[PASS]" if r["passed"] else "[FAIL]"
168
+ print(f"{icon} {r['name']}")
169
+
170
+ output = {
171
+ "script": "lint_runner",
172
+ "project": str(project_path),
173
+ "type": project_info["type"],
174
+ "checks": results,
175
+ "passed": all_passed
176
+ }
177
+
178
+ print("\n" + json.dumps(output, indent=2))
179
+
180
+ sys.exit(0 if all_passed else 1)
181
+
182
+
183
+ if __name__ == "__main__":
184
+ main()
@@ -0,0 +1,173 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Type Coverage Checker - Measures TypeScript/Python type coverage.
4
+ Identifies untyped functions, any usage, and type safety issues.
5
+ """
6
+ import sys
7
+ import re
8
+ import subprocess
9
+ from pathlib import Path
10
+
11
+ # Fix Windows console encoding for Unicode output
12
+ try:
13
+ sys.stdout.reconfigure(encoding='utf-8', errors='replace')
14
+ sys.stderr.reconfigure(encoding='utf-8', errors='replace')
15
+ except AttributeError:
16
+ pass # Python < 3.7
17
+
18
+ def check_typescript_coverage(project_path: Path) -> dict:
19
+ """Check TypeScript type coverage."""
20
+ issues = []
21
+ passed = []
22
+ stats = {'any_count': 0, 'untyped_functions': 0, 'total_functions': 0}
23
+
24
+ ts_files = list(project_path.rglob("*.ts")) + list(project_path.rglob("*.tsx"))
25
+ ts_files = [f for f in ts_files if 'node_modules' not in str(f) and '.d.ts' not in str(f)]
26
+
27
+ if not ts_files:
28
+ return {'type': 'typescript', 'files': 0, 'passed': [], 'issues': ["[!] No TypeScript files found"], 'stats': stats}
29
+
30
+ for file_path in ts_files[:30]: # Limit
31
+ try:
32
+ content = file_path.read_text(encoding='utf-8', errors='ignore')
33
+
34
+ # Count 'any' usage
35
+ any_matches = re.findall(r':\s*any\b', content)
36
+ stats['any_count'] += len(any_matches)
37
+
38
+ # Find functions without return types
39
+ # function name(params) { - no return type
40
+ untyped = re.findall(r'function\s+\w+\s*\([^)]*\)\s*{', content)
41
+ # Arrow functions without types: const fn = (x) => or (x) =>
42
+ untyped += re.findall(r'=\s*\([^:)]*\)\s*=>', content)
43
+ stats['untyped_functions'] += len(untyped)
44
+
45
+ # Count typed functions
46
+ typed = re.findall(r'function\s+\w+\s*\([^)]*\)\s*:\s*\w+', content)
47
+ typed += re.findall(r':\s*\([^)]*\)\s*=>\s*\w+', content)
48
+ stats['total_functions'] += len(typed) + len(untyped)
49
+
50
+ except Exception:
51
+ continue
52
+
53
+ # Analyze results
54
+ if stats['any_count'] == 0:
55
+ passed.append("[OK] No 'any' types found")
56
+ elif stats['any_count'] <= 5:
57
+ issues.append(f"[!] {stats['any_count']} 'any' types found (acceptable)")
58
+ else:
59
+ issues.append(f"[X] {stats['any_count']} 'any' types found (too many)")
60
+
61
+ if stats['total_functions'] > 0:
62
+ typed_ratio = (stats['total_functions'] - stats['untyped_functions']) / stats['total_functions'] * 100
63
+ if typed_ratio >= 80:
64
+ passed.append(f"[OK] Type coverage: {typed_ratio:.0f}%")
65
+ elif typed_ratio >= 50:
66
+ issues.append(f"[!] Type coverage: {typed_ratio:.0f}% (improve)")
67
+ else:
68
+ issues.append(f"[X] Type coverage: {typed_ratio:.0f}% (too low)")
69
+
70
+ passed.append(f"[OK] Analyzed {len(ts_files)} TypeScript files")
71
+
72
+ return {'type': 'typescript', 'files': len(ts_files), 'passed': passed, 'issues': issues, 'stats': stats}
73
+
74
+ def check_python_coverage(project_path: Path) -> dict:
75
+ """Check Python type hints coverage."""
76
+ issues = []
77
+ passed = []
78
+ stats = {'untyped_functions': 0, 'typed_functions': 0, 'any_count': 0}
79
+
80
+ py_files = list(project_path.rglob("*.py"))
81
+ py_files = [f for f in py_files if not any(x in str(f) for x in ['venv', '__pycache__', '.git', 'node_modules'])]
82
+
83
+ if not py_files:
84
+ return {'type': 'python', 'files': 0, 'passed': [], 'issues': ["[!] No Python files found"], 'stats': stats}
85
+
86
+ for file_path in py_files[:30]: # Limit
87
+ try:
88
+ content = file_path.read_text(encoding='utf-8', errors='ignore')
89
+
90
+ # Count Any usage
91
+ any_matches = re.findall(r':\s*Any\b', content)
92
+ stats['any_count'] += len(any_matches)
93
+
94
+ # Find functions with type hints
95
+ typed_funcs = re.findall(r'def\s+\w+\s*\([^)]*:[^)]+\)', content)
96
+ typed_funcs += re.findall(r'def\s+\w+\s*\([^)]*\)\s*->', content)
97
+ stats['typed_functions'] += len(typed_funcs)
98
+
99
+ # Find functions without type hints
100
+ all_funcs = re.findall(r'def\s+\w+\s*\(', content)
101
+ stats['untyped_functions'] += len(all_funcs) - len(typed_funcs)
102
+
103
+ except Exception:
104
+ continue
105
+
106
+ total = stats['typed_functions'] + stats['untyped_functions']
107
+
108
+ if total > 0:
109
+ typed_ratio = stats['typed_functions'] / total * 100
110
+ if typed_ratio >= 70:
111
+ passed.append(f"[OK] Type hints coverage: {typed_ratio:.0f}%")
112
+ elif typed_ratio >= 40:
113
+ issues.append(f"[!] Type hints coverage: {typed_ratio:.0f}%")
114
+ else:
115
+ issues.append(f"[X] Type hints coverage: {typed_ratio:.0f}% (add type hints)")
116
+
117
+ if stats['any_count'] == 0:
118
+ passed.append("[OK] No 'Any' types found")
119
+ elif stats['any_count'] <= 3:
120
+ issues.append(f"[!] {stats['any_count']} 'Any' types found")
121
+ else:
122
+ issues.append(f"[X] {stats['any_count']} 'Any' types found")
123
+
124
+ passed.append(f"[OK] Analyzed {len(py_files)} Python files")
125
+
126
+ return {'type': 'python', 'files': len(py_files), 'passed': passed, 'issues': issues, 'stats': stats}
127
+
128
+ def main():
129
+ target = sys.argv[1] if len(sys.argv) > 1 else "."
130
+ project_path = Path(target)
131
+
132
+ print("\n" + "=" * 60)
133
+ print(" TYPE COVERAGE CHECKER")
134
+ print("=" * 60 + "\n")
135
+
136
+ results = []
137
+
138
+ # Check TypeScript
139
+ ts_result = check_typescript_coverage(project_path)
140
+ if ts_result['files'] > 0:
141
+ results.append(ts_result)
142
+
143
+ # Check Python
144
+ py_result = check_python_coverage(project_path)
145
+ if py_result['files'] > 0:
146
+ results.append(py_result)
147
+
148
+ if not results:
149
+ print("[!] No TypeScript or Python files found.")
150
+ sys.exit(0)
151
+
152
+ # Print results
153
+ critical_issues = 0
154
+ for result in results:
155
+ print(f"\n[{result['type'].upper()}]")
156
+ print("-" * 40)
157
+ for item in result['passed']:
158
+ print(f" {item}")
159
+ for item in result['issues']:
160
+ print(f" {item}")
161
+ if item.startswith("[X]"):
162
+ critical_issues += 1
163
+
164
+ print("\n" + "=" * 60)
165
+ if critical_issues == 0:
166
+ print("[OK] TYPE COVERAGE: ACCEPTABLE")
167
+ sys.exit(0)
168
+ else:
169
+ print(f"[X] TYPE COVERAGE: {critical_issues} critical issues")
170
+ sys.exit(1)
171
+
172
+ if __name__ == "__main__":
173
+ main()
@@ -0,0 +1,176 @@
1
+ ---
2
+ name: mcp-builder
3
+ description: MCP(Model Context Protocol)服务器构建原则。工具设计、资源模式与最佳实践。
4
+ allowed-tools: Read, Write, Edit, Glob, Grep
5
+ ---
6
+
7
+ # MCP 构建器
8
+
9
+ > MCP 服务器构建原则。
10
+
11
+ ---
12
+
13
+ ## 1. MCP 概览
14
+
15
+ ### 什么是 MCP?
16
+
17
+ Model Context Protocol:用于连接 AI 系统与外部工具、数据源的标准协议。
18
+
19
+ ### 核心概念
20
+
21
+ | 概念 | 目的 |
22
+ | --- | --- |
23
+ | **Tools** | AI 可调用的函数能力 |
24
+ | **Resources** | AI 可读取的数据资源 |
25
+ | **Prompts** | 预定义提示词模板 |
26
+
27
+ ---
28
+
29
+ ## 2. 服务架构
30
+
31
+ ### 项目结构
32
+
33
+ ```
34
+ my-mcp-server/
35
+ ├── src/
36
+ │ └── index.ts # 主入口
37
+ ├── package.json
38
+ └── tsconfig.json
39
+ ```
40
+
41
+ ### 传输类型
42
+
43
+ | 类型 | 用途 |
44
+ | --- | --- |
45
+ | **Stdio** | 本地、CLI 场景 |
46
+ | **SSE** | Web 场景、流式输出 |
47
+ | **WebSocket** | 实时、双向通信 |
48
+
49
+ ---
50
+
51
+ ## 3. 工具设计原则
52
+
53
+ ### 优秀工具设计
54
+
55
+ | 原则 | 描述 |
56
+ | --- | --- |
57
+ | 名称清晰 | 动作导向(get_weather, create_user) |
58
+ | 单一职责 | 一次只做好一件事 |
59
+ | 输入可校验 | 使用含类型与描述的 schema |
60
+ | 输出结构化 | 响应格式可预测 |
61
+
62
+ ### 输入 Schema 设计
63
+
64
+ | 字段 | 必填? |
65
+ | --- | --- |
66
+ | Type | 是(object) |
67
+ | Properties | 定义每个参数 |
68
+ | Required | 列出必填参数 |
69
+ | Description | 人类可读说明 |
70
+
71
+ ---
72
+
73
+ ## 4. 资源模式
74
+
75
+ ### 资源类型
76
+
77
+ | 类型 | 用途 |
78
+ | --- | --- |
79
+ | Static | 固定数据(配置、文档) |
80
+ | Dynamic | 按请求动态生成 |
81
+ | Template | 含参数的 URI 模板 |
82
+
83
+ ### URI 模式
84
+
85
+ | 模式 | 示例 |
86
+ | --- | --- |
87
+ | Fixed | `docs://readme` |
88
+ | Parameterized | `users://{userId}` |
89
+ | Collection | `files://project/*` |
90
+
91
+ ---
92
+
93
+ ## 5. 错误处理
94
+
95
+ ### 错误类型
96
+
97
+ | 情况 | 响应 |
98
+ | --- | --- |
99
+ | 参数无效 | 返回明确的校验错误 |
100
+ | 资源不存在 | 返回清晰的 “not found” |
101
+ | 服务器错误 | 返回通用错误并记录日志 |
102
+
103
+ ### 最佳实践
104
+
105
+ - 返回结构化错误对象
106
+ - 不暴露内部实现细节
107
+ - 记录可追踪日志用于调试
108
+ - 提供可执行的错误提示
109
+
110
+ ---
111
+
112
+ ## 6. 多模态处理
113
+
114
+ ### 支持类型
115
+
116
+ | 类型 | 编码 |
117
+ | --- | --- |
118
+ | Text | Plain text |
119
+ | Images | Base64 + MIME type |
120
+ | Files | Base64 + MIME type |
121
+
122
+ ---
123
+
124
+ ## 7. 安全原则
125
+
126
+ ### 输入校验
127
+
128
+ - 校验所有工具输入
129
+ - 清洗用户提供的数据
130
+ - 限制资源访问范围
131
+
132
+ ### API 密钥
133
+
134
+ - 使用环境变量存储
135
+ - 禁止日志输出密钥
136
+ - 校验调用权限
137
+
138
+ ---
139
+
140
+ ## 8. 配置
141
+
142
+ ### Claude Desktop 配置
143
+
144
+ | 字段 | 目的 |
145
+ | --- | --- |
146
+ | command | 要执行的命令 |
147
+ | args | 命令参数 |
148
+ | env | 环境变量 |
149
+
150
+ ---
151
+
152
+ ## 9. 测试
153
+
154
+ ### 测试类别
155
+
156
+ | 类型 | 关注点 |
157
+ | --- | --- |
158
+ | Unit | 工具逻辑 |
159
+ | Integration | 服务整体 |
160
+ | Contract | Schema 校验 |
161
+
162
+ ---
163
+
164
+ ## 10. 最佳实践检查清单
165
+
166
+ - [ ] 工具名称清晰且动作导向
167
+ - [ ] 输入 schema 完整且含说明
168
+ - [ ] 输出为结构化 JSON
169
+ - [ ] 覆盖各类错误处理场景
170
+ - [ ] 输入校验到位
171
+ - [ ] 使用环境变量进行配置
172
+ - [ ] 日志可用于排障与调试
173
+
174
+ ---
175
+
176
+ > **记住:** MCP 工具应保持简单、聚焦且文档完善。AI 依赖描述来正确调用它们。