Beskid Project Manifest (`Project.proj`)
Beskid Project Manifest (HCL)
Beskid Project Manifest (`Project.proj`)
Project.proj is the canonical project manifest format, using a small HCL-like block syntax (parsed by the Beskid toolchain, not full HCL).
File name and location
Section titled “File name and location”- Name:
Project.proj - Location: project root directory
Minimal example
Section titled “Minimal example”project { 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"}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)”project block (required, exactly one)
Section titled “project block (required, exactly one)”name(string, required)version(string, required)root(string, optional, default:"Src")root_namespace(string, optional, metadata for package namespace conventions; does not change file-to-module mapping)
target block (required, one or more)
Section titled “target block (required, one or more)”- Label = target name (unique)
kind(required):App,Lib, orTest(identifier or quoted string)entry(required): path relative toproject.root
dependency block (optional, zero or more)
Section titled “dependency block (optional, zero or more)”- 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
projectblock. - At least one
targetblock. - Target labels must be unique.
- Dependency labels must be unique.
target.entrymust resolve underproject.root.- 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 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.
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*.proj; the Beskid LSP publishes diagnostics and context-aware completions on manifest files.