let content = import "content.ncl" in let repo_kind_type = [| 'DevWorkspace, 'PublishedCrate, 'Service, 'Library, 'AgentResource, 'Mixed, 'PersonalOntology, |] in let consumer_type = [| 'Developer, 'Agent, 'EndUser, 'CI, 'Downstream, |] in let artifact_kind_type = [| 'RustDoc, 'JsonSchema, 'ContainerImage, 'CratePackage, 'StaticSite, 'NuPlugin, 'OntologyExport, |] in let audit_level_type = [| 'Quick, 'Standard, 'Strict, |] in # ── Operational layers ────────────────────────────────────────────────────── # A layer is a named region of the repo with visibility rules per mode. # The `committed` flag distinguishes product (true) from process (false). let layer_type = { id | String, paths | Array String, committed | Bool, description | String | default = "", } in # ── Operational modes ─────────────────────────────────────────────────────── # A mode is an active perspective the developer/agent switches into. # It determines which layers are visible and what audit level applies. let op_mode_type = { id | String, description | String | default = "", visible_layers | Array String, audit_level | audit_level_type | default = 'Standard, pre_activate | Array String | default = [], post_activate | Array String | default = [], } in # ── Publication service ───────────────────────────────────────────────────── # Where artifacts go and what operations surround the publish action. let auth_method_type = [| 'SSH, 'Token, 'OIDC, 'None, |] in let service_scope_type = [| 'Public, 'PrivateNetwork, 'LocalRegistry, 'SelfHosted, |] in let publication_service_type = { id | String, artifact | artifact_kind_type, scope | service_scope_type, registry_url | String | default = "", auth_method | auth_method_type | default = 'None, pre_publish | Array String | default = [], post_publish | Array String | default = [], condition | String | default = "", trigger | String, } in # ── Consumption modes (who consumes, what they need) ──────────────────────── let consumption_mode_type = { consumer | consumer_type, needs | Array artifact_kind_type, audit_level | audit_level_type | default = 'Standard, description | String | default = "", } in # ── Tool requirements ───────────────────────────────────────────────────── # Declares what tools the project needs. install-tools.nu and sync audit # consume this to verify availability or trigger installation. let install_method_type = [| 'Builtin, 'Cargo, 'Npm, 'Brew, 'Pip, 'Manual, |] in let tool_requirement_type = { name | String, install_method | install_method_type | default = 'Builtin, version | String | default = "", required | Bool | default = true, } in # ── Justfile convention ────────────────────────────────────────────────── # Declares expected justfile structure so sync audit can verify completeness. let justfile_system_type = [| 'Import, 'Mod, 'Hybrid, 'Flat, 'None |] in let justfile_convention_type = { system | justfile_system_type | default = 'Mod, required_modules | Array String | default = ["build", "test", "dev", "ci"], required_recipes | Array String | default = ["default", "help"], } in # ── Claude baseline ───────────────────────────────────────────────────── # Declares expected .claude/ structure per project. let claude_baseline_type = { guidelines | Array String | default = ["bash", "nushell"], session_hook | Bool | default = true, stratum_commands | Bool | default = true, } in # ── Root manifest ─────────────────────────────────────────────────────────── let manifest_type = { project | String, repo_kind | repo_kind_type, layers | Array layer_type | default = [], operational_modes | Array op_mode_type | default = [], consumption_modes | Array consumption_mode_type, publication_services | Array publication_service_type | default = [], tools | Array tool_requirement_type | default = [], justfile | justfile_convention_type | default = {}, claude | claude_baseline_type | default = {}, default_audit | audit_level_type | default = 'Standard, default_mode | String | default = "dev", # Node ID this project maps to in the ontology DAG. # Used by portfolio tooling to cross-reference publication cards. ontology_node | String | default = "", # Publishable content assets (logos, diagrams, web pages). # Declares source paths and publication targets; consumed by publish modes # and sync drift detection to verify assets exist and are deployed correctly. content_assets | Array content.ContentAsset | default = [], # Reusable NCL templates for mode steps, agent prompts, and publication cards. # Each template is a parameterised NCL function at source_path. templates | Array content.ContentTemplate | default = [], } in { RepoKind = repo_kind_type, ConsumerType = consumer_type, ArtifactKind = artifact_kind_type, AuditLevel = audit_level_type, AuthMethod = auth_method_type, ServiceScope = service_scope_type, InstallMethod = install_method_type, JustfileSystem = justfile_system_type, Layer = layer_type, OperationalMode = op_mode_type, ConsumptionMode = consumption_mode_type, PublicationService = publication_service_type, ToolRequirement = tool_requirement_type, JustfileConvention = justfile_convention_type, ClaudeBaseline = claude_baseline_type, ProjectManifest = manifest_type, }