Programmatic access to Gemini Notebook - via command-line interface (CLI), Model Context Protocol (MCP) server, and AI agent skills.
This report summarizes scanner evidence for jacob-bd/gemini-notebook-mcp-cli, a Python project with 6,281 GitHub stars. SynthScan examined 106,015 lines of code across 353 source files, recording 3285 pattern matches distributed across 22 syntactic categories. The legacy adjusted pattern signal is 50.0 (High pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Can maintainers explain intent, assumptions, and trade-offs? 2339 finding(s).
Are imports declared and package/API names verified? 281 finding(s).
Are wrappers, guards, and repeated structures necessary? 2633 finding(s).
Which changes need focused human review? 3285 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 3285 distinct pattern matches across 22 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_api_client.py | 80 | def test_auth_recovery_reports_unreachable_backend(self, mock_client): | CODE |
| LOW | tests/test_api_client.py | 103 | def test_auth_recovery_keeps_expiry_as_authentication_failure(self, mock_client): | CODE |
| LOW | tests/test_api_client.py | 161 | def test_refresh_auth_tokens_success(self, mock_client): | CODE |
| LOW | tests/test_api_client.py | 184 | def test_refresh_auth_tokens_redirect_login(self, mock_client): | CODE |
| LOW | tests/test_api_client.py | 201 | def test_get_notebook_sources_extracts_url(self, mock_client): | CODE |
| LOW | tests/test_api_client.py | 245 | def test_add_drive_source_uses_extended_timeout(self, mock_client): | CODE |
| LOW | tests/test_api_client.py | 270 | def test_add_drive_source_timeout_returns_status(self, mock_client): | CODE |
| LOW | tests/test_wsl.py | 13 | def test_get_windows_host_ip_uses_loopback_in_mirrored_mode(monkeypatch): | CODE |
| LOW | tests/test_wsl.py | 29 | def test_get_windows_host_ip_uses_gateway_in_nat_mode(monkeypatch): | CODE |
| LOW | tests/test_wsl.py | 59 | def test_get_windows_host_ip_uses_gateway_when_wslinfo_is_unavailable(monkeypatch): | CODE |
| LOW | tests/test_wsl.py | 72 | def test_launch_windows_chrome_preserves_non_ascii_windows_temp_path(monkeypatch): | CODE |
| LOW⚡ | tests/test_coerce_list.py | 14 | def test_serialized_json_null_returns_none(self): | CODE |
| LOW⚡ | tests/test_coerce_list.py | 18 | def test_serialized_json_null_list_returns_none(self, value): | CODE |
| LOW⚡ | tests/test_coerce_list.py | 21 | def test_empty_string_returns_none(self): | CODE |
| LOW⚡ | tests/test_coerce_list.py | 25 | def test_actual_list_passthrough(self): | CODE |
| LOW⚡ | tests/test_coerce_list.py | 31 | def test_comma_separated_string(self): | CODE |
| LOW⚡ | tests/test_coerce_list.py | 34 | def test_comma_separated_with_spaces(self): | CODE |
| LOW⚡ | tests/test_coerce_list.py | 44 | def test_int_list_passthrough(self): | CODE |
| LOW⚡ | tests/test_coerce_list.py | 50 | def test_list_of_strings_cast_to_int(self): | CODE |
| LOW⚡ | tests/test_coerce_list.py | 53 | def test_empty_list_returns_empty(self): | CODE |
| LOW⚡ | tests/test_coerce_list.py | 56 | def test_malformed_json_falls_back_to_comma(self): | CODE |
| LOW⚡ | tests/test_coerce_list.py | 62 | async def test_mcp_list_parameters_accept_string_values(): | CODE |
| LOW | tests/test_cdp_headless_port.py | 11 | def test_headless_auth_uses_free_port_when_launching(): | CODE |
| LOW | tests/test_cdp_headless_port.py | 26 | def test_headless_auth_keeps_best_effort_port_failure_compatible(): | CODE |
| LOW | tests/test_cdp_headless_port.py | 42 | def test_headless_auth_can_surface_safe_port_failure(): | CODE |
| LOW | tests/test_cdp_headless_port.py | 65 | def test_headless_auth_reports_unsigned_saved_profile_for_explicit_refresh(): | CODE |
| LOW | tests/test_cdp_headless_port.py | 86 | def test_headless_auth_keeps_unsigned_saved_profile_best_effort_compatible(): | CODE |
| LOW | tests/test_cdp_headless_port.py | 99 | def test_headless_auth_reports_candidate_rejection_for_explicit_refresh(): | CODE |
| LOW | tests/test_research_polling.py | 17 | def test_poll_research_filtering(self, mock_client): | CODE |
| LOW | tests/conftest.py | 10 | def _is_allowed_live_modification(rel_path: str) -> bool: | CODE |
| LOW | tests/test_debug_artifacts.py | 13 | def test_save_dom_capture_defaults_outside_the_repository(tmp_path, monkeypatch): | CODE |
| LOW | tests/test_debug_artifacts.py | 24 | def test_save_dom_capture_honors_explicit_output_path(tmp_path): | CODE |
| LOW | tests/test_debug_artifacts.py | 33 | def test_sensitive_debug_artifacts_are_ignored_by_git(): | CODE |
| LOW | tests/test_config_session_profile.py | 21 | def test_override_changes_default_profile_everywhere(): | CODE |
| LOW | tests/test_config_session_profile.py | 28 | def test_clearing_override_returns_to_saved_default(): | CODE |
| LOW⚡ | tests/test_config_session_profile.py | 42 | def test_save_config_never_persists_the_session_override(): | CODE |
| LOW⚡ | tests/test_config_session_profile.py | 48 | def test_saved_default_reads_file_only(): | CODE |
| LOW⚡ | tests/test_config_session_profile.py | 58 | def test_root_mirror_ignores_session_override(): | CODE |
| LOW | tests/test_mcp_studio.py | 23 | def test_studio_status_is_lean_and_bounded_by_default(): | CODE |
| LOW | tests/test_mcp_studio.py | 64 | def test_studio_status_can_request_one_detailed_artifact(): | CODE |
| LOW | tests/test_mcp_studio.py | 95 | def test_studio_create_preserves_rate_limit_hint(): | CODE |
| LOW | tests/test_mcp_studio.py | 124 | def test_studio_create_uses_configured_notebook_url(): | CODE |
| LOW | tests/test_mcp_studio.py | 155 | def test_studio_revise_preserves_hint_on_service_error(): | CODE |
| LOW | tests/test_mcp_studio.py | 184 | def test_studio_revise_uses_configured_notebook_url(): | CODE |
| LOW | tests/test_mcp_studio.py | 215 | def test_report_rejects_unknown_action(): | CODE |
| LOW | tests/test_mcp_studio.py | 221 | def test_report_get_keeps_success_envelope(): | CODE |
| LOW | tests/test_mcp_studio.py | 234 | def test_report_elements_passes_wait_and_content(): | CODE |
| LOW | tests/test_mcp_studio.py | 259 | def test_report_generate_validates_without_confirm(): | CODE |
| LOW | tests/test_mcp_studio.py | 289 | def test_report_generate_runs_on_confirm_and_keeps_success_envelope(): | CODE |
| LOW | tests/test_mcp_studio.py | 322 | def test_report_generate_requires_plan_and_rejects_bad_plan(): | CODE |
| LOW | tests/test_mcp_studio.py | 342 | def test_old_report_tools_are_gone(): | CODE |
| LOW | tests/test_mcp_server_version_cache.py | 17 | def test_successful_version_lookup_is_cached(monkeypatch): | CODE |
| LOW | tests/test_mcp_server_version_cache.py | 32 | def test_failed_lookup_uses_short_negative_cache(monkeypatch): | CODE |
| LOW | tests/test_mcp_server_version_cache.py | 50 | def test_success_cache_expires_after_ttl(monkeypatch): | CODE |
| LOW | tests/test_mcp_server_version_cache.py | 62 | def test_concurrent_calls_share_one_network_fetch(monkeypatch): | CODE |
| LOW | tests/test_mcp_e2e.py | 76 | def test_notebook_create_rename_delete(self, mcp_tools): | CODE |
| LOW | tests/test_mcp_e2e.py | 132 | def test_source_add_invalid_type(self, mcp_tools, test_notebook): | CODE |
| LOW | tests/test_mcp_e2e.py | 172 | def test_studio_create_without_confirm(self, mcp_tools, test_notebook): | CODE |
| LOW | tests/test_mcp_e2e.py | 183 | def test_studio_create_invalid_type(self, mcp_tools, test_notebook): | CODE |
| LOW | tests/test_mcp_e2e.py | 195 | def test_studio_create_flashcards(self, mcp_tools, test_notebook): | CODE |
| 1872 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | tests/test_auth_migration.py | 145 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | tests/test_auth_migration.py | 147 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | tests/test_auth_migration.py | 161 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | tests/test_auth_migration.py | 163 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | tests/test_auth_migration.py | 289 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | tests/test_auth_migration.py | 291 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | tests/test_auth_migration.py | 339 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | tests/test_auth_migration.py | 341 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | tests/test_auth_migration.py | 397 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | tests/test_auth_migration.py | 399 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | tests/test_auth_migration.py | 450 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | tests/test_auth_migration.py | 452 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | tests/core/test_url_source_fallback.py | 16 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/core/test_url_source_fallback.py | 18 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/core/test_url_source_fallback.py | 51 | # =========================================================================== | COMMENT |
| MEDIUM | tests/core/test_url_source_fallback.py | 53 | # =========================================================================== | COMMENT |
| MEDIUM | tests/core/test_url_source_fallback.py | 180 | # =========================================================================== | COMMENT |
| MEDIUM | tests/core/test_url_source_fallback.py | 182 | # =========================================================================== | COMMENT |
| MEDIUM | tests/core/test_url_source_fallback.py | 243 | # =========================================================================== | COMMENT |
| MEDIUM | tests/core/test_url_source_fallback.py | 245 | # =========================================================================== | COMMENT |
| MEDIUM⚡ | tests/core/test_task5_mcp_perf_caching.py | 374 | # ========================================================================= | COMMENT |
| MEDIUM⚡ | tests/core/test_task5_mcp_perf_caching.py | 376 | # ========================================================================= | COMMENT |
| MEDIUM⚡ | tests/core/test_task5_mcp_perf_caching.py | 635 | # ========================================================================= | COMMENT |
| MEDIUM⚡ | tests/core/test_task5_mcp_perf_caching.py | 637 | # ========================================================================= | COMMENT |
| MEDIUM | tests/core/test_task5_mcp_perf_caching.py | 208 | # ========================================================================= | COMMENT |
| MEDIUM | tests/core/test_task5_mcp_perf_caching.py | 210 | # ========================================================================= | COMMENT |
| MEDIUM | tests/core/test_task5_mcp_perf_caching.py | 667 | # ========================================== | COMMENT |
| MEDIUM | tests/core/test_task5_mcp_perf_caching.py | 669 | # ========================================== | COMMENT |
| MEDIUM | tests/core/test_task5_mcp_perf_caching.py | 731 | # ========================================== | COMMENT |
| MEDIUM | tests/core/test_task5_mcp_perf_caching.py | 733 | # ========================================== | COMMENT |
| MEDIUM | tests/core/test_source_reconciliation.py | 16 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/core/test_source_reconciliation.py | 18 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/core/test_source_reconciliation.py | 48 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/core/test_source_reconciliation.py | 50 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/core/test_source_reconciliation.py | 117 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/core/test_source_reconciliation.py | 119 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/core/test_source_reconciliation.py | 173 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/core/test_source_reconciliation.py | 175 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/core/test_source_reconciliation.py | 207 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/core/test_source_reconciliation.py | 209 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/services/test_auth_health.py | 35 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/services/test_auth_health.py | 37 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/services/test_auth_health.py | 97 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/services/test_auth_health.py | 99 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/services/test_auth_health.py | 683 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/services/test_auth_health.py | 685 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/services/test_auth_health.py | 771 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/services/test_auth_health.py | 773 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/services/test_auth_health.py | 794 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/services/test_auth_health.py | 796 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/services/test_auth_health.py | 142 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/services/test_auth_health.py | 144 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/services/test_auth_health.py | 340 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/services/test_auth_health.py | 342 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/services/test_download_containment.py | 158 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/services/test_download_containment.py | 160 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | scripts/test_label_rpcs.py | 17 | # ─── Helpers ───────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | scripts/test_label_rpcs.py | 39 | # ─── Test client ───────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | scripts/test_label_rpcs.py | 108 | # ─── Main ───────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | src/notebooklm_tools/core/auth.py | 358 | # ============================================================================ | COMMENT |
| 159 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | tests/test_cdp_headless_port.py | 44 | from notebooklm_tools.core.exceptions import AuthenticationError | CODE |
| CRITICAL | tests/test_cdp_headless_port.py | 67 | from notebooklm_tools.core.exceptions import AuthenticationError | CODE |
| CRITICAL | tests/test_cdp_headless_port.py | 101 | from notebooklm_tools.core.exceptions import AuthenticationError | CODE |
| CRITICAL | tests/test_auth_browser.py | 438 | from notebooklm_tools.core.exceptions import AuthenticationError | CODE |
| CRITICAL | tests/test_auth_browser.py | 478 | from notebooklm_tools.core.exceptions import AuthenticationError | CODE |
| CRITICAL | tests/test_auth_browser.py | 506 | from notebooklm_tools.core.exceptions import AuthenticationError | CODE |
| CRITICAL | tests/test_auth_browser.py | 520 | from notebooklm_tools.core.exceptions import AuthenticationError | CODE |
| CRITICAL | tests/test_cdp_login_validation.py | 10 | from notebooklm_tools.core.exceptions import AuthenticationError | CODE |
| CRITICAL | tests/test_mcp_auth_studio_failures.py | 110 | from notebooklm_tools.core.exceptions import AuthenticationError | CODE |
| CRITICAL⚡ | tests/test_file_upload.py | 13 | from notebooklm_tools.core.exceptions import FileUploadError, FileValidationError | CODE |
| CRITICAL | tests/test_cdp_url_check.py | 128 | from notebooklm_tools.core.exceptions import AuthenticationError | CODE |
| CRITICAL | tests/test_cdp_url_check.py | 243 | from notebooklm_tools.core.exceptions import AuthenticationError | CODE |
| CRITICAL | tests/test_cdp_profile_clear.py | 5 | from notebooklm_tools.core.exceptions import AuthenticationError | CODE |
| CRITICAL | tests/test_cookie_parsing.py | 9 | from notebooklm_tools.core.exceptions import AuthenticationError | CODE |
| CRITICAL | tests/test_auth_migration.py | 508 | from notebooklm_tools.core.exceptions import AuthenticationError | CODE |
| CRITICAL | tests/test_auth_migration.py | 530 | from notebooklm_tools.core.exceptions import AuthenticationError | CODE |
| CRITICAL | tests/test_auth_migration.py | 553 | from notebooklm_tools.core.exceptions import AuthenticationError | CODE |
| CRITICAL | tests/test_auth_migration.py | 576 | from notebooklm_tools.core.exceptions import AuthenticationError | CODE |
| CRITICAL | tests/test_auth_migration.py | 594 | from notebooklm_tools.core.exceptions import AuthenticationError | CODE |
| CRITICAL | tests/test_auth_migration.py | 613 | from notebooklm_tools.core.exceptions import AuthenticationError | CODE |
| CRITICAL | tests/test_auth_migration.py | 634 | from notebooklm_tools.core.exceptions import AuthenticationError | CODE |
| CRITICAL | tests/core/test_auth_check.py | 149 | from notebooklm_tools.core.exceptions import AuthenticationError | CODE |
| CRITICAL | tests/core/test_task3_routing_contract.py | 36 | from notebooklm_tools.core.exceptions import AccountMismatchError | CODE |
| CRITICAL | tests/core/test_manual_login_host.py | 8 | from notebooklm_tools.core.exceptions import AuthenticationError | CODE |
| CRITICAL⚡ | tests/core/test_auth_guard.py | 3 | from notebooklm_tools.core.exceptions import AccountMismatchError, AuthenticationError, NLMError | CODE |
| CRITICAL | tests/core/test_alias.py | 7 | from notebooklm_tools.core.exceptions import NLMError | CODE |
| CRITICAL | tests/core/test_sources.py | 296 | from notebooklm_tools.core.exceptions import SourceProcessingError | CODE |
| CRITICAL | tests/core/test_credential_store.py | 398 | from notebooklm_tools.core.exceptions import AuthenticationError | CODE |
| CRITICAL | tests/cli/test_login.py | 13 | from notebooklm_tools.core.exceptions import AuthenticationError | CODE |
| CRITICAL | tests/cli/test_login.py | 221 | from notebooklm_tools.core.exceptions import AuthenticationError | CODE |
| CRITICAL | tests/cli/test_login_storage_choice.py | 9 | from notebooklm_tools.core.exceptions import NLMError | CODE |
| CRITICAL | tests/cli/test_login_cancel_chrome.py | 9 | from notebooklm_tools.core.exceptions import NLMError | CODE |
| CRITICAL | tests/services/test_sources.py | 316 | from notebooklm_tools.core.exceptions import SourceProcessingError | CODE |
| CRITICAL | src/notebooklm_tools/core/auth.py | 651 | from notebooklm_tools.core.exceptions import AccountMismatchError, AuthenticationError | CODE |
| CRITICAL | src/notebooklm_tools/core/auth.py | 910 | from notebooklm_tools.core.exceptions import AuthenticationError | CODE |
| CRITICAL | src/notebooklm_tools/core/auth.py | 1166 | from notebooklm_tools.core.exceptions import AuthenticationError | CODE |
| CRITICAL | src/notebooklm_tools/core/alias.py | 159 | from notebooklm_tools.core.exceptions import NLMError | CODE |
| CRITICAL⚡ | src/notebooklm_tools/core/auth_migration.py | 30 | from notebooklm_tools.core.exceptions import NLMError | CODE |
| CRITICAL | src/notebooklm_tools/utils/firefox.py | 16 | from notebooklm_tools.core.exceptions import AuthenticationError | CODE |
| CRITICAL | src/notebooklm_tools/utils/cdp.py | 77 | from notebooklm_tools.core.exceptions import AuthenticationError # noqa: E402 | CODE |
| CRITICAL | src/notebooklm_tools/utils/browser.py | 8 | from notebooklm_tools.core.exceptions import AuthenticationError | CODE |
| CRITICAL | src/notebooklm_tools/utils/auth_browser.py | 7 | from notebooklm_tools.core.exceptions import AuthenticationError | CODE |
| CRITICAL | src/notebooklm_tools/mcp/tools/auth.py | 9 | from notebooklm_tools.core.exceptions import AuthenticationError | CODE |
| CRITICAL | src/notebooklm_tools/cli/utils.py | 89 | from notebooklm_tools.core.exceptions import NLMError | CODE |
| CRITICAL | src/notebooklm_tools/cli/main.py | 118 | from notebooklm_tools.core.exceptions import AuthenticationError | CODE |
| CRITICAL | src/notebooklm_tools/cli/main.py | 185 | from notebooklm_tools.core.exceptions import AuthenticationError | CODE |
| CRITICAL | src/notebooklm_tools/cli/main.py | 499 | from notebooklm_tools.core.exceptions import AccountMismatchError, NLMError | CODE |
| CRITICAL | src/notebooklm_tools/cli/main.py | 1003 | from notebooklm_tools.core.exceptions import NLMError | CODE |
| CRITICAL | src/notebooklm_tools/cli/commands/studio.py | 13 | from notebooklm_tools.core.exceptions import NLMError | CODE |
| CRITICAL | src/notebooklm_tools/cli/commands/research.py | 8 | from notebooklm_tools.core.exceptions import NLMError | CODE |
| CRITICAL | src/notebooklm_tools/cli/commands/repl.py | 11 | from notebooklm_tools.core.exceptions import NLMError | CODE |
| CRITICAL | src/notebooklm_tools/cli/commands/export.py | 8 | from notebooklm_tools.core.exceptions import NLMError | CODE |
| CRITICAL | src/notebooklm_tools/cli/commands/chat.py | 7 | from notebooklm_tools.core.exceptions import NLMError | CODE |
| CRITICAL | src/notebooklm_tools/cli/commands/share.py | 9 | from notebooklm_tools.core.exceptions import NLMError | CODE |
| CRITICAL | src/notebooklm_tools/cli/commands/label.py | 9 | from notebooklm_tools.core.exceptions import NLMError | CODE |
| CRITICAL | src/notebooklm_tools/cli/commands/chats.py | 9 | from notebooklm_tools.core.exceptions import NLMError | CODE |
| CRITICAL | src/notebooklm_tools/cli/commands/notebook.py | 8 | from notebooklm_tools.core.exceptions import NLMError | CODE |
| CRITICAL | src/notebooklm_tools/cli/commands/source.py | 8 | from notebooklm_tools.core.exceptions import NLMError | CODE |
| CRITICAL | src/notebooklm_tools/cli/commands/note.py | 9 | from notebooklm_tools.core.exceptions import NLMError | CODE |
| CRITICAL | src/notebooklm_tools/services/auth.py | 670 | from notebooklm_tools.core.exceptions import AuthenticationError | CODE |
| 2 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | src/notebooklm_tools/core/exports.py | 32 | Export an artifact to Google Docs or Sheets. Args: notebook_id: The notebook UUID artif | STRING |
| HIGH | src/notebooklm_tools/core/sharing.py | 164 | Add multiple collaborators to a notebook in a single API call. Args: notebook_id: The notebook UUID | STRING |
| HIGH | src/notebooklm_tools/core/studio.py | 1494 | Generate a Mind Map JSON from sources. This is step 1 of 2 for creating a mind map. After generation, u | STRING |
| HIGH | src/notebooklm_tools/core/download.py | 145 | Download content from a URL to a local file with streaming support. Features: - Streams file in chunks | STRING |
| HIGH | src/notebooklm_tools/core/download.py | 941 | Parse rich-text data table into headers and rows. Features: - Validates structure at each navigation st | STRING |
| HIGH | src/notebooklm_tools/core/download.py | 1291 | Fetch artifact HTML content for quiz/flashcard types. Args: notebook_id: The notebook ID. | STRING |
| HIGH | src/notebooklm_tools/core/download.py | 1359 | Extract JSON app data from interactive HTML. Quiz and flashcard HTML contains embedded JSON in a data-app-data | STRING |
| HIGH | src/notebooklm_tools/core/download.py | 1540 | Shared implementation for downloading quiz/flashcard artifacts. Args: notebook_id: The notebook ID. | STRING |
| HIGH | src/notebooklm_tools/core/download.py | 1640 | Download quiz artifact. Args: notebook_id: The notebook ID. output_path: Path to save t | STRING |
| HIGH | src/notebooklm_tools/core/download.py | 1672 | Download flashcard deck artifact. Args: notebook_id: The notebook ID. output_path: Path | STRING |
| HIGH | src/notebooklm_tools/core/constants.py | 32 | Get integer code for a string name. Args: name: The string name (case-insensitive). | STRING |
| HIGH | src/notebooklm_tools/core/retry.py | 98 | Execute a callable with retry logic for transient server errors. Use this for one-off retry wrapping where a decora | STRING |
| HIGH | src/notebooklm_tools/core/sources.py | 161 | Wait for a source to finish processing. Polls the source status until it becomes READY or times out. N | STRING |
| HIGH | src/notebooklm_tools/core/sources.py | 826 | Register a file source intent and get SOURCE_ID. Step 1 of the resumable upload protocol. Args: | STRING |
| HIGH | src/notebooklm_tools/core/sources.py | 873 | Start a resumable upload session and get the upload URL. Step 2 of the resumable upload protocol. Args | STRING |
| HIGH | src/notebooklm_tools/core/sources.py | 976 | Add a local file as a source using resumable upload. Uses Google's resumable upload protocol: 1. Regist | STRING |
| HIGH | src/notebooklm_tools/utils/wsl.py | 187 | Launch Chrome on Windows side from WSL. Args: port: Remote debugging port to use. debug: If True, c | STRING |
| HIGH | src/notebooklm_tools/utils/cdp.py | 312 | Find an available loopback port for Chrome debugging. Scans the conventional CDP range first. If every candidate is | STRING |
| HIGH | src/notebooklm_tools/utils/cdp.py | 1542 | Extract cookies and tokens from Chrome via CDP. This is the main entry point for CDP-based authentication. Arg | STRING |
| HIGH | src/notebooklm_tools/utils/browser.py | 17 | Parse cookies from a file. The file can contain: - Raw cookie header string (Cookie: name=value; name2=val | STRING |
| HIGH | src/notebooklm_tools/cli/setup_safety.py | 57 | Create a private dated backup of an existing file or directory. Args: path: File or directory to back up. | STRING |
| HIGH | src/notebooklm_tools/cli/main.py | 165 | Validate saved credentials using the same policy as MCP auth recovery. The CLI previously treated a successful home | STRING |
| HIGH | src/notebooklm_tools/services/exports.py | 30 | Export a NotebookLM artifact to Google Docs or Sheets. Args: client: Authenticated NotebookLM client | STRING |
| HIGH | src/notebooklm_tools/services/sharing.py | 93 | Get sharing status and collaborators for a notebook. Args: client: Authenticated NotebookLM client | STRING |
| HIGH | src/notebooklm_tools/services/sharing.py | 125 | Enable or disable public link access. Args: client: Authenticated NotebookLM client notebook_id: No | STRING |
| HIGH | src/notebooklm_tools/services/sharing.py | 164 | Invite a collaborator by email. Args: client: Authenticated NotebookLM client notebook_id: Notebook | STRING |
| HIGH | src/notebooklm_tools/services/sharing.py | 212 | Invite multiple collaborators in a single API call. Args: client: Authenticated NotebookLM client n | STRING |
| HIGH | src/notebooklm_tools/services/labels.py | 56 | Auto-label all sources using AI-generated thematic categories. Requires 5+ sources. If labels already exist, return | STRING |
| HIGH | src/notebooklm_tools/services/labels.py | 89 | Force AI re-categorization of sources into new labels. Args: client: Authenticated NotebookLM client | STRING |
| HIGH | src/notebooklm_tools/services/labels.py | 118 | Create a new empty label manually. Args: client: Authenticated NotebookLM client notebook_id: Noteb | STRING |
| HIGH | src/notebooklm_tools/services/labels.py | 157 | Rename an existing label. Args: client: Authenticated NotebookLM client notebook_id: Notebook UUID | STRING |
| HIGH | src/notebooklm_tools/services/labels.py | 196 | Set or clear the emoji marker on a label. Args: client: Authenticated NotebookLM client notebook_id | STRING |
| HIGH | src/notebooklm_tools/services/labels.py | 234 | Assign a source to a label. Sources support multi-label assignment — this adds the source to the target label w | STRING |
| HIGH | src/notebooklm_tools/services/labels.py | 275 | Delete one or more labels. Sources are NOT deleted. Args: client: Authenticated NotebookLM client n | STRING |
| HIGH | src/notebooklm_tools/services/smart_select.py | 96 | Add tags to a notebook. Args: notebook_id: Notebook UUID tags: List of tags to add notebook | STRING |
| HIGH | src/notebooklm_tools/services/smart_select.py | 150 | Remove tags from a notebook. Args: notebook_id: Notebook UUID tags: List of tags to remove Ret | STRING |
| HIGH | src/notebooklm_tools/services/smart_select.py | 205 | Select notebooks relevant to a query based on tags. Uses simple keyword matching: splits query into words and match | STRING |
| HIGH | src/notebooklm_tools/services/studio.py | 193 | Resolve a human-readable name to an integer code via constants.CodeMapper. Args: mapper: The CodeMapper ins | STRING |
| HIGH | src/notebooklm_tools/services/studio.py | 939 | Revise a slide deck with per-slide instructions. Creates a NEW artifact — the original is not modified. Args: | STRING |
| HIGH | src/notebooklm_tools/services/research.py | 211 | Start a research task to find new sources. Args: client: Authenticated NotebookLM client notebook_i | STRING |
| HIGH | src/notebooklm_tools/services/research.py | 299 | Poll research progress, optionally blocking until complete or timeout. Args: client: Authenticated Notebook | STRING |
| HIGH | src/notebooklm_tools/services/research.py | 425 | Import discovered sources from a completed research task. Args: client: Authenticated NotebookLM client | STRING |
| HIGH | src/notebooklm_tools/services/notes.py | 49 | List all notes in a notebook. Args: client: Authenticated NotebookLM client notebook_id: Notebook U | STRING |
| HIGH | src/notebooklm_tools/services/notes.py | 78 | Create a new note in a notebook. Args: client: Authenticated NotebookLM client notebook_id: Noteboo | STRING |
| HIGH | src/notebooklm_tools/services/notes.py | 128 | Update a note's content and/or title. Args: client: Authenticated NotebookLM client notebook_id: No | STRING |
| HIGH | src/notebooklm_tools/services/notes.py | 179 | Delete a note permanently. Args: client: Authenticated NotebookLM client notebook_id: Notebook UUID | STRING |
| HIGH | src/notebooklm_tools/services/downloads.py | 337 | Download a non-streaming artifact synchronously. For: report, mind_map, data_table, data_table_xlsx, quiz, flashcar | STRING |
| HIGH | src/notebooklm_tools/services/downloads.py | 465 | Download a streaming artifact asynchronously. For: audio, video, slide_deck, infographic, quiz, flashcards. Ar | STRING |
| HIGH | src/notebooklm_tools/services/downloads.py | 580 | Download every completed studio artifact of a notebook. Creates a subdirectory of ``output_dir`` named after the no | STRING |
| HIGH | src/notebooklm_tools/services/downloads.py | 781 | Run download_all() over every notebook in the account. Each notebook gets its own subdirectory of ``output_dir``. A | STRING |
| HIGH | src/notebooklm_tools/services/sources.py | 149 | Add a source to a notebook. Centralizes validation and routing for all source types. Args: client: Aut | STRING |
| HIGH | src/notebooklm_tools/services/sources.py | 307 | Add multiple sources to a notebook. URL sources are batched into a single API call for efficiency. Non-URL sour | STRING |
| HIGH | src/notebooklm_tools/services/sources.py | 413 | List sources with Drive freshness status. Args: client: Authenticated NotebookLM client notebook_id | STRING |
| HIGH | src/notebooklm_tools/services/sources.py | 506 | Sync Drive sources with latest content. Args: client: Authenticated NotebookLM client source_ids: S | STRING |
| HIGH | src/notebooklm_tools/services/sources.py | 538 | Rename a source in a notebook. Args: client: Authenticated NotebookLM client notebook_id: Notebook | STRING |
| HIGH | src/notebooklm_tools/services/sources.py | 642 | Get AI-generated source summary with keywords. Args: client: Authenticated NotebookLM client source | STRING |
| HIGH | src/notebooklm_tools/services/sources.py | 682 | Get raw text content of a source (no AI processing). Args: client: Authenticated NotebookLM client | STRING |
| HIGH | src/notebooklm_tools/services/chat.py | 240 | Query a notebook's sources with AI. Args: client: Authenticated NotebookLM client notebook_id: Note | STRING |
| HIGH | src/notebooklm_tools/services/chat.py | 323 | Configure notebook chat settings. Args: client: Authenticated NotebookLM client notebook_id: Notebo | STRING |
| HIGH | src/notebooklm_tools/services/chat.py | 396 | Delete the chat history for a notebook. Fetches the notebook's persistent conversation ID, then deletes the ass | STRING |
| 12 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tests/conftest.py | 36 | except (OSError, ValueError): | CODE |
| HIGH | tests/test_file_upload.py | 406 | except Exception: | CODE |
| HIGH | tests/core/test_task5_mcp_perf_caching.py | 809 | except Exception: | CODE |
| HIGH | tests/cli/wizard_driver.py | 215 | except pexpect.TIMEOUT: | CODE |
| HIGH | src/notebooklm_tools/core/auth.py | 666 | except (json.JSONDecodeError, KeyError): | CODE |
| HIGH | src/notebooklm_tools/core/alias.py | 183 | except NLMError: | CODE |
| HIGH | src/notebooklm_tools/core/alias.py | 170 | except NLMError: | CODE |
| HIGH | src/notebooklm_tools/core/alias.py | 180 | except (NLMError, ServiceError, AttributeError): | CODE |
| HIGH | src/notebooklm_tools/core/auth_migration.py | 57 | except Exception: | CODE |
| HIGH | src/notebooklm_tools/core/studio.py | 656 | except Exception: | CODE |
| HIGH | src/notebooklm_tools/core/research.py | 400 | except Exception: | CODE |
| HIGH | src/notebooklm_tools/core/conversation.py | 605 | except (IndexError, TypeError): | CODE |
| HIGH | src/notebooklm_tools/core/conversation.py | 241 | except (IndexError, TypeError): | CODE |
| HIGH | src/notebooklm_tools/core/credential_store.py | 448 | except Exception: | CODE |
| HIGH | src/notebooklm_tools/core/credential_store.py | 459 | except Exception: | CODE |
| HIGH | src/notebooklm_tools/core/credential_store.py | 470 | except Exception: | CODE |
| HIGH | src/notebooklm_tools/core/credential_store.py | 1032 | except OSError: | CODE |
| HIGH | src/notebooklm_tools/core/sources.py | 147 | except Exception: | CODE |
| HIGH | src/notebooklm_tools/core/utils.py | 149 | except json.JSONDecodeError: | CODE |
| HIGH | src/notebooklm_tools/core/cdp_transport.py | 151 | except Exception: | CODE |
| HIGH | src/notebooklm_tools/core/base.py | 1164 | except AuthenticationError: | CODE |
| HIGH | src/notebooklm_tools/core/base.py | 753 | except json.JSONDecodeError: | CODE |
| HIGH | src/notebooklm_tools/core/base.py | 761 | except json.JSONDecodeError: | CODE |
| HIGH | src/notebooklm_tools/utils/config.py | 307 | except ImportError: | CODE |
| HIGH | src/notebooklm_tools/utils/config.py | 832 | except Exception: | CODE |
| HIGH | src/notebooklm_tools/utils/wsl.py | 74 | except (OSError, FileNotFoundError): | CODE |
| HIGH | src/notebooklm_tools/utils/wsl.py | 243 | except Exception: | CODE |
| HIGH | src/notebooklm_tools/utils/cdp.py | 256 | except OSError: | CODE |
| HIGH | src/notebooklm_tools/utils/cdp.py | 594 | except (OSError, RuntimeError): | CODE |
| HIGH | src/notebooklm_tools/utils/cdp.py | 623 | except (OSError, RuntimeError): | CODE |
| HIGH | src/notebooklm_tools/utils/cdp.py | 1046 | except Exception: | CODE |
| HIGH | src/notebooklm_tools/utils/cdp.py | 1476 | except Exception: | CODE |
| HIGH | src/notebooklm_tools/utils/cdp.py | 348 | except OSError: | CODE |
| HIGH | src/notebooklm_tools/utils/cdp.py | 1286 | except Exception: | CODE |
| HIGH | src/notebooklm_tools/utils/cdp.py | 1729 | except Exception: | CODE |
| HIGH | src/notebooklm_tools/utils/cdp.py | 1780 | except Exception: | CODE |
| HIGH | src/notebooklm_tools/utils/cdp.py | 2050 | except Exception: | CODE |
| HIGH | src/notebooklm_tools/utils/cdp.py | 1883 | except Exception: | CODE |
| HIGH | src/notebooklm_tools/utils/browser.py | 59 | except json.JSONDecodeError: | CODE |
| HIGH | src/notebooklm_tools/mcp/tools/_utils.py | 548 | except (json.JSONDecodeError, ValueError): | CODE |
| HIGH | src/notebooklm_tools/mcp/tools/_utils.py | 338 | except Exception: | CODE |
| HIGH | src/notebooklm_tools/cli/utils.py | 160 | except (json.JSONDecodeError, OSError): | CODE |
| HIGH | src/notebooklm_tools/cli/utils.py | 180 | except OSError: | CODE |
| HIGH | src/notebooklm_tools/cli/main.py | 589 | except (NLMError, ClientAuthenticationError): | CODE |
| HIGH | src/notebooklm_tools/cli/main.py | 1587 | except Exception: | CODE |
| HIGH | src/notebooklm_tools/cli/commands/skill.py | 467 | except Exception: | CODE |
| HIGH | src/notebooklm_tools/cli/commands/repl.py | 48 | except ValueError: | CODE |
| HIGH | src/notebooklm_tools/cli/commands/download.py | 502 | except ServiceError: | CODE |
| HIGH | src/notebooklm_tools/cli/commands/setup_wizard.py | 118 | except (subprocess.SubprocessError, OSError): | CODE |
| HIGH | src/notebooklm_tools/cli/commands/setup_wizard.py | 453 | except Exception: | CODE |
| HIGH | src/notebooklm_tools/cli/commands/setup_wizard.py | 872 | except Exception: | CODE |
| HIGH | src/notebooklm_tools/cli/commands/setup_wizard.py | 888 | except Exception: | CODE |
| HIGH | src/notebooklm_tools/cli/commands/setup_wizard.py | 904 | except Exception: | CODE |
| HIGH | src/notebooklm_tools/cli/commands/setup_wizard.py | 923 | except Exception: | CODE |
| HIGH | src/notebooklm_tools/cli/commands/setup_wizard.py | 948 | except Exception: | CODE |
| HIGH | src/notebooklm_tools/cli/commands/setup_wizard.py | 978 | except Exception: | CODE |
| HIGH | src/notebooklm_tools/cli/commands/setup_wizard.py | 870 | except Exception: | CODE |
| HIGH | src/notebooklm_tools/cli/commands/setup.py | 1504 | except Exception: | CODE |
| HIGH | src/notebooklm_tools/cli/commands/setup.py | 1336 | except Exception: | CODE |
| HIGH | src/notebooklm_tools/cli/commands/setup.py | 1089 | except (subprocess.TimeoutExpired, FileNotFoundError, OSError): | CODE |
| 7 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tests/test_api_client.py | 25 | # Signature: ["wrb.fr", "RPC_ID", null, null, null, [16], "generic"] | COMMENT |
| HIGH | tests/test_api_client.py | 34 | # [[["wrb.fr", "rLM1Ne", null, null, null, [16], "generic"]]] | COMMENT |
| HIGH | tests/test_api_client.py | 205 | # Source structure: [[id], title, metadata, [null, 2]] | COMMENT |
| HIGH | tests/test_file_upload.py | 105 | mock_response.text = ')]}\'\n100\n[["wrb.fr","o4cbdc","[[[[\\"source-id-123\\"]]]]",null,null,null,"generic"]]' | CODE |
| HIGH | tests/test_file_upload.py | 130 | mock_response.text = ')]}\'\n100\n[["wrb.fr","o4cbdc","null",null,null,null,"generic"]]' | CODE |
| HIGH⚡ | tests/core/test_conversation.py | 1062 | # Table segment: [start, end, null, null, [dim1, dim2, rows_array]] | COMMENT |
| HIGH | tests/core/test_conversation.py | 782 | # first_elem: [text, null, conv_data, null, type_info] | COMMENT |
| HIGH⚡ | tests/core/test_conversation.py | 1061 | """Table segments (nested=null, data at segment[4]) insert <cited_table>.""" | STRING |
| HIGH | tests/core/test_sources.py | 51 | mock_response.text = ')]}\'\n[[["wrb.fr","abcdef","[[]]",null,null,null,"generic"]]]' | CODE |
| HIGH | tests/core/test_sources.py | 74 | mock_response.text = ')]}\'\n[[["wrb.fr","abcdef","[]",null,null,null,"generic"]]]' | CODE |
| HIGH⚡ | tests/services/test_interactive_reports.py | 309 | # Interactive reports store sources as [[["id"], null, 5], ...]. | COMMENT |
| HIGH | scripts/inspect_upload_dom.py | 109 | matches.push({ | CODE |
| HIGH | src/notebooklm_tools/core/sharing.py | 105 | # Payload: [[[notebook_id, null, [access_level], [notify, ""]]], 1, null, [2]] | COMMENT |
| HIGH | src/notebooklm_tools/core/sharing.py | 142 | # Payload: [[[notebook_id, [[email, null, role_code]], null, [notify_flag, message]]], 1, null, [2]] | COMMENT |
| HIGH | src/notebooklm_tools/core/labels.py | 16 | Raw format: [null, [[name, [[src_id], ...], label_id, emoji], ...]] | STRING |
| HIGH | src/notebooklm_tools/core/studio.py | 790 | # Options at position 14: [[focus_prompt, language, null, orientation, detail_level, visual_style]] | COMMENT |
| HIGH | src/notebooklm_tools/core/studio.py | 791 | # Captured RPC structure: [[null, "en", null, 1, 2, 2]] | COMMENT |
| HIGH | src/notebooklm_tools/core/studio.py | 984 | # Options at position 7: [null, [title, desc, null, sources, lang, prompt, null, True]] | COMMENT |
| HIGH | src/notebooklm_tools/core/studio.py | 1067 | # Config: [2, null, null, [1, null×9, [template_code]], [element types]] | COMMENT |
| HIGH | src/notebooklm_tools/core/studio.py | 1288 | # Options at position 9: [null, [1, null, focus_prompt, null*3, [difficulty, card_count]]] | COMMENT |
| HIGH | src/notebooklm_tools/core/studio.py | 1365 | # Quiz options at position 9: [null, [2, null, focus_prompt, null*4, [question_count, difficulty]]] | COMMENT |
| HIGH | src/notebooklm_tools/core/studio.py | 1442 | # Data Table options at position 18: [null, [description, language]] | COMMENT |
| HIGH | src/notebooklm_tools/core/studio.py | 1544 | # Response is nested: [[json_string, null, [gen_ids]]] | COMMENT |
| HIGH | src/notebooklm_tools/core/studio.py | 1545 | # So result[0] is [json_string, null, [gen_ids]] | COMMENT |
| HIGH | src/notebooklm_tools/core/studio.py | 1603 | # Response is nested: [[mind_map_id, json, metadata, null, title]] | COMMENT |
| HIGH | src/notebooklm_tools/core/studio.py | 1631 | # Tombstone format: [uuid, null, 2] | COMMENT |
| HIGH | src/notebooklm_tools/core/studio.py | 1643 | # Details: [id, json, metadata, null, title] | COMMENT |
| HIGH | src/notebooklm_tools/core/studio.py | 1897 | # Heading blocks start with [null, null, ...] | COMMENT |
| HIGH | src/notebooklm_tools/core/studio.py | 1293 | None, # Reserved (must be null) | CODE |
| HIGH | src/notebooklm_tools/core/studio.py | 1370 | None, # Reserved (must be null) | CODE |
| HIGH | src/notebooklm_tools/core/studio.py | 140 | more lists, or (interactive reports) ``[["uuid"], null, 5]`` where | STRING |
| HIGH | src/notebooklm_tools/core/studio.py | 1050 | - config block: ``[2, null, null, [1, null x9, [<template>]], [<element types>]]`` | STRING |
| HIGH | src/notebooklm_tools/core/studio.py | 1051 | - content block: ``[null, null, 11, <sources>, null x30, [null, [prompt, language]]]`` | STRING |
| HIGH | src/notebooklm_tools/core/studio.py | 1847 | ``[null, null, 0, {"101": "•", "102": 1, "103": <index>, "104": <level>}]``. | STRING |
| HIGH | src/notebooklm_tools/core/research.py | 106 | # Poll params: [null, null, "notebook_id"] | COMMENT |
| HIGH | src/notebooklm_tools/core/conversation.py | 100 | # Each turn adds: [answer, null, 2] then [query, null, 1] | COMMENT |
| HIGH | src/notebooklm_tools/core/conversation.py | 478 | # For follow-ups: params[2] = [[answer, null, 2], [query, null, 1], ...] | COMMENT |
| HIGH | src/notebooklm_tools/core/conversation.py | 598 | # Each source: [[source_id], title, metadata, [null, 2]] | COMMENT |
| HIGH | src/notebooklm_tools/core/conversation.py | 849 | # Wrapper containing segments (and possibly metadata like [null, 1]) | COMMENT |
| HIGH | src/notebooklm_tools/core/conversation.py | 960 | # Table segments have segment[2] as null, data in segment[4] | COMMENT |
| HIGH⚡ | src/notebooklm_tools/core/conversation.py | 76 | Chrome expects history in format: [[answer, null, 2], [query, null, 1], ...] | STRING |
| HIGH⚡ | src/notebooklm_tools/core/conversation.py | 699 | [["wrb.fr", null, null, null, null, [3]]] | STRING |
| HIGH⚡ | src/notebooklm_tools/core/conversation.py | 700 | [["wrb.fr", null, null, null, null, [8, null, [["type.googleapis.com/...Error", [...]]]]]] | STRING |
| HIGH⚡ | src/notebooklm_tools/core/conversation.py | 750 | [["wrb.fr", null, "<nested_json>", ...]] | STRING |
| HIGH⚡ | src/notebooklm_tools/core/conversation.py | 753 | [["answer_text", null, [conv_id, hash, timestamp], null, [fmt_segments, null, null, source_passages, type_code]] | STRING |
| HIGH | src/notebooklm_tools/core/conversation.py | 983 | Each passage entry: [["passage_id"], [null, null, confidence, ..., text_passages, [[["SOURCE_ID"], ...]], ...]] | STRING |
| HIGH | src/notebooklm_tools/core/sources.py | 233 | # Sync params: [null, ["source_id"], [2]] | COMMENT |
| HIGH | src/notebooklm_tools/core/sources.py | 341 | # Source structure: [[id], title, [metadata...], [null, 2]] | COMMENT |
| HIGH | src/notebooklm_tools/core/sources.py | 517 | [[[null, "<url>", 627], [null*9, [null, null, 1]], 1]] | STRING |
| HIGH | src/notebooklm_tools/core/errors.py | 123 | [error_code, null, [[detail_type_url, [sub_codes...]]]] | STRING |
| HIGH | src/notebooklm_tools/core/notebooks.py | 53 | # [null, 1, null, [2]] - params for list notebooks | COMMENT |
| HIGH | src/notebooklm_tools/core/notebooks.py | 242 | # Response format: [title, null, id, emoji, null, metadata, null, [[goal_code, prompt?], [length_code]]] | COMMENT |
| HIGH | src/notebooklm_tools/core/base.py | 772 | where error_list = [error_code, null, [[detail_type_url, [sub_codes...]]]] | STRING |
| HIGH | src/notebooklm_tools/mcp/tools/studio.py | 396 | ({heading, text} it sits in, or null) and settings (allowed values | STRING |
| HIGH | src/notebooklm_tools/services/studio.py | 663 | returned every field null, leaving agents to poll forever). | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_file_upload.py | 406 | except Exception: | CODE |
| LOW | tests/core/test_auth_migration_protected.py | 700 | except Exception: | CODE |
| LOW | tests/core/test_task3_routing_contract.py | 352 | except Exception as e: | CODE |
| LOW | tests/core/test_thread_safety.py | 106 | except Exception as e: | CODE |
| LOW | tests/core/test_thread_safety.py | 113 | except Exception as e: | CODE |
| MEDIUM | tests/core/test_thread_safety.py | 102 | def writer(): | CODE |
| MEDIUM | tests/core/test_thread_safety.py | 109 | def clearer(): | CODE |
| MEDIUM | tests/core/test_task5_mcp_perf_caching.py | 153 | def load_task(): | CODE |
| LOW | tests/core/test_task5_mcp_perf_caching.py | 157 | except Exception as e: | CODE |
| LOW | tests/core/test_task5_mcp_perf_caching.py | 809 | except Exception: | CODE |
| LOW | tests/services/test_smart_select.py | 166 | except Exception as exc: # pragma: no cover - asserted below | CODE |
| LOW | docs/MULTI_USER_ANALYSIS.md | 368 | except Exception as e: | CODE |
| LOW | docs/superpowers/plans/2026-09-27-guided-setup.md | 122 | except Exception: | CODE |
| LOW | scripts/test_label_rpcs.py | 140 | except Exception as e: | CODE |
| LOW | scripts/test_label_rpcs.py | 163 | except Exception as e: | CODE |
| LOW | scripts/test_label_rpcs.py | 174 | except Exception as e: | CODE |
| LOW | scripts/test_label_rpcs.py | 188 | except Exception as e: | CODE |
| LOW | scripts/test_label_rpcs.py | 200 | except Exception as e: | CODE |
| LOW | scripts/test_label_rpcs.py | 210 | except Exception as e: | CODE |
| LOW | scripts/inject_cookies_and_inspect.py | 96 | except Exception as e: | CODE |
| LOW | scripts/inspect_upload_dom.py | 53 | except Exception as e: | CODE |
| LOW | scripts/smoke_credential_store.py | 551 | except Exception as exc: | CODE |
| LOW | src/notebooklm_tools/core/auth.py | 131 | except Exception as e: | CODE |
| LOW | src/notebooklm_tools/core/auth.py | 618 | except Exception as e: | CODE |
| LOW | src/notebooklm_tools/core/auth.py | 717 | except Exception: | CODE |
| LOW | src/notebooklm_tools/core/auth.py | 811 | except Exception: | CODE |
| LOW | src/notebooklm_tools/core/auth.py | 848 | except Exception as exc: | CODE |
| LOW | src/notebooklm_tools/core/auth.py | 935 | except Exception as exc: | CODE |
| LOW | src/notebooklm_tools/core/auth.py | 1082 | except Exception as e: | CODE |
| LOW | src/notebooklm_tools/core/auth.py | 1151 | except Exception as exc: | CODE |
| LOW | src/notebooklm_tools/core/auth.py | 1191 | except Exception as exc: | CODE |
| LOW | src/notebooklm_tools/core/auth_migration.py | 57 | except Exception: | CODE |
| LOW | src/notebooklm_tools/core/auth_migration.py | 137 | except Exception as exc: | CODE |
| LOW | src/notebooklm_tools/core/auth_migration.py | 266 | except Exception as exc: | CODE |
| LOW | src/notebooklm_tools/core/auth_migration.py | 284 | except Exception as exc: | CODE |
| LOW | src/notebooklm_tools/core/auth_migration.py | 299 | except Exception as exc: | CODE |
| LOW | src/notebooklm_tools/core/auth_migration.py | 314 | except Exception as exc: | CODE |
| LOW | src/notebooklm_tools/core/auth_migration.py | 610 | except Exception: | CODE |
| LOW | src/notebooklm_tools/core/auth_migration.py | 869 | except Exception as e: | CODE |
| LOW | src/notebooklm_tools/core/auth_migration.py | 945 | except Exception: | CODE |
| LOW | src/notebooklm_tools/core/auth_migration.py | 979 | except Exception as exc: | CODE |
| LOW | src/notebooklm_tools/core/studio.py | 51 | except Exception: | CODE |
| LOW | src/notebooklm_tools/core/studio.py | 656 | except Exception: | CODE |
| LOW | src/notebooklm_tools/core/studio.py | 720 | except Exception: | CODE |
| LOW | src/notebooklm_tools/core/research.py | 376 | except Exception: | CODE |
| LOW | src/notebooklm_tools/core/research.py | 400 | except Exception: | CODE |
| LOW | src/notebooklm_tools/core/conversation.py | 224 | except Exception: | CODE |
| LOW | src/notebooklm_tools/core/conversation.py | 284 | except Exception: | CODE |
| LOW | src/notebooklm_tools/core/conversation.py | 499 | except Exception: | CODE |
| LOW | src/notebooklm_tools/core/download.py | 274 | except Exception as e: | CODE |
| LOW | src/notebooklm_tools/core/download.py | 330 | except Exception as e: | CODE |
| LOW⚡ | src/notebooklm_tools/core/credential_store.py | 888 | except Exception as exc: | CODE |
| LOW⚡ | src/notebooklm_tools/core/credential_store.py | 897 | except Exception as exc: | CODE |
| LOW⚡ | src/notebooklm_tools/core/credential_store.py | 906 | except Exception as exc: | CODE |
| LOW⚡ | src/notebooklm_tools/core/credential_store.py | 913 | except Exception as exc: | CODE |
| LOW | src/notebooklm_tools/core/credential_store.py | 128 | except Exception: | CODE |
| LOW | src/notebooklm_tools/core/credential_store.py | 448 | except Exception: | CODE |
| LOW | src/notebooklm_tools/core/credential_store.py | 459 | except Exception: | CODE |
| LOW | src/notebooklm_tools/core/credential_store.py | 470 | except Exception: | CODE |
| LOW | src/notebooklm_tools/core/credential_store.py | 676 | except Exception: | CODE |
| 277 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | README.md | 243 | ### Step 1: Check What You Have Installed | COMMENT |
| LOW⚡ | README.md | 255 | ### Step 2: Uninstall Legacy Packages | COMMENT |
| LOW⚡ | README.md | 265 | ### Step 3: Reinstall the Unified Package | COMMENT |
| LOW⚡ | README.md | 275 | ### Step 4: Verify Installation | COMMENT |
| LOW | README.md | 289 | ### Step 5: Re-authenticate | COMMENT |
| LOW⚡ | tests/test_macos_keychain_smoke.py | 40 | # Step 1: Initial read on nonexistent item must return None | COMMENT |
| LOW⚡ | tests/test_macos_keychain_smoke.py | 44 | # Step 2: Store secret in macOS Keychain | COMMENT |
| LOW⚡ | tests/test_macos_keychain_smoke.py | 47 | # Step 3: Read back secret and verify exact match | COMMENT |
| LOW⚡ | tests/test_macos_keychain_smoke.py | 51 | # Step 4: Verify timeout bounded execution (< 2.0s for 0.5s timeout) | COMMENT |
| LOW | tests/test_macos_keychain_smoke.py | 71 | # Step 5: Guaranteed cleanup | COMMENT |
| LOW | docs/API_REFERENCE.md | 2035 | # Step 1: reassign orphaned sources to a different label | COMMENT |
| LOW | docs/API_REFERENCE.md | 2038 | # Step 2: delete the label | COMMENT |
| LOW | docs/MULTI_USER_ANALYSIS.md | 569 | ### Step 1: Authenticate Gemini Notebook Account | COMMENT |
| LOW | docs/MULTI_USER_ANALYSIS.md | 576 | ### Step 2: Start MCP Server | COMMENT |
| LOW | docs/MULTI_USER_ANALYSIS.md | 588 | ### Step 3: Add Open WebUI Function | COMMENT |
| LOW | docs/MULTI_USER_ANALYSIS.md | 595 | ### Step 4: Test User Isolation | COMMENT |
| LOW⚡ | src/notebooklm_tools/core/sources.py | 1025 | # Step 1: Register source intent → get SOURCE_ID | COMMENT |
| LOW⚡ | src/notebooklm_tools/core/sources.py | 1028 | # Step 2: Start resumable upload → get upload URL | COMMENT |
| LOW⚡ | src/notebooklm_tools/core/sources.py | 1031 | # Step 3: Stream upload file content | COMMENT |
| LOW⚡ | src/notebooklm_tools/data/references/workflows.md | 45 | # Step 1: Authenticate (opens Chrome) | COMMENT |
| LOW⚡ | src/notebooklm_tools/data/references/workflows.md | 48 | # Step 2: Verify authentication | COMMENT |
| LOW⚡ | src/notebooklm_tools/data/references/workflows.md | 52 | # Step 3: Create a notebook | COMMENT |
| LOW⚡ | src/notebooklm_tools/data/references/workflows.md | 56 | # Step 4: Set alias for convenience | COMMENT |
| LOW⚡ | src/notebooklm_tools/data/references/workflows.md | 59 | # Step 5: Verify | COMMENT |
| LOW⚡ | src/notebooklm_tools/data/references/workflows.md | 105 | # Step 1: Create dedicated notebook | COMMENT |
| LOW⚡ | src/notebooklm_tools/data/references/workflows.md | 109 | # Step 2: Set alias | COMMENT |
| LOW⚡ | src/notebooklm_tools/data/references/workflows.md | 112 | # Step 3: Start deep research (takes ~5 minutes) | COMMENT |
| LOW⚡ | src/notebooklm_tools/data/references/workflows.md | 116 | # Step 4: Monitor progress (polls until complete or timeout) | COMMENT |
| LOW⚡ | src/notebooklm_tools/data/references/workflows.md | 119 | # Step 5: View discovered sources | COMMENT |
| LOW⚡ | src/notebooklm_tools/data/references/workflows.md | 122 | # Step 6: Import all discovered sources | COMMENT |
| LOW⚡ | src/notebooklm_tools/data/references/workflows.md | 127 | # Step 7: Generate podcast | COMMENT |
| LOW⚡ | src/notebooklm_tools/data/references/workflows.md | 130 | # Step 8: Check generation status (podcast takes 2-5 minutes) | COMMENT |
| LOW⚡ | src/notebooklm_tools/data/references/workflows.md | 134 | # Step 9: Get podcast URL from studio status output | COMMENT |
| LOW⚡ | src/notebooklm_tools/data/references/workflows.md | 149 | # Step 1: Verify sources exist | COMMENT |
| LOW⚡ | src/notebooklm_tools/data/references/workflows.md | 152 | # Step 2: Generate study guide report | COMMENT |
| LOW⚡ | src/notebooklm_tools/data/references/workflows.md | 156 | # Step 3: Generate quiz (10 questions, medium difficulty) | COMMENT |
| LOW⚡ | src/notebooklm_tools/data/references/workflows.md | 160 | # Step 4: Generate flashcards | COMMENT |
| LOW⚡ | src/notebooklm_tools/data/references/workflows.md | 164 | # Step 5: Generate mind map for visual overview | COMMENT |
| LOW⚡ | src/notebooklm_tools/data/references/workflows.md | 167 | # Step 6: Check all generated artifacts | COMMENT |
| LOW⚡ | src/notebooklm_tools/data/references/workflows.md | 201 | # Step 1: Check current freshness status | COMMENT |
| LOW⚡ | src/notebooklm_tools/data/references/workflows.md | 205 | # Step 2: Quick check (skip freshness API calls) | COMMENT |
| LOW⚡ | src/notebooklm_tools/data/references/workflows.md | 208 | # Step 3: Find stale sources | COMMENT |
| LOW⚡ | src/notebooklm_tools/data/references/workflows.md | 212 | # Step 4: Sync all stale sources | COMMENT |
| LOW⚡ | src/notebooklm_tools/data/references/workflows.md | 215 | # Step 5: Sync specific sources only | COMMENT |
| LOW⚡ | src/notebooklm_tools/data/references/workflows.md | 218 | # Step 6: Verify all fresh | COMMENT |
| LOW⚡ | src/notebooklm_tools/data/references/workflows.md | 230 | # Step 1: Login to work account | COMMENT |
| LOW⚡ | src/notebooklm_tools/data/references/workflows.md | 233 | # Step 2: Login to personal account | COMMENT |
| LOW⚡ | src/notebooklm_tools/data/references/workflows.md | 236 | # Step 3: List all profiles | COMMENT |
| LOW⚡ | src/notebooklm_tools/data/references/workflows.md | 239 | # Step 4: Switch default profile | COMMENT |
| LOW⚡ | src/notebooklm_tools/data/references/workflows.md | 242 | # Step 5: Use specific profile for commands | COMMENT |
| LOW⚡ | src/notebooklm_tools/data/references/workflows.md | 246 | # Step 6: Create notebook in specific account | COMMENT |
| LOW⚡ | src/notebooklm_tools/data/references/workflows.md | 257 | # Step 1: List sources | COMMENT |
| LOW⚡ | src/notebooklm_tools/data/references/workflows.md | 260 | # Step 2: Get AI summary of a source | COMMENT |
| LOW⚡ | src/notebooklm_tools/data/references/workflows.md | 263 | # Step 3: Get raw text content | COMMENT |
| LOW⚡ | src/notebooklm_tools/data/references/workflows.md | 266 | # Step 4: Export to file | COMMENT |
| LOW⚡ | src/notebooklm_tools/data/references/workflows.md | 269 | # Step 5: Export multiple sources (script pattern) | COMMENT |
| LOW⚡ | src/notebooklm_tools/data/references/workflows.md | 283 | # Step 1: Create focused notebook | COMMENT |
| LOW⚡ | src/notebooklm_tools/data/references/workflows.md | 287 | # Step 2: Add relevant sources | COMMENT |
| LOW⚡ | src/notebooklm_tools/data/references/workflows.md | 292 | # Step 3: Generate slide deck | COMMENT |
| LOW⚡ | src/notebooklm_tools/data/references/workflows.md | 296 | # Step 4: Generate briefing doc | COMMENT |
| 24 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/core/test_notebooks.py | 60 | CODE | |
| LOW | tests/core/test_notebooks.py | 115 | CODE | |
| LOW | tests/core/test_sources.py | 44 | CODE | |
| LOW | tests/core/test_sources.py | 67 | CODE | |
| LOW | src/notebooklm_tools/core/auth.py | 229 | CODE | |
| LOW | src/notebooklm_tools/core/auth.py | 624 | CODE | |
| LOW | src/notebooklm_tools/core/exports.py | 111 | CODE | |
| LOW | src/notebooklm_tools/core/sharing.py | 23 | CODE | |
| LOW | src/notebooklm_tools/core/alias.py | 152 | CODE | |
| LOW | src/notebooklm_tools/core/auth_migration.py | 43 | CODE | |
| LOW | src/notebooklm_tools/core/auth_migration.py | 393 | CODE | |
| LOW | src/notebooklm_tools/core/auth_migration.py | 781 | CODE | |
| LOW | src/notebooklm_tools/core/studio.py | 377 | CODE | |
| LOW | src/notebooklm_tools/core/studio.py | 667 | CODE | |
| LOW | src/notebooklm_tools/core/studio.py | 1619 | CODE | |
| LOW | src/notebooklm_tools/core/research.py | 89 | CODE | |
| LOW | src/notebooklm_tools/core/research.py | 275 | CODE | |
| LOW | src/notebooklm_tools/core/conversation.py | 203 | CODE | |
| LOW | src/notebooklm_tools/core/conversation.py | 245 | CODE | |
| LOW | src/notebooklm_tools/core/conversation.py | 355 | CODE | |
| LOW | src/notebooklm_tools/core/conversation.py | 583 | CODE | |
| LOW | src/notebooklm_tools/core/conversation.py | 695 | CODE | |
| LOW | src/notebooklm_tools/core/conversation.py | 744 | CODE | |
| LOW | src/notebooklm_tools/core/conversation.py | 822 | CODE | |
| LOW | src/notebooklm_tools/core/conversation.py | 885 | CODE | |
| LOW | src/notebooklm_tools/core/conversation.py | 979 | CODE | |
| LOW | src/notebooklm_tools/core/download.py | 138 | CODE | |
| LOW | src/notebooklm_tools/core/download.py | 285 | CODE | |
| LOW | src/notebooklm_tools/core/download.py | 355 | CODE | |
| LOW | src/notebooklm_tools/core/download.py | 459 | CODE | |
| LOW | src/notebooklm_tools/core/download.py | 938 | CODE | |
| LOW | src/notebooklm_tools/core/credential_store.py | 413 | CODE | |
| LOW | src/notebooklm_tools/core/credential_store.py | 753 | CODE | |
| LOW | src/notebooklm_tools/core/credential_store.py | 833 | CODE | |
| LOW | src/notebooklm_tools/core/credential_store.py | 925 | CODE | |
| LOW | src/notebooklm_tools/core/credential_store.py | 1049 | CODE | |
| LOW | src/notebooklm_tools/core/notes.py | 18 | CODE | |
| LOW | src/notebooklm_tools/core/notes.py | 73 | CODE | |
| LOW | src/notebooklm_tools/core/notices.py | 106 | CODE | |
| LOW | src/notebooklm_tools/core/sources.py | 111 | CODE | |
| LOW | src/notebooklm_tools/core/sources.py | 152 | CODE | |
| LOW | src/notebooklm_tools/core/sources.py | 231 | CODE | |
| LOW | src/notebooklm_tools/core/sources.py | 326 | CODE | |
| LOW | src/notebooklm_tools/core/sources.py | 403 | CODE | |
| LOW | src/notebooklm_tools/core/sources.py | 545 | CODE | |
| LOW | src/notebooklm_tools/core/sources.py | 652 | CODE | |
| LOW | src/notebooklm_tools/core/sources.py | 665 | CODE | |
| LOW | src/notebooklm_tools/core/sources.py | 1046 | CODE | |
| LOW | src/notebooklm_tools/core/sources.py | 1068 | CODE | |
| LOW | src/notebooklm_tools/core/credential_backend_worker.py | 311 | CODE | |
| LOW | src/notebooklm_tools/core/credential_backend_worker.py | 150 | CODE | |
| LOW | src/notebooklm_tools/core/credential_backend_worker.py | 157 | CODE | |
| LOW | src/notebooklm_tools/core/utils.py | 64 | CODE | |
| LOW | src/notebooklm_tools/core/cdp_transport.py | 92 | CODE | |
| LOW | src/notebooklm_tools/core/notebooks.py | 37 | CODE | |
| LOW | src/notebooklm_tools/core/notebooks.py | 153 | CODE | |
| LOW | src/notebooklm_tools/core/base.py | 590 | CODE | |
| LOW | src/notebooklm_tools/core/base.py | 720 | CODE | |
| LOW | src/notebooklm_tools/core/base.py | 767 | CODE | |
| LOW | src/notebooklm_tools/core/base.py | 848 | CODE | |
| 86 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_mcp_cli_parity.py | 7 | CODE | |
| LOW | tests/test_cdp_port_fallback.py | 3 | CODE | |
| LOW | tests/test_tool_groups.py | 95 | CODE | |
| LOW | tests/test_cdp_port_map.py | 3 | CODE | |
| LOW | tests/test_config_home_dir.py | 1 | CODE | |
| LOW | tests/test_launcher.py | 3 | CODE | |
| LOW | tests/core/test_auth_check.py | 15 | CODE | |
| LOW | tests/core/test_auth_windows_sharing.py | 3 | CODE | |
| LOW | tests/core/test_cookie_rotation.py | 1 | CODE | |
| LOW | tests/cli/wizard_driver.py | 15 | CODE | |
| LOW | tests/services/test_auth_replay_diagnostic.py | 1 | CODE | |
| LOW | tests/services/test_auth_health.py | 20 | CODE | |
| LOW | tests/services/test_report_element_generation.py | 5 | CODE | |
| LOW | scripts/smoke_credential_store.py | 22 | CODE | |
| LOW | src/notebooklm_tools/__init__.py | 3 | CODE | |
| LOW | src/notebooklm_tools/__init__.py | 7 | CODE | |
| LOW | src/notebooklm_tools/core/cookie_rotation.py | 13 | CODE | |
| LOW | src/notebooklm_tools/core/__init__.py | 3 | CODE | |
| LOW | src/notebooklm_tools/core/credential_store.py | 7 | CODE | |
| LOW | src/notebooklm_tools/core/notices.py | 11 | CODE | |
| LOW | src/notebooklm_tools/core/credential_backend_worker.py | 8 | CODE | |
| LOW | src/notebooklm_tools/core/cdp_transport.py | 9 | CODE | |
| LOW | src/notebooklm_tools/utils/firefox.py | 3 | CODE | |
| LOW | src/notebooklm_tools/utils/io_encoding.py | 10 | CODE | |
| LOW | src/notebooklm_tools/mcp/server.py | 95 | CODE | |
| LOW | src/notebooklm_tools/mcp/server.py | 95 | CODE | |
| LOW | src/notebooklm_tools/mcp/server.py | 95 | CODE | |
| LOW | src/notebooklm_tools/mcp/server.py | 95 | CODE | |
| LOW | src/notebooklm_tools/mcp/server.py | 95 | CODE | |
| LOW | src/notebooklm_tools/mcp/server.py | 95 | CODE | |
| LOW | src/notebooklm_tools/mcp/server.py | 95 | CODE | |
| LOW | src/notebooklm_tools/mcp/server.py | 95 | CODE | |
| LOW | src/notebooklm_tools/mcp/server.py | 95 | CODE | |
| LOW | src/notebooklm_tools/mcp/server.py | 95 | CODE | |
| LOW | src/notebooklm_tools/mcp/server.py | 95 | CODE | |
| LOW | src/notebooklm_tools/mcp/server.py | 95 | CODE | |
| LOW | src/notebooklm_tools/mcp/server.py | 95 | CODE | |
| LOW | src/notebooklm_tools/mcp/server.py | 95 | CODE | |
| LOW | src/notebooklm_tools/mcp/server.py | 95 | CODE | |
| LOW | src/notebooklm_tools/mcp/server.py | 95 | CODE | |
| LOW | src/notebooklm_tools/mcp/server.py | 95 | CODE | |
| LOW | src/notebooklm_tools/mcp/server.py | 95 | CODE | |
| LOW | src/notebooklm_tools/mcp/server.py | 95 | CODE | |
| LOW | src/notebooklm_tools/mcp/server.py | 95 | CODE | |
| LOW | src/notebooklm_tools/mcp/server.py | 95 | CODE | |
| LOW | src/notebooklm_tools/mcp/tool_groups.py | 23 | CODE | |
| LOW | src/notebooklm_tools/mcp/tools/__init__.py | 4 | CODE | |
| LOW | src/notebooklm_tools/mcp/tools/__init__.py | 5 | CODE | |
| LOW | src/notebooklm_tools/mcp/tools/__init__.py | 5 | CODE | |
| LOW | src/notebooklm_tools/mcp/tools/__init__.py | 6 | CODE | |
| LOW | src/notebooklm_tools/mcp/tools/__init__.py | 7 | CODE | |
| LOW | src/notebooklm_tools/mcp/tools/__init__.py | 7 | CODE | |
| LOW | src/notebooklm_tools/mcp/tools/__init__.py | 7 | CODE | |
| LOW | src/notebooklm_tools/mcp/tools/__init__.py | 7 | CODE | |
| LOW | src/notebooklm_tools/mcp/tools/__init__.py | 13 | CODE | |
| LOW | src/notebooklm_tools/mcp/tools/__init__.py | 13 | CODE | |
| LOW | src/notebooklm_tools/mcp/tools/__init__.py | 13 | CODE | |
| LOW | src/notebooklm_tools/mcp/tools/__init__.py | 13 | CODE | |
| LOW | src/notebooklm_tools/mcp/tools/__init__.py | 14 | CODE | |
| LOW | src/notebooklm_tools/mcp/tools/__init__.py | 14 | CODE | |
| 72 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | tests/test_mcp_file_upload.py | 22 | # Create a test file | COMMENT |
| MEDIUM⚡ | tests/test_file_upload.py | 25 | # Create a mock client with minimal setup | COMMENT |
| MEDIUM | tests/test_file_upload.py | 78 | # Create a JSON file (unsupported type) | COMMENT |
| MEDIUM | tests/test_file_upload.py | 212 | # Create a temporary test file | COMMENT |
| MEDIUM | tests/test_file_upload.py | 252 | # Create a test file | COMMENT |
| MEDIUM | tests/test_e2e.py | 128 | # Create a dummy file | COMMENT |
| MEDIUM⚡ | tests/services/test_pipeline.py | 141 | # Create a simple user pipeline | COMMENT |
| MEDIUM⚡ | src/notebooklm_tools/core/client.py | 78 | # The following methods are provided by ConversationMixin: | COMMENT |
| MEDIUM⚡ | src/notebooklm_tools/core/client.py | 91 | # The following methods are provided by NotebookMixin: | COMMENT |
| MEDIUM⚡ | src/notebooklm_tools/core/client.py | 103 | # The following methods are provided by SharingMixin: | COMMENT |
| MEDIUM⚡ | src/notebooklm_tools/core/client.py | 111 | # The following methods are provided by SourceMixin: | COMMENT |
| MEDIUM⚡ | src/notebooklm_tools/core/client.py | 126 | # The following methods are provided by ResearchMixin: | COMMENT |
| MEDIUM⚡ | src/notebooklm_tools/core/client.py | 135 | # The following methods are provided by StudioMixin: | COMMENT |
| MEDIUM⚡ | src/notebooklm_tools/core/client.py | 146 | # The following methods are provided by NotesMixin: | COMMENT |
| MEDIUM | src/notebooklm_tools/utils/wsl.py | 257 | # Create a temp profile directory on the WINDOWS filesystem. | COMMENT |
| MEDIUM | src/notebooklm_tools/utils/wsl.py | 281 | # Create a unique subdir name | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | docs/API_REFERENCE.md | 69 | # Get AI-generated summary of what a notebook is about | COMMENT |
| HIGH | docs/API_REFERENCE.md | 74 | # Get AI-generated summary of a specific source | COMMENT |
| HIGH | docs/API_REFERENCE.md | 651 | "description", # AI-generated description | CODE |
| HIGH | docs/API_REFERENCE.md | 656 | "summary" # AI-generated summary of sources | CODE |
| HIGH | docs/API_REFERENCE.md | 1077 | "The provided documents explore...", # AI-generated summary (markdown formatted) | CODE |
| HIGH | docs/API_REFERENCE.md | 1113 | # AI-generated summary with **bold** markdown for keywords | COMMENT |
| HIGH | docs/API_REFERENCE.md | 1338 | | **Card Count** | Default count generated by AI | | CODE |
| HIGH | docs/API_REFERENCE.md | 1468 | "Generated Title" # AI-generated title | CODE |
| HIGH | src/notebooklm_tools/data/SKILL.md | 270 | nlm notebook describe <id> # AI-generated summary + suggested topics | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | tests/test_auth_browser.py | 253 | auth.save_profile(cookies={"SID": "sid", "HSID": "hsid"}, email="user@example.com") | CODE |
| LOW | tests/test_mcp_storage_notice.py | 38 | auth.save_profile(cookies={"SID": "test_sid"}, email="user@example.com") | CODE |
| LOW | tests/test_mcp_storage_notice.py | 80 | auth.save_profile(cookies={"SID": "test_sid"}, email="user@example.com") | CODE |
| LOW⚡ | tests/test_mcp_storage_notice.py | 97 | auth.save_profile(cookies={"SID": "test_sid"}, email="user@example.com") | CODE |
| LOW⚡ | tests/test_mcp_storage_notice.py | 108 | auth.save_profile(cookies={"SID": "test_sid"}, email="user@example.com") | CODE |
| LOW⚡ | tests/test_mcp_storage_notice.py | 127 | auth.save_profile(cookies={"SID": "test_sid"}, email="user@example.com") | CODE |
| LOW | tests/test_cdp_port_map.py | 161 | profile_dir = tmp_path / "John Doe" / "nlm-profile" | CODE |
| LOW | tests/core/test_task3_routing_contract.py | 118 | email="user@example.com", | CODE |
| LOW⚡ | tests/core/test_task4_main_parity.py | 79 | email="user@example.com", | CODE |
| LOW | tests/cli/test_storage_cleanup_backups.py | 76 | auth.save_profile(cookies={"SID": "active_sid"}, email="user@example.com") | CODE |
| LOW | tests/cli/test_storage_cleanup_backups.py | 121 | auth.save_profile(cookies={"SID": "active_sid"}, email="user@example.com") | CODE |
| LOW | tests/cli/test_storage_cleanup_backups.py | 145 | AuthManager("default").save_profile(cookies={"SID": "active_sid"}, email="user@example.com") | CODE |
| LOW | tests/cli/test_auth_storage_switch.py | 54 | auth.save_profile(cookies={"SID": "my_sid"}, email="user@example.com") | CODE |
| LOW⚡ | tests/cli/test_login.py | 49 | return SimpleNamespace(name=self.profile_name, email="user@example.com") | CODE |
| LOW⚡ | tests/cli/test_login.py | 63 | return SimpleNamespace(name=auth.profile_name, email="user@example.com"), 3 | CODE |
| LOW | tests/cli/test_login.py | 90 | return SimpleNamespace(name=auth.profile_name, email="user@example.com"), 3 | CODE |
| LOW | tests/cli/test_login.py | 103 | "email": "user@example.com", | CODE |
| LOW | tests/cli/test_login.py | 122 | "email": "user@example.com", | CODE |
| LOW | tests/cli/test_login.py | 143 | return SimpleNamespace(name=auth.profile_name, email="user@example.com"), 3 | CODE |
| LOW | tests/cli/test_login.py | 151 | "email": "user@example.com", | CODE |
| LOW | tests/cli/test_login.py | 183 | email="user@example.com", | CODE |
| LOW | tests/cli/test_login_storage_choice.py | 271 | "email": "user@example.com", | CODE |
| LOW | tests/cli/test_profile_storage.py | 39 | email="user@example.com", | CODE |
| LOW | tests/cli/test_profile_storage.py | 61 | assert loaded.email == "user@example.com" | CODE |
| LOW | tests/cli/test_protect_shared_answer.py | 38 | auth.save_profile(cookies={"SID": "sid"}, email="user@example.com") | CODE |
| LOW | tests/cli/test_protect_shared_answer.py | 69 | auth.save_profile(cookies={"SID": "sid"}, email="user@example.com") | CODE |
| LOW | tests/cli/test_protect_shared_answer.py | 97 | auth.save_profile(cookies={"SID": "sid"}, email="user@example.com") | CODE |
| LOW | tests/cli/test_protect_shared_answer.py | 125 | auth.save_profile(cookies={"SID": "sid"}, email="user@example.com") | CODE |
| LOW | tests/cli/test_storage_notice.py | 28 | auth.save_profile(cookies={"SID": "test_sid"}, email="user@example.com") | CODE |
| LOW | tests/cli/test_storage_notice.py | 56 | auth.save_profile(cookies={"SID": "test_sid"}, email="user@example.com") | CODE |
| LOW | tests/cli/test_storage_notice.py | 84 | auth.save_profile(cookies={"SID": "test_sid"}, email="user@example.com") | CODE |
| LOW | tests/cli/test_storage_notice.py | 100 | auth.save_profile(cookies={"SID": "test_sid"}, email="user@example.com") | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/core/test_credential_backend_worker.py | 45 | def set_password(self, service: str, account: str, password: str) -> None: | CODE |
| LOW | tests/core/test_auth_migration_protected.py | 710 | def set_password(self, s: str, a: str, pw: str) -> None: | CODE |
| LOW⚡ | tests/cli/test_setup_wizard_e2e.py | 74 | def _set_skill_version(path, version: str) -> None: | CODE |
| LOW | scripts/smoke_credential_store.py | 389 | def set_password(self, service: str, account: str, password: str) -> None: | CODE |
| LOW | src/notebooklm_tools/__init__.py | 11 | __all__ = ["NotebookLMClient", "__version__"] | CODE |
| LOW | src/notebooklm_tools/core/auth.py | 22 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/notebooklm_tools/core/alias.py | 96 | def set_alias(self, name: str, value: str, alias_type: str = "unknown") -> None: | CODE |
| LOW⚡ | src/notebooklm_tools/core/auth_migration.py | 40 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/notebooklm_tools/core/cookie_rotation.py | 25 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/notebooklm_tools/core/__init__.py | 5 | __all__ = ["load_cached_tokens", "save_tokens_to_cache", "constants"] | CODE |
| LOW | src/notebooklm_tools/core/credential_store.py | 305 | def set_password(self, service: str, account: str, password: str) -> None: | CODE |
| LOW | src/notebooklm_tools/core/credential_store.py | 322 | def set_password(self, service: str, account: str, password: str) -> None: | CODE |
| LOW | src/notebooklm_tools/core/credential_store.py | 343 | def set_password(self, service: str, username: str, password: str) -> None: | CODE |
| LOW | src/notebooklm_tools/core/credential_store.py | 363 | def set_password(self, service: str, account: str, password: str) -> None: | CODE |
| LOW | src/notebooklm_tools/core/credential_store.py | 388 | def set_password(self, service: str, account: str, password: str) -> None: | CODE |
| LOW | src/notebooklm_tools/core/credential_store.py | 402 | def set_backend_factory(factory: Callable[[], CredentialBackend] | None) -> None: | CODE |
| LOW | src/notebooklm_tools/core/credential_backend_worker.py | 98 | def set_password(self, service: str, account: str, password: str) -> None: | CODE |
| LOW | src/notebooklm_tools/core/collections.py | 8 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/notebooklm_tools/core/notebooks.py | 21 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/notebooklm_tools/core/usage.py | 13 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/notebooklm_tools/core/base.py | 1349 | def _update_cached_tokens(self) -> None: | CODE |
| LOW | src/notebooklm_tools/utils/config.py | 656 | def set_auth_storage_mode(profile_name: str, mode: str) -> None: | CODE |
| LOW | src/notebooklm_tools/utils/config.py | 811 | def set_session_profile(name: str | None) -> None: | CODE |
| LOW | src/notebooklm_tools/utils/wsl.py | 39 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/notebooklm_tools/utils/cdp.py | 85 | __all__ = [ | CODE |
| LOW | src/notebooklm_tools/mcp/tools/__init__.py | 69 | __all__ = [ | CODE |
| LOW | src/notebooklm_tools/mcp/tools/_utils.py | 270 | def set_query_timeout(timeout: float) -> None: | CODE |
| LOW | src/notebooklm_tools/cli/commands/setup.py | 1509 | def _setup_all() -> None: | CODE |
| LOW | src/notebooklm_tools/cli/commands/setup.py | 1683 | def _setup_json() -> None: | CODE |
| LOW | src/notebooklm_tools/services/auth.py | 38 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/notebooklm_tools/services/auth.py | 40 | __all__ = [ | CODE |
| LOW | src/notebooklm_tools/services/studio.py | 27 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/notebooklm_tools/services/__init__.py | 15 | __all__ = [ | CODE |
| LOW | src/notebooklm_tools/services/chat.py | 18 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/notebooklm_tools/services/chats.py | 22 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/notebooklm_tools/services/_compat.py | 10 | __all__ = ["TypedDict"] | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | tests/test_mcp_file_upload.py | 15 | # Check if source_add exists and supports file type | COMMENT |
| LOW | tests/core/test_task3_routing_contract.py | 447 | # Set storage to file (no-op update) works | COMMENT |
| LOW | src/notebooklm_tools/core/studio.py | 527 | # Check if it looks like a timestamp [seconds, nanos] | COMMENT |
| LOW | src/notebooklm_tools/core/research.py | 239 | # Check if this is deep research format (src[0] is None, src[1] is title) | COMMENT |
| LOW | src/notebooklm_tools/core/conversation.py | 444 | # Check if we have cached history for this conversation | COMMENT |
| LOW | src/notebooklm_tools/core/credential_store.py | 874 | # Check if a deletion operation was in progress (distinguish deletion intent from corruption) | COMMENT |
| LOW | src/notebooklm_tools/core/sources.py | 450 | # Check if v1 actually accepted it (accepted-pending) | COMMENT |
| LOW | src/notebooklm_tools/core/notebooks.py | 93 | # Check if shared (for owned notebooks) | COMMENT |
| LOW | src/notebooklm_tools/core/base.py | 1291 | # Check if redirected to login (cookies expired) | COMMENT |
| LOW | src/notebooklm_tools/core/base.py | 256 | RPC_CHECK_FRESHNESS = "yR9Yof" # Check if Drive source is stale | CODE |
| LOW | src/notebooklm_tools/utils/config.py | 475 | # Check if new location already has data | COMMENT |
| LOW | src/notebooklm_tools/utils/wsl.py | 202 | # Check if Chrome is already running - this is a HARD REQUIREMENT | COMMENT |
| LOW | src/notebooklm_tools/utils/wsl.py | 476 | # Check if rule exists | COMMENT |
| LOW | src/notebooklm_tools/utils/wsl.py | 545 | # Check if it's a permission issue | COMMENT |
| LOW⚡ | src/notebooklm_tools/utils/cdp.py | 1486 | # Check if process is alive but CDP is unresponsive | COMMENT |
| LOW | src/notebooklm_tools/utils/cdp.py | 588 | # Check if it's a symlink pointing to a snap path. Normalize the resolved | COMMENT |
| LOW | src/notebooklm_tools/utils/cdp.py | 1570 | # Check if Chrome is running with debugging | COMMENT |
| LOW | src/notebooklm_tools/utils/cdp.py | 1973 | # Check if profile exists with saved login | COMMENT |
| LOW | src/notebooklm_tools/cli/utils.py | 157 | # Check if cache is still valid (24 hours = 86400 seconds) | COMMENT |
| LOW | src/notebooklm_tools/cli/main.py | 1025 | # Check if profile exists | COMMENT |
| LOW | src/notebooklm_tools/cli/commands/skill.py | 327 | # Check if export directory exists | COMMENT |
| LOW | src/notebooklm_tools/cli/commands/skill.py | 522 | # Check if already installed | COMMENT |
| LOW | src/notebooklm_tools/cli/commands/skill.py | 717 | # Check if already installed | STRING |
| LOW | src/notebooklm_tools/cli/commands/setup.py | 1526 | # Display results table | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tests/core/test_auth_migration_protected.py | 0 | isolate storage dir and reset config for each test. | STRING |
| HIGH | tests/core/test_task4_main_parity.py | 0 | isolate storage dir and reset config for each test. | STRING |
| HIGH | tests/cli/test_auth_storage_switch.py | 0 | isolate storage dir and reset config for each test. | STRING |
| HIGH | src/notebooklm_tools/core/sharing.py | 0 | mixin for notebook management operations. this class inherits from baseclient and provides all notebook-related operatio | STRING |
| HIGH | src/notebooklm_tools/core/sources.py | 0 | mixin for notebook management operations. this class inherits from baseclient and provides all notebook-related operatio | STRING |
| HIGH | src/notebooklm_tools/core/notebooks.py | 0 | mixin for notebook management operations. this class inherits from baseclient and provides all notebook-related operatio | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/notebooklm_tools/core/auth.py | 414 | CODE | |
| LOW | src/notebooklm_tools/core/auth.py | 624 | CODE | |
| LOW | src/notebooklm_tools/core/base.py | 445 | CODE | |
| LOW | src/notebooklm_tools/mcp/tools/studio.py | 67 | CODE | |
| LOW | src/notebooklm_tools/mcp/tools/batch.py | 9 | CODE | |
| LOW | src/notebooklm_tools/mcp/tools/sources.py | 16 | CODE | |
| LOW | src/notebooklm_tools/cli/main.py | 428 | CODE | |
| LOW | src/notebooklm_tools/cli/commands/studio.py | 149 | CODE | |
| LOW | src/notebooklm_tools/cli/commands/studio.py | 256 | CODE | |
| LOW | src/notebooklm_tools/cli/commands/studio.py | 312 | CODE | |
| LOW | src/notebooklm_tools/cli/commands/studio.py | 495 | CODE | |
| LOW | src/notebooklm_tools/cli/commands/studio.py | 636 | CODE | |
| LOW | src/notebooklm_tools/cli/commands/studio.py | 782 | CODE | |
| LOW | src/notebooklm_tools/cli/commands/studio.py | 891 | CODE | |
| LOW | src/notebooklm_tools/cli/commands/studio.py | 938 | CODE | |
| LOW | src/notebooklm_tools/cli/commands/research.py | 21 | CODE | |
| LOW | src/notebooklm_tools/cli/commands/download.py | 236 | CODE | |
| LOW | src/notebooklm_tools/cli/commands/notebook.py | 149 | CODE | |
| LOW | src/notebooklm_tools/cli/commands/verbs.py | 113 | CODE | |
| LOW | src/notebooklm_tools/cli/commands/verbs.py | 147 | CODE | |
| LOW | src/notebooklm_tools/cli/commands/verbs.py | 186 | CODE | |
| LOW | src/notebooklm_tools/cli/commands/verbs.py | 226 | CODE | |
| LOW | src/notebooklm_tools/cli/commands/verbs.py | 264 | CODE | |
| LOW | src/notebooklm_tools/cli/commands/verbs.py | 294 | CODE | |
| LOW | src/notebooklm_tools/cli/commands/verbs.py | 413 | CODE | |
| LOW | src/notebooklm_tools/cli/commands/verbs.py | 647 | CODE | |
| LOW | src/notebooklm_tools/cli/commands/verbs.py | 799 | CODE | |
| LOW | src/notebooklm_tools/cli/commands/verbs.py | 898 | CODE | |
| LOW | src/notebooklm_tools/cli/commands/verbs.py | 1001 | CODE | |
| LOW | src/notebooklm_tools/cli/commands/source.py | 21 | CODE | |
| LOW | src/notebooklm_tools/cli/commands/source.py | 60 | CODE | |
| LOW | src/notebooklm_tools/services/studio.py | 302 | CODE | |
| LOW | src/notebooklm_tools/services/downloads.py | 450 | CODE | |
| LOW | src/notebooklm_tools/services/downloads.py | 567 | CODE | |
| LOW | src/notebooklm_tools/services/downloads.py | 769 | CODE | |
| LOW | src/notebooklm_tools/services/sources.py | 135 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | tests/test_macos_keychain_smoke.py | 40 | # Step 1: Initial read on nonexistent item must return None | COMMENT |
| LOW⚡ | tests/test_macos_keychain_smoke.py | 44 | # Step 2: Store secret in macOS Keychain | COMMENT |
| LOW⚡ | tests/test_macos_keychain_smoke.py | 47 | # Step 3: Read back secret and verify exact match | COMMENT |
| LOW⚡ | tests/test_macos_keychain_smoke.py | 51 | # Step 4: Verify timeout bounded execution (< 2.0s for 0.5s timeout) | COMMENT |
| LOW | tests/test_macos_keychain_smoke.py | 71 | # Step 5: Guaranteed cleanup | COMMENT |
| LOW⚡ | src/notebooklm_tools/core/sources.py | 1025 | # Step 1: Register source intent → get SOURCE_ID | COMMENT |
| LOW⚡ | src/notebooklm_tools/core/sources.py | 1028 | # Step 2: Start resumable upload → get upload URL | COMMENT |
| LOW⚡ | src/notebooklm_tools/core/sources.py | 1031 | # Step 3: Stream upload file content | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | src/notebooklm_tools/core/auth.py | 1219 | # orchestration, caching, verdict aggregation) and belong in the services | COMMENT |
| MEDIUM⚡ | src/notebooklm_tools/services/auth.py | 328 | # Probe orchestration | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | tests/cli/test_setup_wizard.py | 420 | # Mocked questions have no .application; the helper must still just call ask(). | COMMENT |
| MEDIUM | src/notebooklm_tools/cli/ai_docs.py | 314 | # their chat history natively into the NotebookLM web UI, enabling seamless cross-device sessions. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_api_client.py | 21 | COMMENT | |
| LOW | src/notebooklm_tools/core/auth.py | 361 | # | COMMENT |
| LOW | src/notebooklm_tools/core/client.py | 81 | # - get_conversation_history | COMMENT |
| LOW | src/notebooklm_tools/core/client.py | 101 | # Sharing Operations (inherited from SharingMixin) | COMMENT |
| LOW | src/notebooklm_tools/core/client.py | 121 | # - get_source_fulltext | COMMENT |
| LOW | src/notebooklm_tools/mcp/tools/studio.py | 201 | # Pre-flight auth gate: fail loudly NOW rather than returning a fake | COMMENT |
| LOW | src/notebooklm_tools/data/SKILL.md | 501 | # Each --slide value must be: '<slide-number> <instruction>' | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | src/notebooklm_tools/core/auth.py | 365 | # Usage: | COMMENT |