RAIT-09/obsidian-agent-client
Bring AI agents into Obsidian via Agent Client Protocol (ACP), such as Claude Code, Codex and Gemini CLI.
- Repository: https://github.com/RAIT-09/obsidian-agent-client
- Commit:
3d069c91636588be4e65d955e670403a9ea642d8 - Generated: 2026-11-14T00:13:00+00:00
- Scorer 0.1.0, scoring prov-4+qual-2+sec-2, report schema v2
Scores
| Pillar | Score | Signal | Confidence | Coverage |
|---|---|---|---|---|
| AI provenance (estimated AI-generated share) | 2 | explicit | 95% | 100% |
| Code quality | 72 | adequate | 90% | 100% |
| Security | 53 | weak | 85% | 100% |
AI provenance
Explicit AI attribution on 1% of first-party code added; an estimated 1% including velocity signals.
- Explicitly attributed share (lower bound): 1.5%
- Unattributed share in AI-consistent velocity bursts: 19.2%
- Estimated AI-generated share: 1.5%
| AI tool | Attributed commits | Lines added |
|---|---|---|
| GitHub Copilot coding agent | 16 | 282 |
| Claude Code | 11 | 580 |
| OpenAI Codex | 1 | 190 |
- AI tooling configured in repo: claude-code, gemini, generic-agent, github-copilot
Current source lines last changed by AI-attributed commits: 132 of 27,032.
Too few lines in one group to compare finding densities.
- Stylometry index: 0.13 per 1,000 lines (narrated steps 0, placeholders 0, assistant phrasing 0, emoji 7). Reported as a signal, not scored.
| Month | Lines added | Attributed to AI |
|---|---|---|
| 2025-10 | 8,362 | 0% |
| 2025-11 | 5,729 | 0% |
| 2025-12 | 2,363 | 13% |
| 2026-01 | 11,234 | 3% |
| 2026-02 | 4,176 | 1% |
| 2026-03 | 14,575 | 0% |
| 2026-04 | 2,571 | 14% |
| 2026-05 | 4,499 | 0% |
| 2026-06 | 3,179 | 0% |
| 2026-07 | 4,347 | 0% |
| 2026-08 | 2,457 | 0% |
| 2026-09 | 244 | 0% |
Evidence
- Claude Code: trailer 'Co-Authored-By: Claude' (26bf9442dbf5)
- Claude Code: trailer 'Co-Authored-By: Claude' (f2eea3827e42)
- OpenAI Codex: on merged branch (1ba744f235) (cb92f4b6ce91)
- Claude Code: trailer 'Co-Authored-By: Claude' (a1c3c7d9b4b1)
- Claude Code: trailer 'Co-Authored-By: Claude' (ca5c0f188ace)
- Claude Code: trailer 'Co-Authored-By: Claude' (0e2fa4e7bdec)
- Claude Code: trailer 'Co-Authored-By: Claude' (2170e6f761aa)
- Claude Code: trailer 'Co-Authored-By: Claude' (45bfee291f11)
- Claude Code: trailer 'Co-Authored-By: Claude' (8a420a479419)
- Claude Code: trailer 'Co-Authored-By: Claude' (3fd00c7482a8)
- Claude Code: trailer 'Co-Authored-By: Claude' (07e087728012)
- GitHub Copilot coding agent: author copilot-swe-agent[bot] (8d9f0e298575)
- GitHub Copilot coding agent: author copilot-swe-agent[bot] (991afa4062a5)
- GitHub Copilot coding agent: author copilot-swe-agent[bot] (0535c11e6dd6)
- GitHub Copilot coding agent: author copilot-swe-agent[bot] (d7108743bb65)
AI provenance describes how code was produced; it is not a quality judgment. Unless attribution is explicit, these are signals consistent with AI generation, not proof. Squash/rebase workflows, imported code, and rewritten history reduce accuracy.
Code quality
Code quality is adequate: test-to-source ratio 0.12, CI runs tests; 16% of function code in complex or long functions; 4% duplicated lines. Weakest area: type safety.
| Area | Score |
|---|---|
| Complexity (lizard) | 63 |
| Duplication | 76 |
| Code smells (Opengrep) | 94 |
| Tests and CI | 68 |
| Documentation | 80 |
| Type safety | 40 |
| Process (Scorecard review/maintenance) | n/a |
- Functions: 1,425; mean complexity 2.5, 90th percentile 5; 15 complex and 10 long functions
- Duplicated lines: 4.5% of 18,944 compared
- Tests: 3,155 test lines for 27,032 source lines (ratio 0.12); CI test commands: npm test; 17% of recent source commits also change tests
- Docs missing or thin: changelog
Most complex functions:
- SessionHistoryContent in src/ui/SessionHistoryModal.tsx: complexity 27, 141 lines
- InputArea in src/ui/InputArea.tsx: complexity 26, 265 lines
- parseAgentBlock in src/utils/agent-block-parser.ts: complexity 26, 103 lines
- initialize in src/acp/acp-client.ts: complexity 22, 186 lines
- sessionUpdate in src/acp/acp-handler.ts: complexity 21, 107 lines
Security
Security posture is weak: 61 known vulnerabilities in 20 dependencies; 3 high-severity SAST findings; 12 high-severity workflow issues. Weakest area: posture.
| Area | Score |
|---|---|
| Secrets (gitleaks, tree + history) | 100 |
| Static analysis (Opengrep) | 93 |
| Vulnerable dependencies (OSV) | 14 |
| CI workflows (zizmor) | 11 |
| Posture (policy, updates, signing, lockfiles) | 0 |
| OpenSSF Scorecard | n/a |
-
Known vulnerabilities: 61 in 20 packages (critical 0, high 33, medium 24, low 4)
-
Posture checks passed: lockfiles; missing: security policy, dependency updates, signed commits
Top findings
| Severity | Finding | Location |
|---|---|---|
| high | opengrep/javascript.lang.security.audit.spawn-shell-true: Found '$SPAWN' with '{shell: needsShell}'. This is dangerous because this call will spawn the command using a shell process. Doing so propagates current shell settings and variables, which makes it much easier for a malicious actor to execute commands. Use '{shell: false}' instead. [confidence low] |
src/acp/acp-client.ts:256 |
| high | opengrep/javascript.lang.security.detect-child-process: Detected calls to child_process from a function argument config. This could lead to a command injection if the input is user controllable. Try to avoid calls to child_process, and if it is needed ensure user input is correctly sanitized or sandboxed. [confidence low] |
src/acp/acp-client.ts:256 |
| high | opengrep/javascript.lang.security.detect-child-process: Detected calls to child_process from a function argument params. This could lead to a command injection if the input is user controllable. Try to avoid calls to child_process, and if it is needed ensure user input is correctly sanitized or sandboxed. [confidence low] |
src/acp/terminal-handler.ts:124 |
| high | osv/GHSA-g2v6-rqmx-r4w6: @vue/[email protected] (npm) is affected by GHSA-g2v6-rqmx-r4w6 |
package-lock.json |
| high | osv/GHSA-3jxr-9vmj-r5cp: [email protected] (npm) is affected by GHSA-3jxr-9vmj-r5cp |
package-lock.json |
| high | osv/GHSA-6j4f-fj2g-mc7p: [email protected] (npm) is affected by GHSA-6j4f-fj2g-mc7p |
package-lock.json |
| high | osv/GHSA-mh99-v99m-4gvg: [email protected] (npm) is affected by GHSA-mh99-v99m-4gvg |
package-lock.json |
| high | osv/GHSA-qhr7-859c-m2p7: [email protected] (npm) is affected by GHSA-qhr7-859c-m2p7 |
package-lock.json |
| high | osv/GHSA-rgw5-rvv9-x895: [email protected] (npm) is affected by GHSA-rgw5-rvv9-x895 |
package-lock.json |
| high | osv/GHSA-3jxr-9vmj-r5cp: [email protected] (npm) is affected by GHSA-3jxr-9vmj-r5cp |
package-lock.json |
| high | osv/GHSA-6j4f-fj2g-mc7p: [email protected] (npm) is affected by GHSA-6j4f-fj2g-mc7p |
package-lock.json |
| high | osv/GHSA-mh99-v99m-4gvg: [email protected] (npm) is affected by GHSA-mh99-v99m-4gvg |
package-lock.json |
| high | osv/GHSA-qhr7-859c-m2p7: [email protected] (npm) is affected by GHSA-qhr7-859c-m2p7 |
package-lock.json |
| high | osv/GHSA-rgw5-rvv9-x895: [email protected] (npm) is affected by GHSA-rgw5-rvv9-x895 |
package-lock.json |
| high | osv/GHSA-3jxr-9vmj-r5cp: [email protected] (npm) is affected by GHSA-3jxr-9vmj-r5cp |
package-lock.json |
| high | osv/GHSA-6j4f-fj2g-mc7p: [email protected] (npm) is affected by GHSA-6j4f-fj2g-mc7p |
package-lock.json |
| high | osv/GHSA-mh99-v99m-4gvg: [email protected] (npm) is affected by GHSA-mh99-v99m-4gvg |
package-lock.json |
| high | osv/GHSA-qhr7-859c-m2p7: [email protected] (npm) is affected by GHSA-qhr7-859c-m2p7 |
package-lock.json |
| high | osv/GHSA-rgw5-rvv9-x895: [email protected] (npm) is affected by GHSA-rgw5-rvv9-x895 |
package-lock.json |
| high | osv/GHSA-4c8g-83qw-93j6: [email protected] (npm) is affected by GHSA-4c8g-83qw-93j6 |
package-lock.json |
| high | osv/GHSA-7p8r-x3mc-p8w7: [email protected] (npm) is affected by GHSA-7p8r-x3mc-p8w7 |
package-lock.json |
| high | osv/GHSA-f65p-4m7j-42xc: [email protected] (npm) is affected by GHSA-f65p-4m7j-42xc |
package-lock.json |
| high | osv/GHSA-fph4-wmhf-6fwf: [email protected] (npm) is affected by GHSA-fph4-wmhf-6fwf |
package-lock.json |
| high | osv/GHSA-jqff-g426-hqxp: [email protected] (npm) is affected by GHSA-jqff-g426-hqxp |
package-lock.json |
| high | osv/GHSA-qw65-cvwx-89v3: [email protected] (npm) is affected by GHSA-qw65-cvwx-89v3 |
package-lock.json |
Static signals only: the scorer never runs the project's code. Secret findings are pattern matches that were not verified, and secret values are never stored.
Repository profile
- Source lines: 27,032; test lines: 3,155
| Language | Lines |
|---|---|
| TypeScript | 30,043 |
| JavaScript | 95 |
| Shell | 49 |