Introduces accounts (ASP.NET Identity + cookie auth), four global roles (Admin/Writer/Editor/Reviewer), per-novel ownership and grants via ProjectMember, and a service-API-key principal for the MCP server and background import jobs. Enforcement lives in the application services (not endpoint filters) so the embedded agent and MCP tools, which call the same services directly, can't bypass it. Web client gets a login page, session-aware routing, and a People section for managing per-novel access. Also includes prior in-flight changes from this branch (CLAUDE.md compliance pass, dev-deploy docker-compose setup) that were uncommitted when this feature work started.
195 lines
8.9 KiB
INI
195 lines
8.9 KiB
INI
root = true
|
|
|
|
#### Shared defaults ####
|
|
|
|
[*]
|
|
charset = utf-8
|
|
indent_style = space
|
|
insert_final_newline = true
|
|
trim_trailing_whitespace = true
|
|
# This repository's files are LF throughout; a .gitattributes is not present to
|
|
# normalise on checkout, so keep editors from rewriting every file they touch.
|
|
end_of_line = lf
|
|
|
|
[*.{cs,vb}]
|
|
#### Naming styles ####
|
|
|
|
# Naming rules
|
|
|
|
dotnet_naming_rule.interface_should_be_begins_with_i.severity = suggestion
|
|
dotnet_naming_rule.interface_should_be_begins_with_i.symbols = interface
|
|
dotnet_naming_rule.interface_should_be_begins_with_i.style = begins_with_i
|
|
|
|
dotnet_naming_rule.types_should_be_pascal_case.severity = suggestion
|
|
dotnet_naming_rule.types_should_be_pascal_case.symbols = types
|
|
dotnet_naming_rule.types_should_be_pascal_case.style = pascal_case
|
|
|
|
dotnet_naming_rule.non_field_members_should_be_pascal_case.severity = suggestion
|
|
dotnet_naming_rule.non_field_members_should_be_pascal_case.symbols = non_field_members
|
|
dotnet_naming_rule.non_field_members_should_be_pascal_case.style = pascal_case
|
|
|
|
dotnet_sort_system_directives_first = true
|
|
|
|
# Enforce private fields to start with an underscore
|
|
dotnet_naming_rule.private_fields_with_underscore.severity = suggestion
|
|
dotnet_naming_rule.private_fields_with_underscore.symbols = private_fields
|
|
dotnet_naming_rule.private_fields_with_underscore.style = underscore_prefix
|
|
|
|
dotnet_naming_symbols.private_fields.applicable_kinds = field
|
|
dotnet_naming_symbols.private_fields.applicable_accessibilities = private
|
|
dotnet_naming_symbols.private_fields.required_modifiers = instance
|
|
|
|
dotnet_naming_style.underscore_prefix.required_prefix = _
|
|
dotnet_naming_style.underscore_prefix.capitalization = camel_case
|
|
|
|
# Symbol specifications
|
|
|
|
dotnet_naming_symbols.interface.applicable_kinds = interface
|
|
dotnet_naming_symbols.interface.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
|
|
dotnet_naming_symbols.interface.required_modifiers =
|
|
|
|
dotnet_naming_symbols.types.applicable_kinds = class, struct, interface, enum
|
|
dotnet_naming_symbols.types.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
|
|
dotnet_naming_symbols.types.required_modifiers =
|
|
|
|
dotnet_naming_symbols.non_field_members.applicable_kinds = property, event, method
|
|
dotnet_naming_symbols.non_field_members.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
|
|
dotnet_naming_symbols.non_field_members.required_modifiers =
|
|
|
|
# Naming styles
|
|
|
|
dotnet_naming_style.begins_with_i.required_prefix = I
|
|
dotnet_naming_style.begins_with_i.required_suffix =
|
|
dotnet_naming_style.begins_with_i.word_separator =
|
|
dotnet_naming_style.begins_with_i.capitalization = pascal_case
|
|
|
|
dotnet_naming_style.pascal_case.required_prefix =
|
|
dotnet_naming_style.pascal_case.required_suffix =
|
|
dotnet_naming_style.pascal_case.word_separator =
|
|
dotnet_naming_style.pascal_case.capitalization = pascal_case
|
|
dotnet_style_coalesce_expression = true:suggestion
|
|
dotnet_style_null_propagation = true:suggestion
|
|
dotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion
|
|
dotnet_style_prefer_auto_properties = true:silent
|
|
dotnet_style_object_initializer = true:suggestion
|
|
dotnet_style_collection_initializer = true:suggestion
|
|
dotnet_style_prefer_simplified_boolean_expressions = true:suggestion
|
|
dotnet_style_prefer_conditional_expression_over_assignment = true:suggestion
|
|
dotnet_style_prefer_conditional_expression_over_return = true:suggestion
|
|
dotnet_style_explicit_tuple_names = true:suggestion
|
|
dotnet_style_prefer_inferred_tuple_names = true:suggestion
|
|
dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion
|
|
dotnet_style_prefer_compound_assignment = true:suggestion
|
|
dotnet_style_prefer_simplified_interpolation = true:suggestion
|
|
dotnet_style_prefer_collection_expression = when_types_loosely_match:suggestion
|
|
dotnet_style_namespace_match_folder = true:suggestion
|
|
dotnet_style_operator_placement_when_wrapping = beginning_of_line
|
|
tab_width = 4
|
|
indent_size = 4
|
|
max_line_length = 220
|
|
dotnet_style_readonly_field = true:suggestion
|
|
dotnet_style_predefined_type_for_locals_parameters_members = true:silent
|
|
dotnet_style_predefined_type_for_member_access = true:silent
|
|
dotnet_style_require_accessibility_modifiers = for_non_interface_members:silent
|
|
dotnet_style_allow_statement_immediately_after_block_experimental = true:silent
|
|
dotnet_style_allow_multiple_blank_lines_experimental = true:silent
|
|
dotnet_style_namespace_declarations = file_scoped:suggestion
|
|
dotnet_code_quality_unused_parameters = all:warning
|
|
dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity:silent
|
|
dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity:silent
|
|
dotnet_style_parentheses_in_other_binary_operators = always_for_clarity:silent
|
|
dotnet_style_parentheses_in_other_operators = never_if_unnecessary:silent
|
|
dotnet_style_qualification_for_field = false:warning
|
|
dotnet_style_qualification_for_property = false:suggestion
|
|
dotnet_style_qualification_for_method = false:warning
|
|
dotnet_style_qualification_for_event = false:warning
|
|
|
|
[*.cs]
|
|
csharp_using_directive_placement = outside_namespace:silent
|
|
csharp_prefer_simple_using_statement = true:suggestion
|
|
csharp_prefer_braces = when_multiline:suggestion
|
|
# File-scoped, matching every .cs file in this repository. The C#-specific key wins
|
|
# over dotnet_style_namespace_declarations, so the two must agree or the setting
|
|
# silently flips for C#.
|
|
csharp_style_namespace_declarations = file_scoped:suggestion
|
|
csharp_style_prefer_method_group_conversion = true:silent
|
|
csharp_style_prefer_top_level_statements = true:silent
|
|
csharp_style_prefer_primary_constructors = false:warning
|
|
csharp_prefer_system_threading_lock = true:suggestion
|
|
csharp_style_expression_bodied_methods = false:silent
|
|
csharp_style_expression_bodied_constructors = false:silent
|
|
csharp_style_expression_bodied_operators = false:silent
|
|
csharp_style_expression_bodied_properties = true:silent
|
|
csharp_style_expression_bodied_indexers = true:silent
|
|
csharp_style_expression_bodied_accessors = true:silent
|
|
csharp_style_expression_bodied_lambdas = true:silent
|
|
csharp_style_expression_bodied_local_functions = false:silent
|
|
csharp_style_throw_expression = true:suggestion
|
|
csharp_style_prefer_null_check_over_type_check = true:suggestion
|
|
csharp_prefer_simple_default_expression = true:suggestion
|
|
csharp_style_prefer_local_over_anonymous_function = true:suggestion
|
|
csharp_style_prefer_index_operator = true:suggestion
|
|
csharp_style_prefer_range_operator = true:suggestion
|
|
csharp_style_implicit_object_creation_when_type_is_apparent = true:suggestion
|
|
csharp_style_prefer_tuple_swap = true:suggestion
|
|
csharp_indent_labels = one_less_than_current
|
|
csharp_space_around_binary_operators = before_and_after
|
|
csharp_style_prefer_unbound_generic_type_in_nameof = true:suggestion
|
|
csharp_style_prefer_utf8_string_literals = true:suggestion
|
|
csharp_style_inlined_variable_declaration = true:suggestion
|
|
csharp_style_deconstructed_variable_declaration = true:suggestion
|
|
csharp_style_unused_value_assignment_preference = discard_variable:suggestion
|
|
csharp_style_unused_value_expression_statement_preference = discard_variable:silent
|
|
csharp_prefer_static_local_function = true:suggestion
|
|
csharp_prefer_static_anonymous_function = true:suggestion
|
|
csharp_style_prefer_readonly_struct = true:suggestion
|
|
csharp_style_prefer_readonly_struct_member = true:suggestion
|
|
csharp_style_allow_embedded_statements_on_same_line_experimental = true:silent
|
|
csharp_style_allow_blank_lines_between_consecutive_braces_experimental = true:silent
|
|
csharp_style_allow_blank_line_after_colon_in_constructor_initializer_experimental = true:silent
|
|
csharp_style_allow_blank_line_after_token_in_conditional_expression_experimental = true:silent
|
|
csharp_style_allow_blank_line_after_token_in_arrow_expression_clause_experimental = true:silent
|
|
csharp_style_conditional_delegate_call = true:suggestion
|
|
csharp_style_prefer_switch_expression = true:suggestion
|
|
csharp_style_prefer_pattern_matching = true:silent
|
|
csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion
|
|
csharp_style_pattern_matching_over_as_with_null_check = true:suggestion
|
|
csharp_style_prefer_not_pattern = true:suggestion
|
|
csharp_style_prefer_extended_property_pattern = true:suggestion
|
|
csharp_style_var_for_built_in_types = false:silent
|
|
csharp_style_var_when_type_is_apparent = false:silent
|
|
csharp_style_var_elsewhere = false:silent
|
|
csharp_style_prefer_implicitly_typed_lambda_expression = true:suggestion
|
|
csharp_style_target_typed_new_expression = true:suggestion
|
|
|
|
#### Front end ####
|
|
# The web client is Prettier-formatted: two-space indent, single quotes, no semicolons.
|
|
|
|
[*.{ts,tsx,js,jsx,mjs,cjs}]
|
|
indent_size = 2
|
|
tab_width = 2
|
|
max_line_length = 100
|
|
quote_type = single
|
|
|
|
[*.{json,jsonc,yml,yaml}]
|
|
indent_size = 2
|
|
tab_width = 2
|
|
|
|
[*.{css,html}]
|
|
indent_size = 2
|
|
tab_width = 2
|
|
|
|
#### Everything else ####
|
|
|
|
[*.md]
|
|
# Two trailing spaces are a hard line break in Markdown.
|
|
trim_trailing_whitespace = false
|
|
max_line_length = 100
|
|
|
|
[*.{csproj,props,targets,slnx}]
|
|
indent_size = 2
|
|
tab_width = 2
|
|
|
|
[*.sln]
|
|
indent_style = tab
|