frigg 0.3.2

Local-first MCP server for code understanding.
Documentation
use super::*;

#[ignore = "workstream-c escalation target"]
#[test]
fn hybrid_ranking_supabase_queries_keep_studio_ui_and_tests_above_docs() -> FriggResult<()> {
    let root = temp_workspace_root("hybrid-supabase-studio-ui");
    prepare_workspace(
        &root,
        &[
            (
                "apps/studio/pages/dashboard.tsx",
                "export default function Dashboard() { return <div>studio dashboard</div>; }\n",
            ),
            (
                "apps/studio/tests/e2e/dashboard.spec.ts",
                "test('studio dashboard', async () => {});\n",
            ),
            (
                "docs/guides/studio.md",
                "# Studio guide\nstudio ui tests dashboard\n",
            ),
            (
                "supabase/functions/hello/index.ts",
                "export const hello = () => 'edge function';\n",
            ),
            (
                "apps/ui-library/registry/default/clients/react-router/lib/supabase/server.ts",
                "export const templateServer = 'studio ui tests dashboard tsconfig typescript';\n",
            ),
        ],
    )?;

    let searcher = TextSearcher::new(FriggConfig::from_workspace_roots(vec![root.clone()])?);
    let output = searcher.search_hybrid_with_filters_using_executor(
        SearchHybridQuery {
            query: "studio ui tests dashboard tsconfig typescript".to_owned(),
            limit: 5,
            weights: HybridChannelWeights::default(),
            semantic: Some(false),
        },
        SearchFilters::default(),
        &SemanticRuntimeCredentials::default(),
        &PanicSemanticQueryEmbeddingExecutor,
    )?;

    let ranked_paths = output
        .matches
        .iter()
        .map(|entry| entry.document.path.as_str())
        .collect::<Vec<_>>();
    let studio_position = ranked_paths
        .iter()
        .position(|path| {
            matches!(
                *path,
                "apps/studio/pages/dashboard.tsx" | "apps/studio/tests/e2e/dashboard.spec.ts"
            )
        })
        .expect("a studio witness should be ranked");
    let docs_position = ranked_paths
        .iter()
        .position(|path| *path == "docs/guides/studio.md")
        .expect("docs drift should still be ranked");

    assert!(
        studio_position < docs_position,
        "studio ui/test witnesses should outrank docs drift: {ranked_paths:?}"
    );

    cleanup_workspace(&root);
    Ok(())
}

#[test]
fn hybrid_ranking_supabase_runtime_queries_demote_repo_meta_and_template_noise() -> FriggResult<()>
{
    let root = temp_workspace_root("hybrid-supabase-runtime-vs-meta-noise");
    prepare_workspace(
        &root,
        &[
            (
                "supabase/functions/hello/index.ts",
                "export const hello = () => 'edge functions self hosted api runtime docker typescript';\n",
            ),
            (
                "apps/studio/pages/dashboard.tsx",
                "export default function Dashboard() { return <div>edge functions self hosted api runtime docker typescript</div>; }\n",
            ),
            (
                "apps/studio/tests/e2e/dashboard.spec.ts",
                "test('edge functions self hosted api runtime docker typescript', async () => {});\n",
            ),
            (
                "examples/auth/nextjs-full/lib/supabase/server.ts",
                "export const exampleServer = 'edge functions self hosted api runtime docker typescript';\n",
            ),
            (
                "apps/ui-library/registry/default/clients/react-router/lib/supabase/server.ts",
                "export const templateServer = 'edge functions self hosted api runtime docker typescript';\n",
            ),
            (
                "DEVELOPERS.md",
                "# Developers\nedge functions self hosted api runtime docker typescript\n",
            ),
            (
                "CONTRIBUTING.md",
                "# Contributing\nedge functions self hosted api runtime docker typescript\n",
            ),
            ("Makefile", "docker:\n\tdocker compose up\n"),
        ],
    )?;

    let searcher = TextSearcher::new(FriggConfig::from_workspace_roots(vec![root.clone()])?);
    let output = searcher.search_hybrid_with_filters_using_executor(
        SearchHybridQuery {
            query: "edge functions self hosted api runtime docker typescript".to_owned(),
            limit: 6,
            weights: HybridChannelWeights::default(),
            semantic: Some(false),
        },
        SearchFilters::default(),
        &SemanticRuntimeCredentials::default(),
        &PanicSemanticQueryEmbeddingExecutor,
    )?;

    let ranked_paths = output
        .matches
        .iter()
        .map(|entry| entry.document.path.as_str())
        .collect::<Vec<_>>();
    let runtime_position = ranked_paths
        .iter()
        .position(|path| {
            matches!(
                *path,
                "supabase/functions/hello/index.ts"
                    | "apps/studio/pages/dashboard.tsx"
                    | "apps/studio/tests/e2e/dashboard.spec.ts"
            )
        })
        .expect("a runtime or nearby test witness should be ranked");
    let noise_position = ranked_paths
        .iter()
        .position(|path| {
            matches!(
                *path,
                "DEVELOPERS.md"
                    | "CONTRIBUTING.md"
                    | "Makefile"
                    | "examples/auth/nextjs-full/lib/supabase/server.ts"
                    | "apps/ui-library/registry/default/clients/react-router/lib/supabase/server.ts"
            )
        })
        .expect("meta or template noise should still be ranked");

    assert!(
        runtime_position < noise_position,
        "runtime witnesses should outrank repo-meta and template noise: {ranked_paths:?}"
    );

    cleanup_workspace(&root);
    Ok(())
}