restructure licenses.yaml: self + runtime deps + dev deps
test / unit + widget + golden + a11y (push) Successful in 1m30s
test / integration_test (xvfb) (push) Failing after 1m14s
test / bundle smoke (xvfb 5s) (push) Failing after 1m3s
test / daemon subprocess + web WASM smoke (push) Successful in 1m42s

Three sections instead of one flat list. `self:` carries clide's own
MIT license (rendered first in the About screen so the user knows
what they're running before the dependency list). `dependencies:`
covers artefacts that actually ship in the binary — JetBrainsMono,
JosefinSans, yaml. `dev_dependencies:` tracks build-time tooling
(mocktail, alchemist, flutter_lints, lints, test) for audit
completeness without polluting the user-facing About panel.

Also backfilled the two root-package dev deps that were missed the
first pass: `lints: 5.0.0` and `test: 1.25.8` (root pubspec, not
app/). Root LICENSE mirrored into app/assets/LICENSE + declared as
a bundled asset so the About screen can read it at runtime (Flutter
can't reference paths above the package root).

D-042 updated to describe the three-section split and the dev-vs-
runtime distinction.

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2026-04-22 08:26:36 +02:00
co-authored by Claude
parent 1b00d88a0d
commit c94ad2c05b
4 changed files with 94 additions and 22 deletions
+21
View File
@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2026 Jeroen Schweitzer
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
+63 -16
View File
@@ -1,20 +1,48 @@
# clide — bundled-dependency manifest.
# clide — licensing manifest.
#
# Every third-party artefact that ships in the clide binary is listed
# here: fonts, Dart packages, native supporter tools, bundled data.
# The About screen reads this file and renders the entries verbatim.
# Three sections:
# - `self:` — clide's own license (MIT). Rendered first in the About
# screen so the user knows what they're running before they see
# the list of things it depends on.
# - `dependencies:` — third-party artefacts that SHIP in the clide
# binary: fonts, runtime Dart packages, native supporter tools,
# bundled data. The About screen renders these verbatim.
# - `dev_dependencies:` — build-time-only tooling: test runners,
# mocks, lints, golden-test harness. These never enter the shipped
# binary, so the About screen does not render them, but they're
# tracked here for audit completeness alongside the real list.
#
# Adding a new bundled dependency is a two-step commit:
# Adding a new runtime dependency is a two-step commit:
# 1. Add the dependency itself (font file, `pubspec.yaml` entry, etc.)
# 2. Add the entry below in the same commit, so the About screen stays
# accurate and the prefer-zero-deps guardrail is enforced by the
# obvious visible consequence: an extra row in the list.
# 2. Add the entry under `dependencies:` below in the same commit, so
# the About screen stays accurate and the prefer-zero-deps
# guardrail is enforced by the obvious visible consequence: an
# extra row in the list.
#
# Adding a new dev-only dependency is the same two-step commit, just
# under `dev_dependencies:` instead. The guardrail still applies —
# dev deps are supply-chain risk too — but they don't pollute the
# user-facing About screen.
#
# See CLAUDE.md "Dependencies & supply chain" for the full rule, and
# `decisions/tooling.md` for the D-record that pins it.
schema_version: 1
# clide itself. Listed first so the About screen can render "You're
# looking at clide vX, MIT-licensed" at the top of the panel before
# the bundled-dependency list underneath. The root LICENSE is the
# authoritative copy; `app/assets/LICENSE` is a mirror bundled so the
# About screen can read it at runtime.
self:
name: clide
version: "2.0.0-dev"
homepage: https://git.schweitz.net/jpmschweitzer/clide
license: MIT
license_file: assets/LICENSE
copyright: "© 2026 Jeroen Schweitzer"
# Runtime dependencies — ship in the clide binary.
dependencies:
- name: JetBrains Mono
kind: font
@@ -47,15 +75,17 @@ dependencies:
YAML parser for theme files and extension manifests. The one
justified exception to prefer-zero-deps; Dart-team maintained.
# Build-time-only dependencies — test runners, mocks, lints. Tracked
# here for audit completeness; NOT rendered in the About screen.
dev_dependencies:
- name: mocktail
kind: dart-package
version: "1.0.4"
homepage: https://pub.dev/packages/mocktail
license: MIT
purpose: >-
Test-only. Mocks at IO / IPC boundaries. ChangeNotifier facades
use hand-rolled fakes instead of mocks (D-025).
scope: dev
Mocks at IO / IPC boundaries. ChangeNotifier facades use
hand-rolled fakes instead of mocks (D-025).
- name: alchemist
kind: dart-package
@@ -63,14 +93,31 @@ dependencies:
homepage: https://pub.dev/packages/alchemist
license: MIT
purpose: >-
Test-only. Golden-test framework; Ahem-font rendering for
cross-platform pixel stability on widget primitives (D-024).
scope: dev
Golden-test framework; Ahem-font rendering for cross-platform
pixel stability on widget primitives (D-024).
- name: flutter_lints
kind: dart-package
version: "6.0.0"
homepage: https://pub.dev/packages/flutter_lints
license: BSD-3-Clause
purpose: Test-only. Flutter-team-recommended analyzer lint set.
scope: dev
purpose: Flutter-team-recommended analyzer lint set (app/).
- name: lints
kind: dart-package
version: "5.0.0"
homepage: https://pub.dev/packages/lints
license: BSD-3-Clause
purpose: >-
Dart-team-recommended analyzer lint set for the Flutter-free
core package at the repo root.
- name: test
kind: dart-package
version: "1.25.8"
homepage: https://pub.dev/packages/test
license: BSD-3-Clause
purpose: >-
Dart test runner for the core package (Flutter-free; the app
uses flutter_test from the Flutter SDK for widget + golden
coverage).
+7 -3
View File
@@ -53,11 +53,15 @@ flutter:
assets:
- lib/kernel/src/theme/themes/
- lib/kernel/src/i18n/catalog/
# Bundled-dependency manifest — read by the About screen.
# Licensing — read by the About screen. `licenses.yaml` is the
# manifest (self + runtime deps + dev deps); each `license_file`
# pointer must also be a bundled asset so the About screen can
# display each dependency's full license text at runtime.
# Root LICENSE is mirrored into assets/LICENSE for the same reason
# (root paths can't be referenced from a Flutter package's assets).
# See CLAUDE.md "Dependencies & supply chain" and D-042.
- assets/licenses.yaml
# License files referenced by licenses.yaml must be bundled too so
# the About screen can display each dependency's full license text.
- assets/LICENSE
- assets/fonts/jetbrains_mono/OFL.txt
- assets/fonts/josefin_sans/OFL.txt
+3 -3
View File
@@ -18,10 +18,10 @@ Toolchain, supply chain, CI, ignore strategy.
- **Cost:** PRs don't run CI yet; `make push-check` is the gate until activation.
- **Raised by:** 2026-04-21 planning.
### D-042: Bundled dependencies documented in `licenses.yaml`
### D-042: Dependencies documented in `licenses.yaml`
- **Date:** 2026-04-22
- **Decision:** Every third-party artefact bundled into the clide binary — Dart packages, fonts, native supporter tools, bundled data — has an entry in `app/assets/licenses.yaml` with name, kind, version, homepage, license identifier, relative path to the bundled license text, and a one-line purpose. The file is shipped as a Flutter asset and rendered by the About screen (Tier 6). Adding a bundled dependency is a two-step commit: add the artefact **and** the corresponding `licenses.yaml` entry in the same changeset.
- **Rationale:** Complements [D-031](#d-031-prefer-zero-deps-exact-pin). Prefer-zero-deps is a *budget*; `licenses.yaml` is the *visible consequence*. An extra row in the About screen is a review-time signal that the budget just grew. It also discharges the redistribution obligations bundled licenses impose (OFL, MIT, BSD all require preserving the license text alongside the binary) without ad-hoc NOTICE files.
- **Decision:** `app/assets/licenses.yaml` has three sections: `self:` (clide's MIT license, rendered first in the About screen so the user knows what they're running), `dependencies:` (third-party artefacts that **ship in the binary** — fonts, runtime Dart packages, native supporter tools, bundled data), and `dev_dependencies:` (build-time-only tooling — test runners, mocks, lints, golden harness — tracked for audit but **not rendered** in the About screen because they don't reach the user). Each entry has name, kind, version, homepage, license identifier, and a one-line purpose; runtime entries also carry a `license_file:` pointer to the bundled license text so the About screen can display it verbatim. Adding any dependency is a two-step commit: add the artefact **and** the corresponding `licenses.yaml` entry in the same changeset, under the correct section.
- **Rationale:** Complements [D-031](#d-031-prefer-zero-deps-exact-pin). Prefer-zero-deps is a *budget*; `licenses.yaml` is the *visible consequence*. An extra row in the About screen is a review-time signal that the shipped-binary surface grew. Splitting dev deps out keeps the user-facing list small and honest — a test framework is not something the user needs to see in About — while still documenting every supply-chain input for audit completeness. The runtime entries discharge the redistribution obligations bundled licenses impose (OFL, MIT, BSD all require preserving the license text alongside the binary) without ad-hoc NOTICE files.
- **Cost:** One extra edit per dep. Zero tolerance for drift — an un-listed dep is a contributor-visible bug. Until the About screen lands at Tier 6, `licenses.yaml` is accurate but not rendered; the discipline applies from now regardless so Tier 6 inherits a clean list.
- **Raised by:** 2026-04-22 planning (user-directed best practice).