Skip to content

Work across several repositories

An application split across repositories has one threat model per repository and calls between them. A Bravos workspace links the members with guardlink link-project, installs Bravos in each one and in the folder they share, and keeps a snapshot the briefing, bravos watch and reports read. Linked workspaces are paid, with a 30-day no-card trial. Free can run the research loop in any number of repositories independently; linking them into one application is the paid workspace feature.

Initialize each member as a git repository. The workspace command requires Team or a trial licence; it refuses before linking repositories when no licence is available. See licensing.

Each member is PATH[=service[@url]]. The URL is where that service runs for testing.

Terminal window
bravos workspace create shop --member web=web@http://127.0.0.1:3000 --member orders=orders@http://127.0.0.1:4000
Cross-service edges: 0

Truncated to the cross-service summary from the 1.4.1 scratch workspace. Both services were linked and initialized; this fixture declares no cross-service flow, so the count is zero.

Run from ~/src/shop, the folder both repositories sit in, which becomes the app folder. Pass --folder when the members do not share one. Each member here is a one-file Flask app with no annotations yet, so both show 0 exposures.

  • In the app folder, for questions across services.
  • In a member, for changes to that service.

A call from one service to another is written as a guardlink flow between the two services’ assets, @flows #<this>-<x> -> #<other>-<y> via http. Once members carry such flows, Cross-service edges counts them.

Use workspace add and workspace remove to change membership, workspace target to update a service URL, workspace show to read the snapshot, and workspace sync to refresh the linked models. The installed workspace --help documents their arguments.

show --json prints the snapshot and export. Nothing is pushed anywhere: the registry lives in ~/.bravos/workspaces.json, and each member’s model stays in its own repository.