Uh oh!
There was an error while loading. Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork 0
Feature Development Workflow
Beez features are implemented vertically: from user story through tests and all affected layers to a green make all. Avoid changing only one layer (for example core models with no DSL binding or tests).
User story + acceptance criteria
↓
Tests first (unit → integration → system) ← TDD
↓
Core (models, registry, orchestrator)
↓
Plugins (Lua DSL, shell executor)
↓
CLI (when user-visible behavior changes)
↓
Documentation (wiki, CHANGELOG, in-repo docs)
↓
Refactor + make all (coverage ≥ 85% on src/)
Not vertical: extend Registry with no Lua parser change and no tests.
Vertical: the user can use the feature via build.lua or CLI, and every applicable test level passes.
Before coding, write down:
- What the user should be able to do
- Acceptance criteria (concrete, testable)
- Affected layers (core, lua plugin, orchestrator, CLI)
Example:
As a user, I want tasks to declare
depends_onso that execution order respects dependencies.
Layers: Task model, Registry, Lua DSL, Orchestrator, unit + integration + system tests.
- Pick the smallest testable slice of an acceptance criterion
- Write the test at the appropriate level (unit first)
- Register the file in
CMakeLists.txt - Run tests and confirm failure (compile error or assertion)
- Implement the minimum code to pass
- Work inside-out: core → plugins → orchestrator/CLI
- Re-run tests until green
- Clean naming, remove duplication
- Run tests after each change
- Run
make formatandmake lint-staleas needed
Repeat for each acceptance criterion.
| Change type | Minimum tests |
|---|---|
| Pure function / model | Unit |
| DSL field or syntax | Unit (lua) + integration |
| Run behavior / exit codes | Integration + system fixture |
| Parser grammar change | Unit + fuzz seed |
See Testing for directory conventions.
- Types in
include/beez/core/ - Logic in
src/core/ - Update
src/core/CMakeLists.txt
- Lua (
src/plugins/lua/lua_dsl.cpp,lua_settings.cpp): parse new DSL keys - Shell (
src/plugins/shell/): only when command execution changes
src/core/orchestrator.cppwhen scheduling, cache, or progress behavior changes
src/cli/and rarelysrc/app/main.cppfor new flags or commands
When lua_dsl.cpp or DSL syntax changes:
- Add a descriptive seed:
tests/fuzz/corpus/lua_dsl/<name>.lua - Run
make fuzzer-smoke - Never commit fuzzer hash artifacts
Documentation is part of the vertical slice, not a follow-up PR.
Update the wiki when users see different behavior. Common pages:
| Area | Pages |
|---|---|
| CLI | CLI Flag Reference, CLI Overview, Quick Reference |
| Config | Config Reference, Configuration Overview |
| DSL | DSL Overview, declaration pages |
| Cache | Caching chapter |
| UI | UI and Output chapter |
| Contributors | Feature Development Workflow, Code Quality, Building and Setup |
The wiki is a separate git repository on GitHub. Push wiki updates before or immediately after merging code.
CHANGELOG.mdfor user-visible changesREADME.mdfor quick start and install changesdocs/for developer workflow (repodocs/README.md)
make allDo not mark a feature done until the full pipeline passes. Line coverage on src/ must be ≥ 85% (make coverage, enforced in CI). If CI fails, fix and rerun.
Copy into a PR description:
[ ] User story and acceptance criteria documented
[ ] Failing tests written first (Red)
[ ] Minimum implementation (Green)
[ ] Refactor pass, tests still green
[ ] Core updated
[ ] Plugins updated (if DSL/execution affected)
[ ] Orchestrator/CLI updated (if needed)
[ ] CMakeLists.txt updated for new files
[ ] Unit tests (positive + negative)
[ ] Integration tests (if components interact)
[ ] System fixture + scenario (if end-to-end)
[ ] Fuzz seed (if DSL/parser changed)
[ ] Wiki updated (if user-visible behavior changed)
[ ] CHANGELOG.md / README / docs updated (as appropriate)
[ ] make coverage ≥ 85% on src/
[ ] make all green
Implement feature: <short description>
User story:
As a <role>, I want <action> so that <benefit>.
Acceptance criteria:
- ...
- ...
Implement vertically with TDD (Red → Green → Refactor).
Update wiki and CHANGELOG for user-visible changes.
Run make all before finishing (coverage ≥ 85% on src/).
- Production code before tests
- Tests deferred to a follow-up PR
- Only
make testwhile skipping format, lint, fuzz, sanitizers, or coverage - User-visible merge without wiki or CHANGELOG update
- Line coverage on
src/below 85% - New
.cppfiles not added to CMake - Nested module directories under
src/
- Repository Layout - file placement
- Testing - test types and fuzz corpus
- Code Quality -
make allbreakdown - Submitting Changes - PR and CI
Quick Reference · Glossary · FAQ
- Fundamentals
- Core Concepts
- Project Layout
- First Pipeline
- Phases and Scopes
- How Phases and Scopes Work
- Selecting with Phases and Scopes
- Designing Phases and Scopes
- Parallel Execution and Dependencies
- Configuration
- Configuration Overview
- Global User Config
- Project Config
- Environment Variables
- Performance Settings
- Cache Settings
- Config Reference
- CLI
- CLI Overview
- Running Targets
- Filtering by Phase
- Running a Single Step
- Listing Entities
- Output and Logging Flags
- Cache and Maintenance Flags
- Meta and Utility Commands
- Project Scaffolding —
beez --init(embedded Tempify) - CLI Flag Reference
- Lua DSL
- DSL Overview
- Plugin System — Plugins, Config DSL, Standard-Workflows
- Step Declaration
- Task Declaration
- Workflow Declaration
- Order Declaration
- Configure Step
- ReqPack Declaration
- Beez API
- Step Context
- DSL Patterns
- Caching
- Caching Overview
- Step Cache
- Success Cache
- Glob Metadata Cache
- Artifact Patterns
- Cache Keys and Invalidation
- Cache Storage and Maintenance
- Caching Troubleshooting
- Development and Contribution
- Building and Setup
- Repository Layout
- Testing
- Code Quality
- Feature Development Workflow
- Submitting Changes