|
| 1 | +# Changelog |
| 2 | + |
| 3 | +All notable changes to apcore-cli (Python SDK) will be documented in this file. |
| 4 | + |
| 5 | +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), |
| 6 | +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). |
| 7 | + |
| 8 | +## [Unreleased] |
| 9 | + |
| 10 | +### Added |
| 11 | +- `--sandbox` flag for subprocess-isolated module execution (FE-05) |
| 12 | +- `ModuleExecutionError` exception class for sandbox failures |
| 13 | +- Windows approval timeout support via `threading.Timer` + `ctypes` (FE-03) |
| 14 | +- Approval timeout clamping to 1..3600 seconds range (FE-03) |
| 15 | +- Tag format validation (`^[a-z][a-z0-9_-]*$`) in `list --tag` (FE-04) |
| 16 | +- `cli.auto_approve` config key with `False` default (FE-07) |
| 17 | +- Extensions directory readability check with exit code 47 (FE-01) |
| 18 | +- Missing required property warning in schema parser (FE-02) |
| 19 | +- DEBUG log `"Loading extensions from {path}"` before registry discovery (FE-01) |
| 20 | +- `TYPE_CHECKING` imports for proper type annotations (`Registry`, `Executor`, `ModuleDescriptor`, `ConfigResolver`, `AuditLogger`) |
| 21 | +- `_get_module_id()` helper for `canonical_id`/`module_id` resolution |
| 22 | +- `APCORE_AUTH_API_KEY` and `APCORE_CLI_SANDBOX` to README environment variables table |
| 23 | +- `--sandbox` to README module execution options table |
| 24 | +- CHANGELOG.md |
| 25 | + |
| 26 | +### Changed |
| 27 | +- AES-GCM wire format from `nonce + ciphertext + tag` to `nonce + tag + ciphertext` (spec-aligned, **breaking** for pre-existing encrypted configs) |
| 28 | +- AES-GCM implementation from high-level `AESGCM` API to low-level `Cipher(AES, GCM)` API for explicit tag control |
| 29 | +- ConfigEncryptor exception catching narrowed from bare `Exception` to `(InvalidTag, ValueError)` |
| 30 | +- Sandbox error type from `RuntimeError` to `ModuleExecutionError` |
| 31 | +- Sandbox catches `subprocess.TimeoutExpired` with formatted error message |
| 32 | +- Extensions directory missing now exits 47 immediately instead of deferring via null stubs |
| 33 | +- Removed `_NullRegistry` and `_NullExecutor` stub classes |
| 34 | +- AuthProvider `get_api_key()` uses direct `self._config.encryptor.retrieve()` instead of defensive `getattr` |
| 35 | +- Output formatter parameter names from `fmt` to `format` (3 functions) |
| 36 | +- Output formatter extension metadata reads from both `module_def.metadata` and `vars(module_def)` |
| 37 | +- `build_module_command` prefers `canonical_id` over `module_id` |
| 38 | +- `resolve_refs` called with explicit `max_depth=32` |
| 39 | +- `config.resolve()` called with `cli_flag="--extensions-dir"` |
| 40 | +- Error audit logging passes actual `merged` inputs instead of `{}` |
| 41 | + |
| 42 | +### Fixed |
| 43 | +- `UnboundLocalError` when `collect_input()` raises before `merged` is assigned |
| 44 | +- Removed stale fix-reference comments (`HIGH-1 fix`, `MED-1 fix`, `LOW-1 fix`) |
| 45 | + |
| 46 | +## [0.1.0] - 2026-03-14 |
| 47 | + |
| 48 | +### Added |
| 49 | +- Core Dispatcher (FE-01): `LazyModuleGroup`, `build_module_command`, `collect_input`, `validate_module_id` |
| 50 | +- Schema Parser (FE-02): `schema_to_click_options`, `_map_type`, `_extract_help`, `reconvert_enum_values` |
| 51 | +- Ref Resolver (FE-02): `resolve_refs`, `_resolve_node` with `$ref`, `allOf`, `anyOf`, `oneOf` support |
| 52 | +- Config Resolver (FE-07): `ConfigResolver` with 4-tier precedence (CLI > Env > File > Default) |
| 53 | +- Approval Gate (FE-03): `check_approval`, `_prompt_with_timeout` with TTY detection and Unix SIGALRM |
| 54 | +- Discovery (FE-04): `list` and `describe` commands with tag filtering and TTY-adaptive output |
| 55 | +- Output Formatter (FE-08): `format_module_list`, `format_module_detail`, `format_exec_result` with Rich rendering |
| 56 | +- Security Manager (FE-05): `AuthProvider`, `ConfigEncryptor` (keyring + AES-256-GCM), `AuditLogger` (JSON Lines), `Sandbox` (subprocess isolation) |
| 57 | +- Shell Integration (FE-06): bash/zsh/fish completion generators, roff man page generator |
| 58 | +- 8 example modules: `math.add`, `math.multiply`, `text.upper`, `text.reverse`, `text.wordcount`, `sysutil.info`, `sysutil.env`, `sysutil.disk` |
| 59 | +- 244 tests (unit, integration, end-to-end) |
| 60 | +- CI workflow with pytest and coverage |
| 61 | +- Pre-commit hooks configuration |
0 commit comments