{ "name": "Lint and Automation Rules", "description": "코드 스타일 및 품질 규칙 자동화를 위한 설정 가이드", "rules": { "lintersConfiguration": { "typescript": { "eslint": { "extends": [ "eslint:recommended", "plugin:@typescript-eslint/recommended", "plugin:react/recommended", "plugin:react-hooks/recommended" ], "plugins": [ "@typescript-eslint", "react", "react-hooks", "prettier", "import", "jsx-a11y" ], "rules": { "quotes": ["error", "single"], "semi": ["error", "always"], "indent": ["error", 2], "no-console": "warn", "no-unused-vars": "warn", "prefer-const": "error", "react/prop-types": "off", "react/react-in-jsx-scope": "off", "@typescript-eslint/explicit-module-boundary-types": "off", "@typescript-eslint/no-explicit-any": "warn", "jsx-a11y/alt-text": "error", "import/order": [ "error", { "groups": ["builtin", "external", "internal", "parent", "sibling", "index"], "newlines-between": "always" } ] } }, "prettier": { "printWidth": 100, "tabWidth": 2, "useTabs": false, "semi": true, "singleQuote": true, "trailingComma": "es5", "bracketSpacing": true, "arrowParens": "always" } }, "javascript": { "eslint": { "extends": [ "eslint:recommended", "plugin:react/recommended", "plugin:react-hooks/recommended" ], "plugins": [ "react", "react-hooks", "prettier", "import", "jsx-a11y" ], "rules": { "quotes": ["error", "single"], "semi": ["error", "always"], "indent": ["error", 2], "no-console": "warn", "no-unused-vars": "warn", "prefer-const": "error" } } }, "python": { "flake8": { "max-line-length": 88, "extend-ignore": "E203", "exclude": ["venv", ".venv", "env", ".env", ".git", "__pycache__"], "per-file-ignores": { "__init__.py": "F401", "test_*.py": "E501" } }, "black": { "line-length": 88, "target-version": ["py38", "py39", "py310"], "include": "\\.py$", "exclude": "/(venv|\\.git)/", "preview": true }, "isort": { "profile": "black", "line_length": 88, "multi_line_output": 3, "include_trailing_comma": true, "force_grid_wrap": 0, "use_parentheses": true }, "mypy": { "python_version": "3.9", "disallow_untyped_defs": true, "disallow_incomplete_defs": true, "check_untyped_defs": true, "disallow_untyped_decorators": true, "ignore_missing_imports": false } }, "css": { "stylelint": { "extends": ["stylelint-config-standard"], "plugins": ["stylelint-order"], "rules": { "order/properties-alphabetical-order": true, "color-hex-case": "lower", "color-hex-length": "short", "at-rule-no-unknown": null } } } }, "gitHooks": { "preCommit": { "enabled": true, "commands": [ "lint-staged", "npm run test:affected" ], "configuration": { "lintStaged": { "*.{js,jsx,ts,tsx}": [ "eslint --fix", "prettier --write" ], "*.{css,scss}": [ "stylelint --fix", "prettier --write" ], "*.py": [ "black", "isort", "flake8" ], "*.{json,md}": "prettier --write" } } }, "prePush": { "enabled": true, "commands": [ "npm run test:all", "npm run build" ] }, "commitMsg": { "enabled": true, "tool": "commitlint", "configuration": { "extends": ["@commitlint/config-conventional"], "rules": { "header-max-length": [2, "always", 72], "type-enum": [ 2, "always", ["feat", "fix", "docs", "style", "refactor", "test", "chore", "ci", "build", "perf"] ] } } } }, "editorIntegration": { "vscode": { "extensions": [ "dbaeumer.vscode-eslint", "esbenp.prettier-vscode", "ms-python.python", "ms-python.vscode-pylance", "ms-python.black-formatter", "stylelint.vscode-stylelint", "streetsidesoftware.code-spell-checker" ], "settings": { "editor.formatOnSave": true, "editor.codeActionsOnSave": { "source.fixAll.eslint": true, "source.fixAll.stylelint": true }, "editor.defaultFormatter": "esbenp.prettier-vscode", "[javascript]": { "editor.defaultFormatter": "esbenp.prettier-vscode" }, "[typescript]": { "editor.defaultFormatter": "esbenp.prettier-vscode" }, "[python]": { "editor.defaultFormatter": "ms-python.black-formatter" } } }, "cursorExtensionSettings": { "easyAutoFix": true, "lintOnSave": true, "inlineErrors": true, "autoImport": true, "codeSuggestions": true } }, "ciIntegration": { "githubActions": { "workflows": { "lint": { "name": "Lint", "triggers": ["push", "pull_request"], "jobs": [ "eslint", "prettier", "stylelint", "python-lint" ] }, "test": { "name": "Test", "triggers": ["push", "pull_request"], "jobs": [ "unit-tests", "integration-tests" ] }, "quality": { "name": "Code Quality", "triggers": ["pull_request"], "jobs": [ "sonarqube", "code-climate" ] } } }, "jenkinsIntegration": { "pipeline": { "stages": [ "Lint", "Test", "Code Quality" ], "parallel": true } } }, "automationTools": { "dependencyManagement": { "renovate": { "extends": [ "config:base", ":preserveSemverRanges", "group:allNonMajor" ], "schedule": ["every weekend"], "packageRules": [ { "matchUpdateTypes": ["minor", "patch"], "matchCurrentVersion": "!/^0/", "automerge": true } ] }, "dependabot": { "version": 2, "updates": [ { "package-ecosystem": "npm", "directory": "/", "schedule": { "interval": "weekly" }, "assignees": ["team-frontend"], "reviewers": ["lead-dev"] }, { "package-ecosystem": "pip", "directory": "/", "schedule": { "interval": "weekly" }, "assignees": ["team-backend"], "reviewers": ["lead-dev"] } ] } }, "issueManagement": { "staleBot": { "daysUntilStale": 60, "daysUntilClose": 7, "exemptLabels": ["pinned", "security", "enhancement"] } } } } }