Skip to content

v6.53.0

Choose a tag to compare

@github-actions github-actions released this 08 May 23:34
· 118 commits to main since this release

v6.53.0 (2026-05-08)

Features

  • feat(fabrication): Phases C3/D/E - production folder, diagnostic fix, thin CLI

Phase C3: cli/fabrication.py no longer imports _output_bom/_output_pos from
sibling CLI modules; file writing delegated to BOMWriter/POSWriter.

Phase D:

  • BOMWorkflow: remove os.environ.get('JBOM_QUIET') gates; resolution notes
    always appended to diagnostics (ADR 0006 diagnostic collection principle)
  • POSWorkflow: remove request.quiet gates; remove quiet field from POSRequest
    and cli/pos.py _build_pos_request; remove unused os import from cli/pos.py

Phase E:

  • FabricationRequest gains debug: bool and production_root: str
  • FabricationResult gains production_dir: Path|None and backup_archive: Path|None
  • FabricationWorkflow.run() creates production/ folder, writes jbom.csv and
    cpl.csv via BOMWriter/POSWriter, packages gerbers via GerberPackager into
    {title}_{revision}.zip, creates dated backup via BackupService
  • Fixed double-gerber-run bug: _run_gerbers_with_packaging() now returns
    (artifacts, gerber_result, diagnostics), eliminating the redundant
    _run_gerbers() call in run()
  • _execute_fab_command() simplified from 80 to 22 lines; reports production_dir
    and backup_archive on success
  • jbom fab gains --debug flag; --output-dir now specifies production/ parent

CHANGELOG updated with issue #226 entry.
1171 tests passing.

Co-Authored-By: Oz oz-agent@warp.dev (ce12da1)

  • feat(services): Phase C1/C2 - BOMWriter and POSWriter friend serializers

Add BOMWriter and POSWriter as adapter-neutral file-serialization services:

  • BOMWriter.write(payload, output_path, *, force=False) -> None
  • POSWriter.write(payload, output_path, *, force=False) -> None
    Both use csv.QUOTE_ALL, raise FileExistsError on overwrite, and call
    the extracted bom/pos_field_resolver services for field resolution.
    26 unit tests (13 per writer).

Co-Authored-By: Oz oz-agent@warp.dev (4603f95)

  • feat(refactor): C0 - extract BOM/POS field resolution to service layer

Extract field resolution logic from cli/bom.py and cli/pos.py into dedicated
service modules:

  • src/jbom/services/bom_field_resolver.py: resolve_bom_field_value()
  • src/jbom/services/pos_field_resolver.py: resolve_pos_field_value()

Refactoring is surgical and DRY-compliant:

  • Public entry points: resolve_bom_field_value() and resolve_pos_field_value()
  • Extracted helper functions organized by concern
  • CLI wrapper functions (_get_field_value, _get_pos_field_value) remain thin
    and delegate to service layer
  • All 1145 tests pass with no behavior change

This C0 refactoring is the prerequisite for C1/C2 (Friend Serializers),
establishing clean, reusable service APIs for BOM/POS writers.

Co-Authored-By: Oz oz-agent@warp.dev (10f19fc)