Commit graph

27 commits

Author SHA1 Message Date
ee6c411f3c
feat: add click-based colorized output with progress events and build timer
- Add click as explicit dependency (already bundled with typer)
- Replace typer.echo calls with click.echo + click.style for colorized output
- Add BuildEvent enum and ProgressCallback to builder for decoupled progress reporting
- Remove direct typer dependency from builder module
- Show per-target status with colored labels (skip/ok/fail/...)
- Display elapsed build time in summary
- Colorize graph and clean command output
- Update CLI tests to match new output format
2026-02-14 21:25:38 +01:00
6a9d7efd5d
fix: send images to Mistral as base64 vision chunks instead of placeholders
All checks were successful
Continuous Integration / Build Package (push) Successful in 34s
Continuous Integration / Lint, Check & Test (push) Successful in 53s
The text provider now includes reference_images alongside inputs when
building prompts. Image files are sent as base64 data URLs via
ImageURLChunk for actual multimodal vision support, replacing the
previous [Attached image: ...] placeholder text.
2026-02-14 17:45:39 +01:00
d565329e16
feat: support multiple reference images with model-aware API mapping
All checks were successful
Continuous Integration / Build Package (push) Successful in 31s
Continuous Integration / Lint, Check & Test (push) Successful in 49s
Replace singular reference_image field with reference_images list to
support an arbitrary number of reference images. Map them to the correct
BFL API parameter names based on model family:
- flux-2-*: input_image, input_image_2, ..., input_image_8
- flux-kontext-*: input_image, input_image_2, ..., input_image_4
- flux 1.x: image_prompt (single)

BREAKING CHANGE: reference_image config field renamed to reference_images (list).
2026-02-14 17:19:54 +01:00
b69c38ac13
fix: inline WriteConfig type alias in tests to fix nix flake check
All checks were successful
Continuous Integration / Build Package (push) Successful in 32s
Continuous Integration / Lint, Check & Test (push) Successful in 51s
The tests.conftest import could not be resolved in the nix sandbox
because tests is not a proper package. Define the WriteConfig type
alias directly in test_builder.py and test_graph.py instead.
2026-02-14 16:50:55 +01:00
cf73511876
refactor: replace blackforest package with custom async BFL client
Some checks failed
Continuous Integration / Build Package (push) Successful in 41s
Continuous Integration / Lint, Check & Test (push) Failing after 59s
Implement bulkgen/providers/bfl.py with a fully async httpx-based client
that supports all current and future BFL models (including flux-2-*).
Remove the blackforest dependency and simplify the image provider by
eliminating the asyncio.to_thread wrapper.
2026-02-14 16:44:36 +01:00
fd09d127f2
docs: add home-manager installation instructions to README
Some checks failed
Continuous Integration / Build Package (push) Successful in 35s
Continuous Integration / Lint, Check & Test (push) Failing after 55s
2026-02-14 11:19:15 +01:00
eef9712924
test: add integration tests for all modules
Some checks failed
Continuous Integration / Build Package (push) Successful in 34s
Continuous Integration / Lint, Check & Test (push) Failing after 48s
- Add pytest-asyncio dev dependency and configure asyncio_mode=auto
- Add filterwarnings to suppress third-party PydanticDeprecatedSince20
- Add conftest.py with shared fixtures (project_dir, write_config, etc.)
- Add test_config.py: YAML loading, target type inference, model resolution
- Add test_graph.py: DAG construction, cycle detection, build ordering
- Add test_state.py: hash functions, state persistence, dirty checking
- Add test_builder.py: full build pipeline with FakeProvider, incremental
  builds, selective builds, error isolation, dependency cascading
- Add test_providers.py: ImageProvider and TextProvider with mocked clients
- Add test_cli.py: build/clean/graph commands via typer CliRunner
- All 94 tests pass with 0 basedpyright warnings
2026-02-14 11:07:36 +01:00
452b3c4eb0
docs: add MIT license
All checks were successful
Continuous Integration / Build Package (push) Successful in 2m7s
Continuous Integration / Lint, Check & Test (push) Successful in 2m16s
2026-02-14 10:48:13 +01:00
a662d69559
ci: add forgejo pipeline with nix flake check and build 2026-02-14 10:45:28 +01:00
08952eb70f
feat: add git-hooks.nix pre-commit checks to flake
Add cachix/git-hooks.nix input and wire basedpyright, ruff,
ruff-format, and commitizen hooks into flake checks and devShell.
The basedpyright hook runs against a Nix-built venv so imports
resolve correctly in the sandbox.
2026-02-14 10:42:33 +01:00
a32e0f1b3e
feat: add home-manager module for programs.bulkgen.enable
Expose homeManagerModules.bulkgen and homeManagerModules.default
from the flake. The module provides programs.bulkgen.enable and
programs.bulkgen.package options, adding bulkgen to home.packages
when enabled.
2026-02-14 10:33:33 +01:00
6926d0492d
fix: update default image model from flux-pro to flux-pro-1.1
The flux-pro endpoint returns 403 Forbidden as it has been
deprecated by BlackForestLabs. flux-pro-1.1 is the current
supported version.
2026-02-14 10:25:08 +01:00
c818e6452e
feat: add nix flake with uv2nix packaging and pytest checks 2026-02-13 20:44:12 +01:00
09ff809e9a
chore: add basedpyright and ruff to dev dependencies 2026-02-13 20:29:47 +01:00
7ab25d49cb
refactor: switch to basedpyright, remove pydantic-settings
- Replace pyright with basedpyright in devenv.nix (custom hook)
- Add basedpyright to devenv packages
- Fix all basedpyright warnings: add DiGraph[str] type args, annotate
  class attributes, narrow SyncResponse, handle unused call results,
  suppress unavoidable Any from yaml.safe_load and untyped blackforest
- Replace pydantic-settings[yaml] with direct pyyaml dependency
- Update CLAUDE.md to reflect basedpyright and dependency changes
2026-02-13 20:25:28 +01:00
f71af1cfaf
docs: add CLAUDE.md development guide and README.md user docs
CLAUDE.md covers architecture, data flow, code style conventions,
provider specifics, and all commands needed for development.

README.md covers installation, quick start, full config format
reference, CLI usage, incremental builds, and environment variables.
2026-02-13 20:18:51 +01:00
d38682597c
feat: wire entry point to typer CLI app
Replace stub with import of bulkgen.cli.app
2026-02-13 20:14:37 +01:00
1d98c0010a
feat: add CLI commands (build, clean, graph)
- build: executes all or specific target with dependency resolution
- clean: removes generated artifacts and state file, preserves inputs
- graph: prints dependency graph with build stages
- Config discovery: finds single *.bulkgen.yaml in working directory
2026-02-13 20:14:16 +01:00
bb4b2e2b86
feat: add build orchestrator with incremental and parallel execution
- run_build() drives the full build pipeline
- Topological generations executed concurrently via asyncio.gather()
- Incremental builds: skip clean targets, rebuild dirty ones
- Error isolation: failed targets don't block independent branches
- State saved after each generation for crash resilience
2026-02-13 20:13:33 +01:00
15fdff7763
feat: add Mistral text generation provider
- Uses native async API (chat.complete_async)
- Appends text input file contents to prompt with headers
- Notes image inputs as attached references
- Writes raw LLM response directly to output file
2026-02-13 20:12:45 +01:00
45f590cf11
chore: add pyrightconfig.json pointing to devenv venv
Allows pyright to resolve third-party imports from .devenv/state/venv
2026-02-13 20:10:48 +01:00
aecfc4b82f
feat: add abstract Provider base class
- Defines async generate() interface for generation backends
- Takes target config, resolved prompt/model, and project dir
2026-02-13 20:10:02 +01:00
bedc0cc9ec
feat: add networkx dependency graph construction
- build_graph() creates a DAG from project config with validation
- get_build_order() wraps topological_generations() for parallel batches
- get_subgraph_for_target() extracts transitive deps for single-target builds
- Validates missing dependencies and cycle detection
2026-02-13 20:08:53 +01:00
ce2160bd6c
feat: add incremental build state tracking
- TargetState/BuildState pydantic models for .bulkgen.state.yaml
- SHA-256 hashing for files and strings
- is_target_dirty() checks output existence, input hashes, prompt, model, and extra params
- record_target_state() persists hashes after successful builds
- load_state()/save_state() for YAML serialization
2026-02-13 20:08:16 +01:00
bda2b8c8e7
feat: add pydantic config models for YAML parsing
- TargetType enum with IMAGE/TEXT variants
- Defaults, TargetConfig, ProjectConfig pydantic models
- infer_target_type() for extension-based type dispatch
- resolve_model() for default/override model resolution
- load_config() using yaml.safe_load + model_validate
2026-02-13 20:07:44 +01:00
53e402b119
feat: scaffold project structure with package dirs and mistralai dependency
- Create bulkgen/ package with __init__.py
- Create bulkgen/providers/ subpackage with __init__.py
- Add mistralai>=1.0.0 to dependencies
- Add [project.scripts] entry point and [build-system] with hatchling
- Add .bulkgen.state.yaml to .gitignore
2026-02-13 20:07:08 +01:00
4fd7f94db3
build: set up project for bulkgen 2026-02-13 19:32:47 +01:00