---
name: add-writerside-doc-module
description: Add a new external Writerside documentation source to kotlin-web-site via the
TeamCity Kotlin DSL (as a sub-documentation source under KotlinWithCoroutines). Use when
wiring a new Kotlin/* docs repo into the site. Covers the VCS root, its registration, the
checkout rules, the kr.tree TOC include, v.list version vars, and the README row. The old
git-submodule approach is obsolete — do not use it.
---
# Add a new Writerside docs module
This skill wires an **external documentation repository** into kotlin-web-site so its pages
are built and published as part of the main Kotlin docs site.
A doc source is now added entirely through the **TeamCity Kotlin DSL** as a
*sub-documentation* source nested under the existing `KotlinWithCoroutines` build (the
`kotlin-reference` module). There is **no git submodule** and **no new build object** for
this pattern — `addSubDocumentation(...)` handles checkout and snippet wiring.
The reference implementation is the **kotlinx.serialization** addition; mirror it.
> Follow `.ai/guidelines.md` at all times (required by `CLAUDE.md`).
## When to use
The user wants to publish docs from another repo (e.g. a new `Kotlin/*` library) on
kotlinlang.org, the same way coroutines, lincheck, dokka, api-guidelines, and serialization
are published.
## Inputs to gather first
Ask the user for (infer sensible defaults from the serialization example where possible):
| Input | Example | Notes |
|-------|---------|-------|
| Object base name | `KotlinxSerialization` | Used as `Root` for the VCS root object. |
| Display name | `Kotlinx Serialization` | Human-readable `name` of the VCS root. |
| Git SSH URL | `git@github.com:Kotlin/kotlinx.serialization.git` | Must be SSH (`git@github.com:...`). |
| Branch | `refs/heads/master` | Full ref. May be a custom docs branch. |
| Checkout dir | `kotlinx.serialization` | Dir name passed to `addSubDocumentation`. |
| Docs layout | default `docs/` **or** custom (e.g. `docs-website`) | Determines whether custom `rules` are needed. |
| External tree file | `serialization.tree` | The `.tree` file that lives in the source repo. |
| origin / element-id | `serialization` | The module id used in the ``. |
| TOC title | `Serialization (kotlinx.serialization)` | Shown in the site sidebar. |
| Version vars | `kotlinxIoVersion=0.9.0`, `okioVersion=3.16.2` | Any `%var%` the docs reference; optional. |
| README row | page URL + repo URL | For the external-docs table. |
## Steps — apply these six edits
Make the edits in this order. Each one is anchored to an existing pattern; append the new
entry alongside the others rather than reformatting the file.
### 1. Add the VCS root
File: `.teamcity/documentation/vcsRoots/DocumentationRoots.kt`
Append a new `GitVcsRoot` object after the last one (currently `KotlinxSerializationRoot`):
```kotlin
object Root: GitVcsRoot({
name = ""
url = ""
branch = ""
branchSpec = "+:refs/heads/*"
checkoutPolicy = AgentCheckoutPolicy.USE_MIRRORS
authMethod = uploadedKey {
uploadedKey = "default teamcity key"
}
})
```
### 2. Register the VCS root
File: `.teamcity/documentation/DocumentationProject.kt`
Add a line after the last `vcsRoot(...)` call:
```kotlin
vcsRoot(Root)
```
No import needed — the file already does `import documentation.vcsRoots.*`.
### 3. Wire it as sub-documentation
File: `.teamcity/documentation/builds/KotlinWithCoroutines.kt`
Add an `addSubDocumentation(...)` call inside the `init { }` block, alongside the existing
calls.
- **Default layout** (repo has `docs/` and `docs/snippets/`) — omit the `rules` arg; the
helper defaults to checking out `.git` + `docs`:
```kotlin
addSubDocumentation("", Root)
```
- **Custom layout** — pass explicit checkout `rules`. Each rule is
`+: => `. You must include `.git`. Example
(serialization, whose docs live in `docs-website`):
```kotlin
addSubDocumentation("kotlinx.serialization", KotlinxSerializationRoot, """
+:.git => kotlinx-serialization/.git
+:docs-website => kotlinx-serialization/docs-website
""".trimIndent())
```
The helper `addSubDocumentation` (defined at the bottom of `KotlinWithCoroutines.kt`, around
line 49) adds the VCS root with checkout rules and prepends a step that symlinks the
module's snippets into `docs/snippets`. Don't duplicate that logic — just call it.
### 4. Include the module in the TOC
File: `docs/kr.tree`
Add (or replace a placeholder `topic=` entry with) a `` that includes the
external tree. Place it near the other library includes (coroutines, lincheck):
```xml
```
`from` is the `.tree` filename that ships in the source repo; `origin` and `element-id`
identify the module.
### 5. Add version variables (if any)
File: `docs/v.list`
Add a `` for each version the module's docs reference via `%name%`:
```xml
```
### 6. Update the README
File: `README.md`
Add a row to the external-docs table (the "Source files ... are stored in separate
repositories" table):
```
| [ docs]() | []() |
```
## Worked example — kotlinx.serialization
This is the exact diff produced by the reference change; use it as a template.
```diff
# DocumentationRoots.kt
+object KotlinxSerializationRoot: GitVcsRoot({
+ name = "Kotlinx Serialization"
+ url = "git@github.com:Kotlin/kotlinx.serialization.git"
+ branch = "refs/heads/doc-restructuring-master"
+ branchSpec = "+:refs/heads/*"
+ checkoutPolicy = AgentCheckoutPolicy.USE_MIRRORS
+ authMethod = uploadedKey { uploadedKey = "default teamcity key" }
+})
# DocumentationProject.kt
+ vcsRoot(KotlinxSerializationRoot)
# KotlinWithCoroutines.kt (inside init { })
+ addSubDocumentation("kotlinx.serialization", KotlinxSerializationRoot, """
+ +:.git => kotlinx-serialization/.git
+ +:docs-website => kotlinx-serialization/docs-website
+ """.trimIndent())
# docs/kr.tree
-
+
+
+
# docs/v.list
+
+
# README.md (external-docs table)
+| [Serialization docs](https://kotlinlang.org/docs/serialization.html) | [kotlinx.serialization](https://github.com/Kotlin/kotlinx.serialization) |
```
## Pre-conditions to confirm with the user
- The source repo, on the chosen branch, actually contains the referenced `.tree` file and
the docs path used in the checkout rules.
- The `origin`/`element-id` match what the source repo's tree exposes.
## Verify
- Compile/lint the TeamCity DSL so the new root and registration are valid Kotlin:
generate the configs (e.g. `cd .teamcity && mvn -q teamcity-configs:generate`, or the
repo's configured DSL check).
- Confirm `docs/kr.tree` remains valid XML and the new `` resolves the expected
`origin`/`element-id`.
- Diff the result against the serialization reference shape — the change should touch the
same six files and nothing else.