Fix review findings: importer DoS, sync data loss, views/profile rendering, docs
Source importers: lstat before open so FIFOs no longer hang the directory walk; replace the quadratic Rust macro regex with a linear scan. Three-way sync: report page add/add and delete-vs-modify as conflicts instead of silently overwriting or resurrecting; canonical comparison so key order is not a change; the sync action withholds output and fails on conflicts unless --force. Story publishing escapes <, >, & and U+2028/9 inside the embedded JSON. Views: drop parentId of unselected containers, re-layout instead of manual geometry, validate before serialising; flatten() merges identical nodes repeated across pages so C4 output works with every analysis action. Dark theme edge labels get a background; tube-map corridors sit above the stations; C4 containers keep the swimlane style and orphan relationships land on the matching page; router keeps container header bands as obstacles; sequence self-messages loop on one side. Docs: SKILL.md lists all 23 CLI actions and how each capability family is invoked, task wrappers for query/test/what-if/doctor, capability tables and --page scope corrected, maintenance snippet uses the real synchronous action signature, duplicated rule bullets moved to the rule references, coverage matrix wording made verifiable. Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
---
|
||||
name: diagrams-drawio
|
||||
description: Always use when user asks to create, generate, draw, or design a diagram, flowchart, architecture diagram, ER diagram, sequence diagram, class diagram, network diagram, mockup, wireframe, or UI sketch, or mentions draw.io, drawio, drawoi, .drawio files, or diagram export to PNG/SVG/PDF.
|
||||
description: Generate, analyse, edit and publish draw.io diagrams. Always use when user asks to create, generate, draw, or design a diagram, flowchart, architecture diagram, ER diagram, sequence diagram, class diagram, network diagram, mockup, wireframe, or UI sketch, or mentions draw.io, drawio, drawoi, .drawio files, or diagram export to PNG/SVG/PDF.
|
||||
license: Proprietary
|
||||
metadata:
|
||||
author: workspace-swiss-knife
|
||||
@@ -14,15 +14,15 @@ compatibility: Designed for Cline, Claude Code, GitHub Copilot, OpenAI Codex, an
|
||||
|
||||
# Draw.io Diagram Skill
|
||||
|
||||
This skill covers seven capability families:
|
||||
This skill covers seven capability families (same headings and order as [references/capabilities.md](./references/capabilities.md)):
|
||||
|
||||
1. **Deterministic YAML generation** — validate v1/v2 semantic Diagram IR and build native multi-page `.drawio` XML with stable IDs, dependency-aware layout, and obstacle-aware routing
|
||||
2. **Direct XML generation** — create `.drawio` files (and optionally export to PNG/SVG/PDF) from a description or requirements
|
||||
3. **Diagram analysis** — run the `drawio-tools` CLI to analyse an existing `.drawio` file: inventory shapes and connectors, validate layout quality, detect overlaps/orphans, and recommend page sizes
|
||||
4. **Semantic lifecycle** — loss-aware Draw.io import, transactional stable-ID edits, linked views, semantic query/policy/what-if analysis, three-way synchronization, and self-contained offline story publishing
|
||||
5. **Safe source importers** — bounded native TypeScript subsets for Python, JavaScript/TypeScript, Go, Rust, Terraform, Kubernetes, Docker Compose, SQL, OpenAPI, and CI dependency graphs
|
||||
6. **Toolbox transforms** — themes, offline generic shape search, reverse Mermaid/Markdown, semantic diff, strict relabeling, and accessible heatmaps
|
||||
7. **Specialized profiles** — C4, sequence, tube map, compression, runbook, timelapse, and dependency-ordered build-up services
|
||||
1. **Deterministic YAML generation** — validate v1/v2 semantic Diagram IR and build native multi-page `.drawio` XML with stable IDs, dependency-aware layout, and obstacle-aware routing. Invoked as CLI action `build` / `task generate`
|
||||
2. **Direct XML generation** — create `.drawio` files (and optionally export to PNG/SVG/PDF) from a description or requirements. Agent-authored XML (this file), then CLI action `validate` / `task validate`
|
||||
3. **Diagram analysis** — analyse an existing `.drawio` file: inventory shapes and connectors, validate layout quality, detect overlaps/orphans, and recommend page sizes. Invoked as CLI actions `summary`, `page-*`, `quality`, `validate` via `task run -- --action=<name>`
|
||||
4. **Semantic lifecycle** — loss-aware Draw.io import, transactional stable-ID edits, linked views, semantic query/policy/what-if analysis, three-way synchronization, and self-contained offline story publishing. Invoked as CLI actions `import`, `edit`, `views`, `query`, `test`, `what-if`, `sync`, `story`, `doctor` (each has a same-named `task`)
|
||||
5. **Safe source importers** — bounded native TypeScript subsets for Python, JavaScript/TypeScript, Go, Rust, Terraform, Kubernetes, Docker Compose, SQL, OpenAPI, and CI dependency graphs. Library only: `import { importSource } from 'dist/services/source-importers/index.js'`; not reachable as a CLI action
|
||||
6. **Toolbox transforms** — themes, offline generic shape search, reverse Mermaid/Markdown, semantic diff, strict relabeling, and accessible heatmaps. Library only: `import ... from 'dist/services/transforms/{reverse,semantic-diff,relabel,heatmap}.js'`, `'dist/services/themes/theme-service.js'`, `'dist/services/shape-catalog/shape-catalog.js'`; not reachable as a CLI action
|
||||
7. **Specialized profiles** — C4, sequence, tube map, compression, runbook, timelapse, and dependency-ordered build-up services. Library only: `import ... from 'dist/services/profiles/index.js'`; not reachable as a CLI action
|
||||
|
||||
**Reference files** (read these when using this skill):
|
||||
- [references/capabilities.md](./references/capabilities.md) — full list of capabilities and all CLI analysis actions an agent can execute
|
||||
@@ -33,21 +33,24 @@ This skill covers seven capability families:
|
||||
- [references/routing-best-practices.md](./references/routing-best-practices.md) — corridor planning, routing patterns, overlap verification, swimlane routing, validation workflow
|
||||
- [references/maintenance.md](./references/maintenance.md) — maintaining and rebuilding the skill itself
|
||||
- [references/semantic-lifecycle.md](./references/semantic-lifecycle.md) — import, edit, views, query, policy, what-if, sync, story, and doctor workflows
|
||||
- [references/agents365-capability-coverage.md](./references/agents365-capability-coverage.md) — strict evidence matrix for all 42 compared peer tools, including partial and deferred scope
|
||||
- [references/agents365-capability-coverage.md](./references/agents365-capability-coverage.md) — internal comparison matrix against a 42-entry peer-tool feature list (not independently verifiable), including partial and deferred scope
|
||||
|
||||
## Available scripts
|
||||
|
||||
This skill ships the `drawio-tools` TypeScript CLI under `scripts/`. All commands run via `task` from the `scripts/` directory (one-time setup: `pnpm install` + `task build`):
|
||||
This skill ships the `drawio-tools` TypeScript CLI under `scripts/`. All commands run via `task` from the `scripts/` directory (one-time setup: `pnpm install --frozen-lockfile` + `task build`):
|
||||
|
||||
```bash
|
||||
cd <skill>/scripts
|
||||
|
||||
# Run any analysis action against a .drawio file
|
||||
# Run any action against a .drawio file or Diagram IR model
|
||||
task run -- --file="/path/to/diagram.drawio" --action=page-connectors-validation
|
||||
# Actions: summary, page-summary, page-hierarchy, page-connectors-summary,
|
||||
# Analysis actions: summary, page-summary, page-hierarchy, page-connectors-summary,
|
||||
# page-connectors-validation, page-labels-validation, page-shape-bbox-validation,
|
||||
# page-orphans, page-recommendations, page-hierarchy-full,
|
||||
# page-negative-space-summary, quality, validate
|
||||
# Lifecycle actions: import, edit, views, query, test, what-if, sync, story, doctor
|
||||
# (see references/semantic-lifecycle.md)
|
||||
# Authoring action: build (task generate)
|
||||
|
||||
# Validate a .drawio file (mandatory final gate)
|
||||
task validate -- --file="/path/to/diagram.drawio"
|
||||
@@ -58,20 +61,31 @@ task generate -- --file="/path/to/spec.yaml" --output="/path/to/diagram.drawio"
|
||||
# Import an editable Draw.io file to loss-aware semantic IR
|
||||
task import -- --file="/path/to/diagram.drawio" --output="/path/to/model.yaml"
|
||||
|
||||
# Apply one atomic stable-ID edit batch
|
||||
# Apply one atomic stable-ID edit batch (examples/edit-batch.yaml targets examples/platform-v2.yaml)
|
||||
task edit -- --file="/path/to/model.yaml" --spec="/path/to/edit-batch.yaml" --output="/path/to/edited.drawio"
|
||||
|
||||
# Query, policy-test, and what-if analyse a model
|
||||
task query -- --file="/path/to/model.yaml" --kind=service
|
||||
task test -- --file="/path/to/model.yaml" --strict
|
||||
task what-if -- --file="/path/to/model.yaml" --fail=api
|
||||
|
||||
# Three-way sync: --base = previous generated, --file = manually edited, --spec = newly generated
|
||||
task sync -- --base="/path/to/before.yaml" --file="/path/to/edited.yaml" --spec="/path/to/after.yaml" --output="/path/to/synced.drawio"
|
||||
|
||||
# Generate linked audience views or a self-contained offline story
|
||||
task views -- --file="/path/to/model.yaml" --views="executive,system,security" --output="/path/to/views.drawio"
|
||||
task story -- --file="/path/to/model.yaml" --output="/path/to/story.html"
|
||||
|
||||
# Report optional local backends (no --file needed)
|
||||
task doctor
|
||||
|
||||
# Build TypeScript to dist/
|
||||
task build
|
||||
```
|
||||
|
||||
See [references/capabilities.md](./references/capabilities.md) for what every action outputs.
|
||||
|
||||
Source importers, toolbox transforms, and specialized profiles are currently native TypeScript service APIs, not additional CLI actions. Do not invent action names for them; use the exported services or the documented lifecycle actions.
|
||||
Source importers, toolbox transforms, and specialized profiles (families 5–7 above) are native TypeScript service APIs, not CLI actions. Do not invent action names for them; import the listed `dist/services/...` modules or use the documented lifecycle actions.
|
||||
|
||||
---
|
||||
|
||||
@@ -79,7 +93,7 @@ Generate draw.io diagrams as native `.drawio` files. Optionally export to PNG, S
|
||||
|
||||
## How to create a diagram
|
||||
|
||||
1. **Prefer YAML Diagram IR for repeatable diagrams** — use v1 for simple single-page diagrams or v2 for multiple pages, semantic kinds, explicit geometry/waypoints, provenance, and deterministic `linear`, `layered`, `tree`, `grid`, or `manual` layout; then run `build`. See `examples/platform-v2.yaml` and `schemas/diagram-ir-v2.schema.json`
|
||||
1. **Prefer YAML Diagram IR for repeatable diagrams** — use v1 for simple single-page diagrams or v2 for multiple pages, semantic kinds, explicit geometry/waypoints, provenance, and deterministic `linear`, `layered`, `tree`, `grid`, or `manual` layout; then run `task generate` (CLI action `build`). See `examples/platform-v2.yaml` and `schemas/diagram-ir-v2.schema.json`
|
||||
2. **Generate draw.io XML** in mxGraphModel format for the requested diagram
|
||||
3. **Write the XML** to a `.drawio` file in the current working directory using the Write tool
|
||||
4. **Run the mandatory validation actions** against the generated file
|
||||
@@ -236,8 +250,9 @@ Every diagram must have this structure:
|
||||
|
||||
## XML reference
|
||||
|
||||
For the complete draw.io XML reference including common styles, edge routing, containers, layers, tags, metadata, dark mode colors, and XML well-formedness rules, fetch and follow the instructions at:
|
||||
https://raw.githubusercontent.com/jgraph/drawio-mcp/main/shared/xml-reference.md
|
||||
For the complete draw.io XML reference including common styles, edge routing, containers, layers, tags, metadata, dark mode colors, and XML well-formedness rules, read and follow the local copy at [references/xml-references.md](./references/xml-references.md). No network access is required.[^xml-upstream]
|
||||
|
||||
[^xml-upstream]: Latest upstream source of that reference (only consult if the local copy is suspected to be stale): https://raw.githubusercontent.com/jgraph/drawio-mcp/main/shared/xml-reference.md
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
@@ -256,82 +271,16 @@ https://raw.githubusercontent.com/jgraph/drawio-mcp/main/shared/xml-reference.md
|
||||
- Always use unique `id` values for each `mxCell`
|
||||
|
||||
|
||||
## Additional points
|
||||
## Layout and style non-negotiables
|
||||
|
||||
- Always use a __10pt grid__.
|
||||
- Align all elements to the grid; avoid freehand / off-grid placement.
|
||||
- Use page dimensions that fully fit the diagram, including margins, legends, and connector routing corridors.
|
||||
- Keep every main shape's `x`, `y`, `width`, and `height` aligned to clean grid increments.
|
||||
- Prefer element widths and heights divisible by `40`; if a canonical vendor icon has a fixed non-divisible size, wrap it inside a grid-aligned card/container.
|
||||
- Leave intentional whitespace corridors between columns and rows for connectors.
|
||||
The full mandatory rule sets live in [references/rules-layout.md](./references/rules-layout.md) (grid, 40pt spacing, parent sizing, layer model, connector routing, legends, swimlanes, sequence diagrams) and [references/rules-style.md](./references/rules-style.md) (dimensions, colors, borders, text fit, single-port and corner rules). Read both before generating XML. The short version:
|
||||
|
||||
### Same-level shape spacing and parent size rules
|
||||
|
||||
**Rule: Same-level siblings must be placed as close as possible while maintaining grid-aligned gaps.**
|
||||
|
||||
Shapes at the same hierarchy level (siblings inside the same parent, or all top-level shapes) must:
|
||||
|
||||
1. **Minimise the gap** between each other — pack them tightly, leaving only enough space for connectors to pass through.
|
||||
2. **Gap must be grid-aligned** — both the `x` (horizontal gap) and `y` (vertical gap) distances between adjacent same-level shapes must be **divisible by 40 pt**.
|
||||
|
||||
| Gap type | Minimum recommended | Must be divisible by |
|
||||
|---|---|---|
|
||||
| Horizontal gap between siblings (x-axis) | 40 pt | 40 pt |
|
||||
| Vertical gap between siblings (y-axis) | 40 pt | 40 pt |
|
||||
|
||||
> **Example:** If shape A ends at `x=320` and shape B starts at `x=360`, the gap is 40 pt (1 grid unit). If shape A ends at `x=320` and the gap must be wider for a connector corridor, use `x=400` (gap = 80 pt, divisible by 40) — never `x=350` (gap = 30 pt, not on a 40 pt boundary).
|
||||
|
||||
**Rule: A parent (container) shape must always be large enough to fully enclose all its children, including inner padding.**
|
||||
|
||||
When children grow (new children added, children resized, or children repositioned), the parent container must expand to accommodate them. Apply the following sizing formula:
|
||||
|
||||
```
|
||||
parent.width = max_child_right + right_padding (right_padding ≥ 40, divisible by 40)
|
||||
parent.height = max_child_bottom + bottom_padding (bottom_padding ≥ 40, divisible by 40)
|
||||
```
|
||||
|
||||
Where:
|
||||
- `max_child_right = max(child.x + child.width)` over all children (relative to parent)
|
||||
- `max_child_bottom = max(child.y + child.height)` over all children (relative to parent)
|
||||
- Left/top inner padding (the space between parent top-left and first child) must also be ≥ 40 pt and divisible by 40 pt.
|
||||
|
||||
**Cascade rule:** Parent expansion may cause *its* parent to also need expansion. Walk up the containment tree and resize each ancestor in turn until the outermost container fits all descendants.
|
||||
|
||||
**Positioning rule after expansion:** When a parent container grows, re-check sibling spacing at every affected level. All gaps must remain divisible by 40 pt after the resize.
|
||||
|
||||
- Avoid routing connectors through shapes, cards, labels, icons, legends, or containers containing important content.
|
||||
- Prefer orthogonal connectors with explicit waypoints when auto-routing causes overlaps.
|
||||
- If connector auto-routing crosses shapes, use absolute routed points or fixed waypoints instead of relying on `source` / `target` auto-routing.
|
||||
- Keep connector labels off the connector path when diagrams are dense.
|
||||
- If connector labels are needed, place them in a dedicated legend, side note, or clearly empty corridor.
|
||||
- Do not allow connector labels to overlap shapes, cards, icons, or other text.
|
||||
- Avoid long text inside narrow shapes; use wider cards or wrap labels in a dedicated text area inside the card.
|
||||
- Ensure service names fit within the visual card width and do not extend beyond card boundaries.
|
||||
- For service-card diagrams, prefer a consistent card pattern: icon on the left, service label on the right, enough padding around both.
|
||||
- Avoid overlapping shapes, including external actors, cards, icons, notes, legends, and containers.
|
||||
- When using canonical vendor icons, preserve the original icon styling; adjust surrounding card/container layout instead of modifying the icon style.
|
||||
- For rectangles and containers, do not use rounding unless the style explicitly requires it.
|
||||
- Avoid borders on shapes unless they are needed for visual separation or canonical styling.
|
||||
- Use at most __3 primary color families__; create hierarchy with lighter/darker shades instead of adding many unrelated colors.
|
||||
- Keep connector colors simple and consistent; use dashed lines only for semantically different flows such as admin, private, async, or backup paths.
|
||||
- Keep arrowheads outside shape interiors; connectors should touch shape/card edges, not pass through the body.
|
||||
- Validate that all draw.io XML is well-formed and contains required root cells `0` and `1`.
|
||||
- Ensure all `mxCell` IDs are unique.
|
||||
- Every edge must include an `mxGeometry` child; use waypoint arrays for routed connectors.
|
||||
- For complex diagrams, validate connector paths against shape bounding boxes before finalizing.
|
||||
- Prefer a separate legend for flow explanations when connector labels would clutter the diagram.
|
||||
- Keep legends outside the main routing area so connectors do not cross legend text.
|
||||
- Use consistent spacing between diagram lanes/columns and between rows of cards.
|
||||
- Keep diagram complexity medium by grouping services into logical zones/layers instead of scattering many unrelated services.
|
||||
- Use swimlanes or containers for major domains, but avoid placing dense connector routes directly through container titles.
|
||||
- Before completion, re-open or visually inspect the diagram and check specifically for:
|
||||
- shape overlap
|
||||
- connector overlap with cards/icons
|
||||
- connector label overlap
|
||||
- text overflowing card boundaries
|
||||
- page clipping
|
||||
- inconsistent spacing
|
||||
- missing canonical vendor shapes
|
||||
- **10pt grid, 40pt rhythm** — every shape aligned to the grid; dimensions and sibling gaps divisible by 40 (gap ≥ 40); parents enclose children with ≥ 40pt padding on all sides and grow (cascading upward) when children grow.
|
||||
- **Connectors overlap only Layer 0 (containers)** — never shapes, labels, icons, legends, or swimlane headers; use explicit orthogonal waypoints (`edgeStyle=orthogonalEdgeStyle`) when auto-routing would clip; no crossings unless unavoidable, then 90°.
|
||||
- **One exit point, one entry point per shape, mid-side only** — never a corner; arrowheads stop at the shape edge; first/last waypoint ≥ 20px clear of any shape.
|
||||
- **≤ 3 color families, `rounded=0`, no decorative borders, dashed lines only for semantically distinct flows**; text must fit inside its shape; keep canonical vendor icons unmodified and wrap them in grid-aligned cards.
|
||||
- **Labels and legends off the routing path** — connector labels in a clear corridor or a legend placed outside the routing area; group services into logical zones instead of scattering them.
|
||||
- **Page fits everything** including margins, legends, and corridors; before finishing check overlap, connector/label overlap, text overflow, page clipping, inconsistent spacing, and missing canonical shapes, then run `page-connectors-validation`, `page-shape-bbox-validation`, and `validate`.
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in New Issue
Block a user