flyee 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +134 -0
- package/bin/install.js +357 -0
- package/bridge/bridge.py +1780 -0
- package/bridge/local_tracker.py +722 -0
- package/core/agents/backend-specialist.md +266 -0
- package/core/agents/code-archaeologist.md +106 -0
- package/core/agents/database-architect.md +226 -0
- package/core/agents/debugger.md +225 -0
- package/core/agents/devops-engineer.md +323 -0
- package/core/agents/documentation-writer.md +104 -0
- package/core/agents/explorer-agent.md +73 -0
- package/core/agents/frontend-specialist.md +743 -0
- package/core/agents/game-developer.md +162 -0
- package/core/agents/mobile-developer.md +377 -0
- package/core/agents/orchestrator.md +416 -0
- package/core/agents/penetration-tester.md +188 -0
- package/core/agents/performance-optimizer.md +187 -0
- package/core/agents/product-manager.md +112 -0
- package/core/agents/product-owner.md +95 -0
- package/core/agents/project-planner.md +470 -0
- package/core/agents/qa-automation-engineer.md +103 -0
- package/core/agents/security-auditor.md +170 -0
- package/core/agents/seo-specialist.md +111 -0
- package/core/agents/stitch-designer.md +190 -0
- package/core/agents/tdd-reviewer.md +282 -0
- package/core/agents/test-engineer.md +158 -0
- package/core/scripts/auto_preview.py +148 -0
- package/core/scripts/checklist.py +243 -0
- package/core/scripts/cost_report.py +149 -0
- package/core/scripts/doc-sync-check.py +461 -0
- package/core/scripts/parse_user_stories.py +79 -0
- package/core/scripts/prepare_notion_updates.py +172 -0
- package/core/scripts/print_create_payload.py +18 -0
- package/core/scripts/session_manager.py +120 -0
- package/core/scripts/task_complete.py +127 -0
- package/core/scripts/verify_all.py +327 -0
- package/core/skills/analytics-strategy/SKILL.md +128 -0
- package/core/skills/api-patterns/SKILL.md +81 -0
- package/core/skills/api-patterns/api-style.md +42 -0
- package/core/skills/api-patterns/auth.md +24 -0
- package/core/skills/api-patterns/documentation.md +26 -0
- package/core/skills/api-patterns/graphql.md +41 -0
- package/core/skills/api-patterns/rate-limiting.md +31 -0
- package/core/skills/api-patterns/response.md +37 -0
- package/core/skills/api-patterns/rest.md +40 -0
- package/core/skills/api-patterns/scripts/api_validator.py +211 -0
- package/core/skills/api-patterns/security-testing.md +122 -0
- package/core/skills/api-patterns/trpc.md +41 -0
- package/core/skills/api-patterns/versioning.md +22 -0
- package/core/skills/app-builder/SKILL.md +75 -0
- package/core/skills/app-builder/agent-coordination.md +71 -0
- package/core/skills/app-builder/feature-building.md +53 -0
- package/core/skills/app-builder/project-detection.md +34 -0
- package/core/skills/app-builder/scaffolding.md +118 -0
- package/core/skills/app-builder/tech-stack.md +40 -0
- package/core/skills/app-builder/templates/SKILL.md +39 -0
- package/core/skills/app-builder/templates/astro-static/TEMPLATE.md +76 -0
- package/core/skills/app-builder/templates/chrome-extension/TEMPLATE.md +92 -0
- package/core/skills/app-builder/templates/cli-tool/TEMPLATE.md +88 -0
- package/core/skills/app-builder/templates/electron-desktop/TEMPLATE.md +88 -0
- package/core/skills/app-builder/templates/express-api/TEMPLATE.md +83 -0
- package/core/skills/app-builder/templates/flutter-app/TEMPLATE.md +90 -0
- package/core/skills/app-builder/templates/monorepo-turborepo/TEMPLATE.md +90 -0
- package/core/skills/app-builder/templates/nextjs-fullstack/TEMPLATE.md +82 -0
- package/core/skills/app-builder/templates/nextjs-saas/TEMPLATE.md +100 -0
- package/core/skills/app-builder/templates/nextjs-static/TEMPLATE.md +106 -0
- package/core/skills/app-builder/templates/nuxt-app/TEMPLATE.md +101 -0
- package/core/skills/app-builder/templates/python-fastapi/TEMPLATE.md +83 -0
- package/core/skills/app-builder/templates/react-native-app/TEMPLATE.md +93 -0
- package/core/skills/architecture/SKILL.md +55 -0
- package/core/skills/architecture/context-discovery.md +43 -0
- package/core/skills/architecture/examples.md +94 -0
- package/core/skills/architecture/pattern-selection.md +68 -0
- package/core/skills/architecture/patterns-reference.md +50 -0
- package/core/skills/architecture/trade-off-analysis.md +77 -0
- package/core/skills/atomic-design/SKILL.md +282 -0
- package/core/skills/atomic-design/references/classification-guide.md +132 -0
- package/core/skills/atomic-design/references/quality-checklist.md +60 -0
- package/core/skills/atomic-design/references/stacks/stack-blade.md +254 -0
- package/core/skills/atomic-design/references/stacks/stack-nextjs.md +272 -0
- package/core/skills/atomic-design/references/stacks/stack-react.md +239 -0
- package/core/skills/atomic-design/references/stacks/stack-vue.md +224 -0
- package/core/skills/bash-linux/SKILL.md +199 -0
- package/core/skills/behavioral-modes/SKILL.md +242 -0
- package/core/skills/brainstorming/SKILL.md +163 -0
- package/core/skills/brainstorming/dynamic-questioning.md +373 -0
- package/core/skills/checkpointing-patterns/SKILL.md +163 -0
- package/core/skills/clean-code/SKILL.md +201 -0
- package/core/skills/code-review-checklist/SKILL.md +109 -0
- package/core/skills/code-truth-validation/SKILL.md +149 -0
- package/core/skills/component-library-discovery/SKILL.md +154 -0
- package/core/skills/content-strategy/SKILL.md +222 -0
- package/core/skills/context-budget/SKILL.md +155 -0
- package/core/skills/context-gathering-patterns/SKILL.md +278 -0
- package/core/skills/cost-tracking/SKILL.md +206 -0
- package/core/skills/database-design/SKILL.md +52 -0
- package/core/skills/database-design/database-selection.md +43 -0
- package/core/skills/database-design/indexing.md +39 -0
- package/core/skills/database-design/migrations.md +48 -0
- package/core/skills/database-design/optimization.md +36 -0
- package/core/skills/database-design/orm-selection.md +30 -0
- package/core/skills/database-design/schema-design.md +56 -0
- package/core/skills/database-design/scripts/schema_validator.py +172 -0
- package/core/skills/deployment-procedures/SKILL.md +295 -0
- package/core/skills/design-md/README.md +34 -0
- package/core/skills/design-md/SKILL.md +172 -0
- package/core/skills/design-md/examples/DESIGN.md +154 -0
- package/core/skills/design-system-enforcement/SKILL.md +339 -0
- package/core/skills/doc.md +177 -0
- package/core/skills/document-registry/SKILL.md +130 -0
- package/core/skills/documentation-publishing/SKILL.md +174 -0
- package/core/skills/documentation-templates/SKILL.md +194 -0
- package/core/skills/enhance-prompt/README.md +34 -0
- package/core/skills/enhance-prompt/SKILL.md +204 -0
- package/core/skills/enhance-prompt/references/KEYWORDS.md +114 -0
- package/core/skills/frontend-design/SKILL.md +430 -0
- package/core/skills/frontend-design/animation-guide.md +331 -0
- package/core/skills/frontend-design/color-system.md +311 -0
- package/core/skills/frontend-design/decision-trees.md +418 -0
- package/core/skills/frontend-design/motion-graphics.md +306 -0
- package/core/skills/frontend-design/scripts/accessibility_checker.py +183 -0
- package/core/skills/frontend-design/scripts/ux_audit.py +722 -0
- package/core/skills/frontend-design/typography-system.md +345 -0
- package/core/skills/frontend-design/ux-psychology.md +541 -0
- package/core/skills/frontend-design/visual-effects.md +383 -0
- package/core/skills/game-development/2d-games/SKILL.md +119 -0
- package/core/skills/game-development/3d-games/SKILL.md +135 -0
- package/core/skills/game-development/SKILL.md +167 -0
- package/core/skills/game-development/game-art/SKILL.md +185 -0
- package/core/skills/game-development/game-audio/SKILL.md +190 -0
- package/core/skills/game-development/game-design/SKILL.md +129 -0
- package/core/skills/game-development/mobile-games/SKILL.md +108 -0
- package/core/skills/game-development/multiplayer/SKILL.md +132 -0
- package/core/skills/game-development/pc-games/SKILL.md +144 -0
- package/core/skills/game-development/vr-ar/SKILL.md +123 -0
- package/core/skills/game-development/web-games/SKILL.md +150 -0
- package/core/skills/geo-fundamentals/SKILL.md +156 -0
- package/core/skills/geo-fundamentals/scripts/geo_checker.py +289 -0
- package/core/skills/git-workflow/SKILL.md +263 -0
- package/core/skills/history-check-patterns/SKILL.md +125 -0
- package/core/skills/i18n-localization/SKILL.md +154 -0
- package/core/skills/i18n-localization/scripts/i18n_checker.py +241 -0
- package/core/skills/integration-completeness/SKILL.md +219 -0
- package/core/skills/intelligent-routing/SKILL.md +370 -0
- package/core/skills/lint-and-validate/SKILL.md +45 -0
- package/core/skills/lint-and-validate/scripts/lint_runner.py +173 -0
- package/core/skills/lint-and-validate/scripts/type_coverage.py +173 -0
- package/core/skills/local-verification/SKILL.md +195 -0
- package/core/skills/mcp-builder/SKILL.md +176 -0
- package/core/skills/mobile-design/SKILL.md +394 -0
- package/core/skills/mobile-design/decision-trees.md +516 -0
- package/core/skills/mobile-design/mobile-backend.md +491 -0
- package/core/skills/mobile-design/mobile-color-system.md +420 -0
- package/core/skills/mobile-design/mobile-debugging.md +122 -0
- package/core/skills/mobile-design/mobile-design-thinking.md +357 -0
- package/core/skills/mobile-design/mobile-navigation.md +458 -0
- package/core/skills/mobile-design/mobile-performance.md +767 -0
- package/core/skills/mobile-design/mobile-testing.md +356 -0
- package/core/skills/mobile-design/mobile-typography.md +433 -0
- package/core/skills/mobile-design/platform-android.md +666 -0
- package/core/skills/mobile-design/platform-ios.md +561 -0
- package/core/skills/mobile-design/scripts/mobile_audit.py +670 -0
- package/core/skills/mobile-design/touch-psychology.md +537 -0
- package/core/skills/nextjs-react-expert/1-async-eliminating-waterfalls.md +312 -0
- package/core/skills/nextjs-react-expert/2-bundle-bundle-size-optimization.md +240 -0
- package/core/skills/nextjs-react-expert/3-server-server-side-performance.md +490 -0
- package/core/skills/nextjs-react-expert/4-client-client-side-data-fetching.md +264 -0
- package/core/skills/nextjs-react-expert/5-rerender-re-render-optimization.md +581 -0
- package/core/skills/nextjs-react-expert/6-rendering-rendering-performance.md +432 -0
- package/core/skills/nextjs-react-expert/7-js-javascript-performance.md +684 -0
- package/core/skills/nextjs-react-expert/8-advanced-advanced-patterns.md +150 -0
- package/core/skills/nextjs-react-expert/SKILL.md +267 -0
- package/core/skills/nextjs-react-expert/scripts/convert_rules.py +222 -0
- package/core/skills/nextjs-react-expert/scripts/react_performance_checker.py +252 -0
- package/core/skills/nodejs-best-practices/SKILL.md +333 -0
- package/core/skills/notion-task-patterns/SKILL.md +2529 -0
- package/core/skills/page-specifications/SKILL.md +367 -0
- package/core/skills/parallel-agents/SKILL.md +175 -0
- package/core/skills/performance-profiling/SKILL.md +143 -0
- package/core/skills/performance-profiling/scripts/lighthouse_audit.py +76 -0
- package/core/skills/plan-writing/SKILL.md +190 -0
- package/core/skills/powershell-windows/SKILL.md +167 -0
- package/core/skills/project-foundation/SKILL.md +117 -0
- package/core/skills/project-setup/SKILL.md +141 -0
- package/core/skills/project-tracking-patterns/SKILL.md +357 -0
- package/core/skills/project-type-discovery/SKILL.md +239 -0
- package/core/skills/python-patterns/SKILL.md +441 -0
- package/core/skills/qa-test-generation/SKILL.md +156 -0
- package/core/skills/react-components/README.md +36 -0
- package/core/skills/react-components/SKILL.md +47 -0
- package/core/skills/react-components/examples/gold-standard-card.tsx +80 -0
- package/core/skills/react-components/package-lock.json +231 -0
- package/core/skills/react-components/package.json +16 -0
- package/core/skills/react-components/resources/architecture-checklist.md +15 -0
- package/core/skills/react-components/resources/component-template.tsx +37 -0
- package/core/skills/react-components/resources/stitch-api-reference.md +14 -0
- package/core/skills/react-components/resources/style-guide.json +27 -0
- package/core/skills/react-components/scripts/fetch-stitch.sh +30 -0
- package/core/skills/react-components/scripts/validate.js +68 -0
- package/core/skills/red-team-tactics/SKILL.md +199 -0
- package/core/skills/remotion/README.md +105 -0
- package/core/skills/remotion/SKILL.md +393 -0
- package/core/skills/remotion/examples/WalkthroughComposition.tsx +78 -0
- package/core/skills/remotion/examples/screens.json +56 -0
- package/core/skills/remotion/resources/composition-checklist.md +124 -0
- package/core/skills/remotion/resources/screen-slide-template.tsx +123 -0
- package/core/skills/remotion/scripts/download-stitch-asset.sh +38 -0
- package/core/skills/seo-fundamentals/SKILL.md +129 -0
- package/core/skills/seo-fundamentals/scripts/seo_checker.py +219 -0
- package/core/skills/server-management/SKILL.md +161 -0
- package/core/skills/session-resilience/SKILL.md +199 -0
- package/core/skills/shadcn-ui/README.md +248 -0
- package/core/skills/shadcn-ui/SKILL.md +326 -0
- package/core/skills/shadcn-ui/examples/auth-layout.tsx +177 -0
- package/core/skills/shadcn-ui/examples/data-table.tsx +313 -0
- package/core/skills/shadcn-ui/examples/form-pattern.tsx +177 -0
- package/core/skills/shadcn-ui/resources/component-catalog.md +481 -0
- package/core/skills/shadcn-ui/resources/customization-guide.md +516 -0
- package/core/skills/shadcn-ui/resources/migration-guide.md +463 -0
- package/core/skills/shadcn-ui/resources/setup-guide.md +412 -0
- package/core/skills/shadcn-ui/scripts/verify-setup.sh +134 -0
- package/core/skills/state-machine/SKILL.md +264 -0
- package/core/skills/stitch-loop/README.md +54 -0
- package/core/skills/stitch-loop/SKILL.md +203 -0
- package/core/skills/stitch-loop/examples/SITE.md +73 -0
- package/core/skills/stitch-loop/examples/next-prompt.md +25 -0
- package/core/skills/stitch-loop/resources/baton-schema.md +61 -0
- package/core/skills/stitch-loop/resources/site-template.md +104 -0
- package/core/skills/systematic-debugging/SKILL.md +109 -0
- package/core/skills/tailwind-patterns/SKILL.md +284 -0
- package/core/skills/tdd-validation/SKILL.md +243 -0
- package/core/skills/tdd-workflow/SKILL.md +284 -0
- package/core/skills/testing-patterns/SKILL.md +196 -0
- package/core/skills/testing-patterns/scripts/test_runner.py +219 -0
- package/core/skills/ui-ux-discovery/SKILL.md +329 -0
- package/core/skills/ui-validation/SKILL.md +190 -0
- package/core/skills/ui-validation/scripts/ui_antipattern_check.py +317 -0
- package/core/skills/verification-gate/SKILL.md +205 -0
- package/core/skills/vulnerability-scanner/SKILL.md +276 -0
- package/core/skills/vulnerability-scanner/checklists.md +121 -0
- package/core/skills/vulnerability-scanner/scripts/security_scan.py +458 -0
- package/core/skills/web-design-guidelines/SKILL.md +57 -0
- package/core/skills/webapp-testing/SKILL.md +187 -0
- package/core/skills/webapp-testing/scripts/playwright_runner.py +173 -0
- package/core/templates/ARCHITECTURE.template.md +407 -0
- package/core/templates/project-resources.example.json +71 -0
- package/core/workflows/atomic.md +182 -0
- package/core/workflows/brainstorm.md +134 -0
- package/core/workflows/check-task.md +242 -0
- package/core/workflows/copy-collect.md +306 -0
- package/core/workflows/create-agent.md +33 -0
- package/core/workflows/create-skill.md +39 -0
- package/core/workflows/create-workflow.md +33 -0
- package/core/workflows/create.md +92 -0
- package/core/workflows/debug.md +186 -0
- package/core/workflows/demand.md +443 -0
- package/core/workflows/deploy.md +260 -0
- package/core/workflows/discovery.md +267 -0
- package/core/workflows/document.md +272 -0
- package/core/workflows/ds-components.md +296 -0
- package/core/workflows/ds-init.md +58 -0
- package/core/workflows/ds-refactor.md +245 -0
- package/core/workflows/ds-references.md +197 -0
- package/core/workflows/ds-styleguide.md +237 -0
- package/core/workflows/ds-token-diff.md +103 -0
- package/core/workflows/ds-tokens.md +317 -0
- package/core/workflows/ds-validate.md +309 -0
- package/core/workflows/execute.md +483 -0
- package/core/workflows/extract-template.md +278 -0
- package/core/workflows/fix-failed-tests.md +160 -0
- package/core/workflows/init-project.md +386 -0
- package/core/workflows/legacy-project.md +849 -0
- package/core/workflows/log.md +97 -0
- package/core/workflows/new-project.md +610 -0
- package/core/workflows/new-project.md.bak +3292 -0
- package/core/workflows/new-task.md +404 -0
- package/core/workflows/orchestrate.md +237 -0
- package/core/workflows/page-build.md +296 -0
- package/core/workflows/plan.md +89 -0
- package/core/workflows/prd.md +255 -0
- package/core/workflows/preview.md +81 -0
- package/core/workflows/review-page.md +304 -0
- package/core/workflows/status.md +86 -0
- package/core/workflows/stitch.md +226 -0
- package/core/workflows/task-complete.md +473 -0
- package/core/workflows/task-update.md +163 -0
- package/core/workflows/tdd.md +344 -0
- package/core/workflows/test.md +251 -0
- package/core/workflows/ui-ux-pro-max.md +437 -0
- package/core/workflows/ux-mobile-optimize.md +262 -0
- package/core/workflows/ux-mobile-validate.md +297 -0
- package/engine-files/GEMINI.md +69 -0
- package/package.json +47 -0
- package/runtime-adapters/antigravity.js +26 -0
- package/runtime-adapters/claude.js +57 -0
- package/runtime-adapters/codex.js +51 -0
- package/runtime-adapters/copilot.js +51 -0
- package/runtime-adapters/cursor.js +51 -0
- package/runtime-adapters/gemini-cli.js +30 -0
- package/runtime-adapters/opencode.js +51 -0
- package/runtime-adapters/windsurf.js +51 -0
|
@@ -0,0 +1,173 @@
|
|
|
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
|
+
from pathlib import Path
|
|
18
|
+
from datetime import datetime
|
|
19
|
+
|
|
20
|
+
# Fix Windows console encoding
|
|
21
|
+
try:
|
|
22
|
+
sys.stdout.reconfigure(encoding='utf-8', errors='replace')
|
|
23
|
+
except:
|
|
24
|
+
pass
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def detect_project_type(project_path: Path) -> dict:
|
|
28
|
+
"""Detect project type and available linters."""
|
|
29
|
+
result = {
|
|
30
|
+
"type": "unknown",
|
|
31
|
+
"linters": []
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
# Node.js project
|
|
35
|
+
package_json = project_path / "package.json"
|
|
36
|
+
if package_json.exists():
|
|
37
|
+
result["type"] = "node"
|
|
38
|
+
try:
|
|
39
|
+
pkg = json.loads(package_json.read_text(encoding='utf-8'))
|
|
40
|
+
scripts = pkg.get("scripts", {})
|
|
41
|
+
deps = {**pkg.get("dependencies", {}), **pkg.get("devDependencies", {})}
|
|
42
|
+
|
|
43
|
+
# Check for lint script
|
|
44
|
+
if "lint" in scripts:
|
|
45
|
+
result["linters"].append({"name": "npm lint", "cmd": ["npm", "run", "lint"]})
|
|
46
|
+
elif "eslint" in deps:
|
|
47
|
+
result["linters"].append({"name": "eslint", "cmd": ["npx", "eslint", "."]})
|
|
48
|
+
|
|
49
|
+
# Check for TypeScript
|
|
50
|
+
if "typescript" in deps or (project_path / "tsconfig.json").exists():
|
|
51
|
+
result["linters"].append({"name": "tsc", "cmd": ["npx", "tsc", "--noEmit"]})
|
|
52
|
+
|
|
53
|
+
except:
|
|
54
|
+
pass
|
|
55
|
+
|
|
56
|
+
# Python project
|
|
57
|
+
if (project_path / "pyproject.toml").exists() or (project_path / "requirements.txt").exists():
|
|
58
|
+
result["type"] = "python"
|
|
59
|
+
|
|
60
|
+
# Check for ruff
|
|
61
|
+
result["linters"].append({"name": "ruff", "cmd": ["ruff", "check", "."]})
|
|
62
|
+
|
|
63
|
+
# Check for mypy
|
|
64
|
+
if (project_path / "mypy.ini").exists() or (project_path / "pyproject.toml").exists():
|
|
65
|
+
result["linters"].append({"name": "mypy", "cmd": ["mypy", "."]})
|
|
66
|
+
|
|
67
|
+
return result
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def run_linter(linter: dict, cwd: Path) -> dict:
|
|
71
|
+
"""Run a single linter and return results."""
|
|
72
|
+
result = {
|
|
73
|
+
"name": linter["name"],
|
|
74
|
+
"passed": False,
|
|
75
|
+
"output": "",
|
|
76
|
+
"error": ""
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
try:
|
|
80
|
+
proc = subprocess.run(
|
|
81
|
+
linter["cmd"],
|
|
82
|
+
cwd=str(cwd),
|
|
83
|
+
capture_output=True,
|
|
84
|
+
text=True,
|
|
85
|
+
encoding='utf-8',
|
|
86
|
+
errors='replace',
|
|
87
|
+
timeout=120,
|
|
88
|
+
shell=sys.platform == 'win32'
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
result["output"] = proc.stdout[:2000] if proc.stdout else ""
|
|
92
|
+
result["error"] = proc.stderr[:500] if proc.stderr else ""
|
|
93
|
+
result["passed"] = proc.returncode == 0
|
|
94
|
+
|
|
95
|
+
except FileNotFoundError:
|
|
96
|
+
result["error"] = f"Command not found: {linter['cmd'][0]}"
|
|
97
|
+
except subprocess.TimeoutExpired:
|
|
98
|
+
result["error"] = "Timeout after 120s"
|
|
99
|
+
except Exception as e:
|
|
100
|
+
result["error"] = str(e)
|
|
101
|
+
|
|
102
|
+
return result
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
def main():
|
|
106
|
+
project_path = Path(sys.argv[1] if len(sys.argv) > 1 else ".").resolve()
|
|
107
|
+
|
|
108
|
+
print(f"\n{'='*60}")
|
|
109
|
+
print(f"[LINT RUNNER] Unified Linting")
|
|
110
|
+
print(f"{'='*60}")
|
|
111
|
+
print(f"Project: {project_path}")
|
|
112
|
+
print(f"Time: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
|
|
113
|
+
|
|
114
|
+
# Detect project type
|
|
115
|
+
project_info = detect_project_type(project_path)
|
|
116
|
+
print(f"Type: {project_info['type']}")
|
|
117
|
+
print(f"Linters: {len(project_info['linters'])}")
|
|
118
|
+
print("-"*60)
|
|
119
|
+
|
|
120
|
+
if not project_info["linters"]:
|
|
121
|
+
print("No linters found for this project type.")
|
|
122
|
+
output = {
|
|
123
|
+
"script": "lint_runner",
|
|
124
|
+
"project": str(project_path),
|
|
125
|
+
"type": project_info["type"],
|
|
126
|
+
"checks": [],
|
|
127
|
+
"passed": True,
|
|
128
|
+
"message": "No linters configured"
|
|
129
|
+
}
|
|
130
|
+
print(json.dumps(output, indent=2))
|
|
131
|
+
sys.exit(0)
|
|
132
|
+
|
|
133
|
+
# Run each linter
|
|
134
|
+
results = []
|
|
135
|
+
all_passed = True
|
|
136
|
+
|
|
137
|
+
for linter in project_info["linters"]:
|
|
138
|
+
print(f"\nRunning: {linter['name']}...")
|
|
139
|
+
result = run_linter(linter, project_path)
|
|
140
|
+
results.append(result)
|
|
141
|
+
|
|
142
|
+
if result["passed"]:
|
|
143
|
+
print(f" [PASS] {linter['name']}")
|
|
144
|
+
else:
|
|
145
|
+
print(f" [FAIL] {linter['name']}")
|
|
146
|
+
if result["error"]:
|
|
147
|
+
print(f" Error: {result['error'][:200]}")
|
|
148
|
+
all_passed = False
|
|
149
|
+
|
|
150
|
+
# Summary
|
|
151
|
+
print("\n" + "="*60)
|
|
152
|
+
print("SUMMARY")
|
|
153
|
+
print("="*60)
|
|
154
|
+
|
|
155
|
+
for r in results:
|
|
156
|
+
icon = "[PASS]" if r["passed"] else "[FAIL]"
|
|
157
|
+
print(f"{icon} {r['name']}")
|
|
158
|
+
|
|
159
|
+
output = {
|
|
160
|
+
"script": "lint_runner",
|
|
161
|
+
"project": str(project_path),
|
|
162
|
+
"type": project_info["type"],
|
|
163
|
+
"checks": results,
|
|
164
|
+
"passed": all_passed
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
print("\n" + json.dumps(output, indent=2))
|
|
168
|
+
|
|
169
|
+
sys.exit(0 if all_passed else 1)
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
if __name__ == "__main__":
|
|
173
|
+
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,195 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: local-verification
|
|
3
|
+
description: Gate obrigatório de verificação local antes de commits. Dev server, testes, build. Previne push de código quebrado.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Local Verification Gate
|
|
7
|
+
|
|
8
|
+
> **Single Source of Truth** para verificação local antes de commits.
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## 🎯 PROPÓSITO
|
|
13
|
+
|
|
14
|
+
Garantir que **NENHUM código quebrado** seja commitado, através de verificação local obrigatória.
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## 🔗 QUANDO USAR?
|
|
19
|
+
|
|
20
|
+
| Workflow | Fase | Trigger |
|
|
21
|
+
|----------|------|---------|
|
|
22
|
+
| `/legacy-project` | Phase 7 | Antes de cada commit |
|
|
23
|
+
| `/new-project` | Phase 5-6 | Antes de cada commit |
|
|
24
|
+
| `/new-task` | Phase 3 | Antes de cada commit |
|
|
25
|
+
| `/execute` | Durante implementação | Antes de cada commit |
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## 🧪 GATE DE VERIFICAÇÃO LOCAL (OBRIGATÓRIO)
|
|
30
|
+
|
|
31
|
+
> [!CAUTION]
|
|
32
|
+
> **BLOQUEADOR:** ANTES de commitar qualquer mudança, TODOS os itens devem passar.
|
|
33
|
+
|
|
34
|
+
### Checklist Obrigatório
|
|
35
|
+
|
|
36
|
+
```markdown
|
|
37
|
+
## ✅ Verificação Local - Antes do Commit
|
|
38
|
+
|
|
39
|
+
### 1. 🖥️ Dev Server
|
|
40
|
+
- [ ] `npm run dev` (ou equivalente) rodando sem erros
|
|
41
|
+
- [ ] Console do browser sem erros críticos
|
|
42
|
+
- [ ] Mudanças visíveis no localhost
|
|
43
|
+
|
|
44
|
+
### 2. 🧪 Testes
|
|
45
|
+
- [ ] `npm test` passando (se projeto tem testes)
|
|
46
|
+
- [ ] Nenhum teste quebrado pela mudança
|
|
47
|
+
|
|
48
|
+
### 3. 🏗️ Build
|
|
49
|
+
- [ ] `npm run build` completa sem erros
|
|
50
|
+
- [ ] Nenhum warning crítico
|
|
51
|
+
|
|
52
|
+
### 4. 👁️ Revisão Visual
|
|
53
|
+
- [ ] Comportamento esperado no browser
|
|
54
|
+
- [ ] Responsividade testada (se UI)
|
|
55
|
+
- [ ] Dark/Light mode testados (se aplicável)
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
## 📋 COMANDOS POR STACK
|
|
61
|
+
|
|
62
|
+
### Next.js / React
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
# Dev server
|
|
66
|
+
npm run dev
|
|
67
|
+
|
|
68
|
+
# Testes
|
|
69
|
+
npm test
|
|
70
|
+
npm run test:coverage # Se disponível
|
|
71
|
+
|
|
72
|
+
# Build
|
|
73
|
+
npm run build
|
|
74
|
+
|
|
75
|
+
# Lint (opcional mas recomendado)
|
|
76
|
+
npm run lint
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
### HTML/CSS/JS Vanilla
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
# Dev server (usar live-server ou similar)
|
|
83
|
+
npx live-server ./public
|
|
84
|
+
|
|
85
|
+
# Sem testes automáticos típicos
|
|
86
|
+
# Verificar manualmente no browser
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### Python
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
# Dev server
|
|
93
|
+
python -m http.server 8000 # Para sites estáticos
|
|
94
|
+
uvicorn app:main --reload # Para APIs
|
|
95
|
+
|
|
96
|
+
# Testes
|
|
97
|
+
pytest
|
|
98
|
+
pytest --cov # Com cobertura
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
## 🔄 FLUXO DE IMPLEMENTAÇÃO
|
|
104
|
+
|
|
105
|
+
```
|
|
106
|
+
Para CADA mudança/feature:
|
|
107
|
+
|
|
108
|
+
1. ✏️ Modificar código
|
|
109
|
+
↓
|
|
110
|
+
2. 🖥️ npm run dev → Verificar no browser
|
|
111
|
+
↓
|
|
112
|
+
3. 🧪 npm test → Garantir que testes passam
|
|
113
|
+
↓
|
|
114
|
+
4. 🏗️ npm run build → Garantir que compila
|
|
115
|
+
↓
|
|
116
|
+
5. ✅ GATE PASSOU? → Commit
|
|
117
|
+
↓
|
|
118
|
+
6. ❌ GATE FALHOU? → Corrigir antes de commit
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
## ⚠️ SE GATE FALHAR
|
|
124
|
+
|
|
125
|
+
### Dev Server com Erro
|
|
126
|
+
|
|
127
|
+
```markdown
|
|
128
|
+
❌ **Dev Server Falhou**
|
|
129
|
+
|
|
130
|
+
**Erro:** {descrição do erro}
|
|
131
|
+
|
|
132
|
+
**Ações:**
|
|
133
|
+
1. Verificar console para stack trace
|
|
134
|
+
2. Corrigir erro de sintaxe/import
|
|
135
|
+
3. Reiniciar dev server
|
|
136
|
+
4. Tentar novamente
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
### Testes Falhando
|
|
140
|
+
|
|
141
|
+
```markdown
|
|
142
|
+
❌ **Testes Falharam**
|
|
143
|
+
|
|
144
|
+
**Testes quebrados:**
|
|
145
|
+
- {nome do teste 1}
|
|
146
|
+
- {nome do teste 2}
|
|
147
|
+
|
|
148
|
+
**Ações:**
|
|
149
|
+
1. Verificar se a mudança impactou lógica existente
|
|
150
|
+
2. Atualizar testes se comportamento mudou intencionalmente
|
|
151
|
+
3. Corrigir código se for regressão
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
### Build Falhou
|
|
155
|
+
|
|
156
|
+
```markdown
|
|
157
|
+
❌ **Build Falhou**
|
|
158
|
+
|
|
159
|
+
**Erro:** {descrição}
|
|
160
|
+
|
|
161
|
+
**Ações:**
|
|
162
|
+
1. Verificar TypeScript errors
|
|
163
|
+
2. Verificar imports ausentes
|
|
164
|
+
3. Verificar variáveis de ambiente
|
|
165
|
+
4. Corrigir e tentar novamente
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
---
|
|
169
|
+
|
|
170
|
+
## 🔴 REGRAS CRÍTICAS
|
|
171
|
+
|
|
172
|
+
1. **NUNCA** commitar sem rodar verificação local
|
|
173
|
+
2. **NUNCA** ignorar testes falhando
|
|
174
|
+
3. **SEMPRE** verificar visualmente no browser antes de commit
|
|
175
|
+
4. **SEMPRE** rodar build antes de push
|
|
176
|
+
|
|
177
|
+
---
|
|
178
|
+
|
|
179
|
+
## 📊 TEMPLATE DE REGISTRO
|
|
180
|
+
|
|
181
|
+
Ao completar verificação, registrar:
|
|
182
|
+
|
|
183
|
+
```markdown
|
|
184
|
+
### ✅ Verificação Local Completa
|
|
185
|
+
|
|
186
|
+
| Check | Status | Comando |
|
|
187
|
+
|-------|--------|---------|
|
|
188
|
+
| Dev Server | ✅ | `npm run dev` |
|
|
189
|
+
| Testes | ✅ | `npm test` (15 passed) |
|
|
190
|
+
| Build | ✅ | `npm run build` |
|
|
191
|
+
| Visual | ✅ | localhost:3000 |
|
|
192
|
+
|
|
193
|
+
**Pronto para commit.**
|
|
194
|
+
```
|
|
195
|
+
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: mcp-builder
|
|
3
|
+
description: MCP (Model Context Protocol) server building principles. Tool design, resource patterns, best practices.
|
|
4
|
+
allowed-tools: Read, Write, Edit, Glob, Grep
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# MCP Builder
|
|
8
|
+
|
|
9
|
+
> Principles for building MCP servers.
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## 1. MCP Overview
|
|
14
|
+
|
|
15
|
+
### What is MCP?
|
|
16
|
+
|
|
17
|
+
Model Context Protocol - standard for connecting AI systems with external tools and data sources.
|
|
18
|
+
|
|
19
|
+
### Core Concepts
|
|
20
|
+
|
|
21
|
+
| Concept | Purpose |
|
|
22
|
+
|---------|---------|
|
|
23
|
+
| **Tools** | Functions AI can call |
|
|
24
|
+
| **Resources** | Data AI can read |
|
|
25
|
+
| **Prompts** | Pre-defined prompt templates |
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## 2. Server Architecture
|
|
30
|
+
|
|
31
|
+
### Project Structure
|
|
32
|
+
|
|
33
|
+
```
|
|
34
|
+
my-mcp-server/
|
|
35
|
+
├── src/
|
|
36
|
+
│ └── index.ts # Main entry
|
|
37
|
+
├── package.json
|
|
38
|
+
└── tsconfig.json
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### Transport Types
|
|
42
|
+
|
|
43
|
+
| Type | Use |
|
|
44
|
+
|------|-----|
|
|
45
|
+
| **Stdio** | Local, CLI-based |
|
|
46
|
+
| **SSE** | Web-based, streaming |
|
|
47
|
+
| **WebSocket** | Real-time, bidirectional |
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## 3. Tool Design Principles
|
|
52
|
+
|
|
53
|
+
### Good Tool Design
|
|
54
|
+
|
|
55
|
+
| Principle | Description |
|
|
56
|
+
|-----------|-------------|
|
|
57
|
+
| Clear name | Action-oriented (get_weather, create_user) |
|
|
58
|
+
| Single purpose | One thing well |
|
|
59
|
+
| Validated input | Schema with types and descriptions |
|
|
60
|
+
| Structured output | Predictable response format |
|
|
61
|
+
|
|
62
|
+
### Input Schema Design
|
|
63
|
+
|
|
64
|
+
| Field | Required? |
|
|
65
|
+
|-------|-----------|
|
|
66
|
+
| Type | Yes - object |
|
|
67
|
+
| Properties | Define each param |
|
|
68
|
+
| Required | List mandatory params |
|
|
69
|
+
| Description | Human-readable |
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## 4. Resource Patterns
|
|
74
|
+
|
|
75
|
+
### Resource Types
|
|
76
|
+
|
|
77
|
+
| Type | Use |
|
|
78
|
+
|------|-----|
|
|
79
|
+
| Static | Fixed data (config, docs) |
|
|
80
|
+
| Dynamic | Generated on request |
|
|
81
|
+
| Template | URI with parameters |
|
|
82
|
+
|
|
83
|
+
### URI Patterns
|
|
84
|
+
|
|
85
|
+
| Pattern | Example |
|
|
86
|
+
|---------|---------|
|
|
87
|
+
| Fixed | `docs://readme` |
|
|
88
|
+
| Parameterized | `users://{userId}` |
|
|
89
|
+
| Collection | `files://project/*` |
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
## 5. Error Handling
|
|
94
|
+
|
|
95
|
+
### Error Types
|
|
96
|
+
|
|
97
|
+
| Situation | Response |
|
|
98
|
+
|-----------|----------|
|
|
99
|
+
| Invalid params | Validation error message |
|
|
100
|
+
| Not found | Clear "not found" |
|
|
101
|
+
| Server error | Generic error, log details |
|
|
102
|
+
|
|
103
|
+
### Best Practices
|
|
104
|
+
|
|
105
|
+
- Return structured errors
|
|
106
|
+
- Don't expose internal details
|
|
107
|
+
- Log for debugging
|
|
108
|
+
- Provide actionable messages
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
## 6. Multimodal Handling
|
|
113
|
+
|
|
114
|
+
### Supported Types
|
|
115
|
+
|
|
116
|
+
| Type | Encoding |
|
|
117
|
+
|------|----------|
|
|
118
|
+
| Text | Plain text |
|
|
119
|
+
| Images | Base64 + MIME type |
|
|
120
|
+
| Files | Base64 + MIME type |
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
|
|
124
|
+
## 7. Security Principles
|
|
125
|
+
|
|
126
|
+
### Input Validation
|
|
127
|
+
|
|
128
|
+
- Validate all tool inputs
|
|
129
|
+
- Sanitize user-provided data
|
|
130
|
+
- Limit resource access
|
|
131
|
+
|
|
132
|
+
### API Keys
|
|
133
|
+
|
|
134
|
+
- Use environment variables
|
|
135
|
+
- Don't log secrets
|
|
136
|
+
- Validate permissions
|
|
137
|
+
|
|
138
|
+
---
|
|
139
|
+
|
|
140
|
+
## 8. Configuration
|
|
141
|
+
|
|
142
|
+
### Claude Desktop Config
|
|
143
|
+
|
|
144
|
+
| Field | Purpose |
|
|
145
|
+
|-------|---------|
|
|
146
|
+
| command | Executable to run |
|
|
147
|
+
| args | Command arguments |
|
|
148
|
+
| env | Environment variables |
|
|
149
|
+
|
|
150
|
+
---
|
|
151
|
+
|
|
152
|
+
## 9. Testing
|
|
153
|
+
|
|
154
|
+
### Test Categories
|
|
155
|
+
|
|
156
|
+
| Type | Focus |
|
|
157
|
+
|------|-------|
|
|
158
|
+
| Unit | Tool logic |
|
|
159
|
+
| Integration | Full server |
|
|
160
|
+
| Contract | Schema validation |
|
|
161
|
+
|
|
162
|
+
---
|
|
163
|
+
|
|
164
|
+
## 10. Best Practices Checklist
|
|
165
|
+
|
|
166
|
+
- [ ] Clear, action-oriented tool names
|
|
167
|
+
- [ ] Complete input schemas with descriptions
|
|
168
|
+
- [ ] Structured JSON output
|
|
169
|
+
- [ ] Error handling for all cases
|
|
170
|
+
- [ ] Input validation
|
|
171
|
+
- [ ] Environment-based configuration
|
|
172
|
+
- [ ] Logging for debugging
|
|
173
|
+
|
|
174
|
+
---
|
|
175
|
+
|
|
176
|
+
> **Remember:** MCP tools should be simple, focused, and well-documented. The AI relies on descriptions to use them correctly.
|