dotbrain 0.6.0__tar.gz → 0.7.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {dotbrain-0.6.0 → dotbrain-0.7.0}/PKG-INFO +73 -27
- {dotbrain-0.6.0 → dotbrain-0.7.0}/README.md +72 -26
- dotbrain-0.7.0/docs/.vitepress/config.mts +179 -0
- {dotbrain-0.6.0 → dotbrain-0.7.0}/docs/.vitepress/theme/style.css +6 -0
- {dotbrain-0.6.0 → dotbrain-0.7.0}/docs/AGENTS.md +6 -0
- {dotbrain-0.6.0 → dotbrain-0.7.0}/docs/README.md +2 -0
- dotbrain-0.7.0/docs/agent-team.md +269 -0
- {dotbrain-0.6.0 → dotbrain-0.7.0}/docs/brain-site-configuration.md +2 -2
- {dotbrain-0.6.0 → dotbrain-0.7.0}/docs/glossary.md +1 -1
- {dotbrain-0.6.0 → dotbrain-0.7.0}/docs/index.md +2 -0
- dotbrain-0.7.0/docs/prompts.md +326 -0
- dotbrain-0.7.0/docs/public/assets/banner-dark.png +0 -0
- dotbrain-0.7.0/docs/public/assets/banner-light.png +0 -0
- dotbrain-0.7.0/docs/public/assets/how-it-works-dark.png +0 -0
- dotbrain-0.7.0/docs/public/assets/how-it-works-dark.svg +51 -0
- dotbrain-0.7.0/docs/public/assets/how-it-works-light.png +0 -0
- dotbrain-0.7.0/docs/public/assets/how-it-works-light.svg +51 -0
- dotbrain-0.7.0/docs/public/assets/workflow-dark.png +0 -0
- dotbrain-0.7.0/docs/public/assets/workflow-dark.svg +60 -0
- dotbrain-0.7.0/docs/public/assets/workflow-light.png +0 -0
- dotbrain-0.7.0/docs/public/assets/workflow-light.svg +60 -0
- {dotbrain-0.6.0 → dotbrain-0.7.0}/docs/session-context.md +8 -0
- {dotbrain-0.6.0 → dotbrain-0.7.0}/docs/skills.md +2 -2
- {dotbrain-0.6.0 → dotbrain-0.7.0}/docs/workflow.md +15 -5
- dotbrain-0.7.0/docs/zh/agent-team.md +214 -0
- dotbrain-0.7.0/docs/zh/architecture.md +135 -0
- dotbrain-0.7.0/docs/zh/beads-backend.md +160 -0
- dotbrain-0.7.0/docs/zh/brain-site-configuration.md +102 -0
- dotbrain-0.7.0/docs/zh/brain-site.md +51 -0
- dotbrain-0.7.0/docs/zh/cli-reference.md +383 -0
- dotbrain-0.7.0/docs/zh/configuration.md +142 -0
- dotbrain-0.7.0/docs/zh/getting-started.md +302 -0
- dotbrain-0.7.0/docs/zh/glossary.md +161 -0
- dotbrain-0.7.0/docs/zh/index.md +168 -0
- dotbrain-0.7.0/docs/zh/learning.md +108 -0
- dotbrain-0.7.0/docs/zh/prompts.md +308 -0
- dotbrain-0.7.0/docs/zh/session-context.md +85 -0
- dotbrain-0.7.0/docs/zh/skills.md +104 -0
- dotbrain-0.7.0/docs/zh/troubleshooting.md +101 -0
- dotbrain-0.7.0/docs/zh/why-dotbrain.md +88 -0
- dotbrain-0.7.0/docs/zh/wiring.md +166 -0
- dotbrain-0.7.0/docs/zh/workflow.md +161 -0
- {dotbrain-0.6.0 → dotbrain-0.7.0}/pyproject.toml +1 -1
- {dotbrain-0.6.0 → dotbrain-0.7.0}/src/dotbrain/__init__.py +1 -1
- {dotbrain-0.6.0 → dotbrain-0.7.0}/src/dotbrain/resources/agents/codex/researcher.toml +6 -6
- dotbrain-0.7.0/src/dotbrain/resources/agents/codex/reviewer.toml +82 -0
- {dotbrain-0.6.0 → dotbrain-0.7.0}/src/dotbrain/resources/agents/codex/verifier.toml +11 -1
- {dotbrain-0.6.0 → dotbrain-0.7.0}/src/dotbrain/resources/agents/codex/worker.toml +8 -5
- {dotbrain-0.6.0 → dotbrain-0.7.0}/src/dotbrain/resources/templates/brain/DOTBRAIN.md +6 -0
- dotbrain-0.6.0/docs/.vitepress/config.mts +0 -104
- dotbrain-0.6.0/docs/public/assets/apple-touch-icon-dark.png +0 -0
- dotbrain-0.6.0/docs/public/assets/favicon-dark-16.png +0 -0
- dotbrain-0.6.0/docs/public/assets/favicon-dark-48.png +0 -0
- dotbrain-0.6.0/docs/public/assets/favicon-light-16.png +0 -0
- dotbrain-0.6.0/docs/public/assets/favicon-light-48.png +0 -0
- dotbrain-0.6.0/docs/public/assets/how-it-works-dark.svg +0 -46
- dotbrain-0.6.0/docs/public/assets/how-it-works-light.svg +0 -46
- dotbrain-0.6.0/docs/public/assets/icon-dark-192.png +0 -0
- dotbrain-0.6.0/docs/public/assets/icon-dark-512.png +0 -0
- dotbrain-0.6.0/docs/public/assets/icon-light-192.png +0 -0
- dotbrain-0.6.0/docs/public/assets/icon-light-512.png +0 -0
- dotbrain-0.6.0/docs/public/assets/lockup-horizontal-dark.png +0 -0
- dotbrain-0.6.0/docs/public/assets/lockup-horizontal-light.png +0 -0
- dotbrain-0.6.0/docs/public/assets/lockup-stacked-dark-512.png +0 -0
- dotbrain-0.6.0/docs/public/assets/lockup-stacked-dark.png +0 -0
- dotbrain-0.6.0/docs/public/assets/lockup-stacked-light-512.png +0 -0
- dotbrain-0.6.0/docs/public/assets/lockup-stacked-light.png +0 -0
- dotbrain-0.6.0/docs/public/assets/mark-dark-1024.png +0 -0
- dotbrain-0.6.0/docs/public/assets/mark-light-1024.png +0 -0
- dotbrain-0.6.0/docs/public/assets/preview.png +0 -0
- dotbrain-0.6.0/docs/public/assets/social-dark.png +0 -0
- dotbrain-0.6.0/docs/public/assets/social-light.png +0 -0
- dotbrain-0.6.0/src/dotbrain/resources/agents/codex/reviewer.toml +0 -65
- {dotbrain-0.6.0 → dotbrain-0.7.0}/.gitignore +0 -0
- {dotbrain-0.6.0 → dotbrain-0.7.0}/LICENSE +0 -0
- {dotbrain-0.6.0 → dotbrain-0.7.0}/docs/.vitepress/theme/Mermaid.vue +0 -0
- {dotbrain-0.6.0 → dotbrain-0.7.0}/docs/.vitepress/theme/index.ts +0 -0
- {dotbrain-0.6.0 → dotbrain-0.7.0}/docs/CLAUDE.md +0 -0
- {dotbrain-0.6.0 → dotbrain-0.7.0}/docs/architecture.md +0 -0
- {dotbrain-0.6.0 → dotbrain-0.7.0}/docs/beads-backend.md +0 -0
- {dotbrain-0.6.0 → dotbrain-0.7.0}/docs/brain-site.md +0 -0
- {dotbrain-0.6.0 → dotbrain-0.7.0}/docs/cli-reference.md +0 -0
- {dotbrain-0.6.0 → dotbrain-0.7.0}/docs/configuration.md +0 -0
- {dotbrain-0.6.0 → dotbrain-0.7.0}/docs/getting-started.md +0 -0
- {dotbrain-0.6.0 → dotbrain-0.7.0}/docs/learning.md +0 -0
- {dotbrain-0.6.0 → dotbrain-0.7.0}/docs/package-lock.json +0 -0
- {dotbrain-0.6.0 → dotbrain-0.7.0}/docs/package.json +0 -0
- {dotbrain-0.6.0 → dotbrain-0.7.0}/docs/public/assets/apple-touch-icon-light.png +0 -0
- {dotbrain-0.6.0 → dotbrain-0.7.0}/docs/public/assets/favicon-dark-32.png +0 -0
- {dotbrain-0.6.0 → dotbrain-0.7.0}/docs/public/assets/favicon-light-32.png +0 -0
- {dotbrain-0.6.0 → dotbrain-0.7.0}/docs/public/assets/lockup-horizontal-dark-1024.png +0 -0
- {dotbrain-0.6.0 → dotbrain-0.7.0}/docs/public/assets/lockup-horizontal-light-1024.png +0 -0
- {dotbrain-0.6.0 → dotbrain-0.7.0}/docs/public/assets/mark-dark-512.png +0 -0
- {dotbrain-0.6.0 → dotbrain-0.7.0}/docs/public/assets/mark-dark.png +0 -0
- {dotbrain-0.6.0 → dotbrain-0.7.0}/docs/public/assets/mark-light-512.png +0 -0
- {dotbrain-0.6.0 → dotbrain-0.7.0}/docs/public/assets/mark-light.png +0 -0
- {dotbrain-0.6.0 → dotbrain-0.7.0}/docs/troubleshooting.md +0 -0
- {dotbrain-0.6.0 → dotbrain-0.7.0}/docs/why-dotbrain.md +0 -0
- {dotbrain-0.6.0 → dotbrain-0.7.0}/docs/wiring.md +0 -0
- {dotbrain-0.6.0 → dotbrain-0.7.0}/src/dotbrain/_cli_reference.py +0 -0
- {dotbrain-0.6.0 → dotbrain-0.7.0}/src/dotbrain/adopter_repos.py +0 -0
- {dotbrain-0.6.0 → dotbrain-0.7.0}/src/dotbrain/asset_cli.py +0 -0
- {dotbrain-0.6.0 → dotbrain-0.7.0}/src/dotbrain/assets.py +0 -0
- {dotbrain-0.6.0 → dotbrain-0.7.0}/src/dotbrain/beads.py +0 -0
- {dotbrain-0.6.0 → dotbrain-0.7.0}/src/dotbrain/bootstrap.py +0 -0
- {dotbrain-0.6.0 → dotbrain-0.7.0}/src/dotbrain/brainspaces.py +0 -0
- {dotbrain-0.6.0 → dotbrain-0.7.0}/src/dotbrain/cli.py +0 -0
- {dotbrain-0.6.0 → dotbrain-0.7.0}/src/dotbrain/config.py +0 -0
- {dotbrain-0.6.0 → dotbrain-0.7.0}/src/dotbrain/doctor.py +0 -0
- {dotbrain-0.6.0 → dotbrain-0.7.0}/src/dotbrain/hooks.py +0 -0
- {dotbrain-0.6.0 → dotbrain-0.7.0}/src/dotbrain/migrate.py +0 -0
- {dotbrain-0.6.0 → dotbrain-0.7.0}/src/dotbrain/options.py +0 -0
- {dotbrain-0.6.0 → dotbrain-0.7.0}/src/dotbrain/paths.py +0 -0
- {dotbrain-0.6.0 → dotbrain-0.7.0}/src/dotbrain/presentation.py +0 -0
- {dotbrain-0.6.0 → dotbrain-0.7.0}/src/dotbrain/projects.py +0 -0
- {dotbrain-0.6.0 → dotbrain-0.7.0}/src/dotbrain/resource_loader.py +0 -0
- {dotbrain-0.6.0 → dotbrain-0.7.0}/src/dotbrain/resources/__init__.py +0 -0
- {dotbrain-0.6.0 → dotbrain-0.7.0}/src/dotbrain/resources/config.yaml +0 -0
- {dotbrain-0.6.0 → dotbrain-0.7.0}/src/dotbrain/resources/core.yaml +0 -0
- {dotbrain-0.6.0 → dotbrain-0.7.0}/src/dotbrain/resources/site/package-lock.json +0 -0
- {dotbrain-0.6.0 → dotbrain-0.7.0}/src/dotbrain/resources/site/package.json +0 -0
- {dotbrain-0.6.0 → dotbrain-0.7.0}/src/dotbrain/resources/site/vitepress/config.mts +0 -0
- {dotbrain-0.6.0 → dotbrain-0.7.0}/src/dotbrain/resources/site/vitepress/theme/DocsOverview.vue +0 -0
- {dotbrain-0.6.0 → dotbrain-0.7.0}/src/dotbrain/resources/site/vitepress/theme/HomeTiles.vue +0 -0
- {dotbrain-0.6.0 → dotbrain-0.7.0}/src/dotbrain/resources/site/vitepress/theme/LearnOverview.vue +0 -0
- {dotbrain-0.6.0 → dotbrain-0.7.0}/src/dotbrain/resources/site/vitepress/theme/Mermaid.vue +0 -0
- {dotbrain-0.6.0 → dotbrain-0.7.0}/src/dotbrain/resources/site/vitepress/theme/PageStatus.vue +0 -0
- {dotbrain-0.6.0 → dotbrain-0.7.0}/src/dotbrain/resources/site/vitepress/theme/base.ts +0 -0
- {dotbrain-0.6.0 → dotbrain-0.7.0}/src/dotbrain/resources/site/vitepress/theme/custom.css +0 -0
- {dotbrain-0.6.0 → dotbrain-0.7.0}/src/dotbrain/resources/site/vitepress/theme/empty.css +0 -0
- {dotbrain-0.6.0 → dotbrain-0.7.0}/src/dotbrain/resources/site/vitepress/theme/empty.ts +0 -0
- {dotbrain-0.6.0 → dotbrain-0.7.0}/src/dotbrain/resources/site/vitepress/theme/index.ts +0 -0
- {dotbrain-0.6.0 → dotbrain-0.7.0}/src/dotbrain/resources/templates/brain/AGENTS.md +0 -0
- {dotbrain-0.6.0 → dotbrain-0.7.0}/src/dotbrain/resources/templates/brain/adr/README.md +0 -0
- {dotbrain-0.6.0 → dotbrain-0.7.0}/src/dotbrain/resources/templates/brain/designs/README.md +0 -0
- {dotbrain-0.6.0 → dotbrain-0.7.0}/src/dotbrain/resources/templates/brain/docs/README.md +0 -0
- {dotbrain-0.6.0 → dotbrain-0.7.0}/src/dotbrain/resources/templates/brain/project.yaml +0 -0
- {dotbrain-0.6.0 → dotbrain-0.7.0}/src/dotbrain/resources/templates/brain/site/configure.md +0 -0
- {dotbrain-0.6.0 → dotbrain-0.7.0}/src/dotbrain/resources/templates/brain/site/index.md +0 -0
- {dotbrain-0.6.0 → dotbrain-0.7.0}/src/dotbrain/resources/templates/gitignore +0 -0
- {dotbrain-0.6.0 → dotbrain-0.7.0}/src/dotbrain/results.py +0 -0
- {dotbrain-0.6.0 → dotbrain-0.7.0}/src/dotbrain/site.py +0 -0
- {dotbrain-0.6.0 → dotbrain-0.7.0}/src/dotbrain/skills.py +0 -0
- {dotbrain-0.6.0 → dotbrain-0.7.0}/src/dotbrain/subagents.py +0 -0
- {dotbrain-0.6.0 → dotbrain-0.7.0}/src/dotbrain/workflows.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: dotbrain
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.7.0
|
|
4
4
|
Summary: Wires project Brainspaces and skills into coding agents.
|
|
5
5
|
Project-URL: Homepage, https://github.com/arminzou/dotbrain
|
|
6
6
|
Project-URL: Repository, https://github.com/arminzou/dotbrain
|
|
@@ -31,6 +31,8 @@ Description-Content-Type: text/markdown
|
|
|
31
31
|
|
|
32
32
|
# Dotbrain
|
|
33
33
|
|
|
34
|
+
English | [简体中文](README.zh-CN.md)
|
|
35
|
+
|
|
34
36
|
[](https://pypi.org/project/dotbrain/)
|
|
35
37
|
[](https://github.com/arminzou/dotbrain/actions/workflows/ci.yml)
|
|
36
38
|
[](https://pypi.org/project/dotbrain/)
|
|
@@ -39,8 +41,14 @@ Description-Content-Type: text/markdown
|
|
|
39
41
|
|
|
40
42
|
**Private project context for Claude Code and Codex.**
|
|
41
43
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
+
Dotbrain brings the Dotfiles convention to your project work. Keep your working notes, plans,
|
|
45
|
+
instructions, and selected agent resources in a private home, then wire them into the checkouts
|
|
46
|
+
where you work.
|
|
47
|
+
|
|
48
|
+
Your context stays in local files with its own Git history. The CLI connects your workspace to
|
|
49
|
+
the code repo; the plugin's workflow skills guide how your agent uses and maintains it with you.
|
|
50
|
+
|
|
51
|
+
[https://github.com/user-attachments/assets/540e8945-b8bc-4fc1-ac05-c125bf768fa9](https://github.com/user-attachments/assets/021fc13a-db20-4549-8aab-b5240d289bde)
|
|
44
52
|
|
|
45
53
|
[Documentation](https://arminzou.github.io/dotbrain/) ·
|
|
46
54
|
[Getting started](https://arminzou.github.io/dotbrain/getting-started) ·
|
|
@@ -48,20 +56,27 @@ versioned and outside your code repo.
|
|
|
48
56
|
|
|
49
57
|
### Why I built it
|
|
50
58
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
and
|
|
59
|
+
Global agent instructions describe how I want my agent to behave at user level. Shared repository instructions
|
|
60
|
+
describe how anyone should work on the code. My own reasoning, working notes, and plans for a
|
|
61
|
+
particular project need a private home.
|
|
62
|
+
|
|
63
|
+
Mine were scattered across Obsidian, gitignored notes, and agent memory. Finding that context and
|
|
64
|
+
bringing it into another session took effort. So did making my selected skills and subagents
|
|
65
|
+
available in a new checkout. I built Dotbrain to keep that project workspace together and make
|
|
66
|
+
connecting it to where I work repeatable.
|
|
67
|
+
|
|
68
|
+
Read the story behind Dotbrain: [Dotfiles for Your Repo](https://x.com/i/article/2109385521214390273).
|
|
56
69
|
|
|
57
70
|
## Is this for you?
|
|
58
71
|
|
|
59
|
-
Use Dotbrain
|
|
60
|
-
|
|
61
|
-
|
|
72
|
+
Use Dotbrain when you need a private project workspace you want to keep developing across
|
|
73
|
+
agents, sessions, or worktrees: context you've built up, plans in progress, and your own
|
|
74
|
+
instructions and selected skills for the work.
|
|
75
|
+
|
|
76
|
+
It works alongside your agent's memory system and other context tools. The workspace is yours;
|
|
77
|
+
you decide which outcomes belong in shared repository docs or public proposals.
|
|
62
78
|
|
|
63
79
|
If a few standing instructions in `AGENTS.md` or `CLAUDE.md` cover your needs, keep it simple.
|
|
64
|
-
Dotbrain is a local tool, not a hosted team knowledge base.
|
|
65
80
|
|
|
66
81
|
## Get started
|
|
67
82
|
|
|
@@ -99,27 +114,55 @@ the repo to its private Brainspace. Check the result with:
|
|
|
99
114
|
dotbrain doctor
|
|
100
115
|
```
|
|
101
116
|
|
|
102
|
-
Start a fresh agent session in the wired repo to load
|
|
117
|
+
Start a fresh agent session in the wired repo to load the Dotbrain convention. It tells the
|
|
118
|
+
agent where to find your project context and how to work with it.
|
|
103
119
|
See [Getting started](https://arminzou.github.io/dotbrain/getting-started) for manual installation,
|
|
104
120
|
backups, a second machine, and troubleshooting.
|
|
105
121
|
|
|
122
|
+
### Update
|
|
123
|
+
|
|
124
|
+
Update the plugin and the CLI together. In Claude Code, run `/plugin`, update dotbrain from the
|
|
125
|
+
menu, then `/reload-plugins`. In Codex:
|
|
126
|
+
|
|
127
|
+
```bash
|
|
128
|
+
codex plugin marketplace upgrade
|
|
129
|
+
codex plugin add dotbrain@dotbrain
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
Then upgrade the CLI and reconcile your machine and projects:
|
|
133
|
+
|
|
134
|
+
```bash
|
|
135
|
+
uv tool install dotbrain@latest
|
|
136
|
+
dotbrain bootstrap
|
|
137
|
+
dotbrain refresh --all
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
Installed the CLI with pipx or pip? Upgrade with that tool instead. See
|
|
141
|
+
[Staying current](https://arminzou.github.io/dotbrain/getting-started#staying-current).
|
|
142
|
+
|
|
106
143
|
## How it works
|
|
107
144
|
|
|
108
145
|
Each project has a **Brainspace** under your private dotbrain home, by default `~/dotbrain/`.
|
|
109
|
-
It holds the **Brain** (
|
|
110
|
-
|
|
111
|
-
|
|
146
|
+
It holds the **Brain** (`.brain/`: local Markdown files for project rules, vocabulary, decisions,
|
|
147
|
+
and designs) and an **execution store** (`.beads/`: issues tracked with
|
|
148
|
+
[Beads](https://github.com/gastownhall/beads)). Gitignored symlinks make both available through
|
|
149
|
+
the checkout while their files and history stay outside the code repo.
|
|
112
150
|
|
|
113
151
|
<picture>
|
|
114
|
-
<source media="(prefers-color-scheme: dark)" srcset="docs/public/assets/how-it-works-dark.
|
|
115
|
-
<source media="(prefers-color-scheme: light)" srcset="docs/public/assets/how-it-works-light.
|
|
116
|
-
<img src="docs/public/assets/how-it-works-light.
|
|
152
|
+
<source media="(prefers-color-scheme: dark)" srcset="docs/public/assets/how-it-works-dark.png">
|
|
153
|
+
<source media="(prefers-color-scheme: light)" srcset="docs/public/assets/how-it-works-light.png">
|
|
154
|
+
<img src="docs/public/assets/how-it-works-light.png" alt="Claude Code and Codex work in the code repo. Gitignored links connect it to a separate private Brainspace holding the Brain and Beads." width="1000">
|
|
117
155
|
</picture>
|
|
118
156
|
|
|
119
|
-
|
|
120
|
-
and
|
|
121
|
-
|
|
122
|
-
|
|
157
|
+
Wiring also delivers selected skills and subagents into the repo's agent workspaces, `.claude/`
|
|
158
|
+
and `.codex/`. Skills and Claude agents use symlinks; Codex agents use generated, Git-ignored
|
|
159
|
+
TOML files. Wiring a Git worktree connects it to the main checkout's existing Brainspace, so
|
|
160
|
+
both use the same knowledge and tracker.
|
|
161
|
+
|
|
162
|
+
At session start, the plugin hook supplies `DOTBRAIN.md`, the shared convention. The agent then
|
|
163
|
+
reads the project's private rules and retrieves the context the task needs. Workflow skills
|
|
164
|
+
guide how it consults that context and records what you work out together.
|
|
165
|
+
See [Session context](https://arminzou.github.io/dotbrain/session-context) for the loading sequence.
|
|
123
166
|
|
|
124
167
|
Use `dotbrain projects list` to discover registered projects. Inside a wired checkout,
|
|
125
168
|
`dotbrain refresh` maintains that checkout and `dotbrain unwire` detaches it while retaining the
|
|
@@ -138,8 +181,11 @@ See [Architecture](https://arminzou.github.io/dotbrain/architecture),
|
|
|
138
181
|
Every piece of work should leave the next session better informed. Dotbrain's bundled skills
|
|
139
182
|
carry work from idea to implementation, then return what you learned to the project's context.
|
|
140
183
|
|
|
141
|
-
|
|
142
|
-
|
|
184
|
+
<picture>
|
|
185
|
+
<source media="(prefers-color-scheme: dark)" srcset="docs/public/assets/workflow-dark.png">
|
|
186
|
+
<source media="(prefers-color-scheme: light)" srcset="docs/public/assets/workflow-light.png">
|
|
187
|
+
<img src="docs/public/assets/workflow-light.png" alt="Workflow skills guide work through decisions, design, issues, execution, review, and closure. Discoveries update the active design; lasting decisions return to the Brain for the next initiative." width="880">
|
|
188
|
+
</picture>
|
|
143
189
|
|
|
144
190
|
The loop closes in two places:
|
|
145
191
|
|
|
@@ -150,8 +196,8 @@ The loop closes in two places:
|
|
|
150
196
|
vocabulary in the Brain. The next initiative starts with that knowledge already available.
|
|
151
197
|
|
|
152
198
|
The Brain holds durable knowledge, the design holds current intent, and Beads holds execution
|
|
153
|
-
state. Each handoff lives in a document or tracker entry
|
|
154
|
-
|
|
199
|
+
state. Each handoff lives in a document or tracker entry that another session or agent can
|
|
200
|
+
consult to continue the work.
|
|
155
201
|
|
|
156
202
|
You own the success criteria and the final review decision. Use the full loop when work spans
|
|
157
203
|
sessions or carries open questions; small changes can use just the steps they need.
|
|
@@ -8,6 +8,8 @@
|
|
|
8
8
|
|
|
9
9
|
# Dotbrain
|
|
10
10
|
|
|
11
|
+
English | [简体中文](README.zh-CN.md)
|
|
12
|
+
|
|
11
13
|
[](https://pypi.org/project/dotbrain/)
|
|
12
14
|
[](https://github.com/arminzou/dotbrain/actions/workflows/ci.yml)
|
|
13
15
|
[](https://pypi.org/project/dotbrain/)
|
|
@@ -16,8 +18,14 @@
|
|
|
16
18
|
|
|
17
19
|
**Private project context for Claude Code and Codex.**
|
|
18
20
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
+
Dotbrain brings the Dotfiles convention to your project work. Keep your working notes, plans,
|
|
22
|
+
instructions, and selected agent resources in a private home, then wire them into the checkouts
|
|
23
|
+
where you work.
|
|
24
|
+
|
|
25
|
+
Your context stays in local files with its own Git history. The CLI connects your workspace to
|
|
26
|
+
the code repo; the plugin's workflow skills guide how your agent uses and maintains it with you.
|
|
27
|
+
|
|
28
|
+
[https://github.com/user-attachments/assets/540e8945-b8bc-4fc1-ac05-c125bf768fa9](https://github.com/user-attachments/assets/021fc13a-db20-4549-8aab-b5240d289bde)
|
|
21
29
|
|
|
22
30
|
[Documentation](https://arminzou.github.io/dotbrain/) ·
|
|
23
31
|
[Getting started](https://arminzou.github.io/dotbrain/getting-started) ·
|
|
@@ -25,20 +33,27 @@ versioned and outside your code repo.
|
|
|
25
33
|
|
|
26
34
|
### Why I built it
|
|
27
35
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
and
|
|
36
|
+
Global agent instructions describe how I want my agent to behave at user level. Shared repository instructions
|
|
37
|
+
describe how anyone should work on the code. My own reasoning, working notes, and plans for a
|
|
38
|
+
particular project need a private home.
|
|
39
|
+
|
|
40
|
+
Mine were scattered across Obsidian, gitignored notes, and agent memory. Finding that context and
|
|
41
|
+
bringing it into another session took effort. So did making my selected skills and subagents
|
|
42
|
+
available in a new checkout. I built Dotbrain to keep that project workspace together and make
|
|
43
|
+
connecting it to where I work repeatable.
|
|
44
|
+
|
|
45
|
+
Read the story behind Dotbrain: [Dotfiles for Your Repo](https://x.com/i/article/2109385521214390273).
|
|
33
46
|
|
|
34
47
|
## Is this for you?
|
|
35
48
|
|
|
36
|
-
Use Dotbrain
|
|
37
|
-
|
|
38
|
-
|
|
49
|
+
Use Dotbrain when you need a private project workspace you want to keep developing across
|
|
50
|
+
agents, sessions, or worktrees: context you've built up, plans in progress, and your own
|
|
51
|
+
instructions and selected skills for the work.
|
|
52
|
+
|
|
53
|
+
It works alongside your agent's memory system and other context tools. The workspace is yours;
|
|
54
|
+
you decide which outcomes belong in shared repository docs or public proposals.
|
|
39
55
|
|
|
40
56
|
If a few standing instructions in `AGENTS.md` or `CLAUDE.md` cover your needs, keep it simple.
|
|
41
|
-
Dotbrain is a local tool, not a hosted team knowledge base.
|
|
42
57
|
|
|
43
58
|
## Get started
|
|
44
59
|
|
|
@@ -76,27 +91,55 @@ the repo to its private Brainspace. Check the result with:
|
|
|
76
91
|
dotbrain doctor
|
|
77
92
|
```
|
|
78
93
|
|
|
79
|
-
Start a fresh agent session in the wired repo to load
|
|
94
|
+
Start a fresh agent session in the wired repo to load the Dotbrain convention. It tells the
|
|
95
|
+
agent where to find your project context and how to work with it.
|
|
80
96
|
See [Getting started](https://arminzou.github.io/dotbrain/getting-started) for manual installation,
|
|
81
97
|
backups, a second machine, and troubleshooting.
|
|
82
98
|
|
|
99
|
+
### Update
|
|
100
|
+
|
|
101
|
+
Update the plugin and the CLI together. In Claude Code, run `/plugin`, update dotbrain from the
|
|
102
|
+
menu, then `/reload-plugins`. In Codex:
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
codex plugin marketplace upgrade
|
|
106
|
+
codex plugin add dotbrain@dotbrain
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
Then upgrade the CLI and reconcile your machine and projects:
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
uv tool install dotbrain@latest
|
|
113
|
+
dotbrain bootstrap
|
|
114
|
+
dotbrain refresh --all
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
Installed the CLI with pipx or pip? Upgrade with that tool instead. See
|
|
118
|
+
[Staying current](https://arminzou.github.io/dotbrain/getting-started#staying-current).
|
|
119
|
+
|
|
83
120
|
## How it works
|
|
84
121
|
|
|
85
122
|
Each project has a **Brainspace** under your private dotbrain home, by default `~/dotbrain/`.
|
|
86
|
-
It holds the **Brain** (
|
|
87
|
-
|
|
88
|
-
|
|
123
|
+
It holds the **Brain** (`.brain/`: local Markdown files for project rules, vocabulary, decisions,
|
|
124
|
+
and designs) and an **execution store** (`.beads/`: issues tracked with
|
|
125
|
+
[Beads](https://github.com/gastownhall/beads)). Gitignored symlinks make both available through
|
|
126
|
+
the checkout while their files and history stay outside the code repo.
|
|
89
127
|
|
|
90
128
|
<picture>
|
|
91
|
-
<source media="(prefers-color-scheme: dark)" srcset="docs/public/assets/how-it-works-dark.
|
|
92
|
-
<source media="(prefers-color-scheme: light)" srcset="docs/public/assets/how-it-works-light.
|
|
93
|
-
<img src="docs/public/assets/how-it-works-light.
|
|
129
|
+
<source media="(prefers-color-scheme: dark)" srcset="docs/public/assets/how-it-works-dark.png">
|
|
130
|
+
<source media="(prefers-color-scheme: light)" srcset="docs/public/assets/how-it-works-light.png">
|
|
131
|
+
<img src="docs/public/assets/how-it-works-light.png" alt="Claude Code and Codex work in the code repo. Gitignored links connect it to a separate private Brainspace holding the Brain and Beads." width="1000">
|
|
94
132
|
</picture>
|
|
95
133
|
|
|
96
|
-
|
|
97
|
-
and
|
|
98
|
-
|
|
99
|
-
|
|
134
|
+
Wiring also delivers selected skills and subagents into the repo's agent workspaces, `.claude/`
|
|
135
|
+
and `.codex/`. Skills and Claude agents use symlinks; Codex agents use generated, Git-ignored
|
|
136
|
+
TOML files. Wiring a Git worktree connects it to the main checkout's existing Brainspace, so
|
|
137
|
+
both use the same knowledge and tracker.
|
|
138
|
+
|
|
139
|
+
At session start, the plugin hook supplies `DOTBRAIN.md`, the shared convention. The agent then
|
|
140
|
+
reads the project's private rules and retrieves the context the task needs. Workflow skills
|
|
141
|
+
guide how it consults that context and records what you work out together.
|
|
142
|
+
See [Session context](https://arminzou.github.io/dotbrain/session-context) for the loading sequence.
|
|
100
143
|
|
|
101
144
|
Use `dotbrain projects list` to discover registered projects. Inside a wired checkout,
|
|
102
145
|
`dotbrain refresh` maintains that checkout and `dotbrain unwire` detaches it while retaining the
|
|
@@ -115,8 +158,11 @@ See [Architecture](https://arminzou.github.io/dotbrain/architecture),
|
|
|
115
158
|
Every piece of work should leave the next session better informed. Dotbrain's bundled skills
|
|
116
159
|
carry work from idea to implementation, then return what you learned to the project's context.
|
|
117
160
|
|
|
118
|
-
|
|
119
|
-
|
|
161
|
+
<picture>
|
|
162
|
+
<source media="(prefers-color-scheme: dark)" srcset="docs/public/assets/workflow-dark.png">
|
|
163
|
+
<source media="(prefers-color-scheme: light)" srcset="docs/public/assets/workflow-light.png">
|
|
164
|
+
<img src="docs/public/assets/workflow-light.png" alt="Workflow skills guide work through decisions, design, issues, execution, review, and closure. Discoveries update the active design; lasting decisions return to the Brain for the next initiative." width="880">
|
|
165
|
+
</picture>
|
|
120
166
|
|
|
121
167
|
The loop closes in two places:
|
|
122
168
|
|
|
@@ -127,8 +173,8 @@ The loop closes in two places:
|
|
|
127
173
|
vocabulary in the Brain. The next initiative starts with that knowledge already available.
|
|
128
174
|
|
|
129
175
|
The Brain holds durable knowledge, the design holds current intent, and Beads holds execution
|
|
130
|
-
state. Each handoff lives in a document or tracker entry
|
|
131
|
-
|
|
176
|
+
state. Each handoff lives in a document or tracker entry that another session or agent can
|
|
177
|
+
consult to continue the work.
|
|
132
178
|
|
|
133
179
|
You own the success criteria and the final review decision. Use the full loop when work spans
|
|
134
180
|
sessions or carries open questions; small changes can use just the steps they need.
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import { defineConfig } from 'vitepress'
|
|
2
|
+
|
|
3
|
+
export default defineConfig({
|
|
4
|
+
title: 'Dotbrain',
|
|
5
|
+
description: 'Private project context for coding agents, kept out of your code repo.',
|
|
6
|
+
base: '/',
|
|
7
|
+
cleanUrls: true,
|
|
8
|
+
lastUpdated: true,
|
|
9
|
+
// README.md is the index for browsing docs/ on GitHub, and AGENTS.md/CLAUDE.md guide agents
|
|
10
|
+
// editing docs/; index.md is the site's home.
|
|
11
|
+
srcExclude: ['README.md', 'AGENTS.md', 'CLAUDE.md'],
|
|
12
|
+
head: [
|
|
13
|
+
['link', { rel: 'icon', type: 'image/png', sizes: '32x32', href: '/assets/favicon-light-32.png' }],
|
|
14
|
+
['link', { rel: 'icon', type: 'image/png', sizes: '32x32', href: '/assets/favicon-light-32.png', media: '(prefers-color-scheme: light)' }],
|
|
15
|
+
['link', { rel: 'icon', type: 'image/png', sizes: '32x32', href: '/assets/favicon-dark-32.png', media: '(prefers-color-scheme: dark)' }],
|
|
16
|
+
['link', { rel: 'apple-touch-icon', sizes: '180x180', href: '/assets/apple-touch-icon-light.png' }],
|
|
17
|
+
['meta', { property: 'og:site_name', content: 'Dotbrain' }],
|
|
18
|
+
['meta', { property: 'og:type', content: 'website' }],
|
|
19
|
+
['meta', { property: 'og:image', content: 'https://dotbrain.net/assets/banner-dark.png' }],
|
|
20
|
+
['meta', { property: 'og:image:width', content: '1672' }],
|
|
21
|
+
['meta', { property: 'og:image:height', content: '941' }],
|
|
22
|
+
['meta', { property: 'og:image:alt', content: 'Dotbrain connected brain mark and wordmark' }],
|
|
23
|
+
['meta', { name: 'twitter:card', content: 'summary_large_image' }],
|
|
24
|
+
['meta', { name: 'twitter:image', content: 'https://dotbrain.net/assets/banner-dark.png' }],
|
|
25
|
+
['meta', { name: 'twitter:image:alt', content: 'Dotbrain connected brain mark and wordmark' }],
|
|
26
|
+
],
|
|
27
|
+
// English stays at the root so existing URLs keep working; zh/ mirrors its file names.
|
|
28
|
+
locales: {
|
|
29
|
+
root: { label: 'English', lang: 'en-US' },
|
|
30
|
+
zh: {
|
|
31
|
+
label: '简体中文',
|
|
32
|
+
lang: 'zh-CN',
|
|
33
|
+
link: '/zh/',
|
|
34
|
+
description: '为 Coding Agent 提供私有的项目上下文,不放进公开代码仓库。',
|
|
35
|
+
themeConfig: {
|
|
36
|
+
nav: [
|
|
37
|
+
{ text: '指南', link: '/zh/getting-started', activeMatch: '^/zh/(why-dotbrain|getting-started|prompts|agent-team|architecture|workflow|learning|wiring|session-context|beads-backend|brain-site|troubleshooting)' },
|
|
38
|
+
{ text: '参考', link: '/zh/cli-reference', activeMatch: '^/zh/(cli-reference|configuration|skills|glossary)' },
|
|
39
|
+
{ text: 'PyPI', link: 'https://pypi.org/project/dotbrain/' },
|
|
40
|
+
],
|
|
41
|
+
sidebar: [
|
|
42
|
+
{
|
|
43
|
+
text: '指南',
|
|
44
|
+
items: [
|
|
45
|
+
{ text: '为什么用 Dotbrain?', link: '/zh/why-dotbrain' },
|
|
46
|
+
{ text: '快速开始', link: '/zh/getting-started' },
|
|
47
|
+
{ text: '示例提示词', link: '/zh/prompts' },
|
|
48
|
+
],
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
text: '使用场景',
|
|
52
|
+
items: [
|
|
53
|
+
{ text: '开发项目', link: '/zh/workflow' },
|
|
54
|
+
{ text: '和 Agent 团队一起工作', link: '/zh/agent-team' },
|
|
55
|
+
{ text: '学习项目', link: '/zh/learning' },
|
|
56
|
+
{ text: '浏览 Brain', link: '/zh/brain-site' },
|
|
57
|
+
],
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
text: '工作原理',
|
|
61
|
+
items: [
|
|
62
|
+
{ text: '架构', link: '/zh/architecture' },
|
|
63
|
+
{ text: '项目连接', link: '/zh/wiring' },
|
|
64
|
+
{ text: '会话上下文', link: '/zh/session-context' },
|
|
65
|
+
{ text: 'Beads 后端', link: '/zh/beads-backend' },
|
|
66
|
+
],
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
text: '帮助',
|
|
70
|
+
items: [{ text: '故障排查与常见问题', link: '/zh/troubleshooting' }],
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
text: '参考',
|
|
74
|
+
items: [
|
|
75
|
+
{ text: 'CLI 参考', link: '/zh/cli-reference' },
|
|
76
|
+
{ text: '配置', link: '/zh/configuration' },
|
|
77
|
+
{ text: 'Brain 站点配置', link: '/zh/brain-site-configuration' },
|
|
78
|
+
{ text: '技能', link: '/zh/skills' },
|
|
79
|
+
{ text: '术语表', link: '/zh/glossary' },
|
|
80
|
+
],
|
|
81
|
+
},
|
|
82
|
+
],
|
|
83
|
+
outline: { level: [2, 3], label: '本页目录' },
|
|
84
|
+
editLink: {
|
|
85
|
+
pattern: 'https://github.com/arminzou/dotbrain/edit/main/docs/:path',
|
|
86
|
+
text: '在 GitHub 上编辑此页',
|
|
87
|
+
},
|
|
88
|
+
docFooter: { prev: '上一页', next: '下一页' },
|
|
89
|
+
lastUpdated: { text: '最后更新' },
|
|
90
|
+
langMenuLabel: '切换语言',
|
|
91
|
+
returnToTopLabel: '回到顶部',
|
|
92
|
+
sidebarMenuLabel: '菜单',
|
|
93
|
+
darkModeSwitchLabel: '外观',
|
|
94
|
+
lightModeSwitchTitle: '切换到浅色模式',
|
|
95
|
+
darkModeSwitchTitle: '切换到深色模式',
|
|
96
|
+
footer: { message: '基于 MIT 许可证发布。' },
|
|
97
|
+
},
|
|
98
|
+
},
|
|
99
|
+
},
|
|
100
|
+
transformHead: ({ title, description }) => [
|
|
101
|
+
['meta', { property: 'og:title', content: title }],
|
|
102
|
+
['meta', { property: 'og:description', content: description }],
|
|
103
|
+
],
|
|
104
|
+
|
|
105
|
+
markdown: {
|
|
106
|
+
theme: { light: 'github-light', dark: 'github-dark' },
|
|
107
|
+
// A ```mermaid fence becomes the theme's <Mermaid> component, which draws it in the browser.
|
|
108
|
+
config(md) {
|
|
109
|
+
const fence = md.renderer.rules.fence!
|
|
110
|
+
md.renderer.rules.fence = (tokens, index, ...rest) =>
|
|
111
|
+
tokens[index].info.trim() === 'mermaid'
|
|
112
|
+
? `<Mermaid code="${encodeURIComponent(tokens[index].content)}" />`
|
|
113
|
+
: fence(tokens, index, ...rest)
|
|
114
|
+
},
|
|
115
|
+
},
|
|
116
|
+
|
|
117
|
+
themeConfig: {
|
|
118
|
+
logo: {
|
|
119
|
+
light: { src: '/assets/mark-light.png', width: 24, height: 24 },
|
|
120
|
+
dark: { src: '/assets/mark-dark.png', width: 24, height: 24 },
|
|
121
|
+
alt: 'Dotbrain',
|
|
122
|
+
},
|
|
123
|
+
nav: [
|
|
124
|
+
{ text: 'Guide', link: '/getting-started', activeMatch: '^/(why-dotbrain|getting-started|prompts|agent-team|architecture|workflow|learning|wiring|session-context|beads-backend|brain-site|troubleshooting)' },
|
|
125
|
+
{ text: 'Reference', link: '/cli-reference', activeMatch: '^/(cli-reference|configuration|skills|glossary)' },
|
|
126
|
+
{ text: 'PyPI', link: 'https://pypi.org/project/dotbrain/' },
|
|
127
|
+
],
|
|
128
|
+
sidebar: [
|
|
129
|
+
{
|
|
130
|
+
text: 'Guide',
|
|
131
|
+
items: [
|
|
132
|
+
{ text: 'Why Dotbrain?', link: '/why-dotbrain' },
|
|
133
|
+
{ text: 'Getting started', link: '/getting-started' },
|
|
134
|
+
{ text: 'Example prompts', link: '/prompts' },
|
|
135
|
+
],
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
text: 'Use cases',
|
|
139
|
+
items: [
|
|
140
|
+
{ text: 'Develop a project', link: '/workflow' },
|
|
141
|
+
{ text: 'Work with an agent team', link: '/agent-team' },
|
|
142
|
+
{ text: 'Learn your project', link: '/learning' },
|
|
143
|
+
{ text: 'Browse the Brain', link: '/brain-site' },
|
|
144
|
+
],
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
text: 'How it works',
|
|
148
|
+
items: [
|
|
149
|
+
{ text: 'Architecture', link: '/architecture' },
|
|
150
|
+
{ text: 'Wiring', link: '/wiring' },
|
|
151
|
+
{ text: 'Session context', link: '/session-context' },
|
|
152
|
+
{ text: 'Beads backend', link: '/beads-backend' },
|
|
153
|
+
],
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
text: 'Help',
|
|
157
|
+
items: [{ text: 'Troubleshooting & FAQ', link: '/troubleshooting' }],
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
text: 'Reference',
|
|
161
|
+
items: [
|
|
162
|
+
{ text: 'CLI reference', link: '/cli-reference' },
|
|
163
|
+
{ text: 'Configuration', link: '/configuration' },
|
|
164
|
+
{ text: 'Brain site configuration', link: '/brain-site-configuration' },
|
|
165
|
+
{ text: 'Skills', link: '/skills' },
|
|
166
|
+
{ text: 'Glossary', link: '/glossary' },
|
|
167
|
+
],
|
|
168
|
+
},
|
|
169
|
+
],
|
|
170
|
+
outline: { level: [2, 3], label: 'On this page' },
|
|
171
|
+
search: { provider: 'local' },
|
|
172
|
+
socialLinks: [{ icon: 'github', link: 'https://github.com/arminzou/dotbrain' }],
|
|
173
|
+
editLink: {
|
|
174
|
+
pattern: 'https://github.com/arminzou/dotbrain/edit/main/docs/:path',
|
|
175
|
+
text: 'Edit this page on GitHub',
|
|
176
|
+
},
|
|
177
|
+
footer: { message: 'Released under the MIT License.' },
|
|
178
|
+
},
|
|
179
|
+
})
|
|
@@ -16,6 +16,12 @@ npm run build # must pass before a push
|
|
|
16
16
|
- `configuration.md` is tested: `tests/test_configuration_docs.py` loads the first YAML block under
|
|
17
17
|
``## `config.yaml` `` and ``## `project.yaml` `` through the real config loader. Keep those
|
|
18
18
|
headings exact, keep the fences plain ```` ```yaml ````, and keep every key the test reads.
|
|
19
|
+
- `zh/` holds the Simplified Chinese pages, one per English page with the same file name. They are
|
|
20
|
+
hand-maintained, best effort: write natural Chinese, keep commands, code, diagrams and terms
|
|
21
|
+
developers know in English (Agent, Coding Agent, PR, worktree, checkout) as is. When translating a
|
|
22
|
+
heading that is a link target, keep the English slug with `{#english-slug}`. `zh/cli-reference.md`
|
|
23
|
+
is a hand translation, not generated. Chinese nav and sidebar live under `locales.zh` in
|
|
24
|
+
`.vitepress/config.mts`.
|
|
19
25
|
- Name a code block's file in a `# path` comment on its first line. A `[title]` after the language
|
|
20
26
|
only renders inside a `::: code-group`.
|
|
21
27
|
- Use `::: code-group` for alternatives (Claude Code / Codex, macOS / Windows, uv / pipx).
|
|
@@ -7,10 +7,12 @@ fine on GitHub.
|
|
|
7
7
|
|
|
8
8
|
- [why-dotbrain.md](why-dotbrain.md) — candid comparisons, trade-offs, and when to skip it.
|
|
9
9
|
- [getting-started.md](getting-started.md) — install, wire a repo, and verify the result.
|
|
10
|
+
- [prompts.md](prompts.md) — example prompts for each common job, and the skill each triggers.
|
|
10
11
|
|
|
11
12
|
## Use Cases
|
|
12
13
|
|
|
13
14
|
- [workflow.md](workflow.md) — develop a project from first idea to closed design, one skill per step.
|
|
15
|
+
- [agent-team.md](agent-team.md) — HITL and handoff, sequential and parallel work, and packaged subagents.
|
|
14
16
|
- [learning.md](learning.md) — learn across sessions, park concepts, and capture demonstrated understanding.
|
|
15
17
|
- [brain-site.md](brain-site.md) — read, search, and navigate the private Brain.
|
|
16
18
|
|