chore: graphify!
Docker Build & Publish / build (push) Successful in 1m11s
Docker Build & Publish / push (push) Failing after 7s
Docker Build & Publish / Prune old image versions (push) Has been skipped

This commit is contained in:
Senko-san
2026-07-11 16:21:34 +03:00
parent e45e578f54
commit fb5ce3c708
189 changed files with 81357 additions and 0 deletions
+24
View File
@@ -0,0 +1,24 @@
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "/Users/senko/.local/bin/graphify hook-guard search"
}
]
},
{
"matcher": "Read|Glob",
"hooks": [
{
"type": "command",
"command": "/Users/senko/.local/bin/graphify hook-guard read"
}
]
}
]
}
}
+10
View File
@@ -74,3 +74,13 @@ These exist for future sync + ML and are easy to violate by accident:
## Python 3.14 note
The project targets Python 3.14, which makes annotations lazy by default (PEP 649). `from __future__ import annotations` is therefore intentionally **absent** — do not add it back. All pins (pyproject `requires-python`, ruff `target-version`, mypy `python_version`, Dockerfile, `.python-version`) are on 3.14.
## graphify
This project has a knowledge graph at graphify-out/ with god nodes, community structure, and cross-file relationships.
Rules:
- For codebase questions, first run `graphify query "<question>"` when graphify-out/graph.json exists. Use `graphify path "<A>" "<B>"` for relationships and `graphify explain "<concept>"` for focused concepts. These return a scoped subgraph, usually much smaller than GRAPH_REPORT.md or raw grep output.
- If graphify-out/wiki/index.md exists, use it for broad navigation instead of raw source browsing.
- Read graphify-out/GRAPH_REPORT.md only for broad architecture review or when query/path/explain do not surface enough context.
- After modifying code, run `graphify update .` to keep the graph current (AST-only, no API cost).
+1
View File
@@ -0,0 +1 @@
{"0": "Storage Backend & Disk Usage", "1": "Auth Schemas & Tokens", "2": "Error Mapping & Search Schemas", "3": "Download Service Orchestration", "4": "Playlist Schemas & API", "5": "Album Repository", "6": "ORM Base & Models", "7": "Correlation ID Middleware & Config", "8": "Auth Services (native + Subsonic)", "9": "Audio Tags & Metadata Test Fakes", "10": "YouTube Source Backend", "11": "Dependency Wiring (deps.py)", "12": "Library Stats & Track Availability", "13": "Library Import Service", "14": "Subsonic Response Envelope", "15": "Chromaprint Fingerprinting", "16": "Album/Search Response Schemas", "17": "Pagination & Likes Endpoints", "18": "Metadata Enrichment Service", "19": "Subsonic ID Encoding", "20": "Track & Artist Domain Entities", "21": "Source Port Protocols", "22": "User Management Service", "23": "Metadata Enrichment Value Objects", "24": "DB Session & Health Checks", "25": "Download Service Tests", "26": "Download Job Domain Entity", "27": "Credentials & User Repository", "28": "Streaming Auth Dependencies", "29": "Subsonic Browsing Endpoints", "30": "Remote Library Service Tests", "31": "Worker Session Scope & Download Task", "32": "Metadata Enrichment Pipeline", "33": "Album Domain & Cover Value Object", "34": "Downloads API Tests", "35": "Subsonic Search Encoding", "36": "In-Memory Auth Repository Fakes", "37": "Storage Stats Response Schemas", "38": "Subsonic App-Password Crypto", "39": "Artist Schemas & Endpoints", "40": "Download Request/Response Schemas", "41": "Settings & MusicBrainz User-Agent", "42": "Subsonic API Integration Tests", "43": "Playlist Endpoints", "44": "Play History Domain & Repository", "45": "DB Engine Lifecycle", "46": "Shared Query Param Annotations", "47": "Local Folder Source Backend", "48": "Track Metadata Match Schemas", "49": "Like Domain Entity (event log)", "50": "Auth API Integration Tests", "51": "Cover API Tests", "52": "Upload/Stream API Tests", "53": "Tag Parsing Helpers", "54": "Metadata API Tests", "55": "Subsonic Auth Service Tests", "56": "Cover Art Serving", "57": "Play History Schemas", "58": "Refresh Token Repository", "59": "Radio Endpoints", "60": "Subsonic Legacy Password Decoding", "61": "Management CLI", "62": "Sources API Tests", "63": "Hexagonal Architecture Layers (doc)", "64": "Test DB Fixtures (conftest)", "65": "Upload Response Schemas", "66": "Cover Art Extraction (Vorbis/MP4)", "67": "Storage Stats API Tests", "68": "AcoustID Response Parser Tests", "69": "Like Request/Response Schemas", "70": "Streaming Endpoint", "71": "Auth Token Issue/Refresh Flow", "72": "Generic Job/Result Store Protocol", "73": "Remote Library Materialization", "74": "CI Docker Publish Workflow", "75": "User Scrobbling Settings", "76": "Domain Invariants (dedup, manual overwrite, offline tags)", "77": "Alembic Migration Environment", "78": "Cover Art Archive Client", "79": "Health Endpoint Smoke Tests", "80": "ASGI Middleware Protocol", "81": "File Hashing Utilities", "82": "Migration: auth_users", "83": "Migration: music_schema", "84": "Migration: rename track file_path", "85": "Migration: subsonic_app_password", "86": "Migration: track_enrichment_outcome", "87": "Migration: download_job_track_id", "88": "Migration: remote_placeholders", "89": "Package: app.api", "90": "Package: app.api.schemas", "91": "Package: app.application", "92": "Package: app.core", "93": "Package: app.domain", "94": "Package: app.infrastructure", "95": "Package: metadata-enrichment adapters", "96": "Package: source backends", "97": "Package: storage adapters", "98": "Package: app root (mcma-backend)", "99": "Package: arq worker", "100": "Package: arq tasks", "101": "Config Conventions (doc)", "102": "Subsonic Adapter Convention (doc)", "103": "DB Session Convention (doc)", "104": "Health Convention (doc)", "105": "Invariant: Graceful Degradation", "106": "Invariant: Likes Are Append-Only", "107": "Invariant: Stable Track content_id", "108": "Logging Convention (doc)", "109": "Python 3.14 Lazy Annotations Note", "110": "App-Passwords Mechanism (doc)", "111": "Local Dev Setup (doc)", "112": "Tooling Section (doc)", "113": "Package: workers"}
+1
View File
@@ -0,0 +1 @@
/Users/senko/.local/share/uv/tools/graphifyy/bin/python
+1
View File
@@ -0,0 +1 @@
/Users/senko/Work/mcma-compose/mcma-backend
+505
View File
@@ -0,0 +1,505 @@
# Graph Report - . (2026-07-11)
## Corpus Check
- 180 files · ~50,815 words
- Verdict: corpus is large enough that graph structure adds value.
## Summary
- 1953 nodes · 5606 edges · 114 communities (89 shown, 25 thin omitted)
- Extraction: 90% EXTRACTED · 10% INFERRED · 0% AMBIGUOUS · INFERRED: 579 edges (avg confidence: 0.56)
- Token cost: 0 input · 44,973 output
## Community Hubs (Navigation)
- Storage Backend & Disk Usage
- Auth Schemas & Tokens
- Error Mapping & Search Schemas
- Download Service Orchestration
- Playlist Schemas & API
- Album Repository
- ORM Base & Models
- Correlation ID Middleware & Config
- Auth Services (native + Subsonic)
- Audio Tags & Metadata Test Fakes
- YouTube Source Backend
- Dependency Wiring (deps.py)
- Library Stats & Track Availability
- Library Import Service
- Subsonic Response Envelope
- Chromaprint Fingerprinting
- Album/Search Response Schemas
- Pagination & Likes Endpoints
- Metadata Enrichment Service
- Subsonic ID Encoding
- Track & Artist Domain Entities
- Source Port Protocols
- User Management Service
- Metadata Enrichment Value Objects
- DB Session & Health Checks
- Download Service Tests
- Download Job Domain Entity
- Credentials & User Repository
- Streaming Auth Dependencies
- Subsonic Browsing Endpoints
- Remote Library Service Tests
- Worker Session Scope & Download Task
- Metadata Enrichment Pipeline
- Album Domain & Cover Value Object
- Downloads API Tests
- Subsonic Search Encoding
- In-Memory Auth Repository Fakes
- Storage Stats Response Schemas
- Subsonic App-Password Crypto
- Artist Schemas & Endpoints
- Download Request/Response Schemas
- Settings & MusicBrainz User-Agent
- Subsonic API Integration Tests
- Playlist Endpoints
- Play History Domain & Repository
- DB Engine Lifecycle
- Shared Query Param Annotations
- Local Folder Source Backend
- Track Metadata Match Schemas
- Like Domain Entity (event log)
- Auth API Integration Tests
- Cover API Tests
- Upload/Stream API Tests
- Tag Parsing Helpers
- Metadata API Tests
- Subsonic Auth Service Tests
- Cover Art Serving
- Play History Schemas
- Refresh Token Repository
- Radio Endpoints
- Subsonic Legacy Password Decoding
- Management CLI
- Sources API Tests
- Hexagonal Architecture Layers (doc)
- Test DB Fixtures (conftest)
- Upload Response Schemas
- Cover Art Extraction (Vorbis/MP4)
- Storage Stats API Tests
- AcoustID Response Parser Tests
- Like Request/Response Schemas
- Streaming Endpoint
- Auth Token Issue/Refresh Flow
- Generic Job/Result Store Protocol
- Remote Library Materialization
- CI Docker Publish Workflow
- User Scrobbling Settings
- Domain Invariants (dedup, manual overwrite, offline tags)
- Alembic Migration Environment
- Cover Art Archive Client
- Health Endpoint Smoke Tests
- ASGI Middleware Protocol
- File Hashing Utilities
- Package: app.api
- Package: app.api.schemas
- Package: app.application
- Package: app.core
- Package: app.domain
- Package: app.infrastructure
- Package: metadata-enrichment adapters
- Package: source backends
- Package: storage adapters
- Package: app root (mcma-backend)
- Package: arq worker
- Package: arq tasks
- Config Conventions (doc)
- Subsonic Adapter Convention (doc)
- DB Session Convention (doc)
- Health Convention (doc)
- Invariant: Graceful Degradation
- Invariant: Likes Are Append-Only
- Invariant: Stable Track content_id
- Logging Convention (doc)
- Python 3.14 Lazy Annotations Note
- App-Passwords Mechanism (doc)
- Local Dev Setup (doc)
- Tooling Section (doc)
## God Nodes (most connected - your core abstractions)
1. `NotFoundError` - 94 edges
2. `UserService` - 55 edges
3. `Track` - 50 edges
4. `AuthenticationError` - 49 edges
5. `TrackRepository` - 49 edges
6. `SourceInfo` - 49 edges
7. `MetadataEnrichmentService` - 47 edges
8. `DownloadResult` - 47 edges
9. `get_settings()` - 45 edges
10. `FileStorage` - 43 edges
## Surprising Connections (you probably didn't know these)
- `test_id_malformed_rejected()` --indirect_call--> `NotFoundError` [INFERRED]
tests/test_subsonic_security.py → app/domain/errors.py
- `test_id_wrong_prefix_rejected()` --indirect_call--> `NotFoundError` [INFERRED]
tests/test_subsonic_security.py → app/domain/errors.py
- `acoustid_trust_score (trust high-confidence AcoustID over junk tags)` --semantically_similar_to--> `Invariant: never overwrite metadata_status=manual` [INFERRED] [semantically similar]
tests/fixtures/README.md → CLAUDE.md
- `FakeAcoustId` --uses--> `MetadataEnrichmentService` [INFERRED]
tests/test_metadata_service.py → app/application/metadata_service.py
- `FakeAlbumRepo` --uses--> `MetadataEnrichmentService` [INFERRED]
tests/test_metadata_service.py → app/application/metadata_service.py
## Import Cycles
- None detected.
## Hyperedges (group relationships)
- **Cross-cutting conventions (errors, config, logging, db sessions, migrations, health)** — claude_error_handling_convention, claude_config_convention, claude_logging_convention, claude_db_sessions_convention, claude_migrations_convention, claude_health_convention [EXTRACTED 1.00]
- **Non-negotiable domain invariants (for future sync + ML)** — claude_invariant_likes_event_log, claude_invariant_track_id_stable, claude_invariant_dedup, claude_invariant_graceful_degradation, claude_invariant_no_manual_overwrite, claude_invariant_no_heavy_work_in_request, claude_invariant_subsonic_compatibility [EXTRACTED 1.00]
- **Hexagonal architecture layers (domain/application/infrastructure/api/core/workers)** — claude_domain_layer, claude_application_layer, claude_infrastructure_layer, claude_api_layer, claude_core_layer, claude_workers_layer [EXTRACTED 1.00]
## Communities (114 total, 25 thin omitted)
### Community 0 - "Storage Backend & Disk Usage"
Cohesion: 0.05
Nodes (53): DiskUsage, ObjectStat, Value objects for file storage., Capacity of the volume backing the media store. ``None`` for backends (e.g., File storage operation failed., StorageError, Capacity of the volume backing the store, or ``None`` when the backend h, LocalFileStorage (+45 more)
### Community 1 - "Auth Schemas & Tokens"
Cohesion: 0.07
Nodes (59): LoginRequest, BaseModel, Auth request/response schemas. Tokens are returned in the body (the client store, RefreshRequest, RegisterRequest, TokenResponse, BaseModel, Schemas for Subsonic app-password self-service (native /api/v1 surface). The Su (+51 more)
### Community 2 - "Error Mapping & Search Schemas"
Cohesion: 0.06
Nodes (44): _is_subsonic(), FastAPI, Maps domain exceptions to HTTP responses. The only place that knows both. Two s, register_exception_handlers(), ExternalSearchResponse, ExternalSearchResultOut, BaseModel, Schemas for searching external (fetch) sources — the §A4 discover screen. (+36 more)
### Community 3 - "Download Service Orchestration"
Cohesion: 0.07
Nodes (24): DownloadRequest, EnrichEnqueuer, DownloadService — request external downloads and import their results. Two role, Outcome of asking for a download. Exactly one of the three states holds: th, EnrichEnqueuer, Path, Protocol, UploadService — handles user file uploads. (+16 more)
### Community 4 - "Playlist Schemas & API"
Cohesion: 0.11
Nodes (34): PlaylistAddTrack, PlaylistCreate, PlaylistOut, PlaylistUpdate, BaseModel, Playlist request/response schemas., add_playlist_track(), _build_playlist_out() (+26 more)
### Community 5 - "Album Repository"
Cohesion: 0.07
Nodes (10): AlbumRepository, DownloadJobRepository, PlaylistRepository, datetime, UUID, Resolve/create an album bound to a remote ``(source, source_id)`` (lazy, Persistence for download jobs (plan §6.1). Drives the §A5 download manager a, Bump ``retry_count`` and return the new value. (+2 more)
### Community 6 - "ORM Base & Models"
Cohesion: 0.10
Nodes (32): Base, Declarative base with a fixed naming convention. The naming convention makes Al, Base for all ORM models. Import models so Alembic sees their metadata., ORM model for albums., ORM model for artists., ORM model for download jobs (plan §6.1). Tracks a queued download through its l, LikeValue, LyricsStatus (+24 more)
### Community 7 - "Correlation ID Middleware & Config"
Cohesion: 0.09
Nodes (33): CorrelationIdMiddleware, HTTP middleware: bind a correlation id and log each request., Pure-ASGI middleware: reuse inbound ``X-Correlation-Id`` or mint one, bind i, app_version(), get_settings(), Application settings — single source of truth, sourced from environment. Nothin, Cached settings singleton. Patch the cache in tests via ``get_settings.cache_cle, _add_correlation_id() (+25 more)
### Community 8 - "Auth Services (native + Subsonic)"
Cohesion: 0.12
Nodes (21): Authentication use cases: login, token refresh (rotation), logout, and access-to, SubsonicAuthService — app-password lifecycle + Subsonic auth verification. The, User entity. Admin is a single ``is_superuser`` flag — no role system in Phase, HistoryRepository, LikeRepository, PasswordHasher, Protocol, Ports — the contracts the application layer depends on. These are Protocols, no (+13 more)
### Community 9 - "Audio Tags & Metadata Test Fakes"
Cohesion: 0.15
Nodes (28): AudioTags, Embedded tags read from the file itself (ID3 / Vorbis / MP4 …). Every field, _cover_service(), FakeAlbumRepo, FakeArtistRepo, FakeCoverExtractor, FakeCoverProvider, FakeTagReader (+20 more)
### Community 10 - "YouTube Source Backend"
Cohesion: 0.09
Nodes (30): Which backend imported a track. Drives ``is_replaceable`` (plan §6.6)., TrackSource, _default_download(), _default_search(), _libs_available(), Any, Path, ProgressCallback (+22 more)
### Community 11 - "Dependency Wiring (deps.py)"
Cohesion: 0.10
Nodes (35): get_album_repository(), get_artist_repository(), get_auth_service(), get_download_service(), get_history_repository(), get_like_repository(), get_metadata_service(), get_password_hasher() (+27 more)
### Community 12 - "Library Stats & Track Availability"
Cohesion: 0.12
Nodes (19): FormatBreakdown, LibraryStats, Per-container-format slice of the library (e.g. ``flac`` → 312 tracks)., Aggregate facts about everything the instance has stored. Computed from the, Track, Whether a track's audio is on local storage or still a remote placeholder (p, TrackAvailability, TrackModel (+11 more)
### Community 13 - "Library Import Service"
Cohesion: 0.13
Nodes (18): ImportSummary, LibraryImportService, UUID, LibraryImportService — imports files discovered by an indexable source. Batch s, Source-backend value objects — framework-free. A *source* is a place tracks com, A single importable file discovered by an indexable source. ``source_id`` i, SourceFile, FakeArtistRepo (+10 more)
### Community 14 - "Subsonic Response Envelope"
Cohesion: 0.12
Nodes (30): _build_xml(), _is_json(), Any, Element, Response, The Subsonic response envelope — one serializer, two wire formats. Every Subson, A ``status="failed"`` envelope carrying a Subsonic ``<error>``., Recursively drop ``None`` values so JSON output matches XML (no empty attrs). (+22 more)
### Community 15 - "Chromaprint Fingerprinting"
Cohesion: 0.10
Nodes (21): FpcalcFingerprinter, Path, FpcalcFingerprinter — Chromaprint fingerprint via the ``fpcalc`` binary. ``fpca, Implements :class:`app.domain.ports.AudioFingerprinter`., MutagenTagReader, Implements :class:`app.domain.ports.AudioTagReader`., _acoustid_client(), _FakeAlbumRepo (+13 more)
### Community 16 - "Album/Search Response Schemas"
Cohesion: 0.12
Nodes (28): AlbumOut, BaseModel, Album request/response schemas., LibrarySearchResponse, BaseModel, Search response schemas., _build_album_out(), get_album() (+20 more)
### Community 17 - "Pagination & Likes Endpoints"
Cohesion: 0.17
Nodes (29): Shared pagination envelope for all paged list responses., TrackOut, get_likes(), AlbumRepoDep, ArtistRepoDep, Like endpoints. Likes are an append-only event-log — never updated in place., _build_track_out(), delete_track() (+21 more)
### Community 18 - "Metadata Enrichment Service"
Cohesion: 0.11
Nodes (11): _first_int(), MetadataEnrichmentService, _opt_str(), UUID, Explain a ``failed`` (no-identity) run in terms a user can act on: which, AcoustID candidates for the metadata editor's match picker (§A7). Read-, Fill in an album cover when it has none. Source order mirrors the tag-fi, CoverArt (+3 more)
### Community 19 - "Subsonic ID Encoding"
Cohesion: 0.14
Nodes (28): decode_album(), decode_artist(), _decode_as(), decode_playlist(), decode_track(), encode(), encode_playlist(), encode_track() (+20 more)
### Community 20 - "Track & Artist Domain Entities"
Cohesion: 0.12
Nodes (12): Artist, Track and Artist domain entities., Resolve/create an artist bound to a remote ``(source, source_id)`` (lazy, ArtistModel, AsyncSession, UUID, Artist repository — adapter over ``AsyncSession``., Resolve an artist by ``(source, source_id)`` first (re-browse/save dedup (+4 more)
### Community 21 - "Source Port Protocols"
Cohesion: 0.13
Nodes (16): FetchableSource, IndexableSource, A registered source of tracks (mounted folder, YouTube, …). ``name`` is the, A source that enumerates files already on disk (e.g. the local folder)., A source that can be searched by free text (e.g. YouTube Music). Returns ``, A source that can download a previously-discovered item to local disk. ``fe, SearchableSource, SourceBackend (+8 more)
### Community 22 - "User Management Service"
Cohesion: 0.19
Nodes (24): AuthService, User-management use cases: admin CRUD plus self-service password change. Deleti, UserService, AlreadyExistsError, AuthenticationError, Resource conflicts with an existing one (e.g. duplicate)., Caller could not be authenticated., env() (+16 more)
### Community 23 - "Metadata Enrichment Value Objects"
Cohesion: 0.14
Nodes (12): Fingerprint, Value objects for the metadata-enrichment pipeline (plan §6.2). Pure data carri, Chromaprint fingerprint plus the decoded duration (both needed by AcoustID)., A single AcoustID result, flattened to the fields enrichment cares about. `, RecordingMatch, AcoustIdHttpClient, _parse_matches(), _parse_one() (+4 more)
### Community 24 - "DB Session & Health Checks"
Cohesion: 0.10
Nodes (24): get_session(), AsyncSession, Request-scoped DB session. Commits on success, rolls back on exception., _check_db(), _check_ml(), _check_redis(), health(), HealthResponse (+16 more)
### Community 25 - "Download Service Tests"
Cohesion: 0.16
Nodes (14): DownloadService, FakeArtistRepo, FakeJobRepo, FakeStorage, FakeTrackRepo, Path, UUID, Unit tests for DownloadService — DB-free, in-memory fakes. (+6 more)
### Community 26 - "Download Job Domain Entity"
Cohesion: 0.13
Nodes (10): DownloadJob, Download job domain entity (plan §6.1). A queued fetch from an external source,, An unfinished (queued/downloading/enriching) job for the same item, if a, DownloadJobModel, DownloadStatus, Lifecycle of a download job (plan §6.1)., datetime, UUID (+2 more)
### Community 27 - "Credentials & User Repository"
Cohesion: 0.15
Nodes (10): Credentials, A user paired with their stored password hash. Stays inside the application, A user paired with their *encrypted* Subsonic app-password. ``password_enc`, SubsonicCredentials, UserModel, AsyncSession, UUID, User repository — adapter over ``AsyncSession`` implementing ``app.domain.ports. (+2 more)
### Community 28 - "Streaming Auth Dependencies"
Cohesion: 0.10
Nodes (13): get_current_superuser(), get_current_user(), get_streaming_user(), AuthServiceDep, CurrentUser, Authenticate a stream request. The browser ``<audio>`` element cannot send, UUID, Admin-driven password reset. Revokes all sessions. (+5 more)
### Community 29 - "Subsonic Browsing Endpoints"
Cohesion: 0.26
Nodes (26): _albums_for_artist(), _artists_index(), _decorate_albums(), get_album(), get_album_list(), get_album_list2(), get_artist(), get_artists() (+18 more)
### Community 30 - "Remote Library Service Tests"
Cohesion: 0.21
Nodes (17): RemoteLibraryService, Input is well-formed but violates a business rule., ValidationError, FakeArtistRepo, FakeJobRepo, FakeTrackRepo, _local_track(), UUID (+9 more)
### Community 31 - "Worker Session Scope & Download Task"
Cohesion: 0.21
Nodes (24): Transactional session for workers/scripts: commit on success, rollback on error., session_scope(), AsyncSession, SqlAlchemyDownloadJobRepository, build_source_registry(), download_track(), _handle_failure(), _import_result() (+16 more)
### Community 32 - "Metadata Enrichment Pipeline"
Cohesion: 0.12
Nodes (15): EnrichmentResult, MetadataEnrichmentService — the §6.2 pipeline orchestrator. Order (tag-first):, AcoustIdClient, AudioFingerprinter, AudioTagReader, CoverArtExtractor, CoverArtProvider, Path (+7 more)
### Community 33 - "Album Domain & Cover Value Object"
Cohesion: 0.19
Nodes (11): Album, Cover-art value object — raw image bytes plus their MIME type. Crosses the doma, Domain entities and value objects — pure, framework-free., AlbumModel, AsyncSession, UUID, Album repository — adapter over ``AsyncSession``., Resolve an album by ``(title, artist_id)``, creating it if absent. Backf (+3 more)
### Community 34 - "Downloads API Tests"
Cohesion: 0.15
Nodes (17): MonkeyPatch, FakeFetchSource, _login(), Any, AsyncClient, Path, Integration tests for downloads + external search. Requires a reachable Postgre, Remote browse (plan: Model C) — a fresh hit isn't in the library; after savi (+9 more)
### Community 35 - "Subsonic Search Encoding"
Cohesion: 0.15
Nodes (21): encode_album(), encode_artist(), AlbumRepoDep, ArtistRepoDep, ge, le, Query, Response (+13 more)
### Community 36 - "In-Memory Auth Repository Fakes"
Cohesion: 0.14
Nodes (8): InMemoryRefreshTokenRepository, InMemoryUserRepository, datetime, UUID, In-memory port implementations for fast, DB-free unit tests., _Stored, _Token, env()
### Community 37 - "Storage Stats Response Schemas"
Cohesion: 0.15
Nodes (20): DiskUsageOut, FormatBreakdownOut, GenreCountOut, BaseModel, Storage / library statistics response schemas (§A6)., Everything the Storage screen needs in a single call., StorageStatsOut, get_broken_files() (+12 more)
### Community 38 - "Subsonic App-Password Crypto"
Cohesion: 0.12
Nodes (15): generate_subsonic_password(), UUID, A fresh, high-entropy Subsonic app-password (url-safe, ~24 chars)., Symmetric encrypt/decrypt for the recoverable Subsonic app-password. Subson, SubsonicPasswordCipher, test_reveal_generates_then_is_stable(), test_rotate_then_authenticate(), Unit tests for Subsonic crypto + id helpers (no DB, no network). (+7 more)
### Community 39 - "Artist Schemas & Endpoints"
Cohesion: 0.21
Nodes (18): ArtistOut, BaseModel, Artist request/response schemas., PagedResponse, BaseModel, get_artist(), get_artist_albums(), get_artist_tracks() (+10 more)
### Community 40 - "Download Request/Response Schemas"
Cohesion: 0.23
Nodes (17): DownloadCreate, DownloadCreateResponse, DownloadJobOut, BaseModel, Schemas for the download job endpoints (§A5 download manager)., Request to download an item discovered on a fetch source., Result of requesting a download. ``already_in_library`` → the item was alre, cancel_download() (+9 more)
### Community 41 - "Settings & MusicBrainz User-Agent"
Cohesion: 0.18
Nodes (13): User-Agent sent to MusicBrainz/AcoustID: ``MCMA/<version> ( <contact> )``., Settings, JwtTokenService, Security adapters: password hashing (argon2 via pwdlib) and JWT (pyjwt). These, Issues and verifies HS256 JWTs for access + refresh tokens. TTLs come from, BaseSettings, Unit tests for the security adapters (no DB, no network)., _settings() (+5 more)
### Community 42 - "Subsonic API Integration Tests"
Cohesion: 0.28
Nodes (18): _auth_params(), _login(), AsyncClient, Integration tests for the Subsonic /rest layer (happy path per endpoint group)., _seed_track(), _setup(), _subsonic_password(), test_get_album_list2() (+10 more)
### Community 43 - "Playlist Endpoints"
Cohesion: 0.34
Nodes (17): create_playlist(), delete_playlist(), get_playlist(), get_playlists(), _owned_playlist(), _playlist_dict(), _playlist_songs(), AlbumRepoDep (+9 more)
### Community 44 - "Play History Domain & Repository"
Cohesion: 0.22
Nodes (10): PlayHistoryEntry, Play history domain entity — append-only scrobble log entry., PlayHistoryModel, AsyncSession, datetime, UUID, Play history repository — adapter over ``AsyncSession``., SqlAlchemyHistoryRepository (+2 more)
### Community 45 - "DB Engine Lifecycle"
Cohesion: 0.18
Nodes (17): dispose_engine(), get_engine(), Dispose the pooled engine on shutdown. Safe to call if never initialized., AsyncEngine, api(), _db_reachable(), api(), _db_reachable() (+9 more)
### Community 46 - "Shared Query Param Annotations"
Cohesion: 0.23
Nodes (15): ge, HistoryRepoDep, le, LikeRepoDep, Query, Response, SubsonicFormat, SubsonicUser (+7 more)
### Community 47 - "Local Folder Source Backend"
Cohesion: 0.21
Nodes (12): LocalFolderSource, Path, Implements :class:`app.domain.ports.IndexableSource`., Path, Unit tests for the local-folder source + registry (no DB, no network)., _settings(), test_info_reports_kind_and_availability(), test_is_available_false_when_missing() (+4 more)
### Community 48 - "Track Metadata Match Schemas"
Cohesion: 0.17
Nodes (15): MaterializeResponse, MetadataApply, MetadataMatch, MetadataMatchesOut, BaseModel, Track request/response schemas., One AcoustID candidate for the metadata editor's match picker (§A7)., Manual edits / accepted match applied via ``PUT /tracks/{id}/metadata``. Se (+7 more)
### Community 49 - "Like Domain Entity (event log)"
Cohesion: 0.23
Nodes (8): Like, Like domain entity — append-only event log entry., LikeModel, AsyncSession, UUID, Like repository — adapter over ``AsyncSession``. Likes are an append-only event, SqlAlchemyLikeRepository, _to_entity()
### Community 50 - "Auth API Integration Tests"
Cohesion: 0.28
Nodes (15): _login(), AsyncClient, Integration tests for the auth + admin HTTP surface. These require a reachable, test_admin_create_duplicate_conflicts(), test_admin_creates_user_and_nonadmin_forbidden(), test_deactivated_user_cannot_login(), test_login_and_me(), test_login_bad_credentials() (+7 more)
### Community 51 - "Cover API Tests"
Cohesion: 0.30
Nodes (14): api(), _db_reachable(), _login(), AsyncClient, Path, UUID, Integration tests for the native cover-art endpoints. Seeds an album with a sto, Create an artist + album (+ optional cover file) + track. Returns ``(album_i (+6 more)
### Community 52 - "Upload/Stream API Tests"
Cohesion: 0.29
Nodes (14): api(), _db_reachable(), _login(), AsyncClient, Path, Integration tests for upload and streaming endpoints. Requires a reachable Post, test_list_tracks_filters_by_source(), test_stream_full() (+6 more)
### Community 53 - "Tag Parsing Helpers"
Cohesion: 0.25
Nodes (10): _first(), _parse_track_number(), _parse_year(), Path, MutagenTagReader — reads embedded tags from a local audio file. The offline fir, EasyXxx tags expose values as lists; take the first non-empty string., Unit tests for the mutagen tag-parsing helpers — pure, no files., test_first_takes_head_of_list() (+2 more)
### Community 54 - "Metadata API Tests"
Cohesion: 0.35
Nodes (13): api(), _db_reachable(), _login(), AsyncClient, Path, Integration tests for the metadata-editor endpoints (§A7, §1H). Requires a reac, test_apply_metadata_not_found(), test_apply_metadata_partial_update() (+5 more)
### Community 55 - "Subsonic Auth Service Tests"
Cohesion: 0.27
Nodes (13): _md5(), Unit tests for SubsonicAuthService — verification + app-password lifecycle. DB-, _service_with_user(), test_authenticate_enc_password_success(), test_authenticate_inactive_user_fails(), test_authenticate_missing_credentials_is_validation_error(), test_authenticate_missing_username_is_validation_error(), test_authenticate_no_password_set_fails() (+5 more)
### Community 56 - "Cover Art Serving"
Cohesion: 0.19
Nodes (12): _content_type_for(), StreamingResponse, UUID, Shared cover-art serving helper (presentation). Streams a stored cover image fr, Stream a stored cover by its storage key. Raises ``NotFoundError`` if the ob, The album that owns a track (cover lives on the album), or ``None``., resolve_album_for_track(), stream_cover() (+4 more)
### Community 57 - "Play History Schemas"
Cohesion: 0.24
Nodes (11): HistoryIn, HistoryOut, BaseModel, Play history request/response schemas., get_history(), CurrentUser, HistoryRepoDep, Response (+3 more)
### Community 58 - "Refresh Token Repository"
Cohesion: 0.27
Nodes (7): A persisted, revocable refresh token (offline-first sessions). Stores only, RefreshTokenModel, AsyncSession, datetime, UUID, Refresh-token repository — adapter implementing ``app.domain.ports.RefreshTokenR, SqlAlchemyRefreshTokenRepository
### Community 59 - "Radio Endpoints"
Cohesion: 0.20
Nodes (9): Native REST API, version 1. Aggregates feature routers under ``/api/v1``., next_radio_track(), Any, Radio / continuous-mix endpoints. Degrades gracefully when ML service is down., start_radio(), get_changes(), push_changes(), Any (+1 more)
### Community 60 - "Subsonic Legacy Password Decoding"
Cohesion: 0.24
Nodes (8): _decode_legacy_password(), _md5_hex(), UUID, Decode a Subsonic ``p`` param: ``enc:<hex>`` (hex-encoded) or plaintext., Resolve Subsonic query auth params to a domain :class:`User`. Raises :c, Generate a fresh app-password, store it encrypted, return the plaintext., Return the current app-password, generating one on first access., SubsonicAuthService
### Community 61 - "Management CLI"
Cohesion: 0.21
Nodes (8): _cmd_create_admin(), _create_admin(), main(), Management CLI (``mcma``). Commands: * ``mcma version`` — print the bac, Argon2PasswordHasher, argon2id hasher with sensible defaults from pwdlib., Namespace, test_password_hash_roundtrip()
### Community 62 - "Sources API Tests"
Cohesion: 0.29
Nodes (11): Any, scan_local_folder(), api(), _db_reachable(), _login(), AsyncClient, Path, Integration tests for sources: enumeration + the real import path. Requires a r (+3 more)
### Community 63 - "Hexagonal Architecture Layers (doc)"
Cohesion: 0.17
Nodes (12): app/api — driving adapter (FastAPI), app/application — use cases / services, Composition roots (app/main.py, app/api/deps.py), app/core — cross-cutting concerns, app/domain — pure business core, Error handling convention (domain errors → HTTP in app/api/errors.py), Hexagonal architecture (ports & adapters), app/infrastructure — driven adapters (+4 more)
### Community 64 - "Test DB Fixtures (conftest)"
Cohesion: 0.20
Nodes (11): _base_database_url(), client(), _create_test_db_if_missing(), _ensure_test_database(), AsyncClient, Shared test fixtures. The ASGI app is driven in-process via httpx + asgi-lifesp, Resolve the DB URL the app *would* use, mirroring pydantic-settings preceden, Return ``url`` with its database name swapped for ``name``. (+3 more)
### Community 65 - "Upload Response Schemas"
Cohesion: 0.22
Nodes (9): BaseModel, Schemas for upload responses., UploadResponse, CurrentUser, Local file upload endpoint., upload_file(), File, UploadFile (+1 more)
### Community 66 - "Cover Art Extraction (Vorbis/MP4)"
Cohesion: 0.24
Nodes (9): _decode_vorbis_picture(), _from_picture(), _front_or_first(), MutagenCoverExtractor, Any, Path, Prefer the front-cover picture (type 3), else the first available., Implements :class:`app.domain.ports.CoverArtExtractor`. (+1 more)
### Community 67 - "Storage Stats API Tests"
Cohesion: 0.35
Nodes (10): api(), _db_reachable(), _login(), AsyncClient, Path, Integration tests for the storage statistics endpoint (§A6). Requires a reachab, test_storage_stats_counts_uploads(), test_storage_stats_empty_library() (+2 more)
### Community 68 - "AcoustID Response Parser Tests"
Cohesion: 0.42
Nodes (9): _parse_best_match(), _payload_with_results(), Unit tests for the AcoustID response parser — pure, no network., test_empty_results_returns_none(), test_error_status_returns_none(), test_non_dict_payload_returns_none(), test_parses_full_recording(), test_picks_highest_score() (+1 more)
### Community 69 - "Like Request/Response Schemas"
Cohesion: 0.33
Nodes (8): LikeEvent, LikeState, BaseModel, Like request/response schemas., add_like(), get_likes_state(), CurrentUser, LikeRepoDep
### Community 70 - "Streaming Endpoint"
Cohesion: 0.25
Nodes (8): alias, Header, StreamingResponse, StreamingServiceDep, StreamUser, UUID, Audio streaming endpoint — direct stream with Range support., stream_track()
### Community 71 - "Auth Token Issue/Refresh Flow"
Cohesion: 0.31
Nodes (5): _hash_token(), UUID, At-rest hash of a refresh token. A signed JWT is high-entropy, so a fast SHA, The access + refresh pair returned to clients on login/refresh., TokenPair
### Community 72 - "Generic Job/Result Store Protocol"
Cohesion: 0.25
Nodes (3): UUID, Remove the job record. True mid-flight cancellation of an in-progress yt, Store a freshly downloaded file and create a minimal ``pending`` track.
### Community 73 - "Remote Library Materialization"
Cohesion: 0.25
Nodes (6): MaterializeOutcome, UUID, RemoteLibraryService — save-to-library + materialize for remote browse hits (pla, Result of requesting materialization. ``job`` is ``None`` when the track is, Persist a placeholder for a remote browse hit. Idempotent: a hit already, Kick off (or report on) materializing a placeholder track. Already-loca
### Community 74 - "CI Docker Publish Workflow"
Cohesion: 0.29
Nodes (8): Docker Buildx, dockerfiles/Dockerfile.prod, Gitea container registry, build job (Docker Build & Publish), cleanup job (Prune old image versions), KEEP_VERSIONS env (retention policy), push job (Docker Build & Publish), Build (Docker) section
### Community 75 - "User Scrobbling Settings"
Cohesion: 0.43
Nodes (6): get_scrobbling_settings(), get_settings(), Any, User settings endpoints, including scrobbling configuration., set_scrobbling_settings(), update_settings()
### Community 76 - "Domain Invariants (dedup, manual overwrite, offline tags)"
Cohesion: 0.29
Nodes (7): Invariant: dedup on (source, source_id) and acoustid_fingerprint, Invariant: no heavy work in the request cycle (goes to arq workers), Invariant: never overwrite metadata_status=manual, Sources & importing music (source backends, local backend), acoustid_trust_score (trust high-confidence AcoustID over junk tags), Offline tag reader (deterministic, always runs), scarlet_fire_otis_mcdonald.mp3 test fixture
### Community 77 - "Alembic Migration Environment"
Cohesion: 0.40
Nodes (4): Alembic environment — async, settings-driven, model-aware. The DB URL comes fro, _run_migrations(), run_migrations_online(), Connection
### Community 79 - "Health Endpoint Smoke Tests"
Cohesion: 0.47
Nodes (5): AsyncClient, Smoke tests for the health endpoints., test_correlation_id_echoed(), test_liveness_ok(), test_readiness_reports_checks()
### Community 80 - "ASGI Middleware Protocol"
Cohesion: 0.50
Nodes (3): Receive, Scope, Send
### Community 81 - "File Hashing Utilities"
Cohesion: 0.50
Nodes (3): Path, File hashing utilities., sha256_of_file()
## Ambiguous Edges - Review These
- `build job (Docker Build & Publish)` → `Build (Docker) section` [AMBIGUOUS]
README.md · relation: conceptually_related_to
- `Composition roots (app/main.py, app/api/deps.py)` → `Migrations convention (async, settings-driven Alembic)` [AMBIGUOUS]
CLAUDE.md · relation: references
## Knowledge Gaps
- **16 isolated node(s):** `WorkerSettings`, `KEEP_VERSIONS env (retention policy)`, `dockerfiles/Dockerfile.prod`, `Docker Buildx`, `app/application — use cases / services` (+11 more)
These have ≤1 connection - possible missing edges or undocumented components.
- **25 thin communities (<3 nodes) omitted from report** — run `graphify query` to explore isolated nodes.
## Suggested Questions
_Questions this graph is uniquely positioned to answer:_
- **What is the exact relationship between `build job (Docker Build & Publish)` and `Build (Docker) section`?**
_Edge tagged AMBIGUOUS (relation: conceptually_related_to) - confidence is low._
- **What is the exact relationship between `Composition roots (app/main.py, app/api/deps.py)` and `Migrations convention (async, settings-driven Alembic)`?**
_Edge tagged AMBIGUOUS (relation: references) - confidence is low._
- **Why does `NotFoundError` connect `Artist Schemas & Endpoints` to `Error Mapping & Search Schemas`, `Download Service Orchestration`, `Playlist Schemas & API`, `ORM Base & Models`, `Auth Services (native + Subsonic)`, `Library Stats & Track Availability`, `Album/Search Response Schemas`, `Pagination & Likes Endpoints`, `Subsonic ID Encoding`, `Source Port Protocols`, `User Management Service`, `Download Service Tests`, `Credentials & User Repository`, `Streaming Auth Dependencies`, `Subsonic Browsing Endpoints`, `Remote Library Service Tests`, `Worker Session Scope & Download Task`, `Subsonic App-Password Crypto`, `Playlist Endpoints`, `Shared Query Param Annotations`, `Track Metadata Match Schemas`, `Cover Art Serving`, `Play History Schemas`, `Subsonic Legacy Password Decoding`, `Generic Job/Result Store Protocol`, `Remote Library Materialization`?**
_High betweenness centrality (0.119) - this node is a cross-community bridge._
- **Why does `get_settings()` connect `Correlation ID Middleware & Config` to `Auth Schemas & Tokens`, `Error Mapping & Search Schemas`, `Downloads API Tests`, `Storage Stats API Tests`, `Settings & MusicBrainz User-Agent`, `Subsonic API Integration Tests`, `Dependency Wiring (deps.py)`, `Alembic Migration Environment`, `DB Engine Lifecycle`, `Chromaprint Fingerprinting`, `Auth API Integration Tests`, `Cover API Tests`, `Upload/Stream API Tests`, `Metadata API Tests`, `DB Session & Health Checks`, `Sources API Tests`, `Worker Session Scope & Download Task`?**
_High betweenness centrality (0.055) - this node is a cross-community bridge._
- **Why does `UserService` connect `User Management Service` to `Downloads API Tests`, `Storage Stats API Tests`, `In-Memory Auth Repository Fakes`, `Artist Schemas & Endpoints`, `Auth Services (native + Subsonic)`, `Subsonic API Integration Tests`, `Dependency Wiring (deps.py)`, `DB Engine Lifecycle`, `Auth API Integration Tests`, `Cover API Tests`, `Upload/Stream API Tests`, `Metadata API Tests`, `Streaming Auth Dependencies`, `Management CLI`, `Sources API Tests`?**
_High betweenness centrality (0.040) - this node is a cross-community bridge._
- **Are the 22 inferred relationships involving `NotFoundError` (e.g. with `IdKind` and `DownloadRequest`) actually correct?**
_`NotFoundError` has 22 INFERRED edges - model-reasoned connections that need verification._
- **Are the 7 inferred relationships involving `UserService` (e.g. with `AlreadyExistsError` and `AuthenticationError`) actually correct?**
_`UserService` has 7 INFERRED edges - model-reasoned connections that need verification._
@@ -0,0 +1 @@
{"nodes": [{"id": "users_senko_work_mcma_compose_mcma_backend_app_core_init_py", "label": "__init__.py", "file_type": "code", "source_file": "app/core/__init__.py", "source_location": "L1"}, {"id": "users_senko_work_mcma_compose_mcma_backend_app_core_init_rationale_1", "label": "Cross-cutting concerns: configuration, logging, security.", "file_type": "rationale", "source_file": "app/core/__init__.py", "source_location": "L1"}], "edges": [{"source": "users_senko_work_mcma_compose_mcma_backend_app_core_init_rationale_1", "target": "users_senko_work_mcma_compose_mcma_backend_app_core_init_py", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "app/core/__init__.py", "source_location": "L1", "weight": 1.0}], "raw_calls": []}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
{"nodes": [{"id": "users_senko_work_mcma_compose_mcma_backend_app_domain_entities_metadata_py", "label": "metadata.py", "file_type": "code", "source_file": "app/domain/entities/metadata.py", "source_location": "L1"}, {"id": "users_senko_work_mcma_compose_mcma_backend_app_domain_entities_metadata_audiotags", "label": "AudioTags", "file_type": "code", "source_file": "app/domain/entities/metadata.py", "source_location": "L11", "_callable": true}, {"id": "users_senko_work_mcma_compose_mcma_backend_app_domain_entities_metadata_fingerprint", "label": "Fingerprint", "file_type": "code", "source_file": "app/domain/entities/metadata.py", "source_location": "L30", "_callable": true}, {"id": "users_senko_work_mcma_compose_mcma_backend_app_domain_entities_metadata_recordingmatch", "label": "RecordingMatch", "file_type": "code", "source_file": "app/domain/entities/metadata.py", "source_location": "L38", "_callable": true}, {"id": "users_senko_work_mcma_compose_mcma_backend_app_domain_entities_metadata_rationale_1", "label": "Value objects for the metadata-enrichment pipeline (plan \u00a76.2). Pure data carri", "file_type": "rationale", "source_file": "app/domain/entities/metadata.py", "source_location": "L1"}, {"id": "users_senko_work_mcma_compose_mcma_backend_app_domain_entities_metadata_rationale_12", "label": "Embedded tags read from the file itself (ID3 / Vorbis / MP4 \u2026). Every field", "file_type": "rationale", "source_file": "app/domain/entities/metadata.py", "source_location": "L12"}, {"id": "users_senko_work_mcma_compose_mcma_backend_app_domain_entities_metadata_rationale_31", "label": "Chromaprint fingerprint plus the decoded duration (both needed by AcoustID).", "file_type": "rationale", "source_file": "app/domain/entities/metadata.py", "source_location": "L31"}, {"id": "users_senko_work_mcma_compose_mcma_backend_app_domain_entities_metadata_rationale_39", "label": "A single AcoustID result, flattened to the fields enrichment cares about. `", "file_type": "rationale", "source_file": "app/domain/entities/metadata.py", "source_location": "L39"}], "edges": [{"source": "users_senko_work_mcma_compose_mcma_backend_app_domain_entities_metadata_py", "target": "dataclasses", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "app/domain/entities/metadata.py", "source_location": "L7", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_domain_entities_metadata_py", "target": "users_senko_work_mcma_compose_mcma_backend_app_domain_entities_metadata_audiotags", "relation": "contains", "confidence": "EXTRACTED", "source_file": "app/domain/entities/metadata.py", "source_location": "L11", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_domain_entities_metadata_py", "target": "users_senko_work_mcma_compose_mcma_backend_app_domain_entities_metadata_fingerprint", "relation": "contains", "confidence": "EXTRACTED", "source_file": "app/domain/entities/metadata.py", "source_location": "L30", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_domain_entities_metadata_py", "target": "users_senko_work_mcma_compose_mcma_backend_app_domain_entities_metadata_recordingmatch", "relation": "contains", "confidence": "EXTRACTED", "source_file": "app/domain/entities/metadata.py", "source_location": "L38", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_domain_entities_metadata_rationale_1", "target": "users_senko_work_mcma_compose_mcma_backend_app_domain_entities_metadata_py", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "app/domain/entities/metadata.py", "source_location": "L1", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_domain_entities_metadata_rationale_12", "target": "users_senko_work_mcma_compose_mcma_backend_app_domain_entities_metadata_audiotags", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "app/domain/entities/metadata.py", "source_location": "L12", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_domain_entities_metadata_rationale_31", "target": "users_senko_work_mcma_compose_mcma_backend_app_domain_entities_metadata_fingerprint", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "app/domain/entities/metadata.py", "source_location": "L31", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_domain_entities_metadata_rationale_39", "target": "users_senko_work_mcma_compose_mcma_backend_app_domain_entities_metadata_recordingmatch", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "app/domain/entities/metadata.py", "source_location": "L39", "weight": 1.0}], "raw_calls": []}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
{"nodes": [{"id": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_db_models_artist_py", "label": "artist.py", "file_type": "code", "source_file": "app/infrastructure/db/models/artist.py", "source_location": "L1"}, {"id": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_db_models_artist_artistmodel", "label": "ArtistModel", "file_type": "code", "source_file": "app/infrastructure/db/models/artist.py", "source_location": "L10", "_callable": true}, {"id": "uuidprimarykeymixin", "label": "UUIDPrimaryKeyMixin", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/senko/Work/mcma-compose/mcma-backend/app/infrastructure/db/models/artist.py"}, {"id": "timestampmixin", "label": "TimestampMixin", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/senko/Work/mcma-compose/mcma-backend/app/infrastructure/db/models/artist.py"}, {"id": "base", "label": "Base", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/senko/Work/mcma-compose/mcma-backend/app/infrastructure/db/models/artist.py"}, {"id": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_db_models_artist_rationale_1", "label": "ORM model for artists.", "file_type": "rationale", "source_file": "app/infrastructure/db/models/artist.py", "source_location": "L1"}], "edges": [{"source": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_db_models_artist_py", "target": "sqlalchemy", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "app/infrastructure/db/models/artist.py", "source_location": "L3", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_db_models_artist_py", "target": "sqlalchemy_orm", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "app/infrastructure/db/models/artist.py", "source_location": "L4", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_db_models_artist_py", "target": "app_infrastructure_db_base", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "app/infrastructure/db/models/artist.py", "source_location": "L6", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_db_models_artist_py", "target": "app_infrastructure_db_models_mixins", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "app/infrastructure/db/models/artist.py", "source_location": "L7", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_db_models_artist_py", "target": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_db_models_artist_artistmodel", "relation": "contains", "confidence": "EXTRACTED", "source_file": "app/infrastructure/db/models/artist.py", "source_location": "L10", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_db_models_artist_artistmodel", "target": "uuidprimarykeymixin", "relation": "inherits", "confidence": "EXTRACTED", "source_file": "app/infrastructure/db/models/artist.py", "source_location": "L10", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_db_models_artist_artistmodel", "target": "timestampmixin", "relation": "inherits", "confidence": "EXTRACTED", "source_file": "app/infrastructure/db/models/artist.py", "source_location": "L10", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_db_models_artist_artistmodel", "target": "base", "relation": "inherits", "confidence": "EXTRACTED", "source_file": "app/infrastructure/db/models/artist.py", "source_location": "L10", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_db_models_artist_rationale_1", "target": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_db_models_artist_py", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "app/infrastructure/db/models/artist.py", "source_location": "L1", "weight": 1.0}], "raw_calls": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "users_senko_work_mcma_compose_mcma_backend_app_core_hashing_py", "label": "hashing.py", "file_type": "code", "source_file": "app/core/hashing.py", "source_location": "L1"}, {"id": "users_senko_work_mcma_compose_mcma_backend_app_core_hashing_sha256_of_file", "label": "sha256_of_file()", "file_type": "code", "source_file": "app/core/hashing.py", "source_location": "L7", "_callable": true}, {"id": "path", "label": "Path", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/senko/Work/mcma-compose/mcma-backend/app/core/hashing.py"}, {"id": "users_senko_work_mcma_compose_mcma_backend_app_core_hashing_rationale_1", "label": "File hashing utilities.", "file_type": "rationale", "source_file": "app/core/hashing.py", "source_location": "L1"}], "edges": [{"source": "users_senko_work_mcma_compose_mcma_backend_app_core_hashing_py", "target": "hashlib", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "app/core/hashing.py", "source_location": "L3", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_core_hashing_py", "target": "pathlib", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "app/core/hashing.py", "source_location": "L4", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_core_hashing_py", "target": "users_senko_work_mcma_compose_mcma_backend_app_core_hashing_sha256_of_file", "relation": "contains", "confidence": "EXTRACTED", "source_file": "app/core/hashing.py", "source_location": "L7", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_core_hashing_sha256_of_file", "target": "path", "relation": "references", "context": "parameter_type", "confidence": "EXTRACTED", "source_file": "app/core/hashing.py", "source_location": "L7", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_core_hashing_rationale_1", "target": "users_senko_work_mcma_compose_mcma_backend_app_core_hashing_py", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "app/core/hashing.py", "source_location": "L1", "weight": 1.0}], "raw_calls": [{"caller_nid": "users_senko_work_mcma_compose_mcma_backend_app_core_hashing_sha256_of_file", "callee": "sha256", "is_member_call": true, "source_file": "app/core/hashing.py", "source_location": "L8", "receiver": "hashlib"}, {"caller_nid": "users_senko_work_mcma_compose_mcma_backend_app_core_hashing_sha256_of_file", "callee": "read", "is_member_call": true, "source_file": "app/core/hashing.py", "source_location": "L10", "receiver": "f"}, {"caller_nid": "users_senko_work_mcma_compose_mcma_backend_app_core_hashing_sha256_of_file", "callee": "update", "is_member_call": true, "source_file": "app/core/hashing.py", "source_location": "L11", "receiver": "h"}, {"caller_nid": "users_senko_work_mcma_compose_mcma_backend_app_core_hashing_sha256_of_file", "callee": "hexdigest", "is_member_call": true, "source_file": "app/core/hashing.py", "source_location": "L12", "receiver": "h"}]}
@@ -0,0 +1 @@
{"nodes": [{"id": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_cache_init_py", "label": "__init__.py", "file_type": "code", "source_file": "app/infrastructure/cache/__init__.py", "source_location": "L1"}, {"id": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_cache_init_rationale_1", "label": "Redis adapter: shared connection pool for cache and arq broker.", "file_type": "rationale", "source_file": "app/infrastructure/cache/__init__.py", "source_location": "L1"}], "edges": [{"source": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_cache_init_py", "target": "app_infrastructure_cache_redis", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "app/infrastructure/cache/__init__.py", "source_location": "L3", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_cache_init_rationale_1", "target": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_cache_init_py", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "app/infrastructure/cache/__init__.py", "source_location": "L1", "weight": 1.0}], "raw_calls": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_db_models_like_py", "label": "like.py", "file_type": "code", "source_file": "app/infrastructure/db/models/like.py", "source_location": "L1"}, {"id": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_db_models_like_likemodel", "label": "LikeModel", "file_type": "code", "source_file": "app/infrastructure/db/models/like.py", "source_location": "L19", "_callable": true}, {"id": "uuidprimarykeymixin", "label": "UUIDPrimaryKeyMixin", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/senko/Work/mcma-compose/mcma-backend/app/infrastructure/db/models/like.py"}, {"id": "base", "label": "Base", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/senko/Work/mcma-compose/mcma-backend/app/infrastructure/db/models/like.py"}, {"id": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_db_models_like_rationale_1", "label": "ORM model for likes \u2014 an append-only event log. A like/dislike is **never** upd", "file_type": "rationale", "source_file": "app/infrastructure/db/models/like.py", "source_location": "L1"}], "edges": [{"source": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_db_models_like_py", "target": "datetime", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "app/infrastructure/db/models/like.py", "source_location": "L9", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_db_models_like_py", "target": "uuid", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "app/infrastructure/db/models/like.py", "source_location": "L10", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_db_models_like_py", "target": "sqlalchemy", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "app/infrastructure/db/models/like.py", "source_location": "L12", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_db_models_like_py", "target": "sqlalchemy_orm", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "app/infrastructure/db/models/like.py", "source_location": "L13", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_db_models_like_py", "target": "app_infrastructure_db_base", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "app/infrastructure/db/models/like.py", "source_location": "L15", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_db_models_like_py", "target": "app_infrastructure_db_models_mixins", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "app/infrastructure/db/models/like.py", "source_location": "L16", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_db_models_like_py", "target": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_db_models_like_likemodel", "relation": "contains", "confidence": "EXTRACTED", "source_file": "app/infrastructure/db/models/like.py", "source_location": "L19", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_db_models_like_likemodel", "target": "uuidprimarykeymixin", "relation": "inherits", "confidence": "EXTRACTED", "source_file": "app/infrastructure/db/models/like.py", "source_location": "L19", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_db_models_like_likemodel", "target": "base", "relation": "inherits", "confidence": "EXTRACTED", "source_file": "app/infrastructure/db/models/like.py", "source_location": "L19", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_db_models_like_rationale_1", "target": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_db_models_like_py", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "app/infrastructure/db/models/like.py", "source_location": "L1", "weight": 1.0}], "raw_calls": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "users_senko_work_mcma_compose_mcma_backend_app_domain_entities_playlist_py", "label": "playlist.py", "file_type": "code", "source_file": "app/domain/entities/playlist.py", "source_location": "L1"}, {"id": "users_senko_work_mcma_compose_mcma_backend_app_domain_entities_playlist_playlist", "label": "Playlist", "file_type": "code", "source_file": "app/domain/entities/playlist.py", "source_location": "L9", "_callable": true}, {"id": "users_senko_work_mcma_compose_mcma_backend_app_domain_entities_playlist_rationale_1", "label": "Playlist domain entity.", "file_type": "rationale", "source_file": "app/domain/entities/playlist.py", "source_location": "L1"}], "edges": [{"source": "users_senko_work_mcma_compose_mcma_backend_app_domain_entities_playlist_py", "target": "datetime", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "app/domain/entities/playlist.py", "source_location": "L3", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_domain_entities_playlist_py", "target": "uuid", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "app/domain/entities/playlist.py", "source_location": "L4", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_domain_entities_playlist_py", "target": "dataclasses", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "app/domain/entities/playlist.py", "source_location": "L5", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_domain_entities_playlist_py", "target": "users_senko_work_mcma_compose_mcma_backend_app_domain_entities_playlist_playlist", "relation": "contains", "confidence": "EXTRACTED", "source_file": "app/domain/entities/playlist.py", "source_location": "L9", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_domain_entities_playlist_rationale_1", "target": "users_senko_work_mcma_compose_mcma_backend_app_domain_entities_playlist_py", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "app/domain/entities/playlist.py", "source_location": "L1", "weight": 1.0}], "raw_calls": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "users_senko_work_mcma_compose_mcma_backend_alembic_versions_20260608_1200_subsonic_app_password_py", "label": "20260608_1200-subsonic_app_password.py", "file_type": "code", "source_file": "alembic/versions/20260608_1200-subsonic_app_password.py", "source_location": "L1"}, {"id": "users_senko_work_mcma_compose_mcma_backend_alembic_versions_20260608_1200_subsonic_app_password_upgrade", "label": "upgrade()", "file_type": "code", "source_file": "alembic/versions/20260608_1200-subsonic_app_password.py", "source_location": "L24", "_callable": true}, {"id": "users_senko_work_mcma_compose_mcma_backend_alembic_versions_20260608_1200_subsonic_app_password_downgrade", "label": "downgrade()", "file_type": "code", "source_file": "alembic/versions/20260608_1200-subsonic_app_password.py", "source_location": "L31", "_callable": true}], "edges": [{"source": "users_senko_work_mcma_compose_mcma_backend_alembic_versions_20260608_1200_subsonic_app_password_py", "target": "collections_abc", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "alembic/versions/20260608_1200-subsonic_app_password.py", "source_location": "L13", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_alembic_versions_20260608_1200_subsonic_app_password_py", "target": "sqlalchemy", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "alembic/versions/20260608_1200-subsonic_app_password.py", "source_location": "L15", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_alembic_versions_20260608_1200_subsonic_app_password_py", "target": "alembic", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "alembic/versions/20260608_1200-subsonic_app_password.py", "source_location": "L16", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_alembic_versions_20260608_1200_subsonic_app_password_py", "target": "users_senko_work_mcma_compose_mcma_backend_alembic_versions_20260608_1200_subsonic_app_password_upgrade", "relation": "contains", "confidence": "EXTRACTED", "source_file": "alembic/versions/20260608_1200-subsonic_app_password.py", "source_location": "L24", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_alembic_versions_20260608_1200_subsonic_app_password_py", "target": "users_senko_work_mcma_compose_mcma_backend_alembic_versions_20260608_1200_subsonic_app_password_downgrade", "relation": "contains", "confidence": "EXTRACTED", "source_file": "alembic/versions/20260608_1200-subsonic_app_password.py", "source_location": "L31", "weight": 1.0}], "raw_calls": [{"caller_nid": "users_senko_work_mcma_compose_mcma_backend_alembic_versions_20260608_1200_subsonic_app_password_upgrade", "callee": "add_column", "is_member_call": true, "source_file": "alembic/versions/20260608_1200-subsonic_app_password.py", "source_location": "L25", "receiver": "op"}, {"caller_nid": "users_senko_work_mcma_compose_mcma_backend_alembic_versions_20260608_1200_subsonic_app_password_upgrade", "callee": "Column", "is_member_call": true, "source_file": "alembic/versions/20260608_1200-subsonic_app_password.py", "source_location": "L27", "receiver": "sa"}, {"caller_nid": "users_senko_work_mcma_compose_mcma_backend_alembic_versions_20260608_1200_subsonic_app_password_downgrade", "callee": "drop_column", "is_member_call": true, "source_file": "alembic/versions/20260608_1200-subsonic_app_password.py", "source_location": "L32", "receiver": "op"}]}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
{"nodes": [{"id": "users_senko_work_mcma_compose_mcma_backend_app_api_schemas_upload_py", "label": "upload.py", "file_type": "code", "source_file": "app/api/schemas/upload.py", "source_location": "L1"}, {"id": "users_senko_work_mcma_compose_mcma_backend_app_api_schemas_upload_uploadresponse", "label": "UploadResponse", "file_type": "code", "source_file": "app/api/schemas/upload.py", "source_location": "L8", "_callable": true}, {"id": "basemodel", "label": "BaseModel", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/senko/Work/mcma-compose/mcma-backend/app/api/schemas/upload.py"}, {"id": "users_senko_work_mcma_compose_mcma_backend_app_api_schemas_upload_rationale_1", "label": "Schemas for upload responses.", "file_type": "rationale", "source_file": "app/api/schemas/upload.py", "source_location": "L1"}], "edges": [{"source": "users_senko_work_mcma_compose_mcma_backend_app_api_schemas_upload_py", "target": "uuid", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "app/api/schemas/upload.py", "source_location": "L3", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_api_schemas_upload_py", "target": "pydantic", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "app/api/schemas/upload.py", "source_location": "L5", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_api_schemas_upload_py", "target": "users_senko_work_mcma_compose_mcma_backend_app_api_schemas_upload_uploadresponse", "relation": "contains", "confidence": "EXTRACTED", "source_file": "app/api/schemas/upload.py", "source_location": "L8", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_api_schemas_upload_uploadresponse", "target": "basemodel", "relation": "inherits", "confidence": "EXTRACTED", "source_file": "app/api/schemas/upload.py", "source_location": "L8", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_api_schemas_upload_rationale_1", "target": "users_senko_work_mcma_compose_mcma_backend_app_api_schemas_upload_py", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "app/api/schemas/upload.py", "source_location": "L1", "weight": 1.0}], "raw_calls": []}
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
{"nodes": [{"id": "users_senko_work_mcma_compose_mcma_backend_alembic_versions_20260614_1000_download_job_track_id_py", "label": "20260614_1000-download_job_track_id.py", "file_type": "code", "source_file": "alembic/versions/20260614_1000-download_job_track_id.py", "source_location": "L1"}, {"id": "users_senko_work_mcma_compose_mcma_backend_alembic_versions_20260614_1000_download_job_track_id_upgrade", "label": "upgrade()", "file_type": "code", "source_file": "alembic/versions/20260614_1000-download_job_track_id.py", "source_location": "L26", "_callable": true}, {"id": "users_senko_work_mcma_compose_mcma_backend_alembic_versions_20260614_1000_download_job_track_id_downgrade", "label": "downgrade()", "file_type": "code", "source_file": "alembic/versions/20260614_1000-download_job_track_id.py", "source_location": "L41", "_callable": true}], "edges": [{"source": "users_senko_work_mcma_compose_mcma_backend_alembic_versions_20260614_1000_download_job_track_id_py", "target": "collections_abc", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "alembic/versions/20260614_1000-download_job_track_id.py", "source_location": "L15", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_alembic_versions_20260614_1000_download_job_track_id_py", "target": "sqlalchemy", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "alembic/versions/20260614_1000-download_job_track_id.py", "source_location": "L17", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_alembic_versions_20260614_1000_download_job_track_id_py", "target": "alembic", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "alembic/versions/20260614_1000-download_job_track_id.py", "source_location": "L18", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_alembic_versions_20260614_1000_download_job_track_id_py", "target": "users_senko_work_mcma_compose_mcma_backend_alembic_versions_20260614_1000_download_job_track_id_upgrade", "relation": "contains", "confidence": "EXTRACTED", "source_file": "alembic/versions/20260614_1000-download_job_track_id.py", "source_location": "L26", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_alembic_versions_20260614_1000_download_job_track_id_py", "target": "users_senko_work_mcma_compose_mcma_backend_alembic_versions_20260614_1000_download_job_track_id_downgrade", "relation": "contains", "confidence": "EXTRACTED", "source_file": "alembic/versions/20260614_1000-download_job_track_id.py", "source_location": "L41", "weight": 1.0}], "raw_calls": [{"caller_nid": "users_senko_work_mcma_compose_mcma_backend_alembic_versions_20260614_1000_download_job_track_id_upgrade", "callee": "add_column", "is_member_call": true, "source_file": "alembic/versions/20260614_1000-download_job_track_id.py", "source_location": "L27", "receiver": "op"}, {"caller_nid": "users_senko_work_mcma_compose_mcma_backend_alembic_versions_20260614_1000_download_job_track_id_upgrade", "callee": "Column", "is_member_call": true, "source_file": "alembic/versions/20260614_1000-download_job_track_id.py", "source_location": "L29", "receiver": "sa"}, {"caller_nid": "users_senko_work_mcma_compose_mcma_backend_alembic_versions_20260614_1000_download_job_track_id_upgrade", "callee": "Uuid", "is_member_call": true, "source_file": "alembic/versions/20260614_1000-download_job_track_id.py", "source_location": "L29", "receiver": "sa"}, {"caller_nid": "users_senko_work_mcma_compose_mcma_backend_alembic_versions_20260614_1000_download_job_track_id_upgrade", "callee": "create_foreign_key", "is_member_call": true, "source_file": "alembic/versions/20260614_1000-download_job_track_id.py", "source_location": "L31", "receiver": "op"}, {"caller_nid": "users_senko_work_mcma_compose_mcma_backend_alembic_versions_20260614_1000_download_job_track_id_upgrade", "callee": "f", "is_member_call": true, "source_file": "alembic/versions/20260614_1000-download_job_track_id.py", "source_location": "L32", "receiver": "op"}, {"caller_nid": "users_senko_work_mcma_compose_mcma_backend_alembic_versions_20260614_1000_download_job_track_id_downgrade", "callee": "drop_constraint", "is_member_call": true, "source_file": "alembic/versions/20260614_1000-download_job_track_id.py", "source_location": "L42", "receiver": "op"}, {"caller_nid": "users_senko_work_mcma_compose_mcma_backend_alembic_versions_20260614_1000_download_job_track_id_downgrade", "callee": "f", "is_member_call": true, "source_file": "alembic/versions/20260614_1000-download_job_track_id.py", "source_location": "L43", "receiver": "op"}, {"caller_nid": "users_senko_work_mcma_compose_mcma_backend_alembic_versions_20260614_1000_download_job_track_id_downgrade", "callee": "drop_column", "is_member_call": true, "source_file": "alembic/versions/20260614_1000-download_job_track_id.py", "source_location": "L47", "receiver": "op"}]}
@@ -0,0 +1 @@
{"nodes": [{"id": "users_senko_work_mcma_compose_mcma_backend_app_api_schemas_history_py", "label": "history.py", "file_type": "code", "source_file": "app/api/schemas/history.py", "source_location": "L1"}, {"id": "users_senko_work_mcma_compose_mcma_backend_app_api_schemas_history_historyin", "label": "HistoryIn", "file_type": "code", "source_file": "app/api/schemas/history.py", "source_location": "L9", "_callable": true}, {"id": "basemodel", "label": "BaseModel", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/senko/Work/mcma-compose/mcma-backend/app/api/schemas/history.py"}, {"id": "users_senko_work_mcma_compose_mcma_backend_app_api_schemas_history_historyout", "label": "HistoryOut", "file_type": "code", "source_file": "app/api/schemas/history.py", "source_location": "L16", "_callable": true}, {"id": "users_senko_work_mcma_compose_mcma_backend_app_api_schemas_history_rationale_1", "label": "Play history request/response schemas.", "file_type": "rationale", "source_file": "app/api/schemas/history.py", "source_location": "L1"}], "edges": [{"source": "users_senko_work_mcma_compose_mcma_backend_app_api_schemas_history_py", "target": "datetime", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "app/api/schemas/history.py", "source_location": "L3", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_api_schemas_history_py", "target": "uuid", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "app/api/schemas/history.py", "source_location": "L4", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_api_schemas_history_py", "target": "pydantic", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "app/api/schemas/history.py", "source_location": "L6", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_api_schemas_history_py", "target": "users_senko_work_mcma_compose_mcma_backend_app_api_schemas_history_historyin", "relation": "contains", "confidence": "EXTRACTED", "source_file": "app/api/schemas/history.py", "source_location": "L9", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_api_schemas_history_historyin", "target": "basemodel", "relation": "inherits", "confidence": "EXTRACTED", "source_file": "app/api/schemas/history.py", "source_location": "L9", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_api_schemas_history_py", "target": "users_senko_work_mcma_compose_mcma_backend_app_api_schemas_history_historyout", "relation": "contains", "confidence": "EXTRACTED", "source_file": "app/api/schemas/history.py", "source_location": "L16", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_api_schemas_history_historyout", "target": "basemodel", "relation": "inherits", "confidence": "EXTRACTED", "source_file": "app/api/schemas/history.py", "source_location": "L16", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_api_schemas_history_rationale_1", "target": "users_senko_work_mcma_compose_mcma_backend_app_api_schemas_history_py", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "app/api/schemas/history.py", "source_location": "L1", "weight": 1.0}], "raw_calls": []}
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
{"nodes": [{"id": "users_senko_work_mcma_compose_mcma_backend_alembic_versions_20260608_1132_rename_track_file_path_to_storage_uri_py", "label": "20260608_1132-rename_track_file_path_to_storage_uri.py", "file_type": "code", "source_file": "alembic/versions/20260608_1132-rename_track_file_path_to_storage_uri.py", "source_location": "L1"}, {"id": "users_senko_work_mcma_compose_mcma_backend_alembic_versions_20260608_1132_rename_track_file_path_to_storage_uri_upgrade", "label": "upgrade()", "file_type": "code", "source_file": "alembic/versions/20260608_1132-rename_track_file_path_to_storage_uri.py", "source_location": "L20", "_callable": true}, {"id": "users_senko_work_mcma_compose_mcma_backend_alembic_versions_20260608_1132_rename_track_file_path_to_storage_uri_downgrade", "label": "downgrade()", "file_type": "code", "source_file": "alembic/versions/20260608_1132-rename_track_file_path_to_storage_uri.py", "source_location": "L24", "_callable": true}], "edges": [{"source": "users_senko_work_mcma_compose_mcma_backend_alembic_versions_20260608_1132_rename_track_file_path_to_storage_uri_py", "target": "collections_abc", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "alembic/versions/20260608_1132-rename_track_file_path_to_storage_uri.py", "source_location": "L10", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_alembic_versions_20260608_1132_rename_track_file_path_to_storage_uri_py", "target": "alembic", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "alembic/versions/20260608_1132-rename_track_file_path_to_storage_uri.py", "source_location": "L12", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_alembic_versions_20260608_1132_rename_track_file_path_to_storage_uri_py", "target": "users_senko_work_mcma_compose_mcma_backend_alembic_versions_20260608_1132_rename_track_file_path_to_storage_uri_upgrade", "relation": "contains", "confidence": "EXTRACTED", "source_file": "alembic/versions/20260608_1132-rename_track_file_path_to_storage_uri.py", "source_location": "L20", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_alembic_versions_20260608_1132_rename_track_file_path_to_storage_uri_py", "target": "users_senko_work_mcma_compose_mcma_backend_alembic_versions_20260608_1132_rename_track_file_path_to_storage_uri_downgrade", "relation": "contains", "confidence": "EXTRACTED", "source_file": "alembic/versions/20260608_1132-rename_track_file_path_to_storage_uri.py", "source_location": "L24", "weight": 1.0}], "raw_calls": [{"caller_nid": "users_senko_work_mcma_compose_mcma_backend_alembic_versions_20260608_1132_rename_track_file_path_to_storage_uri_upgrade", "callee": "alter_column", "is_member_call": true, "source_file": "alembic/versions/20260608_1132-rename_track_file_path_to_storage_uri.py", "source_location": "L21", "receiver": "op"}, {"caller_nid": "users_senko_work_mcma_compose_mcma_backend_alembic_versions_20260608_1132_rename_track_file_path_to_storage_uri_downgrade", "callee": "alter_column", "is_member_call": true, "source_file": "alembic/versions/20260608_1132-rename_track_file_path_to_storage_uri.py", "source_location": "L25", "receiver": "op"}]}
@@ -0,0 +1 @@
{"nodes": [{"id": "users_senko_work_mcma_compose_mcma_backend_app_domain_entities_track_py", "label": "track.py", "file_type": "code", "source_file": "app/domain/entities/track.py", "source_location": "L1"}, {"id": "users_senko_work_mcma_compose_mcma_backend_app_domain_entities_track_artist", "label": "Artist", "file_type": "code", "source_file": "app/domain/entities/track.py", "source_location": "L9", "_callable": true}, {"id": "users_senko_work_mcma_compose_mcma_backend_app_domain_entities_track_track", "label": "Track", "file_type": "code", "source_file": "app/domain/entities/track.py", "source_location": "L19", "_callable": true}, {"id": "users_senko_work_mcma_compose_mcma_backend_app_domain_entities_track_rationale_1", "label": "Track and Artist domain entities.", "file_type": "rationale", "source_file": "app/domain/entities/track.py", "source_location": "L1"}], "edges": [{"source": "users_senko_work_mcma_compose_mcma_backend_app_domain_entities_track_py", "target": "datetime", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "app/domain/entities/track.py", "source_location": "L3", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_domain_entities_track_py", "target": "uuid", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "app/domain/entities/track.py", "source_location": "L4", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_domain_entities_track_py", "target": "dataclasses", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "app/domain/entities/track.py", "source_location": "L5", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_domain_entities_track_py", "target": "users_senko_work_mcma_compose_mcma_backend_app_domain_entities_track_artist", "relation": "contains", "confidence": "EXTRACTED", "source_file": "app/domain/entities/track.py", "source_location": "L9", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_domain_entities_track_py", "target": "users_senko_work_mcma_compose_mcma_backend_app_domain_entities_track_track", "relation": "contains", "confidence": "EXTRACTED", "source_file": "app/domain/entities/track.py", "source_location": "L19", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_domain_entities_track_rationale_1", "target": "users_senko_work_mcma_compose_mcma_backend_app_domain_entities_track_py", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "app/domain/entities/track.py", "source_location": "L1", "weight": 1.0}], "raw_calls": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "users_senko_work_mcma_compose_mcma_backend_app_api_v1_sync_py", "label": "sync.py", "file_type": "code", "source_file": "app/api/v1/sync.py", "source_location": "L1"}, {"id": "users_senko_work_mcma_compose_mcma_backend_app_api_v1_sync_get_changes", "label": "get_changes()", "file_type": "code", "source_file": "app/api/v1/sync.py", "source_location": "L11", "_callable": true}, {"id": "any", "label": "Any", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/senko/Work/mcma-compose/mcma-backend/app/api/v1/sync.py"}, {"id": "users_senko_work_mcma_compose_mcma_backend_app_api_v1_sync_push_changes", "label": "push_changes()", "file_type": "code", "source_file": "app/api/v1/sync.py", "source_location": "L15", "_callable": true}, {"id": "users_senko_work_mcma_compose_mcma_backend_app_api_v1_sync_rationale_1", "label": "Client sync endpoints (offline-first event log).", "file_type": "rationale", "source_file": "app/api/v1/sync.py", "source_location": "L1"}], "edges": [{"source": "users_senko_work_mcma_compose_mcma_backend_app_api_v1_sync_py", "target": "typing", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "app/api/v1/sync.py", "source_location": "L3", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_api_v1_sync_py", "target": "fastapi", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "app/api/v1/sync.py", "source_location": "L5", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_api_v1_sync_py", "target": "users_senko_work_mcma_compose_mcma_backend_app_api_v1_sync_get_changes", "relation": "contains", "confidence": "EXTRACTED", "source_file": "app/api/v1/sync.py", "source_location": "L11", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_api_v1_sync_get_changes", "target": "any", "relation": "references", "context": "return_type", "confidence": "EXTRACTED", "source_file": "app/api/v1/sync.py", "source_location": "L11", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_api_v1_sync_py", "target": "users_senko_work_mcma_compose_mcma_backend_app_api_v1_sync_push_changes", "relation": "contains", "confidence": "EXTRACTED", "source_file": "app/api/v1/sync.py", "source_location": "L15", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_api_v1_sync_push_changes", "target": "any", "relation": "references", "context": "return_type", "confidence": "EXTRACTED", "source_file": "app/api/v1/sync.py", "source_location": "L15", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_api_v1_sync_rationale_1", "target": "users_senko_work_mcma_compose_mcma_backend_app_api_v1_sync_py", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "app/api/v1/sync.py", "source_location": "L1", "weight": 1.0}], "raw_calls": []}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
{"nodes": [{"id": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_sources_init_py", "label": "__init__.py", "file_type": "code", "source_file": "app/infrastructure/sources/__init__.py", "source_location": "L1"}, {"id": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_sources_init_rationale_1", "label": "Source backends \u2014 driven adapters that discover/fetch tracks.", "file_type": "rationale", "source_file": "app/infrastructure/sources/__init__.py", "source_location": "L1"}], "edges": [{"source": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_sources_init_rationale_1", "target": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_sources_init_py", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "app/infrastructure/sources/__init__.py", "source_location": "L1", "weight": 1.0}], "raw_calls": []}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
{"nodes": [{"id": "users_senko_work_mcma_compose_mcma_backend_app_domain_entities_like_py", "label": "like.py", "file_type": "code", "source_file": "app/domain/entities/like.py", "source_location": "L1"}, {"id": "users_senko_work_mcma_compose_mcma_backend_app_domain_entities_like_like", "label": "Like", "file_type": "code", "source_file": "app/domain/entities/like.py", "source_location": "L9", "_callable": true}, {"id": "users_senko_work_mcma_compose_mcma_backend_app_domain_entities_like_rationale_1", "label": "Like domain entity \u2014 append-only event log entry.", "file_type": "rationale", "source_file": "app/domain/entities/like.py", "source_location": "L1"}], "edges": [{"source": "users_senko_work_mcma_compose_mcma_backend_app_domain_entities_like_py", "target": "datetime", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "app/domain/entities/like.py", "source_location": "L3", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_domain_entities_like_py", "target": "uuid", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "app/domain/entities/like.py", "source_location": "L4", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_domain_entities_like_py", "target": "dataclasses", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "app/domain/entities/like.py", "source_location": "L5", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_domain_entities_like_py", "target": "users_senko_work_mcma_compose_mcma_backend_app_domain_entities_like_like", "relation": "contains", "confidence": "EXTRACTED", "source_file": "app/domain/entities/like.py", "source_location": "L9", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_domain_entities_like_rationale_1", "target": "users_senko_work_mcma_compose_mcma_backend_app_domain_entities_like_py", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "app/domain/entities/like.py", "source_location": "L1", "weight": 1.0}], "raw_calls": []}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
{"nodes": [{"id": "users_senko_work_mcma_compose_mcma_backend_app_api_schemas_auth_py", "label": "auth.py", "file_type": "code", "source_file": "app/api/schemas/auth.py", "source_location": "L1"}, {"id": "users_senko_work_mcma_compose_mcma_backend_app_api_schemas_auth_loginrequest", "label": "LoginRequest", "file_type": "code", "source_file": "app/api/schemas/auth.py", "source_location": "L8", "_callable": true}, {"id": "basemodel", "label": "BaseModel", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/senko/Work/mcma-compose/mcma-backend/app/api/schemas/auth.py"}, {"id": "users_senko_work_mcma_compose_mcma_backend_app_api_schemas_auth_registerrequest", "label": "RegisterRequest", "file_type": "code", "source_file": "app/api/schemas/auth.py", "source_location": "L13", "_callable": true}, {"id": "users_senko_work_mcma_compose_mcma_backend_app_api_schemas_auth_refreshrequest", "label": "RefreshRequest", "file_type": "code", "source_file": "app/api/schemas/auth.py", "source_location": "L18", "_callable": true}, {"id": "users_senko_work_mcma_compose_mcma_backend_app_api_schemas_auth_tokenresponse", "label": "TokenResponse", "file_type": "code", "source_file": "app/api/schemas/auth.py", "source_location": "L22", "_callable": true}, {"id": "users_senko_work_mcma_compose_mcma_backend_app_api_schemas_auth_rationale_1", "label": "Auth request/response schemas. Tokens are returned in the body (the client store", "file_type": "rationale", "source_file": "app/api/schemas/auth.py", "source_location": "L1"}], "edges": [{"source": "users_senko_work_mcma_compose_mcma_backend_app_api_schemas_auth_py", "target": "pydantic", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "app/api/schemas/auth.py", "source_location": "L5", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_api_schemas_auth_py", "target": "users_senko_work_mcma_compose_mcma_backend_app_api_schemas_auth_loginrequest", "relation": "contains", "confidence": "EXTRACTED", "source_file": "app/api/schemas/auth.py", "source_location": "L8", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_api_schemas_auth_loginrequest", "target": "basemodel", "relation": "inherits", "confidence": "EXTRACTED", "source_file": "app/api/schemas/auth.py", "source_location": "L8", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_api_schemas_auth_py", "target": "users_senko_work_mcma_compose_mcma_backend_app_api_schemas_auth_registerrequest", "relation": "contains", "confidence": "EXTRACTED", "source_file": "app/api/schemas/auth.py", "source_location": "L13", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_api_schemas_auth_registerrequest", "target": "basemodel", "relation": "inherits", "confidence": "EXTRACTED", "source_file": "app/api/schemas/auth.py", "source_location": "L13", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_api_schemas_auth_py", "target": "users_senko_work_mcma_compose_mcma_backend_app_api_schemas_auth_refreshrequest", "relation": "contains", "confidence": "EXTRACTED", "source_file": "app/api/schemas/auth.py", "source_location": "L18", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_api_schemas_auth_refreshrequest", "target": "basemodel", "relation": "inherits", "confidence": "EXTRACTED", "source_file": "app/api/schemas/auth.py", "source_location": "L18", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_api_schemas_auth_py", "target": "users_senko_work_mcma_compose_mcma_backend_app_api_schemas_auth_tokenresponse", "relation": "contains", "confidence": "EXTRACTED", "source_file": "app/api/schemas/auth.py", "source_location": "L22", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_api_schemas_auth_tokenresponse", "target": "basemodel", "relation": "inherits", "confidence": "EXTRACTED", "source_file": "app/api/schemas/auth.py", "source_location": "L22", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_api_schemas_auth_rationale_1", "target": "users_senko_work_mcma_compose_mcma_backend_app_api_schemas_auth_py", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "app/api/schemas/auth.py", "source_location": "L1", "weight": 1.0}], "raw_calls": []}
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
{"nodes": [{"id": "users_senko_work_mcma_compose_mcma_backend_app_api_init_py", "label": "__init__.py", "file_type": "code", "source_file": "app/api/__init__.py", "source_location": "L1"}, {"id": "users_senko_work_mcma_compose_mcma_backend_app_api_init_rationale_1", "label": "Driving adapter \u2014 FastAPI routers, schemas, dependency wiring.", "file_type": "rationale", "source_file": "app/api/__init__.py", "source_location": "L1"}], "edges": [{"source": "users_senko_work_mcma_compose_mcma_backend_app_api_init_rationale_1", "target": "users_senko_work_mcma_compose_mcma_backend_app_api_init_py", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "app/api/__init__.py", "source_location": "L1", "weight": 1.0}], "raw_calls": []}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
{"nodes": [{"id": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_storage_init_py", "label": "__init__.py", "file_type": "code", "source_file": "app/infrastructure/storage/__init__.py", "source_location": "L1"}, {"id": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_storage_init_rationale_1", "label": "File storage adapters.", "file_type": "rationale", "source_file": "app/infrastructure/storage/__init__.py", "source_location": "L1"}], "edges": [{"source": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_storage_init_rationale_1", "target": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_storage_init_py", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "app/infrastructure/storage/__init__.py", "source_location": "L1", "weight": 1.0}], "raw_calls": []}
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
{"nodes": [{"id": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_db_repositories_init_py", "label": "__init__.py", "file_type": "code", "source_file": "app/infrastructure/db/repositories/__init__.py", "source_location": "L1"}, {"id": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_db_repositories_init_rationale_1", "label": "SQLAlchemy repository adapters implementing the domain ports.", "file_type": "rationale", "source_file": "app/infrastructure/db/repositories/__init__.py", "source_location": "L1"}], "edges": [{"source": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_db_repositories_init_py", "target": "app_infrastructure_db_repositories_album_repository", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "app/infrastructure/db/repositories/__init__.py", "source_location": "L3", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_db_repositories_init_py", "target": "app_infrastructure_db_repositories_artist_repository", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "app/infrastructure/db/repositories/__init__.py", "source_location": "L4", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_db_repositories_init_py", "target": "app_infrastructure_db_repositories_download_job_repository", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "app/infrastructure/db/repositories/__init__.py", "source_location": "L5", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_db_repositories_init_py", "target": "app_infrastructure_db_repositories_history_repository", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "app/infrastructure/db/repositories/__init__.py", "source_location": "L8", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_db_repositories_init_py", "target": "app_infrastructure_db_repositories_like_repository", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "app/infrastructure/db/repositories/__init__.py", "source_location": "L9", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_db_repositories_init_py", "target": "app_infrastructure_db_repositories_playlist_repository", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "app/infrastructure/db/repositories/__init__.py", "source_location": "L10", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_db_repositories_init_py", "target": "app_infrastructure_db_repositories_refresh_token_repository", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "app/infrastructure/db/repositories/__init__.py", "source_location": "L11", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_db_repositories_init_py", "target": "app_infrastructure_db_repositories_track_repository", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "app/infrastructure/db/repositories/__init__.py", "source_location": "L14", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_db_repositories_init_py", "target": "app_infrastructure_db_repositories_user_repository", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "app/infrastructure/db/repositories/__init__.py", "source_location": "L15", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_db_repositories_init_rationale_1", "target": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_db_repositories_init_py", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "app/infrastructure/db/repositories/__init__.py", "source_location": "L1", "weight": 1.0}], "raw_calls": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_cache_redis_py", "label": "redis.py", "file_type": "code", "source_file": "app/infrastructure/cache/redis.py", "source_location": "L1"}, {"id": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_cache_redis_get_redis", "label": "get_redis()", "file_type": "code", "source_file": "app/infrastructure/cache/redis.py", "source_location": "L10", "_callable": true}, {"id": "redis", "label": "Redis", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/senko/Work/mcma-compose/mcma-backend/app/infrastructure/cache/redis.py"}, {"id": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_cache_redis_close_redis", "label": "close_redis()", "file_type": "code", "source_file": "app/infrastructure/cache/redis.py", "source_location": "L22", "_callable": true}, {"id": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_cache_redis_rationale_1", "label": "Redis client provider \u2014 a single shared async connection pool.", "file_type": "rationale", "source_file": "app/infrastructure/cache/redis.py", "source_location": "L1"}, {"id": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_cache_redis_rationale_11", "label": "Return the process-wide Redis client (created on first use).", "file_type": "rationale", "source_file": "app/infrastructure/cache/redis.py", "source_location": "L11"}], "edges": [{"source": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_cache_redis_py", "target": "redis_asyncio", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "app/infrastructure/cache/redis.py", "source_location": "L3", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_cache_redis_py", "target": "app_core_config", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "app/infrastructure/cache/redis.py", "source_location": "L5", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_cache_redis_py", "target": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_cache_redis_get_redis", "relation": "contains", "confidence": "EXTRACTED", "source_file": "app/infrastructure/cache/redis.py", "source_location": "L10", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_cache_redis_get_redis", "target": "redis", "relation": "references", "context": "return_type", "confidence": "EXTRACTED", "source_file": "app/infrastructure/cache/redis.py", "source_location": "L10", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_cache_redis_py", "target": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_cache_redis_close_redis", "relation": "contains", "confidence": "EXTRACTED", "source_file": "app/infrastructure/cache/redis.py", "source_location": "L22", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_cache_redis_rationale_1", "target": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_cache_redis_py", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "app/infrastructure/cache/redis.py", "source_location": "L1", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_cache_redis_rationale_11", "target": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_cache_redis_get_redis", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "app/infrastructure/cache/redis.py", "source_location": "L11", "weight": 1.0}], "raw_calls": [{"caller_nid": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_cache_redis_get_redis", "callee": "from_url", "is_member_call": true, "source_file": "app/infrastructure/cache/redis.py", "source_location": "L14", "receiver": "Redis"}, {"caller_nid": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_cache_redis_get_redis", "callee": "get_settings", "is_member_call": false, "source_file": "app/infrastructure/cache/redis.py", "source_location": "L15", "receiver": null}, {"caller_nid": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_cache_redis_close_redis", "callee": "aclose", "is_member_call": true, "source_file": "app/infrastructure/cache/redis.py", "source_location": "L25", "receiver": "_client"}]}
@@ -0,0 +1 @@
{"nodes": [{"id": "users_senko_work_mcma_compose_mcma_backend_app_workers_init_py", "label": "__init__.py", "file_type": "code", "source_file": "app/workers/__init__.py", "source_location": "L1"}, {"id": "users_senko_work_mcma_compose_mcma_backend_app_workers_init_rationale_1", "label": "arq worker \u2014 background tasks (downloads, enrichment, transcoding). CPU/IO-heav", "file_type": "rationale", "source_file": "app/workers/__init__.py", "source_location": "L1"}], "edges": [{"source": "users_senko_work_mcma_compose_mcma_backend_app_workers_init_rationale_1", "target": "users_senko_work_mcma_compose_mcma_backend_app_workers_init_py", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "app/workers/__init__.py", "source_location": "L1", "weight": 1.0}], "raw_calls": []}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
{"nodes": [{"id": "users_senko_work_mcma_compose_mcma_backend_app_api_v1_user_settings_py", "label": "user_settings.py", "file_type": "code", "source_file": "app/api/v1/user_settings.py", "source_location": "L1"}, {"id": "users_senko_work_mcma_compose_mcma_backend_app_api_v1_user_settings_get_settings", "label": "get_settings()", "file_type": "code", "source_file": "app/api/v1/user_settings.py", "source_location": "L11", "_callable": true}, {"id": "any", "label": "Any", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/senko/Work/mcma-compose/mcma-backend/app/api/v1/user_settings.py"}, {"id": "users_senko_work_mcma_compose_mcma_backend_app_api_v1_user_settings_update_settings", "label": "update_settings()", "file_type": "code", "source_file": "app/api/v1/user_settings.py", "source_location": "L15", "_callable": true}, {"id": "users_senko_work_mcma_compose_mcma_backend_app_api_v1_user_settings_get_scrobbling_settings", "label": "get_scrobbling_settings()", "file_type": "code", "source_file": "app/api/v1/user_settings.py", "source_location": "L19", "_callable": true}, {"id": "users_senko_work_mcma_compose_mcma_backend_app_api_v1_user_settings_set_scrobbling_settings", "label": "set_scrobbling_settings()", "file_type": "code", "source_file": "app/api/v1/user_settings.py", "source_location": "L23", "_callable": true}, {"id": "users_senko_work_mcma_compose_mcma_backend_app_api_v1_user_settings_rationale_1", "label": "User settings endpoints, including scrobbling configuration.", "file_type": "rationale", "source_file": "app/api/v1/user_settings.py", "source_location": "L1"}], "edges": [{"source": "users_senko_work_mcma_compose_mcma_backend_app_api_v1_user_settings_py", "target": "typing", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "app/api/v1/user_settings.py", "source_location": "L3", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_api_v1_user_settings_py", "target": "fastapi", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "app/api/v1/user_settings.py", "source_location": "L5", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_api_v1_user_settings_py", "target": "users_senko_work_mcma_compose_mcma_backend_app_api_v1_user_settings_get_settings", "relation": "contains", "confidence": "EXTRACTED", "source_file": "app/api/v1/user_settings.py", "source_location": "L11", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_api_v1_user_settings_get_settings", "target": "any", "relation": "references", "context": "return_type", "confidence": "EXTRACTED", "source_file": "app/api/v1/user_settings.py", "source_location": "L11", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_api_v1_user_settings_py", "target": "users_senko_work_mcma_compose_mcma_backend_app_api_v1_user_settings_update_settings", "relation": "contains", "confidence": "EXTRACTED", "source_file": "app/api/v1/user_settings.py", "source_location": "L15", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_api_v1_user_settings_update_settings", "target": "any", "relation": "references", "context": "return_type", "confidence": "EXTRACTED", "source_file": "app/api/v1/user_settings.py", "source_location": "L15", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_api_v1_user_settings_py", "target": "users_senko_work_mcma_compose_mcma_backend_app_api_v1_user_settings_get_scrobbling_settings", "relation": "contains", "confidence": "EXTRACTED", "source_file": "app/api/v1/user_settings.py", "source_location": "L19", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_api_v1_user_settings_get_scrobbling_settings", "target": "any", "relation": "references", "context": "return_type", "confidence": "EXTRACTED", "source_file": "app/api/v1/user_settings.py", "source_location": "L19", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_api_v1_user_settings_py", "target": "users_senko_work_mcma_compose_mcma_backend_app_api_v1_user_settings_set_scrobbling_settings", "relation": "contains", "confidence": "EXTRACTED", "source_file": "app/api/v1/user_settings.py", "source_location": "L23", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_api_v1_user_settings_set_scrobbling_settings", "target": "any", "relation": "references", "context": "return_type", "confidence": "EXTRACTED", "source_file": "app/api/v1/user_settings.py", "source_location": "L23", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_api_v1_user_settings_rationale_1", "target": "users_senko_work_mcma_compose_mcma_backend_app_api_v1_user_settings_py", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "app/api/v1/user_settings.py", "source_location": "L1", "weight": 1.0}], "raw_calls": []}
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
{"nodes": [{"id": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_db_base_py", "label": "base.py", "file_type": "code", "source_file": "app/infrastructure/db/base.py", "source_location": "L1"}, {"id": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_db_base_base", "label": "Base", "file_type": "code", "source_file": "app/infrastructure/db/base.py", "source_location": "L19", "_callable": true}, {"id": "declarativebase", "label": "DeclarativeBase", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/senko/Work/mcma-compose/mcma-backend/app/infrastructure/db/base.py"}, {"id": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_db_base_rationale_1", "label": "Declarative base with a fixed naming convention. The naming convention makes Al", "file_type": "rationale", "source_file": "app/infrastructure/db/base.py", "source_location": "L1"}, {"id": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_db_base_rationale_20", "label": "Base for all ORM models. Import models so Alembic sees their metadata.", "file_type": "rationale", "source_file": "app/infrastructure/db/base.py", "source_location": "L20"}], "edges": [{"source": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_db_base_py", "target": "sqlalchemy", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "app/infrastructure/db/base.py", "source_location": "L7", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_db_base_py", "target": "sqlalchemy_orm", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "app/infrastructure/db/base.py", "source_location": "L8", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_db_base_py", "target": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_db_base_base", "relation": "contains", "confidence": "EXTRACTED", "source_file": "app/infrastructure/db/base.py", "source_location": "L19", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_db_base_base", "target": "declarativebase", "relation": "inherits", "confidence": "EXTRACTED", "source_file": "app/infrastructure/db/base.py", "source_location": "L19", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_db_base_rationale_1", "target": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_db_base_py", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "app/infrastructure/db/base.py", "source_location": "L1", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_db_base_rationale_20", "target": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_db_base_base", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "app/infrastructure/db/base.py", "source_location": "L20", "weight": 1.0}], "raw_calls": []}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
{"nodes": [{"id": "users_senko_work_mcma_compose_mcma_backend_app_domain_init_py", "label": "__init__.py", "file_type": "code", "source_file": "app/domain/__init__.py", "source_location": "L1"}, {"id": "users_senko_work_mcma_compose_mcma_backend_app_domain_init_rationale_1", "label": "Pure business core \u2014 entities, value objects, errors, and ports (Protocols). Th", "file_type": "rationale", "source_file": "app/domain/__init__.py", "source_location": "L1"}], "edges": [{"source": "users_senko_work_mcma_compose_mcma_backend_app_domain_init_rationale_1", "target": "users_senko_work_mcma_compose_mcma_backend_app_domain_init_py", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "app/domain/__init__.py", "source_location": "L1", "weight": 1.0}], "raw_calls": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "users_senko_work_mcma_compose_mcma_backend_app_api_schemas_artist_py", "label": "artist.py", "file_type": "code", "source_file": "app/api/schemas/artist.py", "source_location": "L1"}, {"id": "users_senko_work_mcma_compose_mcma_backend_app_api_schemas_artist_artistout", "label": "ArtistOut", "file_type": "code", "source_file": "app/api/schemas/artist.py", "source_location": "L9", "_callable": true}, {"id": "basemodel", "label": "BaseModel", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/senko/Work/mcma-compose/mcma-backend/app/api/schemas/artist.py"}, {"id": "users_senko_work_mcma_compose_mcma_backend_app_api_schemas_artist_rationale_1", "label": "Artist request/response schemas.", "file_type": "rationale", "source_file": "app/api/schemas/artist.py", "source_location": "L1"}], "edges": [{"source": "users_senko_work_mcma_compose_mcma_backend_app_api_schemas_artist_py", "target": "datetime", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "app/api/schemas/artist.py", "source_location": "L3", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_api_schemas_artist_py", "target": "uuid", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "app/api/schemas/artist.py", "source_location": "L4", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_api_schemas_artist_py", "target": "pydantic", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "app/api/schemas/artist.py", "source_location": "L6", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_api_schemas_artist_py", "target": "users_senko_work_mcma_compose_mcma_backend_app_api_schemas_artist_artistout", "relation": "contains", "confidence": "EXTRACTED", "source_file": "app/api/schemas/artist.py", "source_location": "L9", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_api_schemas_artist_artistout", "target": "basemodel", "relation": "inherits", "confidence": "EXTRACTED", "source_file": "app/api/schemas/artist.py", "source_location": "L9", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_api_schemas_artist_rationale_1", "target": "users_senko_work_mcma_compose_mcma_backend_app_api_schemas_artist_py", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "app/api/schemas/artist.py", "source_location": "L1", "weight": 1.0}], "raw_calls": []}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
{"nodes": [{"id": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_db_init_py", "label": "__init__.py", "file_type": "code", "source_file": "app/infrastructure/db/__init__.py", "source_location": "L1"}, {"id": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_db_init_rationale_1", "label": "Database adapter: declarative base, async engine, session factory.", "file_type": "rationale", "source_file": "app/infrastructure/db/__init__.py", "source_location": "L1"}], "edges": [{"source": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_db_init_py", "target": "app_infrastructure_db_base", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "app/infrastructure/db/__init__.py", "source_location": "L3", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_db_init_py", "target": "app_infrastructure_db_engine", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "app/infrastructure/db/__init__.py", "source_location": "L4", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_db_init_rationale_1", "target": "users_senko_work_mcma_compose_mcma_backend_app_infrastructure_db_init_py", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "app/infrastructure/db/__init__.py", "source_location": "L1", "weight": 1.0}], "raw_calls": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "users_senko_work_mcma_compose_mcma_backend_app_workers_tasks_init_py", "label": "__init__.py", "file_type": "code", "source_file": "app/workers/tasks/__init__.py", "source_location": "L1"}, {"id": "users_senko_work_mcma_compose_mcma_backend_app_workers_tasks_init_rationale_1", "label": "arq task functions. Registered in ``app.workers.arq_worker.WorkerSettings``.", "file_type": "rationale", "source_file": "app/workers/tasks/__init__.py", "source_location": "L1"}], "edges": [{"source": "users_senko_work_mcma_compose_mcma_backend_app_workers_tasks_init_rationale_1", "target": "users_senko_work_mcma_compose_mcma_backend_app_workers_tasks_init_py", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "app/workers/tasks/__init__.py", "source_location": "L1", "weight": 1.0}], "raw_calls": []}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long

Some files were not shown because too many files have changed in this diff Show More