Monorepo for the AppFS stack:
appfs/: the filesystem protocol, runtime, bridges, SDKs, and contract suitesappfs-agent/: the agent runtime that operates on top of AppFSintegration/: cross-project scripts, fixtures, and end-to-end test scaffolding
appfs and appfs-agent are separate layers, but they now evolve together:
- AppFS defines the filesystem-native app contract
appfs-agentconsumes that contract as an agent runtime- integration work frequently changes both layers at once
This monorepo keeps those layers separate in code layout while making joint development, CI, and end-to-end testing easier.
At a high level, AppFS owns the mounted app surface and runtime state, while appfs-agent owns the model loop, prompt assembly, and tool-driven interaction.
flowchart LR
subgraph APPFS["appfs"]
Compose["compose / app policies"]
Supervisor["runtime supervisor"]
Mount["mount runtime + bridges"]
Tree["mounted app tree\n/public, /private, /_appfs"]
Stream["_stream/events.evt.jsonl"]
Compose --> Supervisor
Supervisor --> Mount
Mount --> Tree
Mount --> Stream
end
subgraph AGENT["appfs-agent"]
Attach["attach / detect AppFS"]
Prompt["system prompt + skill listing"]
Router["input router / event reminders"]
REPL["interactive turn loop"]
Tools["shell + file tools"]
Attach --> Prompt --> Router --> REPL --> Tools
Router --> Prompt
end
Tools <--> Tree
Stream --> Router
The usual loop is:
sequenceDiagram
participant U as User
participant A as appfs-agent
participant F as AppFS
participant M as Mounted app tree
participant E as Event stream
U->>A: Enter a request
A->>A: Build prompt + select skills
A->>M: Read resources / append to *.act
M->>F: AppFS processes action
F->>E: Emit action.completed / action.failed / message events
E->>A: Turn-local reminder or wake signal
A->>A: Continue the turn or start the next one
In practice this means:
- AppFS materializes app state as files and streams.
appfs-agentreads those files, writes actions, and reacts to AppFS events.integration/holds the scripts that verify both sides together.
.
├── appfs/
├── appfs-agent/
├── docs/
│ └── adr/
└── integration/
├── fixtures/
├── scripts/
└── tests/
Treat the standalone repositories as the source of truth for component code, and treat this monorepo as the integration repo:
appfs/code originates in the standaloneappfsrepositoryappfs-agent/code originates in the standaloneappfs-agentrepositoryintegration/assets, end-to-end scenarios, and cross-project glue live here
Work in the subproject that owns the change:
- AppFS protocol, mount/runtime, bridges, adapters:
appfs/ - agent runtime, tools, sessions, hooks, providers:
appfs-agent/ - end-to-end mount + agent scenarios:
integration/
Prefer adding integration assets only when a scenario truly spans both systems.
Default sync flow:
claw-code-parity-> standaloneappfs-agent- standalone
appfs-agent->appfs-platform/appfs-agent - standalone
appfs->appfs-platform/appfs
Avoid syncing claw-code-parity directly into this monorepo.
The monorepo includes subtree sync helpers under integration/scripts:
sync-appfs.ps1sync-appfs-agent.ps1
They pull the latest standalone repositories into the matching monorepo subdirectories with git subtree pull --squash.
This repository is the source of truth for:
- integration scripts
- end-to-end fixtures
- combined CI
- cross-project documentation and ADRs
This repository is not the default source of truth for component internals. If a change belongs purely to appfs or appfs-agent, land it in the standalone repository first and then sync it here.
The root CI currently covers:
appfs-agentRust workspace on Ubuntu, Windows, and macOSappfs-agentrepository-level Python testsappfscore Linux contract gate
This keeps the combined repo practical to work in while preserving the highest-signal checks for the two active layers.
This monorepo was initialized from the current working branches of the two source repositories:
appfs: imported from the currentagentfsHEADappfs-agent: imported from the currentclaw-codeHEAD
See ADR 0002 for the ongoing repository workflow and sync policy.