relay-knowledge 1.1.17

Graph-database-based knowledge graph project.
Documentation
use super::render_text;

#[test]
fn map_show_reports_complete_v1_history_window() {
    let rendered = render_text(
        "knowledge.map.show",
        &serde_json::json!({
            "path": ".knowledge/knowledge-map.yaml",
            "map": {
                "topics": [{"id": "software-model"}],
                "sources": [{"id": "repository-software-model"}],
                "routes": [{"topic": "software-model"}],
                "history": {
                    "omitted_through": 0,
                    "complete": true,
                    "recent": [{"version": 1}]
                }
            }
        }),
    )
    .expect("v1 show should render");

    assert_eq!(
        rendered,
        "knowledge_map=.knowledge/knowledge-map.yaml topics=1 sources=1 routes=1 history_complete=true history_omitted_through=0 history_recent=1\n"
    );
    assert!(!rendered.contains("map history"));
}

#[test]
fn map_show_reports_a_recent_only_history_window() {
    let rendered = render_text(
        "knowledge.map.show",
        &serde_json::json!({
            "path": ".knowledge/knowledge-map.yaml",
            "map": {
                "topics": [{"id": "software-model"}],
                "sources": [{"id": "repository-software-model"}],
                "routes": [{"topic": "software-model"}],
                "history": {
                    "omitted_through": 24,
                    "complete": false,
                    "recent": [{"version": 25}, {"version": 26}]
                }
            }
        }),
    )
    .expect("v2 show should render");

    assert_eq!(
        rendered,
        "knowledge_map=.knowledge/knowledge-map.yaml topics=1 sources=1 routes=1 history_complete=false history_omitted_through=24 history_recent=2\nhistory_notice=entries through version 24 are outside this view; run relay-knowledge map history without --from to read the earliest available page\n"
    );
}

#[test]
fn render_text_covers_operational_and_code_repository_summaries() {
    let cases = [
        (
            "knowledge.map.history",
            serde_json::json!({
                "path": ".knowledge/knowledge-map.yaml",
                "map_version": 9,
                "earliest_available_version": 5,
                "omitted_through": 4,
                "from_version": 5,
                "through_version": 6,
                "next_from_version": 7,
                "entries": [
                    {"version": 5, "action": "add\ninjected", "actor": "cli\rspoofed", "summary": "Added\r\nsource"},
                    {"version": 6, "action": "update", "actor": "cli", "summary": "Updated source"},
                ],
            }),
            "knowledge_map=.knowledge/knowledge-map.yaml map_version=9 earliest=5 omitted_through=4 from=5 through=6 next=7\nversion=5 action=add injected actor=cli spoofed summary=Added  source\nversion=6 action=update actor=cli summary=Updated source\n",
        ),
        (
            "files.content",
            serde_json::json!({
                "results": [
                    {
                        "path": "/docs/runbook.md",
                        "content_role": "user_source",
                    },
                    {
                        "path": "/docs/schema.sql",
                        "content_role": "user_source",
                    },
                ],
                "truncated": true,
                "duration_ms": 17,
            }),
            "results=2 truncated=true duration_ms=17\n",
        ),
        (
            "worker.run_once",
            serde_json::json!({
                "task": {"task_id": "task:1"},
                "proposals": [{"proposal_id": "proposal:1"}],
            }),
            "task=task:1 proposals=1\n",
        ),
        (
            "proposal.show",
            serde_json::json!({
                "proposal": {"proposal_id": "proposal:1"},
                "conflicts": [{"conflict_id": "conflict:1"}],
            }),
            "proposal=proposal:1 conflicts=1\n",
        ),
        (
            "proposal.supersede",
            serde_json::json!({
                "proposal": {"proposal_id": "proposal:1", "state": "superseded"},
            }),
            "proposal=proposal:1 state=superseded\n",
        ),
        (
            "service.definition.write",
            serde_json::json!({"written": true}),
            "service_definition_written=true\n",
        ),
        (
            "service.operator.status",
            serde_json::json!({"operator": {"state": "paused"}}),
            "operator=paused\n",
        ),
        (
            "code.repo.index",
            serde_json::json!({
                "summary": {
                    "indexed_file_count": 2,
                    "symbol_count": 3,
                    "reference_count": 4,
                    "chunk_count": 5,
                    "degraded_file_count": 1,
                },
            }),
            "indexed files=2 symbols=3 references=4 chunks=5 degraded=1\n",
        ),
        (
            "code.repo.index",
            serde_json::json!({
                "task": {
                    "task_id": "task-1",
                    "state": "queued",
                    "source_scope": "scope-1",
                },
            }),
            "index task=task-1 state=queued scope=scope-1\n",
        ),
        (
            "code.repo.scope_preview",
            serde_json::json!({
                "preview": {
                    "selected_file_count": 2,
                    "selected_byte_count": 128,
                    "unsupported_file_count": 1,
                    "expected_degraded_file_count": 1,
                },
            }),
            "preview files=2 bytes=128 unsupported=1 expected_degraded=1\n",
        ),
        (
            "code.repo.impact",
            serde_json::json!({
                "path_groups": {"in_scope_changed_paths": ["src/lib.rs"]},
                "results": [{"symbol_id": "sym:1"}],
            }),
            "changed_in_scope=1 results=1\n",
        ),
        (
            "code.repo.view",
            serde_json::json!({
                "request": {"view_kind": "dependency_tour"},
                "nodes": [{"id": "module:api"}],
                "edges": [{"id": "depends_on:module:api->module:domain"}],
                "sections": [{"id": "section:dependency_tour"}],
                "evidence": [{"id": "evidence:1"}],
                "metadata": {"stale": true},
                "freshness": {"scope_stale": true},
                "degraded_reason": null,
            }),
            "view=dependency_tour nodes=1 edges=1 sections=1 evidence=1 stale=true degraded=none\n",
        ),
        (
            "code.repo.feature_flags",
            serde_json::json!({
                "flags": [{"feature_flag_id": "flag:1"}],
                "degraded_reason": null,
            }),
            "feature_flags=1 degraded=none\n",
        ),
        (
            "code.repo.list",
            serde_json::json!({
                "repositories": [
                    {
                        "alias": "core",
                        "root_path": "/work/core",
                        "last_indexed_commit": "abc123",
                        "state": "fresh",
                        "indexed_file_count": 2,
                        "symbol_count": 3,
                        "stale": false,
                    },
                    {
                        "alias": "web",
                        "root_path": "/work/web",
                        "last_indexed_commit": "def456",
                        "state": "indexing",
                        "indexed_file_count": 5,
                        "symbol_count": 8,
                        "stale": true,
                    },
                ],
            }),
            "repositories=2\nrepo=core state=fresh files=2 symbols=3 stale=false commit=abc123 root=/work/core\nrepo=web state=indexing files=5 symbols=8 stale=true commit=def456 root=/work/web\n",
        ),
        (
            "code.repo.status",
            serde_json::json!({
                "status": {
                    "alias": "repo",
                    "indexed_file_count": 2,
                    "symbol_count": 3,
                    "stale": false,
                },
                "active_task": {
                    "state": "retrying",
                    "last_error_kind": "code_index",
                    "last_error_message": "publication fence expired while finalizing",
                },
                "checkpoint": {
                    "state": "finalizing:rebuild_calls",
                },
            }),
            "repo=repo files=2 symbols=3 stale=false task=retrying checkpoint=finalizing:rebuild_calls error_kind=code_index error=\"publication fence expired while finalizing\"\n",
        ),
        (
            "code.repo.report",
            serde_json::json!({
                "report": {
                    "alias": "repo",
                    "indexed_file_count": 2,
                    "freshness_state": "fresh",
                },
            }),
            "repo=repo files=2 freshness=fresh\n",
        ),
        (
            "code.repo.software",
            serde_json::json!({
                "status": {
                    "source_scope": "scope-1",
                    "stale": false,
                },
                "components": [{"component_id": "component:1"}],
                "dependency_usages": [{"usage_id": "dependency_usage:1"}],
                "sdk_usages": [{"usage_id": "sdk_usage:1"}, {"usage_id": "sdk_usage:2"}],
                "files": [{"software_file_id": "file:1"}],
                "topics": [{"topic_id": "topic:1"}],
                "relationships": [{"relationship_id": "relationship:1"}],
                "build_targets": [{"target_id": "build_target:1"}],
                "iac_resources": [{"resource_id": "iac_resource:1"}],
                "design_elements": [{"element_id": "design_element:1"}],
            }),
            "software scope=scope-1 components=1 dependency_usages=1 sdk_usages=2 files=1 topics=1 relationships=1 build_targets=1 iac_resources=1 design_elements=1 stale=false\n",
        ),
        (
            "setup.doctor",
            serde_json::json!({
                "configuration_ready": true,
                "live_health_checked": false,
                "checks": [{ "name": "runtime_paths" }],
                "recommended_actions": [],
            }),
            "setup_configuration_ready=true live_health_checked=false checks=1 actions=0\n",
        ),
        (
            "setup.profile",
            serde_json::json!({
                "profile": "agent-readonly",
                "environment": [{"name": "RELAY_KNOWLEDGE_MCP_ALLOWED_SCOPES"}],
                "commands": ["relay-knowledge service run --mcp streamable-http"],
            }),
            "setup_profile=agent-readonly env_vars=1 commands=1\n",
        ),
    ];

    for (operation, payload, expected) in cases {
        let rendered = render_text(operation, &payload).expect("render should succeed");

        assert_eq!(rendered, expected);
    }
}