<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Quick Start on Divekit</title><link>https://divekit.org/docs/1-quick-start/</link><description>Recent content in Quick Start on Divekit</description><generator>Hugo</generator><language>en</language><atom:link href="https://divekit.org/docs/1-quick-start/index.xml" rel="self" type="application/rss+xml"/><item><title>Hello there 👋</title><link>https://divekit.org/docs/1-quick-start/introduction/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://divekit.org/docs/1-quick-start/introduction/</guid><description>&lt;h2 id="what-is-divekit"&gt;What is Divekit?&lt;/h2&gt;&#10;&lt;p&gt;Divekit is a command-line tool for managing individualized programming assignments at scale. It helps educators create, distribute and evaluate programming exercises for large groups of students.&lt;/p&gt;&#10;&lt;h3 id="visual-overview-from-origin-to-distributed-repositories"&gt;Visual overview: from origin to distributed repositories&lt;/h3&gt;&#10;&lt;p&gt;Locally:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;my-assignment/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├─ .divekit/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├─ src/$Vehicle$.java # placeholder - used by individualization&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├─ tests_evalrepo/ # filter - excluded from work repos&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└─ README.md&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Gitlab: &amp;ldquo;Individualized repositories&amp;rdquo;:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gitlab.example.com/.../my-group/ # Work repositories (work target)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├─ my-assignment-4d2c0752-f400-4690-9bac-97c927e68e17/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├─ src/Car.java # $Vehicle$ → Car&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ └─ README.md&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├─ my-assignment-4d243142-292b-4b95-abbb-af13f102c857/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├─ src/Bike.java # $Vehicle$ → Bike&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ └─ README.md&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└─ my-assignment-8153ded6-ee91-4135-b59e-ace2625f83c3/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├─ src/Plane.java # $Vehicle$ → Plane&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └─ README.md&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Gitlab: &amp;ldquo;Evaluation pipeline&amp;rdquo; (separate eval target)&lt;/p&gt;</description></item><item><title>Installation</title><link>https://divekit.org/docs/1-quick-start/installation/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://divekit.org/docs/1-quick-start/installation/</guid><description>&lt;h2 id="prerequisites"&gt;Prerequisites&lt;/h2&gt;&#10;&lt;p&gt;Before installing Divekit, ensure your system meets the following requirements:&lt;/p&gt;&#10;&lt;h3 id="system-requirements"&gt;System Requirements&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Operating System&lt;/strong&gt;: Linux, macOS, or Windows&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;GitLab&lt;/strong&gt;: Access to a GitLab instance with API permissions&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="gitlab-setup"&gt;GitLab Setup&lt;/h3&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Access to a GitLab instance&lt;/li&gt;&#10;&lt;li&gt;An account that may create projects and manage members in the target group&lt;/li&gt;&#10;&lt;li&gt;A personal, project, or service-account access token with &lt;code&gt;api&lt;/code&gt; scope&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;The &lt;code&gt;api&lt;/code&gt; scope and the account&amp;rsquo;s GitLab role are independent. The token does&#10;not grant namespace permissions that its owner does not already have. A normal&#10;distribution does not require instance administrator access; the exact minimum&#10;group role depends on the group&amp;rsquo;s project-creation and member-management&#10;settings. See &lt;a href="https://divekit.org/docs/4-reference/gitlab-permissions/"&gt;GitLab Permissions&lt;/a&gt;&#10;before configuring evaluation pipelines, Pages, cleanup, or subgroup creation.&lt;/p&gt;</description></item><item><title>Example Origins</title><link>https://divekit.org/docs/1-quick-start/example-origins/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://divekit.org/docs/1-quick-start/example-origins/</guid><description>&lt;p&gt;Example origins are small assignment repositories that show how authored source files and Divekit&#10;configuration work together. Use this guide to choose a starting point, inspect the repository it&#10;generates, and identify which parts you must adapt before a real course rollout.&lt;/p&gt;&#10;&lt;p&gt;The source repositories live in the public&#10;&lt;a href="https://gitlab.git.nrw/divekit/documentation/example/origins"&gt;Divekit example origins group&lt;/a&gt;.&#10;They are not copied into this documentation site.&lt;/p&gt;&#10;&lt;h2 id="choose-an-example"&gt;Choose an example&lt;/h2&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Example&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Best for&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Demonstrates&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a href="https://gitlab.git.nrw/divekit/documentation/example/origins/vehicle-workshop-origin"&gt;Vehicle Workshop Origin&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Learning the smallest useful Divekit workflow&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;One individualization axis, local validation, and a work-repository distribution&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a href="https://gitlab.git.nrw/divekit/documentation/example/origins/shape-color-origin"&gt;Shape and Color Origin&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Comparing your result after the beginner course&amp;rsquo;s final exercise&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Two independent individualization axes and consistent replacement in one file&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a href="https://gitlab.git.nrw/divekit/documentation/example/origins/example-shop-origin"&gt;Example Shop Origin&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Exploring a more complete Maven assignment&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Multiple related individualizations, work and eval repositories, an Evaluation Pipeline, tests, and plugin configuration&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;Start with Vehicle Workshop when you want to understand the files in an origin repo and the effect of&#10;one placeholder. Use Shape and Color after completing the beginner course exercise and before moving&#10;to Example Shop&amp;rsquo;s paired work and eval setup.&lt;/p&gt;</description></item><item><title>First steps</title><link>https://divekit.org/docs/1-quick-start/first-steps/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://divekit.org/docs/1-quick-start/first-steps/</guid><description>&lt;h2 id="create-your-first-project"&gt;Create Your First Project&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Create and open a new directory:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir my-assignment&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; my-assignment&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="2"&gt;&#10;&lt;li&gt;Initialize Divekit:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;divekit init&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="what-divekit-init-does"&gt;What &lt;code&gt;divekit init&lt;/code&gt; does&lt;/h3&gt;&#10;&lt;p&gt;&lt;code&gt;divekit init&lt;/code&gt; creates the base configuration for an origin repository and prepares your project for distribution workflows.&lt;/p&gt;&#10;&lt;p&gt;Typical structure after init:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;my-assignment/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└── .divekit/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └── distributions/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └── &amp;lt;distribution&amp;gt;/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └── config.json&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;For command details, see &lt;a href="https://divekit.org/docs/2-divekit-cli/init/"&gt;&lt;code&gt;divekit init&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;variation.json&lt;/code&gt; and &lt;code&gt;individualization.json&lt;/code&gt; are optional and can be added at project level (&lt;code&gt;.divekit/&lt;/code&gt;) or distribution level (&lt;code&gt;.divekit/distributions/&amp;lt;distribution&amp;gt;/&lt;/code&gt;).&#10;To scaffold a starter variation config, use &lt;a href="https://divekit.org/docs/2-divekit-cli/inject/"&gt;&lt;code&gt;divekit inject --scope variation&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Individualization</title><link>https://divekit.org/docs/1-quick-start/individualization/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://divekit.org/docs/1-quick-start/individualization/</guid><description>&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;&#10;&lt;p&gt;Divekit individualizes repositories with three different files:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;variation.json&lt;/code&gt;: defines available object, relation, and logic variants.&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;individualization.json&lt;/code&gt; (optional): defines replacement behavior and processing rules.&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;individuals.json&lt;/code&gt; (generated): stores the concrete selection per UUID.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Important: per-member or per-group selection is &lt;strong&gt;not&lt;/strong&gt; configured via &lt;code&gt;individualization.json&lt;/code&gt; keys like &lt;code&gt;logicId&lt;/code&gt;, &lt;code&gt;objectAssignments&lt;/code&gt;, or &lt;code&gt;globalSettings&lt;/code&gt;. Those keys are outdated.&lt;/p&gt;&#10;&lt;h2 id="configuration-files"&gt;Configuration Files&lt;/h2&gt;&#10;&lt;h3 id="variationjson-input"&gt;&lt;code&gt;variation.json&lt;/code&gt; (input)&lt;/h3&gt;&#10;&lt;p&gt;Defines what can vary:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;objects&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;relations&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;logic&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Example:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;objects&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;ids&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Vehicle&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;objectVariations&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;car&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;class&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Car&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;variables&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;Vehicle&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Car&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;truck&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;class&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Truck&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;variables&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;Vehicle&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Truck&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;relations&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ownership&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;association&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;source&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Vehicle&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;target&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Owner&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;options&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;one-to-one&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;one-to-many&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;variables&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;logic&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;algorithm&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;implementation&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;location&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;src/logic&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;options&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;simple&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;complex&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;variables&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="individualizationjson-optional-input"&gt;&lt;code&gt;individualization.json&lt;/code&gt; (optional input)&lt;/h3&gt;&#10;&lt;p&gt;Defines processing behavior. Current top-level keys are:&lt;/p&gt;</description></item><item><title>Evaluation Pipeline</title><link>https://divekit.org/docs/1-quick-start/evaluation-pipeline/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://divekit.org/docs/1-quick-start/evaluation-pipeline/</guid><description>&lt;h2 id="what-it-is"&gt;What It Is&lt;/h2&gt;&#10;&lt;p&gt;Evaluation Pipeline is Divekit&amp;rsquo;s two-repository mode for a single assignment UUID:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;work&lt;/code&gt; repository: student-facing code repository&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;eval&lt;/code&gt; repository: evaluation repository&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;When enabled, distribution creates and links both repositories for each UUID.&lt;/p&gt;&#10;&lt;h2 id="what-it-does"&gt;What It Does&lt;/h2&gt;&#10;&lt;p&gt;For each UUID, Divekit:&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Creates the &lt;code&gt;work&lt;/code&gt; and &lt;code&gt;eval&lt;/code&gt; repositories (depending on your target/group layout).&lt;/li&gt;&#10;&lt;li&gt;Individualizes content per UUID (same UUID mapping across targets).&lt;/li&gt;&#10;&lt;li&gt;Injects evaluation-pipeline CI assets.&lt;/li&gt;&#10;&lt;li&gt;Links both repositories by setting cross-repository variables and tokens.&lt;/li&gt;&#10;&lt;li&gt;Configures trigger/job-token scope so pipelines can communicate.&lt;/li&gt;&#10;&lt;li&gt;Disables GitLab&amp;rsquo;s unique Pages domain setting on &lt;code&gt;eval&lt;/code&gt; repositories when the provider supports project-level Pages settings.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="runtime-flow"&gt;Runtime Flow&lt;/h2&gt;&#10;&lt;pre class="mermaid"&gt;flowchart LR&#10; A[&amp;#34;Student pushes to work repo&amp;#34;] --&amp;gt; B[&amp;#34;work .gitlab-ci.yml&amp;#34;]&#10; B --&amp;gt; C[&amp;#34;Trigger eval pipeline&amp;#34;]&#10; C --&amp;gt; D[&amp;#34;eval pipeline prepares test env&amp;#34;]&#10; D --&amp;gt; E[&amp;#34;eval runs build/tests/plugins&amp;#34;]&#10; E --&amp;gt; F[&amp;#34;reports/artifacts&amp;#34;]&lt;/pre&gt;&#10;&lt;h2 id="work-to-eval-materialization"&gt;Work-To-Eval Materialization&lt;/h2&gt;&#10;&lt;p&gt;Student edits happen in the &lt;code&gt;work&lt;/code&gt; repository, while tests and hidden evaluation material live in the &lt;code&gt;eval&lt;/code&gt; repository.&#10;The repositories are separate. Distribution creates their initial contents, but enabling Evaluation Pipeline does not define how later student changes replace or merge into the eval checkout.&#10;When the eval pipeline starts, Divekit runs its internal eval setup, fetches the current work repository state, and applies &lt;code&gt;.divekit/materialization.json&lt;/code&gt; in the eval repository.&lt;/p&gt;</description></item><item><title>Plugins</title><link>https://divekit.org/docs/1-quick-start/plugins/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://divekit.org/docs/1-quick-start/plugins/</guid><description>&lt;div class="pageinfo pageinfo-info"&gt;&#10;&lt;p&gt;This page documents the flat plugin model of pre-suite origins. New courses enable a&#10;&lt;a href="https://divekit.org/docs/1-quick-start/plugin-suites/"&gt;plugin suite&lt;/a&gt; instead; existing origins&#10;&lt;a href="https://divekit.org/docs/1-quick-start/plugin-migration/"&gt;migrate&lt;/a&gt; to it.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="what-plugins-do"&gt;What Plugins Do&lt;/h2&gt;&#10;&lt;p&gt;Evaluation Pipeline plugins add optional CI modules to eval repositories.&#10;Typical examples are PMD, Surefire, or JaCoCo/PIT analysis plugins.&lt;/p&gt;&#10;&lt;p&gt;Each plugin has two main controls:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;add&lt;/code&gt; (alias &lt;code&gt;use&lt;/code&gt;): choose the source or project, optionally pin a ref, and enable the plugin&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;enable&lt;/code&gt; or &lt;code&gt;disable&lt;/code&gt;: toggle whether the plugin runs after it has been configured&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Use &lt;code&gt;pin&lt;/code&gt; when you only want to change the Git ref for an already configured plugin.&lt;/p&gt;</description></item><item><title>Manual Feedback</title><link>https://divekit.org/docs/1-quick-start/manual-feedback/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://divekit.org/docs/1-quick-start/manual-feedback/</guid><description>&lt;p&gt;Manual feedback lets course staff add direct notes to generated evaluation reports without changing plugin output.&#10;It is meant for human feedback such as &amp;ldquo;try extracting this into a helper&amp;rdquo; or &amp;ldquo;this applies to everyone in this milestone&amp;rdquo;.&lt;/p&gt;&#10;&lt;p&gt;Unlike plugin feedback, manual feedback is authored in the origin repository and then patched into generated &lt;code&gt;eval&lt;/code&gt; repositories.&#10;The report renders it as a separate teaching-team thread, above generic plugin feedback.&lt;/p&gt;&#10;&lt;h2 id="author-feedback"&gt;Author Feedback&lt;/h2&gt;&#10;&lt;p&gt;Use the interactive command when selecting a distribution or members manually:&lt;/p&gt;</description></item><item><title>Plugin Suites</title><link>https://divekit.org/docs/1-quick-start/plugin-suites/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://divekit.org/docs/1-quick-start/plugin-suites/</guid><description>&lt;div class="pageinfo pageinfo-info"&gt;&#10;&lt;p&gt;Available from divekit v2.45.0; per-plugin wizards run from the suite since v2.47.0. Earlier releases use the flat plugin model documented in the command pages.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="what-a-suite-is"&gt;What A Suite Is&lt;/h2&gt;&#10;&lt;p&gt;A plugin suite bundles one build ecosystem and everything that analyzes its&#10;output. The &lt;code&gt;maven&lt;/code&gt; suite ships the build stage of the evaluation pipeline&#10;(the job and the container image that compiles a student project) together with&#10;the analysis plugins that run against that build: PMD, Surefire, JaCoCo/PIT.&#10;A &lt;code&gt;gradle&lt;/code&gt; suite does the same for Gradle projects, and the &lt;code&gt;custom&lt;/code&gt; suite is&#10;the generic fallback for courses that build something else.&lt;/p&gt;</description></item><item><title>Migrate To Plugin Suites</title><link>https://divekit.org/docs/1-quick-start/plugin-migration/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://divekit.org/docs/1-quick-start/plugin-migration/</guid><description>&lt;div class="pageinfo pageinfo-info"&gt;&#10;&lt;p&gt;Available from divekit v2.45.0; earlier releases use the flat plugin model documented in the command pages.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="who-needs-this"&gt;Who Needs This&lt;/h2&gt;&#10;&lt;p&gt;Origins that were set up before plugin suites list their plugins by a flat name&#10;such as &lt;code&gt;pmd&lt;/code&gt; or &lt;code&gt;jacoco-pit&lt;/code&gt;, without a suite in front of it. Those origins&#10;have to be converted once. An origin created with a current Divekit is already&#10;on the new model and needs nothing.&lt;/p&gt;</description></item><item><title>Distribution</title><link>https://divekit.org/docs/1-quick-start/distribution/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://divekit.org/docs/1-quick-start/distribution/</guid><description>&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;divekit distribute&lt;/code&gt; creates individualized repositories from an existing distribution config.&#10;In a typical run it:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;reads &lt;code&gt;.divekit/distributions/&amp;lt;name&amp;gt;/config.json&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;creates repositories in the configured target group(s)&lt;/li&gt;&#10;&lt;li&gt;individualizes content for each UUID&lt;/li&gt;&#10;&lt;li&gt;assigns members and permissions&lt;/li&gt;&#10;&lt;li&gt;writes state files: &lt;code&gt;remotes.json&lt;/code&gt; and &lt;code&gt;individuals.json&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;If the evaluation pipeline is enabled, Divekit also creates the linked eval repositories.&lt;/p&gt;&#10;&lt;h2 id="prerequisites"&gt;Prerequisites&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;divekit init&lt;/code&gt; is a one-time setup step and does not need to be repeated before every distribution.&lt;/p&gt;</description></item><item><title>Member Aliases</title><link>https://divekit.org/docs/1-quick-start/member-aliases/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://divekit.org/docs/1-quick-start/member-aliases/</guid><description>&lt;p&gt;Member aliases are useful when a local members file contains course-internal names, but the corresponding GitLab accounts use different usernames.&lt;/p&gt;&#10;&lt;p&gt;Keep GitLab usernames in &lt;code&gt;groups[].members&lt;/code&gt;. Divekit uses those values for GitLab access, repository membership, &lt;code&gt;distribute&lt;/code&gt;, &lt;code&gt;patch&lt;/code&gt;, &lt;code&gt;members list&lt;/code&gt;, &lt;code&gt;overview&lt;/code&gt;, and the GUI. The optional &lt;code&gt;displayNames&lt;/code&gt; map only controls how those members are shown locally.&lt;/p&gt;&#10;&lt;h2 id="set-an-alias"&gt;Set an Alias&lt;/h2&gt;&#10;&lt;p&gt;If a member currently appears as &lt;code&gt;myname&lt;/code&gt; in &lt;code&gt;members.json&lt;/code&gt;, but the GitLab username is &lt;code&gt;myname_extern&lt;/code&gt;, set the alias before rerunning distribution:&lt;/p&gt;</description></item><item><title>Run Extensions</title><link>https://divekit.org/docs/1-quick-start/run-extensions/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://divekit.org/docs/1-quick-start/run-extensions/</guid><description>&lt;p&gt;&lt;code&gt;divekit run&lt;/code&gt; executes local extensions against repositories from a distribution. Typical uses are static analysis, report extraction, custom checks, or orchestration around external tools.&lt;/p&gt;&#10;&lt;p&gt;Before running an extension, make repositories available locally:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;divekit fetch -d ST2M4&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then run an extension from &lt;code&gt;.divekit/scripts/run/&lt;/code&gt; or by path:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;divekit run analyze.lua -d ST2M4&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;divekit run ./scripts/analyze.py -d ST2M4&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Use &lt;code&gt;--fetch-first&lt;/code&gt; when Divekit should fetch before executing:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;divekit run analyze.lua -d ST2M4 --fetch-first&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="simple-lua-extensions"&gt;Simple Lua Extensions&lt;/h2&gt;&#10;&lt;p&gt;A simple Lua extension returns a function. Divekit calls that function once for every selected repository.&lt;/p&gt;</description></item><item><title>Safe Rollout Checklist</title><link>https://divekit.org/docs/1-quick-start/safe-rollout/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://divekit.org/docs/1-quick-start/safe-rollout/</guid><description>&lt;p&gt;Use this checklist before the first rollout to a real cohort and before a later&#10;&lt;code&gt;patch&lt;/code&gt; that sends new content to student repositories. After completing it,&#10;you should have private repositories for the intended students, with only the&#10;required access and without an accidental copy of the cohort member list.&lt;/p&gt;&#10;&lt;h2 id="before-distribution"&gt;Before distribution&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; Confirm that &lt;code&gt;groupId&lt;/code&gt; and any evaluation target point to the intended&#10;GitLab groups. Use a separate non-production group for the rehearsal.&lt;/li&gt;&#10;&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; Run the complete workflow once with a small members file containing only&#10;synthetic test accounts controlled by the course team. The &lt;code&gt;--count&lt;/code&gt; option&#10;does not assign users, so it does not test access control.&lt;/li&gt;&#10;&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; Confirm that the target namespace permits private projects. For any&#10;existing or reused project, check its effective project visibility in GitLab.&#10;A private project inside a public group remains private, so inspect the&#10;project rather than inferring its visibility from the parent group.&lt;/li&gt;&#10;&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; Store the real members file outside the origin repo. Check that it&#10;is not tracked by Git and is not among the files that distribution can copy.&#10;&lt;code&gt;DIVEKIT_MEMBERS&lt;/code&gt; can point Divekit at a dedicated members directory outside&#10;the origin repo.&lt;/li&gt;&#10;&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; Authenticate with &lt;a href="https://divekit.org/docs/2-divekit-cli/auth/"&gt;&lt;code&gt;divekit auth&lt;/code&gt;&lt;/a&gt;. Keep tokens out of the origin repo,&#10;committed configuration, shell history, and ordinary environment files.&#10;Prefer Divekit&amp;rsquo;s credential-store integration or a protected CI secret. Grant&#10;the token owner only the &lt;a href="https://divekit.org/docs/4-reference/gitlab-permissions/"&gt;GitLab permissions&lt;/a&gt; required for this rollout.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;The relevant distribution settings are described in the&#10;&lt;a href="https://divekit.org/docs/4-reference/file-formats/config-json/"&gt;&lt;code&gt;config.json&lt;/code&gt; reference&lt;/a&gt;. GitLab documents how&#10;&lt;a href="https://docs.gitlab.com/user/public_access/"&gt;project visibility&lt;/a&gt; affects who&#10;can see repository content.&lt;/p&gt;</description></item></channel></rss>