archi-cli 0.2.2__tar.gz → 0.3.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,19 @@
1
+ # Archi-backups en afgeleide artefacten
2
+ *.bak
3
+ output/
4
+ *.xml
5
+ *.svg
6
+ *.png
7
+ # behalve de schermafbeeldingen voor de README
8
+ !docs/img/*.png
9
+
10
+ # Python
11
+ __pycache__/
12
+ *.py[cod]
13
+ .venv/
14
+ .pytest_cache/
15
+ .ruff_cache/
16
+ dist/
17
+
18
+ # macOS
19
+ .DS_Store
archi_cli-0.3.0/NOTICE ADDED
@@ -0,0 +1,24 @@
1
+ archi-cli
2
+ Copyright (c) 2026 Nederlandse Digitale Dienst
3
+ Licensed under the EUPL-1.2 (see LICENSE).
4
+
5
+ This tool downloads and drives the Archi engine for its `normalize` command.
6
+ Archi is a separate work and is not distributed as part of this package; it is
7
+ fetched at runtime from the official release on first use.
8
+
9
+ Archi, the ArchiMate modelling tool
10
+ Copyright (c) Phillip Beauvoir, Jean-Baptiste Sarrodie and contributors
11
+ Licensed under the MIT License
12
+ https://github.com/archimatetool/archi
13
+
14
+ The Archi distribution bundles an OpenJDK runtime; its own licensing applies to
15
+ that runtime.
16
+
17
+ The HTML views and slide decks load the NLDD Design System
18
+ (@nldd/design-system) from a CDN at view time. Its fonts (RijksSans) are
19
+ intended for publications by and on behalf of the Dutch central government;
20
+ see the design system's NOTICES.md for the conditions.
21
+
22
+ ArchiMate is a registered trademark of The Open Group. archi-cli is an
23
+ independent project and is not affiliated with or endorsed by The Open Group
24
+ or the Archi project.
@@ -0,0 +1,228 @@
1
+ Metadata-Version: 2.5
2
+ Name: archi-cli
3
+ Version: 0.3.0
4
+ Summary: Deterministische command line tool om native Archi-modellen (.archimate) te inspecteren, muteren, valideren en renderen
5
+ Project-URL: Homepage, https://github.com/BureauArchitectuurDigitaleOverheid/ai-assisted-architecting
6
+ Project-URL: Repository, https://github.com/BureauArchitectuurDigitaleOverheid/ai-assisted-architecting
7
+ Project-URL: Issues, https://github.com/BureauArchitectuurDigitaleOverheid/ai-assisted-architecting/issues
8
+ Project-URL: Changelog, https://github.com/BureauArchitectuurDigitaleOverheid/ai-assisted-architecting/blob/main/CHANGELOG.md
9
+ Author: Nederlandse Digitale Dienst
10
+ License-Expression: EUPL-1.2
11
+ License-File: LICENSE
12
+ Keywords: archi,archimate,architecture-as-code,cli,enterprise-architecture,modeling
13
+ Classifier: Development Status :: 4 - Beta
14
+ Classifier: Environment :: Console
15
+ Classifier: Intended Audience :: Developers
16
+ Classifier: Intended Audience :: Information Technology
17
+ Classifier: Natural Language :: Dutch
18
+ Classifier: Operating System :: OS Independent
19
+ Classifier: Programming Language :: Python :: 3
20
+ Classifier: Programming Language :: Python :: 3.12
21
+ Classifier: Programming Language :: Python :: 3.13
22
+ Classifier: Programming Language :: Python :: 3.14
23
+ Classifier: Topic :: Software Development :: Documentation
24
+ Requires-Python: >=3.12
25
+ Requires-Dist: lxml>=6.1.3
26
+ Requires-Dist: typer>=0.26
27
+ Description-Content-Type: text/markdown
28
+
29
+ # archi-cli
30
+
31
+ [![checks](https://github.com/BureauArchitectuurDigitaleOverheid/ai-assisted-architecting/actions/workflows/ci.yml/badge.svg)](https://github.com/BureauArchitectuurDigitaleOverheid/ai-assisted-architecting/actions/workflows/ci.yml)
32
+ [![PyPI](https://img.shields.io/pypi/v/archi-cli.svg)](https://pypi.org/project/archi-cli/)
33
+ [![Python](https://img.shields.io/pypi/pyversions/archi-cli.svg)](https://pypi.org/project/archi-cli/)
34
+ [![licentie: EUPL-1.2](https://img.shields.io/badge/licentie-EUPL--1.2-blue.svg)](https://github.com/BureauArchitectuurDigitaleOverheid/ai-assisted-architecting/blob/main/LICENSE)
35
+
36
+ Houd je ArchiMate-model bij zoals code. `archi-cli` is een command line tool
37
+ voor native [Archi](https://www.archimatetool.com/)-modellen: je bekijkt,
38
+ wijzigt en controleert een `.archimate`-bestand vanuit de terminal, en
39
+ genereert er views, webpagina's en presentaties uit. Elke wijziging wordt
40
+ gevalideerd voordat hij wordt opgeslagen, zodat het model nooit kapot raakt.
41
+ Dat maakt de tool geschikt om samen met een AI-assistent aan een model te
42
+ werken, met git als geheugen.
43
+
44
+ ![Een gegenereerde presentatie die inzoomt op één capability](https://raw.githubusercontent.com/BureauArchitectuurDigitaleOverheid/ai-assisted-architecting/main/docs/img/slide-focus.png)
45
+
46
+ *Een slide uit het meegeleverde voorbeeld: de camera zoomt in op één
47
+ element en dimt de rest. Gegenereerd uit het model, zonder handwerk.*
48
+
49
+ ## Wat het is, en wat niet
50
+
51
+ **Wel:**
52
+
53
+ - Een **command line tool** die het native Archi-formaat leest en schrijft. Het
54
+ bestand blijft gewoon te openen en te bewerken in Archi.
55
+ - Een **vangnet**. Elke mutatie wordt eerst in het geheugen gevalideerd; bij een
56
+ fout weigert de tool op te slaan. Ids blijven onveranderd.
57
+ - **Deterministisch.** Dezelfde invoer geeft dezelfde uitvoer, zodat diffs klein
58
+ blijven en je de uitvoer in CI kunt controleren.
59
+ - Een set **skills voor Claude Code** die beschrijven hoe een AI-assistent via
60
+ deze tool aan een model werkt.
61
+
62
+ **Niet:**
63
+
64
+ - **Geen vervanging van Archi.** Vrij modelleren op het canvas en de layout van
65
+ een view fijnslijpen doe je in Archi. De tool en Archi werken op hetzelfde
66
+ bestand en vullen elkaar aan.
67
+ - **Geen ArchiMate-validator.** `archi validate` controleert de integriteit van
68
+ het bestand en je eigen conventies, niet of een relatie volgens de
69
+ ArchiMate-specificatie is toegestaan.
70
+ - **Geen AI.** De tool zelf bevat geen AI en stuurt je model nergens heen. Alleen
71
+ het eenmalig ophalen van de Archi-engine gebruikt het netwerk.
72
+ - **Geen officieel product of standaard.** Het is open source software in de
73
+ bètafase, zonder garanties of ondersteuningsafspraken.
74
+
75
+ ## Snel aan de slag
76
+
77
+ Je hebt [uv](https://docs.astral.sh/uv/) nodig; uv regelt zelf een passende
78
+ Python (3.12 of nieuwer).
79
+
80
+ ```bash
81
+ uv tool install archi-cli
82
+ archi --version
83
+ ```
84
+
85
+ Probeer het op het meegeleverde voorbeeld, een fictief model van een gemeente
86
+ die vergunningen verleent:
87
+
88
+ ```bash
89
+ git clone https://github.com/BureauArchitectuurDigitaleOverheid/ai-assisted-architecting.git
90
+ cd ai-assisted-architecting/examples/vergunningverlening
91
+ archi stats # wat zit er in het model
92
+ archi show "Toetsen aan regels" # één element met zijn relaties
93
+ archi render # views en slides naar views/
94
+ ```
95
+
96
+ Open daarna `views/html/index.html` in je browser. De Mermaid-versies van de
97
+ views staan [hier op GitHub](https://github.com/BureauArchitectuurDigitaleOverheid/ai-assisted-architecting/blob/main/examples/vergunningverlening/views/README.md) al
98
+ gerenderd.
99
+
100
+ Voor je eigen model: draai `archi` in de map met je `.archimate`-bestand, of
101
+ leg het vast in een `archi.toml` (zie [Configuratie](#configuratie)).
102
+
103
+ ## Wat je ermee kunt
104
+
105
+ | Taak | Commando's |
106
+ | --- | --- |
107
+ | Inspecteren | `stats`, `list`, `show`, `tree` |
108
+ | Wijzigen | `add-element`, `add-relation`, `set-property`, `remove-property`, `set-documentation`, `rename`, `move`, `remove`, `set-model-name` |
109
+ | Views genereren | `add-view` met grid- of clusterlayout, geselecteerd op type, property, relatie of vanuit één element |
110
+ | Controleren | `validate` |
111
+ | Normaliseren | `normalize` |
112
+ | Publiceren | `render` (views) en `slides` (presentaties) |
113
+
114
+ `archi <commando> --help` toont alle opties. Een paar voorbeelden:
115
+
116
+ ```bash
117
+ archi add-element --type Capability --name "Toezicht" --documentation "Naleving controleren."
118
+ archi add-relation --type Aggregation --source "Vergunningverlening" --target "Toezicht"
119
+ archi move "Toezicht" --subfolder "Gebied handhaving" --create-subfolder
120
+ archi add-view --name "Capabilities" --layout cluster --type Capability
121
+ archi remove "Toezicht" --cascade # ook relaties en view-objecten
122
+ ```
123
+
124
+ **Controleren.** `archi validate` vindt onder meer dubbele ids, relaties naar
125
+ elementen die niet bestaan, elementen in de verkeerde laagmap, kapotte views en
126
+ property-keys die niet in je conventielijst staan. Mutaties draaien dezelfde
127
+ controles automatisch.
128
+
129
+ **Normaliseren.** `archi normalize` laat Archi zelf het bestand opnieuw wegschrijven,
130
+ in zijn eigen canonieke vorm. Zo blijven git-diffs klein, of een wijziging nu
131
+ uit de tool of uit Archi komt. De Archi-engine haalt de tool bij het eerste
132
+ gebruik zelf op en controleert de download.
133
+
134
+ **Publiceren.** `archi render` zet elke view om naar Mermaid (dat GitHub direct
135
+ toont) en naar een webpagina met de layout en de ArchiMate-notatie uit het
136
+ model, gestileerd met het [NLDD Design System](https://github.com/NederlandseDigitaleDienst/design-system).
137
+ Een indexpagina toont alle views met een miniatuur.
138
+
139
+ ![Een gegenereerde view met de layout uit het model](https://raw.githubusercontent.com/BureauArchitectuurDigitaleOverheid/ai-assisted-architecting/main/docs/img/view-dienst-platform.png)
140
+
141
+ **Presenteren.** Een deck in `decks/*.toml` beschrijft een lineair verhaal met
142
+ views uit het model, afgewisseld met tekst. `archi slides` maakt er een
143
+ zelfstandige HTML-presentatie van, met zoom-op-een-element, sprekersnotities en
144
+ volledig scherm. Zie [het voorbeelddeck](https://github.com/BureauArchitectuurDigitaleOverheid/ai-assisted-architecting/blob/main/examples/vergunningverlening/decks/rondleiding.toml).
145
+
146
+ **Doorklikken.** Met een links-bestand worden elementen in de webpagina's
147
+ klikbaar naar een andere view of een ander bestand, bijvoorbeeld een diagram
148
+ dat je met eigen scripts maakt. Zie [ADR 0010](https://github.com/BureauArchitectuurDigitaleOverheid/ai-assisted-architecting/blob/main/adr/0010-doorklikken-via-links-bestand.md).
149
+
150
+ ![De indexpagina met alle views](https://raw.githubusercontent.com/BureauArchitectuurDigitaleOverheid/ai-assisted-architecting/main/docs/img/views-index.png)
151
+
152
+ ## Configuratie
153
+
154
+ De tool zoekt het model in deze volgorde: de optie `--model <pad>` (vóór het
155
+ subcommando), de sleutel `model` in een `archi.toml` (in de werkmap of een map
156
+ erboven), of het enige `.archimate`-bestand in de werkmap.
157
+
158
+ ```toml
159
+ # archi.toml
160
+ [tool.archi]
161
+ model = "model/architectuur.archimate"
162
+ conventions = "docs/conventies.md" # toegestane property-keys
163
+ links = "links.toml" # doorkliks in de webpagina's
164
+ fonts = "system" # of "rijkssans", zie hieronder
165
+ ```
166
+
167
+ Alle sleutels zijn optioneel. Dezelfde tabel mag ook in een `pyproject.toml`.
168
+
169
+ **Lettertype.** De webpagina's gebruiken standaard het systeemlettertype.
170
+ RijksSans is uitsluitend bedoeld voor publicaties van de Rijksoverheid en
171
+ partijen die in haar opdracht werken; valt jouw publicatie daaronder, zet dan
172
+ `fonts = "rijkssans"`.
173
+
174
+ ## Werken met een AI-assistent
175
+
176
+ De skills `archi-model`, `archi-view` en `archi-slides` leren een AI-assistent
177
+ hoe hij via deze tool aan een model werkt: welke commando's, in welke
178
+ volgorde, en wanneer hij moet valideren en normaliseren. Installeer ze in
179
+ Claude Code als plugin:
180
+
181
+ ```
182
+ /plugin marketplace add BureauArchitectuurDigitaleOverheid/ai-assisted-architecting
183
+ /plugin install archi-tools@archi-marketplace
184
+ ```
185
+
186
+ De plugin brengt alleen de skills mee; het commando `archi` installeer je met
187
+ uv, zoals hierboven. De tool garandeert dat het model technisch klopt, niet dat
188
+ de architectuur klopt. Lees wijzigingen van een assistent na zoals je een pull
189
+ request van een collega naleest.
190
+
191
+ ## Grenzen en bekende beperkingen
192
+
193
+ - **Alleen het native Archi-formaat** (`.archimate`). Het Open Group
194
+ Exchange-formaat wordt niet gelezen of geschreven.
195
+ - **`normalize` heeft de Archi-engine nodig** (ongeveer 165 MB, eenmalig).
196
+ Archi levert die voor macOS (Intel en Apple Silicon) en voor 64-bit x86 op
197
+ Linux en Windows. Op andere platforms installeer je Archi zelf en wijs je hem
198
+ aan met de omgevingsvariabele `ARCHI_APP`. Alle andere commando's werken
199
+ zonder Archi.
200
+ - **Automatische layout is een startpunt.** `add-view` plaatst elementen in een
201
+ raster of in clusters; bij grotere views schuif je in Archi nog wat bij.
202
+ - **Niet alles wordt gerenderd.** Sketch- en canvasviews, afbeeldingen en eigen
203
+ kleuren en lettertypes uit Archi komen niet in de webpagina's.
204
+ - **De webpagina's laden het design system van een CDN** en hebben dus internet
205
+ nodig om goed te tonen.
206
+ - **Uitvoer en meldingen zijn Nederlandstalig.**
207
+
208
+ ## Disclaimer
209
+
210
+ Deze software wordt geleverd zoals hij is, zonder enige garantie; zie de
211
+ artikelen 7 en 8 van de [EUPL-1.2](https://github.com/BureauArchitectuurDigitaleOverheid/ai-assisted-architecting/blob/main/LICENSE). De tool is in bètafase: tot versie
212
+ 1.0 kunnen commando's en uitvoer nog veranderen. Elke wijziging die je moet
213
+ weten staat in de [changelog](https://github.com/BureauArchitectuurDigitaleOverheid/ai-assisted-architecting/blob/main/CHANGELOG.md).
214
+
215
+ ArchiMate is een geregistreerd handelsmerk van The Open Group. Dit project is
216
+ onafhankelijk en niet verbonden aan The Open Group of het Archi-project.
217
+
218
+ ## Meedoen
219
+
220
+ Bijdragen zijn welkom: lees [CONTRIBUTING.md](https://github.com/BureauArchitectuurDigitaleOverheid/ai-assisted-architecting/blob/main/CONTRIBUTING.md) voor de
221
+ werkwijze en de [gedragscode](https://github.com/BureauArchitectuurDigitaleOverheid/ai-assisted-architecting/blob/main/CODE_OF_CONDUCT.md). Een beveiligingsprobleem meld
222
+ je volgens [SECURITY.md](https://github.com/BureauArchitectuurDigitaleOverheid/ai-assisted-architecting/blob/main/SECURITY.md), niet in een openbaar issue.
223
+ Beslissingen over de opzet van de tool staan als ADR's in [`adr/`](https://github.com/BureauArchitectuurDigitaleOverheid/ai-assisted-architecting/tree/main/adr/).
224
+
225
+ ## Licentie
226
+
227
+ [EUPL-1.2](https://github.com/BureauArchitectuurDigitaleOverheid/ai-assisted-architecting/blob/main/LICENSE). Ontwikkeld door de Nederlandse Digitale Dienst. Archi
228
+ zelf valt onder de MIT-licentie; zie [NOTICE](https://github.com/BureauArchitectuurDigitaleOverheid/ai-assisted-architecting/blob/main/NOTICE).
@@ -0,0 +1,200 @@
1
+ # archi-cli
2
+
3
+ [![checks](https://github.com/BureauArchitectuurDigitaleOverheid/ai-assisted-architecting/actions/workflows/ci.yml/badge.svg)](https://github.com/BureauArchitectuurDigitaleOverheid/ai-assisted-architecting/actions/workflows/ci.yml)
4
+ [![PyPI](https://img.shields.io/pypi/v/archi-cli.svg)](https://pypi.org/project/archi-cli/)
5
+ [![Python](https://img.shields.io/pypi/pyversions/archi-cli.svg)](https://pypi.org/project/archi-cli/)
6
+ [![licentie: EUPL-1.2](https://img.shields.io/badge/licentie-EUPL--1.2-blue.svg)](https://github.com/BureauArchitectuurDigitaleOverheid/ai-assisted-architecting/blob/main/LICENSE)
7
+
8
+ Houd je ArchiMate-model bij zoals code. `archi-cli` is een command line tool
9
+ voor native [Archi](https://www.archimatetool.com/)-modellen: je bekijkt,
10
+ wijzigt en controleert een `.archimate`-bestand vanuit de terminal, en
11
+ genereert er views, webpagina's en presentaties uit. Elke wijziging wordt
12
+ gevalideerd voordat hij wordt opgeslagen, zodat het model nooit kapot raakt.
13
+ Dat maakt de tool geschikt om samen met een AI-assistent aan een model te
14
+ werken, met git als geheugen.
15
+
16
+ ![Een gegenereerde presentatie die inzoomt op één capability](https://raw.githubusercontent.com/BureauArchitectuurDigitaleOverheid/ai-assisted-architecting/main/docs/img/slide-focus.png)
17
+
18
+ *Een slide uit het meegeleverde voorbeeld: de camera zoomt in op één
19
+ element en dimt de rest. Gegenereerd uit het model, zonder handwerk.*
20
+
21
+ ## Wat het is, en wat niet
22
+
23
+ **Wel:**
24
+
25
+ - Een **command line tool** die het native Archi-formaat leest en schrijft. Het
26
+ bestand blijft gewoon te openen en te bewerken in Archi.
27
+ - Een **vangnet**. Elke mutatie wordt eerst in het geheugen gevalideerd; bij een
28
+ fout weigert de tool op te slaan. Ids blijven onveranderd.
29
+ - **Deterministisch.** Dezelfde invoer geeft dezelfde uitvoer, zodat diffs klein
30
+ blijven en je de uitvoer in CI kunt controleren.
31
+ - Een set **skills voor Claude Code** die beschrijven hoe een AI-assistent via
32
+ deze tool aan een model werkt.
33
+
34
+ **Niet:**
35
+
36
+ - **Geen vervanging van Archi.** Vrij modelleren op het canvas en de layout van
37
+ een view fijnslijpen doe je in Archi. De tool en Archi werken op hetzelfde
38
+ bestand en vullen elkaar aan.
39
+ - **Geen ArchiMate-validator.** `archi validate` controleert de integriteit van
40
+ het bestand en je eigen conventies, niet of een relatie volgens de
41
+ ArchiMate-specificatie is toegestaan.
42
+ - **Geen AI.** De tool zelf bevat geen AI en stuurt je model nergens heen. Alleen
43
+ het eenmalig ophalen van de Archi-engine gebruikt het netwerk.
44
+ - **Geen officieel product of standaard.** Het is open source software in de
45
+ bètafase, zonder garanties of ondersteuningsafspraken.
46
+
47
+ ## Snel aan de slag
48
+
49
+ Je hebt [uv](https://docs.astral.sh/uv/) nodig; uv regelt zelf een passende
50
+ Python (3.12 of nieuwer).
51
+
52
+ ```bash
53
+ uv tool install archi-cli
54
+ archi --version
55
+ ```
56
+
57
+ Probeer het op het meegeleverde voorbeeld, een fictief model van een gemeente
58
+ die vergunningen verleent:
59
+
60
+ ```bash
61
+ git clone https://github.com/BureauArchitectuurDigitaleOverheid/ai-assisted-architecting.git
62
+ cd ai-assisted-architecting/examples/vergunningverlening
63
+ archi stats # wat zit er in het model
64
+ archi show "Toetsen aan regels" # één element met zijn relaties
65
+ archi render # views en slides naar views/
66
+ ```
67
+
68
+ Open daarna `views/html/index.html` in je browser. De Mermaid-versies van de
69
+ views staan [hier op GitHub](https://github.com/BureauArchitectuurDigitaleOverheid/ai-assisted-architecting/blob/main/examples/vergunningverlening/views/README.md) al
70
+ gerenderd.
71
+
72
+ Voor je eigen model: draai `archi` in de map met je `.archimate`-bestand, of
73
+ leg het vast in een `archi.toml` (zie [Configuratie](#configuratie)).
74
+
75
+ ## Wat je ermee kunt
76
+
77
+ | Taak | Commando's |
78
+ | --- | --- |
79
+ | Inspecteren | `stats`, `list`, `show`, `tree` |
80
+ | Wijzigen | `add-element`, `add-relation`, `set-property`, `remove-property`, `set-documentation`, `rename`, `move`, `remove`, `set-model-name` |
81
+ | Views genereren | `add-view` met grid- of clusterlayout, geselecteerd op type, property, relatie of vanuit één element |
82
+ | Controleren | `validate` |
83
+ | Normaliseren | `normalize` |
84
+ | Publiceren | `render` (views) en `slides` (presentaties) |
85
+
86
+ `archi <commando> --help` toont alle opties. Een paar voorbeelden:
87
+
88
+ ```bash
89
+ archi add-element --type Capability --name "Toezicht" --documentation "Naleving controleren."
90
+ archi add-relation --type Aggregation --source "Vergunningverlening" --target "Toezicht"
91
+ archi move "Toezicht" --subfolder "Gebied handhaving" --create-subfolder
92
+ archi add-view --name "Capabilities" --layout cluster --type Capability
93
+ archi remove "Toezicht" --cascade # ook relaties en view-objecten
94
+ ```
95
+
96
+ **Controleren.** `archi validate` vindt onder meer dubbele ids, relaties naar
97
+ elementen die niet bestaan, elementen in de verkeerde laagmap, kapotte views en
98
+ property-keys die niet in je conventielijst staan. Mutaties draaien dezelfde
99
+ controles automatisch.
100
+
101
+ **Normaliseren.** `archi normalize` laat Archi zelf het bestand opnieuw wegschrijven,
102
+ in zijn eigen canonieke vorm. Zo blijven git-diffs klein, of een wijziging nu
103
+ uit de tool of uit Archi komt. De Archi-engine haalt de tool bij het eerste
104
+ gebruik zelf op en controleert de download.
105
+
106
+ **Publiceren.** `archi render` zet elke view om naar Mermaid (dat GitHub direct
107
+ toont) en naar een webpagina met de layout en de ArchiMate-notatie uit het
108
+ model, gestileerd met het [NLDD Design System](https://github.com/NederlandseDigitaleDienst/design-system).
109
+ Een indexpagina toont alle views met een miniatuur.
110
+
111
+ ![Een gegenereerde view met de layout uit het model](https://raw.githubusercontent.com/BureauArchitectuurDigitaleOverheid/ai-assisted-architecting/main/docs/img/view-dienst-platform.png)
112
+
113
+ **Presenteren.** Een deck in `decks/*.toml` beschrijft een lineair verhaal met
114
+ views uit het model, afgewisseld met tekst. `archi slides` maakt er een
115
+ zelfstandige HTML-presentatie van, met zoom-op-een-element, sprekersnotities en
116
+ volledig scherm. Zie [het voorbeelddeck](https://github.com/BureauArchitectuurDigitaleOverheid/ai-assisted-architecting/blob/main/examples/vergunningverlening/decks/rondleiding.toml).
117
+
118
+ **Doorklikken.** Met een links-bestand worden elementen in de webpagina's
119
+ klikbaar naar een andere view of een ander bestand, bijvoorbeeld een diagram
120
+ dat je met eigen scripts maakt. Zie [ADR 0010](https://github.com/BureauArchitectuurDigitaleOverheid/ai-assisted-architecting/blob/main/adr/0010-doorklikken-via-links-bestand.md).
121
+
122
+ ![De indexpagina met alle views](https://raw.githubusercontent.com/BureauArchitectuurDigitaleOverheid/ai-assisted-architecting/main/docs/img/views-index.png)
123
+
124
+ ## Configuratie
125
+
126
+ De tool zoekt het model in deze volgorde: de optie `--model <pad>` (vóór het
127
+ subcommando), de sleutel `model` in een `archi.toml` (in de werkmap of een map
128
+ erboven), of het enige `.archimate`-bestand in de werkmap.
129
+
130
+ ```toml
131
+ # archi.toml
132
+ [tool.archi]
133
+ model = "model/architectuur.archimate"
134
+ conventions = "docs/conventies.md" # toegestane property-keys
135
+ links = "links.toml" # doorkliks in de webpagina's
136
+ fonts = "system" # of "rijkssans", zie hieronder
137
+ ```
138
+
139
+ Alle sleutels zijn optioneel. Dezelfde tabel mag ook in een `pyproject.toml`.
140
+
141
+ **Lettertype.** De webpagina's gebruiken standaard het systeemlettertype.
142
+ RijksSans is uitsluitend bedoeld voor publicaties van de Rijksoverheid en
143
+ partijen die in haar opdracht werken; valt jouw publicatie daaronder, zet dan
144
+ `fonts = "rijkssans"`.
145
+
146
+ ## Werken met een AI-assistent
147
+
148
+ De skills `archi-model`, `archi-view` en `archi-slides` leren een AI-assistent
149
+ hoe hij via deze tool aan een model werkt: welke commando's, in welke
150
+ volgorde, en wanneer hij moet valideren en normaliseren. Installeer ze in
151
+ Claude Code als plugin:
152
+
153
+ ```
154
+ /plugin marketplace add BureauArchitectuurDigitaleOverheid/ai-assisted-architecting
155
+ /plugin install archi-tools@archi-marketplace
156
+ ```
157
+
158
+ De plugin brengt alleen de skills mee; het commando `archi` installeer je met
159
+ uv, zoals hierboven. De tool garandeert dat het model technisch klopt, niet dat
160
+ de architectuur klopt. Lees wijzigingen van een assistent na zoals je een pull
161
+ request van een collega naleest.
162
+
163
+ ## Grenzen en bekende beperkingen
164
+
165
+ - **Alleen het native Archi-formaat** (`.archimate`). Het Open Group
166
+ Exchange-formaat wordt niet gelezen of geschreven.
167
+ - **`normalize` heeft de Archi-engine nodig** (ongeveer 165 MB, eenmalig).
168
+ Archi levert die voor macOS (Intel en Apple Silicon) en voor 64-bit x86 op
169
+ Linux en Windows. Op andere platforms installeer je Archi zelf en wijs je hem
170
+ aan met de omgevingsvariabele `ARCHI_APP`. Alle andere commando's werken
171
+ zonder Archi.
172
+ - **Automatische layout is een startpunt.** `add-view` plaatst elementen in een
173
+ raster of in clusters; bij grotere views schuif je in Archi nog wat bij.
174
+ - **Niet alles wordt gerenderd.** Sketch- en canvasviews, afbeeldingen en eigen
175
+ kleuren en lettertypes uit Archi komen niet in de webpagina's.
176
+ - **De webpagina's laden het design system van een CDN** en hebben dus internet
177
+ nodig om goed te tonen.
178
+ - **Uitvoer en meldingen zijn Nederlandstalig.**
179
+
180
+ ## Disclaimer
181
+
182
+ Deze software wordt geleverd zoals hij is, zonder enige garantie; zie de
183
+ artikelen 7 en 8 van de [EUPL-1.2](https://github.com/BureauArchitectuurDigitaleOverheid/ai-assisted-architecting/blob/main/LICENSE). De tool is in bètafase: tot versie
184
+ 1.0 kunnen commando's en uitvoer nog veranderen. Elke wijziging die je moet
185
+ weten staat in de [changelog](https://github.com/BureauArchitectuurDigitaleOverheid/ai-assisted-architecting/blob/main/CHANGELOG.md).
186
+
187
+ ArchiMate is een geregistreerd handelsmerk van The Open Group. Dit project is
188
+ onafhankelijk en niet verbonden aan The Open Group of het Archi-project.
189
+
190
+ ## Meedoen
191
+
192
+ Bijdragen zijn welkom: lees [CONTRIBUTING.md](https://github.com/BureauArchitectuurDigitaleOverheid/ai-assisted-architecting/blob/main/CONTRIBUTING.md) voor de
193
+ werkwijze en de [gedragscode](https://github.com/BureauArchitectuurDigitaleOverheid/ai-assisted-architecting/blob/main/CODE_OF_CONDUCT.md). Een beveiligingsprobleem meld
194
+ je volgens [SECURITY.md](https://github.com/BureauArchitectuurDigitaleOverheid/ai-assisted-architecting/blob/main/SECURITY.md), niet in een openbaar issue.
195
+ Beslissingen over de opzet van de tool staan als ADR's in [`adr/`](https://github.com/BureauArchitectuurDigitaleOverheid/ai-assisted-architecting/tree/main/adr/).
196
+
197
+ ## Licentie
198
+
199
+ [EUPL-1.2](https://github.com/BureauArchitectuurDigitaleOverheid/ai-assisted-architecting/blob/main/LICENSE). Ontwikkeld door de Nederlandse Digitale Dienst. Archi
200
+ zelf valt onder de MIT-licentie; zie [NOTICE](https://github.com/BureauArchitectuurDigitaleOverheid/ai-assisted-architecting/blob/main/NOTICE).
@@ -1,22 +1,27 @@
1
1
  [project]
2
2
  name = "archi-cli"
3
- version = "0.2.2"
4
- description = "ar·cli·mate — de CLI in je ArchiMate: deterministisch native .archimate-modellen inspecteren, muteren, valideren en renderen"
3
+ version = "0.3.0"
4
+ description = "Deterministische command line tool om native Archi-modellen (.archimate) te inspecteren, muteren, valideren en renderen"
5
5
  readme = "README.md"
6
6
  license = "EUPL-1.2"
7
7
  license-files = ["LICENSE"]
8
8
  requires-python = ">=3.12"
9
9
  authors = [
10
- { name = "Bureau Architectuur Digitale Overheid" },
10
+ { name = "Nederlandse Digitale Dienst" },
11
11
  ]
12
- keywords = ["archimate", "archi", "enterprise-architecture", "cli", "modeling"]
12
+ keywords = ["archimate", "archi", "enterprise-architecture", "cli", "modeling", "architecture-as-code"]
13
13
  classifiers = [
14
14
  "Development Status :: 4 - Beta",
15
15
  "Environment :: Console",
16
16
  "Intended Audience :: Developers",
17
- "Topic :: Software Development :: Documentation",
17
+ "Intended Audience :: Information Technology",
18
+ "Natural Language :: Dutch",
19
+ "Operating System :: OS Independent",
20
+ "Programming Language :: Python :: 3",
18
21
  "Programming Language :: Python :: 3.12",
19
22
  "Programming Language :: Python :: 3.13",
23
+ "Programming Language :: Python :: 3.14",
24
+ "Topic :: Software Development :: Documentation",
20
25
  ]
21
26
  # lxml 6.1.3 stops resolving external parameter entities by default
22
27
  dependencies = ["lxml>=6.1.3", "typer>=0.26"]
@@ -25,6 +30,7 @@ dependencies = ["lxml>=6.1.3", "typer>=0.26"]
25
30
  Homepage = "https://github.com/BureauArchitectuurDigitaleOverheid/ai-assisted-architecting"
26
31
  Repository = "https://github.com/BureauArchitectuurDigitaleOverheid/ai-assisted-architecting"
27
32
  Issues = "https://github.com/BureauArchitectuurDigitaleOverheid/ai-assisted-architecting/issues"
33
+ Changelog = "https://github.com/BureauArchitectuurDigitaleOverheid/ai-assisted-architecting/blob/main/CHANGELOG.md"
28
34
 
29
35
  [project.scripts]
30
36
  archi = "archi_tool.cli:main"
@@ -10,6 +10,8 @@ from __future__ import annotations
10
10
 
11
11
  import sys
12
12
  from collections import Counter
13
+ from importlib.metadata import PackageNotFoundError
14
+ from importlib.metadata import version as package_version
13
15
  from pathlib import Path
14
16
  from types import SimpleNamespace
15
17
  from typing import Optional
@@ -17,7 +19,12 @@ from typing import Optional
17
19
  import typer
18
20
  from lxml import etree
19
21
 
20
- from .discovery import discover_conventions, discover_links, discover_model
22
+ from .discovery import (
23
+ discover_conventions,
24
+ discover_fonts,
25
+ discover_links,
26
+ discover_model,
27
+ )
21
28
  from .links import check_link_files, load_links
22
29
  from .model import ArchiModel, ModelError, is_element, xsi_type
23
30
  from .normalize import normalize
@@ -299,11 +306,14 @@ def cmd_setup(model, args):
299
306
 
300
307
  def cmd_render(model, args):
301
308
  links = load_links(discover_links(args.model))
309
+ fonts = discover_fonts(args.model)
302
310
  written, removed = render_all(model, args.out)
303
311
  html_dir = Path(args.out) / "html"
304
- html_written, html_removed = render_all_html(model, html_dir, links=links)
312
+ html_written, html_removed = render_all_html(
313
+ model, html_dir, links=links, fonts=fonts
314
+ )
305
315
  deck_written, deck_removed = render_all_slides(
306
- model, Path(args.decks), html_dir / "slides", links=links
316
+ model, Path(args.decks), html_dir / "slides", links=links, fonts=fonts
307
317
  )
308
318
  for path in written + html_written + deck_written:
309
319
  print(f"Geschreven: {path}")
@@ -328,18 +338,21 @@ def cmd_render(model, args):
328
338
 
329
339
  def cmd_slides(model, args):
330
340
  links = load_links(discover_links(args.model))
341
+ fonts = discover_fonts(args.model)
331
342
  if args.deck:
332
343
  written = []
333
344
  for deck_path in args.deck:
334
345
  deck = load_deck(Path(deck_path), model)
335
346
  path = Path(args.out) / f"{deck['slug']}.html"
336
347
  path.parent.mkdir(parents=True, exist_ok=True)
337
- if write_if_changed(path, render_deck_html(model, deck, links=links)):
348
+ if write_if_changed(
349
+ path, render_deck_html(model, deck, links=links, fonts=fonts)
350
+ ):
338
351
  written.append(path)
339
352
  removed = []
340
353
  else:
341
354
  written, removed = render_all_slides(
342
- model, Path(args.decks), Path(args.out), links=links
355
+ model, Path(args.decks), Path(args.out), links=links, fonts=fonts
343
356
  )
344
357
  for path in written:
345
358
  print(f"Geschreven: {path}")
@@ -382,8 +395,27 @@ ModelOption = typer.Option(
382
395
  )
383
396
 
384
397
 
398
+ def _show_version(value: bool) -> None:
399
+ if not value:
400
+ return
401
+ try:
402
+ typer.echo(f"archi-cli {package_version('archi-cli')}")
403
+ except PackageNotFoundError: # running from a source tree without install
404
+ typer.echo("archi-cli (onbekende versie)")
405
+ raise typer.Exit()
406
+
407
+
385
408
  @app.callback()
386
- def _main(model: Optional[str] = ModelOption):
409
+ def _main(
410
+ model: Optional[str] = ModelOption,
411
+ version: bool = typer.Option(
412
+ False,
413
+ "--version",
414
+ callback=_show_version,
415
+ is_eager=True,
416
+ help="versie tonen en stoppen",
417
+ ),
418
+ ):
387
419
  _state.model = model
388
420
 
389
421
 
@@ -115,6 +115,25 @@ def discover_links(model_path, start=None):
115
115
  return path
116
116
 
117
117
 
118
+ FONT_CHOICES = ("system", "rijkssans")
119
+
120
+
121
+ def discover_fonts(model_path, start=None) -> str:
122
+ """The font choice for rendered HTML: ``[tool.archi] fonts``, default
123
+ "system". "rijkssans" is reserved for the Dutch central government and
124
+ parties working on its behalf (see NOTICE)."""
125
+ start = Path(start or Path(model_path).resolve().parent)
126
+ table, config_path = _read_archi_config(start)
127
+ fonts = table.get("fonts", "system")
128
+ if fonts not in FONT_CHOICES:
129
+ allowed = ", ".join(f'"{c}"' for c in FONT_CHOICES)
130
+ raise ModelError(
131
+ f"Ongeldige waarde voor fonts in {config_path.name}: {fonts!r}. "
132
+ f"Kies uit {allowed}."
133
+ )
134
+ return fonts
135
+
136
+
118
137
  def discover_conventions(model_path, start=None):
119
138
  """Return (allowed_property_keys, source_label).
120
139
 
@@ -26,11 +26,16 @@ from .render import (
26
26
  write_if_changed,
27
27
  )
28
28
 
29
- NLDD_VERSION = "0.8.64"
30
- NLDD_CSS = (
31
- f"https://cdn.jsdelivr.net/npm/@nldd/design-system@{NLDD_VERSION}"
32
- "/dist/css/global.css"
33
- )
29
+ NLDD_VERSION = "0.8.93"
30
+ _NLDD_DIST = f"https://cdn.jsdelivr.net/npm/@nldd/design-system@{NLDD_VERSION}/dist/css"
31
+ # RijksSans is meant for publications by and on behalf of the Dutch central
32
+ # government only, so the default stylesheet leaves it out and falls back to
33
+ # the system font; `[tool.archi] fonts = "rijkssans"` opts in.
34
+ NLDD_STYLESHEETS = {
35
+ "system": f"{_NLDD_DIST}/global-system-font.css",
36
+ "rijkssans": f"{_NLDD_DIST}/global.css",
37
+ }
38
+ DEFAULT_FONTS = "system"
34
39
  NLDD_JS = f"https://cdn.jsdelivr.net/npm/@nldd/design-system@{NLDD_VERSION}/+esm"
35
40
 
36
41
  CANVAS_MARGIN = 40
@@ -514,7 +519,7 @@ PAGE_CSS = (
514
519
  )
515
520
 
516
521
 
517
- def page_shell(title: str, body: str) -> str:
522
+ def page_shell(title: str, body: str, fonts: str = DEFAULT_FONTS) -> str:
518
523
  return f"""{MARKER}
519
524
  <!doctype html>
520
525
  <html lang="nl">
@@ -523,7 +528,7 @@ def page_shell(title: str, body: str) -> str:
523
528
  <meta name="viewport" content="width=device-width, initial-scale=1">
524
529
  <title>{html.escape(title)}</title>
525
530
  <link rel="icon" href="{FAVICON}">
526
- <link rel="stylesheet" href="{NLDD_CSS}">
531
+ <link rel="stylesheet" href="{NLDD_STYLESHEETS[fonts]}">
527
532
  <script type="module">import "{NLDD_JS}";</script>
528
533
  <style>
529
534
  {layer_css()}
@@ -662,7 +667,9 @@ def diagram_canvas(
662
667
  }
663
668
 
664
669
 
665
- def render_view_html(model, diagram, links: dict | None = None) -> str:
670
+ def render_view_html(
671
+ model, diagram, links: dict | None = None, fonts: str = DEFAULT_FONTS
672
+ ) -> str:
666
673
  canvas = diagram_canvas(model, diagram, links=links)
667
674
  name = diagram.get("name") or "(naamloze view)"
668
675
  documentation = model.documentation(diagram)
@@ -692,10 +699,10 @@ def render_view_html(model, diagram, links: dict | None = None) -> str:
692
699
  f"getekende verbindingen · gegenereerd uit "
693
700
  f"<code>{html.escape(display_model_path(model))}</code></p>"
694
701
  )
695
- return page_shell(name, body)
702
+ return page_shell(name, body, fonts)
696
703
 
697
704
 
698
- def render_index_html(model, entries) -> str:
705
+ def render_index_html(model, entries, fonts: str = DEFAULT_FONTS) -> str:
699
706
  cards = []
700
707
  for name, filename, n_boxes, n_edges, thumbnail in entries:
701
708
  cards.append(
@@ -721,10 +728,12 @@ def render_index_html(model, entries) -> str:
721
728
  + "\n"
722
729
  " </nldd-collection>"
723
730
  )
724
- return page_shell(f"{model.name} · views", body)
731
+ return page_shell(f"{model.name} · views", body, fonts)
725
732
 
726
733
 
727
- def render_all_html(model, out_dir, links: dict | None = None) -> tuple[list, list]:
734
+ def render_all_html(
735
+ model, out_dir, links: dict | None = None, fonts: str = DEFAULT_FONTS
736
+ ) -> tuple[list, list]:
728
737
  """Render every view to HTML; returns (written, removed) path lists.
729
738
 
730
739
  links is the parsed links file ({source: {element name: target}}); a view
@@ -740,7 +749,9 @@ def render_all_html(model, out_dir, links: dict | None = None) -> tuple[list, li
740
749
  filename = stems[diagram.get("id")] + ".html"
741
750
  path = out / filename
742
751
  view_links = links_for(links or {}, stems[diagram.get("id")])
743
- if write_if_changed(path, render_view_html(model, diagram, links=view_links)):
752
+ if write_if_changed(
753
+ path, render_view_html(model, diagram, links=view_links, fonts=fonts)
754
+ ):
744
755
  written.append(path)
745
756
  produced.add(path.name)
746
757
  boxes = absolute_boxes(diagram, index)
@@ -750,7 +761,7 @@ def render_all_html(model, out_dir, links: dict | None = None) -> tuple[list, li
750
761
  )
751
762
 
752
763
  index_path = out / "index.html"
753
- if write_if_changed(index_path, render_index_html(model, entries)):
764
+ if write_if_changed(index_path, render_index_html(model, entries, fonts)):
754
765
  written.append(index_path)
755
766
  produced.add(index_path.name)
756
767
 
@@ -22,9 +22,10 @@ from .links import links_for
22
22
  from .model import ModelError
23
23
  from .render import MARKER, is_descendant, slugify, view_stems, write_if_changed
24
24
  from .render_html import (
25
+ DEFAULT_FONTS,
25
26
  DIAGRAM_CSS,
26
27
  FAVICON,
27
- NLDD_CSS,
28
+ NLDD_STYLESHEETS,
28
29
  absolute_boxes,
29
30
  diagram_canvas,
30
31
  layer_css,
@@ -639,7 +640,9 @@ def render_slide_html(
639
640
  )
640
641
 
641
642
 
642
- def render_deck_html(model, deck: dict, links: dict | None = None) -> str:
643
+ def render_deck_html(
644
+ model, deck: dict, links: dict | None = None, fonts: str = DEFAULT_FONTS
645
+ ) -> str:
643
646
  """One self-contained HTML document for a validated deck. links is the
644
647
  parsed links file; embedded views pick up their own section."""
645
648
  total = len(deck["slides"])
@@ -655,7 +658,7 @@ def render_deck_html(model, deck: dict, links: dict | None = None) -> str:
655
658
  <meta name="viewport" content="width=device-width, initial-scale=1">
656
659
  <title>{html.escape(deck["title"])}</title>
657
660
  <link rel="icon" href="{FAVICON}">
658
- <link rel="stylesheet" href="{NLDD_CSS}">
661
+ <link rel="stylesheet" href="{NLDD_STYLESHEETS[fonts]}">
659
662
  <style>
660
663
  {layer_css()}
661
664
  {DIAGRAM_CSS}{DECK_CSS}</style>
@@ -682,7 +685,7 @@ n notities &middot; a autoplay</div>
682
685
 
683
686
 
684
687
  def render_all_slides(
685
- model, decks_dir, out_dir, links: dict | None = None
688
+ model, decks_dir, out_dir, links: dict | None = None, fonts: str = DEFAULT_FONTS
686
689
  ) -> tuple[list, list]:
687
690
  """Render every decks/*.toml; returns (written, removed) path lists.
688
691
  A missing or empty decks dir is not an error: nothing is rendered and
@@ -705,7 +708,9 @@ def render_all_slides(
705
708
  written, produced = [], set()
706
709
  for deck in decks:
707
710
  path = out / f"{deck['slug']}.html"
708
- if write_if_changed(path, render_deck_html(model, deck, links=links)):
711
+ if write_if_changed(
712
+ path, render_deck_html(model, deck, links=links, fonts=fonts)
713
+ ):
709
714
  written.append(path)
710
715
  produced.add(path.name)
711
716
 
@@ -1,15 +0,0 @@
1
- # Archi-backups en afgeleide artefacten — niet versioneren
2
- *.bak
3
- output/
4
- *.xml
5
- *.svg
6
- *.png
7
-
8
- # Python
9
- __pycache__/
10
- *.py[cod]
11
- .venv/
12
- .pytest_cache/
13
-
14
- # macOS
15
- .DS_Store
archi_cli-0.2.2/NOTICE DELETED
@@ -1,15 +0,0 @@
1
- archi-cli
2
- Copyright (c) 2026 Bureau Architectuur Digitale Overheid
3
- Licensed under the EUPL-1.2 (see LICENSE).
4
-
5
- This tool downloads and drives the Archi engine for its `normalize` command.
6
- Archi is a separate work and is not distributed as part of this package; it is
7
- fetched at runtime from the official release on first use.
8
-
9
- Archi — ArchiMate modelling tool
10
- Copyright (c) Phillip Beauvoir, Jean-Baptiste Sarrodie and contributors
11
- Licensed under the MIT License
12
- https://github.com/archimatetool/archi
13
-
14
- The Archi distribution bundles an OpenJDK runtime; its own licensing applies to
15
- that runtime.
archi_cli-0.2.2/PKG-INFO DELETED
@@ -1,167 +0,0 @@
1
- Metadata-Version: 2.5
2
- Name: archi-cli
3
- Version: 0.2.2
4
- Summary: ar·cli·mate — de CLI in je ArchiMate: deterministisch native .archimate-modellen inspecteren, muteren, valideren en renderen
5
- Project-URL: Homepage, https://github.com/BureauArchitectuurDigitaleOverheid/ai-assisted-architecting
6
- Project-URL: Repository, https://github.com/BureauArchitectuurDigitaleOverheid/ai-assisted-architecting
7
- Project-URL: Issues, https://github.com/BureauArchitectuurDigitaleOverheid/ai-assisted-architecting/issues
8
- Author: Bureau Architectuur Digitale Overheid
9
- License-Expression: EUPL-1.2
10
- License-File: LICENSE
11
- Keywords: archi,archimate,cli,enterprise-architecture,modeling
12
- Classifier: Development Status :: 4 - Beta
13
- Classifier: Environment :: Console
14
- Classifier: Intended Audience :: Developers
15
- Classifier: Programming Language :: Python :: 3.12
16
- Classifier: Programming Language :: Python :: 3.13
17
- Classifier: Topic :: Software Development :: Documentation
18
- Requires-Python: >=3.12
19
- Requires-Dist: lxml>=6.1.3
20
- Requires-Dist: typer>=0.26
21
- Description-Content-Type: text/markdown
22
-
23
- # AI-assisted architecting
24
-
25
- [![checks](https://github.com/BureauArchitectuurDigitaleOverheid/ai-assisted-architecting/actions/workflows/ci.yml/badge.svg)](https://github.com/BureauArchitectuurDigitaleOverheid/ai-assisted-architecting/actions/workflows/ci.yml)
26
- [![licentie: EUPL-1.2](https://img.shields.io/badge/licentie-EUPL--1.2-blue.svg)](https://github.com/BureauArchitectuurDigitaleOverheid/ai-assisted-architecting/blob/main/LICENSE)
27
- [![PyPI](https://img.shields.io/pypi/v/archi-cli.svg)](https://pypi.org/project/archi-cli/)
28
-
29
- Een manier van architecteren waarbij een ArchiMate-model in het native
30
- Archi-formaat de bron van waarheid is, en je het met AI-assistentie bijhoudt in
31
- plaats van met de hand door de GUI te klikken. Deze repo levert de twee dingen
32
- die daarvoor nodig zijn:
33
-
34
- - **`archi-cli`**: een deterministische command line tool die een
35
- `.archimate`-model inspecteert, muteert, valideert en rendert, en weigert een
36
- kapot model op te slaan. Op PyPI, werkt op elk model.
37
- - **De skills** (`archi-model`, `archi-view`, `archi-slides`): de werkwijze
38
- die een AI-sessie zoals Claude Code volgt om via de CLI aan het model te
39
- werken. Te installeren als Claude Code plugin.
40
-
41
- Het model zelf hoort niet hier: dat woont in een eigen repo en gebruikt
42
- `archi-cli` als tool. Het ADO-model waarvoor dit ontstond is daar het
43
- voorbeeld.
44
-
45
- ## De CLI
46
-
47
- ```bash
48
- uv tool install archi-cli
49
- archi --help
50
- ```
51
-
52
- Dat zet het commando `archi` op je `$PATH`. Het model wordt gevonden via
53
- `--model <pad>` (vóór het subcommando), via een `archi.toml` in de map
54
- (`[tool.archi] model = "..."`), of als het enige `.archimate`-bestand in de
55
- werkmap.
56
-
57
- ```bash
58
- archi stats # tellingen per type
59
- archi list --type Capability # elementen, gefilterd
60
- archi show "<elementnaam of id>" # één element met relaties
61
- archi tree # folderstructuur
62
-
63
- archi add-element --type Capability --name "..." --documentation "..."
64
- archi add-relation --type Aggregation --source "..." --target "..." --name "bevat"
65
- archi set-property <ref> "<key>=<waarde>" # property zetten of bijwerken
66
- archi remove-property <ref> "<key>" # property verwijderen
67
- archi set-documentation <ref> "..." # Archi's documentatieveld
68
- archi add-element ... --subfolder "Gebied X" # in een submap van de laag
69
- archi move <ref> --subfolder "Gebied X" # naar een submap verplaatsen
70
- archi rename <ref> "Nieuwe naam"
71
- archi remove <ref> --cascade
72
-
73
- archi add-view --name "..." --layout cluster --type Capability --relation Aggregation
74
- archi slides --deck decks/<naam>.toml
75
-
76
- archi validate # integriteitschecks
77
- archi normalize # canonieke serialisatie via Archi
78
- archi render # views naar Mermaid en HTML
79
- ```
80
-
81
- Voor `normalize` is de Archi-engine nodig; die haalt `archi` bij het eerste
82
- gebruik zelf op (of expliciet met `archi setup`), dus je hoeft Archi niet apart
83
- te installeren. `archi <commando> --help` toont de volledige set vlaggen;
84
- shell-completion zet je aan met `archi --install-completion`.
85
-
86
- Wat de tool bijzonder maakt:
87
-
88
- - **Muteren met een vangnet.** Elke wijziging valideert het model in het
89
- geheugen; bij een fout weigert de CLI op te slaan. Ids zijn onveranderlijk.
90
- - **Canonieke serialisatie.** `normalize` laat de headless Archi-engine het
91
- bestand herschrijven, zodat git-diffs klein blijven, of de wijziging nu van
92
- de tool of van de Archi-GUI kwam.
93
- - **Renderen.** Elke view wordt een Mermaid-diagram (rendert op GitHub) en een
94
- HTML-pagina die de layout uit het model volgt, plus een presentatie per
95
- deckdefinitie.
96
- - **Doorklikken tussen views.** Met een links-bestand
97
- (`[tool.archi] links = "…"` in `archi.toml`) worden elementen in de
98
- HTML-views en slides klikbaar naar een andere view of een ander bestand,
99
- bijvoorbeeld een SVG die een project met eigen scripts maakt. Zie
100
- hieronder.
101
-
102
- ### Doorklikken met een links-bestand
103
-
104
- Welk element waarheen doorklikt is een redactionele keuze, geen modelfeit;
105
- het staat daarom in een apart TOML-bestand (zie ADR 0010):
106
-
107
- ```toml
108
- # archi.toml
109
- [tool.archi]
110
- links = "tools/links.toml"
111
-
112
- # tools/links.toml
113
- ["overzicht-van-de-gebieden"] # bestandsnaam van de bronplaat, zonder extensie
114
- "Gebied A" = "gebied-a-in-detail.html" # elementnaam = pad, relatief aan de bronplaat
115
- "Gebied B" = "../eigen-svg/gebied-b.svg"
116
- ```
117
-
118
- Een sectie hoort bij de HTML-view met die bestandsnaam (de slug van de
119
- viewnaam; bij views met botsende namen de naam mét id-suffix die `archi
120
- render` kiest), of bij een bestand dat een project zelf genereert: dezelfde
121
- sectievorm is dan bruikbaar voor eigen scripts, zodat één bestand over alle
122
- doorkliks gaat. In slides worden relatieve paden automatisch gecorrigeerd
123
- voor de submap. `archi validate` waarschuwt voor elementnamen die niet in de
124
- view (of het model) staan, `archi render` voor doelen die niet bestaan en
125
- voor secties die bij geen view of bestand horen.
126
-
127
- ## De skills als Claude Code plugin
128
-
129
- Deze repo is tegelijk de plugin (`archi-tools`) en de marketplace die hem
130
- aanbiedt (`archi-marketplace`). Zo installeer je de skills bij je eigen model:
131
-
132
- ```
133
- /plugin marketplace add BureauArchitectuurDigitaleOverheid/ai-assisted-architecting
134
- /plugin install archi-tools@archi-marketplace
135
- ```
136
-
137
- De plugin brengt de drie skills mee; het `archi`-commando zelf komt van
138
- `uv tool install archi-cli`. Zie `adr/0007-claude-code-plugin.md`.
139
-
140
- ## Ontwikkelen aan de tool
141
-
142
- ```bash
143
- just setup # venv, dependencies en de pre-commit hook
144
- just test # de testsuite (draait op een fixture-model)
145
- just demo # de CLI op het fixture-model
146
- just build # distributies bouwen en de metadata controleren
147
- ```
148
-
149
- De testsuite draait op `tests/fixtures/klein-model.archimate`, niet op een echt
150
- model. Wijzigingen lopen via een branch en een PR; CI draait de suite op Ubuntu
151
- en Windows. Publiceren naar PyPI gebeurt op een versie-tag, zie `CLAUDE.md` en
152
- `adr/0006-publiceren-op-pypi.md`.
153
-
154
- ## Structuur
155
-
156
- ```
157
- tools/archi_tool/ De archi-CLI (Python, lxml, Typer; beheerd met uv)
158
- tests/ pytest-suite met een klein fixture-model
159
- .claude/skills/ De skills (archi-model, archi-view, archi-slides)
160
- .claude-plugin/ Plugin- en marketplace-manifest
161
- adr/ Architectuurbeslissingen over de tool
162
- justfile Vaste taken
163
- ```
164
-
165
- ## Licentie
166
-
167
- [EUPL-1.2](https://github.com/BureauArchitectuurDigitaleOverheid/ai-assisted-architecting/blob/main/LICENSE).
archi_cli-0.2.2/README.md DELETED
@@ -1,145 +0,0 @@
1
- # AI-assisted architecting
2
-
3
- [![checks](https://github.com/BureauArchitectuurDigitaleOverheid/ai-assisted-architecting/actions/workflows/ci.yml/badge.svg)](https://github.com/BureauArchitectuurDigitaleOverheid/ai-assisted-architecting/actions/workflows/ci.yml)
4
- [![licentie: EUPL-1.2](https://img.shields.io/badge/licentie-EUPL--1.2-blue.svg)](https://github.com/BureauArchitectuurDigitaleOverheid/ai-assisted-architecting/blob/main/LICENSE)
5
- [![PyPI](https://img.shields.io/pypi/v/archi-cli.svg)](https://pypi.org/project/archi-cli/)
6
-
7
- Een manier van architecteren waarbij een ArchiMate-model in het native
8
- Archi-formaat de bron van waarheid is, en je het met AI-assistentie bijhoudt in
9
- plaats van met de hand door de GUI te klikken. Deze repo levert de twee dingen
10
- die daarvoor nodig zijn:
11
-
12
- - **`archi-cli`**: een deterministische command line tool die een
13
- `.archimate`-model inspecteert, muteert, valideert en rendert, en weigert een
14
- kapot model op te slaan. Op PyPI, werkt op elk model.
15
- - **De skills** (`archi-model`, `archi-view`, `archi-slides`): de werkwijze
16
- die een AI-sessie zoals Claude Code volgt om via de CLI aan het model te
17
- werken. Te installeren als Claude Code plugin.
18
-
19
- Het model zelf hoort niet hier: dat woont in een eigen repo en gebruikt
20
- `archi-cli` als tool. Het ADO-model waarvoor dit ontstond is daar het
21
- voorbeeld.
22
-
23
- ## De CLI
24
-
25
- ```bash
26
- uv tool install archi-cli
27
- archi --help
28
- ```
29
-
30
- Dat zet het commando `archi` op je `$PATH`. Het model wordt gevonden via
31
- `--model <pad>` (vóór het subcommando), via een `archi.toml` in de map
32
- (`[tool.archi] model = "..."`), of als het enige `.archimate`-bestand in de
33
- werkmap.
34
-
35
- ```bash
36
- archi stats # tellingen per type
37
- archi list --type Capability # elementen, gefilterd
38
- archi show "<elementnaam of id>" # één element met relaties
39
- archi tree # folderstructuur
40
-
41
- archi add-element --type Capability --name "..." --documentation "..."
42
- archi add-relation --type Aggregation --source "..." --target "..." --name "bevat"
43
- archi set-property <ref> "<key>=<waarde>" # property zetten of bijwerken
44
- archi remove-property <ref> "<key>" # property verwijderen
45
- archi set-documentation <ref> "..." # Archi's documentatieveld
46
- archi add-element ... --subfolder "Gebied X" # in een submap van de laag
47
- archi move <ref> --subfolder "Gebied X" # naar een submap verplaatsen
48
- archi rename <ref> "Nieuwe naam"
49
- archi remove <ref> --cascade
50
-
51
- archi add-view --name "..." --layout cluster --type Capability --relation Aggregation
52
- archi slides --deck decks/<naam>.toml
53
-
54
- archi validate # integriteitschecks
55
- archi normalize # canonieke serialisatie via Archi
56
- archi render # views naar Mermaid en HTML
57
- ```
58
-
59
- Voor `normalize` is de Archi-engine nodig; die haalt `archi` bij het eerste
60
- gebruik zelf op (of expliciet met `archi setup`), dus je hoeft Archi niet apart
61
- te installeren. `archi <commando> --help` toont de volledige set vlaggen;
62
- shell-completion zet je aan met `archi --install-completion`.
63
-
64
- Wat de tool bijzonder maakt:
65
-
66
- - **Muteren met een vangnet.** Elke wijziging valideert het model in het
67
- geheugen; bij een fout weigert de CLI op te slaan. Ids zijn onveranderlijk.
68
- - **Canonieke serialisatie.** `normalize` laat de headless Archi-engine het
69
- bestand herschrijven, zodat git-diffs klein blijven, of de wijziging nu van
70
- de tool of van de Archi-GUI kwam.
71
- - **Renderen.** Elke view wordt een Mermaid-diagram (rendert op GitHub) en een
72
- HTML-pagina die de layout uit het model volgt, plus een presentatie per
73
- deckdefinitie.
74
- - **Doorklikken tussen views.** Met een links-bestand
75
- (`[tool.archi] links = "…"` in `archi.toml`) worden elementen in de
76
- HTML-views en slides klikbaar naar een andere view of een ander bestand,
77
- bijvoorbeeld een SVG die een project met eigen scripts maakt. Zie
78
- hieronder.
79
-
80
- ### Doorklikken met een links-bestand
81
-
82
- Welk element waarheen doorklikt is een redactionele keuze, geen modelfeit;
83
- het staat daarom in een apart TOML-bestand (zie ADR 0010):
84
-
85
- ```toml
86
- # archi.toml
87
- [tool.archi]
88
- links = "tools/links.toml"
89
-
90
- # tools/links.toml
91
- ["overzicht-van-de-gebieden"] # bestandsnaam van de bronplaat, zonder extensie
92
- "Gebied A" = "gebied-a-in-detail.html" # elementnaam = pad, relatief aan de bronplaat
93
- "Gebied B" = "../eigen-svg/gebied-b.svg"
94
- ```
95
-
96
- Een sectie hoort bij de HTML-view met die bestandsnaam (de slug van de
97
- viewnaam; bij views met botsende namen de naam mét id-suffix die `archi
98
- render` kiest), of bij een bestand dat een project zelf genereert: dezelfde
99
- sectievorm is dan bruikbaar voor eigen scripts, zodat één bestand over alle
100
- doorkliks gaat. In slides worden relatieve paden automatisch gecorrigeerd
101
- voor de submap. `archi validate` waarschuwt voor elementnamen die niet in de
102
- view (of het model) staan, `archi render` voor doelen die niet bestaan en
103
- voor secties die bij geen view of bestand horen.
104
-
105
- ## De skills als Claude Code plugin
106
-
107
- Deze repo is tegelijk de plugin (`archi-tools`) en de marketplace die hem
108
- aanbiedt (`archi-marketplace`). Zo installeer je de skills bij je eigen model:
109
-
110
- ```
111
- /plugin marketplace add BureauArchitectuurDigitaleOverheid/ai-assisted-architecting
112
- /plugin install archi-tools@archi-marketplace
113
- ```
114
-
115
- De plugin brengt de drie skills mee; het `archi`-commando zelf komt van
116
- `uv tool install archi-cli`. Zie `adr/0007-claude-code-plugin.md`.
117
-
118
- ## Ontwikkelen aan de tool
119
-
120
- ```bash
121
- just setup # venv, dependencies en de pre-commit hook
122
- just test # de testsuite (draait op een fixture-model)
123
- just demo # de CLI op het fixture-model
124
- just build # distributies bouwen en de metadata controleren
125
- ```
126
-
127
- De testsuite draait op `tests/fixtures/klein-model.archimate`, niet op een echt
128
- model. Wijzigingen lopen via een branch en een PR; CI draait de suite op Ubuntu
129
- en Windows. Publiceren naar PyPI gebeurt op een versie-tag, zie `CLAUDE.md` en
130
- `adr/0006-publiceren-op-pypi.md`.
131
-
132
- ## Structuur
133
-
134
- ```
135
- tools/archi_tool/ De archi-CLI (Python, lxml, Typer; beheerd met uv)
136
- tests/ pytest-suite met een klein fixture-model
137
- .claude/skills/ De skills (archi-model, archi-view, archi-slides)
138
- .claude-plugin/ Plugin- en marketplace-manifest
139
- adr/ Architectuurbeslissingen over de tool
140
- justfile Vaste taken
141
- ```
142
-
143
- ## Licentie
144
-
145
- [EUPL-1.2](https://github.com/BureauArchitectuurDigitaleOverheid/ai-assisted-architecting/blob/main/LICENSE).
File without changes