const std = @import("std"); pub const Suite = enum { quick, scenario, every }; pub const concrete_suites = [_]Suite{ .quick, .scenario }; pub const wildcard_suite: Suite = .every; pub fn suiteMatches(required: Suite, observed: Suite) bool { return required == wildcard_suite or required == observed; } pub fn suiteIsConcrete(suite: Suite) bool { return suite != wildcard_suite; } pub fn suiteRunsLocally(suite: Suite) bool { return suite != .scenario; } pub fn requirementIdValid(id: []const u8) bool { if (!std.mem.startsWith(u8, id, "TJ-")) return false; const final_hyphen = std.mem.lastIndexOfScalar(u8, id, '-') orelse return false; if (final_hyphen <= 3 or final_hyphen + 3 != id.len) return false; for (id[3..final_hyphen]) |byte| if (!std.ascii.isUpper(byte)) return false; for (id[final_hyphen + 1 ..]) |byte| if (!std.ascii.isDigit(byte)) return false; return true; } pub const tool_invocation = "spec-tool"; pub const generate_command = "spec-tool generate"; pub const verify_command = "spec-tool check"; pub fn requirementOwnerLink(owner: []const u8) []const u8 { return if (std.mem.startsWith(u8, owner, "spec/")) owner["spec/".len..] else owner; } pub const paths = struct { pub const documents = "test-profile/documents.zon"; pub const concepts = "test-profile/concepts.zon"; pub const requirements = "test-profile/requirements.zon"; pub const test_specs = "test-profile/tests.zon"; pub const verification = "test-profile/verification.zon"; pub const implementations = "test-profile/implementation.zon"; pub const test_bindings = "test-profile/bindings.zon"; pub const fixture_root = "test-profile/fixtures/"; pub const binding_root = "test-profile/"; pub const binding_inventory_root = "test-profile/fixtures"; pub const implementation_root = "test-profile/src/"; pub const implementation_inventory_root = "test-profile/src"; pub const agents = "test-profile/AGENTS.md"; pub const requirements_index = "test-profile/REQUIREMENTS.md"; pub const glossary = "test-profile/GLOSSARY.md"; }; pub const projections = struct { pub const glossary_preamble = "# Glossary\n"; pub const requirements_preamble = "# Requirements\n"; };