{ "generated_at": "2026-05-11T13:38:33.090534", "project_root": "/home/claude/vkr/B", "summary": { "total_files": 22, "total_nloc": 1137, "total_functions": 68, "avg_system_ccn": 3.78, "system_risk_level": "HIGH", "recommended_system_strategy": "REENGINEER", "dependency_cycles_count": 1 }, "dependency_cycles": [ [ "src", "src/database", "src/error-handlers", "src/middlewares", "src/routes" ] ], "decisions": [ { "module": "src/routes", "risk_level": "CRITICAL", "strategy": "REPLACE", "recommended_pattern": "Strangler Fig + Anti-Corruption Layer: замена с изоляцией от цикла", "priority": 190, "reasons": [ "Критическая CCN: max=21 (порог 20)", "Высокая нестабильность: I=0.75 (порог 0.7)", "Участвует в циклических зависимостях — признак архитектурной деградации" ] }, { "module": "src", "risk_level": "HIGH", "strategy": "REENGINEER", "recommended_pattern": "Anti-Corruption Layer: изоляция модуля от циклических зависимостей", "priority": 460, "reasons": [ "Участвует в циклических зависимостях — признак архитектурной деградации" ] }, { "module": "src/middlewares", "risk_level": "HIGH", "strategy": "REENGINEER", "recommended_pattern": "Anti-Corruption Layer: изоляция модуля от циклических зависимостей", "priority": 470, "reasons": [ "Участвует в циклических зависимостях — признак архитектурной деградации" ] }, { "module": "src/database", "risk_level": "HIGH", "strategy": "REENGINEER", "recommended_pattern": "Anti-Corruption Layer: изоляция модуля от циклических зависимостей", "priority": 480, "reasons": [ "Участвует в циклических зависимостях — признак архитектурной деградации" ] }, { "module": "src/error-handlers", "risk_level": "HIGH", "strategy": "REENGINEER", "recommended_pattern": "Anti-Corruption Layer: изоляция модуля от циклических зависимостей", "priority": 490, "reasons": [ "Участвует в циклических зависимостях — признак архитектурной деградации" ] } ], "modules": { "src": { "files": [ "/home/claude/vkr/B/src/config.mjs", "/home/claude/vkr/B/src/index.mjs", "/home/claude/vkr/B/src/utils.mjs" ], "language": "mixed", "total_nloc": 166, "total_functions": 22, "avg_ccn": 1.77, "max_ccn": 8, "heavy_functions_count": 0, "heavy_functions_ratio": 0.0, "coupling_out": 4, "coupling_in": 4, "instability": 0.5, "has_cycles": true, "dependencies": [ "src/database", "src/error-handlers", "src/middlewares", "src/routes" ], "dependents": [ "src/database", "src/error-handlers", "src/middlewares", "src/routes" ], "functions": [ { "name": "isPng", "file": "/home/claude/vkr/B/src/utils.mjs", "line": 10, "ccn": 8, "nloc": 11, "params": 1 }, { "name": "warmupExtract", "file": "/home/claude/vkr/B/src/index.mjs", "line": 101, "ccn": 3, "nloc": 12, "params": 4 }, { "name": "isJpeg", "file": "/home/claude/vkr/B/src/utils.mjs", "line": 3, "ccn": 3, "nloc": 6, "params": 1 }, { "name": "createDbConnection", "file": "/home/claude/vkr/B/src/index.mjs", "line": 29, "ccn": 2, "nloc": 24, "params": 0 }, { "name": "generateApiPrefix", "file": "/home/claude/vkr/B/src/index.mjs", "line": 54, "ccn": 2, "nloc": 5, "params": 2 }, { "name": "(anonymous)", "file": "/home/claude/vkr/B/src/index.mjs", "line": 123, "ccn": 2, "nloc": 11, "params": 0 }, { "name": "main", "file": "/home/claude/vkr/B/src/index.mjs", "line": 139, "ccn": 2, "nloc": 19, "params": 0 }, { "name": "toFixedOne", "file": "/home/claude/vkr/B/src/utils.mjs", "line": 31, "ccn": 2, "nloc": 7, "params": 2 }, { "name": "float32ArrayFromBuffer", "file": "/home/claude/vkr/B/src/utils.mjs", "line": 43, "ccn": 2, "nloc": 9, "params": 1 }, { "name": "(anonymous)", "file": "/home/claude/vkr/B/src/index.mjs", "line": 26, "ccn": 1, "nloc": 1, "params": 0 }, { "name": "sleep", "file": "/home/claude/vkr/B/src/index.mjs", "line": 24, "ccn": 1, "nloc": 4, "params": 1 }, { "name": "(anonymous)", "file": "/home/claude/vkr/B/src/index.mjs", "line": 64, "ccn": 1, "nloc": 3, "params": 0 }, { "name": "addModuleMiddlewares", "file": "/home/claude/vkr/B/src/index.mjs", "line": 60, "ccn": 1, "nloc": 7, "params": 2 }, { "name": "(anonymous)", "file": "/home/claude/vkr/B/src/index.mjs", "line": 74, "ccn": 1, "nloc": 3, "params": 0 }, { "name": "addModuleRoutes", "file": "/home/claude/vkr/B/src/index.mjs", "line": 70, "ccn": 1, "nloc": 7, "params": 3 }, { "name": "(anonymous)", "file": "/home/claude/vkr/B/src/index.mjs", "line": 85, "ccn": 1, "nloc": 3, "params": 0 }, { "name": "addUknownRoute", "file": "/home/claude/vkr/B/src/index.mjs", "line": 80, "ccn": 1, "nloc": 8, "params": 1 }, { "name": "(anonymous)", "file": "/home/claude/vkr/B/src/index.mjs", "line": 95, "ccn": 1, "nloc": 3, "params": 0 }, { "name": "addErrHandler", "file": "/home/claude/vkr/B/src/index.mjs", "line": 91, "ccn": 1, "nloc": 7, "params": 1 }, { "name": "runExpressServer", "file": "/home/claude/vkr/B/src/index.mjs", "line": 116, "ccn": 1, "nloc": 11, "params": 1 }, { "name": "float32ArrayToBuffer", "file": "/home/claude/vkr/B/src/utils.mjs", "line": 56, "ccn": 1, "nloc": 4, "params": 1 }, { "name": "clamp", "file": "/home/claude/vkr/B/src/utils.mjs", "line": 61, "ccn": 1, "nloc": 1, "params": 3 } ] }, "src/database": { "files": [ "/home/claude/vkr/B/src/database/dbQueries.mjs", "/home/claude/vkr/B/src/database/dbRepository.mjs" ], "language": "mixed", "total_nloc": 32, "total_functions": 4, "avg_ccn": 1.0, "max_ccn": 1, "heavy_functions_count": 0, "heavy_functions_ratio": 0.0, "coupling_out": 1, "coupling_in": 2, "instability": 0.333, "has_cycles": true, "dependencies": [ "src" ], "dependents": [ "src", "src/routes" ], "functions": [ { "name": "addVector", "file": "/home/claude/vkr/B/src/database/dbRepository.mjs", "line": 11, "ccn": 1, "nloc": 9, "params": 3 }, { "name": "updateVector", "file": "/home/claude/vkr/B/src/database/dbRepository.mjs", "line": 21, "ccn": 1, "nloc": 9, "params": 3 }, { "name": "deleteVector", "file": "/home/claude/vkr/B/src/database/dbRepository.mjs", "line": 31, "ccn": 1, "nloc": 4, "params": 1 }, { "name": "getNearestVector", "file": "/home/claude/vkr/B/src/database/dbRepository.mjs", "line": 36, "ccn": 1, "nloc": 10, "params": 4 } ] }, "src/error-handlers": { "files": [ "/home/claude/vkr/B/src/error-handlers/errorHandler.mjs" ], "language": "mixed", "total_nloc": 37, "total_functions": 3, "avg_ccn": 2.0, "max_ccn": 3, "heavy_functions_count": 0, "heavy_functions_ratio": 0.0, "coupling_out": 2, "coupling_in": 1, "instability": 0.667, "has_cycles": true, "dependencies": [ "src", "src/middlewares" ], "dependents": [ "src" ], "functions": [ { "name": "generateResponse", "file": "/home/claude/vkr/B/src/error-handlers/errorHandler.mjs", "line": 90, "ccn": 3, "nloc": 16, "params": 2 }, { "name": "handleErrorCase", "file": "/home/claude/vkr/B/src/error-handlers/errorHandler.mjs", "line": 107, "ccn": 2, "nloc": 10, "params": 3 }, { "name": "logError", "file": "/home/claude/vkr/B/src/error-handlers/errorHandler.mjs", "line": 78, "ccn": 1, "nloc": 11, "params": 3 } ] }, "src/middlewares": { "files": [ "/home/claude/vkr/B/src/middlewares/addLogInfo.mjs", "/home/claude/vkr/B/src/middlewares/builder.mjs", "/home/claude/vkr/B/src/middlewares/index.mjs", "/home/claude/vkr/B/src/middlewares/logger.mjs", "/home/claude/vkr/B/src/middlewares/parser.mjs" ], "language": "mixed", "total_nloc": 267, "total_functions": 15, "avg_ccn": 3.53, "max_ccn": 8, "heavy_functions_count": 0, "heavy_functions_ratio": 0.0, "coupling_out": 1, "coupling_in": 3, "instability": 0.25, "has_cycles": true, "dependencies": [ "src" ], "dependents": [ "src", "src/error-handlers", "src/routes" ], "functions": [ { "name": "findBoundary", "file": "/home/claude/vkr/B/src/middlewares/parser.mjs", "line": 78, "ccn": 8, "nloc": 27, "params": 3 }, { "name": "parsePart", "file": "/home/claude/vkr/B/src/middlewares/parser.mjs", "line": 106, "ccn": 7, "nloc": 34, "params": 1 }, { "name": "parse", "file": "/home/claude/vkr/B/src/middlewares/parser.mjs", "line": 14, "ccn": 6, "nloc": 38, "params": 3 }, { "name": "getNextPart", "file": "/home/claude/vkr/B/src/middlewares/parser.mjs", "line": 159, "ccn": 6, "nloc": 39, "params": 3 }, { "name": "parseMultipart", "file": "/home/claude/vkr/B/src/middlewares/parser.mjs", "line": 205, "ccn": 6, "nloc": 35, "params": 2 }, { "name": "getBoundary", "file": "/home/claude/vkr/B/src/middlewares/parser.mjs", "line": 146, "ccn": 4, "nloc": 12, "params": 1 }, { "name": "(anonymous)", "file": "/home/claude/vkr/B/src/middlewares/parser.mjs", "line": 42, "ccn": 3, "nloc": 6, "params": 0 }, { "name": "boundaryValid", "file": "/home/claude/vkr/B/src/middlewares/parser.mjs", "line": 68, "ccn": 3, "nloc": 9, "params": 3 }, { "name": "(anonymous)", "file": "/home/claude/vkr/B/src/middlewares/builder.mjs", "line": 18, "ccn": 2, "nloc": 12, "params": 0 }, { "name": "(anonymous)", "file": "/home/claude/vkr/B/src/middlewares/builder.mjs", "line": 40, "ccn": 2, "nloc": 15, "params": 0 }, { "name": "(anonymous)", "file": "/home/claude/vkr/B/src/middlewares/parser.mjs", "line": 32, "ccn": 2, "nloc": 6, "params": 0 }, { "name": "addLogInfo", "file": "/home/claude/vkr/B/src/middlewares/addLogInfo.mjs", "line": 3, "ccn": 1, "nloc": 6, "params": 3 }, { "name": "buildMultipart", "file": "/home/claude/vkr/B/src/middlewares/builder.mjs", "line": 12, "ccn": 1, "nloc": 15, "params": 2 }, { "name": "customSuccessMessage", "file": "/home/claude/vkr/B/src/middlewares/logger.mjs", "line": 26, "ccn": 1, "nloc": 9, "params": 3 }, { "name": "(anonymous)", "file": "/home/claude/vkr/B/src/middlewares/parser.mjs", "line": 51, "ccn": 1, "nloc": 4, "params": 0 } ] }, "src/routes": { "files": [ "/home/claude/vkr/B/src/routes/add.mjs", "/home/claude/vkr/B/src/routes/compare.mjs", "/home/claude/vkr/B/src/routes/delete.mjs", "/home/claude/vkr/B/src/routes/extract.mjs", "/home/claude/vkr/B/src/routes/health.mjs", "/home/claude/vkr/B/src/routes/identify.mjs", "/home/claude/vkr/B/src/routes/index.mjs", "/home/claude/vkr/B/src/routes/match.mjs", "/home/claude/vkr/B/src/routes/memory.mjs", "/home/claude/vkr/B/src/routes/update.mjs", "/home/claude/vkr/B/src/routes/verify.mjs" ], "language": "mixed", "total_nloc": 635, "total_functions": 24, "avg_ccn": 6.46, "max_ccn": 21, "heavy_functions_count": 5, "heavy_functions_ratio": 0.208, "coupling_out": 3, "coupling_in": 1, "instability": 0.75, "has_cycles": true, "dependencies": [ "src", "src/database", "src/middlewares" ], "dependents": [ "src" ], "functions": [ { "name": "(anonymous)", "file": "/home/claude/vkr/B/src/routes/identify.mjs", "line": 19, "ccn": 21, "nloc": 79, "params": 0 }, { "name": "(anonymous)", "file": "/home/claude/vkr/B/src/routes/add.mjs", "line": 13, "ccn": 16, "nloc": 65, "params": 0 }, { "name": "(anonymous)", "file": "/home/claude/vkr/B/src/routes/match.mjs", "line": 13, "ccn": 16, "nloc": 71, "params": 0 }, { "name": "(anonymous)", "file": "/home/claude/vkr/B/src/routes/update.mjs", "line": 11, "ccn": 16, "nloc": 61, "params": 0 }, { "name": "(anonymous)", "file": "/home/claude/vkr/B/src/routes/verify.mjs", "line": 19, "ccn": 15, "nloc": 62, "params": 0 }, { "name": "(anonymous)", "file": "/home/claude/vkr/B/src/routes/compare.mjs", "line": 9, "ccn": 9, "nloc": 46, "params": 0 }, { "name": "(anonymous)", "file": "/home/claude/vkr/B/src/routes/extract.mjs", "line": 8, "ccn": 9, "nloc": 27, "params": 0 }, { "name": "(anonymous)", "file": "/home/claude/vkr/B/src/routes/health.mjs", "line": 19, "ccn": 7, "nloc": 47, "params": 0 }, { "name": "(anonymous)", "file": "/home/claude/vkr/B/src/routes/delete.mjs", "line": 8, "ccn": 5, "nloc": 21, "params": 0 }, { "name": "verifyParams", "file": "/home/claude/vkr/B/src/routes/identify.mjs", "line": 121, "ccn": 5, "nloc": 11, "params": 1 }, { "name": "verifyParams", "file": "/home/claude/vkr/B/src/routes/match.mjs", "line": 125, "ccn": 5, "nloc": 11, "params": 1 }, { "name": "getId", "file": "/home/claude/vkr/B/src/routes/add.mjs", "line": 95, "ccn": 4, "nloc": 10, "params": 1 }, { "name": "getId", "file": "/home/claude/vkr/B/src/routes/delete.mjs", "line": 44, "ccn": 4, "nloc": 10, "params": 1 }, { "name": "getId", "file": "/home/claude/vkr/B/src/routes/update.mjs", "line": 108, "ccn": 4, "nloc": 10, "params": 1 }, { "name": "(anonymous)", "file": "/home/claude/vkr/B/src/routes/memory.mjs", "line": 6, "ccn": 3, "nloc": 16, "params": 0 }, { "name": "parseTemplate", "file": "/home/claude/vkr/B/src/routes/add.mjs", "line": 83, "ccn": 2, "nloc": 11, "params": 1 }, { "name": "parseTemplate", "file": "/home/claude/vkr/B/src/routes/delete.mjs", "line": 32, "ccn": 2, "nloc": 11, "params": 1 }, { "name": "parseMeta", "file": "/home/claude/vkr/B/src/routes/identify.mjs", "line": 109, "ccn": 2, "nloc": 11, "params": 1 }, { "name": "parseMeta", "file": "/home/claude/vkr/B/src/routes/match.mjs", "line": 100, "ccn": 2, "nloc": 11, "params": 1 }, { "name": "parseVectors", "file": "/home/claude/vkr/B/src/routes/match.mjs", "line": 112, "ccn": 2, "nloc": 11, "params": 1 }, { "name": "parseTemplate", "file": "/home/claude/vkr/B/src/routes/update.mjs", "line": 84, "ccn": 2, "nloc": 11, "params": 1 }, { "name": "parseVectors", "file": "/home/claude/vkr/B/src/routes/update.mjs", "line": 96, "ccn": 2, "nloc": 11, "params": 1 }, { "name": "(anonymous)", "file": "/home/claude/vkr/B/src/routes/identify.mjs", "line": 87, "ccn": 1, "nloc": 6, "params": 0 }, { "name": "(anonymous)", "file": "/home/claude/vkr/B/src/routes/match.mjs", "line": 85, "ccn": 1, "nloc": 5, "params": 0 } ] } } }