home

package
v0.5.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 30, 2026 License: Apache-2.0 Imports: 8 Imported by: 0

Documentation

Overview

Package home resolves the one directory codeaf owns: its state root.

Everything durable the resident keeps — the journal, the workspace, the CAS, the craft repo, measured profiles, the model catalog, the router ledger, the promoted skills shelf — lives under a single directory so that "where does codeaf keep my things" has exactly one answer. That answer is ~/.codeaf, and CODEAF_HOME moves it wholesale.

The override exists for the same reason the directory exists: a disposable run — the UX suite driving the real binary, a second brain on the same laptop, a sandbox — must be able to move every file codeaf writes without moving the user's HOME, and without a per-file flag for each of them. Narrow overrides that already exist (chat --db, CODEAF_PROFILE_DIR) still win where they apply; this only changes the default they fall back to.

Index

Constants

View Source
const EnvVar = "CODEAF_HOME"

EnvVar names the override. It is exported so help text and doctor output can say the same word the code reads.

Variables

This section is empty.

Functions

func Adopt

func Adopt(logf Logf)

Adopt moves an untouched legacy state root to the current name once. It is a boot operation, not root resolution: the real binary calls it from main, and the testing guard makes an accidental library call harmless in test binaries.

func Contains

func Contains(root, path string) bool

Contains reports whether path is the directory root or something under it. It is here because "is this file inside that root" is the state root's own question, and it is asked by the packages that refuse to touch the state of whoever started a test binary — internal/lane's, today; internal/calllog still carries a private copy of this from #352, and should adopt this one, so that the same omission cannot be a defect in one place and not the other.

It compares by path elements rather than by string prefix, so a sibling named like the root — /state/root-2 beside /state/root — is not mistaken for a child of it. An empty root contains nothing, which is what "the environment named no root" has to mean.

func DefaultUnder

func DefaultUnder(base string) string

DefaultUnder is the state root a login whose home directory is base gets when CODEAF_HOME says nothing. It is exported for the one caller that has to name it for a login it is not resolving from the environment — a background timer written before its definition carried a home ticked exactly this — so the directory's name stays spelled in one place.

func Dir

func Dir() string

Dir is the state root. It is CODEAF_HOME when set, ~/.codeaf otherwise, and a bare relative ".codeaf" in the pathological case of a process with no home directory at all — the same last resort the callers used before, kept so a missing HOME degrades to a working directory instead of an error path that no caller was written to handle.

Inside a test binary it is that answer unless the answer is the root the process was handed rather than one the test chose, in which case it is a throwaway directory of this process's own. See undertest.go: a test may not resolve the state of whoever ran it. Outside a test binary the gate is not there at all and this is [resolve] exactly as it has always been.

func InheritedDir

func InheritedDir() string

InheritedDir is the state root this process was started with, ungated.

It exists for the two callers that genuinely want the person's own root and are themselves tests: `internal/session`'s guard, which counts the files under the real journal trees to catch a path resolved from somewhere clever, and the e2e harness, which copies the person's provider credentials out of their real config.json before putting a throwaway home in front of the binary. Anything that is not a guard or a credential read wants Dir.

func Join

func Join(elements ...string) string

Join names a file inside the state root.

func Login

func Login() (string, error)

Login is the directory the OTHER harnesses keep their own state under — the "~" whose dot-folders hold Claude Code's, Codex's and their kin's skills, which the resident imports in place. It follows the state root's override — CODEAF_HOME moves it wholesale, the same way it moves everything else codeaf reads — and otherwise answers the login home the state root itself is resolved from.

It carries Dir's test-binary gate, aimed at the container instead of the root: a suite that named no home of its own gets the quarantine, not the home of whoever ran it, because a scan of a real home imports a real person's skills into a throwaway store. A test that pins HOME or CODEAF_HOME — the two ways a test says where its state goes — still gets exactly the home it asked for.

func Moved

func Moved() bool

Moved says the state root is not the person's own default one: CODEAF_HOME names another, or this is a test binary, whose root is never the person's (undertest.go). A folder codeaf keeps outside the state root on a person's behalf — a program's copies under the cache folder — follows the state root when it has moved, so a disposable home takes everything codeaf writes with it, and a test never writes into the cache of whoever ran it.

func StoreDir

func StoreDir(store, kind string) string

StoreDir names one of a store's own directories — the workspace its jobs write into, the scratch they spill into — beside the store file.

It is keyed to the STORE and not to the store's directory, which is the whole point. `--db` is a narrow override that moves the journal without moving the state root, so two stores pointed at one folder used to share one `workspace` underneath it: four probe databases in /tmp all wrote into /tmp/workspace, and each run's deliverables landed among the others' with nothing on disk saying which brain produced which file. A directory named after the store can only ever hold one store's work.

Types

type Logf

type Logf func(string, ...any)

Logf is the one-line reporting door boot adoption uses when best effort was not enough. It matches log.Printf without making this package choose a log.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL