Instruction file imported from hijera/foxxy-agent (
.cursor/rules/architecture.mdc). Copyright stays with the author.
description: Layers and dependency direction for FoxxyCode Agent globs: **/*.go alwaysApply: true
Architecture
FoxxyCode is a Go CLI and ACP harness. Keep dependencies flowing inward: higher layers orchestrate lower ones; shared types stay shallow.
Rough layers (low to high)
internal/version,internal/logger, small shared helpers - minimal inward imports.internal/config- configuration structs and loading.internal/session,internal/llm,internal/prompts,internal/bgtask- runtime state, model access, and the background task pool (internal/bgtaskimports onlyinternal/platform; nothing below it may import back).internal/tools,internal/permission,internal/skills,internal/subagents,internal/hooks- capabilities and policies (internal/subagentsproduces immutable definitions and pure trust / tool-set decisions,internal/hooksloads hook definitions and runs hook processes with pure outcome merging;internal/agentapplies both).internal/agent- ReAct-style loop assembling the above.internal/acp- ACP protocol server on top of the agent and session manager.cmd/foxxycode- CLI entrypoints and wiring.
Optional build tags
memory-external/memorylong-term memory copilot and HTTP session memory routes;//go:build memory. Recommended together withhttpfor/foxxycode/sessions/.../memory/*. Default full binary in README and Docker includesmemory.external/httpserver- OpenAI-shaped HTTP API;//go:build http. Embedded SPA uses//go:build http && uiwithexternal/ui. Keep handler registration andopenapi.goin sync.external/scheduler(daemon/,storage/,service/schedservice,tools/schedtools) - cron and related tools; scheduler tag.internal/desktop- Windows WebView2 desktop launcher;//go:build desktop && windows. Orchestrateshttpserver.StartHTTPplus embedded UI in a native window (foxxycode desktop/foxxycode-desktop.exe).
Do not introduce import cycles. If a new package would cycle, split interfaces or move shared types down-layer.
Optional module tools (external/*/tools)
Optional domains that ship their own LLM-callable tools (not the main internal/tools registry) use internal/tooling.Tool: Definition (llm.ToolDefinition) plus Execute func(ctx context.Context, argsJSON string, env *tooling.Env) (string, error) in the same file, same pattern as external/scheduler/tools/job_get.go.
- One constructor per file - e.g.
jobGetTool(cfg *config.Config) *tooling.Tool,memorySearchTool(store *memstorage.Store, mem *config.MemoryConfig) *tooling.Tool.InputSchemausesmap[string]interface{}with[]interface{}forrequiredand enums (match existing scheduler and memory files). register.go- aggregates constructors (schedulerRegisterToolsinto the session registry; memoryPersistTools,RecallTools,ToolDefinitions,Execfor the memory copilot loop inexternal/memory).- File naming - scheduler job tools use the
job_*.goprefix; memory per-tool files use themem_*.goprefix; sharedenv.go,names.go,register.goinexternal/memory/toolsstay unprefixed.
References
@README.md @docs/contributing/architecture.md @core-modules.mdc