Update to Scopture
Snapshot Nov 3, 2026 · 06:11 UTC · version 1.2.4
Collection source: downloaded plugin package. These snapshots do not have a confirmed matching collection source. Differences in file lists alone do not establish changes to the package.
Instructions updated for duc
Skill instructions — Now says: metadata: version: "1.2.4" This skill deliberately stays compact. Detailed API signatures, concepts, schema tables, and worked examples are bundled...
Observed in instructions or declared skills. Runtime behavior has not been tested.
Up to 10 plugins free · no card required.
All fields and original values.
Skill instructions
Sep 30, 2026 · 23:10 UTC
This skill deliberately stays compact. Detailed API signatures and examples belong in the versioned documentation routes below, where they can remain synchronized with the implementation. ## `llms.txt` Documentation Routes & Source-of-Tr...
Nov 3, 2026 · 06:11 UTC
metadata: version: "1.2.4" This skill deliberately stays compact. Detailed API signatures, concepts, schema tables, and worked examples are bundled directly inside the relative `./docs/`, `./docs-ducpy/`, and `./docs-sql/` folders of t...
Supporting files
Sep 30, 2026 · 23:10 UTC
[]
Nov 3, 2026 · 06:11 UTC
[{"relative_path":"docs-ducpy/autoapi/ducpy/builders/block_instance_builder/index.md","size_in_bytes":1250},{"relative_path":"docs-ducpy/autoapi/ducpy/builders/block_utils/index.md","size_in_bytes":1559},{"relative_path":"docs-ducpy/auto...
Compare saved observations
Download comparison JSONSKILL.md text changes
− removed · + added
--- before +++ after @@ -1,59 +1,31 @@ --- name: duc description: "Use this skill whenever a DUC drawing (`.duc` file) needs to be read, written, searched, created, inspected, or manipulated programmatically with the Python `ducpy` library. This includes constructing elements, styles, layers, blocks, and states with fluent builders; querying the relational schema through `DucSQL`; streaming external-file or version payloads; and validating coordinate placement or drawing relationships." +metadata: + version: "1.2.4" --- - # DUC Core Canvas Library Skill The `ducpy` Python library provides a fast, developer-friendly interface to read, write, search, and manipulate `.duc` project-state files. Under the hood, a current `.duc` file is a **gzip-compressed SQLite database**. -This skill deliberately stays compact. Detailed API signatures and examples belong in the versioned documentation routes below, where they can remain synchronized with the implementation. +This skill deliberately stays compact. Detailed API signatures, concepts, schema tables, and worked examples are bundled directly inside the relative `./docs/`, `./docs-ducpy/`, and `./docs-sql/` folders of this skill. --- -## `llms.txt` Documentation Routes & Source-of-Truth - -`llms.txt` serves as a structured map to direct agents to the most relevant documentation pages. Agents must retrieve relevant linked pages for RAG rather than relying solely on the index file. - -### Recommended Source Routing - -- **Orchestrator**: `https://duc.ducflair.com/llms.txt` - - Use for: `.duc` concepts, element categories, coordinate placement, document structure, serialization, state and revision concepts, SQL schema guidance, and deciding which library is required. -- **Generator, Inspector, and Critic**: `https://ducflair.github.io/duc/reference/python/llms.txt` - - Use for: actual builder methods, method chaining order, parsing and serialization contracts, mutation functions, element classes, model-element code, and runnable examples. - - Use the maintained `ducpy` examples at `https://ducflair.github.io/duc/reference/python/examples.html` as task scaffolds for element creation, mutation, external files, SQL, serialization, and parsing. Adapt the closest example only after confirming it matches the installed version. - - *Crucial for preventing invalid method calls, incorrect builder stages, and stale argument or return-value assumptions.* - -### Documentation Search - -When the relevant documentation page is unknown, search the docs with a GET request: - -```bash -curl -sG 'https://duc.ducflair.com/api/search' --data-urlencode 'query=<search terms>' -``` - -The endpoint returns a JSON array of matching pages and snippets with their `url`. Use it to identify the most relevant result, then open and read that page for the full context; do not treat the search snippet as the complete documentation. - -**Direct Markdown Output**: -```bash -# Fetch clean markdown directly example: -curl -s 'https://duc.ducflair.com/docs/concepts/architecture' -``` - ### Source-of-Truth Hierarchy Agents must adhere strictly to this priority order: 1. **Runtime introspection of the installed `ducpy` package** -2. **Documentation matching the installed `ducpy` version** -3. **`ducpy` `llms.txt` and linked API pages** (`https://ducflair.github.io/duc/reference/python/llms.txt`) -4. **General DUC documentation** (`https://duc.ducflair.com/llms.txt`) -5. **Existing examples** +2. **Bundled `ducpy` API reference** (`./docs-ducpy/llms.txt`, `./docs-ducpy/*.md`) +3. **Bundled SQLite schema reference** (`./docs-sql/schema.md`, `./docs-sql/llms.txt`) +4. **Bundled DUC concept guides** (`./docs/llms.txt`, `./docs/*.md`) +5. **Existing worked examples** (`./docs-ducpy/examples.md`) > [!IMPORTANT] > **Runtime Introspection & Verification Rule** -> Runtime introspection remains #1 because remote documentation can describe a different release from the installed package. -> **Rule**: *Never invent a `ducpy` method, parameter, return type, schema column, or builder stage. Retrieve the version-matched reference before generating implementation code.* +> Runtime introspection remains #1 because the installed package version might differ. +> **Rule**: *Never invent a `ducpy` method, parameter, return type, schema column, or builder stage. Retrieve the version-matched reference from the local docs or runtime introspection before generating implementation code.* --- @@ -71,6 +43,8 @@ ## Additional Adapter References +For Scopture execution, consult [Python Sandbox](https://site.scopture.com/docs/automation/python-sandbox). `emit_output`, drawing snapshot/patch helpers and `duc_model` imports belong to that host runtime, not standalone `ducpy`. + The general DUC and `ducpy` routes above remain the primary sources. Use these versioned adapter references when a task targets another DUC interface: - **SQL schema**: `https://ducflair.github.io/duc/reference/sql/`
Full technical diff · 2 changed fields
changed /included_files
[]
[
{
"relative_path": "docs-ducpy/autoapi/ducpy/builders/block_instance_builder/index.md",
"size_in_bytes": 1250
},
{
"relative_path": "docs-ducpy/autoapi/ducpy/builders/block_utils/index.md",
"size_in_bytes": 1559
},
{
"relative_path": "docs-ducpy/autoapi/ducpy/builders/element_builders/index.md",
"size_in_bytes": 17596
},
{
"relative_path": "docs-ducpy/autoapi/ducpy/builders/index.md",
"size_in_bytes": 587
},
{
"relative_path": "docs-ducpy/autoapi/ducpy/builders/mutate_builder/index.md",
"size_in_bytes": 3438
},
{
"relative_path": "docs-ducpy/autoapi/ducpy/builders/sql_builder/index.md",
"size_in_bytes": 3579
},
{
"relative_path": "docs-ducpy/autoapi/ducpy/builders/state_builders/index.md",
"size_in_bytes": 19481
},
{
"relative_path": "docs-ducpy/autoapi/ducpy/builders/style_builders/index.md",
"size_in_bytes": 12235
},
{
"relative_path": "docs-ducpy/autoapi/ducpy/classes/DataStateClass/index.md",
"size_in_bytes": 13438
},
{
"relative_path": "docs-ducpy/autoapi/ducpy/classes/ElementsClass/index.md",
"size_in_bytes": 32864
},
{
"relative_path": "docs-ducpy/autoapi/ducpy/classes/index.md",
"size_in_bytes": 205
},
{
"relative_path": "docs-ducpy/autoapi/ducpy/classes/locator/index.md",
"size_in_bytes": 3964
},
{
"relative_path": "docs-ducpy/autoapi/ducpy/enums/index.md",
"size_in_bytes": 6061
},
{
"relative_path": "docs-ducpy/autoapi/ducpy/index.md",
"size_in_bytes": 1095
},
{
"relative_path": "docs-ducpy/autoapi/ducpy/model_output/index.md",
"size_in_bytes": 1173
},
{
"relative_path": "docs-ducpy/autoapi/ducpy/parse/index.md",
"size_in_bytes": 4483
},
{
"relative_path": "docs-ducpy/autoapi/ducpy/search/_model_files/index.md",
"size_in_bytes": 903
},
{
"relative_path": "docs-ducpy/autoapi/ducpy/search/image_ocr/index.md",
"size_in_bytes": 2249
},
{
"relative_path": "docs-ducpy/autoapi/ducpy/search/index.md",
"size_in_bytes": 691
},
{
"relative_path": "docs-ducpy/autoapi/ducpy/search/search_build123d/index.md",
"size_in_bytes": 3751
},
{
"relative_path": "docs-ducpy/autoapi/ducpy/search/search_charter_issues/index.md",
"size_in_bytes": 4189
},
{
"relative_path": "docs-ducpy/autoapi/ducpy/search/search_elements/index.md",
"size_in_bytes": 4014
},
{
"relative_path": "docs-ducpy/autoapi/ducpy/search/search_external_files/index.md",
"size_in_bytes": 8633
},
{
"relative_path": "docs-ducpy/autoapi/ducpy/search/search_ezdxf/index.md",
"size_in_bytes": 5754
},
{
"relative_path": "docs-ducpy/autoapi/ducpy/search/search_ifc/index.md",
"size_in_bytes": 3690
},
{
"relative_path": "docs-ducpy/autoapi/ducpy/search/search_models/index.md",
"size_in_bytes": 6012
},
{
"relative_path": "docs-ducpy/autoapi/ducpy/search/search_pdf/index.md",
"size_in_bytes": 824
},
{
"relative_path": "docs-ducpy/autoapi/ducpy/serialize/index.md",
"size_in_bytes": 8738
},
{
"relative_path": "docs-ducpy/autoapi/ducpy/tessellate/__main__/index.md",
"size_in_bytes": 82
},
{
"relative_path": "docs-ducpy/autoapi/ducpy/tessellate/cli/index.md",
"size_in_bytes": 289
},
{
"relative_path": "docs-ducpy/autoapi/ducpy/tessellate/index.md",
"size_in_bytes": 287
},
{
"relative_path": "docs-ducpy/autoapi/ducpy/tessellate/runner/index.md",
"size_in_bytes": 4059
},
{
"relative_path": "docs-ducpy/autoapi/ducpy/tessellate/shims/index.md",
"size_in_bytes": 5392
},
{
"relative_path": "docs-ducpy/autoapi/ducpy/utils/constants/index.md",
"size_in_bytes": 994
},
{
"relative_path": "docs-ducpy/autoapi/ducpy/utils/convert/index.md",
"size_in_bytes": 3587
},
{
"relative_path": "docs-ducpy/autoapi/ducpy/utils/index.md",
"size_in_bytes": 275
},
{
"relative_path": "docs-ducpy/autoapi/ducpy/utils/io/index.md",
"size_in_bytes": 1370
},
{
"relative_path": "docs-ducpy/autoapi/ducpy/utils/mutate_utils/index.md",
"size_in_bytes": 587
},
{
"relative_path": "docs-ducpy/autoapi/ducpy/utils/rand_utils/index.md",
"size_in_bytes": 882
},
{
"relative_path": "docs-ducpy/autoapi/index.md",
"size_in_bytes": 2895
},
{
"relative_path": "docs-ducpy/downloads.md",
"size_in_bytes": 856
},
{
"relative_path": "docs-ducpy/examples.md",
"size_in_bytes": 22063
},
{
"relative_path": "docs-ducpy/index.md",
"size_in_bytes": 1506
},
{
"relative_path": "docs-ducpy/llms.txt",
"size_in_bytes": 9918
},
{
"relative_path": "docs-sql/llms.txt",
"size_in_bytes": 7423
},
{
"relative_path": "docs-sql/schema.md",
"size_in_bytes": 102846
},
{
"relative_path": "docs/concepts/ai-compatibility.md",
"size_in_bytes": 2720
},
{
"relative_path": "docs/concepts/architecture.md",
"size_in_bytes": 4741
},
{
"relative_path": "docs/concepts/charter-and-issues.md",
"size_in_bytes": 8993
},
{
"relative_path": "docs/concepts/elements/blocks.md",
"size_in_bytes": 3047
},
{
"relative_path": "docs/concepts/elements/document-element.md",
"size_in_bytes": 5688
},
{
"relative_path": "docs/concepts/elements/linear-element.md",
"size_in_bytes": 11704
},
{
"relative_path": "docs/concepts/elements/model-element.md",
"size_in_bytes": 13032
},
{
"relative_path": "docs/concepts/elements/overview.md",
"size_in_bytes": 5439
},
{
"relative_path": "docs/concepts/elements/plot-element.md",
"size_in_bytes": 3203
},
{
"relative_path": "docs/concepts/external-files.md",
"size_in_bytes": 8538
},
{
"relative_path": "docs/concepts/model-modularization.md",
"size_in_bytes": 4068
},
{
"relative_path": "docs/concepts/streaming.md",
"size_in_bytes": 2620
},
{
"relative_path": "docs/concepts/version-control.md",
"size_in_bytes": 5297
},
{
"relative_path": "docs/concepts/why-duc-exists.md",
"size_in_bytes": 4004
},
{
"relative_path": "docs/get_started/figma.md",
"size_in_bytes": 583
},
{
"relative_path": "docs/get_started/setup.md",
"size_in_bytes": 1277
},
{
"relative_path": "docs/guidelines/avoid-overlaps.md",
"size_in_bytes": 5270
},
{
"relative_path": "docs/guidelines/deleting-elements.md",
"size_in_bytes": 562
},
{
"relative_path": "docs/guidelines/styling-elements.md",
"size_in_bytes": 11202
},
{
"relative_path": "docs/guidelines/using-fonts.md",
"size_in_bytes": 8151
},
{
"relative_path": "docs/index.md",
"size_in_bytes": 2331
},
{
"relative_path": "docs/license.md",
"size_in_bytes": 917
},
{
"relative_path": "docs/llms.txt",
"size_in_bytes": 5949
},
{
"relative_path": "docs/pdf/api.md",
"size_in_bytes": 291
},
{
"relative_path": "docs/pdf/overview.md",
"size_in_bytes": 656
},
{
"relative_path": "docs/python/api.md",
"size_in_bytes": 286
},
{
"relative_path": "docs/python/overview.md",
"size_in_bytes": 1680
},
{
"relative_path": "docs/roadmap/overview.md",
"size_in_bytes": 1207
},
{
"relative_path": "docs/roadmap/y0.md",
"size_in_bytes": 547
},
{
"relative_path": "docs/roadmap/y1.md",
"size_in_bytes": 864
},
{
"relative_path": "docs/roadmap/y2.md",
"size_in_bytes": 592
},
{
"relative_path": "docs/rust/api.md",
"size_in_bytes": 295
},
{
"relative_path": "docs/rust/overview.md",
"size_in_bytes": 1652
},
{
"relative_path": "docs/sql/api.md",
"size_in_bytes": 297
},
{
"relative_path": "docs/sql/overview.md",
"size_in_bytes": 867
},
{
"relative_path": "docs/svg/api.md",
"size_in_bytes": 291
},
{
"relative_path": "docs/svg/overview.md",
"size_in_bytes": 581
},
{
"relative_path": "docs/typescript/api.md",
"size_in_bytes": 303
},
{
"relative_path": "docs/typescript/overview.md",
"size_in_bytes": 734
},
{
"relative_path": "docs/updates.md",
"size_in_bytes": 53
}
]changed /skill_md_contents
"---\nname: duc\ndescription: \"Use this skill whenever a DUC drawing (`.duc` file) needs to be read, written, searched, created, inspected, or manipulated programmatically with the Python `ducpy` library. This includes constructing elements, styles, layers, blocks, and states with fluent builders; querying the relational schema through `DucSQL`; streaming external-file or version payloads; and validating coordinate placement or drawing relationships.\"\n---\n\n# DUC Core Canvas Library Skill\n\nThe `ducpy` Python library provides a fast, developer-friendly interface to read, write, search, and manipulate `.duc` project-state files. Under the hood, a current `.duc` file is a **gzip-compressed SQLite database**.\n\nThis skill deliberately stays compact. Detailed API signatures and examples belong in the versioned documentation routes below, where they can remain synchronized with the implementation.\n\n---\n\n## `llms.txt` Documentation Routes & Source-of-Truth\n\n`llms.txt` serves as a structured map to direct agents to the most relevant documentation pages. Agents must retrieve relevant linked pages for RAG rather than relying solely on the index file.\n\n### Recommended Source Routing\n\n- **Orchestrator**: `https://duc.ducflair.com/llms.txt`\n - Use for: `.duc` concepts, element categories, coordinate placement, document structure, serialization, state and revision concepts, SQL schema guidance, and deciding which library is required.\n- **Generator, Inspector, and Critic**: `https://ducflair.github.io/duc/reference/python/llms.txt`\n - Use for: actual builder methods, method chaining order, parsing and serialization contracts, mutation functions, element classes, model-element code, and runnable examples.\n - Use the maintained `ducpy` examples at `https://ducflair.github.io/duc/reference/python/examples.html` as task scaffolds for element creation, mutation, external files, SQL, serialization, and parsing. Adapt the closest example only after confirming it matches the installed version.\n - *Crucial for preventing invalid method calls, incorrect builder stages, and stale argument or return-value assumptions.*\n\n### Documentation Search\n\nWhen the relevant documentation page is unknown, search the docs with a GET request:\n\n```bash\ncurl -sG 'https://duc.ducflair.com/api/search' --data-urlencode 'query=<search terms>'\n```\n\nThe endpoint returns a JSON array of matching pages and snippets with their `url`. Use it to identify the most relevant result, then open and read that page for the full context; do not treat the search snippet as the complete documentation.\n\n**Direct Markdown Output**:\n```bash\n# Fetch clean markdown directly example:\ncurl -s 'https://duc.ducflair.com/docs/concepts/architecture'\n```\n\n### Source-of-Truth Hierarchy\n\nAgents must adhere strictly to this priority order:\n\n1. **Runtime introspection of the installed `ducpy` package**\n2. **Documentation matching the installed `ducpy` version**\n3. **`ducpy` `llms.txt` and linked API pages** (`https://ducflair.github.io/duc/reference/python/llms.txt`)\n4. **General DUC documentation** (`https://duc.ducflair.com/llms.txt`)\n5. **Existing examples**\n\n> [!IMPORTANT]\n> **Runtime Introspection & Verification Rule**\n> Runtime introspection remains #1 because remote documentation can describe a different release from the installed package.\n> **Rule**: *Never invent a `ducpy` method, parameter, return type, schema column, or builder stage. Retrieve the version-matched reference before generating implementation code.*\n\n---\n\n## Key Design & Code Standards\n\n* **Coordinate System & Units**: `x` and `y` are the element's top-left canvas position. Positive X extends rightward and positive Y extends downward. Linear, arrow, and freedraw points are local to that element origin. Angles are radians, and coordinates and dimensions use the element's declared scope.\n* **Current File I/O Contract**: `parse_duc()` accepts a filesystem path and returns recursively wrapped `DucData` dictionaries with flattened snake_case fields. `serialize_duc()` writes a `.duc` file and returns its path; it does not return drawing bytes.\n* **In-Place Mutation**: Use `duc.mutate_element()` for builder-created `ElementWrapper` or dataclass objects. Parsed `DucData` elements are dictionaries and should be edited through their existing fields. Never destroy and recreate an element merely to update it, because doing so can lose IDs, memberships, bindings, and other relationships.\n* **Binding Preservation**: Preserve existing element IDs, `bound_elements`, group/region/block memberships, `frame_id`, `layer_id`, and instance relationships during edits.\n* **Strict Builder Methods**: Methods are stage-specific. Confirm the active builder class and installed-version signature before invocation.\n* **Styling Elements (Default Fill & Stroke)**: When generating 2D CAD elements, always explicitly define styles with a default fill (background) or stroke; do not assume they are applied automatically. Refer to [Styling Elements](https://duc.ducflair.com/docs/guidelines/styling-elements) for constructing ordered `backgrounds` and `strokes` arrays using `duc.create_simple_styles`.\n* **No Duplicated API Reference**: Do not add volatile builder examples, serialization snippets, or schema catalogs to this skill. Improve the corresponding Duc documentation instead so `llms.txt` remains the maintained source.\n\n---\n\n## Additional Adapter References\n\nThe general DUC and `ducpy` routes above remain the primary sources. Use these versioned adapter references when a task targets another DUC interface:\n\n- **SQL schema**: `https://ducflair.github.io/duc/reference/sql/`\n- **Rust (`duc`)**: `https://ducflair.github.io/duc/reference/rust/duc/`\n- **TypeScript / JavaScript (`ducjs`)**: `https://ducflair.github.io/duc/reference/typescript/`\n- **PDF (`ducpdf`)**: `https://ducflair.github.io/duc/reference/pdf/`\n- **SVG (`ducsvg`)**: `https://ducflair.github.io/duc/reference/svg`\n"
"---\nname: duc\ndescription: \"Use this skill whenever a DUC drawing (`.duc` file) needs to be read, written, searched, created, inspected, or manipulated programmatically with the Python `ducpy` library. This includes constructing elements, styles, layers, blocks, and states with fluent builders; querying the relational schema through `DucSQL`; streaming external-file or version payloads; and validating coordinate placement or drawing relationships.\"\nmetadata:\n version: \"1.2.4\"\n---\n# DUC Core Canvas Library Skill\n\nThe `ducpy` Python library provides a fast, developer-friendly interface to read, write, search, and manipulate `.duc` project-state files. Under the hood, a current `.duc` file is a **gzip-compressed SQLite database**.\n\nThis skill deliberately stays compact. Detailed API signatures, concepts, schema tables, and worked examples are bundled directly inside the relative `./docs/`, `./docs-ducpy/`, and `./docs-sql/` folders of this skill.\n\n---\n\n### Source-of-Truth Hierarchy\n\nAgents must adhere strictly to this priority order:\n\n1. **Runtime introspection of the installed `ducpy` package**\n2. **Bundled `ducpy` API reference** (`./docs-ducpy/llms.txt`, `./docs-ducpy/*.md`)\n3. **Bundled SQLite schema reference** (`./docs-sql/schema.md`, `./docs-sql/llms.txt`)\n4. **Bundled DUC concept guides** (`./docs/llms.txt`, `./docs/*.md`)\n5. **Existing worked examples** (`./docs-ducpy/examples.md`)\n\n> [!IMPORTANT]\n> **Runtime Introspection & Verification Rule**\n> Runtime introspection remains #1 because the installed package version might differ.\n> **Rule**: *Never invent a `ducpy` method, parameter, return type, schema column, or builder stage. Retrieve the version-matched reference from the local docs or runtime introspection before generating implementation code.*\n\n---\n\n## Key Design & Code Standards\n\n* **Coordinate System & Units**: `x` and `y` are the element's top-left canvas position. Positive X extends rightward and positive Y extends downward. Linear, arrow, and freedraw points are local to that element origin. Angles are radians, and coordinates and dimensions use the element's declared scope.\n* **Current File I/O Contract**: `parse_duc()` accepts a filesystem path and returns recursively wrapped `DucData` dictionaries with flattened snake_case fields. `serialize_duc()` writes a `.duc` file and returns its path; it does not return drawing bytes.\n* **In-Place Mutation**: Use `duc.mutate_element()` for builder-created `ElementWrapper` or dataclass objects. Parsed `DucData` elements are dictionaries and should be edited through their existing fields. Never destroy and recreate an element merely to update it, because doing so can lose IDs, memberships, bindings, and other relationships.\n* **Binding Preservation**: Preserve existing element IDs, `bound_elements`, group/region/block memberships, `frame_id`, `layer_id`, and instance relationships during edits.\n* **Strict Builder Methods**: Methods are stage-specific. Confirm the active builder class and installed-version signature before invocation.\n* **Styling Elements (Default Fill & Stroke)**: When generating 2D CAD elements, always explicitly define styles with a default fill (background) or stroke; do not assume they are applied automatically. Refer to [Styling Elements](https://duc.ducflair.com/docs/guidelines/styling-elements) for constructing ordered `backgrounds` and `strokes` arrays using `duc.create_simple_styles`.\n* **No Duplicated API Reference**: Do not add volatile builder examples, serialization snippets, or schema catalogs to this skill. Improve the corresponding Duc documentation instead so `llms.txt` remains the maintained source.\n\n---\n\n## Additional Adapter References\n\nFor Scopture execution, consult [Python Sandbox](https://site.scopture.com/docs/automation/python-sandbox). `emit_output`, drawing snapshot/patch helpers and `duc_model` imports belong to that host runtime, not standalone `ducpy`.\n\nThe general DUC and `ducpy` routes above remain the primary sources. Use these versioned adapter references when a task targets another DUC interface:\n\n- **SQL schema**: `https://ducflair.github.io/duc/reference/sql/`\n- **Rust (`duc`)**: `https://ducflair.github.io/duc/reference/rust/duc/`\n- **TypeScript / JavaScript (`ducjs`)**: `https://ducflair.github.io/duc/reference/typescript/`\n- **PDF (`ducpdf`)**: `https://ducflair.github.io/duc/reference/pdf/`\n- **SVG (`ducsvg`)**: `https://ducflair.github.io/duc/reference/svg`\n"
Full snapshot data
{
"description": "Use this skill whenever a DUC drawing (`.duc` file) needs to be read, written, searched, created, inspected, or manipulated programmatically with the Python `ducpy` library. This includes constructing elements, styles, layers, blocks, and states with fluent builders; querying the relational schema through `DucSQL`; streaming external-file or version payloads; and validating coordinate placement or drawing relationships.",
"included_files": [
{
"relative_path": "docs-ducpy/autoapi/ducpy/builders/block_instance_builder/index.md",
"size_in_bytes": 1250
},
{
"relative_path": "docs-ducpy/autoapi/ducpy/builders/block_utils/index.md",
"size_in_bytes": 1559
},
{
"relative_path": "docs-ducpy/autoapi/ducpy/builders/element_builders/index.md",
"size_in_bytes": 17596
},
{
"relative_path": "docs-ducpy/autoapi/ducpy/builders/index.md",
"size_in_bytes": 587
},
{
"relative_path": "docs-ducpy/autoapi/ducpy/builders/mutate_builder/index.md",
"size_in_bytes": 3438
},
{
"relative_path": "docs-ducpy/autoapi/ducpy/builders/sql_builder/index.md",
"size_in_bytes": 3579
},
{
"relative_path": "docs-ducpy/autoapi/ducpy/builders/state_builders/index.md",
"size_in_bytes": 19481
},
{
"relative_path": "docs-ducpy/autoapi/ducpy/builders/style_builders/index.md",
"size_in_bytes": 12235
},
{
"relative_path": "docs-ducpy/autoapi/ducpy/classes/DataStateClass/index.md",
"size_in_bytes": 13438
},
{
"relative_path": "docs-ducpy/autoapi/ducpy/classes/ElementsClass/index.md",
"size_in_bytes": 32864
},
{
"relative_path": "docs-ducpy/autoapi/ducpy/classes/index.md",
"size_in_bytes": 205
},
{
"relative_path": "docs-ducpy/autoapi/ducpy/classes/locator/index.md",
"size_in_bytes": 3964
},
{
"relative_path": "docs-ducpy/autoapi/ducpy/enums/index.md",
"size_in_bytes": 6061
},
{
"relative_path": "docs-ducpy/autoapi/ducpy/index.md",
"size_in_bytes": 1095
},
{
"relative_path": "docs-ducpy/autoapi/ducpy/model_output/index.md",
"size_in_bytes": 1173
},
{
"relative_path": "docs-ducpy/autoapi/ducpy/parse/index.md",
"size_in_bytes": 4483
},
{
"relative_path": "docs-ducpy/autoapi/ducpy/search/_model_files/index.md",
"size_in_bytes": 903
},
{
"relative_path": "docs-ducpy/autoapi/ducpy/search/image_ocr/index.md",
"size_in_bytes": 2249
},
{
"relative_path": "docs-ducpy/autoapi/ducpy/search/index.md",
"size_in_bytes": 691
},
{
"relative_path": "docs-ducpy/autoapi/ducpy/search/search_build123d/index.md",
"size_in_bytes": 3751
},
{
"relative_path": "docs-ducpy/autoapi/ducpy/search/search_charter_issues/index.md",
"size_in_bytes": 4189
},
{
"relative_path": "docs-ducpy/autoapi/ducpy/search/search_elements/index.md",
"size_in_bytes": 4014
},
{
"relative_path": "docs-ducpy/autoapi/ducpy/search/search_external_files/index.md",
"size_in_bytes": 8633
},
{
"relative_path": "docs-ducpy/autoapi/ducpy/search/search_ezdxf/index.md",
"size_in_bytes": 5754
},
{
"relative_path": "docs-ducpy/autoapi/ducpy/search/search_ifc/index.md",
"size_in_bytes": 3690
},
{
"relative_path": "docs-ducpy/autoapi/ducpy/search/search_models/index.md",
"size_in_bytes": 6012
},
{
"relative_path": "docs-ducpy/autoapi/ducpy/search/search_pdf/index.md",
"size_in_bytes": 824
},
{
"relative_path": "docs-ducpy/autoapi/ducpy/serialize/index.md",
"size_in_bytes": 8738
},
{
"relative_path": "docs-ducpy/autoapi/ducpy/tessellate/__main__/index.md",
"size_in_bytes": 82
},
{
"relative_path": "docs-ducpy/autoapi/ducpy/tessellate/cli/index.md",
"size_in_bytes": 289
},
{
"relative_path": "docs-ducpy/autoapi/ducpy/tessellate/index.md",
"size_in_bytes": 287
},
{
"relative_path": "docs-ducpy/autoapi/ducpy/tessellate/runner/index.md",
"size_in_bytes": 4059
},
{
"relative_path": "docs-ducpy/autoapi/ducpy/tessellate/shims/index.md",
"size_in_bytes": 5392
},
{
"relative_path": "docs-ducpy/autoapi/ducpy/utils/constants/index.md",
"size_in_bytes": 994
},
{
"relative_path": "docs-ducpy/autoapi/ducpy/utils/convert/index.md",
"size_in_bytes": 3587
},
{
"relative_path": "docs-ducpy/autoapi/ducpy/utils/index.md",
"size_in_bytes": 275
},
{
"relative_path": "docs-ducpy/autoapi/ducpy/utils/io/index.md",
"size_in_bytes": 1370
},
{
"relative_path": "docs-ducpy/autoapi/ducpy/utils/mutate_utils/index.md",
"size_in_bytes": 587
},
{
"relative_path": "docs-ducpy/autoapi/ducpy/utils/rand_utils/index.md",
"size_in_bytes": 882
},
{
"relative_path": "docs-ducpy/autoapi/index.md",
"size_in_bytes": 2895
},
{
"relative_path": "docs-ducpy/downloads.md",
"size_in_bytes": 856
},
{
"relative_path": "docs-ducpy/examples.md",
"size_in_bytes": 22063
},
{
"relative_path": "docs-ducpy/index.md",
"size_in_bytes": 1506
},
{
"relative_path": "docs-ducpy/llms.txt",
"size_in_bytes": 9918
},
{
"relative_path": "docs-sql/llms.txt",
"size_in_bytes": 7423
},
{
"relative_path": "docs-sql/schema.md",
"size_in_bytes": 102846
},
{
"relative_path": "docs/concepts/ai-compatibility.md",
"size_in_bytes": 2720
},
{
"relative_path": "docs/concepts/architecture.md",
"size_in_bytes": 4741
},
{
"relative_path": "docs/concepts/charter-and-issues.md",
"size_in_bytes": 8993
},
{
"relative_path": "docs/concepts/elements/blocks.md",
"size_in_bytes": 3047
},
{
"relative_path": "docs/concepts/elements/document-element.md",
"size_in_bytes": 5688
},
{
"relative_path": "docs/concepts/elements/linear-element.md",
"size_in_bytes": 11704
},
{
"relative_path": "docs/concepts/elements/model-element.md",
"size_in_bytes": 13032
},
{
"relative_path": "docs/concepts/elements/overview.md",
"size_in_bytes": 5439
},
{
"relative_path": "docs/concepts/elements/plot-element.md",
"size_in_bytes": 3203
},
{
"relative_path": "docs/concepts/external-files.md",
"size_in_bytes": 8538
},
{
"relative_path": "docs/concepts/model-modularization.md",
"size_in_bytes": 4068
},
{
"relative_path": "docs/concepts/streaming.md",
"size_in_bytes": 2620
},
{
"relative_path": "docs/concepts/version-control.md",
"size_in_bytes": 5297
},
{
"relative_path": "docs/concepts/why-duc-exists.md",
"size_in_bytes": 4004
},
{
"relative_path": "docs/get_started/figma.md",
"size_in_bytes": 583
},
{
"relative_path": "docs/get_started/setup.md",
"size_in_bytes": 1277
},
{
"relative_path": "docs/guidelines/avoid-overlaps.md",
"size_in_bytes": 5270
},
{
"relative_path": "docs/guidelines/deleting-elements.md",
"size_in_bytes": 562
},
{
"relative_path": "docs/guidelines/styling-elements.md",
"size_in_bytes": 11202
},
{
"relative_path": "docs/guidelines/using-fonts.md",
"size_in_bytes": 8151
},
{
"relative_path": "docs/index.md",
"size_in_bytes": 2331
},
{
"relative_path": "docs/license.md",
"size_in_bytes": 917
},
{
"relative_path": "docs/llms.txt",
"size_in_bytes": 5949
},
{
"relative_path": "docs/pdf/api.md",
"size_in_bytes": 291
},
{
"relative_path": "docs/pdf/overview.md",
"size_in_bytes": 656
},
{
"relative_path": "docs/python/api.md",
"size_in_bytes": 286
},
{
"relative_path": "docs/python/overview.md",
"size_in_bytes": 1680
},
{
"relative_path": "docs/roadmap/overview.md",
"size_in_bytes": 1207
},
{
"relative_path": "docs/roadmap/y0.md",
"size_in_bytes": 547
},
{
"relative_path": "docs/roadmap/y1.md",
"size_in_bytes": 864
},
{
"relative_path": "docs/roadmap/y2.md",
"size_in_bytes": 592
},
{
"relative_path": "docs/rust/api.md",
"size_in_bytes": 295
},
{
"relative_path": "docs/rust/overview.md",
"size_in_bytes": 1652
},
{
"relative_path": "docs/sql/api.md",
"size_in_bytes": 297
},
{
"relative_path": "docs/sql/overview.md",
"size_in_bytes": 867
},
{
"relative_path": "docs/svg/api.md",
"size_in_bytes": 291
},
{
"relative_path": "docs/svg/overview.md",
"size_in_bytes": 581
},
{
"relative_path": "docs/typescript/api.md",
"size_in_bytes": 303
},
{
"relative_path": "docs/typescript/overview.md",
"size_in_bytes": 734
},
{
"relative_path": "docs/updates.md",
"size_in_bytes": 53
}
],
"name": "duc",
"skill_md_contents": "---\nname: duc\ndescription: \"Use this skill whenever a DUC drawing (`.duc` file) needs to be read, written, searched, created, inspected, or manipulated programmatically with the Python `ducpy` library. This includes constructing elements, styles, layers, blocks, and states with fluent builders; querying the relational schema through `DucSQL`; streaming external-file or version payloads; and validating coordinate placement or drawing relationships.\"\nmetadata:\n version: \"1.2.4\"\n---\n# DUC Core Canvas Library Skill\n\nThe `ducpy` Python library provides a fast, developer-friendly interface to read, write, search, and manipulate `.duc` project-state files. Under the hood, a current `.duc` file is a **gzip-compressed SQLite database**.\n\nThis skill deliberately stays compact. Detailed API signatures, concepts, schema tables, and worked examples are bundled directly inside the relative `./docs/`, `./docs-ducpy/`, and `./docs-sql/` folders of this skill.\n\n---\n\n### Source-of-Truth Hierarchy\n\nAgents must adhere strictly to this priority order:\n\n1. **Runtime introspection of the installed `ducpy` package**\n2. **Bundled `ducpy` API reference** (`./docs-ducpy/llms.txt`, `./docs-ducpy/*.md`)\n3. **Bundled SQLite schema reference** (`./docs-sql/schema.md`, `./docs-sql/llms.txt`)\n4. **Bundled DUC concept guides** (`./docs/llms.txt`, `./docs/*.md`)\n5. **Existing worked examples** (`./docs-ducpy/examples.md`)\n\n> [!IMPORTANT]\n> **Runtime Introspection & Verification Rule**\n> Runtime introspection remains #1 because the installed package version might differ.\n> **Rule**: *Never invent a `ducpy` method, parameter, return type, schema column, or builder stage. Retrieve the version-matched reference from the local docs or runtime introspection before generating implementation code.*\n\n---\n\n## Key Design & Code Standards\n\n* **Coordinate System & Units**: `x` and `y` are the element's top-left canvas position. Positive X extends rightward and positive Y extends downward. Linear, arrow, and freedraw points are local to that element origin. Angles are radians, and coordinates and dimensions use the element's declared scope.\n* **Current File I/O Contract**: `parse_duc()` accepts a filesystem path and returns recursively wrapped `DucData` dictionaries with flattened snake_case fields. `serialize_duc()` writes a `.duc` file and returns its path; it does not return drawing bytes.\n* **In-Place Mutation**: Use `duc.mutate_element()` for builder-created `ElementWrapper` or dataclass objects. Parsed `DucData` elements are dictionaries and should be edited through their existing fields. Never destroy and recreate an element merely to update it, because doing so can lose IDs, memberships, bindings, and other relationships.\n* **Binding Preservation**: Preserve existing element IDs, `bound_elements`, group/region/block memberships, `frame_id`, `layer_id`, and instance relationships during edits.\n* **Strict Builder Methods**: Methods are stage-specific. Confirm the active builder class and installed-version signature before invocation.\n* **Styling Elements (Default Fill & Stroke)**: When generating 2D CAD elements, always explicitly define styles with a default fill (background) or stroke; do not assume they are applied automatically. Refer to [Styling Elements](https://duc.ducflair.com/docs/guidelines/styling-elements) for constructing ordered `backgrounds` and `strokes` arrays using `duc.create_simple_styles`.\n* **No Duplicated API Reference**: Do not add volatile builder examples, serialization snippets, or schema catalogs to this skill. Improve the corresponding Duc documentation instead so `llms.txt` remains the maintained source.\n\n---\n\n## Additional Adapter References\n\nFor Scopture execution, consult [Python Sandbox](https://site.scopture.com/docs/automation/python-sandbox). `emit_output`, drawing snapshot/patch helpers and `duc_model` imports belong to that host runtime, not standalone `ducpy`.\n\nThe general DUC and `ducpy` routes above remain the primary sources. Use these versioned adapter references when a task targets another DUC interface:\n\n- **SQL schema**: `https://ducflair.github.io/duc/reference/sql/`\n- **Rust (`duc`)**: `https://ducflair.github.io/duc/reference/rust/duc/`\n- **TypeScript / JavaScript (`ducjs`)**: `https://ducflair.github.io/duc/reference/typescript/`\n- **PDF (`ducpdf`)**: `https://ducflair.github.io/duc/reference/pdf/`\n- **SVG (`ducsvg`)**: `https://ducflair.github.io/duc/reference/svg`\n"
}SHA-256 of public snapshot: f3aa493b1c32e792464b5f73db6ade522187158e79ab921c68b0bc3d822834a2