chore(browseros): restructure bos_build into toolset layout#1503
Conversation
|
Greptile (@greptileai) review |
|
Claude (@claude) review |
|
Claude finished Nikhil (@shadowfax92)'s task in 2m 38s —— View job PR Review:
|
Greptile SummaryA large-scale move-only restructure of
Confidence Score: 4/5Move-only refactor with import rewrites; no logic changes. The one non-cosmetic issue is a stale path in an operator-facing error message in sign_binary.py. All 87 files are import rewrites, init.py restructures, or docstring corrections. Every changed import was verified to point at the correct new location. The only slip is a developer-facing error string in sign_server_bundle_macos that still references build/common/server_binaries.py, a path that never existed — it should say bos_build/products/server_binaries.py. This would misdirect an engineer trying to register a newly added binary. Everything else is clean. packages/browseros/bos_build/release/ota/sign_binary.py — the stale error-message path in sign_server_bundle_macos. Important Files Changed
Flowchart%%{init: {'theme': 'neutral'}}%%
flowchart TD
cli["cli/\nbuild · source · product\ndev · release · ota"]
subgraph core ["core/ (engine)"]
ctx["context"]
step["step registry"]
planner["planner"]
runner["runner"]
pipeline["pipeline"]
resolver["resolver"]
end
subgraph lib ["lib/ (plumbing)"]
env["env"]
utils["utils"]
notify["notify"]
paths["paths"]
sparkle["sparkle"]
versions["versions"]
r2["r2"]
testing["testing"]
end
subgraph products ["products/"]
sbins["server_binaries"]
proddefs["browseros/ · browserclaw/"]
doctor["doctor"]
end
subgraph steps ["steps/ (BUILD toolset)"]
setup["setup"]
resources["resources"]
patches["patches"]
compile["compile"]
sign["sign"]
package["package"]
storage["storage"]
end
subgraph release ["release/ (RELEASE toolset)"]
rcommon["common"]
rlist["list"]
rappcast["appcast"]
rgithub["github"]
rpublish["publish"]
rdownload["download"]
subgraph ota ["ota/"]
otacommon["common"]
otasign["sign_binary"]
otaserver["server"]
end
end
patchkit["patchkit/ (DEV toolset)"]
cli --> core
cli --> lib
cli --> release
core --> lib
steps --> core
steps --> lib
steps --> products
release --> core
release --> lib
release --> products
ota --> lib
ota --> products
products --> core
%%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%%
flowchart TD
cli["cli/\nbuild · source · product\ndev · release · ota"]
subgraph core ["core/ (engine)"]
ctx["context"]
step["step registry"]
planner["planner"]
runner["runner"]
pipeline["pipeline"]
resolver["resolver"]
end
subgraph lib ["lib/ (plumbing)"]
env["env"]
utils["utils"]
notify["notify"]
paths["paths"]
sparkle["sparkle"]
versions["versions"]
r2["r2"]
testing["testing"]
end
subgraph products ["products/"]
sbins["server_binaries"]
proddefs["browseros/ · browserclaw/"]
doctor["doctor"]
end
subgraph steps ["steps/ (BUILD toolset)"]
setup["setup"]
resources["resources"]
patches["patches"]
compile["compile"]
sign["sign"]
package["package"]
storage["storage"]
end
subgraph release ["release/ (RELEASE toolset)"]
rcommon["common"]
rlist["list"]
rappcast["appcast"]
rgithub["github"]
rpublish["publish"]
rdownload["download"]
subgraph ota ["ota/"]
otacommon["common"]
otasign["sign_binary"]
otaserver["server"]
end
end
patchkit["patchkit/ (DEV toolset)"]
cli --> core
cli --> lib
cli --> release
core --> lib
steps --> core
steps --> lib
steps --> products
release --> core
release --> lib
release --> products
ota --> lib
ota --> products
products --> core
|
Greptile SummaryThis PR restructures
Confidence Score: 5/5Pure structural reorganization with no logic changes; safe to merge. All 87 changed files are import rewrites and file moves. The lazy-import cycle guards in notify.py and server_binaries.py were correctly preserved. No stale mock.patch strings, no dangling re-exports, and no behavioral changes were introduced. The new init.py files for lib/, release/, and release/ota/ accurately reflect what was previously spread across core/ and steps/. No files require special attention. The package init.py files (lib, release, release/ota) are the most structurally significant changes, and all were verified to be consistent with the rest of the codebase. Important Files Changed
Flowchart%%{init: {'theme': 'neutral'}}%%
flowchart TD
CLI["cli/ (build, ota, release, source, product, dev)"]
subgraph CORE["core/ — Engine only"]
CTX["context.py"]
STEP["step.py"]
PLAN["planner.py"]
RUN["runner.py"]
PIPE["pipeline.py"]
RES["resolver.py"]
EVENTS["events.py"]
PROD["products.py"]
end
subgraph LIB["lib/ — Shared plumbing"]
ENV["env.py"]
UTILS["utils.py"]
PATHS["paths.py"]
NOTIFY["notify.py"]
SPARKLE["sparkle.py"]
VERS["versions.py"]
R2["r2.py"]
TEST["testing.py"]
end
subgraph PRODUCTS["products/ — Product data"]
SB["server_binaries.py"]
DOCTOR["doctor.py"]
BOS["browseros/product.py"]
BCLAW["browserclaw/product.py"]
end
subgraph BUILD["steps/ — BUILD toolset"]
SETUP["setup/"]
COMPILE["compile/"]
SIGN["sign/"]
PACKAGE["package/"]
STORAGE["storage/"]
end
subgraph RELEASE["release/ — RELEASE toolset"]
RCOMMON["common.py"]
RPUB["publish.py"]
RLIST["list.py"]
subgraph OTA["ota/ — OTA subtoolset"]
OTACOMMON["common.py"]
OTASERVER["server.py"]
OTASIGN["sign_binary.py"]
end
end
subgraph DEV["patchkit/ — DEV toolset"]
BATCH["batch_apply.py"]
EXTRACT["extract/"]
end
CLI --> CORE
CLI --> LIB
CLI --> RELEASE
CLI --> BUILD
CORE --> LIB
BUILD --> CORE
BUILD --> LIB
BUILD --> PRODUCTS
RELEASE --> LIB
RELEASE --> CORE
DEV --> LIB
DEV --> CORE
PRODUCTS --> CORE
OTA --> LIB
%%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%%
flowchart TD
CLI["cli/ (build, ota, release, source, product, dev)"]
subgraph CORE["core/ — Engine only"]
CTX["context.py"]
STEP["step.py"]
PLAN["planner.py"]
RUN["runner.py"]
PIPE["pipeline.py"]
RES["resolver.py"]
EVENTS["events.py"]
PROD["products.py"]
end
subgraph LIB["lib/ — Shared plumbing"]
ENV["env.py"]
UTILS["utils.py"]
PATHS["paths.py"]
NOTIFY["notify.py"]
SPARKLE["sparkle.py"]
VERS["versions.py"]
R2["r2.py"]
TEST["testing.py"]
end
subgraph PRODUCTS["products/ — Product data"]
SB["server_binaries.py"]
DOCTOR["doctor.py"]
BOS["browseros/product.py"]
BCLAW["browserclaw/product.py"]
end
subgraph BUILD["steps/ — BUILD toolset"]
SETUP["setup/"]
COMPILE["compile/"]
SIGN["sign/"]
PACKAGE["package/"]
STORAGE["storage/"]
end
subgraph RELEASE["release/ — RELEASE toolset"]
RCOMMON["common.py"]
RPUB["publish.py"]
RLIST["list.py"]
subgraph OTA["ota/ — OTA subtoolset"]
OTACOMMON["common.py"]
OTASERVER["server.py"]
OTASIGN["sign_binary.py"]
end
end
subgraph DEV["patchkit/ — DEV toolset"]
BATCH["batch_apply.py"]
EXTRACT["extract/"]
end
CLI --> CORE
CLI --> LIB
CLI --> RELEASE
CLI --> BUILD
CORE --> LIB
BUILD --> CORE
BUILD --> LIB
BUILD --> PRODUCTS
RELEASE --> LIB
RELEASE --> CORE
DEV --> LIB
DEV --> CORE
PRODUCTS --> CORE
OTA --> LIB
Reviews (2): Last reviewed commit: "chore(browseros): fix stale versions pat..." | Re-trigger Greptile |
Summary
packages/browseros/bos_build/so the top level reads as three toolsets: BUILD (steps/on thecore/engine), RELEASE (release/+release/ota/), DEV (patchkit/) — over shared plumbing (lib/) and product data (products/).git mv+ import rewrites + docstring/README path updates. No behavior change; history follows every file (git log --follow).Moves
core/→lib/: env, utils, logger, paths, notify, sparkle, versions (+test), testing (+test) —core/now holds only the engine (step registry, planner, runner, pipeline, resolver, context, events, product descriptor model)core/server_binaries*→products/(it is product data);steps/storage/r2.py→lib/r2.py(shared client used by release/ota/storage)steps/release/→release/(flattened);steps/ota/→release/ota/;steps/keeps only@steppipeline stepscore/__init__.pyexports engine names only;EnvConfig/Notifier/get_notifiermoved tolib/__init__.py;steps/storage/__init__.pyslimmed to step re-exportsDesign
Staged
git mvin dependency order (plumbing → data/client → toolsets → docs), one green commit each, so rename detection stays clean and every intermediate state passes the full harness. Step registry contract untouched:steps/__init__.pyimport order = registration order, loaded viaimport_module("bos_build.steps"); release/ota modules were never registered steps. Lazy cycle-dodging imports keep their laziness (notify→events, env/logger→paths, server_binaries→products registry).Test plan
uv run python -m unittest discover -s bos_build -t . -p "*_test.py"→ 352 tests OK after every commituv run ruff check bos_buildclean after every commitbrowseros build --list,product doctor,release --help,ota --help,dev extract --help🤖 Generated with Claude Code