# Issue Template 问题记录模板。 ## Single Issue Template ```markdown #### {{severity_emoji}} [{{id}}] {{category}} - **严重程度**: {{severity}} - **维度**: {{dimension}} - **文件**: `{{file}}`{{#if line}}:{{line}}{{/if}} - **描述**: {{description}} {{#if code_snippet}} **问题代码**: ```{{language}} {{code_snippet}} ``` {{/if}} **建议**: {{recommendation}} {{#if fix_example}} **修复示例**: ```{{language}} {{fix_example}} ``` {{/if}} {{#if references}} **参考资料**: {{#each references}} - {{this}} {{/each}} {{/if}} ``` ## Issue Object Schema ```typescript interface Issue { id: string; // e.g., "SEC-001" severity: 'critical' | 'high' | 'medium' | 'low' | 'info'; dimension: string; // e.g., "security" category: string; // e.g., "xss-risk" file: string; // e.g., "src/utils/render.ts" line?: number; // e.g., 42 column?: number; // e.g., 15 code_snippet?: string; description: string; recommendation: string; fix_example?: string; references?: string[]; } ``` ## ID Generation ```javascript function generateIssueId(dimension, counter) { const prefixes = { correctness: 'CORR', readability: 'READ', performance: 'PERF', security: 'SEC', testing: 'TEST', architecture: 'ARCH' }; const prefix = prefixes[dimension] || 'MISC'; const number = String(counter).padStart(3, '0'); return `${prefix}-${number}`; } ``` ## Severity Emojis ```javascript const SEVERITY_EMOJI = { critical: '🔴', high: '🟠', medium: '🟡', low: '🔵', info: '⚪' }; ``` ## Issue Categories by Dimension ### Correctness - `null-check` - 缺少空值检查 - `boundary` - 边界条件未处理 - `error-handling` - 错误处理不当 - `type-safety` - 类型安全问题 - `logic-error` - 逻辑错误 - `resource-leak` - 资源泄漏 ### Security - `injection` - 注入风险 - `xss` - 跨站脚本 - `hardcoded-secret` - 硬编码密钥 - `auth` - 认证授权 - `sensitive-data` - 敏感数据 ### Performance - `complexity` - 复杂度问题 - `n+1-query` - N+1 查询 - `memory-leak` - 内存泄漏 - `blocking-io` - 阻塞 I/O - `inefficient-algorithm` - 低效算法 ### Readability - `naming` - 命名问题 - `function-length` - 函数过长 - `nesting-depth` - 嵌套过深 - `comments` - 注释问题 - `duplication` - 代码重复 ### Testing - `coverage` - 覆盖不足 - `boundary-test` - 缺少边界测试 - `test-isolation` - 测试不独立 - `flaky-test` - 不稳定测试 ### Architecture - `layer-violation` - 层次违规 - `circular-dependency` - 循环依赖 - `coupling` - 耦合过紧 - `srp-violation` - 单一职责违规 ## Example Issues ### Critical Security Issue ```json { "id": "SEC-001", "severity": "critical", "dimension": "security", "category": "xss", "file": "src/components/Comment.tsx", "line": 25, "code_snippet": "element.innerHTML = userComment;", "description": "直接使用 innerHTML 插入用户输入,存在 XSS 攻击风险", "recommendation": "使用 textContent 或对用户输入进行 HTML 转义", "fix_example": "element.textContent = userComment;\n// 或\nelement.innerHTML = DOMPurify.sanitize(userComment);", "references": [ "https://owasp.org/www-community/xss-filter-evasion-cheatsheet" ] } ``` ### High Correctness Issue ```json { "id": "CORR-003", "severity": "high", "dimension": "correctness", "category": "error-handling", "file": "src/services/api.ts", "line": 42, "code_snippet": "try {\n await fetchData();\n} catch (e) {}", "description": "空的 catch 块会静默吞掉错误,导致问题难以发现和调试", "recommendation": "记录错误日志或重新抛出异常", "fix_example": "try {\n await fetchData();\n} catch (e) {\n console.error('Failed to fetch data:', e);\n throw e;\n}" } ``` ### Medium Readability Issue ```json { "id": "READ-007", "severity": "medium", "dimension": "readability", "category": "function-length", "file": "src/utils/processor.ts", "line": 15, "description": "函数 processData 有 150 行,超过推荐的 50 行限制,难以理解和维护", "recommendation": "将函数拆分为多个小函数,每个函数负责单一职责", "fix_example": "// 拆分为:\nfunction validateInput(data) { ... }\nfunction transformData(data) { ... }\nfunction saveData(data) { ... }" } ```