@mrtrinhvn/ag-kit 1.0.5 → 1.0.7
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/.agent/.shared/ui-ux-pro-max/data/charts.csv +26 -0
- package/.agent/.shared/ui-ux-pro-max/data/colors.csv +97 -0
- package/.agent/.shared/ui-ux-pro-max/data/icons.csv +101 -0
- package/.agent/.shared/ui-ux-pro-max/data/landing.csv +31 -0
- package/.agent/.shared/ui-ux-pro-max/data/products.csv +97 -0
- package/.agent/.shared/ui-ux-pro-max/data/prompts.csv +24 -0
- package/.agent/.shared/ui-ux-pro-max/data/react-performance.csv +45 -0
- package/.agent/.shared/ui-ux-pro-max/data/stacks/flutter.csv +53 -0
- package/.agent/.shared/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -0
- package/.agent/.shared/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -0
- package/.agent/.shared/ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
- package/.agent/.shared/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -0
- package/.agent/.shared/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -0
- package/.agent/.shared/ui-ux-pro-max/data/stacks/react-native.csv +52 -0
- package/.agent/.shared/ui-ux-pro-max/data/stacks/react.csv +54 -0
- package/.agent/.shared/ui-ux-pro-max/data/stacks/shadcn.csv +61 -0
- package/.agent/.shared/ui-ux-pro-max/data/stacks/svelte.csv +54 -0
- package/.agent/.shared/ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
- package/.agent/.shared/ui-ux-pro-max/data/stacks/vue.csv +50 -0
- package/.agent/.shared/ui-ux-pro-max/data/styles.csv +59 -0
- package/.agent/.shared/ui-ux-pro-max/data/typography.csv +58 -0
- package/.agent/.shared/ui-ux-pro-max/data/ui-reasoning.csv +101 -0
- package/.agent/.shared/ui-ux-pro-max/data/ux-guidelines.csv +100 -0
- package/.agent/.shared/ui-ux-pro-max/data/web-interface.csv +31 -0
- package/.agent/.shared/ui-ux-pro-max/scripts/__pycache__/core.cpython-313.pyc +0 -0
- package/.agent/.shared/ui-ux-pro-max/scripts/__pycache__/design_system.cpython-313.pyc +0 -0
- package/.agent/.shared/ui-ux-pro-max/scripts/core.py +258 -0
- package/.agent/.shared/ui-ux-pro-max/scripts/design_system.py +1067 -0
- package/.agent/.shared/ui-ux-pro-max/scripts/search.py +106 -0
- package/.agent/ARCHITECTURE.md +288 -0
- package/.agent/agents/backend-specialist.md +263 -0
- package/.agent/agents/code-archaeologist.md +106 -0
- package/.agent/agents/database-architect.md +226 -0
- package/.agent/agents/debugger.md +225 -0
- package/.agent/agents/devops-engineer.md +242 -0
- package/.agent/agents/documentation-writer.md +104 -0
- package/.agent/agents/explorer-agent.md +73 -0
- package/.agent/agents/frontend-specialist.md +556 -0
- package/.agent/agents/game-developer.md +162 -0
- package/.agent/agents/mobile-developer.md +377 -0
- package/.agent/agents/orchestrator.md +416 -0
- package/.agent/agents/penetration-tester.md +188 -0
- package/.agent/agents/performance-optimizer.md +187 -0
- package/.agent/agents/product-manager.md +112 -0
- package/.agent/agents/product-owner.md +95 -0
- package/.agent/agents/project-planner.md +406 -0
- package/.agent/agents/qa-automation-engineer.md +103 -0
- package/.agent/agents/quant-architect.md +31 -0
- package/.agent/agents/security-auditor.md +170 -0
- package/.agent/agents/seo-specialist.md +111 -0
- package/.agent/agents/test-engineer.md +158 -0
- package/.agent/mcp_config.json +24 -0
- package/.agent/rules/GEMINI.md +280 -0
- package/.agent/scripts/auto_preview.py +148 -0
- package/.agent/scripts/checklist.py +217 -0
- package/.agent/scripts/session_manager.py +120 -0
- package/.agent/scripts/verify_all.py +327 -0
- package/.agent/skills/api-patterns/SKILL.md +81 -0
- package/.agent/skills/api-patterns/api-style.md +42 -0
- package/.agent/skills/api-patterns/auth.md +24 -0
- package/.agent/skills/api-patterns/documentation.md +26 -0
- package/.agent/skills/api-patterns/graphql.md +41 -0
- package/.agent/skills/api-patterns/rate-limiting.md +31 -0
- package/.agent/skills/api-patterns/response.md +37 -0
- package/.agent/skills/api-patterns/rest.md +40 -0
- package/.agent/skills/api-patterns/scripts/api_validator.py +211 -0
- package/.agent/skills/api-patterns/security-testing.md +122 -0
- package/.agent/skills/api-patterns/trpc.md +41 -0
- package/.agent/skills/api-patterns/versioning.md +22 -0
- package/.agent/skills/app-builder/SKILL.md +75 -0
- package/.agent/skills/app-builder/agent-coordination.md +71 -0
- package/.agent/skills/app-builder/feature-building.md +53 -0
- package/.agent/skills/app-builder/project-detection.md +34 -0
- package/.agent/skills/app-builder/scaffolding.md +118 -0
- package/.agent/skills/app-builder/tech-stack.md +40 -0
- package/.agent/skills/app-builder/templates/SKILL.md +39 -0
- package/.agent/skills/app-builder/templates/astro-static/TEMPLATE.md +76 -0
- package/.agent/skills/app-builder/templates/chrome-extension/TEMPLATE.md +92 -0
- package/.agent/skills/app-builder/templates/cli-tool/TEMPLATE.md +88 -0
- package/.agent/skills/app-builder/templates/electron-desktop/TEMPLATE.md +88 -0
- package/.agent/skills/app-builder/templates/express-api/TEMPLATE.md +83 -0
- package/.agent/skills/app-builder/templates/flutter-app/TEMPLATE.md +90 -0
- package/.agent/skills/app-builder/templates/monorepo-turborepo/TEMPLATE.md +90 -0
- package/.agent/skills/app-builder/templates/nextjs-fullstack/TEMPLATE.md +82 -0
- package/.agent/skills/app-builder/templates/nextjs-saas/TEMPLATE.md +100 -0
- package/.agent/skills/app-builder/templates/nextjs-static/TEMPLATE.md +106 -0
- package/.agent/skills/app-builder/templates/nuxt-app/TEMPLATE.md +101 -0
- package/.agent/skills/app-builder/templates/python-fastapi/TEMPLATE.md +83 -0
- package/.agent/skills/app-builder/templates/react-native-app/TEMPLATE.md +93 -0
- package/.agent/skills/architecture/SKILL.md +55 -0
- package/.agent/skills/architecture/context-discovery.md +43 -0
- package/.agent/skills/architecture/examples.md +94 -0
- package/.agent/skills/architecture/pattern-selection.md +68 -0
- package/.agent/skills/architecture/patterns-reference.md +50 -0
- package/.agent/skills/architecture/trade-off-analysis.md +77 -0
- package/.agent/skills/bash-linux/SKILL.md +199 -0
- package/.agent/skills/behavioral-modes/SKILL.md +242 -0
- package/.agent/skills/brainstorming/SKILL.md +168 -0
- package/.agent/skills/brainstorming/dynamic-questioning.md +350 -0
- package/.agent/skills/business-ops/SKILL.md +26 -0
- package/.agent/skills/clean-code/SKILL.md +202 -0
- package/.agent/skills/cli-generator/SKILL.md +48 -0
- package/.agent/skills/code-review-checklist/SKILL.md +109 -0
- package/.agent/skills/data-science/SKILL.md +28 -0
- package/.agent/skills/database-design/SKILL.md +52 -0
- package/.agent/skills/database-design/database-selection.md +43 -0
- package/.agent/skills/database-design/indexing.md +39 -0
- package/.agent/skills/database-design/migrations.md +48 -0
- package/.agent/skills/database-design/optimization.md +36 -0
- package/.agent/skills/database-design/orm-selection.md +30 -0
- package/.agent/skills/database-design/schema-design.md +56 -0
- package/.agent/skills/database-design/scripts/schema_validator.py +172 -0
- package/.agent/skills/deployment-procedures/SKILL.md +241 -0
- package/.agent/skills/doc.md +177 -0
- package/.agent/skills/documentation-templates/SKILL.md +194 -0
- package/.agent/skills/frontend-design/SKILL.md +418 -0
- package/.agent/skills/frontend-design/animation-guide.md +331 -0
- package/.agent/skills/frontend-design/color-system.md +311 -0
- package/.agent/skills/frontend-design/decision-trees.md +418 -0
- package/.agent/skills/frontend-design/motion-graphics.md +306 -0
- package/.agent/skills/frontend-design/scripts/accessibility_checker.py +183 -0
- package/.agent/skills/frontend-design/scripts/ux_audit.py +722 -0
- package/.agent/skills/frontend-design/typography-system.md +345 -0
- package/.agent/skills/frontend-design/ux-psychology.md +541 -0
- package/.agent/skills/frontend-design/visual-effects.md +383 -0
- package/.agent/skills/game-development/2d-games/SKILL.md +119 -0
- package/.agent/skills/game-development/3d-games/SKILL.md +135 -0
- package/.agent/skills/game-development/SKILL.md +167 -0
- package/.agent/skills/game-development/game-art/SKILL.md +185 -0
- package/.agent/skills/game-development/game-audio/SKILL.md +190 -0
- package/.agent/skills/game-development/game-design/SKILL.md +129 -0
- package/.agent/skills/game-development/mobile-games/SKILL.md +108 -0
- package/.agent/skills/game-development/multiplayer/SKILL.md +132 -0
- package/.agent/skills/game-development/pc-games/SKILL.md +144 -0
- package/.agent/skills/game-development/vr-ar/SKILL.md +123 -0
- package/.agent/skills/game-development/web-games/SKILL.md +150 -0
- package/.agent/skills/geo-fundamentals/SKILL.md +156 -0
- package/.agent/skills/geo-fundamentals/scripts/geo_checker.py +289 -0
- package/.agent/skills/i18n-localization/SKILL.md +154 -0
- package/.agent/skills/i18n-localization/scripts/i18n_checker.py +241 -0
- package/.agent/skills/intelligent-routing/SKILL.md +335 -0
- package/.agent/skills/knowledge-management/SKILL.md +66 -0
- package/.agent/skills/lint-and-validate/SKILL.md +45 -0
- package/.agent/skills/lint-and-validate/scripts/lint_runner.py +172 -0
- package/.agent/skills/lint-and-validate/scripts/type_coverage.py +173 -0
- package/.agent/skills/mcp-builder/SKILL.md +176 -0
- package/.agent/skills/memory-architecture/SKILL.md +107 -0
- package/.agent/skills/mini-antigravity-injection/SKILL.md +59 -0
- package/.agent/skills/mobile-design/SKILL.md +394 -0
- package/.agent/skills/mobile-design/decision-trees.md +516 -0
- package/.agent/skills/mobile-design/mobile-backend.md +491 -0
- package/.agent/skills/mobile-design/mobile-color-system.md +420 -0
- package/.agent/skills/mobile-design/mobile-debugging.md +122 -0
- package/.agent/skills/mobile-design/mobile-design-thinking.md +357 -0
- package/.agent/skills/mobile-design/mobile-navigation.md +458 -0
- package/.agent/skills/mobile-design/mobile-performance.md +767 -0
- package/.agent/skills/mobile-design/mobile-testing.md +356 -0
- package/.agent/skills/mobile-design/mobile-typography.md +433 -0
- package/.agent/skills/mobile-design/platform-android.md +666 -0
- package/.agent/skills/mobile-design/platform-ios.md +561 -0
- package/.agent/skills/mobile-design/scripts/mobile_audit.py +670 -0
- package/.agent/skills/mobile-design/touch-psychology.md +537 -0
- package/.agent/skills/nextjs-react-expert/1-async-eliminating-waterfalls.md +312 -0
- package/.agent/skills/nextjs-react-expert/2-bundle-bundle-size-optimization.md +240 -0
- package/.agent/skills/nextjs-react-expert/3-server-server-side-performance.md +490 -0
- package/.agent/skills/nextjs-react-expert/4-client-client-side-data-fetching.md +264 -0
- package/.agent/skills/nextjs-react-expert/5-rerender-re-render-optimization.md +581 -0
- package/.agent/skills/nextjs-react-expert/6-rendering-rendering-performance.md +432 -0
- package/.agent/skills/nextjs-react-expert/7-js-javascript-performance.md +684 -0
- package/.agent/skills/nextjs-react-expert/8-advanced-advanced-patterns.md +150 -0
- package/.agent/skills/nextjs-react-expert/9-cache-components.md +103 -0
- package/.agent/skills/nextjs-react-expert/SKILL.md +267 -0
- package/.agent/skills/nextjs-react-expert/scripts/convert_rules.py +222 -0
- package/.agent/skills/nextjs-react-expert/scripts/react_performance_checker.py +252 -0
- package/.agent/skills/nodejs-best-practices/SKILL.md +333 -0
- package/.agent/skills/parallel-agents/SKILL.md +175 -0
- package/.agent/skills/performance-profiling/SKILL.md +143 -0
- package/.agent/skills/performance-profiling/scripts/lighthouse_audit.py +76 -0
- package/.agent/skills/plan-writing/SKILL.md +153 -0
- package/.agent/skills/powershell-windows/SKILL.md +167 -0
- package/.agent/skills/product-management/SKILL.md +30 -0
- package/.agent/skills/python-patterns/SKILL.md +441 -0
- package/.agent/skills/red-team-tactics/SKILL.md +199 -0
- package/.agent/skills/rust-pro/SKILL.md +176 -0
- package/.agent/skills/seo-fundamentals/SKILL.md +129 -0
- package/.agent/skills/seo-fundamentals/scripts/seo_checker.py +219 -0
- package/.agent/skills/server-management/SKILL.md +161 -0
- package/.agent/skills/systematic-debugging/SKILL.md +120 -0
- package/.agent/skills/tailwind-patterns/SKILL.md +269 -0
- package/.agent/skills/tdd-workflow/SKILL.md +148 -0
- package/.agent/skills/testing-patterns/SKILL.md +178 -0
- package/.agent/skills/testing-patterns/scripts/test_runner.py +219 -0
- package/.agent/skills/vulnerability-scanner/SKILL.md +276 -0
- package/.agent/skills/vulnerability-scanner/checklists.md +121 -0
- package/.agent/skills/vulnerability-scanner/scripts/security_scan.py +458 -0
- package/.agent/skills/web-design-guidelines/SKILL.md +57 -0
- package/.agent/skills/webapp-testing/SKILL.md +187 -0
- package/.agent/skills/webapp-testing/scripts/playwright_runner.py +173 -0
- package/.agent/workflows/brainstorm.md +113 -0
- package/.agent/workflows/create.md +59 -0
- package/.agent/workflows/debug.md +103 -0
- package/.agent/workflows/deploy.md +176 -0
- package/.agent/workflows/enhance.md +63 -0
- package/.agent/workflows/orchestrate.md +237 -0
- package/.agent/workflows/plan.md +89 -0
- package/.agent/workflows/preview.md +81 -0
- package/.agent/workflows/status.md +86 -0
- package/.agent/workflows/test.md +144 -0
- package/.agent/workflows/ui-ux-pro-max.md +296 -0
- package/bin/cli.js +36 -0
- package/package.json +1 -1
- package/template/.agent/skills/mini-antigravity-injection/SKILL.md +59 -0
|
@@ -0,0 +1,172 @@
|
|
|
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
|
+
)
|
|
89
|
+
|
|
90
|
+
result["output"] = proc.stdout[:2000] if proc.stdout else ""
|
|
91
|
+
result["error"] = proc.stderr[:500] if proc.stderr else ""
|
|
92
|
+
result["passed"] = proc.returncode == 0
|
|
93
|
+
|
|
94
|
+
except FileNotFoundError:
|
|
95
|
+
result["error"] = f"Command not found: {linter['cmd'][0]}"
|
|
96
|
+
except subprocess.TimeoutExpired:
|
|
97
|
+
result["error"] = "Timeout after 120s"
|
|
98
|
+
except Exception as e:
|
|
99
|
+
result["error"] = str(e)
|
|
100
|
+
|
|
101
|
+
return result
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def main():
|
|
105
|
+
project_path = Path(sys.argv[1] if len(sys.argv) > 1 else ".").resolve()
|
|
106
|
+
|
|
107
|
+
print(f"\n{'='*60}")
|
|
108
|
+
print(f"[LINT RUNNER] Unified Linting")
|
|
109
|
+
print(f"{'='*60}")
|
|
110
|
+
print(f"Project: {project_path}")
|
|
111
|
+
print(f"Time: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
|
|
112
|
+
|
|
113
|
+
# Detect project type
|
|
114
|
+
project_info = detect_project_type(project_path)
|
|
115
|
+
print(f"Type: {project_info['type']}")
|
|
116
|
+
print(f"Linters: {len(project_info['linters'])}")
|
|
117
|
+
print("-"*60)
|
|
118
|
+
|
|
119
|
+
if not project_info["linters"]:
|
|
120
|
+
print("No linters found for this project type.")
|
|
121
|
+
output = {
|
|
122
|
+
"script": "lint_runner",
|
|
123
|
+
"project": str(project_path),
|
|
124
|
+
"type": project_info["type"],
|
|
125
|
+
"checks": [],
|
|
126
|
+
"passed": True,
|
|
127
|
+
"message": "No linters configured"
|
|
128
|
+
}
|
|
129
|
+
print(json.dumps(output, indent=2))
|
|
130
|
+
sys.exit(0)
|
|
131
|
+
|
|
132
|
+
# Run each linter
|
|
133
|
+
results = []
|
|
134
|
+
all_passed = True
|
|
135
|
+
|
|
136
|
+
for linter in project_info["linters"]:
|
|
137
|
+
print(f"\nRunning: {linter['name']}...")
|
|
138
|
+
result = run_linter(linter, project_path)
|
|
139
|
+
results.append(result)
|
|
140
|
+
|
|
141
|
+
if result["passed"]:
|
|
142
|
+
print(f" [PASS] {linter['name']}")
|
|
143
|
+
else:
|
|
144
|
+
print(f" [FAIL] {linter['name']}")
|
|
145
|
+
if result["error"]:
|
|
146
|
+
print(f" Error: {result['error'][:200]}")
|
|
147
|
+
all_passed = False
|
|
148
|
+
|
|
149
|
+
# Summary
|
|
150
|
+
print("\n" + "="*60)
|
|
151
|
+
print("SUMMARY")
|
|
152
|
+
print("="*60)
|
|
153
|
+
|
|
154
|
+
for r in results:
|
|
155
|
+
icon = "[PASS]" if r["passed"] else "[FAIL]"
|
|
156
|
+
print(f"{icon} {r['name']}")
|
|
157
|
+
|
|
158
|
+
output = {
|
|
159
|
+
"script": "lint_runner",
|
|
160
|
+
"project": str(project_path),
|
|
161
|
+
"type": project_info["type"],
|
|
162
|
+
"checks": results,
|
|
163
|
+
"passed": all_passed
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
print("\n" + json.dumps(output, indent=2))
|
|
167
|
+
|
|
168
|
+
sys.exit(0 if all_passed else 1)
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
if __name__ == "__main__":
|
|
172
|
+
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) 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.
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: memory-architecture
|
|
3
|
+
description: >
|
|
4
|
+
Hệ thống Bộ nhớ Đồ thị Đa Tầng (Multi-layered Graph Memory) cho Agent.
|
|
5
|
+
Hợp nhất giữa Progressive Disclosure (L1, L2, L3) và Temporal Knowledge Graph (Node-Edge).
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Multi-layered Graph Memory Architecture
|
|
9
|
+
|
|
10
|
+
> 🔴 **CRITICAL RULE**: Trí nhớ của Agent không còn là Text phẳng. Nó là một **Đồ thị Tri thức Đa tầng (Graph)** cho phép "Zoom-out" nhìn toàn cảnh và "Zoom-in" đọc chi tiết lõi.
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## 1. Nguyên tắc cốt lõi: 3 Tầng Ký ức (L1/L2/L3)
|
|
15
|
+
|
|
16
|
+
```text
|
|
17
|
+
L1 (Zoom Out) → session_summary & Core_Nodes — "Toàn cảnh dự án, các khái niệm lõi"
|
|
18
|
+
L2 (Mid) → category-indexed & Edges — "Mạng lưới quan hệ, mạch sự kiện"
|
|
19
|
+
L3 (Zoom In) → detail_record & Solutions — "Chi tiết lỗi, code snippet gốc"
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## 2. Hình thái Dữ liệu cấp thấp (Node-Edge Graph)
|
|
25
|
+
|
|
26
|
+
Mọi dữ liệu trong tầng L1/L2/L3 đều được lưu dưới dạng Đồ thị (Graph):
|
|
27
|
+
|
|
28
|
+
### A. NODES (Hạt nhân Kiến thức)
|
|
29
|
+
Các khái niệm định danh tĩnh. Vd: `[Node:DB_PORT] => 5432 (Energy: 100)`
|
|
30
|
+
|
|
31
|
+
### B. EDGES / EPISODES (Mạch Câu chuyện)
|
|
32
|
+
Luồng sự kiện liên kết. Vd: `[Node:USER] --(muốn mở port)--> [Node:DB_PORT]`
|
|
33
|
+
|
|
34
|
+
### Progressive Disclosure (Tiết kiệm Token):
|
|
35
|
+
Thay vì load toàn bộ Memory, hệ thống truy vấn tự động theo dạng Phóng to/Thu nhỏ:
|
|
36
|
+
1. **Search (Zoom Out):** Chỉ lấy mỏ neo 1-2 Node lõi + Quan hệ (L1/L2) (Tốn rất ít token).
|
|
37
|
+
2. **Details (Zoom In):** Nếu AI cần phân tích sâu 1 đoạn code phức tạp, gọi L3 (Token cao hơn nhưng cực kỳ chính xác).
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## 3. Vòng đời Trí nhớ (Biocybernetic Lifecycle)
|
|
42
|
+
|
|
43
|
+
1. **Temporal Decay (Phai mờ):** Mỗi Node và Edge có `Energy`. Bị hao hụt tự động mỗi 24h. L1 siêu bền, L3 hao nhanh.
|
|
44
|
+
2. **Reinforcement (Củng cố):** Mỗi lần "bò" (traversal) qua Node, Energy phục hồi.
|
|
45
|
+
3. **Consolidation (Ngủ):** Cứ đêm đến, AI gộp các mạch nhớ L3/L2 rườm rà thành 1 Node L1 khái quát siêu bền.
|
|
46
|
+
4. **Forgetting (Quên lãng):** Node có `Energy < 0` HOẶC mồ côi (không ai gọi tới) sẽ BỊ XOÁ (Quét rác sinh học).
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## 4. Bảng Phân loại Khối Lượng Ký ức
|
|
51
|
+
|
|
52
|
+
| Target / Kiểu Node | Tầng | Giải thích | Energy Khởi tạo | Mức độ Tự Phân Hủy (Decay) |
|
|
53
|
+
|---|---|---|---|---|
|
|
54
|
+
| `session_summary` | L1 | Toàn cảnh phiên làm việc | 100 | Lâu dài (Gần như không) |
|
|
55
|
+
| `Core_Fact` | L1 | Cấu hình, IP, Convention cốt lõi | 100 | Gần như không |
|
|
56
|
+
| `User_Pref` | L2 | Thói quen user | 80 | Cực chậm |
|
|
57
|
+
| `project_context` | L2 | Ngữ cảnh dự án hiện tại | 80 | Trung hạn (Cập nhật đổi version) |
|
|
58
|
+
| `Episode_Edge` | L2 | "Hôm qua đã làm gì" | 30 | Nhanh (Rất mau phai mờ) |
|
|
59
|
+
| `error_solution` | L3 | Bug log + Code fix cụ thể | 50 | Trung bình (Công nghệ đổi -> Xóa) |
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
## 5. Workflow Tương tác Trí Nhớ (Mô phỏng GraphRAG)
|
|
64
|
+
|
|
65
|
+
### KHI BẮT ĐẦU task mới (Retrieve):
|
|
66
|
+
```text
|
|
67
|
+
1. Bắn 1 tia Vector Search thả mỏ neo vào Đồ thị (Tìm L1/L2).
|
|
68
|
+
2. Khôi phục lại Mạch Câu Chuyện bằng cách "Bò" dọc theo Edges lân cận (BFS).
|
|
69
|
+
3. Nếu cần code chính xác của 1 Bug, gọi lệnh lấy Detail (L3).
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### KHI KẾT THÚC task (Commit):
|
|
73
|
+
❌ **Sai:** Lưu text rác `memory_save("Fix xong bug X")` vào trong hư không.
|
|
74
|
+
✅ **Đúng:**
|
|
75
|
+
```text
|
|
76
|
+
1. Khởi tạo Node mới: Node[Fix_CORS] = "Thiếu accept headers"
|
|
77
|
+
2. Nối Mạch: Node[Env_Prod] --(gặp lỗi)=> Node[Fix_CORS]
|
|
78
|
+
3. (Tùy chọn) Gắn thêm Detail record vào L3 nếu fix cực phức tạp cần giữ code snippet.
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
## 6. Anti-Patterns Kịch Độc
|
|
84
|
+
|
|
85
|
+
```text
|
|
86
|
+
❌ Gọi L3 load toàn bộ chi tiết khi không cần thiết (Tràn token).
|
|
87
|
+
❌ Cố gắng chèn 200 dòng code vào Tên của Node (Node chỉ giữ Context lõi, Code đẩy xuống L3).
|
|
88
|
+
❌ Tạo Node rác không gán Edge quan hệ. (Garbage Collector sẽ chém thẳng tay).
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
## 7. Giao thức Tự động Dịch chuyển Ký ức (Self-Migration Protocol)
|
|
94
|
+
|
|
95
|
+
> **Dành cho các AI Agent hoạt động trong dự án cũ (Legacy Projects) vừa được cập nhật `ag-kit` thông qua `npx`.**
|
|
96
|
+
|
|
97
|
+
Khi bạn (AI) nhận thức được mình đang ở trong một dự án đã có sẵn dữ liệu ký ức cũ (chứa trong các file `.jsonl` hoặc `memory.db` phẳng), bạn **CÓ TRÁCH NHIỆM TỰ ĐỘNG** thực hiện quá trình "Memory Migration" (Dịch chuyển Ký ức) mà không cần User yêu cầu, theo các bước sau:
|
|
98
|
+
|
|
99
|
+
1. **Phát hiện:** Dùng lệnh đọc file hoặc MCP để quét nội dung các ký ức cũ trong thư mục `data/memories/` (nếu có).
|
|
100
|
+
2. **Băm nhỏ (Chunking & Entity Extraction):** Phân tích các đoạn log cũ xem chúng nói về chủ đề gì (vd: Lịch sử fix bug, Convention code cũ, Sở thích User).
|
|
101
|
+
3. **Tái cấu trúc (Graph Construction):**
|
|
102
|
+
- Từ các đoạn text đó, rút trích ra các `Nodes` cốt lõi mang tính sự thật (Core Facts).
|
|
103
|
+
- Thiết lập các `Edges` (Mạch kết nối) mô tả luồng logic giữa các Nodes đó.
|
|
104
|
+
4. **Lưu trữ (Commit):** Lưu bộ Graph vừa tạo vào cơ sở dữ liệu mới (thông qua `GraphMemoryTool` nếu dự án đã hỗ trợ, hoặc lưu ngược lại bằng `memory_save` dưới cấu trúc **Pseudo-Graph** cực đoan: `[Node:A] --[rel]--> [Node:B]` nếu nền tảng chưa được nâng cấp DB SQLite).
|
|
105
|
+
|
|
106
|
+
Bằng giao thức này, kiến thức của dự án sẽ KHÔNG BAO GIỜ bị đứt gãy sau khi cập nhật kiến trúc. Mọi ký ức quá khứ sẽ tự động "tiến hóa" thành dạng Đồ thị tương lai!
|
|
107
|
+
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: mini-antigravity-injection
|
|
3
|
+
description: Kiến trúc Cấy Lõi Tự Đẩy & Tiến Hoá (Self-Healing & Autonomous Code Mutation) cho Dự Án. Hướng dẫn Agent cách xây dựng bộ máy Tự Code, Tự Fix Lỗi và Tự Hot-Reload định chuẩn TDD.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# KỸ NĂNG: CẤY TIỂU-ANTIGRAVITY (Self-Healing Core Injection)
|
|
7
|
+
|
|
8
|
+
Khi User yêu cầu "Cấy Tiểu-Antigravity" vào một chức năng hay dự án mới, User đang ám chỉ việc xây dựng một hệ thống **Tiến hoá Mã nguồn Tự trị**. Bạn phải tuân thủ nghiêm ngặt 3 Phần dưới đây để tiến hành xây dựng.
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## PHẦN A: THIẾT LẬP HẠ TẦNG & QUYỀN TRUY CẬP (Prerequisites)
|
|
13
|
+
Để Lõi Bác Sĩ (Doctor Persona) có trí tuệ mổ xẻ code, Hệ thống bắt buộc phải có tài nguyên LLM. Trước khi viết code, bạn phải kiểm tra và hướng dẫn User cài đặt hoặc cấu hình các thông số sau:
|
|
14
|
+
|
|
15
|
+
### 1. Trí Tuệ Trung Tâm: Cổng 9Router (Gemini Pro)
|
|
16
|
+
- **Chuẩn bị:** Yêu cầu hệ thống phải đang chạy cổng `9router` (Mặc định).
|
|
17
|
+
- **Token:** User cần cài đặt `9router` (nếu chưa có), đăng nhập các tài khoản Antigravity / Google Hub để `9router` cấp phát Token hợp lệ cho Tiểu Antigravity.
|
|
18
|
+
- **Hoặc:** Nếu không dùng 9router, hệ thống phải được cấu hình chèn cứng `GEMINI_API_KEY` trực tiếp vào biến môi trường.
|
|
19
|
+
- **Biến môi trường:** Đặt `HEALER_MODEL="ag/gemini-3-flash"` hoặc `"ag/gemini-pro-1.5"` cho luồng Mổ Xẻ.
|
|
20
|
+
|
|
21
|
+
### 2. Trí Tuệ Sinh Tồn (Offline Fallback): Ollama & Bartowski
|
|
22
|
+
- **Mục đích:** Khi đứt cáp hoặc không gọi được 9Router/Gemini, Quản Đốc văng lỗi sẽ chết đứng nếu không có Backup.
|
|
23
|
+
- **Thực thi:** Yêu cầu User cài đặt Ollama local (`https://ollama.com/`).
|
|
24
|
+
- **Tải Model:** Chạy lệnh `ollama run hf.co/bartowski/nvidia_Orchestrator-8B-GGUF:Q4_K_M` để kéo chuyên gia Lập trình Local (Tay cắt mổ phụ).
|
|
25
|
+
- **Cấu hình Fallback:** Module Code xử lý mạng phải đảm bảo: Nếu `gemini` timeout hoặc 404 -> Fallback trực tiếp xuống mốc local `hf.co/bartowski/nvidia_Orchestrator-8B-GGUF:Q4_K_M`.
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## PHẦN B: LÕI TRIẾT LÝ KIẾN TRÚC (5 Trụ Cột Tiểu-Antigravity)
|
|
30
|
+
Khi bạn (AI) tự động tạo code `SelfHealingService` cho dự án mới, bạn phải đúc đủ 5 trụ cột này vào code:
|
|
31
|
+
|
|
32
|
+
### 1. Cơ Chế Bơm Kiến Thức Vĩ Mô (Skill & DNA Injection)
|
|
33
|
+
- Code tự động đọc các file nguyên tắc lập trình của dự án (`.agent/GEMINI.md`, `clean-code/SKILL.md`...) và TIÊM vào System Prompt của LLM Bác Sĩ Cục Bộ. Đảm bảo nó code đúng văn phong của Antigravity.
|
|
34
|
+
|
|
35
|
+
### 2. Định Luật Cạn Kiệt Gen (Exhaustion Trigger)
|
|
36
|
+
- Hệ thống bắt Stack Trace. Nếu lỗi Tool/Code gãy 3 lần (Vòng lặp bất tận) -> Kích Hoạt Tiểu-Antigravity chữa cháy tự động.
|
|
37
|
+
|
|
38
|
+
### 3. Hộp Cát Tử Thần (Sandbox) & Lá Chắn Ngữ Nghĩa (Semantic Shield)
|
|
39
|
+
Tuyệt đối KHÔNG đẩy code vừa sinh thẳng vào Môi trường Thực Chiến.
|
|
40
|
+
- **Phase 1 (Doctor):** Dùng prompt áp dụng `5-Whys` tìm Root Cause và viết mới lại file Code.
|
|
41
|
+
- **Phase 2 (Syntax Test):** Build/Compile Dry-run qua trình biên dịch (VD: `tsc --noEmit`).
|
|
42
|
+
- **Phase 3 (Semantic Shield):** Cốt lõi của sự Khôn ngoan! Hệ thống tự rà file Unit Test đi kèm (`*.spec.ts` hoặc `*.test.ts`). Chạy **Test Ngữ Nghĩa (Logic)** với file mới. Nếu Logic tính toán sai (dù cú pháp đúng) -> Đánh sập nhánh đó, cấm Hot-Reload.
|
|
43
|
+
|
|
44
|
+
### 4. Giao Kèo Docstring Định Danh (Docstring Identity Pact)
|
|
45
|
+
- Ép Prompt của Bác Sĩ: Khai báo đa dòng ở đầu file Code mới: Sửa dòng nào? Tại sao sửa? Tuân thủ triết lý gì?
|
|
46
|
+
|
|
47
|
+
### 5. Nạp Nóng (Hot-Reload) & Sổ Ghi Chép Chung (Evolution Ledger)
|
|
48
|
+
- **Git Backup:** Ghi `.bak`, commit Git.
|
|
49
|
+
- **Hot-Reload:** Tự xoá cache (`require.cache` trong JS) nạp RAM trực tiếp.
|
|
50
|
+
- **Ghi Chép:** Bắn Log Tự Sinh Tồn vào `self_healing_logs.md` để Ký ức được đồng bộ khi Main Agent (Antigravity Sếp) tỉnh dậy.
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
## PHẦN C: CÁCH TRIỂN KHAI CHO DỰ ÁN MỚI
|
|
55
|
+
*(Ghi chú cho Antigravity: Không cần lưu cứng bộ boilerplate code vào ag-kit).*
|
|
56
|
+
Khi User ra lệnh "Cấy Tiểu-Antigravity cho tao", bạn (Agent đang chat) tự động làm các bước sau:
|
|
57
|
+
1. Đặt Câu Hỏi Hạ Tầng: Xác nhận 9Router và Ollama đã on-ready theo `PHẦN A`.
|
|
58
|
+
2. Tự Động Viết Code: Tự phân tích Framework của dự án (TS/Node, Python, Rust) và Code ra file `SelfHealingService` theo triết lý của `PHẦN B`.
|
|
59
|
+
3. Tự Động Test: Viết 1 file test làm hỏng kiến trúc cố ý (`BrokenTool`), kích hoạt tiến trình Tự Động Vá Lỗi để chứng minh hệ thống đã On-Air thành công cho User xem!
|