secufusion-mcp 1.2.0 → 1.2.2
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/AGENTS.md +26 -26
- package/index.js +14 -6
- package/package.json +1 -1
package/AGENTS.md
CHANGED
|
@@ -468,6 +468,7 @@ STEP 1: call run_pre_pr_checks_with_reviewer_agent(work_item_id: <id>)
|
|
|
468
468
|
P3 MISSING_INDEX — new query columns have migration index
|
|
469
469
|
P4 KAFKA_SYNC — no sync work inside @KafkaListener
|
|
470
470
|
P5 EARLY_RETURN — no early returns (single-exit rule)
|
|
471
|
+
(Note: If a mechanical check is a false positive, pass the `suppressions` parameter to the tool with `{ check, method, reason }` instead of ignoring it.)
|
|
471
472
|
— Tier 2: AI File Reviewer (only after P1–P5 pass)
|
|
472
473
|
Checks: hardcoded URLs, missing @Transactional(readOnly),
|
|
473
474
|
missing @PreAuthorize, debug statements, exception swallowing,
|
|
@@ -727,37 +728,37 @@ Before Phase 0.7 plan presentation:
|
|
|
727
728
|
**Audience:** Technical and Non-Technical stakeholders on the Azure DevOps board.
|
|
728
729
|
**Format rules:**
|
|
729
730
|
- Layman summary: NO class names, NO method names, NO technical terms. Pure English.
|
|
730
|
-
-
|
|
731
|
+
- Execution Flow: BE specific. Exact class names, exact method names, exact file paths. Source from `files-touched.json`.
|
|
732
|
+
- Sequential flow ONLY. Do not use before/after framing (e.g., avoid "not X directly," "exactly as before," "hardened after review," etc.). Just state what happens and in what order.
|
|
731
733
|
- Tables must have content in every cell. If unknown → "not recorded".
|
|
732
734
|
- Max 2 sentences in any single prose paragraph.
|
|
733
735
|
- Max 600 words.
|
|
734
736
|
|
|
735
737
|
```markdown
|
|
736
738
|
## Layman Summary
|
|
737
|
-
{layman_summary — 2-3 sentences max}
|
|
739
|
+
{layman_summary — 2-3 sentences max. Sequential flow only.}
|
|
738
740
|
|
|
739
|
-
##
|
|
741
|
+
## Execution Flow
|
|
740
742
|
{If auth/permission gating exists:}
|
|
741
|
-
>
|
|
743
|
+
> 1. Request gated by `{permission}` authority.
|
|
742
744
|
|
|
743
|
-
|
|
744
|
-
**
|
|
745
|
-
|
|
745
|
+
{Describe the straight sequence of what happens, in order, step-by-step. E.g.:}
|
|
746
|
+
2. **Trigger:** {How the flow starts}
|
|
747
|
+
3. **Validation:** {What checks occur}
|
|
748
|
+
4. **Processing:** {What data is transformed or queried}
|
|
749
|
+
5. **Result:** {What is returned or persisted}
|
|
746
750
|
|
|
747
|
-
|
|
748
|
-
{for each sad_path in scenarios.json:}
|
|
749
|
-
- {sad_path description} → {how handled}
|
|
750
|
-
|
|
751
|
-
**Security cases:**
|
|
751
|
+
### Security & Error Handling
|
|
752
752
|
{for each security_case in scenarios.json:}
|
|
753
753
|
- {security concern} → {enforcement}
|
|
754
|
+
{for each sad_path in scenarios.json:}
|
|
755
|
+
- {sad_path description} → {how handled}
|
|
754
756
|
|
|
755
|
-
###
|
|
757
|
+
### Infrastructure Impact
|
|
756
758
|
| Area | Status |
|
|
757
759
|
|---|---|
|
|
758
760
|
| DB migration | {✅ Not required / ⚠️ Created: V{n}__...sql} |
|
|
759
761
|
| Kafka topics | {✅ No new topics / ⚠️ New topic: {name}} |
|
|
760
|
-
| {other_service}-api | {✅ No changes / ⚠️ Changes required} |
|
|
761
762
|
| API contract | {✅ No breaking changes / ⚠️ See decisions} |
|
|
762
763
|
|
|
763
764
|
---
|
|
@@ -767,7 +768,8 @@ Before Phase 0.7 plan presentation:
|
|
|
767
768
|
### PR Comment Template (`pr-comment.md`)
|
|
768
769
|
**Audience:** Busy Developer Reviewers reading the PR description.
|
|
769
770
|
**Format rules:**
|
|
770
|
-
- Group changes by
|
|
771
|
+
- Group changes by the sequence of execution, not by file name.
|
|
772
|
+
- Sequential flow ONLY. No before/after comparisons. Just state what the code does now.
|
|
771
773
|
- ✅ for things NOT changing is equally important.
|
|
772
774
|
- Guardrails section is mandatory.
|
|
773
775
|
- Max 400 words. Condense changes table if longer.
|
|
@@ -779,13 +781,14 @@ Before Phase 0.7 plan presentation:
|
|
|
779
781
|
|
|
780
782
|
---
|
|
781
783
|
## Summary
|
|
782
|
-
{2-3 sentences MAX. What
|
|
784
|
+
{2-3 sentences MAX. What the code does. Sequential flow only.}
|
|
783
785
|
|
|
784
786
|
---
|
|
785
|
-
##
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
787
|
+
## Implementation Sequence
|
|
788
|
+
1. {Step 1 of the new flow}
|
|
789
|
+
2. {Step 2 of the new flow}
|
|
790
|
+
3. {Step 3 of the new flow}
|
|
791
|
+
4. {Step 4 of the new flow}
|
|
789
792
|
|
|
790
793
|
---
|
|
791
794
|
## Affected Service
|
|
@@ -793,16 +796,13 @@ Before Phase 0.7 plan presentation:
|
|
|
793
796
|
|
|
794
797
|
---
|
|
795
798
|
## Impact
|
|
796
|
-
- ✅ No functional or behavioral changes {OR describe actual behavioral change}
|
|
799
|
+
- ✅ No functional or behavioral changes {OR describe actual behavioral change sequentially}
|
|
797
800
|
- ✅ No DB migration required {OR: ⚠️ Flyway migration V{n} included}
|
|
798
801
|
- ✅ No Kafka topic changes {OR: ⚠️ New topic: {name}}
|
|
799
|
-
- ✅ No API contract changes {OR: ⚠️ New endpoints: see
|
|
802
|
+
- ✅ No API contract changes {OR: ⚠️ New endpoints: see Implementation Sequence above}
|
|
800
803
|
|
|
801
804
|
---
|
|
802
|
-
##
|
|
803
|
-
**Happy path:** {happy_path one line}
|
|
804
|
-
|
|
805
|
-
**Sad paths handled:**
|
|
805
|
+
## Error Handling
|
|
806
806
|
- {what fails} → {how handled}
|
|
807
807
|
|
|
808
808
|
---
|
package/index.js
CHANGED
|
@@ -524,24 +524,32 @@ function generateNewTaskFolder(workItemId, title, tasksRoot) {
|
|
|
524
524
|
let numericId = workItemId.replace(/\D/g, ''); // Extract just the digits
|
|
525
525
|
if (!numericId)
|
|
526
526
|
numericId = workItemId; // fallback
|
|
527
|
-
let taskTypeStr = "
|
|
527
|
+
let taskTypeStr = "Task";
|
|
528
528
|
// Try to load the classification to get the true task_type
|
|
529
529
|
const classifPath = path.join(tasksRoot, '..', 'classifications', `${workItemId}.json`);
|
|
530
530
|
const classif = readJson(classifPath);
|
|
531
531
|
if (classif && typeof classif.task_type === 'string') {
|
|
532
532
|
const rawType = classif.task_type.toLowerCase();
|
|
533
533
|
if (rawType === 'user_story')
|
|
534
|
-
taskTypeStr = '
|
|
534
|
+
taskTypeStr = 'US';
|
|
535
|
+
else if (rawType === 'bug')
|
|
536
|
+
taskTypeStr = 'Bug';
|
|
535
537
|
else
|
|
536
|
-
taskTypeStr = rawType;
|
|
538
|
+
taskTypeStr = rawType.charAt(0).toUpperCase() + rawType.slice(1);
|
|
537
539
|
}
|
|
538
540
|
else {
|
|
539
541
|
// Fallback: guess from the workItemId string itself if passed as "BUG-1173"
|
|
540
542
|
const prefixMatch = workItemId.match(/^([a-zA-Z]+)-/);
|
|
541
543
|
if (prefixMatch) {
|
|
542
|
-
|
|
543
|
-
if (
|
|
544
|
-
taskTypeStr = '
|
|
544
|
+
const lowerPrefix = prefixMatch[1].toLowerCase();
|
|
545
|
+
if (lowerPrefix === 'wi')
|
|
546
|
+
taskTypeStr = 'Task';
|
|
547
|
+
else if (lowerPrefix === 'bug')
|
|
548
|
+
taskTypeStr = 'Bug';
|
|
549
|
+
else if (lowerPrefix === 'us')
|
|
550
|
+
taskTypeStr = 'US';
|
|
551
|
+
else
|
|
552
|
+
taskTypeStr = lowerPrefix.charAt(0).toUpperCase() + lowerPrefix.slice(1);
|
|
545
553
|
}
|
|
546
554
|
}
|
|
547
555
|
return path.join(tasksRoot, `${taskTypeStr}-${numericId}-${slug}`);
|