Skip to content
Back to skills

216 Document Cf126cd7

ASecurity

This document defines the **standard JSON format** for learning graphs compatible with the **vis.js Network library**. Use this format when generating learning graphs to ensure proper visualization.

  • 9 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added May 31, 2026
datajavascriptpythongojavanodetestinggitdocumentation

Security analysis

A100/100

Pro scans all 2 files and shows the line behind each finding

Scanned May 31, 2026

npx -y skills add tools-only/X-Skills --skill 216-document_cf126cd7 --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of 216 Document Cf126cd7?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for 216 Document Cf126cd7
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/tools-only-216-document-cf126cd7/badge)](https://www.skillsdirectory.com/skills/tools-only-216-document-cf126cd7)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
# vis.js Network Format Reference for Learning Graph Generator

## Overview

This document defines the **standard JSON format** for learning graphs compatible with the **vis.js Network library**. Use this format when generating learning graphs to ensure proper visualization.

## Purpose

When using the **Learning Graph Generator skill**, the final JSON output must conform to this specification to work with vis.js network visualizations commonly used in educational web applications.

## JSON Structure

### Top-Level Schema

```json
{
  "nodes": [...],
  "edges": [...],
  "metadata": {...}
}
```

### Complete Example

```json
{
  "nodes": [
    {
      "id": 1,
      "label": "Complex Numbers",
      "group": "MATH"
    },
    {
      "id": 2,
      "label": "Euler's Formula",
      "group": "MATH"
    }
  ],
  "edges": [
    {
      "from": 1,
      "to": 2
    }
  ],
  "metadata": {
    "title": "Course Learning Graph",
    "description": "200 interconnected concepts",
    "nodeCount": 200,
    "edgeCount": 229,
    "taxonomies": {
      "MATH": "Mathematical Foundations",
      "FFT": "FFT Algorithm & Implementation"
    }
  }
}
```

## Node Format

### Required Properties

| Property | Type   | Description                          | Example               |
|----------|--------|--------------------------------------|-----------------------|
| `id`     | number | Unique identifier (1-based index)    | `1`, `2`, `3`        |
| `label`  | string | Display text (max 32 chars)          | `"Complex Numbers"`  |

### Optional Properties

| Property | Type   | Description                          | Example               |
|----------|--------|--------------------------------------|-----------------------|
| `group`  | string | Taxonomy/category for styling        | `"MATH"`, `"FFT"`    |
| `title`  | string | Tooltip text on hover                | `"Foundational concept"` |
| `shape`  | string | Node shape                           | `"dot"`, `"box"`, `"star"` |
| `color`  | string | Override group color                 | `"red"`, `"#FF0000"` |
| `x`      | number | Fixed horizontal position            | `-900`, `900`        |
| `y`      | number | Fixed vertical position              | `0`, `100`           |
| `fixed`  | object | Lock position                        | `{"x": true, "y": false}` |

### Node Example with All Properties

```json
{
  "id": 1,
  "label": "Complex Numbers",
  "group": "MATH",
  "title": "Foundational mathematical concept",
  "shape": "box",
  "color": "red",
  "x": -900,
  "fixed": {"x": true, "y": false}
}
```

## Edge Format

### Required Properties

| Property | Type   | Description                          | Example               |
|----------|--------|--------------------------------------|-----------------------|
| `from`   | number | Source node ID (prerequisite)        | `1`                  |
| `to`     | number | Target node ID (dependent)           | `2`                  |

### Optional Properties

| Property | Type   | Description                          | Example               |
|----------|--------|--------------------------------------|-----------------------|
| `arrows` | string/object | Arrow direction                | `"to"`, `{"to": true}` |
| `color`  | string | Edge color                           | `"gray"`, `"#888888"` |
| `width`  | number | Edge thickness                       | `1`, `2`, `3`        |
| `label`  | string | Text on edge                         | `"prerequisite"`     |
| `dashes` | boolean/array | Dashed line style               | `true`, `[5, 5]`     |

### Edge Example

```json
{
  "from": 1,
  "to": 2,
  "arrows": "to",
  "color": "gray",
  "width": 1
}
```

## Metadata Format

Optional but recommended for documentation and analytics.

### Standard Metadata Properties

```json
{
  "metadata": {
    "title": "FFT Benchmarking Course Learning Graph",
    "description": "200 interconnected concepts for a 10-week course",
    "nodeCount": 200,
    "edgeCount": 229,
    "version": "1.0",
    "generated": "2025-10-30",
    "taxonomies": {
      "MATH": "Mathematical Foundations",
      "FFT": "FFT Algorithm & Implementation",
      "SIG": "Signal Processing",
      "ARM": "ARM Architecture & DSP Hardware",
      "MEM": "Memory Management & Optimization",
      "FXP": "Fixed-Point Arithmetic",
      "BENCH": "Benchmarking & Testing",
      "LIB": "FFT Libraries & Integration",
      "OPT": "Optimization Techniques"
    }
  }
}
```

## Important Distinctions

### ❌ WRONG: D3.js Format

```json
{
  "nodes": [
    {
      "id": 1,
      "label": "Complex Numbers",
      "taxonomy": "MATH"          // ❌ Wrong property name
    }
  ],
  "links": [                      // ❌ Wrong array name
    {
      "source": 1,                // ❌ Wrong property name
      "target": 2                 // ❌ Wrong property name
    }
  ]
}
```

### ✅ CORRECT: vis.js Format

```json
{
  "nodes": [
    {
      "id": 1,
      "label": "Complex Numbers",
      "group": "MATH"             // ✅ Correct for vis.js
    }
  ],
  "edges": [                      // ✅ Correct array name
    {
      "from": 1,                  // ✅ Correct property name
      "to": 2                     // ✅ Correct property name
    }
  ]
}
```

## Python Conversion Template

### Standard CSV to vis.js JSON Converter

```python
#!/usr/bin/env python3
"""
Convert concept dependencies CSV to vis.js network JSON format.
"""

import csv
import json

def convert_csv_to_json(csv_file, json_file):
    """Convert CSV to vis.js network format."""
    nodes = []
    edges = []

    with open(csv_file, 'r') as f:
        reader = csv.DictReader(f)

        for row in reader:
            concept_id = int(row['ConceptID'])
            label = row['ConceptLabel']
            taxonomy = row['TaxonomyID']
            deps = row['Dependencies'].strip()

            # Create node (vis.js format)
            node = {
                "id": concept_id,
                "label": label,
                "group": taxonomy
            }
            nodes.append(node)

            # Create edges (vis.js format: from/to)
            if deps:
                dependencies = [int(d) for d in deps.split('|')]
                for dep in dependencies:
                    edge = {
                        "from": dep,
                        "to": concept_id
                    }
                    edges.append(edge)

    # Create graph structure
    graph = {
        "nodes": nodes,
        "edges": edges,
        "metadata": {
            "title": "Learning Graph",
            "nodeCount": len(nodes),
            "edgeCount": len(edges)
        }
    }

    # Write to JSON file
    with open(json_file, 'w') as f:
        json.dump(graph, f, indent=2)

    return graph
```

## JavaScript Loading Template

### Standard vis.js Network Initialization

```javascript
function drawGraph() {
  // Fetch the graph data from JSON file
  fetch('learning-graph.json')
    .then(response => response.json())
    .then(data => {
      // Create DataSets for vis.js
      const nodes = new vis.DataSet(data.nodes);
      const edges = new vis.DataSet(data.edges);

      // Optional: Customize nodes after loading
      nodes.forEach(function (node) {
        if (node.group === "MATH") {
          node.x = -900;
          node.fixed = { x: true, y: false };
          node.shape = "box";
          node.color = "red";
        } else if (node.group === "OPT") {
          node.x = 900;
          node.fixed = { x: true, y: false };
          node.shape = "star";
          node.color = "gold";
        }
      });

      // Create network
      const container = document.getElementById('mynetwork');
      const graphData = {
        nodes: nodes,
        edges: edges
      };

      // Network options
      const options = {
        physics: {
          enabled: true,
          solver: 'forceAtlas2Based',
          stabilization: {
            iterations: 1000,
            updateInterval: 25
          }
        },
        edges: {
          arrows: {
            to: {
              enabled: true,
              type: 'arrow'
            }
          },
          smooth: {
            type: 'continuous'
          }
        },
        nodes: {
          shape: 'dot',
          size: 20,
          font: {
            size: 14,
            color: 'black'
          },
          borderWidth: 2
        }
      };

      // Initialize network
      const network = new vis.Network(container, graphData, options);
    })
    .catch(error => {
      console.error("Error loading JSON:", error);
    });
}
```

## Group/Taxonomy Colors

Recommended color scheme for educational taxonomy groups:

```javascript
const taxonomyColors = {
  "MATH": "#E74C3C",    // Red - Foundational
  "FFT": "#3498DB",     // Blue - Core algorithms
  "SIG": "#2ECC71",     // Green - Signal processing
  "ARM": "#9B59B6",     // Purple - Hardware
  "MEM": "#F39C12",     // Orange - Memory
  "FXP": "#1ABC9C",     // Teal - Numeric precision
  "BENCH": "#E67E22",   // Dark orange - Testing
  "LIB": "#95A5A6",     // Gray - Libraries
  "OPT": "#F1C40F"      // Yellow/Gold - Optimization
};
```

## Validation Checklist

When generating learning graph JSON for vis.js, verify:

- [ ] Top-level object has `nodes` array (not `vertices`)
- [ ] Top-level object has `edges` array (not `links`)
- [ ] Each node has `id` (number) and `label` (string)
- [ ] Nodes use `group` property (not `taxonomy` or `category`)
- [ ] Each edge has `from` (number) and `to` (number)
- [ ] Edges use `from`/`to` (not `source`/`target`)
- [ ] All `from` and `to` values reference valid node IDs
- [ ] No self-loops (edge where `from === to`)
- [ ] Graph forms valid DAG (no cycles) for learning paths
- [ ] Optional: metadata object included for documentation

## Common Mistakes to Avoid

| Mistake | Issue | Solution |
|---------|-------|----------|
| Using `links` | vis.js won't find edges | Use `edges` |
| Using `source`/`target` | Edges won't connect | Use `from`/`to` |
| Using `taxonomy` | Groups won't work | Use `group` |
| String IDs | Type mismatch errors | Use numeric IDs |
| Missing `label` | Blank nodes | Always include labels |
| Circular edges | Cycles in learning path | Validate DAG structure |

## File Naming Convention

**Recommended:**
- `learning-graph.json` - Main graph file
- `concept-dependencies.csv` - Source CSV file
- `convert-to-json.py` - Conversion script

**Not Recommended:**
- `graph.json` - Too generic
- `network.json` - Ambiguous
- `data.json` - Not descriptive

## vis.js Documentation References

- **Official docs:** https://visjs.github.io/vis-network/docs/network/
- **Node options:** https://visjs.github.io/vis-network/docs/network/nodes.html
- **Edge options:** https://visjs.github.io/vis-network/docs/network/edges.html
- **Physics:** https://visjs.github.io/vis-network/docs/network/physics.html
- **Examples:** https://visjs.github.io/vis-network/examples/

## Summary for SKILL Generation

### Quick Reference Card

**For Learning Graph Generator Skill:**

1. **Array names:** `nodes` and `edges` (not links/vertices)
2. **Node structure:** `{id: number, label: string, group: string}`
3. **Edge structure:** `{from: number, to: number}`
4. **Group property:** Use for taxonomy categories (enables coloring)
5. **Metadata:** Optional but recommended for documentation
6. **Validation:** Ensure DAG structure (no cycles)
7. **Python template:** Use provided converter code
8. **Testing:** Load in vis.js Network to verify rendering

### Integration Workflow

```
CSV (concept-dependencies.csv)
    ↓
Python Script (convert-to-json.py)
    ↓
JSON (learning-graph.json) [vis.js format]
    ↓
HTML + JavaScript (vis.Network)
    ↓
Interactive Graph Visualization
```

---

**Document Version:** 1.0
**Created:** 2025-10-30
**For Use With:** Learning Graph Generator Skill
**Target Library:** vis.js Network v9.x+
**Status:** Production-ready reference

Files in this skill

  • README.md1 KB
  • skill.md11.7 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.