@jakkrichm/create-nexus-devflow 2.0.20 → 2.0.21
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/dist/lib/update.js +19 -8
- package/dist/lib/update.js.map +1 -1
- package/package.json +1 -1
- package/template/.agents/skills/00-discover/SKILL.md +28 -116
- package/template/.agents/skills/40-execute/SKILL.md +1 -1
- package/template/.agents/skills/50-verify/SKILL.md +28 -161
- package/template/.agents/skills/60-report/SKILL.md +19 -92
- package/template/.agents/skills/70-release/SKILL.md +36 -11
- package/template/.agents/skills/check/SKILL.md +19 -7
- package/template/.agents/skills/complete/SKILL.md +21 -10
- package/template/.claude/skills/00-discover/SKILL.md +28 -116
- package/template/.claude/skills/40-execute/SKILL.md +1 -1
- package/template/.claude/skills/50-verify/SKILL.md +28 -161
- package/template/.claude/skills/60-report/SKILL.md +19 -92
- package/template/.claude/skills/70-release/SKILL.md +36 -11
- package/template/.claude/skills/check/SKILL.md +19 -7
- package/template/.claude/skills/complete/SKILL.md +21 -10
- package/template/AGENTS.md +1 -1
- package/template/devflow/context/coding-standards.md +40 -29
- package/template/.agents/skills/agent/SKILL.md +0 -165
- package/template/.agents/skills/api-and-interface-design/SKILL.md +0 -294
- package/template/.agents/skills/app-builder/SKILL.md +0 -75
- package/template/.agents/skills/app-builder/agent-coordination.md +0 -71
- package/template/.agents/skills/app-builder/feature-building.md +0 -53
- package/template/.agents/skills/app-builder/project-detection.md +0 -34
- package/template/.agents/skills/app-builder/scaffolding.md +0 -118
- package/template/.agents/skills/app-builder/tech-stack.md +0 -40
- package/template/.agents/skills/app-builder/templates/SKILL.md +0 -39
- package/template/.agents/skills/app-builder/templates/astro-static/TEMPLATE.md +0 -76
- package/template/.agents/skills/app-builder/templates/chrome-extension/TEMPLATE.md +0 -92
- package/template/.agents/skills/app-builder/templates/cli-tool/TEMPLATE.md +0 -88
- package/template/.agents/skills/app-builder/templates/electron-desktop/TEMPLATE.md +0 -88
- package/template/.agents/skills/app-builder/templates/express-api/TEMPLATE.md +0 -83
- package/template/.agents/skills/app-builder/templates/flutter-app/TEMPLATE.md +0 -90
- package/template/.agents/skills/app-builder/templates/monorepo-turborepo/TEMPLATE.md +0 -90
- package/template/.agents/skills/app-builder/templates/nextjs-fullstack/TEMPLATE.md +0 -122
- package/template/.agents/skills/app-builder/templates/nextjs-saas/TEMPLATE.md +0 -122
- package/template/.agents/skills/app-builder/templates/nextjs-static/TEMPLATE.md +0 -169
- package/template/.agents/skills/app-builder/templates/nuxt-app/TEMPLATE.md +0 -134
- package/template/.agents/skills/app-builder/templates/python-fastapi/TEMPLATE.md +0 -83
- package/template/.agents/skills/app-builder/templates/react-native-app/TEMPLATE.md +0 -119
- package/template/.agents/skills/architecture/SKILL.md +0 -55
- package/template/.agents/skills/architecture/context-discovery.md +0 -43
- package/template/.agents/skills/architecture/examples.md +0 -94
- package/template/.agents/skills/architecture/pattern-selection.md +0 -68
- package/template/.agents/skills/architecture/patterns-reference.md +0 -50
- package/template/.agents/skills/architecture/trade-off-analysis.md +0 -77
- package/template/.agents/skills/bash-linux/SKILL.md +0 -199
- package/template/.agents/skills/behavioral-modes/SKILL.md +0 -242
- package/template/.agents/skills/brainstorm/SKILL.md +0 -168
- package/template/.agents/skills/changelog/SKILL.md +0 -109
- package/template/.agents/skills/codebase-design/DEEPENING.md +0 -24
- package/template/.agents/skills/codebase-design/DESIGN-IT-TWICE.md +0 -28
- package/template/.agents/skills/codebase-design/SKILL.md +0 -58
- package/template/.agents/skills/commit/SKILL.md +0 -59
- package/template/.agents/skills/competitor-analysis/SKILL.md +0 -66
- package/template/.agents/skills/context-engineering/SKILL.md +0 -290
- package/template/.agents/skills/database-design/SKILL.md +0 -52
- package/template/.agents/skills/database-design/database-selection.md +0 -43
- package/template/.agents/skills/database-design/indexing.md +0 -39
- package/template/.agents/skills/database-design/migrations.md +0 -48
- package/template/.agents/skills/database-design/optimization.md +0 -36
- package/template/.agents/skills/database-design/orm-selection.md +0 -30
- package/template/.agents/skills/database-design/schema-design.md +0 -56
- package/template/.agents/skills/database-design/scripts/schema_validator.py +0 -172
- package/template/.agents/skills/deploy/SKILL.md +0 -63
- package/template/.agents/skills/documentation-and-adrs/SKILL.md +0 -278
- package/template/.agents/skills/domain-modeling/ADR-FORMAT.md +0 -47
- package/template/.agents/skills/domain-modeling/CONTEXT-FORMAT.md +0 -60
- package/template/.agents/skills/domain-modeling/SKILL.md +0 -74
- package/template/.agents/skills/followup/SKILL.md +0 -83
- package/template/.agents/skills/frontend-ui-engineering/SKILL.md +0 -326
- package/template/.agents/skills/frontend-ui-engineering/accessibility-checklist.md +0 -159
- package/template/.agents/skills/goal/SKILL.md +0 -148
- package/template/.agents/skills/handoff/SKILL.md +0 -46
- package/template/.agents/skills/help/SKILL.md +0 -253
- package/template/.agents/skills/i18n-localization/SKILL.md +0 -154
- package/template/.agents/skills/i18n-localization/scripts/i18n_checker.py +0 -241
- package/template/.agents/skills/insight/SKILL.md +0 -42
- package/template/.agents/skills/issue-triage/SKILL.md +0 -115
- package/template/.agents/skills/lint-and-validate/SKILL.md +0 -45
- package/template/.agents/skills/lint-and-validate/scripts/lint_runner.py +0 -184
- package/template/.agents/skills/lint-and-validate/scripts/type_coverage.py +0 -173
- package/template/.agents/skills/mcp-builder/SKILL.md +0 -176
- package/template/.agents/skills/merge/SKILL.md +0 -76
- package/template/.agents/skills/mobile-design/SKILL.md +0 -394
- package/template/.agents/skills/mobile-design/decision-trees.md +0 -516
- package/template/.agents/skills/mobile-design/mobile-backend.md +0 -491
- package/template/.agents/skills/mobile-design/mobile-color-system.md +0 -420
- package/template/.agents/skills/mobile-design/mobile-debugging.md +0 -122
- package/template/.agents/skills/mobile-design/mobile-design-thinking.md +0 -357
- package/template/.agents/skills/mobile-design/mobile-navigation.md +0 -458
- package/template/.agents/skills/mobile-design/mobile-performance.md +0 -767
- package/template/.agents/skills/mobile-design/mobile-testing.md +0 -356
- package/template/.agents/skills/mobile-design/mobile-typography.md +0 -433
- package/template/.agents/skills/mobile-design/platform-android.md +0 -666
- package/template/.agents/skills/mobile-design/platform-ios.md +0 -561
- package/template/.agents/skills/mobile-design/scripts/mobile_audit.py +0 -670
- package/template/.agents/skills/mobile-design/touch-psychology.md +0 -537
- package/template/.agents/skills/nextjs-react-expert/1-async-eliminating-waterfalls.md +0 -312
- package/template/.agents/skills/nextjs-react-expert/2-bundle-bundle-size-optimization.md +0 -240
- package/template/.agents/skills/nextjs-react-expert/3-server-server-side-performance.md +0 -490
- package/template/.agents/skills/nextjs-react-expert/4-client-client-side-data-fetching.md +0 -264
- package/template/.agents/skills/nextjs-react-expert/5-rerender-re-render-optimization.md +0 -581
- package/template/.agents/skills/nextjs-react-expert/6-rendering-rendering-performance.md +0 -432
- package/template/.agents/skills/nextjs-react-expert/7-js-javascript-performance.md +0 -684
- package/template/.agents/skills/nextjs-react-expert/8-advanced-advanced-patterns.md +0 -150
- package/template/.agents/skills/nextjs-react-expert/SKILL.md +0 -286
- package/template/.agents/skills/nextjs-react-expert/scripts/convert_rules.py +0 -222
- package/template/.agents/skills/nextjs-react-expert/scripts/react_performance_checker.py +0 -252
- package/template/.agents/skills/nodejs-best-practices/SKILL.md +0 -333
- package/template/.agents/skills/package-json-generator/SKILL.md +0 -60
- package/template/.agents/skills/package-json-generator/scripts/generate.js +0 -120
- package/template/.agents/skills/package-json-generator/scripts/run.sh +0 -19
- package/template/.agents/skills/parallel-agents/SKILL.md +0 -144
- package/template/.agents/skills/performance-optimization/SKILL.md +0 -299
- package/template/.agents/skills/performance-optimization/performance-checklist.md +0 -113
- package/template/.agents/skills/powershell-windows/SKILL.md +0 -167
- package/template/.agents/skills/pr/SKILL.md +0 -93
- package/template/.agents/skills/prd/SKILL.md +0 -127
- package/template/.agents/skills/preview/SKILL.md +0 -42
- package/template/.agents/skills/python-patterns/SKILL.md +0 -441
- package/template/.agents/skills/research/SKILL.md +0 -143
- package/template/.agents/skills/review/SKILL.md +0 -71
- package/template/.agents/skills/roadmap-strategy/SKILL.md +0 -94
- package/template/.agents/skills/security-review/SKILL.md +0 -63
- package/template/.agents/skills/seo-fundamentals/SKILL.md +0 -129
- package/template/.agents/skills/seo-fundamentals/scripts/seo_checker.py +0 -219
- package/template/.agents/skills/server-management/SKILL.md +0 -161
- package/template/.agents/skills/simplify/SKILL.md +0 -70
- package/template/.agents/skills/skill-development/SKILL.md +0 -86
- package/template/.agents/skills/spec/SKILL.md +0 -39
- package/template/.agents/skills/spec-driven-development/SKILL.md +0 -207
- package/template/.agents/skills/tailwind-patterns/SKILL.md +0 -269
- package/template/.agents/skills/type-design/SKILL.md +0 -84
- package/template/.agents/skills/ui-ux-pro-max/SKILL.md +0 -75
- package/template/.claude/skills/agent/SKILL.md +0 -165
- package/template/.claude/skills/api-and-interface-design/SKILL.md +0 -294
- package/template/.claude/skills/app-builder/SKILL.md +0 -75
- package/template/.claude/skills/app-builder/agent-coordination.md +0 -71
- package/template/.claude/skills/app-builder/feature-building.md +0 -53
- package/template/.claude/skills/app-builder/project-detection.md +0 -34
- package/template/.claude/skills/app-builder/scaffolding.md +0 -118
- package/template/.claude/skills/app-builder/tech-stack.md +0 -40
- package/template/.claude/skills/app-builder/templates/SKILL.md +0 -39
- package/template/.claude/skills/app-builder/templates/astro-static/TEMPLATE.md +0 -76
- package/template/.claude/skills/app-builder/templates/chrome-extension/TEMPLATE.md +0 -92
- package/template/.claude/skills/app-builder/templates/cli-tool/TEMPLATE.md +0 -88
- package/template/.claude/skills/app-builder/templates/electron-desktop/TEMPLATE.md +0 -88
- package/template/.claude/skills/app-builder/templates/express-api/TEMPLATE.md +0 -83
- package/template/.claude/skills/app-builder/templates/flutter-app/TEMPLATE.md +0 -90
- package/template/.claude/skills/app-builder/templates/monorepo-turborepo/TEMPLATE.md +0 -90
- package/template/.claude/skills/app-builder/templates/nextjs-fullstack/TEMPLATE.md +0 -122
- package/template/.claude/skills/app-builder/templates/nextjs-saas/TEMPLATE.md +0 -122
- package/template/.claude/skills/app-builder/templates/nextjs-static/TEMPLATE.md +0 -169
- package/template/.claude/skills/app-builder/templates/nuxt-app/TEMPLATE.md +0 -134
- package/template/.claude/skills/app-builder/templates/python-fastapi/TEMPLATE.md +0 -83
- package/template/.claude/skills/app-builder/templates/react-native-app/TEMPLATE.md +0 -119
- package/template/.claude/skills/architecture/SKILL.md +0 -55
- package/template/.claude/skills/architecture/context-discovery.md +0 -43
- package/template/.claude/skills/architecture/examples.md +0 -94
- package/template/.claude/skills/architecture/pattern-selection.md +0 -68
- package/template/.claude/skills/architecture/patterns-reference.md +0 -50
- package/template/.claude/skills/architecture/trade-off-analysis.md +0 -77
- package/template/.claude/skills/bash-linux/SKILL.md +0 -199
- package/template/.claude/skills/behavioral-modes/SKILL.md +0 -242
- package/template/.claude/skills/brainstorm/SKILL.md +0 -168
- package/template/.claude/skills/changelog/SKILL.md +0 -109
- package/template/.claude/skills/codebase-design/DEEPENING.md +0 -24
- package/template/.claude/skills/codebase-design/DESIGN-IT-TWICE.md +0 -28
- package/template/.claude/skills/codebase-design/SKILL.md +0 -58
- package/template/.claude/skills/commit/SKILL.md +0 -59
- package/template/.claude/skills/competitor-analysis/SKILL.md +0 -66
- package/template/.claude/skills/context-engineering/SKILL.md +0 -290
- package/template/.claude/skills/database-design/SKILL.md +0 -52
- package/template/.claude/skills/database-design/database-selection.md +0 -43
- package/template/.claude/skills/database-design/indexing.md +0 -39
- package/template/.claude/skills/database-design/migrations.md +0 -48
- package/template/.claude/skills/database-design/optimization.md +0 -36
- package/template/.claude/skills/database-design/orm-selection.md +0 -30
- package/template/.claude/skills/database-design/schema-design.md +0 -56
- package/template/.claude/skills/database-design/scripts/schema_validator.py +0 -172
- package/template/.claude/skills/deploy/SKILL.md +0 -63
- package/template/.claude/skills/documentation-and-adrs/SKILL.md +0 -278
- package/template/.claude/skills/domain-modeling/ADR-FORMAT.md +0 -47
- package/template/.claude/skills/domain-modeling/CONTEXT-FORMAT.md +0 -60
- package/template/.claude/skills/domain-modeling/SKILL.md +0 -74
- package/template/.claude/skills/followup/SKILL.md +0 -83
- package/template/.claude/skills/frontend-ui-engineering/SKILL.md +0 -326
- package/template/.claude/skills/frontend-ui-engineering/accessibility-checklist.md +0 -159
- package/template/.claude/skills/goal/SKILL.md +0 -148
- package/template/.claude/skills/handoff/SKILL.md +0 -46
- package/template/.claude/skills/help/SKILL.md +0 -253
- package/template/.claude/skills/i18n-localization/SKILL.md +0 -154
- package/template/.claude/skills/i18n-localization/scripts/i18n_checker.py +0 -241
- package/template/.claude/skills/insight/SKILL.md +0 -42
- package/template/.claude/skills/issue-triage/SKILL.md +0 -115
- package/template/.claude/skills/lint-and-validate/SKILL.md +0 -45
- package/template/.claude/skills/lint-and-validate/scripts/lint_runner.py +0 -184
- package/template/.claude/skills/lint-and-validate/scripts/type_coverage.py +0 -173
- package/template/.claude/skills/mcp-builder/SKILL.md +0 -176
- package/template/.claude/skills/merge/SKILL.md +0 -76
- package/template/.claude/skills/mobile-design/SKILL.md +0 -394
- package/template/.claude/skills/mobile-design/decision-trees.md +0 -516
- package/template/.claude/skills/mobile-design/mobile-backend.md +0 -491
- package/template/.claude/skills/mobile-design/mobile-color-system.md +0 -420
- package/template/.claude/skills/mobile-design/mobile-debugging.md +0 -122
- package/template/.claude/skills/mobile-design/mobile-design-thinking.md +0 -357
- package/template/.claude/skills/mobile-design/mobile-navigation.md +0 -458
- package/template/.claude/skills/mobile-design/mobile-performance.md +0 -767
- package/template/.claude/skills/mobile-design/mobile-testing.md +0 -356
- package/template/.claude/skills/mobile-design/mobile-typography.md +0 -433
- package/template/.claude/skills/mobile-design/platform-android.md +0 -666
- package/template/.claude/skills/mobile-design/platform-ios.md +0 -561
- package/template/.claude/skills/mobile-design/scripts/mobile_audit.py +0 -670
- package/template/.claude/skills/mobile-design/touch-psychology.md +0 -537
- package/template/.claude/skills/nextjs-react-expert/1-async-eliminating-waterfalls.md +0 -312
- package/template/.claude/skills/nextjs-react-expert/2-bundle-bundle-size-optimization.md +0 -240
- package/template/.claude/skills/nextjs-react-expert/3-server-server-side-performance.md +0 -490
- package/template/.claude/skills/nextjs-react-expert/4-client-client-side-data-fetching.md +0 -264
- package/template/.claude/skills/nextjs-react-expert/5-rerender-re-render-optimization.md +0 -581
- package/template/.claude/skills/nextjs-react-expert/6-rendering-rendering-performance.md +0 -432
- package/template/.claude/skills/nextjs-react-expert/7-js-javascript-performance.md +0 -684
- package/template/.claude/skills/nextjs-react-expert/8-advanced-advanced-patterns.md +0 -150
- package/template/.claude/skills/nextjs-react-expert/SKILL.md +0 -286
- package/template/.claude/skills/nextjs-react-expert/scripts/convert_rules.py +0 -222
- package/template/.claude/skills/nextjs-react-expert/scripts/react_performance_checker.py +0 -252
- package/template/.claude/skills/nodejs-best-practices/SKILL.md +0 -333
- package/template/.claude/skills/package-json-generator/SKILL.md +0 -60
- package/template/.claude/skills/package-json-generator/scripts/generate.js +0 -120
- package/template/.claude/skills/package-json-generator/scripts/run.sh +0 -19
- package/template/.claude/skills/parallel-agents/SKILL.md +0 -144
- package/template/.claude/skills/performance-optimization/SKILL.md +0 -299
- package/template/.claude/skills/performance-optimization/performance-checklist.md +0 -113
- package/template/.claude/skills/powershell-windows/SKILL.md +0 -167
- package/template/.claude/skills/pr/SKILL.md +0 -93
- package/template/.claude/skills/prd/SKILL.md +0 -127
- package/template/.claude/skills/preview/SKILL.md +0 -42
- package/template/.claude/skills/python-patterns/SKILL.md +0 -441
- package/template/.claude/skills/research/SKILL.md +0 -143
- package/template/.claude/skills/review/SKILL.md +0 -71
- package/template/.claude/skills/roadmap-strategy/SKILL.md +0 -94
- package/template/.claude/skills/security-review/SKILL.md +0 -63
- package/template/.claude/skills/seo-fundamentals/SKILL.md +0 -129
- package/template/.claude/skills/seo-fundamentals/scripts/seo_checker.py +0 -219
- package/template/.claude/skills/server-management/SKILL.md +0 -161
- package/template/.claude/skills/simplify/SKILL.md +0 -70
- package/template/.claude/skills/skill-development/SKILL.md +0 -86
- package/template/.claude/skills/spec/SKILL.md +0 -39
- package/template/.claude/skills/spec-driven-development/SKILL.md +0 -207
- package/template/.claude/skills/tailwind-patterns/SKILL.md +0 -269
- package/template/.claude/skills/type-design/SKILL.md +0 -84
- package/template/.claude/skills/ui-ux-pro-max/SKILL.md +0 -75
|
@@ -1,241 +0,0 @@
|
|
|
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()
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: insight
|
|
3
|
-
description: "[Devflow] Extract reusable lessons, patterns, file insights, and post-mortem learning from completed work."
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Insight Extraction & Post-Mortem Learning
|
|
7
|
-
|
|
8
|
-
## Overview
|
|
9
|
-
|
|
10
|
-
This is the insight and knowledge extraction master skill for Nexus-DevFlow. It captures reusable engineering lessons, architectural patterns, gotchas, post-mortem incident analyses, and token-efficiency notes from completed implementation and verification work.
|
|
11
|
-
|
|
12
|
-
**9arm Post-Mortem Pattern**:
|
|
13
|
-
```text
|
|
14
|
-
What Broke ➔ Business Impact ➔ Root Cause ➔ Fix Evidence ➔ Prevention & Guardrails
|
|
15
|
-
```
|
|
16
|
-
|
|
17
|
-
---
|
|
18
|
-
|
|
19
|
-
## 1. Types of Knowledge Extracted
|
|
20
|
-
|
|
21
|
-
1. **Architectural Patterns**: Reusable structural patterns, data transformations, or component designs.
|
|
22
|
-
2. **Gotchas & Hidden Invariants**: Subtle platform bugs, async timing issues, ORM quirks, or browser edge cases.
|
|
23
|
-
3. **Incident Post-Mortems**: Rigorous root cause analysis and why tests/checks failed to catch the bug initially.
|
|
24
|
-
4. **Context & Token Optimization**: Notes on avoidable context reading or redundant artifact parsing.
|
|
25
|
-
|
|
26
|
-
---
|
|
27
|
-
|
|
28
|
-
## 2. Process & Recording Destinations
|
|
29
|
-
|
|
30
|
-
1. **Load Evidence**: Review `git diff`, `40-execute.md`, `50-verify.md`, or test logs.
|
|
31
|
-
2. **Distill Insights**: Formulate clear, actionable, non-generic takeaways.
|
|
32
|
-
3. **Save to Persistent Memory**:
|
|
33
|
-
- Save project-wide engineering lessons to `devflow/context/lessons.md` (or `knowledge/lessons.md`).
|
|
34
|
-
- Feed run-specific learnings into `60-report.md` and `70-release.md`.
|
|
35
|
-
|
|
36
|
-
---
|
|
37
|
-
|
|
38
|
-
## Relationship To DevFlow 2.0
|
|
39
|
-
|
|
40
|
-
- **Classification**: Companion command & Continuous learning
|
|
41
|
-
- **Mainline integration**: Invoked after `50-verify` or `60-report`.
|
|
42
|
-
- **Handoff**: `60-report`, `70-release`
|
|
@@ -1,115 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: issue-triage
|
|
3
|
-
description: "[Devflow] Intake, categorize, and prioritize incoming issues and bug reports before delivery commitment."
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
---
|
|
7
|
-
description: Issue Triage Addon - Analyze GitHub issues, detect duplicates or spam, and route actionable work into DevFlow workflows.
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
# Phase 57: Issue Triage Addon
|
|
11
|
-
|
|
12
|
-
## Target: $ARGUMENTS
|
|
13
|
-
|
|
14
|
-
Use this workflow to evaluate GitHub issues, bug reports, feature requests, support requests, duplicates, or noisy reports before creating or resuming work.
|
|
15
|
-
Use `triage` as the support skill for classification, verification, and agent-ready briefs. Use `to-issues` only when a stable spec or PRD must be packaged into vertical slices.
|
|
16
|
-
|
|
17
|
-
## Prompt Sources
|
|
18
|
-
|
|
19
|
-
Adapted from:
|
|
20
|
-
|
|
21
|
-
- `github/issue_analyzer.md`
|
|
22
|
-
- `github/issue_triager.md`
|
|
23
|
-
- `github/duplicate_detector.md`
|
|
24
|
-
- `github/spam_detector.md`
|
|
25
|
-
- `github/pr_ai_triage.md`
|
|
26
|
-
|
|
27
|
-
## Process
|
|
28
|
-
|
|
29
|
-
### 1. Read Issue Context
|
|
30
|
-
|
|
31
|
-
Collect:
|
|
32
|
-
|
|
33
|
-
- issue title and body
|
|
34
|
-
- comments and maintainer notes
|
|
35
|
-
- labels and linked PRs
|
|
36
|
-
- reproduction steps
|
|
37
|
-
- affected versions or environment
|
|
38
|
-
- related files, logs, screenshots, or references
|
|
39
|
-
|
|
40
|
-
### 2. Triage
|
|
41
|
-
|
|
42
|
-
Classify the issue:
|
|
43
|
-
|
|
44
|
-
- bug
|
|
45
|
-
- feature request
|
|
46
|
-
- documentation request
|
|
47
|
-
- question or support
|
|
48
|
-
- duplicate
|
|
49
|
-
- spam or noise
|
|
50
|
-
- needs more information
|
|
51
|
-
|
|
52
|
-
Assess:
|
|
53
|
-
|
|
54
|
-
- severity
|
|
55
|
-
- user impact
|
|
56
|
-
- reproducibility
|
|
57
|
-
- affected area
|
|
58
|
-
- confidence
|
|
59
|
-
|
|
60
|
-
Separate:
|
|
61
|
-
|
|
62
|
-
- what is already evidenced
|
|
63
|
-
- what is inferred
|
|
64
|
-
- what still needs proof
|
|
65
|
-
|
|
66
|
-
### 3. Create Issue Triage Report
|
|
67
|
-
|
|
68
|
-
- **MANDATORY:** Before generating the final report, inspect `.agent/resources/schemas/triage.template.md` for layout, required sections, and format.
|
|
69
|
-
- Before reporting completion, run:
|
|
70
|
-
|
|
71
|
-
Review `{report_path}` against `triage.template.md`, keep the required headings, and remove placeholder text before completion.
|
|
72
|
-
|
|
73
|
-
- Replace any placeholder or template text with concrete issue summary, classification, impact, routing decision, and next command.
|
|
74
|
-
- Save the final report to:
|
|
75
|
-
|
|
76
|
-
```text
|
|
77
|
-
devflow/issues/{date}-triage-{issue_number}.md
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
### 4. Route
|
|
81
|
-
|
|
82
|
-
Use:
|
|
83
|
-
|
|
84
|
-
- `Debug` for confirmed bugs needing root cause work
|
|
85
|
-
- `Research` or `Spec-Research` for external dependency uncertainty
|
|
86
|
-
- `PRD` for product-level feature requests that need problem framing
|
|
87
|
-
- `10-define` for actionable work that still needs scope decisions
|
|
88
|
-
- `20-spec` for work that is already stable enough to become a delivery contract
|
|
89
|
-
- `Help` when the issue is not actionable yet
|
|
90
|
-
|
|
91
|
-
## Output Triage Recommendation
|
|
92
|
-
|
|
93
|
-
Return:
|
|
94
|
-
|
|
95
|
-
- classification
|
|
96
|
-
- duplicate or spam assessment
|
|
97
|
-
- confidence level
|
|
98
|
-
- recommended route into DevFlow 2.0
|
|
99
|
-
- where the report was written
|
|
100
|
-
|
|
101
|
-
## Relationship To DevFlow 2.0
|
|
102
|
-
|
|
103
|
-
- Classification: Companion command
|
|
104
|
-
- Mainline status: Intake support command, not a numbered stage
|
|
105
|
-
- Typical entry points: issue intake before scope or implementation begins
|
|
106
|
-
- Typical handoff targets: `Debug`, `PRD`, `10-define`, `Research`, `Help`
|
|
107
|
-
|
|
108
|
-
## Sources
|
|
109
|
-
|
|
110
|
-
- `AGENTS.md`
|
|
111
|
-
- `.agent/resources/schemas/triage.template.md`
|
|
112
|
-
- Related commands: `Debug`, `PRD`, `10-define`, `Research`, `Help`
|
|
113
|
-
- Support skills: `triage`, `to-issues`, `domain-modeling`
|
|
114
|
-
|
|
115
|
-
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: lint-and-validate
|
|
3
|
-
description: "[Devflow] Automatic quality control, linting, and static analysis procedures. Use after every code modification to ensure syntax correctness and project standards. Triggers onKeywords: lint, format, check, validate, types, static analysis."
|
|
4
|
-
allowed-tools: Read, Glob, Grep, Bash
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
# Lint and Validate Skill
|
|
8
|
-
|
|
9
|
-
> **MANDATORY:** Run appropriate validation tools after EVERY code change. Do not finish a task until the code is error-free.
|
|
10
|
-
|
|
11
|
-
### Procedures by Ecosystem
|
|
12
|
-
|
|
13
|
-
#### Node.js / TypeScript
|
|
14
|
-
1. **Lint/Fix:** `npm run lint` or `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` (Fast & Modern)
|
|
20
|
-
2. **Security (Bandit):** `bandit -r "path" -ll`
|
|
21
|
-
3. **Types (MyPy):** `mypy "path"`
|
|
22
|
-
|
|
23
|
-
## The Quality Loop
|
|
24
|
-
1. **Write/Edit Code**
|
|
25
|
-
2. **Run Audit:** `npm run lint && npx tsc --noEmit`
|
|
26
|
-
3. **Analyze Report:** Check the "FINAL AUDIT REPORT" section.
|
|
27
|
-
4. **Fix & Repeat:** Submitting code with "FINAL AUDIT" failures is NOT allowed.
|
|
28
|
-
|
|
29
|
-
## Error Handling
|
|
30
|
-
- If `lint` fails: Fix the style or syntax issues immediately.
|
|
31
|
-
- If `tsc` fails: Correct type mismatches before proceeding.
|
|
32
|
-
- If no tool is configured: Check the project root for `.eslintrc`, `tsconfig.json`, `pyproject.toml` and suggest creating one.
|
|
33
|
-
|
|
34
|
-
---
|
|
35
|
-
**Strict Rule:** No code should be committed or reported as "done" without passing these checks.
|
|
36
|
-
|
|
37
|
-
---
|
|
38
|
-
|
|
39
|
-
## Scripts
|
|
40
|
-
|
|
41
|
-
| Script | Purpose | Command |
|
|
42
|
-
|--------|---------|---------|
|
|
43
|
-
| `scripts/lint_runner.py` | Unified lint check | `python scripts/lint_runner.py <project_path>` |
|
|
44
|
-
| `scripts/type_coverage.py` | Type coverage analysis | `python scripts/type_coverage.py <project_path>` |
|
|
45
|
-
|
|
@@ -1,184 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
"""
|
|
3
|
-
Lint Runner - Unified linting and type checking
|
|
4
|
-
Runs appropriate linters based on project type.
|
|
5
|
-
|
|
6
|
-
Usage:
|
|
7
|
-
python lint_runner.py <project_path>
|
|
8
|
-
|
|
9
|
-
Supports:
|
|
10
|
-
- Node.js: npm run lint, npx tsc --noEmit
|
|
11
|
-
- Python: ruff check, mypy
|
|
12
|
-
"""
|
|
13
|
-
|
|
14
|
-
import subprocess
|
|
15
|
-
import sys
|
|
16
|
-
import json
|
|
17
|
-
import platform
|
|
18
|
-
import shutil
|
|
19
|
-
from pathlib import Path
|
|
20
|
-
from datetime import datetime
|
|
21
|
-
|
|
22
|
-
# Fix Windows console encoding
|
|
23
|
-
try:
|
|
24
|
-
sys.stdout.reconfigure(encoding='utf-8', errors='replace')
|
|
25
|
-
except:
|
|
26
|
-
pass
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
def detect_project_type(project_path: Path) -> dict:
|
|
30
|
-
"""Detect project type and available linters."""
|
|
31
|
-
result = {
|
|
32
|
-
"type": "unknown",
|
|
33
|
-
"linters": []
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
# Node.js project
|
|
37
|
-
package_json = project_path / "package.json"
|
|
38
|
-
if package_json.exists():
|
|
39
|
-
result["type"] = "node"
|
|
40
|
-
try:
|
|
41
|
-
pkg = json.loads(package_json.read_text(encoding='utf-8'))
|
|
42
|
-
scripts = pkg.get("scripts", {})
|
|
43
|
-
deps = {**pkg.get("dependencies", {}), **pkg.get("devDependencies", {})}
|
|
44
|
-
|
|
45
|
-
# Check for lint script
|
|
46
|
-
if "lint" in scripts:
|
|
47
|
-
result["linters"].append({"name": "npm lint", "cmd": ["npm", "run", "lint"]})
|
|
48
|
-
elif "eslint" in deps:
|
|
49
|
-
result["linters"].append({"name": "eslint", "cmd": ["npx", "eslint", "."]})
|
|
50
|
-
|
|
51
|
-
# Check for TypeScript
|
|
52
|
-
if "typescript" in deps or (project_path / "tsconfig.json").exists():
|
|
53
|
-
result["linters"].append({"name": "tsc", "cmd": ["npx", "tsc", "--noEmit"]})
|
|
54
|
-
|
|
55
|
-
except:
|
|
56
|
-
pass
|
|
57
|
-
|
|
58
|
-
# Python project
|
|
59
|
-
if (project_path / "pyproject.toml").exists() or (project_path / "requirements.txt").exists():
|
|
60
|
-
result["type"] = "python"
|
|
61
|
-
|
|
62
|
-
# Check for ruff
|
|
63
|
-
result["linters"].append({"name": "ruff", "cmd": ["ruff", "check", "."]})
|
|
64
|
-
|
|
65
|
-
# Check for mypy
|
|
66
|
-
if (project_path / "mypy.ini").exists() or (project_path / "pyproject.toml").exists():
|
|
67
|
-
result["linters"].append({"name": "mypy", "cmd": ["mypy", "."]})
|
|
68
|
-
|
|
69
|
-
return result
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
def run_linter(linter: dict, cwd: Path) -> dict:
|
|
73
|
-
"""Run a single linter and return results."""
|
|
74
|
-
result = {
|
|
75
|
-
"name": linter["name"],
|
|
76
|
-
"passed": False,
|
|
77
|
-
"output": "",
|
|
78
|
-
"error": ""
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
try:
|
|
82
|
-
cmd = linter["cmd"]
|
|
83
|
-
|
|
84
|
-
# Windows compatibility for npm/npx
|
|
85
|
-
if platform.system() == "Windows":
|
|
86
|
-
if cmd[0] in ["npm", "npx"]:
|
|
87
|
-
# Force .cmd extension on Windows
|
|
88
|
-
if not cmd[0].lower().endswith(".cmd"):
|
|
89
|
-
cmd[0] = f"{cmd[0]}.cmd"
|
|
90
|
-
|
|
91
|
-
proc = subprocess.run(
|
|
92
|
-
cmd,
|
|
93
|
-
cwd=str(cwd),
|
|
94
|
-
capture_output=True,
|
|
95
|
-
text=True,
|
|
96
|
-
encoding='utf-8',
|
|
97
|
-
errors='replace',
|
|
98
|
-
timeout=120,
|
|
99
|
-
shell=platform.system() == "Windows" # Shell=True often helps with path resolution on Windows
|
|
100
|
-
)
|
|
101
|
-
|
|
102
|
-
result["output"] = proc.stdout[:2000] if proc.stdout else ""
|
|
103
|
-
result["error"] = proc.stderr[:500] if proc.stderr else ""
|
|
104
|
-
result["passed"] = proc.returncode == 0
|
|
105
|
-
|
|
106
|
-
except FileNotFoundError:
|
|
107
|
-
result["error"] = f"Command not found: {linter['cmd'][0]}"
|
|
108
|
-
except subprocess.TimeoutExpired:
|
|
109
|
-
result["error"] = "Timeout after 120s"
|
|
110
|
-
except Exception as e:
|
|
111
|
-
result["error"] = str(e)
|
|
112
|
-
|
|
113
|
-
return result
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
def main():
|
|
117
|
-
project_path = Path(sys.argv[1] if len(sys.argv) > 1 else ".").resolve()
|
|
118
|
-
|
|
119
|
-
print(f"\n{'='*60}")
|
|
120
|
-
print(f"[LINT RUNNER] Unified Linting")
|
|
121
|
-
print(f"{'='*60}")
|
|
122
|
-
print(f"Project: {project_path}")
|
|
123
|
-
print(f"Time: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
|
|
124
|
-
|
|
125
|
-
# Detect project type
|
|
126
|
-
project_info = detect_project_type(project_path)
|
|
127
|
-
print(f"Type: {project_info['type']}")
|
|
128
|
-
print(f"Linters: {len(project_info['linters'])}")
|
|
129
|
-
print("-"*60)
|
|
130
|
-
|
|
131
|
-
if not project_info["linters"]:
|
|
132
|
-
print("No linters found for this project type.")
|
|
133
|
-
output = {
|
|
134
|
-
"script": "lint_runner",
|
|
135
|
-
"project": str(project_path),
|
|
136
|
-
"type": project_info["type"],
|
|
137
|
-
"checks": [],
|
|
138
|
-
"passed": True,
|
|
139
|
-
"message": "No linters configured"
|
|
140
|
-
}
|
|
141
|
-
print(json.dumps(output, indent=2))
|
|
142
|
-
sys.exit(0)
|
|
143
|
-
|
|
144
|
-
# Run each linter
|
|
145
|
-
results = []
|
|
146
|
-
all_passed = True
|
|
147
|
-
|
|
148
|
-
for linter in project_info["linters"]:
|
|
149
|
-
print(f"\nRunning: {linter['name']}...")
|
|
150
|
-
result = run_linter(linter, project_path)
|
|
151
|
-
results.append(result)
|
|
152
|
-
|
|
153
|
-
if result["passed"]:
|
|
154
|
-
print(f" [PASS] {linter['name']}")
|
|
155
|
-
else:
|
|
156
|
-
print(f" [FAIL] {linter['name']}")
|
|
157
|
-
if result["error"]:
|
|
158
|
-
print(f" Error: {result['error'][:200]}")
|
|
159
|
-
all_passed = False
|
|
160
|
-
|
|
161
|
-
# Summary
|
|
162
|
-
print("\n" + "="*60)
|
|
163
|
-
print("SUMMARY")
|
|
164
|
-
print("="*60)
|
|
165
|
-
|
|
166
|
-
for r in results:
|
|
167
|
-
icon = "[PASS]" if r["passed"] else "[FAIL]"
|
|
168
|
-
print(f"{icon} {r['name']}")
|
|
169
|
-
|
|
170
|
-
output = {
|
|
171
|
-
"script": "lint_runner",
|
|
172
|
-
"project": str(project_path),
|
|
173
|
-
"type": project_info["type"],
|
|
174
|
-
"checks": results,
|
|
175
|
-
"passed": all_passed
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
print("\n" + json.dumps(output, indent=2))
|
|
179
|
-
|
|
180
|
-
sys.exit(0 if all_passed else 1)
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
if __name__ == "__main__":
|
|
184
|
-
main()
|