Skip to content

docs: align Mintlify navigation with index.md pages and front matter#2560

Open
swstica wants to merge 2 commits into
mainfrom
swastika/fix/mint-pages-format
Open

docs: align Mintlify navigation with index.md pages and front matter#2560
swstica wants to merge 2 commits into
mainfrom
swastika/fix/mint-pages-format

Conversation

@swstica

@swstica swstica commented Jun 22, 2026

Copy link
Copy Markdown
Contributor

Problem

  1. Mintlify was rendering duplicate headings and failing to parse README.md / readme.md pages. instead of Mintlify’s index.md convention.
  2. docs.json was out of date: broken agents/ paths (folder is coding-agents/), missing overview pages for Usage/Capabilities sections, and several existing docs not listed in the sidebar causing missing/broken nav entries.

Solution

  1. Renamed readme.md pages to index.md. This change occurs for GH preview as well but we don't have any option if we want to keep same docs for GH and mintlify.
  2. Added Mintlify front matter title: xyz across 52 docs pages. Mintlify takes file name as default title if not mentioned. eg: it will take 'index' as a page name for 'index.md' file, which would be confusing.
  3. Update docs.json for nav.

How to Test

cd docs && npx mint dev

Contributor License Agreement

  • I have read and approved the CLA.

@greptile-apps

greptile-apps Bot commented Jun 22, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR aligns Mintlify navigation with the docs content: readme.md / README.md files are renamed to index.md, title front matter is added to 52 pages, and docs.json is updated to fix broken agents/coding-agents/ paths and add missing overview and sub-section entries.

  • docs.json fixes: corrects all agents/coding-agents/ nav paths, adds new index pages for Usage, Data streams, Sensor streams, Capabilities sub-sections, and previously unlisted pages (worktrees, mapping/relocalization, development/releasing).
  • Renamed index pages: readme.md/README.mdindex.md across capabilities, usage, and coding-agents directories, each with a title front matter field added to prevent Mintlify from displaying "index" as the page name.
  • New overview pages: usage/index.md, data_streams/index.md, sensor_streams/index.md, manipulation/index.md, and navigation/index.md are newly created but contain internal links using the wrong Mintlify format (/docs/usage/…filename.md), which will resolve as docs/docs/… and produce 404s.

Confidence Score: 3/5

Several newly created index pages contain broken internal links that will 404 in the rendered Mintlify site; the core nav fixes in docs.json are correct.

Five new overview pages all use the /docs/usage/…filename.md link pattern instead of the correct Mintlify root-relative format. Every link in these pages will produce a 404. Additionally, manipulation/index.md links ten source-code file paths as if they were internal doc pages, which will also all 404. The docs.json navigation changes themselves are well-formed and reference files that exist.

docs/capabilities/manipulation/index.md and docs/capabilities/navigation/index.md (new files with broken links not yet addressed); docs/usage/index.md, docs/usage/data_streams/index.md, and docs/usage/sensor_streams/index.md (same broken-link pattern flagged in prior review rounds).

Important Files Changed

Filename Overview
docs/docs.json Navigation updated: fixed broken agents/coding-agents/ paths, added index pages for Usage/Capabilities sections, added missing worktrees, mapping/relocalization, and development/releasing entries — all referenced files verified to exist.
docs/capabilities/manipulation/index.md New overview page with two broken doc links using /docs/…filename.md format that will 404 in Mintlify, plus a "Key Files" table with 10 source-code paths that Mintlify will also treat as internal doc links and fail to resolve.
docs/capabilities/navigation/index.md New overview page with two internal links using the wrong /docs/…filename.md format that will produce 404s in Mintlify.
docs/usage/data_streams/index.md New index page; all five table links use the /docs/usage/…filename.md format that will 404 in Mintlify (previously flagged).
docs/usage/sensor_streams/index.md New index page; same broken /docs/usage/…filename.md link format as data_streams/index.md (previously flagged).
docs/usage/index.md New Concepts overview page; all links use the /docs/usage/…filename.md format that will 404 in Mintlify (previously flagged).
docs/capabilities/agents/index.md Renamed from readme.md to index.md with Mintlify frontmatter added; content is well-structured with no broken internal links.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A[docs.json navigation] --> B[Usage group]
    A --> C[Agents group]
    A --> D[Capabilities group]
    A --> E[Development group]

    B --> B1[usage/index ✅]
    B --> B2[usage/modules, blueprints, config…]
    B --> B3[Data streams group]
    B --> B4[Sensor streams group]
    B3 --> B3a[data_streams/index ⚠️ broken links]
    B4 --> B4a[sensor_streams/index ⚠️ broken links]
    B1 --> B1n[⚠️ broken links inside page]

    C --> C1[coding-agents/index ✅ fixed from agents/]
    C --> C2[coding-agents/style, testing, worktrees…]
    C --> C3[Authoring agent docs subgroup]

    D --> D1[Agents → capabilities/agents/index ✅]
    D --> D2[Manipulation group]
    D --> D3[Mapping group ✅ new]
    D --> D4[Navigation group]
    D --> D5[Perception group ✅ new]
    D --> D6[Teleoperation group]
    D2 --> D2a[manipulation/index ⚠️ broken links]
    D4 --> D4a[navigation/index ⚠️ broken links]

    E --> E1[development/releasing ✅ new]
Loading
%%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%%
flowchart TD
    A[docs.json navigation] --> B[Usage group]
    A --> C[Agents group]
    A --> D[Capabilities group]
    A --> E[Development group]

    B --> B1[usage/index ✅]
    B --> B2[usage/modules, blueprints, config…]
    B --> B3[Data streams group]
    B --> B4[Sensor streams group]
    B3 --> B3a[data_streams/index ⚠️ broken links]
    B4 --> B4a[sensor_streams/index ⚠️ broken links]
    B1 --> B1n[⚠️ broken links inside page]

    C --> C1[coding-agents/index ✅ fixed from agents/]
    C --> C2[coding-agents/style, testing, worktrees…]
    C --> C3[Authoring agent docs subgroup]

    D --> D1[Agents → capabilities/agents/index ✅]
    D --> D2[Manipulation group]
    D --> D3[Mapping group ✅ new]
    D --> D4[Navigation group]
    D --> D5[Perception group ✅ new]
    D --> D6[Teleoperation group]
    D2 --> D2a[manipulation/index ⚠️ broken links]
    D4 --> D4a[navigation/index ⚠️ broken links]

    E --> E1[development/releasing ✅ new]
Loading

Reviews (3): Last reviewed commit: "add nav index to sidebar and title CMU n..." | Re-trigger Greptile

Co-authored-by: Cursor <cursoragent@cursor.com>
@swstica swstica force-pushed the swastika/fix/mint-pages-format branch from add1470 to 40ec0b6 Compare June 23, 2026 02:49
Comment thread docs/usage/index.md
Comment on lines 9 to 13
- [Modules](/docs/usage/modules.md): The primary units of deployment in DimOS, modules run in parallel and are python classes.
- [Streams](/docs/usage/sensor_streams/README.md): How modules communicate, a Pub / Sub system.
- [Streams](/docs/usage/sensor_streams/index.md): How modules communicate, a Pub / Sub system.
- [Blueprints](/docs/usage/blueprints.md): a way to group modules together and define their connections to each other.
- [RPC](/docs/usage/blueprints.md#calling-the-methods-of-other-modules): how one module can call a method on another module (arguments get serialized to JSON-like binary data).
- [Skills](/docs/usage/blueprints.md#defining-skills): An RPC function, except it can be called by an AI agent (a tool for an AI).

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 partner All links in this new index page also use the /docs/usage/…filename.md pattern, which will resolve to docs/docs/usage/… in Mintlify and produce 404s. The .md extension and the /docs/ prefix both need to be removed. The blueprints.md page is also not listed in docs.json navigation — linking to it is fine (Mintlify will serve hidden pages by URL), but it won't appear in the sidebar.

Suggested change
- [Modules](/docs/usage/modules.md): The primary units of deployment in DimOS, modules run in parallel and are python classes.
- [Streams](/docs/usage/sensor_streams/README.md): How modules communicate, a Pub / Sub system.
- [Streams](/docs/usage/sensor_streams/index.md): How modules communicate, a Pub / Sub system.
- [Blueprints](/docs/usage/blueprints.md): a way to group modules together and define their connections to each other.
- [RPC](/docs/usage/blueprints.md#calling-the-methods-of-other-modules): how one module can call a method on another module (arguments get serialized to JSON-like binary data).
- [Skills](/docs/usage/blueprints.md#defining-skills): An RPC function, except it can be called by an AI agent (a tool for an AI).
- [Modules](/usage/modules): The primary units of deployment in DimOS, modules run in parallel and are python classes.
- [Streams](/usage/sensor_streams/index): How modules communicate, a Pub / Sub system.
- [Blueprints](/usage/blueprints): a way to group modules together and define their connections to each other.
- [RPC](/usage/blueprints#calling-the-methods-of-other-modules): how one module can call a method on another module (arguments get serialized to JSON-like binary data).
- [Skills](/usage/blueprints#defining-skills): An RPC function, except it can be called by an AI agent (a tool for an AI).

@codecov

codecov Bot commented Jun 23, 2026

Copy link
Copy Markdown

❌ 2 Tests Failed:

Tests completed Failed Passed Skipped
2275 2 2273 74
View the full list of 2 ❄️ flaky test(s)
dimos.e2e_tests.test_dimsim_spatial_memory::test_go_to_the_bed

Flake rate in main: 22.22% (Passed 28 times, Failed 8 times)

Stack Traces | 560s run time
lcm_spy = <dimos.e2e_tests.lcm_spy.LcmSpy object at 0x7f7385b96360>
start_blueprint = <function start_blueprint.<locals>.set_name_and_start at 0x7f7383758220>
human_input = <function human_input.<locals>.send_human_input at 0x7f73837587c0>
dim_sim = <dimos.e2e_tests.dim_sim_client.DimSimClient object at 0x7f738555da00>
explore_house = <function explore_house.<locals>.explore at 0x7f73837591c0>

    @pytest.mark.self_hosted_large
    def test_go_to_the_bed(lcm_spy, start_blueprint, human_input, dim_sim, explore_house) -> None:
        start_blueprint(
            "run",
            "unitree-go2-agentic",
            simulator="dimsim",
        )
        lcm_spy.save_topic(".../McpClient/on_system_modules/res")
        lcm_spy.wait_for_saved_topic(".../McpClient/on_system_modules/res", timeout=1200.0)
    
        explore_house()
    
        human_input("go to the bed")
    
>       lcm_spy.wait_until_odom_position(-3.567, -1.332, threshold=2, timeout=180)

dim_sim    = <dimos.e2e_tests.dim_sim_client.DimSimClient object at 0x7f738555da00>
explore_house = <function explore_house.<locals>.explore at 0x7f73837591c0>
human_input = <function human_input.<locals>.send_human_input at 0x7f73837587c0>
lcm_spy    = <dimos.e2e_tests.lcm_spy.LcmSpy object at 0x7f7385b96360>
start_blueprint = <function start_blueprint.<locals>.set_name_and_start at 0x7f7383758220>

dimos/e2e_tests/test_dimsim_spatial_memory.py:32: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/e2e_tests/lcm_spy.py:182: in wait_until_odom_position
    self.wait_for_message_result(
        predicate  = <function LcmSpy.wait_until_odom_position.<locals>.predicate at 0x7f75f8b598a0>
        self       = <dimos.e2e_tests.lcm_spy.LcmSpy object at 0x7f7385b96360>
        threshold  = 2
        timeout    = 180
        x          = -3.567
        y          = -1.332
dimos/e2e_tests/lcm_spy.py:168: in wait_for_message_result
    self.wait_until(
        event      = <threading.Event at 0x7f738555e6f0: unset>
        fail_message = 'Failed to get to position x=-3.567, y=-1.332'
        listener   = <function LcmSpy.wait_for_message_result.<locals>.listener at 0x7f7383759300>
        predicate  = <function LcmSpy.wait_until_odom_position.<locals>.predicate at 0x7f75f8b598a0>
        self       = <dimos.e2e_tests.lcm_spy.LcmSpy object at 0x7f7385b96360>
        timeout    = 180
        topic      = '/odom#geometry_msgs.PoseStamped'
        type       = <class 'dimos.msgs.geometry_msgs.PoseStamped.PoseStamped'>
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <dimos.e2e_tests.lcm_spy.LcmSpy object at 0x7f7385b96360>

    def wait_until(
        self,
        *,
        condition: Callable[[], bool],
        timeout: float,
        error_message: str,
        poll_interval: float = 0.1,
    ) -> None:
        start_time = time.time()
        while time.time() - start_time < timeout:
            if condition():
                return
            time.sleep(poll_interval)
>       raise TimeoutError(error_message)
E       TimeoutError: Failed to get to position x=-3.567, y=-1.332

condition  = <bound method Event.is_set of <threading.Event at 0x7f738555e6f0: unset>>
error_message = 'Failed to get to position x=-3.567, y=-1.332'
poll_interval = 0.1
self       = <dimos.e2e_tests.lcm_spy.LcmSpy object at 0x7f7385b96360>
start_time = 1782206877.9809985
timeout    = 180

dimos/e2e_tests/lcm_spy.py:105: TimeoutError
dimos.e2e_tests.test_dimsim_walk_forward::test_walk_forward

Flake rate in main: 28.12% (Passed 23 times, Failed 9 times)

Stack Traces | 205s run time
lcm_spy = <dimos.e2e_tests.lcm_spy.LcmSpy object at 0x7f738555ffb0>
start_blueprint = <function start_blueprint.<locals>.set_name_and_start at 0x7f7383759b20>
human_input = <function human_input.<locals>.send_human_input at 0x7f7383759c60>
dim_sim = <dimos.e2e_tests.dim_sim_client.DimSimClient object at 0x7f7384d6c680>

    @pytest.mark.self_hosted_large
    def test_walk_forward(lcm_spy, start_blueprint, human_input, dim_sim) -> None:
        start_blueprint(
            "run",
            "--disable",
            "spatial-memory",
            "--disable",
            "security-module",
            "unitree-go2-agentic",
            simulator="dimsim",
        )
        lcm_spy.save_topic(".../McpClient/on_system_modules/res")
        lcm_spy.wait_for_saved_topic(".../McpClient/on_system_modules/res", timeout=1200.0)
    
        origin_x, origin_y = 1, 2
        dim_sim.set_agent_position(origin_x, origin_y)
    
        human_input("move forward 3 meter")
    
>       lcm_spy.wait_until_odom_position(origin_x + 3, origin_y, threshold=0.4, timeout=120)

dim_sim    = <dimos.e2e_tests.dim_sim_client.DimSimClient object at 0x7f7384d6c680>
human_input = <function human_input.<locals>.send_human_input at 0x7f7383759c60>
lcm_spy    = <dimos.e2e_tests.lcm_spy.LcmSpy object at 0x7f738555ffb0>
origin_x   = 1
origin_y   = 2
start_blueprint = <function start_blueprint.<locals>.set_name_and_start at 0x7f7383759b20>

dimos/e2e_tests/test_dimsim_walk_forward.py:37: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/e2e_tests/lcm_spy.py:182: in wait_until_odom_position
    self.wait_for_message_result(
        predicate  = <function LcmSpy.wait_until_odom_position.<locals>.predicate at 0x7f7383759760>
        self       = <dimos.e2e_tests.lcm_spy.LcmSpy object at 0x7f738555ffb0>
        threshold  = 0.4
        timeout    = 120
        x          = 4
        y          = 2
dimos/e2e_tests/lcm_spy.py:168: in wait_for_message_result
    self.wait_until(
        event      = <threading.Event at 0x7f7384d6ccb0: unset>
        fail_message = 'Failed to get to position x=4, y=2'
        listener   = <function LcmSpy.wait_for_message_result.<locals>.listener at 0x7f7383758360>
        predicate  = <function LcmSpy.wait_until_odom_position.<locals>.predicate at 0x7f7383759760>
        self       = <dimos.e2e_tests.lcm_spy.LcmSpy object at 0x7f738555ffb0>
        timeout    = 120
        topic      = '/odom#geometry_msgs.PoseStamped'
        type       = <class 'dimos.msgs.geometry_msgs.PoseStamped.PoseStamped'>
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <dimos.e2e_tests.lcm_spy.LcmSpy object at 0x7f738555ffb0>

    def wait_until(
        self,
        *,
        condition: Callable[[], bool],
        timeout: float,
        error_message: str,
        poll_interval: float = 0.1,
    ) -> None:
        start_time = time.time()
        while time.time() - start_time < timeout:
            if condition():
                return
            time.sleep(poll_interval)
>       raise TimeoutError(error_message)
E       TimeoutError: Failed to get to position x=4, y=2

condition  = <bound method Event.is_set of <threading.Event at 0x7f7384d6ccb0: unset>>
error_message = 'Failed to get to position x=4, y=2'
poll_interval = 0.1
self       = <dimos.e2e_tests.lcm_spy.LcmSpy object at 0x7f738555ffb0>
start_time = 1782207142.3705003
timeout    = 120

dimos/e2e_tests/lcm_spy.py:105: TimeoutError

To view more test analytics, go to the Test Analytics Dashboard
📋 Got 3 mins? Take this short survey to help us improve Test Analytics.

@github-actions github-actions Bot added the ready-to-merge Required CI checks have passed on this PR label Jun 23, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ready-to-merge Required CI checks have passed on this PR

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant