Beskid project manifest (`.bproj`)
Beskid project manifest (Bsol)
Beskid project manifest (`.bproj`)
Project manifests use the .bproj extension and a small Bsol block syntax (parsed by the Beskid toolchain, not full HCL).
Legacy Project.proj is rejected with E1894; use <project.name>.bproj instead.
File name and location
Section titled “File name and location”- Extension:
.bproj - Location: project root directory (exactly one
*.bprojper folder) - Filename should match
name(for exampleMyApp.bprojwhenname = "MyApp")
Minimal example
Section titled “Minimal example”MyApp { name = "MyApp" version = "0.1.0" root = "Src" root_namespace = "Company.Product"}
target "App" { kind = App entry = "Main.bd"}
dependency "Std" { source = path path = "../Std"}The root block kind MyApp must equal name = "MyApp". The legacy project { ... } wrapper is unsupported.
Enum-like fields (identifiers)
Section titled “Enum-like fields (identifiers)”For kind (on target) and source (on dependency), the value may be written as an unquoted identifier (kind = Lib, source = path) or as a quoted string (kind = "Lib", source = "path"). Identifiers are preferred for consistency with static typing in tooling (LSP, diagnostics).
All other scalar fields (name, version, root, entry, path, url, rev, semver fields, and block labels) remain double-quoted strings as shown above.
Manifest schema (v0.1)
Section titled “Manifest schema (v0.1)”Named root block (required, exactly one)
Section titled “Named root block (required, exactly one)”- Block kind must equal
name name(string, required)version(string, required)root(string, optional, default:"Src"; empty default fortype = Aggregate)root_namespace(string, optional, metadata for package namespace conventions; does not change file-to-module mapping)type(optional):Mod,Template, orAggregate(omit for ordinary host projects)
target block (required for host projects; forbidden for Aggregate)
Section titled “target block (required for host projects; forbidden for Aggregate)”- Label = target name (unique)
kind(required):App,Lib, orTest(identifier or quoted string)entry(required forAppandTest; optional forLib): path relative toproject.root
dependency block (optional for host projects; required for Aggregate)
Section titled “dependency block (optional for host projects; required for Aggregate)”- Label = dependency alias used by tooling
source(required):path,git, orregistry(identifier or quoted string)
For source = path:
path(required)
For source = git (provider reserved, not enabled in v1):
url(required)rev(required)
For source = registry (provider reserved, not enabled in v1):
name(required)version(required)
Active provider scope (v1)
Section titled “Active provider scope (v1)”- Enabled dependency provider:
path. gitandregistryare schema-valid for forward compatibility but provider-disabled in runtime scope.- Build/run fails when a disabled provider dependency is present in an active graph.
Validation rules
Section titled “Validation rules”- Exactly one named root block; block kind equals
name. - At least one
targetblock (excepttype = Aggregate). - Target labels must be unique.
- Dependency labels must be unique.
target.entrymust resolve underproject.rootwhen required.- Dependency node identity is canonicalized by resolved manifest path.
- Duplicate canonical manifest identities in graph construction must be interned to one node.
project.nameduplicates across different manifest identities should be diagnostics in graph-resolution stage (warning in v0.1, error in strict mode).- Unknown fields on the root block are preserved as extras; unknown fields on other blocks should produce warnings in v0.1 and become errors later.
- Dependency sources are source-code only; binary dependency artifacts are unsupported.
Project.lockis created automatically during resolve/build/run if missing.Project.lockis updated automatically when dependency graph identity changes.- Legacy
Project.proj/Workspace.projfilenames are errors (E1894 / E1895).
Toolchain implementation
Section titled “Toolchain implementation”- Parse and validate manifests in the
beskid_analysiscrate (projects::parse_manifest/parse_workspace_manifest), then build the dependency DAG withdaggyand preserve unresolved non-path dependency nodes for policy diagnostics. - Materialize resolved dependencies into
obj/beskid/deps/srcbefore compile stages. - Editor support: VS Code uses the
beskid-projlanguage id for*.bproj; the Beskid LSP publishes diagnostics and context-aware completions on manifest files. - Symbol visibility: explicit
useimports only—see Explicit use, no prelude.