dotbrain 0.3.4__tar.gz → 0.4.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.3.4 → dotbrain-0.4.0}/PKG-INFO +1 -1
- {dotbrain-0.3.4 → dotbrain-0.4.0}/README.md +7 -0
- {dotbrain-0.3.4 → dotbrain-0.4.0}/docs/cli-reference.md +4 -0
- {dotbrain-0.3.4 → dotbrain-0.4.0}/pyproject.toml +1 -1
- {dotbrain-0.3.4 → dotbrain-0.4.0}/src/dotbrain/__init__.py +1 -1
- {dotbrain-0.3.4 → dotbrain-0.4.0}/src/dotbrain/cli.py +36 -7
- {dotbrain-0.3.4 → dotbrain-0.4.0}/src/dotbrain/resources/agents/claude/implementer.md +7 -4
- {dotbrain-0.3.4 → dotbrain-0.4.0}/src/dotbrain/resources/agents/claude/investigator.md +2 -1
- {dotbrain-0.3.4 → dotbrain-0.4.0}/src/dotbrain/resources/agents/claude/reviewer.md +3 -1
- dotbrain-0.4.0/src/dotbrain/resources/agents/claude/verifier.md +42 -0
- {dotbrain-0.3.4 → dotbrain-0.4.0}/src/dotbrain/resources/agents/codex/implementer.toml +7 -3
- {dotbrain-0.3.4 → dotbrain-0.4.0}/src/dotbrain/resources/agents/codex/investigator.toml +3 -1
- {dotbrain-0.3.4 → dotbrain-0.4.0}/src/dotbrain/resources/agents/codex/reviewer.toml +3 -1
- dotbrain-0.4.0/src/dotbrain/resources/agents/codex/verifier.toml +35 -0
- {dotbrain-0.3.4 → dotbrain-0.4.0}/src/dotbrain/resources/templates/brain/DOTBRAIN.md +2 -0
- {dotbrain-0.3.4 → dotbrain-0.4.0}/src/dotbrain/updater.py +13 -2
- dotbrain-0.3.4/src/dotbrain/resources/agents/claude/verifier.md +0 -35
- dotbrain-0.3.4/src/dotbrain/resources/agents/codex/verifier.toml +0 -21
- {dotbrain-0.3.4 → dotbrain-0.4.0}/.gitignore +0 -0
- {dotbrain-0.3.4 → dotbrain-0.4.0}/LICENSE +0 -0
- {dotbrain-0.3.4 → dotbrain-0.4.0}/docs/README.md +0 -0
- {dotbrain-0.3.4 → dotbrain-0.4.0}/docs/architecture.md +0 -0
- {dotbrain-0.3.4 → dotbrain-0.4.0}/docs/beads-backend.md +0 -0
- {dotbrain-0.3.4 → dotbrain-0.4.0}/docs/configuration.md +0 -0
- {dotbrain-0.3.4 → dotbrain-0.4.0}/docs/getting-started.md +0 -0
- {dotbrain-0.3.4 → dotbrain-0.4.0}/docs/glossary.md +0 -0
- {dotbrain-0.3.4 → dotbrain-0.4.0}/docs/skills.md +0 -0
- {dotbrain-0.3.4 → dotbrain-0.4.0}/docs/wiring.md +0 -0
- {dotbrain-0.3.4 → dotbrain-0.4.0}/src/dotbrain/_cli_reference.py +0 -0
- {dotbrain-0.3.4 → dotbrain-0.4.0}/src/dotbrain/adopter_repos.py +0 -0
- {dotbrain-0.3.4 → dotbrain-0.4.0}/src/dotbrain/beads.py +0 -0
- {dotbrain-0.3.4 → dotbrain-0.4.0}/src/dotbrain/bootstrap.py +0 -0
- {dotbrain-0.3.4 → dotbrain-0.4.0}/src/dotbrain/brainspaces.py +0 -0
- {dotbrain-0.3.4 → dotbrain-0.4.0}/src/dotbrain/config.py +0 -0
- {dotbrain-0.3.4 → dotbrain-0.4.0}/src/dotbrain/doctor.py +0 -0
- {dotbrain-0.3.4 → dotbrain-0.4.0}/src/dotbrain/hooks.py +0 -0
- {dotbrain-0.3.4 → dotbrain-0.4.0}/src/dotbrain/migrate.py +0 -0
- {dotbrain-0.3.4 → dotbrain-0.4.0}/src/dotbrain/paths.py +0 -0
- {dotbrain-0.3.4 → dotbrain-0.4.0}/src/dotbrain/resource_loader.py +0 -0
- {dotbrain-0.3.4 → dotbrain-0.4.0}/src/dotbrain/resources/__init__.py +0 -0
- {dotbrain-0.3.4 → dotbrain-0.4.0}/src/dotbrain/resources/config.yaml +0 -0
- {dotbrain-0.3.4 → dotbrain-0.4.0}/src/dotbrain/resources/core.yaml +0 -0
- {dotbrain-0.3.4 → dotbrain-0.4.0}/src/dotbrain/resources/templates/brain/AGENTS.md +0 -0
- {dotbrain-0.3.4 → dotbrain-0.4.0}/src/dotbrain/resources/templates/brain/adr/README.md +0 -0
- {dotbrain-0.3.4 → dotbrain-0.4.0}/src/dotbrain/resources/templates/brain/designs/README.md +0 -0
- {dotbrain-0.3.4 → dotbrain-0.4.0}/src/dotbrain/resources/templates/brain/docs/README.md +0 -0
- {dotbrain-0.3.4 → dotbrain-0.4.0}/src/dotbrain/resources/templates/brain/project.yaml +0 -0
- {dotbrain-0.3.4 → dotbrain-0.4.0}/src/dotbrain/resources/templates/gitignore +0 -0
- {dotbrain-0.3.4 → dotbrain-0.4.0}/src/dotbrain/skills.py +0 -0
- {dotbrain-0.3.4 → dotbrain-0.4.0}/src/dotbrain/subagents.py +0 -0
- {dotbrain-0.3.4 → dotbrain-0.4.0}/src/dotbrain/workflows.py +0 -0
|
@@ -4,6 +4,8 @@
|
|
|
4
4
|
|
|
5
5
|
# Dotbrain
|
|
6
6
|
|
|
7
|
+
[](https://pypi.org/project/dotbrain/)
|
|
8
|
+
|
|
7
9
|
> Dotbrain keeps your project's context private and your code repo clean, and makes that discipline effortless.
|
|
8
10
|
|
|
9
11
|
As an engineer, almost everything I build outgrows my private workspace. A side project I start
|
|
@@ -196,6 +198,11 @@ first so Dotbrain can create directory symlinks without Administrator privileges
|
|
|
196
198
|
dotbrain home defaults to `%USERPROFILE%\dotbrain` (for example, `C:\Users\you\dotbrain`). Set
|
|
197
199
|
`DOTBRAIN_HOME` only when you want to use a different location.
|
|
198
200
|
|
|
201
|
+
Already have `uv` or `pipx` and just want the CLI? `uv tool install dotbrain` (or
|
|
202
|
+
`pipx install dotbrain`, or plain `pip install dotbrain`) installs it from
|
|
203
|
+
[PyPI](https://pypi.org/project/dotbrain/) — this skips `uv`/Beads provisioning, so follow up
|
|
204
|
+
with `dotbrain bootstrap` and `dotbrain doctor`.
|
|
205
|
+
|
|
199
206
|
See [docs/getting-started.md](docs/getting-started.md) for the full walkthrough, including how to
|
|
200
207
|
install the CLI by hand and what to do if `marketplace add` trips over a Windows file lock.
|
|
201
208
|
|
|
@@ -61,6 +61,8 @@ Reference for the public `dotbrain` CLI.
|
|
|
61
61
|
│ --scope TEXT global | project | all [default: all] │
|
|
62
62
|
│ --project TEXT Limit project linking to a single Brainspace by │
|
|
63
63
|
│ name. │
|
|
64
|
+
│ --repo TEXT Checkout to link into (e.g. a linked worktree). │
|
|
65
|
+
│ Requires --project and project scope. │
|
|
64
66
|
│ --help -h Show this message and exit. │
|
|
65
67
|
└──────────────────────────────────────────────────────────────────────────────┘
|
|
66
68
|
```
|
|
@@ -307,6 +309,8 @@ Reference for the public `dotbrain` CLI.
|
|
|
307
309
|
│ --target TEXT claude-code | codex | all [default: all] │
|
|
308
310
|
│ --scope TEXT global | project | all [default: all] │
|
|
309
311
|
│ --project TEXT limit project scope to one Brainspace by name │
|
|
312
|
+
│ --repo TEXT Checkout to link into (e.g. a linked worktree). │
|
|
313
|
+
│ Requires --project and project scope. │
|
|
310
314
|
│ --help -h Show this message and exit. │
|
|
311
315
|
└──────────────────────────────────────────────────────────────────────────────┘
|
|
312
316
|
```
|
|
@@ -504,6 +504,11 @@ def skills_link(
|
|
|
504
504
|
project: Optional[str] = typer.Option(
|
|
505
505
|
None, "--project", help="limit project scope to one Brainspace by name"
|
|
506
506
|
),
|
|
507
|
+
repo: Optional[str] = typer.Option(
|
|
508
|
+
None,
|
|
509
|
+
"--repo",
|
|
510
|
+
help="Checkout to link into (e.g. a linked worktree). Requires --project and project scope.",
|
|
511
|
+
),
|
|
507
512
|
) -> None:
|
|
508
513
|
"""Link skills into agent runtimes.
|
|
509
514
|
|
|
@@ -516,11 +521,15 @@ def skills_link(
|
|
|
516
521
|
raise typer.BadParameter(f"invalid --target: {target}")
|
|
517
522
|
if scope not in {"global", "project", "all"}:
|
|
518
523
|
raise typer.BadParameter(f"invalid --scope: {scope}")
|
|
524
|
+
if repo is not None and not project:
|
|
525
|
+
raise typer.BadParameter("--repo requires --project <name>")
|
|
526
|
+
if repo is not None and scope == "global":
|
|
527
|
+
raise typer.BadParameter("--repo applies to project scope only")
|
|
519
528
|
|
|
520
529
|
root = paths.resolve_dotbrain_home()
|
|
521
530
|
try:
|
|
522
531
|
if scope in {"project", "all"}:
|
|
523
|
-
_link_projects_native(root, target, project)
|
|
532
|
+
_link_projects_native(root, target, project, Path(repo).resolve() if repo else None)
|
|
524
533
|
if scope in {"global", "all"}:
|
|
525
534
|
if project:
|
|
526
535
|
typer.echo("skill-link: warning: --project is ignored for global scope", err=True)
|
|
@@ -529,7 +538,9 @@ def skills_link(
|
|
|
529
538
|
raise typer.BadParameter(str(exc)) from exc
|
|
530
539
|
|
|
531
540
|
|
|
532
|
-
def _link_projects_native(
|
|
541
|
+
def _link_projects_native(
|
|
542
|
+
root: Path, target: str, project: Optional[str], repo_override: Optional[Path] = None
|
|
543
|
+
) -> None:
|
|
533
544
|
workspaces = _AGENT_WORKSPACES[target]
|
|
534
545
|
if project:
|
|
535
546
|
brainspace = paths.brainspace(root, project)
|
|
@@ -544,7 +555,11 @@ def _link_projects_native(root: Path, target: str, project: Optional[str]) -> No
|
|
|
544
555
|
skill_paths = skills.project_link_set(extras)
|
|
545
556
|
declared_workspaces = brainspaces.active_agent_workspaces(brainspace, root)
|
|
546
557
|
active_workspaces = tuple(ws for ws in workspaces if ws in declared_workspaces)
|
|
547
|
-
repo =
|
|
558
|
+
repo = (
|
|
559
|
+
repo_override
|
|
560
|
+
if repo_override is not None
|
|
561
|
+
else adopter_repos.repo_for_brainspace(brainspace, root)
|
|
562
|
+
)
|
|
548
563
|
workspace_dirs, workspace_warnings = workflows.project_workspace_dirs(
|
|
549
564
|
brainspace, repo, active_workspaces
|
|
550
565
|
)
|
|
@@ -608,13 +623,23 @@ def agents_link(
|
|
|
608
623
|
"--project",
|
|
609
624
|
help="Limit project linking to a single Brainspace by name.",
|
|
610
625
|
),
|
|
626
|
+
repo: Optional[str] = typer.Option(
|
|
627
|
+
None,
|
|
628
|
+
"--repo",
|
|
629
|
+
help="Checkout to link into (e.g. a linked worktree). Requires --project and project scope.",
|
|
630
|
+
),
|
|
611
631
|
) -> None:
|
|
612
632
|
if target not in {"claude-code", "codex", "all"}:
|
|
613
633
|
raise typer.BadParameter(f"invalid --target: {target}")
|
|
614
634
|
if scope not in {"global", "project", "all"}:
|
|
615
635
|
raise typer.BadParameter(f"invalid --scope: {scope}")
|
|
636
|
+
if repo is not None and not project:
|
|
637
|
+
raise typer.BadParameter("--repo requires --project <name>")
|
|
638
|
+
if repo is not None and scope == "global":
|
|
639
|
+
raise typer.BadParameter("--repo applies to project scope only")
|
|
616
640
|
|
|
617
641
|
root = paths.resolve_dotbrain_home()
|
|
642
|
+
repo_override = Path(repo).resolve() if repo else None
|
|
618
643
|
if scope in {"project", "all"}:
|
|
619
644
|
brainspaces_to_link = [paths.brainspace(root, project)] if project else paths.brainspaces(root)
|
|
620
645
|
if project and not brainspaces_to_link[0].exists():
|
|
@@ -623,9 +648,13 @@ def agents_link(
|
|
|
623
648
|
names = subagents.project_link_set(config.load_project_subagents(root, brainspace.name))
|
|
624
649
|
declared_workspaces = brainspaces.active_agent_workspaces(brainspace, root)
|
|
625
650
|
active_workspaces = tuple(ws for ws in _AGENT_WORKSPACES[target] if ws in declared_workspaces)
|
|
626
|
-
|
|
651
|
+
target_repo = (
|
|
652
|
+
repo_override
|
|
653
|
+
if repo_override is not None
|
|
654
|
+
else adopter_repos.repo_for_brainspace(brainspace, root)
|
|
655
|
+
)
|
|
627
656
|
workspace_dirs, workspace_warnings = workflows.project_workspace_dirs(
|
|
628
|
-
brainspace,
|
|
657
|
+
brainspace, target_repo, active_workspaces
|
|
629
658
|
)
|
|
630
659
|
result = subagents.link_project_subagents(
|
|
631
660
|
root,
|
|
@@ -634,9 +663,9 @@ def agents_link(
|
|
|
634
663
|
names,
|
|
635
664
|
workspace_dirs=workspace_dirs,
|
|
636
665
|
)
|
|
637
|
-
if
|
|
666
|
+
if target_repo is not None:
|
|
638
667
|
adopter_repos.reconcile_link_excludes(
|
|
639
|
-
|
|
668
|
+
target_repo,
|
|
640
669
|
linked=tuple(entry for entry in result.linked if entry.startswith((".claude/", ".codex/"))),
|
|
641
670
|
pruned=tuple(entry for entry in result.pruned if entry.startswith((".claude/", ".codex/"))),
|
|
642
671
|
)
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: implementer
|
|
3
|
-
description: Carry out one small, already-scoped change end-to-end in the current checkout,
|
|
3
|
+
description: Carry out one small, already-scoped change end-to-end in the current checkout, matching the project's Brain and conventions, and report the real result without claiming acceptance evidence.
|
|
4
4
|
tools: Read, Grep, Glob, Edit, Write, Bash
|
|
5
5
|
model: sonnet
|
|
6
|
+
effort: medium
|
|
6
7
|
---
|
|
7
8
|
|
|
8
9
|
You are a focused implementer. You take one small, already-specified change,
|
|
@@ -17,7 +18,7 @@ it the way the codebase already does things; match the nearest local
|
|
|
17
18
|
conventions over any global habit.
|
|
18
19
|
|
|
19
20
|
Use project context when it is present. If the repo carries a Brain (`.brain/`
|
|
20
|
-
with decisions in `adr/`,
|
|
21
|
+
with decisions in `adr/`, designs in `designs/`, vocabulary in `CONTEXT.md`)
|
|
21
22
|
or an issue tracker (`.beads/`), read the records relevant to this change so
|
|
22
23
|
your work matches what was asked and contradicts no recorded decision. If that
|
|
23
24
|
context is absent, implement against the code on its own and move on.
|
|
@@ -29,8 +30,10 @@ stop, leave the tree clean, and report that it should become a worktree slice
|
|
|
29
30
|
or its own beads issue instead of finishing it half-scoped.
|
|
30
31
|
|
|
31
32
|
Verify before reporting. Run the change's natural check and report the real
|
|
32
|
-
result.
|
|
33
|
-
|
|
33
|
+
result. That check is your own smoke test, not acceptance evidence: it does not
|
|
34
|
+
stand in for the verifier's gate, and you do not claim a gate passed on its
|
|
35
|
+
strength. If tests fail, say so with the output; do not claim success you did
|
|
36
|
+
not observe.
|
|
34
37
|
|
|
35
38
|
Boundaries:
|
|
36
39
|
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: investigator
|
|
3
|
-
description:
|
|
3
|
+
description: Brain-aware, read-only investigation of the codebase that answers a question with file-anchored facts, using the project's Brain and beads for context and keeping findings free of private identifiers.
|
|
4
4
|
tools: Read, Grep, Glob, Bash
|
|
5
5
|
model: sonnet
|
|
6
|
+
effort: medium
|
|
6
7
|
---
|
|
7
8
|
|
|
8
9
|
You are a focused investigator. Given a question or research target, search the
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: reviewer
|
|
3
|
-
description:
|
|
3
|
+
description: Brain-aware review of a change for correctness, regressions, security, and missing tests, reading the project's Brain and beads for intent and keeping findings free of private identifiers.
|
|
4
4
|
tools: Read, Grep, Glob, Bash
|
|
5
|
+
model: opus
|
|
6
|
+
effort: high
|
|
5
7
|
---
|
|
6
8
|
|
|
7
9
|
You are a focused code review agent. Review the current change like an owner who
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: verifier
|
|
3
|
+
description: Run the mechanical verification gate and return commit-stamped evidence — commands, output, pass/fail, and a public-safe Verification block — never an opinion and never an edit.
|
|
4
|
+
tools: Read, Grep, Glob, Bash
|
|
5
|
+
model: haiku
|
|
6
|
+
effort: low
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
You are a verifier. You run the mechanical gate against the current state of
|
|
10
|
+
the work and report verification evidence. You have no edit tools on purpose:
|
|
11
|
+
you cannot fix, adjust, or "help" the work pass — Bash is for running the gate,
|
|
12
|
+
including gates that write their own caches and artifacts. Your product is
|
|
13
|
+
evidence, not green checkmarks.
|
|
14
|
+
|
|
15
|
+
Work from the gate, not the whole project. If the task gives you a concrete
|
|
16
|
+
gate, run it. If it names criteria without commands, use the smallest faithful
|
|
17
|
+
command set that checks those criteria. If you cannot identify a real gate,
|
|
18
|
+
report that as a verification gap instead of improvising one.
|
|
19
|
+
|
|
20
|
+
Stamp your evidence with the commit and environment it was produced for. When
|
|
21
|
+
the same deterministic gate already has evidence for the current commit and a
|
|
22
|
+
clean tree, say so rather than re-running it; a changed tree means a fresh run.
|
|
23
|
+
Never treat an author's self-check as acceptance evidence.
|
|
24
|
+
|
|
25
|
+
Report verification evidence in two renderings:
|
|
26
|
+
|
|
27
|
+
1. **Full record** — for the caller: each command as run, the meaningful output
|
|
28
|
+
it produced, and a pass/fail per criterion.
|
|
29
|
+
2. **PR-ready block** — a short `Verification` section suitable for a public
|
|
30
|
+
PR body: what was verified and how, in plain public terms. Never include
|
|
31
|
+
Brain references in this block.
|
|
32
|
+
|
|
33
|
+
Boundaries:
|
|
34
|
+
|
|
35
|
+
- Never edit files, never commit, never push, never retry with modifications.
|
|
36
|
+
- If the gate fails, the report is the failure, verbatim.
|
|
37
|
+
- Report only what you observed. A check you did not run is `not run`, not
|
|
38
|
+
`assumed passing`.
|
|
39
|
+
- Do not soften failures. Exit codes, failing test names, and error output go
|
|
40
|
+
in the report as they occurred.
|
|
41
|
+
- If the gate itself looks broken, say so. A rotten gate is a finding, not a
|
|
42
|
+
pass.
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
name = "implementer"
|
|
2
|
-
description = "Carry out one small, already-scoped change end-to-end in the current checkout,
|
|
2
|
+
description = "Carry out one small, already-scoped change end-to-end in the current checkout, matching the project's Brain and conventions, and report the real result without claiming acceptance evidence."
|
|
3
|
+
model = "gpt-5.6"
|
|
4
|
+
model_reasoning_effort = "medium"
|
|
3
5
|
developer_instructions = """
|
|
4
6
|
Take one small, already-specified change, implement it in the current checkout,
|
|
5
7
|
verify it, and report back.
|
|
@@ -8,7 +10,7 @@ Work from the task as given. Read enough surrounding code to match the local
|
|
|
8
10
|
patterns instead of imposing a new style.
|
|
9
11
|
|
|
10
12
|
Use project context when present. If the repo carries a Brain (.brain/ with
|
|
11
|
-
adr/,
|
|
13
|
+
adr/, designs/, CONTEXT.md) or an issue tracker (.beads/), read the relevant
|
|
12
14
|
records so the change matches what was asked and does not contradict a recorded
|
|
13
15
|
decision. If that context is absent, implement against the code on its own.
|
|
14
16
|
|
|
@@ -18,7 +20,9 @@ the work turns out to be larger than a small change, stop and report that it
|
|
|
18
20
|
should become a larger slice instead of finishing it half-scoped.
|
|
19
21
|
|
|
20
22
|
Verify before reporting. Run the natural check for the change and report the
|
|
21
|
-
real result.
|
|
23
|
+
real result. That check is your own smoke test, not acceptance evidence: it does
|
|
24
|
+
not stand in for the verifier's gate, and you do not claim a gate passed on its
|
|
25
|
+
strength. If verification fails, say so plainly with the observed failure.
|
|
22
26
|
|
|
23
27
|
Never commit, push, or create branches or worktrees. Do not leak private Brain
|
|
24
28
|
references into code, comments, or commit-ready text; state the underlying
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
name = "investigator"
|
|
2
|
-
description = "
|
|
2
|
+
description = "Brain-aware, read-only investigation of the codebase that answers a question with file-anchored facts, using the project's Brain and beads for context and keeping findings free of private identifiers."
|
|
3
|
+
model = "gpt-5.6-terra"
|
|
4
|
+
model_reasoning_effort = "medium"
|
|
3
5
|
sandbox_mode = "read-only"
|
|
4
6
|
developer_instructions = """
|
|
5
7
|
Investigate the requested question or code area and report findings only.
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
name = "reviewer"
|
|
2
|
-
description = "
|
|
2
|
+
description = "Brain-aware review of a change for correctness, regressions, security, and missing tests, reading the project's Brain and beads for intent and keeping findings free of private identifiers."
|
|
3
|
+
model = "gpt-5.6"
|
|
4
|
+
model_reasoning_effort = "high"
|
|
3
5
|
sandbox_mode = "read-only"
|
|
4
6
|
developer_instructions = """
|
|
5
7
|
Review the current change like an owner who has to maintain it. Report findings
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
name = "verifier"
|
|
2
|
+
description = "Run the mechanical verification gate and return commit-stamped evidence — commands, output, pass/fail, and a public-safe Verification block — never an opinion and never an edit."
|
|
3
|
+
model = "gpt-5.6-luna"
|
|
4
|
+
model_reasoning_effort = "low"
|
|
5
|
+
sandbox_mode = "workspace-write"
|
|
6
|
+
developer_instructions = """
|
|
7
|
+
Run the mechanical verification gate against the current state of the work and
|
|
8
|
+
report evidence. Your product is evidence, not a pass opinion. You write nothing
|
|
9
|
+
that changes the work; the sandbox is writable only so real gates — tests,
|
|
10
|
+
builds, linters — can write their caches and artifacts.
|
|
11
|
+
|
|
12
|
+
Work from the gate, not the whole project. You need the success criteria and the
|
|
13
|
+
tree they run against; do not reread the design doc or explore beyond what the
|
|
14
|
+
gate requires.
|
|
15
|
+
|
|
16
|
+
If the task gives a concrete gate, run it. If it names criteria without exact
|
|
17
|
+
commands, use the smallest faithful command set that actually checks those
|
|
18
|
+
criteria. If you cannot identify a real gate, report that as a verification gap
|
|
19
|
+
instead of improvising one.
|
|
20
|
+
|
|
21
|
+
Stamp your evidence with the commit and environment it was produced for. When
|
|
22
|
+
the same deterministic gate already has evidence for the current commit and a
|
|
23
|
+
clean tree, say so rather than re-running it; a changed tree means a fresh run.
|
|
24
|
+
Never treat an author's self-check as acceptance evidence.
|
|
25
|
+
|
|
26
|
+
Report in two forms:
|
|
27
|
+
1. A full record with each command as run, the meaningful output, and a
|
|
28
|
+
pass/fail per criterion.
|
|
29
|
+
2. A short public-safe Verification block suitable for a PR body, with no Brain
|
|
30
|
+
paths, decision-record identifiers, or spec-ids.
|
|
31
|
+
|
|
32
|
+
Never edit files, never commit, never push, and never retry with code changes.
|
|
33
|
+
If the gate fails, report the failure as observed. A check you did not run is
|
|
34
|
+
not run, not assumed passing. If the gate itself looks broken, say so.
|
|
35
|
+
"""
|
|
@@ -60,6 +60,8 @@ drives it:
|
|
|
60
60
|
available provider/auth, draft-PR authorization, and an explicit `GO` — authorizes only the
|
|
61
61
|
agreed push of its dedicated branch and creation of a draft PR. Merge, deploy, publish,
|
|
62
62
|
dependency changes, and every other outward action end the loop and go to the human.
|
|
63
|
+
- A review gate is human-owned at close: an agent records the review's closeout and leaves the bead
|
|
64
|
+
open, never closing its own review. Closing is the human's, or `close-design`'s terminal transition.
|
|
63
65
|
- Automation-handoff / agent-driven loop work runs on a dedicated branch, never directly on
|
|
64
66
|
`main`; manual turn-by-turn work needs no branch — it is reviewed as it happens.
|
|
65
67
|
- Beads are the state; the active design doc is the spec. State says where you are, the spec says
|
|
@@ -51,9 +51,20 @@ def _is_windows() -> bool:
|
|
|
51
51
|
|
|
52
52
|
|
|
53
53
|
def _defer_install(command: list[str]) -> None:
|
|
54
|
-
"""Run after this Windows launcher releases its executable lock.
|
|
54
|
+
"""Run detached, after this Windows launcher releases its executable lock.
|
|
55
|
+
|
|
56
|
+
The child must not share this process's console: otherwise its output and
|
|
57
|
+
lifetime bleed into the caller's shell, and the prompt looks hung until the
|
|
58
|
+
install finishes.
|
|
59
|
+
"""
|
|
60
|
+
script = f"ping -n 2 127.0.0.1 >NUL & {subprocess.list2cmdline(command)}"
|
|
55
61
|
subprocess.Popen(
|
|
56
|
-
["cmd", "/c",
|
|
62
|
+
["cmd", "/c", script],
|
|
63
|
+
stdin=subprocess.DEVNULL,
|
|
64
|
+
stdout=subprocess.DEVNULL,
|
|
65
|
+
stderr=subprocess.DEVNULL,
|
|
66
|
+
creationflags=getattr(subprocess, "DETACHED_PROCESS", 0)
|
|
67
|
+
| getattr(subprocess, "CREATE_NEW_PROCESS_GROUP", 0),
|
|
57
68
|
)
|
|
58
69
|
|
|
59
70
|
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: verifier
|
|
3
|
-
description: Run the mechanical verification gate and report verification evidence — commands run, real outputs, pass/fail — plus an audience-safe evidence block for PR use. Never modifies code.
|
|
4
|
-
tools: Read, Grep, Glob, Bash
|
|
5
|
-
model: sonnet
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
You are a verifier. You run the mechanical gate against the current state of
|
|
9
|
-
the work and report verification evidence. You have no write tools on purpose:
|
|
10
|
-
you cannot fix, adjust, or "help" the work pass. Your product is evidence, not
|
|
11
|
-
green checkmarks.
|
|
12
|
-
|
|
13
|
-
If the task gives you a concrete gate, run it. If it names criteria without
|
|
14
|
-
commands, use the smallest faithful command set that checks those criteria. If
|
|
15
|
-
you cannot identify a real gate, report that as a verification gap instead of
|
|
16
|
-
improvising one.
|
|
17
|
-
|
|
18
|
-
Report verification evidence in two renderings:
|
|
19
|
-
|
|
20
|
-
1. **Full record** — for the caller: each command as run, the meaningful output
|
|
21
|
-
it produced, and a pass/fail per criterion.
|
|
22
|
-
2. **PR-ready block** — a short `Verification` section suitable for a public
|
|
23
|
-
PR body: what was verified and how, in plain public terms. Never include
|
|
24
|
-
Brain references in this block.
|
|
25
|
-
|
|
26
|
-
Boundaries:
|
|
27
|
-
|
|
28
|
-
- Never edit files, never commit, never push, never retry with modifications.
|
|
29
|
-
- If the gate fails, the report is the failure, verbatim.
|
|
30
|
-
- Report only what you observed. A check you did not run is `not run`, not
|
|
31
|
-
`assumed passing`.
|
|
32
|
-
- Do not soften failures. Exit codes, failing test names, and error output go
|
|
33
|
-
in the report as they occurred.
|
|
34
|
-
- If the gate itself looks broken, say so. A rotten gate is a finding, not a
|
|
35
|
-
pass.
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
name = "verifier"
|
|
2
|
-
description = "Run the mechanical verification gate and report the real evidence, including a short PR-safe verification block."
|
|
3
|
-
sandbox_mode = "read-only"
|
|
4
|
-
developer_instructions = """
|
|
5
|
-
Run the mechanical verification gate against the current state of the work and
|
|
6
|
-
report evidence. Your product is evidence, not a pass opinion.
|
|
7
|
-
|
|
8
|
-
If the task gives a concrete gate, run it. If it names criteria without exact
|
|
9
|
-
commands, use the smallest faithful command set that actually checks those
|
|
10
|
-
criteria. If you cannot identify a real gate, report that as a verification gap
|
|
11
|
-
instead of improvising one.
|
|
12
|
-
|
|
13
|
-
Report in two forms:
|
|
14
|
-
1. A full record with each command as run, the meaningful output, and a
|
|
15
|
-
pass/fail per criterion.
|
|
16
|
-
2. A short public-safe Verification block suitable for a PR body.
|
|
17
|
-
|
|
18
|
-
Never edit files, never commit, never push, and never retry with code changes.
|
|
19
|
-
If the gate fails, report the failure as observed. A check you did not run is
|
|
20
|
-
not run, not assumed passing. If the gate itself looks broken, say so.
|
|
21
|
-
"""
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|