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.
Files changed (64) hide show
  1. {dotbrain-0.4.4 → dotbrain-0.4.6}/PKG-INFO +1 -1
  2. {dotbrain-0.4.4 → dotbrain-0.4.6}/README.md +4 -0
  3. {dotbrain-0.4.4 → dotbrain-0.4.6}/docs/cli-reference.md +83 -0
  4. {dotbrain-0.4.4 → dotbrain-0.4.6}/docs/skills.md +11 -0
  5. {dotbrain-0.4.4 → dotbrain-0.4.6}/pyproject.toml +1 -1
  6. {dotbrain-0.4.4 → dotbrain-0.4.6}/src/dotbrain/__init__.py +1 -1
  7. {dotbrain-0.4.4 → dotbrain-0.4.6}/src/dotbrain/brainspaces.py +7 -1
  8. {dotbrain-0.4.4 → dotbrain-0.4.6}/src/dotbrain/cli.py +63 -1
  9. {dotbrain-0.4.4 → dotbrain-0.4.6}/src/dotbrain/doctor.py +17 -1
  10. dotbrain-0.4.6/src/dotbrain/resources/site/package-lock.json +3272 -0
  11. dotbrain-0.4.6/src/dotbrain/resources/site/package.json +11 -0
  12. dotbrain-0.4.6/src/dotbrain/resources/site/vitepress/config.mts +90 -0
  13. dotbrain-0.4.6/src/dotbrain/resources/site/vitepress/theme/DocsOverview.vue +11 -0
  14. dotbrain-0.4.6/src/dotbrain/resources/site/vitepress/theme/HomeTiles.vue +35 -0
  15. dotbrain-0.4.6/src/dotbrain/resources/site/vitepress/theme/LearnOverview.vue +12 -0
  16. dotbrain-0.4.6/src/dotbrain/resources/site/vitepress/theme/Mermaid.vue +96 -0
  17. dotbrain-0.4.6/src/dotbrain/resources/site/vitepress/theme/PageStatus.vue +24 -0
  18. dotbrain-0.4.6/src/dotbrain/resources/site/vitepress/theme/base.ts +21 -0
  19. dotbrain-0.4.6/src/dotbrain/resources/site/vitepress/theme/custom.css +317 -0
  20. dotbrain-0.4.6/src/dotbrain/resources/site/vitepress/theme/empty.css +1 -0
  21. dotbrain-0.4.6/src/dotbrain/resources/site/vitepress/theme/empty.ts +2 -0
  22. dotbrain-0.4.6/src/dotbrain/resources/site/vitepress/theme/index.ts +18 -0
  23. {dotbrain-0.4.4 → dotbrain-0.4.6}/src/dotbrain/resources/templates/brain/DOTBRAIN.md +7 -0
  24. dotbrain-0.4.6/src/dotbrain/resources/templates/brain/site/configure.md +108 -0
  25. dotbrain-0.4.6/src/dotbrain/resources/templates/brain/site/index.md +7 -0
  26. dotbrain-0.4.6/src/dotbrain/site.py +610 -0
  27. {dotbrain-0.4.4 → dotbrain-0.4.6}/.gitignore +0 -0
  28. {dotbrain-0.4.4 → dotbrain-0.4.6}/LICENSE +0 -0
  29. {dotbrain-0.4.4 → dotbrain-0.4.6}/docs/README.md +0 -0
  30. {dotbrain-0.4.4 → dotbrain-0.4.6}/docs/architecture.md +0 -0
  31. {dotbrain-0.4.4 → dotbrain-0.4.6}/docs/beads-backend.md +0 -0
  32. {dotbrain-0.4.4 → dotbrain-0.4.6}/docs/configuration.md +0 -0
  33. {dotbrain-0.4.4 → dotbrain-0.4.6}/docs/getting-started.md +0 -0
  34. {dotbrain-0.4.4 → dotbrain-0.4.6}/docs/glossary.md +0 -0
  35. {dotbrain-0.4.4 → dotbrain-0.4.6}/docs/wiring.md +0 -0
  36. {dotbrain-0.4.4 → dotbrain-0.4.6}/src/dotbrain/_cli_reference.py +0 -0
  37. {dotbrain-0.4.4 → dotbrain-0.4.6}/src/dotbrain/adopter_repos.py +0 -0
  38. {dotbrain-0.4.4 → dotbrain-0.4.6}/src/dotbrain/beads.py +0 -0
  39. {dotbrain-0.4.4 → dotbrain-0.4.6}/src/dotbrain/bootstrap.py +0 -0
  40. {dotbrain-0.4.4 → dotbrain-0.4.6}/src/dotbrain/config.py +0 -0
  41. {dotbrain-0.4.4 → dotbrain-0.4.6}/src/dotbrain/hooks.py +0 -0
  42. {dotbrain-0.4.4 → dotbrain-0.4.6}/src/dotbrain/migrate.py +0 -0
  43. {dotbrain-0.4.4 → dotbrain-0.4.6}/src/dotbrain/paths.py +0 -0
  44. {dotbrain-0.4.4 → dotbrain-0.4.6}/src/dotbrain/resource_loader.py +0 -0
  45. {dotbrain-0.4.4 → dotbrain-0.4.6}/src/dotbrain/resources/__init__.py +0 -0
  46. {dotbrain-0.4.4 → dotbrain-0.4.6}/src/dotbrain/resources/agents/claude/implementer.md +0 -0
  47. {dotbrain-0.4.4 → dotbrain-0.4.6}/src/dotbrain/resources/agents/claude/investigator.md +0 -0
  48. {dotbrain-0.4.4 → dotbrain-0.4.6}/src/dotbrain/resources/agents/claude/reviewer.md +0 -0
  49. {dotbrain-0.4.4 → dotbrain-0.4.6}/src/dotbrain/resources/agents/claude/verifier.md +0 -0
  50. {dotbrain-0.4.4 → dotbrain-0.4.6}/src/dotbrain/resources/agents/codex/implementer.toml +0 -0
  51. {dotbrain-0.4.4 → dotbrain-0.4.6}/src/dotbrain/resources/agents/codex/investigator.toml +0 -0
  52. {dotbrain-0.4.4 → dotbrain-0.4.6}/src/dotbrain/resources/agents/codex/reviewer.toml +0 -0
  53. {dotbrain-0.4.4 → dotbrain-0.4.6}/src/dotbrain/resources/agents/codex/verifier.toml +0 -0
  54. {dotbrain-0.4.4 → dotbrain-0.4.6}/src/dotbrain/resources/config.yaml +0 -0
  55. {dotbrain-0.4.4 → dotbrain-0.4.6}/src/dotbrain/resources/core.yaml +0 -0
  56. {dotbrain-0.4.4 → dotbrain-0.4.6}/src/dotbrain/resources/templates/brain/AGENTS.md +0 -0
  57. {dotbrain-0.4.4 → dotbrain-0.4.6}/src/dotbrain/resources/templates/brain/adr/README.md +0 -0
  58. {dotbrain-0.4.4 → dotbrain-0.4.6}/src/dotbrain/resources/templates/brain/designs/README.md +0 -0
  59. {dotbrain-0.4.4 → dotbrain-0.4.6}/src/dotbrain/resources/templates/brain/docs/README.md +0 -0
  60. {dotbrain-0.4.4 → dotbrain-0.4.6}/src/dotbrain/resources/templates/brain/project.yaml +0 -0
  61. {dotbrain-0.4.4 → dotbrain-0.4.6}/src/dotbrain/resources/templates/gitignore +0 -0
  62. {dotbrain-0.4.4 → dotbrain-0.4.6}/src/dotbrain/skills.py +0 -0
  63. {dotbrain-0.4.4 → dotbrain-0.4.6}/src/dotbrain/subagents.py +0 -0
  64. {dotbrain-0.4.4 → dotbrain-0.4.6}/src/dotbrain/workflows.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: dotbrain
3
- Version: 0.4.4
3
+ Version: 0.4.6
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
@@ -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
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "dotbrain"
3
- version = "0.4.4"
3
+ version = "0.4.6"
4
4
  description = "Wires project Brainspaces and skills into coding agents."
5
5
  requires-python = ">=3.11"
6
6
  license = "MIT"
@@ -4,4 +4,4 @@ A testable Python CLI for wiring repos into Brainspaces, seeding Brains, and
4
4
  managing skills. Exposes the workflow commands plus pure path/contract helpers.
5
5
  """
6
6
 
7
- __version__ = "0.4.4"
7
+ __version__ = "0.4.6"
@@ -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