239 lines
11 KiB
Markdown
239 lines
11 KiB
Markdown
# Repository Intelligence Bootstrap
|
|
|
|
This document explains the Repository Intelligence Bootstrap system: what it is,
|
|
how it works, how agents use it, and how to maintain it.
|
|
|
|
## Overview
|
|
|
|
When the Orchestrator starts work on an unfamiliar repository, it first checks
|
|
whether a local `.opencode/` knowledge layer exists and is current. If not, it
|
|
generates or refreshes it. Every agent then reads this pre-analyzed context
|
|
instead of re-discovering repository fundamentals from scratch.
|
|
|
|
**Repository intelligence is a knowledge accelerator, not a substitute for
|
|
source-of-truth code.** Agents still verify claims against the actual repository.
|
|
|
|
## Bootstrap flow
|
|
|
|
```text
|
|
Orchestrator starts task
|
|
↓
|
|
detect repo root
|
|
↓
|
|
repo-bootstrap.sh status → fresh | stale | missing
|
|
↓
|
|
┌────────────────────────────────────┐
|
|
│ missing or stale? (exit code ≠ 0) │──yes──→ repo-bootstrap.sh bootstrap
|
|
└──────────┬─────────────────────────┘ → scaffold .opencode/ structure
|
|
│ no → Orchestrator/Explorer enrich content
|
|
↓
|
|
read .opencode/AGENTS.md + relevant skills
|
|
↓
|
|
build task plan with repo context
|
|
↓
|
|
dispatch specialized agents
|
|
↓
|
|
agents update knowledge when durable discoveries are made
|
|
↓
|
|
Reviewer verifies repo intelligence consistency
|
|
```
|
|
|
|
The bootstrap is **idempotent**: running it multiple times does not overwrite
|
|
manually enriched content. Only files generated by the bootstrap tool are
|
|
regenerated, and only when the staleness fingerprint changes.
|
|
|
|
## Bootstrap tool (fallback procedure)
|
|
|
|
The accompanying script `"${OPENCODE_DEV_AGENT_TEAM:-$HOME/.config/opencode/dev-agent-team}"/bin/repo-bootstrap.sh` (in this team's distribution)
|
|
performs the mechanical work: scaffolding `.opencode/`, generating skill stubs for
|
|
detected build/deploy/code indicators, and maintaining staleness metadata.
|
|
|
|
If the script is not available at the expected path, perform the equivalent steps
|
|
inline: check `.opencode/.bootstrap-meta` for fingerprint freshness, create
|
|
missing skill directories, and never overwrite manually enriched files.
|
|
|
|
## .opencode structure
|
|
|
|
After a successful bootstrap, the repository looks like this:
|
|
|
|
```text
|
|
<repository root>/
|
|
├── AGENTS.md # opencode auto-loads this from project root
|
|
└── .opencode/
|
|
├── AGENTS.md # full intelligence entry point
|
|
├── .bootstrap-meta # staleness metadata (key=value)
|
|
└── skills/
|
|
├── repo-context/SKILL.md # purpose, structure, modules
|
|
├── architecture/SKILL.md # components, boundaries, rules (if code detected)
|
|
├── build-and-test/SKILL.md # build, test, lint commands (if build indicators detected)
|
|
├── conventions/SKILL.md # coding, naming, workflow conventions
|
|
└── deployment/SKILL.md # deploy/runtime info (if deploy indicators detected)
|
|
```
|
|
|
|
### Relevance detection
|
|
|
|
The bootstrap does not blindly create every directory. It detects repository
|
|
type from manifest files and top-level structure:
|
|
|
|
| Indicator | Skill generated | Detection signals |
|
|
|----------------|--------------------------------|-----------------------------------------------|
|
|
| Always | repo-context, conventions | (always relevant) |
|
|
| `has_code` | architecture | `src/`, `lib/`, `packages/`, or build files |
|
|
| `has_build` | build-and-test | `package.json`, `pyproject.toml`, `Cargo.toml`, `go.mod`, `Makefile`, etc. |
|
|
| `has_deploy` | deployment | `Dockerfile`, `.github/workflows/`, `*.tf`, etc. |
|
|
|
|
### Idempotency rules
|
|
|
|
- Generated files carry a marker comment: `<!-- GENERATED-SCAFFOLD dev_agent_team repo-bootstrap ... -->`
|
|
- The bootstrap never overwrites files without this marker (manual content is
|
|
preserved).
|
|
- A second run with unchanged fingerprints produces zero changes.
|
|
- Agents strip the marker when they substantially enrich a generated file,
|
|
freezing it as manual content.
|
|
|
|
### Backward compatibility
|
|
|
|
- Repositories without `.opencode/` continue to work — bootstrap creates it.
|
|
- Repositories with existing manually written `.opencode/` files are handled
|
|
safely — the bootstrap never destroys or silently replaces them.
|
|
|
|
## Staleness detection
|
|
|
|
The bootstrap writes `.opencode/.bootstrap-meta` (key=value, POSIX-compatible,
|
|
no JSON parser required) containing:
|
|
|
|
- `schema` — metadata format version
|
|
- `tool`, `version` — bootstrap tool identity
|
|
- `generated_at` — ISO 8601 timestamp
|
|
- `git_head` — current HEAD sha (informational, not a staleness trigger)
|
|
- `manifest_fingerprint` — SHA-256 of all build/test/deploy config file contents
|
|
- `top_level_fingerprint` — SHA-256 of sorted top-level directory listing
|
|
- `signals` — detected capabilities (build/deploy/code)
|
|
|
|
**Staleness signals:** the metadata is stale when the manifest fingerprint
|
|
changes (dependency or build config updated), the top-level structure changes
|
|
materially, or the meta file is missing/corrupted. A changed git HEAD alone
|
|
does not force refresh — dependency and structure changes are the meaningful
|
|
signals.
|
|
|
|
## Orchestrator responsibility
|
|
|
|
The Orchestrator's "Repository Intelligence Bootstrap" stage runs on every task
|
|
start, before task classification and agent dispatch:
|
|
|
|
1. Detect repo root.
|
|
2. Check `.opencode/` existence and freshness via `repo-bootstrap.sh status`.
|
|
3. If missing/stale: run `repo-bootstrap.sh bootstrap`, then enrich content.
|
|
4. Read the generated context.
|
|
5. Build the task plan using that context.
|
|
6. Dispatch agents with relevant skill references in their briefs.
|
|
|
|
The Orchestrator also controls ownership rules and refresh decisions.
|
|
|
|
## Agent responsibilities
|
|
|
|
### Consumption rules (all agents)
|
|
|
|
1. Read `.opencode/AGENTS.md` at task start (or receive it via orchestrator brief).
|
|
2. Read the relevant skill for the agent's domain.
|
|
3. Treat repo intelligence as context, not truth — verify against the repository.
|
|
4. Avoid rediscovery: if knowledge exists in `.opencode/`, do not re-explore it.
|
|
5. Add durable discoveries only to role-owned files.
|
|
6. Never fill `.opencode/` with task-specific noise.
|
|
|
|
### Ownership rules
|
|
|
|
| Skill | Primary owner | Role |
|
|
|--------------------------|------------------|-------------------------------------------------|
|
|
| repo-context | Explorer | verify/enrich purpose, structure, dependencies |
|
|
| architecture | Architect | verify/enrich components, boundaries, rules |
|
|
| build-and-test | Builder + Tester | verify/enrich build, test, lint, validation |
|
|
| conventions | Maintainer | verify/enrich coding, naming, workflow standards |
|
|
| deployment | (no permanent) | enriched by whoever handles deployment |
|
|
| AGENTS.md (root + .opencode/) | Orchestrator | lifecycle, structural references |
|
|
| All .opencode/ (validate) | Reviewer | verify consistency against source; reports findings |
|
|
| All .opencode/ (audit) | Maintainer | detect staleness, dedup, cleanup |
|
|
|
|
### How agents enrich generated content
|
|
|
|
When an agent makes a durable discovery that should persist beyond the session:
|
|
|
|
1. Verify the fact against the actual repository.
|
|
2. Edit the relevant skill file in `.opencode/skills/`.
|
|
3. Strip the `GENERATED-SCAFFOLD` marker comment from the file.
|
|
4. This freezes the file as manual content — future bootstrap runs will not
|
|
overwrite it.
|
|
|
|
## Knowledge lifecycle
|
|
|
|
Repository knowledge must be concise, evidence-backed, discoverable, updateable,
|
|
versionable, and resistant to staleness.
|
|
|
|
- Knowledge lives in `.opencode/` skills (e.g. `architecture`, `build-and-test`,
|
|
`conventions` play the role of the `knowledge/architecture.md`,
|
|
`knowledge/build.md`, `knowledge/conventions.md` files). Do NOT create separate
|
|
`knowledge/` or `state/` directories unless a concrete need appears — the
|
|
existing skills + `AgentsReport/` already separate durable repo knowledge from
|
|
task state.
|
|
- When new durable facts are discovered: (1) decide whether they belong in
|
|
repository knowledge, (2) identify the correct knowledge owner (ownership
|
|
table), (3) update only that document, (4) preserve valid existing
|
|
information, (5) never record temporary task details as permanent knowledge.
|
|
- Stale `.opencode/` content is detected by the bootstrap fingerprints; when a
|
|
manual fact is disproven by the repository, the owning agent corrects it
|
|
(Maintainer for conventions, Architect for architecture, Explorer for context,
|
|
Builder/Tester for build-and-test).
|
|
|
|
## Example: freshly initialized repository
|
|
|
|
Running `repo-bootstrap.sh bootstrap` in a Node.js project with Docker:
|
|
|
|
```text
|
|
<repository root>/
|
|
├── AGENTS.md # pointer to .opencode/AGENTS.md
|
|
├── .opencode/
|
|
│ ├── AGENTS.md # full entry: purpose, structure, skills pointers
|
|
│ ├── .bootstrap-meta # freshness metadata
|
|
│ └── skills/
|
|
│ ├── repo-context/SKILL.md # purpose, structure, dependencies
|
|
│ ├── architecture/SKILL.md # components, boundaries (code detected)
|
|
│ ├── build-and-test/SKILL.md # npm, jest, eslint (package.json detected)
|
|
│ ├── conventions/SKILL.md # style, naming, workflow
|
|
│ └── deployment/SKILL.md # Docker, CI/CD (Dockerfile detected)
|
|
```
|
|
|
|
The generated files contain scaffold sections with placeholders. Agents
|
|
(Explorer, Architect, Builder, Tester, etc.) then enrich each skill with
|
|
verified facts, strip the marker, and the knowledge becomes durable.
|
|
|
|
## Tests
|
|
|
|
The test suite is at `scripts/test-repo-bootstrap.sh`. It covers all 10
|
|
acceptance criteria:
|
|
|
|
1. `.opencode` created for new repository
|
|
2. Bootstrap is idempotent
|
|
3. Existing manual content is preserved
|
|
4. Relevant repository skills are generated
|
|
5. Orchestrator loads repo context before dispatch (structural)
|
|
6. Every agent references `.opencode` (structural)
|
|
7. Stale knowledge is detectable
|
|
8. Unrelated repositories do not inherit hardcoded assumptions
|
|
9. Existing agent workflows still work
|
|
10. Malformed/incomplete intelligence is handled safely
|
|
|
|
Run with: `bash scripts/test-repo-bootstrap.sh`
|
|
|
|
## Design decisions
|
|
|
|
- **Script handles mechanics, LLM handles intelligence**: `repo-bootstrap.sh`
|
|
performs deterministic scaffolding and metadata; agents (Orchestrator,
|
|
Explorer, Architect, etc.) enrich with semantic understanding.
|
|
- **Key=value metadata (no JSON parser)**: avoids `jq` dependency; POSIX-portable.
|
|
- **Marker-based manual protection**: simple, reliable, no complex versioning.
|
|
- **Skills format follows opencode conventions**: `.opencode/skills/<name>/SKILL.md`
|
|
with `name` + `description` frontmatter — works with opencode's native skill
|
|
loader wherever `skill: allow` is set.
|
|
- **Agents consume via file reads** (not skill tool): compatible with the current
|
|
`skill: deny` permission on subagents; also opencode-version-agnostic.
|