@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.
- 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/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 +285 -0
- package/.agent/agents/backend-specialist.md +268 -0
- package/.agent/agents/code-archaeologist.md +106 -0
- package/.agent/agents/database-architect.md +225 -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 +618 -0
- package/.agent/agents/game-developer.md +162 -0
- package/.agent/agents/mobile-developer.md +382 -0
- package/.agent/agents/orchestrator.md +438 -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 +405 -0
- package/.agent/agents/qa-automation-engineer.md +103 -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 +12 -0
- package/.agent/rules/GEMINI.md +273 -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 +84 -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 +74 -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 +122 -0
- package/.agent/skills/app-builder/templates/nextjs-saas/TEMPLATE.md +122 -0
- package/.agent/skills/app-builder/templates/nextjs-static/TEMPLATE.md +169 -0
- package/.agent/skills/app-builder/templates/nuxt-app/TEMPLATE.md +134 -0
- package/.agent/skills/app-builder/templates/python-fastapi/TEMPLATE.md +83 -0
- package/.agent/skills/app-builder/templates/react-native-app/TEMPLATE.md +119 -0
- package/.agent/skills/architecture/SKILL.md +57 -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 +201 -0
- package/.agent/skills/behavioral-modes/SKILL.md +264 -0
- package/.agent/skills/brainstorming/SKILL.md +164 -0
- package/.agent/skills/brainstorming/dynamic-questioning.md +359 -0
- package/.agent/skills/clean-code/SKILL.md +200 -0
- package/.agent/skills/code-review-checklist/SKILL.md +125 -0
- package/.agent/skills/database-design/SKILL.md +54 -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 +50 -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 +307 -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 +727 -0
- package/.agent/skills/frontend-design/typography-system.md +345 -0
- package/.agent/skills/frontend-design/ux-psychology.md +1118 -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 +155 -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/lint-and-validate/SKILL.md +44 -0
- package/.agent/skills/lint-and-validate/scripts/lint_runner.py +184 -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/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 +355 -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 +432 -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 +311 -0
- package/.agent/skills/nextjs-react-expert/2-bundle-bundle-size-optimization.md +241 -0
- package/.agent/skills/nextjs-react-expert/3-server-server-side-performance.md +489 -0
- package/.agent/skills/nextjs-react-expert/4-client-client-side-data-fetching.md +263 -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 +431 -0
- package/.agent/skills/nextjs-react-expert/7-js-javascript-performance.md +683 -0
- package/.agent/skills/nextjs-react-expert/8-advanced-advanced-patterns.md +149 -0
- package/.agent/skills/nextjs-react-expert/SKILL.md +286 -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 +194 -0
- package/.agent/skills/performance-profiling/SKILL.md +149 -0
- package/.agent/skills/performance-profiling/scripts/lighthouse_audit.py +76 -0
- package/.agent/skills/plan-writing/SKILL.md +152 -0
- package/.agent/skills/powershell-windows/SKILL.md +166 -0
- package/.agent/skills/python-patterns/SKILL.md +441 -0
- package/.agent/skills/red-team-tactics/SKILL.md +203 -0
- package/.agent/skills/rust-pro/SKILL.md +190 -0
- package/.agent/skills/seo-fundamentals/SKILL.md +135 -0
- package/.agent/skills/seo-fundamentals/scripts/seo_checker.py +215 -0
- package/.agent/skills/server-management/SKILL.md +161 -0
- package/.agent/skills/systematic-debugging/SKILL.md +114 -0
- package/.agent/skills/tailwind-patterns/SKILL.md +269 -0
- package/.agent/skills/tdd-workflow/SKILL.md +149 -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 +131 -0
- package/.agent/skills/vulnerability-scanner/scripts/security_scan.py +459 -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 +242 -0
- package/.agent/workflows/plan.md +89 -0
- package/.agent/workflows/preview.md +80 -0
- package/.agent/workflows/restore-localize-compat.md +525 -0
- package/.agent/workflows/status.md +86 -0
- package/.agent/workflows/test.md +144 -0
- package/.agent/workflows/ui-ux-pro-max.md +295 -0
- package/AGENT_FLOW.md +609 -0
- package/CHANGELOG.md +68 -0
- package/LICENSE +21 -0
- package/README.md +260 -0
- package/bin/adapters/base.js +63 -0
- package/bin/adapters/codex.js +391 -0
- package/bin/adapters/gemini.js +137 -0
- package/bin/ag-kit.js +1336 -0
- package/bin/core/builder.js +80 -0
- package/bin/core/generator.js +59 -0
- package/bin/core/resource-loader.js +64 -0
- package/bin/core/transformer.js +208 -0
- package/bin/interactive.js +65 -0
- package/bin/utils/atomic-writer.js +97 -0
- package/bin/utils/git-helper.js +68 -0
- package/bin/utils/managed-block.js +65 -0
- package/bin/utils/manifest.js +241 -0
- package/bin/utils.js +82 -0
- package/docs/codex-rules-template.md +36 -0
- package/docs/mapping-spec.md +68 -0
- package/docs/multi-target-adapter.md +80 -0
- package/docs/official/README.md +53 -0
- package/docs/official/antigravity/agent-modes-settings.md +64 -0
- package/docs/official/antigravity/rules-workflows.md +96 -0
- package/docs/official/antigravity/skills.md +147 -0
- package/docs/official/codex/agents-md.md +119 -0
- package/docs/official/codex/config-advanced.md +358 -0
- package/docs/official/codex/config-basic.md +141 -0
- package/docs/official/codex/config-reference.md +223 -0
- package/docs/official/codex/config-sample.md +216 -0
- package/docs/official/codex/mcp.md +107 -0
- package/docs/official/codex/rules.md +79 -0
- package/docs/official/codex/skills.md +114 -0
- package/docs/official/sources-index.md +32 -0
- package/docs/operations.md +145 -0
- package/docs/terminology-style-guide.md +69 -0
- package/package.json +51 -0
- package/scripts/postinstall-check.js +112 -0
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
i18n Checker - Detects hardcoded strings and missing translations.
|
|
4
|
+
Scans for untranslated text in React, Vue, and Python files.
|
|
5
|
+
"""
|
|
6
|
+
import sys
|
|
7
|
+
import re
|
|
8
|
+
import json
|
|
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
|
+
# Patterns that indicate hardcoded strings (should be translated)
|
|
19
|
+
HARDCODED_PATTERNS = {
|
|
20
|
+
'jsx': [
|
|
21
|
+
# Text directly in JSX: <div>Hello World</div>
|
|
22
|
+
r'>\s*[A-Z][a-zA-Z\s]{3,30}\s*</',
|
|
23
|
+
# JSX attribute strings: title="Welcome"
|
|
24
|
+
r'(title|placeholder|label|alt|aria-label)="[A-Z][a-zA-Z\s]{2,}"',
|
|
25
|
+
# Button/heading text
|
|
26
|
+
r'<(button|h[1-6]|p|span|label)[^>]*>\s*[A-Z][a-zA-Z\s!?.,]{3,}\s*</',
|
|
27
|
+
],
|
|
28
|
+
'vue': [
|
|
29
|
+
# Vue template text
|
|
30
|
+
r'>\s*[A-Z][a-zA-Z\s]{3,30}\s*</',
|
|
31
|
+
r'(placeholder|label|title)="[A-Z][a-zA-Z\s]{2,}"',
|
|
32
|
+
],
|
|
33
|
+
'python': [
|
|
34
|
+
# print/raise with string literals
|
|
35
|
+
r'(print|raise\s+\w+)\s*\(\s*["\'][A-Z][^"\']{5,}["\']',
|
|
36
|
+
# Flask flash messages
|
|
37
|
+
r'flash\s*\(\s*["\'][A-Z][^"\']{5,}["\']',
|
|
38
|
+
]
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
# Patterns that indicate proper i18n usage
|
|
42
|
+
I18N_PATTERNS = [
|
|
43
|
+
r't\(["\']', # t('key') - react-i18next
|
|
44
|
+
r'useTranslation', # React hook
|
|
45
|
+
r'\$t\(', # Vue i18n
|
|
46
|
+
r'_\(["\']', # Python gettext
|
|
47
|
+
r'gettext\(', # Python gettext
|
|
48
|
+
r'useTranslations', # next-intl
|
|
49
|
+
r'FormattedMessage', # react-intl
|
|
50
|
+
r'i18n\.', # Generic i18n
|
|
51
|
+
]
|
|
52
|
+
|
|
53
|
+
def find_locale_files(project_path: Path) -> list:
|
|
54
|
+
"""Find translation/locale files."""
|
|
55
|
+
patterns = [
|
|
56
|
+
"**/locales/**/*.json",
|
|
57
|
+
"**/translations/**/*.json",
|
|
58
|
+
"**/lang/**/*.json",
|
|
59
|
+
"**/i18n/**/*.json",
|
|
60
|
+
"**/messages/*.json",
|
|
61
|
+
"**/*.po", # gettext
|
|
62
|
+
]
|
|
63
|
+
|
|
64
|
+
files = []
|
|
65
|
+
for pattern in patterns:
|
|
66
|
+
files.extend(project_path.glob(pattern))
|
|
67
|
+
|
|
68
|
+
return [f for f in files if 'node_modules' not in str(f)]
|
|
69
|
+
|
|
70
|
+
def check_locale_completeness(locale_files: list) -> dict:
|
|
71
|
+
"""Check if all locales have the same keys."""
|
|
72
|
+
issues = []
|
|
73
|
+
passed = []
|
|
74
|
+
|
|
75
|
+
if not locale_files:
|
|
76
|
+
return {'passed': [], 'issues': ["[!] No locale files found"]}
|
|
77
|
+
|
|
78
|
+
# Group by parent folder (language)
|
|
79
|
+
locales = {}
|
|
80
|
+
for f in locale_files:
|
|
81
|
+
if f.suffix == '.json':
|
|
82
|
+
try:
|
|
83
|
+
lang = f.parent.name
|
|
84
|
+
content = json.loads(f.read_text(encoding='utf-8'))
|
|
85
|
+
if lang not in locales:
|
|
86
|
+
locales[lang] = {}
|
|
87
|
+
locales[lang][f.stem] = set(flatten_keys(content))
|
|
88
|
+
except:
|
|
89
|
+
continue
|
|
90
|
+
|
|
91
|
+
if len(locales) < 2:
|
|
92
|
+
passed.append(f"[OK] Found {len(locale_files)} locale file(s)")
|
|
93
|
+
return {'passed': passed, 'issues': issues}
|
|
94
|
+
|
|
95
|
+
passed.append(f"[OK] Found {len(locales)} language(s): {', '.join(locales.keys())}")
|
|
96
|
+
|
|
97
|
+
# Compare keys across locales
|
|
98
|
+
all_langs = list(locales.keys())
|
|
99
|
+
base_lang = all_langs[0]
|
|
100
|
+
|
|
101
|
+
for namespace in locales.get(base_lang, {}):
|
|
102
|
+
base_keys = locales[base_lang].get(namespace, set())
|
|
103
|
+
|
|
104
|
+
for lang in all_langs[1:]:
|
|
105
|
+
other_keys = locales.get(lang, {}).get(namespace, set())
|
|
106
|
+
|
|
107
|
+
missing = base_keys - other_keys
|
|
108
|
+
if missing:
|
|
109
|
+
issues.append(f"[X] {lang}/{namespace}: Missing {len(missing)} keys")
|
|
110
|
+
|
|
111
|
+
extra = other_keys - base_keys
|
|
112
|
+
if extra:
|
|
113
|
+
issues.append(f"[!] {lang}/{namespace}: {len(extra)} extra keys")
|
|
114
|
+
|
|
115
|
+
if not issues:
|
|
116
|
+
passed.append("[OK] All locales have matching keys")
|
|
117
|
+
|
|
118
|
+
return {'passed': passed, 'issues': issues}
|
|
119
|
+
|
|
120
|
+
def flatten_keys(d, prefix=''):
|
|
121
|
+
"""Flatten nested dict keys."""
|
|
122
|
+
keys = set()
|
|
123
|
+
for k, v in d.items():
|
|
124
|
+
new_key = f"{prefix}.{k}" if prefix else k
|
|
125
|
+
if isinstance(v, dict):
|
|
126
|
+
keys.update(flatten_keys(v, new_key))
|
|
127
|
+
else:
|
|
128
|
+
keys.add(new_key)
|
|
129
|
+
return keys
|
|
130
|
+
|
|
131
|
+
def check_hardcoded_strings(project_path: Path) -> dict:
|
|
132
|
+
"""Check for hardcoded strings in code files."""
|
|
133
|
+
issues = []
|
|
134
|
+
passed = []
|
|
135
|
+
|
|
136
|
+
# Find code files
|
|
137
|
+
extensions = {
|
|
138
|
+
'.tsx': 'jsx', '.jsx': 'jsx', '.ts': 'jsx', '.js': 'jsx',
|
|
139
|
+
'.vue': 'vue',
|
|
140
|
+
'.py': 'python'
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
code_files = []
|
|
144
|
+
for ext in extensions:
|
|
145
|
+
code_files.extend(project_path.rglob(f"*{ext}"))
|
|
146
|
+
|
|
147
|
+
code_files = [f for f in code_files if not any(x in str(f) for x in
|
|
148
|
+
['node_modules', '.git', 'dist', 'build', '__pycache__', 'venv', 'test', 'spec'])]
|
|
149
|
+
|
|
150
|
+
if not code_files:
|
|
151
|
+
return {'passed': ["[!] No code files found"], 'issues': []}
|
|
152
|
+
|
|
153
|
+
files_with_i18n = 0
|
|
154
|
+
files_with_hardcoded = 0
|
|
155
|
+
hardcoded_examples = []
|
|
156
|
+
|
|
157
|
+
for file_path in code_files[:50]: # Limit
|
|
158
|
+
try:
|
|
159
|
+
content = file_path.read_text(encoding='utf-8', errors='ignore')
|
|
160
|
+
ext = file_path.suffix
|
|
161
|
+
file_type = extensions.get(ext, 'jsx')
|
|
162
|
+
|
|
163
|
+
# Check for i18n usage
|
|
164
|
+
has_i18n = any(re.search(p, content) for p in I18N_PATTERNS)
|
|
165
|
+
if has_i18n:
|
|
166
|
+
files_with_i18n += 1
|
|
167
|
+
|
|
168
|
+
# Check for hardcoded strings
|
|
169
|
+
patterns = HARDCODED_PATTERNS.get(file_type, [])
|
|
170
|
+
hardcoded_found = False
|
|
171
|
+
|
|
172
|
+
for pattern in patterns:
|
|
173
|
+
matches = re.findall(pattern, content)
|
|
174
|
+
if matches and not has_i18n:
|
|
175
|
+
hardcoded_found = True
|
|
176
|
+
if len(hardcoded_examples) < 5:
|
|
177
|
+
hardcoded_examples.append(f"{file_path.name}: {str(matches[0])[:40]}...")
|
|
178
|
+
|
|
179
|
+
if hardcoded_found:
|
|
180
|
+
files_with_hardcoded += 1
|
|
181
|
+
|
|
182
|
+
except:
|
|
183
|
+
continue
|
|
184
|
+
|
|
185
|
+
passed.append(f"[OK] Analyzed {len(code_files)} code files")
|
|
186
|
+
|
|
187
|
+
if files_with_i18n > 0:
|
|
188
|
+
passed.append(f"[OK] {files_with_i18n} files use i18n")
|
|
189
|
+
|
|
190
|
+
if files_with_hardcoded > 0:
|
|
191
|
+
issues.append(f"[X] {files_with_hardcoded} files may have hardcoded strings")
|
|
192
|
+
for ex in hardcoded_examples:
|
|
193
|
+
issues.append(f" → {ex}")
|
|
194
|
+
else:
|
|
195
|
+
passed.append("[OK] No obvious hardcoded strings detected")
|
|
196
|
+
|
|
197
|
+
return {'passed': passed, 'issues': issues}
|
|
198
|
+
|
|
199
|
+
def main():
|
|
200
|
+
target = sys.argv[1] if len(sys.argv) > 1 else "."
|
|
201
|
+
project_path = Path(target)
|
|
202
|
+
|
|
203
|
+
print("\n" + "=" * 60)
|
|
204
|
+
print(" i18n CHECKER - Internationalization Audit")
|
|
205
|
+
print("=" * 60 + "\n")
|
|
206
|
+
|
|
207
|
+
# Check locale files
|
|
208
|
+
locale_files = find_locale_files(project_path)
|
|
209
|
+
locale_result = check_locale_completeness(locale_files)
|
|
210
|
+
|
|
211
|
+
# Check hardcoded strings
|
|
212
|
+
code_result = check_hardcoded_strings(project_path)
|
|
213
|
+
|
|
214
|
+
# Print results
|
|
215
|
+
print("[LOCALE FILES]")
|
|
216
|
+
print("-" * 40)
|
|
217
|
+
for item in locale_result['passed']:
|
|
218
|
+
print(f" {item}")
|
|
219
|
+
for item in locale_result['issues']:
|
|
220
|
+
print(f" {item}")
|
|
221
|
+
|
|
222
|
+
print("\n[CODE ANALYSIS]")
|
|
223
|
+
print("-" * 40)
|
|
224
|
+
for item in code_result['passed']:
|
|
225
|
+
print(f" {item}")
|
|
226
|
+
for item in code_result['issues']:
|
|
227
|
+
print(f" {item}")
|
|
228
|
+
|
|
229
|
+
# Summary
|
|
230
|
+
critical_issues = sum(1 for i in locale_result['issues'] + code_result['issues'] if i.startswith("[X]"))
|
|
231
|
+
|
|
232
|
+
print("\n" + "=" * 60)
|
|
233
|
+
if critical_issues == 0:
|
|
234
|
+
print("[OK] i18n CHECK: PASSED")
|
|
235
|
+
sys.exit(0)
|
|
236
|
+
else:
|
|
237
|
+
print(f"[X] i18n CHECK: {critical_issues} issues found")
|
|
238
|
+
sys.exit(1)
|
|
239
|
+
|
|
240
|
+
if __name__ == "__main__":
|
|
241
|
+
main()
|
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: intelligent-routing
|
|
3
|
+
description: 自动 Agent 选择与智能任务路由。分析用户请求并自动选择最合适的专家 Agent,无需用户显式提及。
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# 智能 Agent 路由
|
|
8
|
+
|
|
9
|
+
**目标**:自动分析用户请求,并在无需用户显式提及 Agent 的情况下路由到最合适的专家 Agent。
|
|
10
|
+
|
|
11
|
+
## 核心原则
|
|
12
|
+
|
|
13
|
+
> **AI 应像智能项目经理一样工作**,分析每个请求并自动选择最适合该任务的专家。
|
|
14
|
+
|
|
15
|
+
## 工作方式
|
|
16
|
+
|
|
17
|
+
### 1. 请求分析
|
|
18
|
+
|
|
19
|
+
在响应任何用户请求之前,先执行自动分析:
|
|
20
|
+
|
|
21
|
+
```mermaid
|
|
22
|
+
graph TD
|
|
23
|
+
A[User Request: Add login] --> B[ANALYZE]
|
|
24
|
+
B --> C[Keywords]
|
|
25
|
+
B --> D[Domains]
|
|
26
|
+
B --> E[Complexity]
|
|
27
|
+
C --> F[SELECT AGENT]
|
|
28
|
+
D --> F
|
|
29
|
+
E --> F
|
|
30
|
+
F --> G[security-auditor + backend-specialist]
|
|
31
|
+
G --> H[AUTO-INVOKE with context]
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### 2. Agent 选择矩阵
|
|
35
|
+
|
|
36
|
+
**使用此矩阵自动选择 Agent:**
|
|
37
|
+
|
|
38
|
+
| 用户意图 | 关键词 | 选中的 Agent | 自动调用? |
|
|
39
|
+
| ------------------- | ------------------------------------------ | ------------------------------------------- | ------------ |
|
|
40
|
+
| **身份认证** | "login", "auth", "signup", "password" | `security-auditor` + `backend-specialist` | ✅ YES |
|
|
41
|
+
| **UI 组件** | "button", "card", "layout", "style" | `frontend-specialist` | ✅ YES |
|
|
42
|
+
| **移动端 UI** | "screen", "navigation", "touch", "gesture" | `mobile-developer` | ✅ YES |
|
|
43
|
+
| **API 端点** | "endpoint", "route", "API", "POST", "GET" | `backend-specialist` | ✅ YES |
|
|
44
|
+
| **数据库** | "schema", "migration", "query", "table" | `database-architect` + `backend-specialist` | ✅ YES |
|
|
45
|
+
| **缺陷修复** | "error", "bug", "not working", "broken" | `debugger` | ✅ YES |
|
|
46
|
+
| **测试** | "test", "coverage", "unit", "e2e" | `test-engineer` | ✅ YES |
|
|
47
|
+
| **部署** | "deploy", "production", "CI/CD", "docker" | `devops-engineer` | ✅ YES |
|
|
48
|
+
| **安全评审** | "security", "vulnerability", "exploit" | `security-auditor` + `penetration-tester` | ✅ YES |
|
|
49
|
+
| **性能** | "slow", "optimize", "performance", "speed" | `performance-optimizer` | ✅ YES |
|
|
50
|
+
| **产品定义** | "requirements", "user story", "backlog", "MVP" | `product-owner` | ✅ YES |
|
|
51
|
+
| **新功能** | "build", "create", "implement", "new app" | `orchestrator` → multi-agent | ⚠️ ASK FIRST |
|
|
52
|
+
| **复杂任务** | 检测到多个领域 | `orchestrator` → multi-agent | ⚠️ ASK FIRST |
|
|
53
|
+
|
|
54
|
+
### 3. 自动路由协议
|
|
55
|
+
|
|
56
|
+
## TIER 0 - 自动分析(ALWAYS ACTIVE)
|
|
57
|
+
|
|
58
|
+
在响应任何请求之前:
|
|
59
|
+
|
|
60
|
+
```javascript
|
|
61
|
+
// Pseudo-code for decision tree
|
|
62
|
+
function analyzeRequest(userMessage) {
|
|
63
|
+
// 1. Classify request type
|
|
64
|
+
const requestType = classifyRequest(userMessage);
|
|
65
|
+
|
|
66
|
+
// 2. Detect domains
|
|
67
|
+
const domains = detectDomains(userMessage);
|
|
68
|
+
|
|
69
|
+
// 3. Determine complexity
|
|
70
|
+
const complexity = assessComplexity(domains);
|
|
71
|
+
|
|
72
|
+
// 4. Select agent(s)
|
|
73
|
+
if (complexity === "SIMPLE" && domains.length === 1) {
|
|
74
|
+
return selectSingleAgent(domains[0]);
|
|
75
|
+
} else if (complexity === "MODERATE" && domains.length <= 2) {
|
|
76
|
+
return selectMultipleAgents(domains);
|
|
77
|
+
} else {
|
|
78
|
+
return "orchestrator"; // Complex task
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## 4. 回复格式
|
|
84
|
+
|
|
85
|
+
**自动选择 Agent 时,需简洁告知用户:**
|
|
86
|
+
|
|
87
|
+
```markdown
|
|
88
|
+
🤖 **正在应用 `@security-auditor` + `@backend-specialist` 的知识...**
|
|
89
|
+
|
|
90
|
+
[继续提供专业化回复]
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
**收益:**
|
|
94
|
+
|
|
95
|
+
- ✅ 用户能看到当前应用的专业能力
|
|
96
|
+
- ✅ 决策过程透明
|
|
97
|
+
- ✅ 仍然是自动化流程(不需要 /commands)
|
|
98
|
+
|
|
99
|
+
## 领域识别规则
|
|
100
|
+
|
|
101
|
+
### 单领域任务(自动调用单 Agent)
|
|
102
|
+
|
|
103
|
+
| 领域 | 模式 | Agent |
|
|
104
|
+
| --------------- | ------------------------------------------ | ----------------------- |
|
|
105
|
+
| **Security** | auth, login, jwt, password, hash, token | `security-auditor` |
|
|
106
|
+
| **Frontend** | component, react, vue, css, html, tailwind | `frontend-specialist` |
|
|
107
|
+
| **Backend** | api, server, express, fastapi, node | `backend-specialist` |
|
|
108
|
+
| **Mobile** | react native, flutter, ios, android, expo | `mobile-developer` |
|
|
109
|
+
| **Database** | prisma, sql, mongodb, schema, migration | `database-architect` |
|
|
110
|
+
| **Testing** | test, jest, vitest, playwright, cypress | `test-engineer` |
|
|
111
|
+
| **DevOps** | docker, kubernetes, ci/cd, pm2, nginx | `devops-engineer` |
|
|
112
|
+
| **Debug** | error, bug, crash, not working, issue | `debugger` |
|
|
113
|
+
| **Performance** | slow, lag, optimize, cache, performance | `performance-optimizer` |
|
|
114
|
+
| **SEO** | seo, meta, analytics, sitemap, robots | `seo-specialist` |
|
|
115
|
+
| **Game** | unity, godot, phaser, game, multiplayer | `game-developer` |
|
|
116
|
+
|
|
117
|
+
### 多领域任务(自动调用 Orchestrator)
|
|
118
|
+
|
|
119
|
+
如果请求匹配到**不同类别中的 2 个或以上领域**,自动使用 `orchestrator`:
|
|
120
|
+
|
|
121
|
+
```text
|
|
122
|
+
示例:"创建一个带深色模式 UI 的安全登录系统"
|
|
123
|
+
→ 检测到:Security + Frontend
|
|
124
|
+
→ 自动调用:orchestrator
|
|
125
|
+
→ orchestrator 将协调:security-auditor、frontend-specialist、test-engineer
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
## 复杂度评估
|
|
129
|
+
|
|
130
|
+
### SIMPLE(直接调用 Agent)
|
|
131
|
+
|
|
132
|
+
- 单文件修改
|
|
133
|
+
- 任务清晰且具体
|
|
134
|
+
- 仅单一领域
|
|
135
|
+
- 示例:"修复登录按钮样式"
|
|
136
|
+
|
|
137
|
+
**动作**:自动调用对应 Agent
|
|
138
|
+
|
|
139
|
+
### MODERATE(2-3 个 Agent)
|
|
140
|
+
|
|
141
|
+
- 影响 2-3 个文件
|
|
142
|
+
- 需求清晰
|
|
143
|
+
- 最多 2 个领域
|
|
144
|
+
- 示例:"为用户资料添加 API 端点"
|
|
145
|
+
|
|
146
|
+
**动作**:按顺序自动调用相关 Agent
|
|
147
|
+
|
|
148
|
+
### COMPLEX(需要 Orchestrator)
|
|
149
|
+
|
|
150
|
+
- 涉及多文件/多领域
|
|
151
|
+
- 需要架构级决策
|
|
152
|
+
- 需求不清晰
|
|
153
|
+
- 示例:"构建一个社交媒体应用"
|
|
154
|
+
|
|
155
|
+
**动作**:自动调用 `orchestrator` → 将先提出苏格拉底式问题
|
|
156
|
+
|
|
157
|
+
## 实施规则
|
|
158
|
+
|
|
159
|
+
### 规则 1:静默分析
|
|
160
|
+
|
|
161
|
+
#### 不要宣布“我正在分析你的请求...”
|
|
162
|
+
|
|
163
|
+
- ✅ 静默完成分析
|
|
164
|
+
- ✅ 告知正在应用哪个 Agent
|
|
165
|
+
- ❌ 避免冗长的元叙事
|
|
166
|
+
|
|
167
|
+
### 规则 2:告知 Agent 选择
|
|
168
|
+
|
|
169
|
+
**必须告知正在应用的专家能力:**
|
|
170
|
+
|
|
171
|
+
```markdown
|
|
172
|
+
🤖 **正在应用 `@frontend-specialist` 的知识...**
|
|
173
|
+
|
|
174
|
+
我将按以下特征创建该组件:
|
|
175
|
+
[继续提供专业化回复]
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
### 规则 3:无缝体验
|
|
179
|
+
|
|
180
|
+
**用户体验应与“直接和正确专家对话”一致。**
|
|
181
|
+
|
|
182
|
+
### 规则 4:覆盖能力
|
|
183
|
+
|
|
184
|
+
**用户仍可显式点名 Agent:**
|
|
185
|
+
|
|
186
|
+
```text
|
|
187
|
+
用户:"使用 @backend-specialist 来审查这段代码"
|
|
188
|
+
→ 覆盖自动选择
|
|
189
|
+
→ 使用用户显式指定的 Agent
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
## 边界场景
|
|
193
|
+
|
|
194
|
+
### 场景 1:通用问题
|
|
195
|
+
|
|
196
|
+
```text
|
|
197
|
+
用户:"React 是如何工作的?"
|
|
198
|
+
→ 类型:QUESTION
|
|
199
|
+
→ 不需要调用 Agent
|
|
200
|
+
→ 直接给出解释
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
### 场景 2:极度模糊的请求
|
|
204
|
+
|
|
205
|
+
```text
|
|
206
|
+
用户:"把它做得更好"
|
|
207
|
+
→ 复杂度:UNCLEAR
|
|
208
|
+
→ 动作:先提澄清问题
|
|
209
|
+
→ 然后路由到合适 Agent
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
### 场景 3:模式冲突
|
|
213
|
+
|
|
214
|
+
```text
|
|
215
|
+
用户:"给 Web 应用加上移动端支持"
|
|
216
|
+
→ 冲突:mobile vs web
|
|
217
|
+
→ 动作:先问“你要的是响应式 Web,还是原生移动 App?”
|
|
218
|
+
→ 再按结论路由
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
## 与现有工作流集成
|
|
222
|
+
|
|
223
|
+
### 与 /orchestrate 命令
|
|
224
|
+
|
|
225
|
+
- **用户输入 `/orchestrate`**:显式进入编排模式
|
|
226
|
+
- **AI 检测复杂任务**:自动调用 orchestrator(结果相同)
|
|
227
|
+
|
|
228
|
+
**区别**:用户不需要知道这个命令存在。
|
|
229
|
+
|
|
230
|
+
### 与苏格拉底门控
|
|
231
|
+
|
|
232
|
+
- **自动路由不会绕过苏格拉底门控**
|
|
233
|
+
- 如果任务不清晰,仍先提问
|
|
234
|
+
- 然后再路由到合适 Agent
|
|
235
|
+
|
|
236
|
+
### 与 GEMINI.md 规则
|
|
237
|
+
|
|
238
|
+
- **优先级**:GEMINI.md 规则 > intelligent-routing
|
|
239
|
+
- 如果 GEMINI.md 指定了显式路由,按其规则执行
|
|
240
|
+
- 当没有显式规则时,智能路由作为默认机制
|
|
241
|
+
|
|
242
|
+
## 系统测试
|
|
243
|
+
|
|
244
|
+
### 测试用例
|
|
245
|
+
|
|
246
|
+
#### 测试 1:简单前端任务
|
|
247
|
+
|
|
248
|
+
```text
|
|
249
|
+
用户:"创建一个深色模式切换按钮"
|
|
250
|
+
期望:自动调用 frontend-specialist
|
|
251
|
+
验证:回复中显示“正在应用 @frontend-specialist”
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
#### 测试 2:安全任务
|
|
255
|
+
|
|
256
|
+
```text
|
|
257
|
+
用户:"审查认证流程中的漏洞"
|
|
258
|
+
期望:自动调用 security-auditor
|
|
259
|
+
验证:输出以安全分析为主
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
#### 测试 3:复杂多领域任务
|
|
263
|
+
|
|
264
|
+
```text
|
|
265
|
+
用户:"构建一个带实时通知的聊天应用"
|
|
266
|
+
期望:自动调用 orchestrator
|
|
267
|
+
验证:协调多个 Agent(backend、frontend、test)
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
#### 测试 4:缺陷修复
|
|
271
|
+
|
|
272
|
+
```text
|
|
273
|
+
用户:"登录不可用,返回 401 错误"
|
|
274
|
+
期望:自动调用 debugger
|
|
275
|
+
验证:输出体现系统化调试路径
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
## 性能注意事项
|
|
279
|
+
|
|
280
|
+
### Token 使用
|
|
281
|
+
|
|
282
|
+
- 分析阶段每次请求增加约 50-100 tokens
|
|
283
|
+
- 权衡:更高准确率 vs 轻微开销
|
|
284
|
+
- 整体会减少往返沟通,反而节省 tokens
|
|
285
|
+
|
|
286
|
+
### 响应时间
|
|
287
|
+
|
|
288
|
+
- 分析是即时的(模式匹配)
|
|
289
|
+
- 不需要额外 API 调用
|
|
290
|
+
- Agent 选择在首次回复前完成
|
|
291
|
+
|
|
292
|
+
## 用户教育
|
|
293
|
+
|
|
294
|
+
### 可选:首次说明
|
|
295
|
+
|
|
296
|
+
如果是项目中的首次交互,可使用:
|
|
297
|
+
|
|
298
|
+
```markdown
|
|
299
|
+
💡 **提示**:我已配置自动专家 Agent 选择机制。
|
|
300
|
+
我会始终为你的任务选择最合适的专家。如果你更偏好手动指定,
|
|
301
|
+
也可以使用 `@agent-name` 显式点名。
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
## 调试 Agent 选择
|
|
305
|
+
|
|
306
|
+
### 启用调试模式(用于开发)
|
|
307
|
+
|
|
308
|
+
可在 GEMINI.md 中临时加入:
|
|
309
|
+
|
|
310
|
+
```markdown
|
|
311
|
+
## DEBUG: Intelligent Routing
|
|
312
|
+
|
|
313
|
+
显示选择理由:
|
|
314
|
+
|
|
315
|
+
- 检测到的领域:[list]
|
|
316
|
+
- 选中的 agent:[name]
|
|
317
|
+
- 理由:[why]
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
## 总结
|
|
321
|
+
|
|
322
|
+
**intelligent-routing 技能可实现:**
|
|
323
|
+
|
|
324
|
+
✅ 零命令操作(无需 `/orchestrate`)
|
|
325
|
+
✅ 基于请求分析自动选择专家
|
|
326
|
+
✅ 透明告知当前应用的专家能力
|
|
327
|
+
✅ 与现有工作流无缝集成
|
|
328
|
+
✅ 支持用户显式点名覆盖
|
|
329
|
+
✅ 复杂任务自动回退到 orchestrator
|
|
330
|
+
|
|
331
|
+
**结果**:用户无需理解底层系统架构,也能获得专家级响应。
|
|
332
|
+
|
|
333
|
+
---
|
|
334
|
+
|
|
335
|
+
**下一步**:将此技能集成到 GEMINI.md 的 TIER 0 规则。
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: lint-and-validate
|
|
3
|
+
description: 自动质量控制、Lint 与静态分析流程。每次代码修改后使用,确保语法正确与项目规范一致。触发关键词:lint、format、check、validate、types、static analysis。
|
|
4
|
+
allowed-tools: Read, Glob, Grep, Bash
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# 代码检查与校验技能
|
|
8
|
+
|
|
9
|
+
> **强制要求:** 每次代码变更后必须运行相应校验工具。在代码无错误前,不得将任务视为完成。
|
|
10
|
+
|
|
11
|
+
### 按技术栈执行流程
|
|
12
|
+
|
|
13
|
+
#### Node.js / TypeScript
|
|
14
|
+
1. **Lint/Fix:** `npm run lint` 或 `npx eslint "path" --fix`
|
|
15
|
+
2. **Types:** `npx tsc --noEmit`
|
|
16
|
+
3. **Security:** `npm audit --audit-level=high`
|
|
17
|
+
|
|
18
|
+
#### Python
|
|
19
|
+
1. **Linter(Ruff):** `ruff check "path" --fix`(快速且现代)
|
|
20
|
+
2. **Security(Bandit):** `bandit -r "path" -ll`
|
|
21
|
+
3. **Types(MyPy):** `mypy "path"`
|
|
22
|
+
|
|
23
|
+
## 质量闭环
|
|
24
|
+
1. **编写/修改代码**
|
|
25
|
+
2. **执行审计:** `npm run lint && npx tsc --noEmit`
|
|
26
|
+
3. **分析报告:** 检查 “FINAL AUDIT REPORT” 段落。
|
|
27
|
+
4. **修复并重复:** “FINAL AUDIT” 失败时禁止提交代码。
|
|
28
|
+
|
|
29
|
+
## 错误处理
|
|
30
|
+
- 若 `lint` 失败:立即修复风格或语法问题。
|
|
31
|
+
- 若 `tsc` 失败:先修复类型不匹配,再继续流程。
|
|
32
|
+
- 若未配置工具:检查项目根目录中是否有 `.eslintrc`、`tsconfig.json`、`pyproject.toml`,并建议补齐配置。
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
**严格规则:** 未通过上述检查的代码,不得提交,也不得标记为“完成”。
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## 脚本
|
|
40
|
+
|
|
41
|
+
| 脚本 | 用途 | 执行命令 |
|
|
42
|
+
| --- | --- | --- |
|
|
43
|
+
| `scripts/lint_runner.py` | 统一 lint 检查 | `python scripts/lint_runner.py <project_path>` |
|
|
44
|
+
| `scripts/type_coverage.py` | 类型覆盖率分析 | `python scripts/type_coverage.py <project_path>` |
|