Repository navigation
Conversation
CLAUDE.md now imports AGENTS.md, which states the docs-first workflow and critical rules and delegates detail to docs/development/. docs/ is the source of truth; dots-design.md is kept as the design record.
- profile apply reconciles installed packages to the profile and replaces profile switch - extends accepts a list; exclude drops inherited packages - core.always_installed is included in every apply and overrides exclude - init --apply applies a profile after bootstrap - active profile lives only in the lockfile
- profile apply removes packages not in the resolved profile, installs missing ones, leaves the rest untouched, and supports --dry-run - remove profile switch; apply is how profiles change - extends accepts a list; exclude drops inherited packages; cycles and missing parents are reported with the chain - core.always_installed is prepended to every apply, overrides exclude, and platform overrides append to it - active profile is read from the lockfile only; core.active_profile is dropped - profile storage goes through toolkit.Runtime instead of os
Applies a profile once init (including the bootstrap install) finishes. Config is reloaded first so core.always_installed from the bootstrap package's config.yaml keeps that package installed. Apply errors note that init itself completed.
- profile create --extends (repeatable) - profile extend/unextend and exclude/unexclude edit the lists; extend and create reject missing parents and cycles before saving - profile show prints the resolved list with each package's source, including always_installed, and flags excludes no parent provides
- openssh-client in the image so git@ clones work - split the Containerfile: machine (clean box), fixture-src, runtime, and a new profiles stage; builds now need an explicit --target - task shell / shell:fixture / shell:profiles mount ~/.ssh (copied in by entry-live.sh so rootless podman ownership does not break ssh) - containers/fixture-profiles: a tap with base/work/personal profiles and always_installed, plus verify-profiles.sh asserting apply reconcile, exclude, always_installed, and --dry-run
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Docs-first change: the spec lands first, then the code that implements it.
Docs
CLAUDE.mdnow imports a newAGENTS.md(workflow + critical rules), which delegates todocs/development/.docs/is declared the source of truth;dots-design.mdis kept as the design record.docs/profiles.md,docs/bootstrapping.md,docs/config-yaml.md,docs/cli-reference.md, and the JSON schemas.Behavior
dots profile applyreconciles: removes installed packages not in the resolved profile (including hand-installed ones), installs missing ones, leaves the rest untouched, and supports--dry-run.profile switchis removed.extendsaccepts a list. Parents resolve in order with first-occurrence dedupe; cycles and missing parents are reported with the chain.excludedrops inherited packages; a profile's own packages always win.core.always_installedis part of every apply and overridesexclude. Platform overrides append to it. This keeps the bootstrapdotspackage from uninstalling itself.dots init --apply <profile>applies a profile after bootstrap, reloading config first so the bootstrap package'salways_installedtakes effect.core.active_profileis dropped.profile create --extends,extend/unextend,exclude/unexclude.profile showprints the resolved list with each package's source and flags excludes that match nothing.toolkit.Runtimeinstead ofos.Breaking changes
dots profile switchis gone; usedots profile apply <name>.profile applynow uninstalls packages that aren't in the profile.core.active_profileinconfig.yamlis ignored.Container testing
openssh-clientis now in the image, sogit@…clones work inside it.machine(clean box: dots, git, ssh, nothing installed),fixture-src,runtime(the smoke image), and a newprofilesstage. Builds now need an explicit--target, becauseprofilesis the last stage.task shell,task shell:fixture,task shell:profilesdrop into throwaway machines with~/.sshmounted.containers/entry-live.shcopies the mount in so rootless podman's ownership mapping doesn't make ssh reject the keys.containers/fixture-profiles/is a tap withbase/work/personalprofiles andalways_installed;containers/verify-profiles.sh(task podman:test:profiles) asserts reconcile, exclude, always-installed and--dry-runbehavior.Test plan
go vet ./...,go test -race ./...always_installedplatform concatenation, resolution (docs example, diamond, cycles, missing parent, exclude rules), apply reconcile/dry-run/always_installed,init --apply, editing commands, CLIshowoutputinit --from … --path dots --apply work,profile show,apply personal --dry-run, then a real apply; thedotspackage survives both appliestask podman:test(51 passed) andtask podman:test:profiles(28 passed)task shell:ssh -T git@github.comauthenticates from inside the container against a real key