{"version": "2.1.0", "$schema": "https://json.schemastore.org/sarif-2.1.0.json", "runs": [{"tool": {"driver": {"name": "Repobility", "informationUri": "https://repobility.com", "rules": [{"id": "DKR014", "name": "Dockerfile copies broad context with incomplete .dockerignore", "shortDescription": {"text": "Dockerfile copies broad context with incomplete .dockerignore"}, "fullDescription": {"text": "COPY . or ADD . is safer when .dockerignore excludes secrets, git history, keys, and generated artifacts."}, "properties": {"scanner": "repobility-docker", "category": "docker", "severity": "medium", "confidence": 0.76, "cwe": "", "owasp": ""}}, {"id": "AIC003", "name": "Duplicated implementation block across source files", "shortDescription": {"text": "Duplicated implementation block across source files"}, "fullDescription": {"text": "Duplicated blocks are a common artifact when generated code is pasted or recreated instead of reused. They increase maintenance cost because every future bug fix must be found in multiple locations."}, "properties": {"scanner": "repobility-ai-code-hygiene", "category": "quality", "severity": "medium", "confidence": 0.86, "cwe": "", "owasp": ""}}, {"id": "CORE_NO_CI", "name": "No CI/CD configuration found", "shortDescription": {"text": "No CI/CD configuration found"}, "fullDescription": {"text": "Add a CI/CD pipeline: create .github/workflows/ci.yml for GitHub Actions with steps to lint, test, and build on every push and pull request."}, "properties": {"scanner": "repobility-core", "category": "practices", "severity": "medium", "confidence": null, "cwe": "", "owasp": ""}}, {"id": "DKR008", "name": ".dockerignore misses sensitive defaults", "shortDescription": {"text": ".dockerignore misses sensitive defaults"}, "fullDescription": {"text": ".dockerignore exists but does not cover common secret or VCS patterns."}, "properties": {"scanner": "repobility-docker", "category": "docker", "severity": "low", "confidence": 0.72, "cwe": "", "owasp": ""}}]}}, "automationDetails": {"id": "repobility/399"}, "properties": {"repository": "cyanheads/obsidian-mcp-server", "repoUrl": "https://github.com/cyanheads/obsidian-mcp-server.git", "branch": "main"}, "results": [{"ruleId": "DKR014", "level": "warning", "message": {"text": "Dockerfile copies broad context with incomplete .dockerignore"}, "properties": {"repobilityId": 13069, "scanner": "repobility-docker", "fingerprint": "7f98b5b190749309e6df171ab1b374475786f00d8ef25b00b73fe137ffd0aa49", "category": "docker", "severity": "medium", "confidence": 0.76, "triageState": "open", "verdict": "likely", "isResolved": false, "reason": "Broad context copy found and .dockerignore misses sensitive defaults.", "evidence": {"rule_id": "DKR014", "scanner": "repobility-docker", "references": ["https://docs.docker.com/develop/develop-images/dockerfile_best-practices/"], "correlation_key": "fp|7f98b5b190749309e6df171ab1b374475786f00d8ef25b00b73fe137ffd0aa49", "missing_patterns": ["id_rsa", "*.pem", "*.key"]}}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Dockerfile"}, "region": {"startLine": 18}}}]}, {"ruleId": "AIC003", "level": "warning", "message": {"text": "Duplicated implementation block across source files"}, "properties": {"repobilityId": 13068, "scanner": "repobility-ai-code-hygiene", "fingerprint": "cb7c7d874624ab46425797c3ad6324b183abf708735398ca3f57f20f8cd96f15", "category": "quality", "severity": "medium", "confidence": 0.86, "triageState": "open", "verdict": "confirmed", "isResolved": false, "reason": "A normalized source-code window appears in two different non-test files.", "evidence": {"lines": 12, "rule_id": "AIC003", "scanner": "repobility-ai-code-hygiene", "references": ["https://jscpd.dev/"], "duplicate_file": "src/mcp-server/tools/definitions/obsidian-append-to-note.tool.ts", "duplicate_line": 59, "correlation_key": "fp|cb7c7d874624ab46425797c3ad6324b183abf708735398ca3f57f20f8cd96f15"}}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/mcp-server/tools/definitions/obsidian-replace-in-note.tool.ts"}, "region": {"startLine": 83}}}]}, {"ruleId": "AIC003", "level": "warning", "message": {"text": "Duplicated implementation block across source files"}, "properties": {"repobilityId": 13067, "scanner": "repobility-ai-code-hygiene", "fingerprint": "cb492fbe4384dfaba3a83d1dced2912e86de51f203f7dbddd6daad089f8c6122", "category": "quality", "severity": "medium", "confidence": 0.86, "triageState": "open", "verdict": "confirmed", "isResolved": false, "reason": "A normalized source-code window appears in two different non-test files.", "evidence": {"lines": 12, "rule_id": "AIC003", "scanner": "repobility-ai-code-hygiene", "references": ["https://jscpd.dev/"], "duplicate_file": "src/mcp-server/tools/definitions/obsidian-delete-note.tool.ts", "duplicate_line": 38, "correlation_key": "fp|cb492fbe4384dfaba3a83d1dced2912e86de51f203f7dbddd6daad089f8c6122"}}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/mcp-server/tools/definitions/obsidian-replace-in-note.tool.ts"}, "region": {"startLine": 76}}}]}, {"ruleId": "AIC003", "level": "warning", "message": {"text": "Duplicated implementation block across source files"}, "properties": {"repobilityId": 13066, "scanner": "repobility-ai-code-hygiene", "fingerprint": "958b44dd6cc2b2fb8990ce834d8ea613cc8c6a77212701af3a2b9193d46a635a", "category": "quality", "severity": "medium", "confidence": 0.86, "triageState": "open", "verdict": "confirmed", "isResolved": false, "reason": "A normalized source-code window appears in two different non-test files.", "evidence": {"lines": 12, "rule_id": "AIC003", "scanner": "repobility-ai-code-hygiene", "references": ["https://jscpd.dev/"], "duplicate_file": "src/mcp-server/tools/definitions/obsidian-append-to-note.tool.ts", "duplicate_line": 59, "correlation_key": "fp|958b44dd6cc2b2fb8990ce834d8ea613cc8c6a77212701af3a2b9193d46a635a"}}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/mcp-server/tools/definitions/obsidian-patch-note.tool.ts"}, "region": {"startLine": 58}}}]}, {"ruleId": "AIC003", "level": "warning", "message": {"text": "Duplicated implementation block across source files"}, "properties": {"repobilityId": 13065, "scanner": "repobility-ai-code-hygiene", "fingerprint": "ebb7a657d38bec23d6c12e3fd49012864c5fedc7e7eb536740d2ebd05ed44bdf", "category": "quality", "severity": "medium", "confidence": 0.86, "triageState": "open", "verdict": "confirmed", "isResolved": false, "reason": "A normalized source-code window appears in two different non-test files.", "evidence": {"lines": 12, "rule_id": "AIC003", "scanner": "repobility-ai-code-hygiene", "references": ["https://jscpd.dev/"], "duplicate_file": "src/mcp-server/tools/definitions/obsidian-delete-note.tool.ts", "duplicate_line": 38, "correlation_key": "fp|ebb7a657d38bec23d6c12e3fd49012864c5fedc7e7eb536740d2ebd05ed44bdf"}}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/mcp-server/tools/definitions/obsidian-patch-note.tool.ts"}, "region": {"startLine": 51}}}]}, {"ruleId": "AIC003", "level": "warning", "message": {"text": "Duplicated implementation block across source files"}, "properties": {"repobilityId": 13064, "scanner": "repobility-ai-code-hygiene", "fingerprint": "513d10cb29077b164f53a4e9f8e8d480c8d72c51f651ac3fef29252d32c02a0f", "category": "quality", "severity": "medium", "confidence": 0.86, "triageState": "open", "verdict": "confirmed", "isResolved": false, "reason": "A normalized source-code window appears in two different non-test files.", "evidence": {"lines": 12, "rule_id": "AIC003", "scanner": "repobility-ai-code-hygiene", "references": ["https://jscpd.dev/"], "duplicate_file": "src/mcp-server/tools/definitions/obsidian-get-note.tool.ts", "duplicate_line": 141, "correlation_key": "fp|513d10cb29077b164f53a4e9f8e8d480c8d72c51f651ac3fef29252d32c02a0f"}}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/mcp-server/tools/definitions/obsidian-manage-tags.tool.ts"}, "region": {"startLine": 108}}}]}, {"ruleId": "AIC003", "level": "warning", "message": {"text": "Duplicated implementation block across source files"}, "properties": {"repobilityId": 13063, "scanner": "repobility-ai-code-hygiene", "fingerprint": "588730b3ef9463ff80aff84f77f2996730256291de01619860200f330026adc4", "category": "quality", "severity": "medium", "confidence": 0.86, "triageState": "open", "verdict": "confirmed", "isResolved": false, "reason": "A normalized source-code window appears in two different non-test files.", "evidence": {"lines": 12, "rule_id": "AIC003", "scanner": "repobility-ai-code-hygiene", "references": ["https://jscpd.dev/"], "duplicate_file": "src/mcp-server/tools/definitions/obsidian-append-to-note.tool.ts", "duplicate_line": 59, "correlation_key": "fp|588730b3ef9463ff80aff84f77f2996730256291de01619860200f330026adc4"}}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/mcp-server/tools/definitions/obsidian-manage-tags.tool.ts"}, "region": {"startLine": 98}}}]}, {"ruleId": "AIC003", "level": "warning", "message": {"text": "Duplicated implementation block across source files"}, "properties": {"repobilityId": 13062, "scanner": "repobility-ai-code-hygiene", "fingerprint": "f8ec97e72bcf6f36cd0e832a53a2653dd204d4f0aef1004560344f59e46b6b4d", "category": "quality", "severity": "medium", "confidence": 0.86, "triageState": "open", "verdict": "confirmed", "isResolved": false, "reason": "A normalized source-code window appears in two different non-test files.", "evidence": {"lines": 12, "rule_id": "AIC003", "scanner": "repobility-ai-code-hygiene", "references": ["https://jscpd.dev/"], "duplicate_file": "src/mcp-server/tools/definitions/obsidian-delete-note.tool.ts", "duplicate_line": 38, "correlation_key": "fp|f8ec97e72bcf6f36cd0e832a53a2653dd204d4f0aef1004560344f59e46b6b4d"}}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/mcp-server/tools/definitions/obsidian-manage-tags.tool.ts"}, "region": {"startLine": 91}}}]}, {"ruleId": "AIC003", "level": "warning", "message": {"text": "Duplicated implementation block across source files"}, "properties": {"repobilityId": 13061, "scanner": "repobility-ai-code-hygiene", "fingerprint": "819f9da538b6c61fcc0feda44564a7bf5bc8d2eb07bf114e4da06c28307c8370", "category": "quality", "severity": "medium", "confidence": 0.86, "triageState": "open", "verdict": "confirmed", "isResolved": false, "reason": "A normalized source-code window appears in two different non-test files.", "evidence": {"lines": 12, "rule_id": "AIC003", "scanner": "repobility-ai-code-hygiene", "references": ["https://jscpd.dev/"], "duplicate_file": "src/mcp-server/tools/definitions/obsidian-get-note.tool.ts", "duplicate_line": 141, "correlation_key": "fp|819f9da538b6c61fcc0feda44564a7bf5bc8d2eb07bf114e4da06c28307c8370"}}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/mcp-server/tools/definitions/obsidian-manage-frontmatter.tool.ts"}, "region": {"startLine": 99}}}]}, {"ruleId": "AIC003", "level": "warning", "message": {"text": "Duplicated implementation block across source files"}, "properties": {"repobilityId": 13060, "scanner": "repobility-ai-code-hygiene", "fingerprint": "ffd9242630e8726b2a6e3029647b847adaf0eb771537b832ee127c9b3809bcc0", "category": "quality", "severity": "medium", "confidence": 0.86, "triageState": "open", "verdict": "confirmed", "isResolved": false, "reason": "A normalized source-code window appears in two different non-test files.", "evidence": {"lines": 12, "rule_id": "AIC003", "scanner": "repobility-ai-code-hygiene", "references": ["https://jscpd.dev/"], "duplicate_file": "src/mcp-server/tools/definitions/obsidian-append-to-note.tool.ts", "duplicate_line": 59, "correlation_key": "fp|ffd9242630e8726b2a6e3029647b847adaf0eb771537b832ee127c9b3809bcc0"}}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/mcp-server/tools/definitions/obsidian-manage-frontmatter.tool.ts"}, "region": {"startLine": 89}}}]}, {"ruleId": "AIC003", "level": "warning", "message": {"text": "Duplicated implementation block across source files"}, "properties": {"repobilityId": 13059, "scanner": "repobility-ai-code-hygiene", "fingerprint": "914e44686c500a0bb2b423f8794fe62b001cb7343f73cdbd33f42e456b1febf8", "category": "quality", "severity": "medium", "confidence": 0.86, "triageState": "open", "verdict": "confirmed", "isResolved": false, "reason": "A normalized source-code window appears in two different non-test files.", "evidence": {"lines": 12, "rule_id": "AIC003", "scanner": "repobility-ai-code-hygiene", "references": ["https://jscpd.dev/"], "duplicate_file": "src/mcp-server/tools/definitions/obsidian-delete-note.tool.ts", "duplicate_line": 38, "correlation_key": "fp|914e44686c500a0bb2b423f8794fe62b001cb7343f73cdbd33f42e456b1febf8"}}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/mcp-server/tools/definitions/obsidian-manage-frontmatter.tool.ts"}, "region": {"startLine": 82}}}]}, {"ruleId": "AIC003", "level": "warning", "message": {"text": "Duplicated implementation block across source files"}, "properties": {"repobilityId": 13058, "scanner": "repobility-ai-code-hygiene", "fingerprint": "fb2e83a40b1e544723a5256741d9fe9fe2f0191a06e56c9866ca6c65d834c1e9", "category": "quality", "severity": "medium", "confidence": 0.86, "triageState": "open", "verdict": "confirmed", "isResolved": false, "reason": "A normalized source-code window appears in two different non-test files.", "evidence": {"lines": 12, "rule_id": "AIC003", "scanner": "repobility-ai-code-hygiene", "references": ["https://jscpd.dev/"], "duplicate_file": "src/mcp-server/tools/definitions/obsidian-append-to-note.tool.ts", "duplicate_line": 59, "correlation_key": "fp|fb2e83a40b1e544723a5256741d9fe9fe2f0191a06e56c9866ca6c65d834c1e9"}}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/mcp-server/tools/definitions/obsidian-get-note.tool.ts"}, "region": {"startLine": 131}}}]}, {"ruleId": "AIC003", "level": "warning", "message": {"text": "Duplicated implementation block across source files"}, "properties": {"repobilityId": 13057, "scanner": "repobility-ai-code-hygiene", "fingerprint": "995be7c44579cc91172b34737a46c8cd896cdde307a3061296a4c1698dc102d1", "category": "quality", "severity": "medium", "confidence": 0.86, "triageState": "open", "verdict": "confirmed", "isResolved": false, "reason": "A normalized source-code window appears in two different non-test files.", "evidence": {"lines": 12, "rule_id": "AIC003", "scanner": "repobility-ai-code-hygiene", "references": ["https://jscpd.dev/"], "duplicate_file": "src/mcp-server/tools/definitions/obsidian-append-to-note.tool.ts", "duplicate_line": 59, "correlation_key": "fp|995be7c44579cc91172b34737a46c8cd896cdde307a3061296a4c1698dc102d1"}}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/mcp-server/tools/definitions/obsidian-delete-note.tool.ts"}, "region": {"startLine": 45}}}]}, {"ruleId": "CORE_NO_CI", "level": "warning", "message": {"text": "No CI/CD configuration found"}, "properties": {"repobilityId": 13056, "scanner": "repobility-core", "fingerprint": "ca5da3551af97272c4f099fc472740148135a15816b81b90bd862e8f91ec66ce", "category": "practices", "severity": "medium", "confidence": null, "triageState": "open", "verdict": "", "isResolved": false, "reason": "", "evidence": {"rule_id": "CORE_NO_CI", "scanner": "repobility-core", "correlation_key": "repo|practices|core_no_ci"}}}, {"ruleId": "DKR008", "level": "note", "message": {"text": ".dockerignore misses sensitive defaults"}, "properties": {"repobilityId": 13070, "scanner": "repobility-docker", "fingerprint": "aea2ad92c68c4ee1f8432bb1ec25e7d45ac12c9e1790ac2d3fffe638b1acce12", "category": "docker", "severity": "low", "confidence": 0.72, "triageState": "open", "verdict": "likely", "isResolved": false, "reason": "A Docker build context should exclude secrets and repository metadata.", "evidence": {"rule_id": "DKR008", "scanner": "repobility-docker", "references": ["https://docs.docker.com/develop/develop-images/dockerfile_best-practices/"], "correlation_key": "fp|aea2ad92c68c4ee1f8432bb1ec25e7d45ac12c9e1790ac2d3fffe638b1acce12", "missing_patterns": ["id_rsa", "*.pem", "*.key"]}}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".dockerignore"}, "region": {"startLine": 1}}}]}]}]}