aboutsummaryrefslogtreecommitdiffstats
path: root/openspec/specs/dotfiles-management/spec.md
diff options
context:
space:
mode:
authorGravatar Tom van der Lee <tom@vanderlee.io>2026-09-18 15:12:24 +0200
committerGravatar Tom van der Lee <tom@vanderlee.io>2026-09-18 15:12:24 +0200
commit4937d0d6f29895b514dcf8cd20c73a1aec446144 (patch)
tree7ff388ba4cca94e95489d30452b25badd7e49aa9 /openspec/specs/dotfiles-management/spec.md
parent72b640f5ae65755c1d932b7b8ee88d2367e4036f (diff)
downloaddesktop-flake-4937d0d6f29895b514dcf8cd20c73a1aec446144.tar.gz
desktop-flake-4937d0d6f29895b514dcf8cd20c73a1aec446144.tar.bz2
desktop-flake-4937d0d6f29895b514dcf8cd20c73a1aec446144.zip
Archive four completed changes, sync main specs
add-nix-flake-bootstrap, add-host-bootstrap-script, add-dotfiles-stow-bootstrap, and add-developer-environment all had every task complete (verified via a real nix flake check and a real NixOS host build). Archived in dependency order so the two changes sharing the nix-flake-bootstrap capability merged additively. Main specs now exist for the first time: nix-flake-bootstrap (10 requirements), dotfiles-management (4), developer-environment (4). add-gnome-desktop remains active (not yet implemented).
Diffstat (limited to 'openspec/specs/dotfiles-management/spec.md')
-rw-r--r--openspec/specs/dotfiles-management/spec.md45
1 files changed, 45 insertions, 0 deletions
diff --git a/openspec/specs/dotfiles-management/spec.md b/openspec/specs/dotfiles-management/spec.md
new file mode 100644
index 0000000..7585cc9
--- /dev/null
+++ b/openspec/specs/dotfiles-management/spec.md
@@ -0,0 +1,45 @@
1## Purpose
2
3Automatically clones a personal dotfiles repository into the user's home directory and symlinks its contents into place, so a fresh machine ends up with the same personal configuration without a manual clone-and-stow step.
4
5## Requirements
6
7### Requirement: Dotfiles cloning is opt-in via a configured repo URL
8The dotfiles clone-and-stow behavior SHALL only run when a repository URL has been explicitly configured; leaving it unset SHALL leave the home directory untouched by this feature.
9
10#### Scenario: No repo URL configured
11- **WHEN** no dotfiles repository URL has been set
12- **THEN** no clone or symlinking occurs during activation
13
14#### Scenario: Repo URL configured
15- **WHEN** a dotfiles repository URL has been set
16- **THEN** activation clones and symlinks that repository as described by the other requirements in this capability
17
18### Requirement: Existing dotfiles checkout is never overwritten
19If the dotfiles repository has already been cloned locally, the system SHALL NOT re-clone or otherwise modify that existing checkout.
20
21#### Scenario: Checkout already present
22- **WHEN** activation runs and a local dotfiles checkout already exists
23- **THEN** no clone operation is performed against that location, and the existing checkout's contents and git history are left untouched
24
25#### Scenario: Checkout missing
26- **WHEN** activation runs and no local dotfiles checkout exists yet
27- **THEN** the configured repository is cloned, including any git submodules it declares
28
29### Requirement: Dotfiles packages are symlinked into the home directory
30Each top-level package directory in the cloned dotfiles repository SHALL be symlinked into the home directory following the same package-to-target-path convention as GNU Stow (a package directory's contents mirror their target location under the home directory).
31
32#### Scenario: A package is linked
33- **WHEN** the dotfiles repository contains a top-level directory whose contents mirror a location under the home directory
34- **THEN** that content becomes reachable via a symlink at the corresponding path under the home directory
35
36#### Scenario: Non-package entries are ignored
37- **WHEN** the dotfiles repository contains top-level entries that are not package directories (ordinary files, or hidden/dot-prefixed directories such as version-control metadata)
38- **THEN** those entries are not treated as packages and produce no symlinks
39
40### Requirement: A conflicting package does not block the others
41If symlinking one package would conflict with an existing file or symlink not owned by this process, the system SHALL skip that package and continue processing the remaining packages, rather than aborting entirely.
42
43#### Scenario: One package conflicts
44- **WHEN** one dotfiles package's target path is already occupied by an unrelated existing file
45- **THEN** that package is skipped with a visible warning, and every other package is still processed