@arii/boomtick-mcp 0.3.6 → 0.3.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.3.7](https://github.com/arii/boomtick/compare/mcp-v0.3.6...mcp-v0.3.7) (2026-08-17)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Bug Fixes
|
|
7
|
+
|
|
8
|
+
* **ci:** remove submodule-pinned action refs from impact-analysis ([#723](https://github.com/arii/boomtick/issues/723)) ([d6e0494](https://github.com/arii/boomtick/commit/d6e0494fe8ac781777fb1546bb3c0f0102074a5c))
|
|
9
|
+
* ensure impact analysis posts PR comments and sends Jules messages ([#724](https://github.com/arii/boomtick/issues/724)) ([a52cc8e](https://github.com/arii/boomtick/commit/a52cc8e220def8bf2057b4da1b596e80fc0eed1f))
|
|
10
|
+
* resolve script fallback paths in mcp impact-analysis action ([#716](https://github.com/arii/boomtick/issues/716)) ([b29dd06](https://github.com/arii/boomtick/commit/b29dd067da2b45fc8410ca26e34a8c74626fe937))
|
|
11
|
+
|
|
3
12
|
## [0.3.6](https://github.com/arii/boomtick/compare/mcp-v0.3.5...mcp-v0.3.6) (2026-08-13)
|
|
4
13
|
|
|
5
14
|
|
|
@@ -16,10 +16,8 @@ inputs:
|
|
|
16
16
|
runs:
|
|
17
17
|
using: composite
|
|
18
18
|
steps:
|
|
19
|
-
-
|
|
20
|
-
|
|
21
|
-
- name: pnpm install
|
|
22
|
-
run: pnpm install --frozen-lockfile --prefer-offline
|
|
19
|
+
- name: Configure Git Safe Directory
|
|
20
|
+
run: git config --global --add safe.directory "$GITHUB_WORKSPACE"
|
|
23
21
|
shell: bash
|
|
24
22
|
|
|
25
23
|
- name: Validate PR Number
|
|
@@ -173,8 +171,13 @@ runs:
|
|
|
173
171
|
echo "Executing check-visual-changes.ts at: $RESOLVED_PATH"
|
|
174
172
|
pnpm exec tsx "$RESOLVED_PATH" >> "$GITHUB_OUTPUT"
|
|
175
173
|
else
|
|
176
|
-
|
|
177
|
-
|
|
174
|
+
if [ -f "scripts/check-visual-changes.ts" ]; then
|
|
175
|
+
echo "Executing check-visual-changes.ts from current workspace."
|
|
176
|
+
pnpm exec tsx scripts/check-visual-changes.ts >> "$GITHUB_OUTPUT"
|
|
177
|
+
else
|
|
178
|
+
echo "⚠️ Skipping: check-visual-changes.ts script not found. Defaulting changed_routes=0"
|
|
179
|
+
echo "changed_routes=0" >> "$GITHUB_OUTPUT"
|
|
180
|
+
fi
|
|
178
181
|
fi
|
|
179
182
|
shell: bash
|
|
180
183
|
|
|
@@ -194,21 +197,6 @@ runs:
|
|
|
194
197
|
fi
|
|
195
198
|
shell: bash
|
|
196
199
|
|
|
197
|
-
- name: Visual review github models agent
|
|
198
|
-
if: always() && steps.check_visuals.outputs.changed_routes != '0' && steps.check_visuals.outputs.changed_routes != ''
|
|
199
|
-
env:
|
|
200
|
-
GITHUB_TOKEN: ${{ inputs.github_token }}
|
|
201
|
-
PR_NUMBER: ${{ inputs.pr_number }}
|
|
202
|
-
JULES_API_KEY: ${{ inputs.jules_api_key }}
|
|
203
|
-
GITHUB_REPOSITORY: ${{ github.repository }}
|
|
204
|
-
run: |
|
|
205
|
-
if node -e "const pkg = require('./package.json'); if (!pkg.scripts || !pkg.scripts['impact:github-models-review']) process.exit(1)" 2>/dev/null; then
|
|
206
|
-
pnpm run impact:github-models-review
|
|
207
|
-
else
|
|
208
|
-
echo "⚠️ Skipping: impact:github-models-review script not found"
|
|
209
|
-
fi
|
|
210
|
-
shell: bash
|
|
211
|
-
|
|
212
200
|
- name: Report Summary
|
|
213
201
|
if: always()
|
|
214
202
|
run: |
|
|
@@ -241,26 +229,20 @@ runs:
|
|
|
241
229
|
if [ -f artifacts/gemini-review.md ]; then
|
|
242
230
|
{ echo ""; cat artifacts/gemini-review.md; } >> "$GITHUB_STEP_SUMMARY"
|
|
243
231
|
fi
|
|
244
|
-
if [ -f artifacts/github-models-review.md ]; then
|
|
245
|
-
{ echo ""; cat artifacts/github-models-review.md; } >> "$GITHUB_STEP_SUMMARY"
|
|
246
|
-
fi
|
|
247
232
|
if [ -f artifacts/gemini-code-review.md ]; then
|
|
248
233
|
{ echo ""; cat artifacts/gemini-code-review.md; } >> "$GITHUB_STEP_SUMMARY"
|
|
249
234
|
fi
|
|
250
|
-
if [ -f artifacts/github-models-code-review.md ]; then
|
|
251
|
-
{ echo ""; cat artifacts/github-models-code-review.md; } >> "$GITHUB_STEP_SUMMARY"
|
|
252
|
-
fi
|
|
253
235
|
|
|
254
236
|
FAILED=0
|
|
255
|
-
# Expected verdicts: gemini-code-review
|
|
237
|
+
# Expected verdicts: gemini-code-review
|
|
256
238
|
# Visual reviews are expected only if visual changes exist
|
|
257
239
|
EXPECTED_REVIEWS=""
|
|
258
240
|
if [ "${{ steps.impact_analysis.outputs.has_impact }}" == "true" ]; then
|
|
259
241
|
if [ "${{ github.event_name }}" == "pull_request" ]; then
|
|
260
|
-
EXPECTED_REVIEWS="gemini-code-review
|
|
242
|
+
EXPECTED_REVIEWS="gemini-code-review"
|
|
261
243
|
fi
|
|
262
244
|
if [ "${{ steps.check_visuals.outputs.changed_routes }}" != "0" ] && [ "${{ steps.check_visuals.outputs.changed_routes }}" != "" ]; then
|
|
263
|
-
EXPECTED_REVIEWS="$EXPECTED_REVIEWS gemini-review
|
|
245
|
+
EXPECTED_REVIEWS="$EXPECTED_REVIEWS gemini-review"
|
|
264
246
|
fi
|
|
265
247
|
fi
|
|
266
248
|
|
|
@@ -328,19 +310,100 @@ runs:
|
|
|
328
310
|
if [ -f "$TARGET_PATH" ]; then
|
|
329
311
|
RESOLVED_PATH=$(realpath "$TARGET_PATH")
|
|
330
312
|
echo "Executing send-jules-impact.py at: $RESOLVED_PATH"
|
|
313
|
+
export PYTHONPATH="$(realpath "${{ github.action_path }}/../../../cli"):$PYTHONPATH"
|
|
331
314
|
python3 "$RESOLVED_PATH"
|
|
332
315
|
else
|
|
333
|
-
|
|
316
|
+
# Fallback check for docker run execution or direct python script in checkout workspace
|
|
317
|
+
# Inside container execution, scripts/send-jules-impact.py should exist in workspace
|
|
318
|
+
if [ -f "scripts/send-jules-impact.py" ]; then
|
|
319
|
+
echo "Executing send-jules-impact.py from current workspace."
|
|
320
|
+
export PYTHONPATH="cli:$PYTHONPATH"
|
|
321
|
+
python3 scripts/send-jules-impact.py
|
|
322
|
+
else
|
|
323
|
+
echo "⚠️ Skipping: send-jules-impact.py script not found."
|
|
324
|
+
fi
|
|
334
325
|
fi
|
|
335
326
|
shell: bash
|
|
336
327
|
|
|
337
328
|
- name: Update Impact Analysis Feedback (Final Result)
|
|
338
329
|
if: always()
|
|
339
|
-
uses:
|
|
330
|
+
uses: actions/github-script@v8 # nosemgrep: yaml.github-actions.security.github-actions-mutable-action-tag.github-actions-mutable-action-tag
|
|
331
|
+
env:
|
|
332
|
+
INPUT_STATUS_LINE: '✅ **Impact Analysis Complete**'
|
|
333
|
+
INPUT_IMPACT_BODY: ${{ env.IMPACT_BODY }}
|
|
340
334
|
with:
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
335
|
+
github-token: ${{ inputs.github_token }}
|
|
336
|
+
script: |
|
|
337
|
+
const owner = context.repo.owner;
|
|
338
|
+
const repo = context.repo.repo;
|
|
339
|
+
const branchName = context.ref.replace('refs/heads/', '');
|
|
340
|
+
|
|
341
|
+
const pstTime = new Date().toLocaleString('en-US', {
|
|
342
|
+
timeZone: 'America/Los_Angeles',
|
|
343
|
+
dateStyle: 'medium',
|
|
344
|
+
timeStyle: 'short'
|
|
345
|
+
});
|
|
346
|
+
|
|
347
|
+
if (branchName === 'main') return;
|
|
348
|
+
|
|
349
|
+
const pullRequests = await github.paginate(github.rest.pulls.list, {
|
|
350
|
+
owner,
|
|
351
|
+
repo,
|
|
352
|
+
state: 'open'
|
|
353
|
+
});
|
|
354
|
+
const matchingPRs = pullRequests.filter(pr => pr.head.ref === branchName);
|
|
355
|
+
|
|
356
|
+
const statusLine = process.env.INPUT_STATUS_LINE;
|
|
357
|
+
let impactBodyText = (process.env.INPUT_IMPACT_BODY || '')
|
|
358
|
+
.replace(/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi, '[REMOVED SCRIPT]');
|
|
359
|
+
|
|
360
|
+
for (const pr of matchingPRs) {
|
|
361
|
+
const commentTag = `<!-- impact-analysis-comment-${branchName} -->`;
|
|
362
|
+
let bodyParts = [
|
|
363
|
+
`🚀 **Impact Analysis Details** (Last updated: ${pstTime} PST)`,
|
|
364
|
+
'',
|
|
365
|
+
statusLine,
|
|
366
|
+
`- **Commit SHA:** \`${process.env.GITHUB_SHA.slice(0, 7)}\``,
|
|
367
|
+
`- [Link to artifacts](https://github.com/${owner}/${repo}/actions/runs/${context.runId})`,
|
|
368
|
+
''
|
|
369
|
+
];
|
|
370
|
+
|
|
371
|
+
if (impactBodyText) {
|
|
372
|
+
bodyParts.push(impactBodyText, '');
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
const MAX_LENGTH = 65536;
|
|
376
|
+
const truncationNotice = '\n\n... (truncated due to GitHub comment size limits)\n';
|
|
377
|
+
let currentContent = bodyParts.join('\n');
|
|
378
|
+
let projectedLength = currentContent.length + commentTag.length + 1;
|
|
379
|
+
|
|
380
|
+
if (projectedLength > MAX_LENGTH) {
|
|
381
|
+
const availableLength = MAX_LENGTH - commentTag.length - truncationNotice.length - 2;
|
|
382
|
+
let safeContent = currentContent.slice(0, availableLength);
|
|
383
|
+
let lastNewline = safeContent.lastIndexOf('\n');
|
|
384
|
+
if (lastNewline > availableLength * 0.9) {
|
|
385
|
+
safeContent = safeContent.slice(0, lastNewline);
|
|
386
|
+
}
|
|
387
|
+
bodyParts = [safeContent, truncationNotice];
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
bodyParts.push(commentTag);
|
|
391
|
+
const body = bodyParts.join('\n');
|
|
392
|
+
|
|
393
|
+
const comments = await github.paginate(github.rest.issues.listComments, {
|
|
394
|
+
owner,
|
|
395
|
+
repo,
|
|
396
|
+
issue_number: pr.number,
|
|
397
|
+
});
|
|
398
|
+
|
|
399
|
+
const existingComment = comments.find(c => c.body.includes(commentTag));
|
|
400
|
+
|
|
401
|
+
if (existingComment) {
|
|
402
|
+
await github.rest.issues.updateComment({ owner, repo, comment_id: existingComment.id, body });
|
|
403
|
+
} else {
|
|
404
|
+
await github.rest.issues.createComment({ issue_number: pr.number, owner, repo, body });
|
|
405
|
+
}
|
|
406
|
+
}
|
|
344
407
|
|
|
345
408
|
- name: Merge AI Logs into Artifacts
|
|
346
409
|
if: always()
|