claude-code: register the agent's configuration at three scopes, served as the nox-mesh plugin

Skills, subagents, commands and hooks had no machine-wide place, so they were
copied into homes by hand and drifted. Each is now registered once through the
module's tools, kept in its config state, and written per node: the plugin in
the managed directory, settings and instructions in the managed files, or the
account's own directory, touching only what the module placed. hq ADR 0216.
This commit is contained in:
jochen
2026-10-05 11:57:35 +02:00
parent 170b3296e9
commit dd1035a27d
9 changed files with 1653 additions and 25 deletions
+23 -2
View File
@@ -62,6 +62,8 @@ func (p Paths) binding() string { return filepath.Join(p.State, "licence.jso
func (p Paths) apiKey() string { return filepath.Join(p.State, "api-key") }
func (p Paths) helper() string { return filepath.Join(p.State, "api-key-helper") }
func (p Paths) registry() string { return filepath.Join(p.State, "mcp-servers.json") }
func (p Paths) config() string { return filepath.Join(p.State, "config.json") }
func (p Paths) placed() string { return filepath.Join(p.State, "home-placed.json") }
// Ask is a tool on the bus: its address and arguments in, its JSON answer out.
type Ask func(address string, args any) (json.RawMessage, error)
@@ -116,12 +118,23 @@ func RenderNow(p Paths, write WriteManaged) ([]string, error) {
if readJSON(p.binding(), &b) {
binding = &b
}
files := Render(facts, settings, binding, p.helper(), Registered(p))
var items map[string]Item
_ = readJSON(p.config(), &items)
config := ConfigOf(items)
files := Render(facts, settings, binding, p.helper(), Registered(p), config)
tree, _ := json.Marshal(Marketplace(config))
files[MarketplaceDir+"/"] = string(tree)
names := make([]string, 0, len(files))
for n := range files {
names = append(names, n)
}
sort.Strings(names)
// The marketplace first: the settings that enable its plugin must never name one that is not there yet.
sort.Slice(names, func(i, j int) bool {
if (names[i] == MarketplaceDir+"/") != (names[j] == MarketplaceDir+"/") {
return names[i] == MarketplaceDir+"/"
}
return names[i] < names[j]
})
var out []string
for _, n := range names {
line, err := write(n, files[n])
@@ -130,6 +143,14 @@ func RenderNow(p Paths, write WriteManaged) ([]string, error) {
}
out = append(out, line)
}
// The home scope: what this module places in the account's own agent directory (ADR 0182).
done, left := PlaceHome(p, HomeFiles(config))
for _, line := range done {
out = append(out, "home "+line)
}
for _, line := range left {
out = append(out, "home "+line)
}
return out, nil
}