mirror of
https://github.com/Monadical-SAS/cubbi.git
synced 2025-12-20 12:19:07 +00:00
* feat: migrate container configuration from env vars to YAML config files
- Replace environment variable-based configuration with structured YAML config files
- Add Pydantic models for type-safe configuration management in cubbi_init.py
- Update container.py to generate /cubbi/config.yaml and mount into containers
- Simplify goose plugin to extract provider from default model format
- Remove complex environment variable handling in favor of direct config access
- Maintain backward compatibility while enabling cleaner plugin architecture
* feat: optimize goose plugin to only pass required API key for selected model
- Update goose plugin to set only the API key for the provider of the selected model
- Add selective API key configuration for anthropic, openai, google, and openrouter
- Update README.md with comprehensive automated testing documentation
- Add litellm/gpt-oss:120b to test.sh model matrix (now 5 images × 4 models = 20 tests)
- Include single prompt command syntax for each tool in the documentation
* feat: add comprehensive integration tests with pytest parametrization
- Create tests/test_integration.py with parametrized tests for 5 images × 4 models (20 combinations)
- Add pytest configuration to exclude integration tests by default
- Add integration marker for selective test running
- Include help command tests and image availability tests
- Document test usage in tests/README_integration.md
Integration tests cover:
- goose, aider, claudecode, opencode, crush images
- anthropic/claude-sonnet-4-20250514, openai/gpt-4o, openrouter/openai/gpt-4o, litellm/gpt-oss:120b models
- Proper command syntax for each tool
- Success validation with exit codes and completion markers
Usage:
- pytest (regular tests only)
- pytest -m integration (integration tests only)
- pytest -m integration -k "goose" (specific image)
* feat: update OpenCode plugin with perfect multi-provider configuration
- Add global STANDARD_PROVIDERS constant for maintainability
- Support custom providers (with baseURL) vs standard providers
- Custom providers: include npm package, name, baseURL, apiKey, models
- Standard providers: include only apiKey and empty models
- Use direct API key values from cubbi config instead of env vars
- Only add default model to the provider that matches the default model
- Use @ai-sdk/openai-compatible for OpenAI-compatible providers
- Preserve model names without transformation
- All providers get required empty models{} section per OpenCode spec
This ensures OpenCode can properly recognize and use both native
providers (anthropic, openai, google, openrouter) and custom
providers (litellm, etc.) with correct configuration format.
* refactor: model is now a combination of provider/model
* feat: add separate integration test for Claude Code without model config
Claude Code is Anthropic-specific and doesn't require model selection like other tools.
Created dedicated test that verifies basic functionality without model preselection.
* feat: update Claude Code and Crush plugins to use new config system
- Claude Code plugin now uses cubbi_config.providers to get Anthropic API key
- Crush plugin updated to use cubbi_config.providers for provider configuration
- Both plugins maintain backwards compatibility with environment variables
- Consistent plugin structure across all cubbi images
* feat: add environments_to_forward support for images
- Add environments_to_forward field to ImageConfig and Image models
- Update container creation logic to forward specified environment variables from host
- Add environments_to_forward to claudecode cubbi_image.yaml to ensure Anthropic API key is always available
- Claude Code now gets required environment variables regardless of model selection
- This ensures Claude Code works properly even when other models are specified
Fixes the issue where Claude Code couldn't access Anthropic API key when using different model configurations.
* refactor: remove unused environment field from cubbi_image.yaml files
The 'environment' field was loaded but never processed at runtime.
Only 'environments_to_forward' is actually used to pass environment
variables from host to container.
Cleaned up configuration files by removing:
- 72 lines from aider/cubbi_image.yaml
- 42 lines from claudecode/cubbi_image.yaml
- 28 lines from crush/cubbi_image.yaml
- 16 lines from goose/cubbi_image.yaml
- Empty environment: [] from opencode/cubbi_image.yaml
This makes the configuration files cleaner and only contains
fields that are actually used by the system.
* feat: implement environment variable forwarding for aider
Updates aider to automatically receive all relevant environment variables
from the host, similar to how opencode works.
Changes:
- Added environments_to_forward field to aider/cubbi_image.yaml with
comprehensive list of API keys, configuration, and proxy variables
- Updated aider_plugin.py to use cubbi_config system for provider/model setup
- Environment variables now forwarded automatically during container creation
- Maintains backward compatibility with legacy environment variables
Environment variables forwarded:
- API Keys: OPENAI_API_KEY, ANTHROPIC_API_KEY, DEEPSEEK_API_KEY, etc.
- Configuration: AIDER_MODEL, GIT_* variables, HTTP_PROXY, etc.
- Timezone: TZ for proper log timestamps
Tested: All aider tests pass, environment variables confirmed forwarded.
* refactor: remove unused volumes and init fields from cubbi_image.yaml files
Both 'volumes' and 'init' fields were loaded but never processed at runtime.
These were incomplete implementations that didn't affect container behavior.
Removed from all 5 images:
- volumes: List with mountPath: /app (incomplete, missing host paths)
- init: pre_command and command fields (unused during container creation)
The cubbi_image.yaml files now only contain fields that are actually used:
- Basic metadata (name, description, version, maintainer, image)
- persistent_configs (working functionality)
- environments_to_forward (working functionality where present)
This makes the configuration files cleaner and eliminates confusion
about what functionality is actually implemented.
* refactor: remove unused ImageInit and VolumeMount models
These models were only referenced in the Image model definition but
never used at runtime since we removed all init: and volumes: fields
from cubbi_image.yaml files.
Removed:
- VolumeMount class (mountPath, description fields)
- ImageInit class (pre_command, command fields)
- init: Optional[ImageInit] field from Image model
- volumes: List[VolumeMount] field from Image model
The Image model now only contains fields that are actually used:
- Basic metadata (name, description, version, maintainer, image)
- environment (loaded but unused - kept for future cleanup)
- persistent_configs (working functionality)
- environments_to_forward (working functionality)
This makes the data model cleaner and eliminates dead code.
* feat: add interactive configuration command
Adds `cubbi configure` command for interactive setup of LLM providers
and models through a user-friendly questionnaire interface.
New features:
- Interactive provider configuration (OpenAI, Anthropic, OpenRouter, etc.)
- API key management with environment variable references
- Model selection with provider/model format validation
- Default settings configuration (image, ports, volumes, etc.)
- Added questionary dependency for interactive prompts
Changes:
- Added cubbi/configure.py with full interactive configuration logic
- Added configure command to cubbi/cli.py
- Updated uv.lock with questionary and prompt-toolkit dependencies
Usage: `cubbi configure`
* refactor: update integration tests for current functionality
Updates integration tests to reflect current cubbi functionality:
test_integration.py:
- Simplified image list (removed crush temporarily)
- Updated model list with current supported models
- Removed outdated help command tests that were timing out
- Simplified claudecode test to basic functionality test
- Updated command templates for current tool versions
test_integration_docker.py:
- Cleaned up container management tests
- Fixed formatting and improved readability
- Updated assertion formatting for better error messages
These changes align the tests with the current state of the codebase
and remove tests that were causing timeouts or failures.
* fix: fix temporary file chmod
133 lines
3.1 KiB
TOML
133 lines
3.1 KiB
TOML
[project]
|
|
name = "cubbi"
|
|
version = "0.4.0"
|
|
description = "Cubbi Container Tool"
|
|
readme = "README.md"
|
|
requires-python = ">=3.12"
|
|
license = "MIT"
|
|
authors = [
|
|
{name = "Monadical SAS", email = "contact@monadical.com"}
|
|
]
|
|
dependencies = [
|
|
"typer>=0.9.0",
|
|
"docker>=7.0.0",
|
|
"pyyaml>=6.0.1",
|
|
"rich>=13.6.0",
|
|
"pydantic>=2.5.0",
|
|
"questionary>=2.0.0",
|
|
]
|
|
classifiers = [
|
|
"Development Status :: 3 - Alpha",
|
|
"Programming Language :: Python :: 3.12",
|
|
"Intended Audience :: Developers",
|
|
"Intended Audience :: Science/Research",
|
|
"License :: OSI Approved :: MIT License",
|
|
"Operating System :: OS Independent",
|
|
"Topic :: Software Development",
|
|
"Topic :: Scientific/Engineering :: Artificial Intelligence"
|
|
]
|
|
|
|
[build-system]
|
|
requires = ["hatchling"]
|
|
build-backend = "hatchling.build"
|
|
|
|
[project.optional-dependencies]
|
|
dev = [
|
|
"pytest>=7.4.0",
|
|
"ruff>=0.1.9",
|
|
"mypy>=1.7.0",
|
|
]
|
|
|
|
[project.scripts]
|
|
cubbi = "cubbi.cli:app"
|
|
cubbix = "cubbi.cli:session_create_entry_point"
|
|
|
|
[tool.ruff]
|
|
line-length = 88
|
|
target-version = "py312"
|
|
|
|
[tool.pytest.ini_options]
|
|
# Exclude integration tests by default
|
|
addopts = "-v --tb=short -m 'not integration'"
|
|
markers = [
|
|
"integration: marks tests as integration tests (deselected by default)",
|
|
]
|
|
|
|
[tool.mypy]
|
|
python_version = "3.12"
|
|
warn_return_any = true
|
|
warn_unused_configs = true
|
|
disallow_untyped_defs = true
|
|
disallow_incomplete_defs = true
|
|
|
|
[dependency-groups]
|
|
dev = [
|
|
"pytest>=8.3.5",
|
|
]
|
|
|
|
[tool.semantic_release]
|
|
assets = []
|
|
build_command_env = []
|
|
commit_message = "{version}\n\nAutomatically generated by python-semantic-release"
|
|
logging_use_named_masks = false
|
|
major_on_zero = true
|
|
allow_zero_version = true
|
|
no_git_verify = false
|
|
tag_format = "v{version}"
|
|
version_toml = [
|
|
"pyproject.toml:project.version:nf"
|
|
]
|
|
|
|
[tool.semantic_release.branches.main]
|
|
match = "(main|master)"
|
|
prerelease_token = "rc"
|
|
prerelease = false
|
|
|
|
[tool.semantic_release.changelog]
|
|
exclude_commit_patterns = []
|
|
mode = "init"
|
|
insertion_flag = "<!-- version list -->"
|
|
template_dir = "templates"
|
|
|
|
[tool.semantic_release.changelog.default_templates]
|
|
changelog_file = "CHANGELOG.md"
|
|
output_format = "md"
|
|
mask_initial_release = false
|
|
|
|
[tool.semantic_release.changelog.environment]
|
|
block_start_string = "{%"
|
|
block_end_string = "%}"
|
|
variable_start_string = "{{"
|
|
variable_end_string = "}}"
|
|
comment_start_string = "{#"
|
|
comment_end_string = "#}"
|
|
trim_blocks = false
|
|
lstrip_blocks = false
|
|
newline_sequence = "\n"
|
|
keep_trailing_newline = false
|
|
extensions = []
|
|
autoescape = false
|
|
|
|
[tool.semantic_release.commit_author]
|
|
env = "GIT_COMMIT_AUTHOR"
|
|
default = "semantic-release <semantic-release>"
|
|
|
|
[tool.semantic_release.commit_parser_options]
|
|
minor_tags = ["feat"]
|
|
patch_tags = ["fix", "perf"]
|
|
other_allowed_tags = ["build", "chore", "ci", "docs", "style", "refactor", "test"]
|
|
allowed_tags = ["feat", "fix", "perf", "build", "chore", "ci", "docs", "style", "refactor", "test"]
|
|
default_bump_level = 0
|
|
parse_squash_commits = false
|
|
ignore_merge_commits = false
|
|
|
|
[tool.semantic_release.remote]
|
|
name = "origin"
|
|
type = "github"
|
|
ignore_token_for_push = false
|
|
insecure = false
|
|
|
|
[tool.semantic_release.publish]
|
|
dist_glob_patterns = ["dist/*"]
|
|
upload_to_vcs_release = true
|