Content Create

The Content Create flow lets users add a new project asset from a repository context menu. Classifications and subtypes load from an SDL catalog. The subtype dialog uses dual navigation: a job/role tree on the left and an orthogonal evolution lineage on the top-right.

Purpose

  • Fast first cut: Right-click a repository → Create… → choose a large classification only (Documentation, Configuration, Code, Plain text). Do not bury the user in a giant nested submenu.

  • Informed second cut: When a classification has more than one creatable type, open a dialog that explains each type’s role before writing a stub file.

  • Dual axes: Separate what the asset is for (job tree) from how dialects evolved or specialized (lineage graph), so successor formats like SDLang → KDL stay comparable without forcing evolution into the job hierarchy.

  • Data-driven: Labels, descriptions, extensions, templates, and lineage edges live in SDL so advice can ship without rewriting UI code.

Entry points

  • Repository browser: Right-click a repository row → Create… → flat classification submenu (ecosystem tags inferred from the project).

  • File manager: DevCentr menu → New File… / New Project… / Open folder — Win11 modern menu preferred, classic/Linux adapters as fallback (see Explorer Shell Integration).

  • CLI: dev-center.exe --mode=new-file --path=<dir> [--tags=general,java] (also new-project, new-installer, emit-ci, inplace-path, open).

Ecosystem filters

Each catalog type carries one or more ecosystem tags (general, js, jvm, java, dotnet, python, rust, go, d, cpp, docs, devops, data, …). The subtype dialog shows toggle chips for the active tag universe.

  • Show rule: A type is visible if any selected chip intersects its ecosystems (OR). Missing ecosystems on a type ≡ general.

  • Inference: inferEcosystemTags(path) maps project-map stacks and file heuristics (package.json, pom.xml, …) onto tags; always includes general. If nothing is detected, chips default to {general}.

  • CLI / API: CreateContentOptions.initialTags and --tags= populate chips; users can still toggle when allowTagEdit is true.

Flow

  1. User right-clicks a repository and opens Create….

  2. DevCentr shows only top-level classification entries from the catalog (tooltip = summary when present).

  3. If the chosen classification has exactly one creatable leaf type, create that stub immediately (no dialog).

  4. Otherwise open the subtype dialog.

  5. User selects a creatable type (left tree or lineage), confirms Create, and DevCentr writes a stub file under the repository root then opens it in a detected editor when possible.

Dual navigation (subtype dialog)

Region Models Behavior

Left — job / role tree

Nested type nodes under the classification (purpose buckets)

Primary hierarchy. Indent with a ListWidget. Selecting a node updates detail and highlights the same id in lineage when present.

Top-right — lineage

Orthogonal lineage edges scoped to this classification (evolves, supersedes, specializes, dialect)

Secondary navigation. Each row shows a vitality LED, invented year, label, edge kind, and short note. LED colors: green=current, blue=mature, amber=legacy, red=outdated, gray=reference. Selecting a row syncs the left tree and detail.

Bottom-right — detail

Facts + description for the current selection

Scrollable: vitality LED, role, invented year, last updated, extension, homepage / repository / specification link buttons, description. Create enabled only when creatable with an extension.

Layout sketch:

┌──────────────┬─────────────────────────────────────┐
│ Job / role   │ Lineage  [LED][year] label [kind]   │
│ type tree    │                                     │
│              ├─────────────────────────────────────┤
│              │ Facts + links + description         │
│              │ [Create] [Cancel]                   │
└──────────────┴─────────────────────────────────────┘

Catalog (source of truth)

  • Location: app/src/modules/content_create/content-types.sdl

  • Root tag: contentTypes

  • Loader: modules.content_create.loader (sdlang-d)

Top-level classifications (expandable via SDL): Documentation, Configuration, Schema / API contract, Code, Tabular / data files, Plain text.

See Definition Files for ownership relative to services and language ecosystems.

Classification and type fields

Field Meaning

id

Stable identifier (referenced by lineage edges).

label

Human-facing name in menus and lists.

summary

Classification-only short blurb (menu tooltip).

role

One-line job statement for the detail pane.

description

Longer advisory copy (must stay aligned with general-knowledge comparison articles).

extension

File extension including the dot (e.g. .cmk, .sdl). Required for creatable leaves.

suggestedName

Default basename without extension (e.g. README, notes).

template

Optional stub body written into the new file.

creatable

When false, the node is an anchor for lineage only (e.g. plain JSON). Default true for leaves with an extension; folders without extension are not creatable.

inventedYear

Calendar year the format/language appeared (shown in lineage and Facts).

lastUpdated

YYYY or YYYY-MM of last notable release or spec touch.

homepage

Project or marketing home URL (detail link button).

repo / repoUrl

Official source repository URL.

spec / specUrl

Official specification or language-definition URL. For AsciiDoc: the de facto definition is the Asciidoctor-hosted AsciiDoc Language Documentation until the Eclipse AsciiDoc Language Spec is ratified (gitlab.eclipse.org/eclipse/asciidoc-lang/asciidoc-lang).

vitality

current | mature | legacy | outdated | reference — drives the LED color and “outdated?” cue.

ecosystem

One or more filter tags (e.g. ecosystem "general" "jvm" "java"). Used by the chip strip.

Lineage edge kinds

Kind Meaning

evolves

Incremental successor that stays in the same problem space.

supersedes

Stronger “prefer the newer form” narrative (e.g. SDLang → KDL as modern grammar).

specializes

Hyperspecialization for a narrower job (LLM tokens, zero-copy binary, JSX docs).

dialect

Sibling dialect relationship without clear succession.

Each lineage block has scope equal to a classification id. Edges use from, to, kind, and optional note. The UI shows the subgraph for the open classification, optionally focused on the connected component of the current selection.

Create behavior

  • Write UTF-8 stub at {repoRoot}/{suggestedName}{extension} (prompt or auto-suffix if the path exists).

  • Use template when present; otherwise an empty file or a minimal heading derived from label.

  • Open with the first detected editor from editor_detector when available; otherwise leave the file on disk and notify the user.

  • Do not scaffold full Pkl/CUE/Cap’n Proto projects in this pass—stub only.