Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 24 additions & 7 deletions .github/workflows/claude-documentation-reviewer.yml
Original file line number Diff line number Diff line change
Expand Up @@ -258,36 +258,53 @@ jobs:
return valid

def normalize_review_body(body):
"""Normalize issue formatting to single-line bullet points."""
"""Normalize issue formatting to single-line **Line N:** entries."""
src = body.split('\n')
result = []
i = 0
while i < len(src):
line = src[i]

# Convert heading format: ### Line N: ... → - Line N: ...
m = re.match(r'^#{1,6}\s+(Line \d+:.+)$', line)
# Convert heading format: ### Line N: ... → **Line N:** ...
m = re.match(r'^#{1,6}\s+(Line \d+):(.+)$', line)
if m:
result.append(f'- {m.group(1)}')
result.append(f'**{m.group(1)}:**{m.group(2)}')
i += 1
continue

# Convert bold format: **Line N: title** + sub-bullets → - Line N: single line
# Convert bold-closed format: **Line N: title** + sub-bullets → **Line N:** title. parts.
m = re.match(r'^\*\*(Line \d+:.*?)\*\*\s*$', line)
if m:
title = m.group(1).rstrip('.')
i += 1
parts = []
while i < len(src) and re.match(r'^\s*[-*]\s+', src[i]):
sub = re.sub(r'^\s*[-*]\s+', '', src[i])
sub = re.sub(r'^(Issue|Fix|Description|Suggested change):\s*', '', sub, flags=re.IGNORECASE)
sub = re.sub(r'^(Issue|Fix|Description|Suggested change|Current):\s*', '', sub, flags=re.IGNORECASE)
if sub.strip():
parts.append(sub.strip().rstrip('.'))
i += 1
combined = f'- {title}. {". ".join(parts)}.' if parts else f'- {title}.'
combined = f'**{title}. {". ".join(parts)}.**' if parts else f'**{title}.**'
result.append(combined)
continue

# Collapse numbered list items with sub-bullets (e.g. 1. **Issue title**: desc\n - Current: ...\n - Fix: ...)
m = re.match(r'^\d+\.\s+\*\*(.+?)\*\*:?\s*(.*)', line)
if m:
title = m.group(1).rstrip('.')
desc = m.group(2).strip().rstrip('.')
i += 1
parts = [desc] if desc else []
while i < len(src) and re.match(r'^\s+[-*]', src[i]):
sub = re.sub(r'^\s+[-*]\s+', '', src[i])
sub = re.sub(r'^(Issue|Fix|Description|Suggested change|Current|Should):\s*', '', sub, flags=re.IGNORECASE)
if sub.strip():
parts.append(sub.strip().rstrip('.'))
i += 1
desc_text = '. '.join(parts).rstrip('.')
result.append(f'**{title}.** {desc_text}.' if desc_text else f'**{title}.**')
continue

result.append(line)
i += 1
return '\n'.join(result)
Expand Down
4 changes: 4 additions & 0 deletions .github/workflows/vale-linter.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,10 @@ on:
- main
paths:
- '**.md'
- '!**/system.md'
- '!**/CLAUDE.md'
- '!**/SKILL.md'
- '!**/netwrix_style_guide.md'

jobs:
vale:
Expand Down
3 changes: 1 addition & 2 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -138,9 +138,8 @@ Vale handles pattern-based violations automatically — run it and fix everythin

**Voice and structure**
- Active voice and present tense throughout
- Second person ("you") — address the reader directly
- Second person ("you") or imperative mood for procedures and instructions — third person ("users") is acceptable in overviews and conceptual descriptions
- Contractions are encouraged: don't, can't, you'll
- Keep sentences to one idea per sentence
- Write for a global audience — avoid metaphors, idioms, and culturally specific references that don't translate
- Omit "currently", "presently", and "as of this writing" — documentation should read as permanently accurate

Expand Down
12 changes: 2 additions & 10 deletions docs/passwordsecure/9.3/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,8 @@ sidebar_position: 1

# Why Netwrix Password Secure?

Users depend on passwords in their day-to-day business worldwide. Passwords are used constantly and everywhere,
and they need to be professionally managed. Passwords should be safe, have at least 12 characters, and include uppercase and lowercase characters as well as special characters. In the best case, a separate access
password should be used for each account. It should be changed regularly. It is hard enough to meet
this challenge in private settings. In a large corporate environment, adequately managing passwords without the use of a professional password management tool is difficult.
Passwords are a constant part of daily business life worldwide, and they need to be professionally managed. A secure password should have at least 12 characters and include a mix of uppercase and lowercase letters and special characters — ideally unique to each account and changed regularly. Meeting these requirements is challenging enough for individual users, but in a large corporate environment, managing passwords without a dedicated tool isn't feasible.

## Scalability

The scalability of Netwrix Password Secure (NPS) makes it suitable for use in SMEs, large
companies, and global corporations. The flexibility required for this task is the driving factor
behind the development to meet the ever-changing requirements of modern and safety-conscious
companies. NPS is a software solution for companies that want to effectively manage
security-relevant data such as passwords, documents, or certificates at a very high encryption
level.
Netwrix Password Secure (NPS) scales from SMEs to global corporations, adapting to the ever-changing requirements of modern, security-conscious organizations. It's a software solution designed to help companies effectively manage security-relevant data — including passwords, documents, and certificates — at a very high encryption level.
Loading
Loading