dotbrain 0.4.4__tar.gz → 0.4.6__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.4.4 → dotbrain-0.4.6}/PKG-INFO +1 -1
- {dotbrain-0.4.4 → dotbrain-0.4.6}/README.md +4 -0
- {dotbrain-0.4.4 → dotbrain-0.4.6}/docs/cli-reference.md +83 -0
- {dotbrain-0.4.4 → dotbrain-0.4.6}/docs/skills.md +11 -0
- {dotbrain-0.4.4 → dotbrain-0.4.6}/pyproject.toml +1 -1
- {dotbrain-0.4.4 → dotbrain-0.4.6}/src/dotbrain/__init__.py +1 -1
- {dotbrain-0.4.4 → dotbrain-0.4.6}/src/dotbrain/brainspaces.py +7 -1
- {dotbrain-0.4.4 → dotbrain-0.4.6}/src/dotbrain/cli.py +63 -1
- {dotbrain-0.4.4 → dotbrain-0.4.6}/src/dotbrain/doctor.py +17 -1
- dotbrain-0.4.6/src/dotbrain/resources/site/package-lock.json +3272 -0
- dotbrain-0.4.6/src/dotbrain/resources/site/package.json +11 -0
- dotbrain-0.4.6/src/dotbrain/resources/site/vitepress/config.mts +90 -0
- dotbrain-0.4.6/src/dotbrain/resources/site/vitepress/theme/DocsOverview.vue +11 -0
- dotbrain-0.4.6/src/dotbrain/resources/site/vitepress/theme/HomeTiles.vue +35 -0
- dotbrain-0.4.6/src/dotbrain/resources/site/vitepress/theme/LearnOverview.vue +12 -0
- dotbrain-0.4.6/src/dotbrain/resources/site/vitepress/theme/Mermaid.vue +96 -0
- dotbrain-0.4.6/src/dotbrain/resources/site/vitepress/theme/PageStatus.vue +24 -0
- dotbrain-0.4.6/src/dotbrain/resources/site/vitepress/theme/base.ts +21 -0
- dotbrain-0.4.6/src/dotbrain/resources/site/vitepress/theme/custom.css +317 -0
- dotbrain-0.4.6/src/dotbrain/resources/site/vitepress/theme/empty.css +1 -0
- dotbrain-0.4.6/src/dotbrain/resources/site/vitepress/theme/empty.ts +2 -0
- dotbrain-0.4.6/src/dotbrain/resources/site/vitepress/theme/index.ts +18 -0
- {dotbrain-0.4.4 → dotbrain-0.4.6}/src/dotbrain/resources/templates/brain/DOTBRAIN.md +7 -0
- dotbrain-0.4.6/src/dotbrain/resources/templates/brain/site/configure.md +108 -0
- dotbrain-0.4.6/src/dotbrain/resources/templates/brain/site/index.md +7 -0
- dotbrain-0.4.6/src/dotbrain/site.py +610 -0
- {dotbrain-0.4.4 → dotbrain-0.4.6}/.gitignore +0 -0
- {dotbrain-0.4.4 → dotbrain-0.4.6}/LICENSE +0 -0
- {dotbrain-0.4.4 → dotbrain-0.4.6}/docs/README.md +0 -0
- {dotbrain-0.4.4 → dotbrain-0.4.6}/docs/architecture.md +0 -0
- {dotbrain-0.4.4 → dotbrain-0.4.6}/docs/beads-backend.md +0 -0
- {dotbrain-0.4.4 → dotbrain-0.4.6}/docs/configuration.md +0 -0
- {dotbrain-0.4.4 → dotbrain-0.4.6}/docs/getting-started.md +0 -0
- {dotbrain-0.4.4 → dotbrain-0.4.6}/docs/glossary.md +0 -0
- {dotbrain-0.4.4 → dotbrain-0.4.6}/docs/wiring.md +0 -0
- {dotbrain-0.4.4 → dotbrain-0.4.6}/src/dotbrain/_cli_reference.py +0 -0
- {dotbrain-0.4.4 → dotbrain-0.4.6}/src/dotbrain/adopter_repos.py +0 -0
- {dotbrain-0.4.4 → dotbrain-0.4.6}/src/dotbrain/beads.py +0 -0
- {dotbrain-0.4.4 → dotbrain-0.4.6}/src/dotbrain/bootstrap.py +0 -0
- {dotbrain-0.4.4 → dotbrain-0.4.6}/src/dotbrain/config.py +0 -0
- {dotbrain-0.4.4 → dotbrain-0.4.6}/src/dotbrain/hooks.py +0 -0
- {dotbrain-0.4.4 → dotbrain-0.4.6}/src/dotbrain/migrate.py +0 -0
- {dotbrain-0.4.4 → dotbrain-0.4.6}/src/dotbrain/paths.py +0 -0
- {dotbrain-0.4.4 → dotbrain-0.4.6}/src/dotbrain/resource_loader.py +0 -0
- {dotbrain-0.4.4 → dotbrain-0.4.6}/src/dotbrain/resources/__init__.py +0 -0
- {dotbrain-0.4.4 → dotbrain-0.4.6}/src/dotbrain/resources/agents/claude/implementer.md +0 -0
- {dotbrain-0.4.4 → dotbrain-0.4.6}/src/dotbrain/resources/agents/claude/investigator.md +0 -0
- {dotbrain-0.4.4 → dotbrain-0.4.6}/src/dotbrain/resources/agents/claude/reviewer.md +0 -0
- {dotbrain-0.4.4 → dotbrain-0.4.6}/src/dotbrain/resources/agents/claude/verifier.md +0 -0
- {dotbrain-0.4.4 → dotbrain-0.4.6}/src/dotbrain/resources/agents/codex/implementer.toml +0 -0
- {dotbrain-0.4.4 → dotbrain-0.4.6}/src/dotbrain/resources/agents/codex/investigator.toml +0 -0
- {dotbrain-0.4.4 → dotbrain-0.4.6}/src/dotbrain/resources/agents/codex/reviewer.toml +0 -0
- {dotbrain-0.4.4 → dotbrain-0.4.6}/src/dotbrain/resources/agents/codex/verifier.toml +0 -0
- {dotbrain-0.4.4 → dotbrain-0.4.6}/src/dotbrain/resources/config.yaml +0 -0
- {dotbrain-0.4.4 → dotbrain-0.4.6}/src/dotbrain/resources/core.yaml +0 -0
- {dotbrain-0.4.4 → dotbrain-0.4.6}/src/dotbrain/resources/templates/brain/AGENTS.md +0 -0
- {dotbrain-0.4.4 → dotbrain-0.4.6}/src/dotbrain/resources/templates/brain/adr/README.md +0 -0
- {dotbrain-0.4.4 → dotbrain-0.4.6}/src/dotbrain/resources/templates/brain/designs/README.md +0 -0
- {dotbrain-0.4.4 → dotbrain-0.4.6}/src/dotbrain/resources/templates/brain/docs/README.md +0 -0
- {dotbrain-0.4.4 → dotbrain-0.4.6}/src/dotbrain/resources/templates/brain/project.yaml +0 -0
- {dotbrain-0.4.4 → dotbrain-0.4.6}/src/dotbrain/resources/templates/gitignore +0 -0
- {dotbrain-0.4.4 → dotbrain-0.4.6}/src/dotbrain/skills.py +0 -0
- {dotbrain-0.4.4 → dotbrain-0.4.6}/src/dotbrain/subagents.py +0 -0
- {dotbrain-0.4.4 → dotbrain-0.4.6}/src/dotbrain/workflows.py +0 -0
|
@@ -153,6 +153,10 @@ automatically at session start and are available as slash commands.
|
|
|
153
153
|
accepted work to private execution items.
|
|
154
154
|
- **`write-agent-docs`** — write public project docs, private Brain material, and user-owned
|
|
155
155
|
skills so agents retrieve and follow them predictably.
|
|
156
|
+
- **`brain-site`** — give a Brain a private site with `dotbrain site`, and keep its sidebar and
|
|
157
|
+
theme.
|
|
158
|
+
- **`teach-me`** — learn your own project from its Brain over many sessions, with learning records
|
|
159
|
+
and lessons kept in `.brain/learning/`.
|
|
156
160
|
|
|
157
161
|
See [docs/skills.md](docs/skills.md) for the full set.
|
|
158
162
|
|
|
@@ -32,6 +32,7 @@ Reference for the public `dotbrain` CLI.
|
|
|
32
32
|
│ agents Link dotbrain vendor-native subagents into agent runtimes. │
|
|
33
33
|
│ beads Manage beads tracker state and backend. │
|
|
34
34
|
│ hook Run dotbrain hook entrypoints. │
|
|
35
|
+
│ site Set up and run a Brain's private site. │
|
|
35
36
|
└──────────────────────────────────────────────────────────────────────────────┘
|
|
36
37
|
```
|
|
37
38
|
|
|
@@ -277,6 +278,88 @@ Reference for the public `dotbrain` CLI.
|
|
|
277
278
|
└──────────────────────────────────────────────────────────────────────────────┘
|
|
278
279
|
```
|
|
279
280
|
|
|
281
|
+
## `dotbrain site`
|
|
282
|
+
|
|
283
|
+
```text
|
|
284
|
+
|
|
285
|
+
Usage: dotbrain site [OPTIONS] COMMAND [ARGS]...
|
|
286
|
+
|
|
287
|
+
Set up and run a Brain's private site.
|
|
288
|
+
|
|
289
|
+
┌─ Options ────────────────────────────────────────────────────────────────────┐
|
|
290
|
+
│ --help -h Show this message and exit. │
|
|
291
|
+
└──────────────────────────────────────────────────────────────────────────────┘
|
|
292
|
+
┌─ Commands ───────────────────────────────────────────────────────────────────┐
|
|
293
|
+
│ init Give a Brain a site: create .brain/site/ with site.yaml, the home │
|
|
294
|
+
│ page, and the manual. │
|
|
295
|
+
│ dev Serve the Brain site locally with live reload (127.0.0.1). │
|
|
296
|
+
│ build Build the Brain site; fails on a nav link to a missing page. │
|
|
297
|
+
│ preview Serve the last build locally (127.0.0.1). │
|
|
298
|
+
└──────────────────────────────────────────────────────────────────────────────┘
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
## `dotbrain site build`
|
|
302
|
+
|
|
303
|
+
```text
|
|
304
|
+
|
|
305
|
+
Usage: dotbrain site build [OPTIONS]
|
|
306
|
+
|
|
307
|
+
Build the Brain site; fails on a nav link to a missing page.
|
|
308
|
+
|
|
309
|
+
┌─ Options ────────────────────────────────────────────────────────────────────┐
|
|
310
|
+
│ --name TEXT Brainspace name. Defaults to the current repo's │
|
|
311
|
+
│ .brain. │
|
|
312
|
+
│ --help -h Show this message and exit. │
|
|
313
|
+
└──────────────────────────────────────────────────────────────────────────────┘
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
## `dotbrain site dev`
|
|
317
|
+
|
|
318
|
+
```text
|
|
319
|
+
|
|
320
|
+
Usage: dotbrain site dev [OPTIONS]
|
|
321
|
+
|
|
322
|
+
Serve the Brain site locally with live reload (127.0.0.1).
|
|
323
|
+
|
|
324
|
+
┌─ Options ────────────────────────────────────────────────────────────────────┐
|
|
325
|
+
│ --name TEXT Brainspace name. Defaults to the current repo's │
|
|
326
|
+
│ .brain. │
|
|
327
|
+
│ --help -h Show this message and exit. │
|
|
328
|
+
└──────────────────────────────────────────────────────────────────────────────┘
|
|
329
|
+
```
|
|
330
|
+
|
|
331
|
+
## `dotbrain site init`
|
|
332
|
+
|
|
333
|
+
```text
|
|
334
|
+
|
|
335
|
+
Usage: dotbrain site init [OPTIONS]
|
|
336
|
+
|
|
337
|
+
Give a Brain a site: create .brain/site/ with site.yaml, the home page, and
|
|
338
|
+
the manual.
|
|
339
|
+
|
|
340
|
+
┌─ Options ────────────────────────────────────────────────────────────────────┐
|
|
341
|
+
│ --name TEXT Brainspace name. Defaults to the current repo's │
|
|
342
|
+
│ .brain. │
|
|
343
|
+
│ --title TEXT Site title. Defaults to '<name> Brain'. │
|
|
344
|
+
│ --help -h Show this message and exit. │
|
|
345
|
+
└──────────────────────────────────────────────────────────────────────────────┘
|
|
346
|
+
```
|
|
347
|
+
|
|
348
|
+
## `dotbrain site preview`
|
|
349
|
+
|
|
350
|
+
```text
|
|
351
|
+
|
|
352
|
+
Usage: dotbrain site preview [OPTIONS]
|
|
353
|
+
|
|
354
|
+
Serve the last build locally (127.0.0.1).
|
|
355
|
+
|
|
356
|
+
┌─ Options ────────────────────────────────────────────────────────────────────┐
|
|
357
|
+
│ --name TEXT Brainspace name. Defaults to the current repo's │
|
|
358
|
+
│ .brain. │
|
|
359
|
+
│ --help -h Show this message and exit. │
|
|
360
|
+
└──────────────────────────────────────────────────────────────────────────────┘
|
|
361
|
+
```
|
|
362
|
+
|
|
280
363
|
## `dotbrain skills`
|
|
281
364
|
|
|
282
365
|
```text
|
|
@@ -50,6 +50,17 @@ Skill linking is operator-managed:
|
|
|
50
50
|
- **`write-agent-docs`** — writing discipline for public project docs, private Brain material,
|
|
51
51
|
user-owned skills, and guidance agents reach through pointers
|
|
52
52
|
|
|
53
|
+
## Brain Site
|
|
54
|
+
|
|
55
|
+
- **`brain-site`** — set up, maintain, and build a Brain's private site with `dotbrain site`: arrange
|
|
56
|
+
the sidebar, preview, fix a failed build, and write pages with VitePress and Mermaid syntax
|
|
57
|
+
|
|
58
|
+
## Learning
|
|
59
|
+
|
|
60
|
+
- **`teach-me`** — teach the operator their project from its Brain over many sessions: explain in
|
|
61
|
+
conversation, walk a learning path tracked as a `learn:` bead, record what was demonstrated, and
|
|
62
|
+
capture approved lessons into `.brain/learning/`
|
|
63
|
+
|
|
53
64
|
## Installing Them
|
|
54
65
|
|
|
55
66
|
The skills arrive with the plugin, installed once per agent runtime rather than per repo. See
|
|
@@ -45,6 +45,9 @@ def seed_brain(brainspace: Path, dotbrain_home: Path) -> None:
|
|
|
45
45
|
``DOTBRAIN.md`` and ``README.md`` files are dotbrain-owned and overwritten
|
|
46
46
|
so package template changes propagate. All other files, including
|
|
47
47
|
``project.yaml``, are project-owned and are only written when missing.
|
|
48
|
+
``site/`` is never seeded: having it opts a Brain into a Brain site, so only
|
|
49
|
+
``dotbrain site init`` writes it. In a Brain that has a site, the dotbrain-owned
|
|
50
|
+
``site/configure.md`` manual is refreshed like ``DOTBRAIN.md``.
|
|
48
51
|
"""
|
|
49
52
|
|
|
50
53
|
brain = Path(brainspace) / ".brain"
|
|
@@ -54,9 +57,12 @@ def seed_brain(brainspace: Path, dotbrain_home: Path) -> None:
|
|
|
54
57
|
raise FileNotFoundError("package resource templates/brain/AGENTS.md is missing")
|
|
55
58
|
|
|
56
59
|
for rel, src in resource_loader.iter_resource_files("templates/brain"):
|
|
60
|
+
site_manual = rel.as_posix() == "site/configure.md"
|
|
61
|
+
if rel.parts[0] == "site" and not (site_manual and (brain / "site").is_dir()):
|
|
62
|
+
continue
|
|
57
63
|
dest = brain / rel
|
|
58
64
|
dest.parent.mkdir(parents=True, exist_ok=True)
|
|
59
|
-
if src.name not in ("DOTBRAIN.md", "README.md") and dest.exists():
|
|
65
|
+
if src.name not in ("DOTBRAIN.md", "README.md") and not site_manual and dest.exists():
|
|
60
66
|
continue
|
|
61
67
|
content = src.read_text(encoding="utf-8")
|
|
62
68
|
if dest.is_file() and dest.read_bytes() == content.encode("utf-8"):
|
|
@@ -13,7 +13,7 @@ import typer
|
|
|
13
13
|
|
|
14
14
|
from dotbrain import __version__
|
|
15
15
|
from dotbrain import doctor as doctor_mod
|
|
16
|
-
from dotbrain import adopter_repos, beads as beads_mod, bootstrap as bootstrap_mod, config, brainspaces, hooks, migrate, paths, resource_loader, skills, subagents, workflows
|
|
16
|
+
from dotbrain import adopter_repos, beads as beads_mod, bootstrap as bootstrap_mod, config, brainspaces, hooks, migrate, paths, resource_loader, site as site_mod, skills, subagents, workflows
|
|
17
17
|
|
|
18
18
|
app = typer.Typer(
|
|
19
19
|
help="dotbrain CLI for wiring project Brainspaces and skills into coding agents.",
|
|
@@ -25,10 +25,12 @@ skills_app = typer.Typer(help="Link dotbrain skills into agent runtimes.", no_ar
|
|
|
25
25
|
agents_app = typer.Typer(help="Link dotbrain vendor-native subagents into agent runtimes.", no_args_is_help=True)
|
|
26
26
|
beads_app = typer.Typer(help="Manage beads tracker state and backend.", no_args_is_help=True)
|
|
27
27
|
hook_app = typer.Typer(help="Run dotbrain hook entrypoints.", no_args_is_help=True)
|
|
28
|
+
site_app = typer.Typer(help="Set up and run a Brain's private site.", no_args_is_help=True)
|
|
28
29
|
app.add_typer(skills_app, name="skills")
|
|
29
30
|
app.add_typer(agents_app, name="agents")
|
|
30
31
|
app.add_typer(beads_app, name="beads")
|
|
31
32
|
app.add_typer(hook_app, name="hook")
|
|
33
|
+
app.add_typer(site_app, name="site")
|
|
32
34
|
|
|
33
35
|
|
|
34
36
|
@app.callback()
|
|
@@ -699,3 +701,63 @@ def _render_global_agent_link(root: Path, target: str) -> None:
|
|
|
699
701
|
typer.echo(f"agent-link: warning: {warning}", err=True)
|
|
700
702
|
for line in result.logs:
|
|
701
703
|
typer.echo(line if line.startswith("global:") else f" {line}")
|
|
704
|
+
|
|
705
|
+
|
|
706
|
+
_SITE_NAME = typer.Option(None, "--name", help="Brainspace name. Defaults to the current repo's .brain.")
|
|
707
|
+
|
|
708
|
+
|
|
709
|
+
def _site_brain(name: Optional[str]) -> tuple[Path, Path]:
|
|
710
|
+
root = paths.resolve_dotbrain_home()
|
|
711
|
+
try:
|
|
712
|
+
return root, site_mod.find_brain(root, name)
|
|
713
|
+
except site_mod.SiteError as exc:
|
|
714
|
+
typer.echo(f"site: {exc}", err=True)
|
|
715
|
+
raise typer.Exit(1)
|
|
716
|
+
|
|
717
|
+
|
|
718
|
+
@site_app.command("init")
|
|
719
|
+
def site_init(
|
|
720
|
+
name: Optional[str] = _SITE_NAME,
|
|
721
|
+
title: Optional[str] = typer.Option(None, "--title", help="Site title. Defaults to '<name> Brain'."),
|
|
722
|
+
) -> None:
|
|
723
|
+
"""Give a Brain a site: create .brain/site/ with site.yaml, the home page, and the manual."""
|
|
724
|
+
_, brain = _site_brain(name)
|
|
725
|
+
created = site_mod.init(brain, title)
|
|
726
|
+
for path in created:
|
|
727
|
+
typer.echo(f"site: created {path}")
|
|
728
|
+
if site_mod.site_settings_file(brain) in created:
|
|
729
|
+
typer.echo(
|
|
730
|
+
"site: every docs/ page is in the sidebar; trim or regroup it in site.yaml, then run "
|
|
731
|
+
"`dotbrain site dev`. .brain/site/configure.md, the home page's Configure this site button, explains the settings."
|
|
732
|
+
)
|
|
733
|
+
if not created:
|
|
734
|
+
typer.echo("site: already set up; nothing changed")
|
|
735
|
+
|
|
736
|
+
|
|
737
|
+
def _site_run(command: str, name: Optional[str]) -> None:
|
|
738
|
+
root, brain = _site_brain(name)
|
|
739
|
+
try:
|
|
740
|
+
out = site_mod.run_site(command, dotbrain_home=root, brain=brain)
|
|
741
|
+
except site_mod.SiteError as exc:
|
|
742
|
+
typer.echo(f"site: {exc}", err=True)
|
|
743
|
+
raise typer.Exit(1)
|
|
744
|
+
if command == "build":
|
|
745
|
+
typer.echo(f"site: built {brain.parent.name} into {out}")
|
|
746
|
+
|
|
747
|
+
|
|
748
|
+
@site_app.command("dev")
|
|
749
|
+
def site_dev(name: Optional[str] = _SITE_NAME) -> None:
|
|
750
|
+
"""Serve the Brain site locally with live reload (127.0.0.1)."""
|
|
751
|
+
_site_run("dev", name)
|
|
752
|
+
|
|
753
|
+
|
|
754
|
+
@site_app.command("build")
|
|
755
|
+
def site_build(name: Optional[str] = _SITE_NAME) -> None:
|
|
756
|
+
"""Build the Brain site; fails on a nav link to a missing page."""
|
|
757
|
+
_site_run("build", name)
|
|
758
|
+
|
|
759
|
+
|
|
760
|
+
@site_app.command("preview")
|
|
761
|
+
def site_preview(name: Optional[str] = _SITE_NAME) -> None:
|
|
762
|
+
"""Serve the last build locally (127.0.0.1)."""
|
|
763
|
+
_site_run("preview", name)
|
|
@@ -11,7 +11,7 @@ from collections.abc import Callable
|
|
|
11
11
|
from dataclasses import dataclass, field
|
|
12
12
|
from pathlib import Path
|
|
13
13
|
|
|
14
|
-
from dotbrain import config, paths, resource_loader
|
|
14
|
+
from dotbrain import config, paths, resource_loader, site
|
|
15
15
|
from dotbrain.adopter_repos import is_dotbrain_repo
|
|
16
16
|
|
|
17
17
|
# Same shape as bootstrap.Runner; injected so tests can record without real subprocess calls.
|
|
@@ -194,6 +194,20 @@ def _check_project_wiring(brainspace: Path, dotbrain_home: Path) -> list[Finding
|
|
|
194
194
|
return findings
|
|
195
195
|
|
|
196
196
|
|
|
197
|
+
# --------------------------------------------------------------------------- Brain site
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
def _check_brain_site(brainspace: Path, *, run: Runner = _default_run) -> list[Finding]:
|
|
201
|
+
"""Node matters only for a Brain with a site; every other Brain skips this check."""
|
|
202
|
+
if not (brainspace / ".brain" / "site").is_dir():
|
|
203
|
+
return []
|
|
204
|
+
try:
|
|
205
|
+
site.check_node(run)
|
|
206
|
+
except site.SiteError as exc:
|
|
207
|
+
return [Finding("warn", f"Brain site: {exc}", f"install Node {site.MIN_NODE_TEXT} or later to run 'dotbrain site'")]
|
|
208
|
+
return [Finding("ok", "Brain site: Node available")]
|
|
209
|
+
|
|
210
|
+
|
|
197
211
|
# --------------------------------------------------------------------------- beads state
|
|
198
212
|
|
|
199
213
|
|
|
@@ -273,6 +287,8 @@ def run_doctor(
|
|
|
273
287
|
if shutil.which("bd"):
|
|
274
288
|
findings += _check_beads_state(brainspace, name, root, run=run)
|
|
275
289
|
|
|
290
|
+
findings += _check_brain_site(brainspace, run=run)
|
|
291
|
+
|
|
276
292
|
if findings:
|
|
277
293
|
report.projects[name] = findings
|
|
278
294
|
|