Skip to content

Commit e0512a0

Browse files
committed
Merge remote-tracking branch 'origin/development' into MvM-DatabasesAndMemory
2 parents 6aba2b8 + 3684930 commit e0512a0

264 files changed

Lines changed: 5790 additions & 1637 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.claude/hooks/audit-log.sh

100755100644
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@ set -uo pipefail
1313
# ---------------------------------------------------------------------------
1414
INPUT="$(cat)"
1515

16-
TOOL_NAME="$(printf '%s' "$INPUT" | python3 -c "import sys,json; print(json.load(sys.stdin).get('tool_name','unknown'))" 2>/dev/null || echo "unknown")"
16+
TOOL_NAME="$(printf '%s' "$INPUT" | jq -r '.tool_name // "unknown"' 2>/dev/null || echo "unknown")"
1717

18-
COMMAND="$(printf '%s' "$INPUT" | python3 -c "import sys,json; print(json.load(sys.stdin).get('tool_input',{}).get('command',''))" 2>/dev/null || echo "")"
18+
COMMAND="$(printf '%s' "$INPUT" | jq -r '.tool_input.command // ""' 2>/dev/null || echo "")"
1919

2020
# ---------------------------------------------------------------------------
2121
# 2. Determine log file path (relative to project root)

.claude/hooks/validate-bash-command.sh

100755100644
Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,15 @@ set -euo pipefail
1414
# ---------------------------------------------------------------------------
1515
INPUT="$(cat)"
1616

17-
TOOL_NAME="$(printf '%s' "$INPUT" | python3 -c "import sys,json; print(json.load(sys.stdin).get('tool_name',''))" 2>/dev/null || true)"
17+
TOOL_NAME="$(printf '%s' "$INPUT" | jq -r '.tool_name // ""' 2>/dev/null || true)"
1818

19-
# Only validate Bash commands — allow everything else through
20-
if [[ "$TOOL_NAME" != "Bash" ]]; then
19+
# Only validate Bash commands — allow everything else through.
20+
# If TOOL_NAME is empty (parse failure), fall through to check the command anyway (fail closed).
21+
if [[ -n "$TOOL_NAME" && "$TOOL_NAME" != "Bash" ]]; then
2122
exit 0
2223
fi
2324

24-
COMMAND="$(printf '%s' "$INPUT" | python3 -c "import sys,json; print(json.load(sys.stdin).get('tool_input',{}).get('command',''))" 2>/dev/null || true)"
25+
COMMAND="$(printf '%s' "$INPUT" | jq -r '.tool_input.command // ""' 2>/dev/null || true)"
2526

2627
if [[ -z "$COMMAND" ]]; then
2728
exit 0
@@ -136,20 +137,19 @@ BLOCKED_PATTERNS=(
136137
# ---------------------------------------------------------------------------
137138
check_command() {
138139
local cmd="$1"
139-
# Trim leading/trailing whitespace
140-
cmd="$(echo "$cmd" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')"
140+
# Trim leading/trailing whitespace using parameter expansion
141+
cmd="${cmd#"${cmd%%[![:space:]]*}"}"
142+
cmd="${cmd%"${cmd##*[![:space:]]}"}"
141143

142144
if [[ -z "$cmd" ]]; then
143145
return 0
144146
fi
145147

146-
# Convert to lowercase for case-insensitive matching
147-
local cmd_lower
148-
cmd_lower="$(echo "$cmd" | tr '[:upper:]' '[:lower:]')"
148+
# Convert to lowercase using parameter expansion
149+
local cmd_lower="${cmd,,}"
149150

150151
for pattern in "${BLOCKED_PATTERNS[@]}"; do
151-
local pattern_lower
152-
pattern_lower="$(echo "$pattern" | tr '[:upper:]' '[:lower:]')"
152+
local pattern_lower="${pattern,,}"
153153

154154
# shellcheck disable=SC2254
155155
if [[ "$cmd_lower" == $pattern_lower ]]; then
@@ -164,8 +164,12 @@ check_command() {
164164
# ---------------------------------------------------------------------------
165165
# 4. Split on pipes and command chains, then check each sub-command
166166
# ---------------------------------------------------------------------------
167-
# Replace common chain operators with a delimiter
168-
NORMALIZED="$(echo "$COMMAND" | sed 's/&&/\n/g; s/||/\n/g; s/;/\n/g; s/|/\n/g')"
167+
# Replace common chain operators with newlines using parameter expansion
168+
# Order matters: replace && and || before | to avoid double-splitting ||
169+
NORMALIZED="${COMMAND//&&/$'\n'}"
170+
NORMALIZED="${NORMALIZED//||/$'\n'}"
171+
NORMALIZED="${NORMALIZED//;/$'\n'}"
172+
NORMALIZED="${NORMALIZED//|/$'\n'}"
169173

170174
while IFS= read -r subcmd; do
171175
check_command "$subcmd"

.claude/settings.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,5 +183,8 @@
183183
}
184184
]
185185
},
186-
"statusline": ".claude/statusline.sh"
186+
"statusLine": {
187+
"type": "command",
188+
"command": ".claude/statusline.sh"
189+
}
187190
}

.github/workflows/branch-deletion-pr-creation.yml

Lines changed: 52 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,18 @@ jobs:
3838
3939
- name: Process branches
4040
id: branch-data
41+
env:
42+
MIN_AGE_DAYS: ${{ github.event.inputs.min_age_days || '27' }}
4143
run: |
4244
set -e
4345
ALL_BRANCHES=$(git branch -r | grep -v "origin/HEAD" | sed 's/origin\///')
44-
MIN_AGE_DAYS=${{ github.event.inputs.min_age_days || 27 }}
46+
MIN_AGE_DAYS=${MIN_AGE_DAYS:-27}
47+
48+
echo "MIN_AGE_DAYS=${MIN_AGE_DAYS}"
49+
50+
PROTECTED_COUNT=0
51+
MERGED_COUNT=0
52+
UNMERGED_COUNT=0
4553
4654
PROTECTED_BRANCHES=()
4755
MERGED_BRANCHES_TO_PROCESS=()
@@ -54,38 +62,56 @@ jobs:
5462
5563
for BRANCH in $ALL_BRANCHES; do
5664
branch_lower=$(echo "$BRANCH" | tr '[:upper:]' '[:lower:]')
57-
if [[ $branch_lower =~ (backup|development|main|master|production) ]]; then
58-
PROTECTED_BRANCHES+=("$BRANCH (protected)")
65+
if [[ $branch_lower == *backup* || $branch_lower =~ ^(development|main|master|production)(-[0-9]+)?$ ]]; then
66+
PROTECTED_BRANCHES+=("$BRANCH")
67+
PROTECTED_COUNT=$((PROTECTED_COUNT+1))
5968
elif git branch -r --merged origin/development | grep -q "origin/$BRANCH"; then
6069
MERGED_BRANCHES_TO_PROCESS+=("$BRANCH")
70+
MERGED_COUNT=$((MERGED_COUNT+1))
6171
else
62-
UNMERGED_BRANCHES+=("$BRANCH (not merged)")
72+
UNMERGED_BRANCHES+=("$BRANCH")
73+
UNMERGED_COUNT=$((UNMERGED_COUNT+1))
6374
fi
6475
done
6576
77+
echo "branch totals: protected=${PROTECTED_COUNT} merged=${MERGED_COUNT} unmerged=${UNMERGED_COUNT}"
78+
6679
for BRANCH in "${MERGED_BRANCHES_TO_PROCESS[@]}"; do
6780
MERGE_HASH=$(git log --grep="Merge branch.*$BRANCH" origin/development -n 1 --pretty=format:"%H" || true)
68-
[ -z "$MERGE_HASH" ] && MERGE_HASH=$(git log -n 1 origin/$BRANCH --pretty=format:"%H")
69-
70-
MERGE_DATE=$(git show -s --format=%ct $MERGE_HASH)
71-
DAYS_AGO=$(( ($(date +%s) - MERGE_DATE) / 86400 ))
72-
81+
if [ -z "$MERGE_HASH" ]; then
82+
MERGE_HASH=$(git log -n 1 origin/$BRANCH --pretty=format:"%H" || true)
83+
fi
84+
85+
if [ -z "$MERGE_HASH" ]; then
86+
echo "WARN: no merge commit found for $BRANCH — skipping"
87+
UNMERGED_BRANCHES+=("$BRANCH (no-merge-hash)")
88+
UNMERGED_COUNT=$((UNMERGED_COUNT+1))
89+
continue
90+
fi
91+
92+
MERGE_DATE_EPOCH=$(git show -s --format=%ct $MERGE_HASH 2>/dev/null || true)
93+
if [ -z "$MERGE_DATE_EPOCH" ]; then
94+
echo "WARN: could not read commit date for $BRANCH (hash=$MERGE_HASH) — skipping"
95+
UNMERGED_BRANCHES+=("$BRANCH (no-merge-date)")
96+
UNMERGED_COUNT=$((UNMERGED_COUNT+1))
97+
continue
98+
fi
99+
100+
DAYS_AGO=$(( ($(date +%s) - MERGE_DATE_EPOCH) / 86400 ))
101+
73102
if [[ $DAYS_AGO -ge $MIN_AGE_DAYS ]]; then
74-
BRANCHES_TO_DELETE+=("$BRANCH")
103+
BRANCHES_TO_DELETE+=("$BRANCH (${DAYS_AGO}d since merge)")
75104
else
76-
BRANCHES_TOO_RECENT+=("$BRANCH (too recent: ${DAYS_AGO}d)")
105+
BRANCHES_TOO_RECENT+=("$BRANCH (${DAYS_AGO}d since merge)")
77106
fi
107+
echo "checked $BRANCH: hash=$MERGE_HASH date=$MERGE_DATE_EPOCH days=${DAYS_AGO}"
78108
done
79109
80-
ALL_NON_DELETED=(
81-
"${PROTECTED_BRANCHES[@]}"
82-
"${BRANCHES_TOO_RECENT[@]}"
83-
"${UNMERGED_BRANCHES[@]}"
84-
)
85-
86110
echo "HAS_BRANCHES=$([ ${#BRANCHES_TO_DELETE[@]} -gt 0 ] && echo true || echo false)" >> $GITHUB_ENV
87111
echo "BRANCHES_TO_DELETE=$(printf -- '- %s\n' "${BRANCHES_TO_DELETE[@]}" | jq -Rs .)" >> $GITHUB_ENV
88-
echo "ALL_NON_DELETED=$(printf -- '- %s\n' "${ALL_NON_DELETED[@]}" | jq -Rs .)" >> $GITHUB_ENV
112+
echo "PROTECTED_BRANCHES=$(printf -- '- %s\n' "${PROTECTED_BRANCHES[@]}" | jq -Rs .)" >> $GITHUB_ENV
113+
echo "BRANCHES_TOO_RECENT=$(printf -- '- %s\n' "${BRANCHES_TOO_RECENT[@]}" | jq -Rs .)" >> $GITHUB_ENV
114+
echo "UNMERGED_BRANCHES=$(printf -- '- %s\n' "${UNMERGED_BRANCHES[@]}" | jq -Rs .)" >> $GITHUB_ENV
89115
90116
- name: Create Deletion PR
91117
if: env.HAS_BRANCHES == 'true'
@@ -97,8 +123,14 @@ jobs:
97123
### Branches for Deletion
98124
${{ fromJSON(env.BRANCHES_TO_DELETE) }}
99125
100-
### Protected/Recent Branches
101-
${{ fromJSON(env.ALL_NON_DELETED) }}
126+
### Protected Branches
127+
${{ fromJSON(env.PROTECTED_BRANCHES) }}
128+
129+
### Recent Merges (too recent to delete)
130+
${{ fromJSON(env.BRANCHES_TOO_RECENT) }}
131+
132+
### Unmerged Branches
133+
${{ fromJSON(env.UNMERGED_BRANCHES) }}
102134
base: development
103135
labels: Internal WIP
104136
assignees: MarkvanMents,OlufunkeMoronfolu
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
name: Check Claude Configuration
2+
3+
on:
4+
pull_request:
5+
paths:
6+
- '.claude/**'
7+
- 'CLAUDE.md'
8+
9+
jobs:
10+
check-claude-config:
11+
runs-on: ubuntu-latest
12+
steps:
13+
- name: Check for Claude configuration changes
14+
uses: actions/github-script@v7
15+
with:
16+
script: |
17+
const comment = `⚠️ **Claude Configuration Warning**
18+
19+
You've modified Claude Code configuration files. These files contain the shared configuration for all contributors. Please revert this change if unintended. **ONLY modify these files if you need to change shared configurations that apply to everyone and have discussed this change with the TW team.**
20+
21+
To override the Claude settings locally, use \`.claude/settings.local.json\` instead. This local file is gitignored and overrides the repo default.
22+
23+
**For example, if you're changing AWS_PROFILE:**
24+
The default profile name is \`my-sandbox\`. If your AWS profile has a different name, override it locally instead of changing the shared file.
25+
26+
Create or edit \`.claude/settings.local.json\` in the repo root and include the following lines:
27+
28+
\`\`\`json
29+
{
30+
"env": {
31+
"AWS_PROFILE": "your-sandbox-name"
32+
}
33+
}
34+
\`\`\`
35+
`;
36+
37+
github.rest.issues.createComment({
38+
issue_number: context.issue.number,
39+
owner: context.repo.owner,
40+
repo: context.repo.repo,
41+
body: comment
42+
});
43+
44+
core.setFailed('Claude configuration was modified - see comment for guidance');

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ hugo.exe
88
/.hugo_build.lock
99
/.claude/audit.log
1010
/.claude/settings.local.json
11+
/.mcp.json
1112

1213
# For Mac users
1314
.DS_Store

CLAUDE.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,3 +200,7 @@ If you are unsure whether a command is safe to run, **do not run it**. Instead,
200200
- Run tests after making changes: see project-specific test commands
201201
- Do not add dependencies without asking
202202
- Do not refactor code beyond what was requested
203+
204+
### Claude Code Settings Management
205+
206+
For personal configuration changes (AWS_PROFILE, etc.), always suggest `.claude/settings.local.json` instead of modifying `.claude/settings.json`. The local file is gitignored and overrides shared settings.

CONTRIBUTING.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
For guidelines on contributing to the Mendix documentation, please see these two documents:
1+
For guidelines on contributing to the Mendix documentation, see these documents:
22

33
* [How to Contribute to Mendix Docs](https://docs.mendix.com/community-tools/contribute-to-mendix-docs/)
44
* [Documentation Writing Guidelines](https://docs.mendix.com/community-tools/documentation-guidelines/)
5+
* [Using AI Tools for Documentation](https://docs.mendix.com/community-tools/contribute-to-mendix-docs/using-ai-tools/)

branch-cleanup-timestamp.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
Last scan for stale merged branches: 2026-03-01 23:28:32 CET (UTC+01:00)
1+
Last scan for stale merged branches: 2026-04-02 00:41:32 CEST (UTC+02:00)

content/en/docs/apidocs-mxsdk/apidocs/studio-pro-11/extensibility-api/web/_index.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,3 +51,6 @@ Below is a list of how-tos for you to begin with:
5151
* [How to Exchange Information Between Active Views](/apidocs-mxsdk/apidocs/web-extensibility-api-11/message-passing-api/)
5252
* [How to Show Version Control Information](/apidocs-mxsdk/apidocs/web-extensibility-api-11/version-control-api/)
5353
* [How to Introduce a New Document Type](/apidocs-mxsdk/apidocs/web-extensibility-api-11/custom-blob-document-api/)
54+
* [How to Listen for Connection Changes](/apidocs-mxsdk/apidocs/web-extensibility-api-11/runtime-controller-api/)
55+
* [How to Access Runtime Constants](/apidocs-mxsdk/apidocs/web-extensibility-api-11/runtime-configuration-api/)
56+
* [How to Use Extension Permissions in Overview Pane](/apidocs-mxsdk/apidocs/web-extensibility-api-11/extension-permissions/)

0 commit comments

Comments
 (0)