diff --git a/.Jules/palette.md b/.Jules/palette.md index f8c1fbd..6ffbbda 100644 --- a/.Jules/palette.md +++ b/.Jules/palette.md @@ -5,3 +5,4 @@ ## 2026-06-30 - Added Emojis to CLI Output Messages **Learning:** Adding subtle emojis to informative CLI output headers (like "Created/updated files" and "Next steps") provides clearer visual cues for developers scanning long CLI output. **Action:** Always include relevant emojis in summary output text to make success and informational messages more visually distinguishable from routine command logs. +## 2026-07-05 - AppGuardrail CLI Emoji Formatting\n**Learning:** CLI output is significantly more scannable and accessible when Errors, Warnings, and file lists consistently use semantic prefixing combined with emojis (e.g. 'āŒ Error', 'āš ļø Warning'). Adding 'šŸ’” Hint:' lines to errors reduces user friction.\n**Action:** Ensure all future CLI text changes or additions follow these exact structural and visual guidelines. diff --git a/scanner/cli/appguardrail.py b/scanner/cli/appguardrail.py index 9314ee4..37efa45 100644 --- a/scanner/cli/appguardrail.py +++ b/scanner/cli/appguardrail.py @@ -1422,7 +1422,7 @@ def cmd_scan(args): findings.extend(_run_bandit_scan(scan_path)) except RuntimeError as exc: if external_plan.bandit.auto_selected and not external_plan.bandit.forced: - print(f"āš ļø Skipping Bandit auto integration: {exc}\n") + print(f"āš ļø Warning: Skipping Bandit auto integration: {exc}\n") else: print(f"āŒ Error: {exc}", file=sys.stderr) print( @@ -1437,7 +1437,7 @@ def cmd_scan(args): findings.extend(_run_ruff_security_scan(scan_path)) except RuntimeError as exc: if external_plan.ruff.auto_selected and not external_plan.ruff.forced: - print(f"āš ļø Skipping Ruff auto integration: {exc}\n") + print(f"āš ļø Warning: Skipping Ruff auto integration: {exc}\n") else: print(f"āŒ Error: {exc}", file=sys.stderr) print( @@ -1455,7 +1455,7 @@ def cmd_scan(args): external_plan.semgrep.auto_selected and not external_plan.semgrep.forced ): - print(f"āš ļø Skipping Semgrep auto integration: {exc}\n") + print(f"āš ļø Warning: Skipping Semgrep auto integration: {exc}\n") else: print(f"āŒ Error: {exc}", file=sys.stderr) print( @@ -1470,7 +1470,7 @@ def cmd_scan(args): findings.extend(_run_zap_baseline(zap_baseline_url)) except RuntimeError as exc: if external_plan.zap.auto_selected and not external_plan.zap.forced: - print(f"āš ļø Skipping ZAP auto integration: {exc}\n") + print(f"āš ļø Warning: Skipping ZAP auto integration: {exc}\n") else: print(f"āŒ Error: {exc}", file=sys.stderr) print( @@ -1652,11 +1652,11 @@ def cmd_org_bundle(args): summary = manifest["summary"] print(f"\nāœ… Buyer evidence bundle written: {bundle_dir}\n") - print("Files:") - print(" - org-readiness.md") - print(" - buyer-evidence.json") - print(" - manifest.json") - print(" - README.md") + print("šŸ“„ Files:") + print("šŸ“„ - org-readiness.md") + print("šŸ“„ - buyer-evidence.json") + print("šŸ“„ - manifest.json") + print("šŸ“„ - README.md") print() print(f"Open PRs analyzed: {summary['open_pull_requests']}") print(f"Buyer evidence status: {summary['buyer_evidence_status']}") @@ -2634,13 +2634,14 @@ def _print_scan_results(findings, files_scanned): ) if files_scanned == 0: - print("\nāš ļø No files were scanned. Are you in the right directory?") + print("\nāš ļø Warning: No files were scanned. Are you in the right directory?") elif counts["CRITICAL"] > 0: issue_word = "issue" if counts["CRITICAL"] == 1 else "issues" - print(f"\nāŒ Critical {issue_word} found. Fix before deploying.") + print(f"\nāŒ Error: Critical {issue_word} found. Fix before deploying.") + print("šŸ’” Hint: Review the critical issues and apply fixes before deploying.") elif counts["HIGH"] > 0: issue_word = "issue" if counts["HIGH"] == 1 else "issues" - print(f"\nāš ļø High-severity {issue_word} found. Review before deploying.") + print(f"\nāš ļø Warning: High-severity {issue_word} found. Review before deploying.") elif not findings: print("\nāœ… No issues found in this scan.") else: diff --git a/tests/test_appguardrail.py b/tests/test_appguardrail.py index 3d1a633..8a678d1 100644 --- a/tests/test_appguardrail.py +++ b/tests/test_appguardrail.py @@ -1300,7 +1300,7 @@ def test_print_scan_results_critical(capsys): assert "Found a critical issue" in captured.out assert "Code: const secret = 'abc';" in captured.out assert "šŸ”“ 1 critical issue" in captured.out - assert "āŒ Critical issue found. Fix before deploying." in captured.out + assert "āŒ Error: Critical issue found. Fix before deploying." in captured.out assert ( "šŸ’” Run 'appguardrail review' to get an AI prompt for fixing this issue." in captured.out @@ -1323,7 +1323,7 @@ def test_print_scan_results_high(capsys): assert "[🟠 HIGH] app/api/route.ts:5" in captured.out assert "🟠 1 high issue" in captured.out - assert "āš ļø High-severity issue found. Review before deploying." in captured.out + assert "āš ļø Warning: High-severity issue found. Review before deploying." in captured.out def test_print_scan_results_warnings_only(capsys):