fix: projects/ directory should be gitignored — it is local installation config, not shared code (#561)

- Add projects/*.toml to .gitignore
- Remove existing TOML files from git tracking (git rm --cached)
- Add .toml.example templates with placeholder values
- Update BOOTSTRAP.md with new section on project TOML setup
- Update AGENTS.md directory layout description

Existing local installations are unaffected — gitignore only
prevents tracked files from being committed, local copies persist.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
openhands 2026-03-22 16:06:31 +00:00
parent 005a39237e
commit a26dc5c2b0
9 changed files with 103 additions and 83 deletions

2
.gitignore vendored
View file

@ -1,6 +1,8 @@
# Secrets
.env
# Per-box project config (generated by disinto init)
projects/*.toml
# Runtime state
*.log

View file

@ -27,7 +27,7 @@ disinto/
├── vault/ vault-poll.sh, vault-agent.sh, vault-fire.sh — action gating + procurement
├── action/ action-poll.sh, action-agent.sh — operational task execution
├── lib/ env.sh, agent-session.sh, ci-helpers.sh, ci-debug.sh, load-project.sh, parse-deps.sh, matrix_listener.sh
├── projects/ *.toml — per-project config
├── projects/ *.toml.example — templates; *.toml — local per-box config (gitignored)
├── formulas/ Issue templates (TOML specs for multi-step agent tasks)
└── docs/ Protocol docs (PHASE-PROTOCOL.md, EVIDENCE-ARCHITECTURE.md)
```

View file

@ -52,7 +52,27 @@ WOODPECKER_DB_NAME=woodpecker
CLAUDE_TIMEOUT=7200 # seconds per Claude invocation
```
## 2. Claude Code Global Settings
## 2. Configure Project TOML
Each project needs a `projects/<name>.toml` file with box-specific settings
(absolute paths, Woodpecker CI IDs, Matrix credentials). These files are
**gitignored** — they are local installation config, not shared code.
To create one:
```bash
# Automatic — generates TOML, clones repo, sets up cron:
disinto init https://codeberg.org/org/repo
# Manual — copy a template and fill in your values:
cp projects/myproject.toml.example projects/myproject.toml
vim projects/myproject.toml
```
The repo ships `projects/*.toml.example` templates showing the expected
structure. See any `.toml.example` file for the full field reference.
## 3. Claude Code Global Settings
Configure `~/.claude/settings.json` with **only** permissions and `skipDangerousModePermissionPrompt`. Do not add hooks to the global settings — `agent-session.sh` injects per-worktree hooks automatically.
@ -78,7 +98,7 @@ claude --dangerously-skip-permissions
# Exit after it initializes successfully
```
## 3. File Ownership
## 4. File Ownership
Everything under `/home/debian` must be owned by `debian:debian`. Root-owned files cause permission errors when agents run as the `debian` user.
@ -93,7 +113,7 @@ Verify no root-owned files exist in agent temp directories:
find /tmp/dev-* /tmp/harb-* /tmp/review-* -not -user debian 2>/dev/null
```
## 4. Prepare the Target Repo
## 5. Prepare the Target Repo
### Required: CI pipeline
@ -177,7 +197,7 @@ entire repo as "new", generating a noisy first-run diff.
See `formulas/run-planner.toml` (agents-update step) for the full AGENTS.md conventions.
## 5. Write Good Issues
## 6. Write Good Issues
Dev-agent works best with issues that have:
@ -192,7 +212,7 @@ Dev-agent works best with issues that have:
Dev-agent checks that all referenced issues are closed (= merged) before starting work. If any are open, the issue is skipped and checked again next cycle.
## 6. Install Cron
## 7. Install Cron
```bash
crontab -e
@ -251,7 +271,7 @@ FACTORY_ROOT=/home/you/disinto
The staggered offsets prevent agents from competing for resources. Each project gets its own lock file (`/tmp/dev-agent-{name}.lock`) derived from the `name` field in its TOML, so concurrent runs across projects are safe.
## 7. Verify
## 8. Verify
```bash
# Should complete with "all clear" (no problems to fix)
@ -272,7 +292,7 @@ tail -30 dev/dev-agent.log
tail -30 review/review.log
```
## 8. Optional: Matrix Notifications
## 9. Optional: Matrix Notifications
If you want real-time notifications and human-in-the-loop escalation:

View file

@ -1,26 +0,0 @@
# projects/disinto.toml — disinto develops itself
#
# The factory is its own project. Issues filed on johba/disinto
# are picked up by dev-poll, reviewed by review-poll, groomed by gardener.
name = "disinto"
repo = "johba/disinto"
repo_root = "/home/debian/dark-factory"
primary_branch = "main"
[ci]
woodpecker_repo_id = 4
stale_minutes = 60
[services]
containers = []
[matrix]
room_id = "!ynKSMyWU7OSkbNjR:matrix.allf.in"
bot_user = "@disinto-factory:matrix.allf.in"
token_env = "DISINTO_MATRIX_TOKEN"
[monitoring]
check_prs = true
check_dev_agent = true
check_pipeline_stall = false

View file

@ -0,0 +1,26 @@
# projects/disinto.toml.example — Template for disinto self-management
#
# Copy to projects/disinto.toml and fill in box-specific values,
# or run: disinto init https://codeberg.org/johba/disinto
name = "disinto"
repo = "johba/disinto"
repo_root = "/home/YOU/dark-factory"
primary_branch = "main"
[ci]
woodpecker_repo_id = 0
stale_minutes = 60
[services]
containers = []
[matrix]
room_id = "!your_room_id:matrix.example.org"
bot_user = "@disinto-factory:matrix.example.org"
token_env = "DISINTO_MATRIX_TOKEN"
[monitoring]
check_prs = true
check_dev_agent = true
check_pipeline_stall = false

View file

@ -1,28 +0,0 @@
# projects/harb.toml — Project config for johba/harb
#
# This file defines project-specific settings for disinto agents.
#
# push3-evolution subsystem: fitness_flags field is comma-separated
# (tools/push3-evolution/seeds/manifest.schema.json, harb#987)
name = "harb"
repo = "johba/harb"
repo_root = "/home/debian/harb"
primary_branch = "master"
[ci]
woodpecker_repo_id = 2
stale_minutes = 60
[services]
containers = ["ponder"]
[matrix]
room_id = "!LvLgiDVUbZKcRYga:matrix.allf.in"
bot_user = "@harb-factory:matrix.allf.in"
token_env = "MATRIX_TOKEN"
[monitoring]
check_prs = true
check_dev_agent = true
check_pipeline_stall = true

View file

@ -0,0 +1,26 @@
# projects/harb.toml.example — Template for johba/harb
#
# Copy to projects/harb.toml and fill in box-specific values,
# or run: disinto init https://codeberg.org/johba/harb
name = "harb"
repo = "johba/harb"
repo_root = "/home/YOU/harb"
primary_branch = "master"
[ci]
woodpecker_repo_id = 0
stale_minutes = 60
[services]
containers = ["ponder"]
[matrix]
room_id = "!your_room_id:matrix.example.org"
bot_user = "@harb-factory:matrix.example.org"
token_env = "MATRIX_TOKEN"
[monitoring]
check_prs = true
check_dev_agent = true
check_pipeline_stall = true

View file

@ -1,21 +0,0 @@
# projects/versi.toml — Project config for johba/versi
#
# This file defines project-specific settings for disinto agents.
# Drop a new TOML file here to add another project — no code changes needed.
name = "versi"
repo = "johba/versi"
repo_root = "/home/admin/versi"
primary_branch = "main"
[ci]
woodpecker_repo_id = 3
stale_minutes = 60
[services]
containers = []
[monitoring]
check_prs = true
check_dev_agent = true
check_pipeline_stall = true

View file

@ -0,0 +1,21 @@
# projects/versi.toml.example — Template for johba/versi
#
# Copy to projects/versi.toml and fill in box-specific values,
# or run: disinto init https://codeberg.org/johba/versi
name = "versi"
repo = "johba/versi"
repo_root = "/home/YOU/versi"
primary_branch = "main"
[ci]
woodpecker_repo_id = 0
stale_minutes = 60
[services]
containers = []
[monitoring]
check_prs = true
check_dev_agent = true
check_pipeline_stall = true