mobile-ai-agents 1.0.23
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 +228 -0
- package/CLAUDE.md +236 -0
- package/LICENSE +21 -0
- package/README.md +652 -0
- package/agents/android/android-crash-analyzer/README.md +134 -0
- package/agents/android/android-crash-analyzer/agent.md +206 -0
- package/agents/android/android-crash-analyzer/example-input.md +138 -0
- package/agents/android/android-crash-analyzer/example-output.md +225 -0
- package/agents/android/anr-investigation/README.md +78 -0
- package/agents/android/anr-investigation/agent.md +117 -0
- package/agents/android/anr-investigation/example-input.md +62 -0
- package/agents/android/anr-investigation/example-output.md +103 -0
- package/agents/android/axiom/agent.md +197 -0
- package/agents/android/code-reviewer/README.md +108 -0
- package/agents/android/code-reviewer/agent.md +210 -0
- package/agents/android/code-reviewer/example-input.md +116 -0
- package/agents/android/code-reviewer/example-output.md +115 -0
- package/agents/android/compose-navigation/README.md +76 -0
- package/agents/android/compose-navigation/agent.md +121 -0
- package/agents/android/compose-navigation/example-input.md +49 -0
- package/agents/android/compose-navigation/example-output.md +325 -0
- package/agents/android/compose-screen-builder/README.md +95 -0
- package/agents/android/compose-screen-builder/agent.md +170 -0
- package/agents/android/compose-screen-builder/example-input.md +40 -0
- package/agents/android/compose-screen-builder/example-output.md +568 -0
- package/agents/android/compose-ui-reviewer/README.md +73 -0
- package/agents/android/compose-ui-reviewer/agent.md +253 -0
- package/agents/android/compose-ui-reviewer/example-input.md +84 -0
- package/agents/android/compose-ui-reviewer/example-output.md +102 -0
- package/agents/android/crash-analyzer/README.md +53 -0
- package/agents/android/crash-analyzer/agent.md +295 -0
- package/agents/android/memory-leak-analyzer/README.md +79 -0
- package/agents/android/memory-leak-analyzer/agent.md +116 -0
- package/agents/android/memory-leak-analyzer/example-input.md +78 -0
- package/agents/android/memory-leak-analyzer/example-output.md +128 -0
- package/agents/cross-platform/accessibility-auditor/README.md +47 -0
- package/agents/cross-platform/accessibility-auditor/agent.md +268 -0
- package/agents/cross-platform/accessibility-auditor/example-input.md +84 -0
- package/agents/cross-platform/accessibility-auditor/example-output.md +132 -0
- package/agents/cross-platform/appforge/agent.md +303 -0
- package/agents/cross-platform/ci-cd-generator/README.md +65 -0
- package/agents/cross-platform/ci-cd-generator/agent.md +422 -0
- package/agents/cross-platform/ci-cd-generator/example-input.md +69 -0
- package/agents/cross-platform/ci-cd-generator/example-output.md +261 -0
- package/agents/cross-platform/crasher/agent.md +221 -0
- package/agents/cross-platform/figma/agent.md +247 -0
- package/agents/cross-platform/launchpad/agent.md +330 -0
- package/agents/cross-platform/mobile-harness/agent.md +422 -0
- package/agents/cross-platform/mobile-memory/agent.md +429 -0
- package/agents/cross-platform/perf/agent.md +261 -0
- package/agents/cross-platform/pipeline/agent.md +288 -0
- package/agents/cross-platform/release-notes-generator/README.md +63 -0
- package/agents/cross-platform/release-notes-generator/agent.md +218 -0
- package/agents/cross-platform/release-notes-generator/example-input.md +71 -0
- package/agents/cross-platform/release-notes-generator/example-output.md +96 -0
- package/agents/cross-platform/scribe/agent.md +180 -0
- package/agents/cross-platform/security-scanner/README.md +61 -0
- package/agents/cross-platform/security-scanner/agent.md +287 -0
- package/agents/cross-platform/security-scanner/example-input.md +77 -0
- package/agents/cross-platform/security-scanner/example-output.md +141 -0
- package/agents/cross-platform/sentinel/agent.md +217 -0
- package/agents/cross-platform/store-listing-writer/README.md +58 -0
- package/agents/cross-platform/store-listing-writer/agent.md +380 -0
- package/agents/cross-platform/store-listing-writer/example-input.md +67 -0
- package/agents/cross-platform/store-listing-writer/example-output.md +131 -0
- package/agents/flutter/bloc-feature-builder/README.md +101 -0
- package/agents/flutter/bloc-feature-builder/agent.md +225 -0
- package/agents/flutter/bloc-feature-builder/example-input.md +47 -0
- package/agents/flutter/bloc-feature-builder/example-output.md +838 -0
- package/agents/flutter/dart/agent.md +223 -0
- package/agents/flutter/widget-generator/README.md +66 -0
- package/agents/flutter/widget-generator/agent.md +264 -0
- package/agents/flutter/widget-generator/example-input.md +71 -0
- package/agents/flutter/widget-generator/example-output.md +163 -0
- package/agents/gaming/forge/agent.md +197 -0
- package/agents/gaming/unreal/agent.md +200 -0
- package/agents/ios/crash-analyzer/README.md +69 -0
- package/agents/ios/crash-analyzer/agent.md +300 -0
- package/agents/ios/crash-analyzer/example-input.md +83 -0
- package/agents/ios/crash-analyzer/example-output.md +126 -0
- package/agents/ios/swift/agent.md +206 -0
- package/agents/ios/swift-reviewer/README.md +68 -0
- package/agents/ios/swift-reviewer/agent.md +231 -0
- package/agents/ios/swift-reviewer/example-input.md +100 -0
- package/agents/ios/swift-reviewer/example-output.md +127 -0
- package/agents/react-native/bridge/agent.md +212 -0
- package/agents/react-native/performance-optimizer/README.md +81 -0
- package/agents/react-native/performance-optimizer/agent.md +284 -0
- package/agents/react-native/performance-optimizer/example-input.md +104 -0
- package/agents/react-native/performance-optimizer/example-output.md +132 -0
- package/agents/unity/shader-generator/README.md +77 -0
- package/agents/unity/shader-generator/agent.md +270 -0
- package/agents/unity/shader-generator/example-input.md +70 -0
- package/agents/unity/shader-generator/example-output.md +160 -0
- package/agents/unreal/blueprint-advisor/README.md +71 -0
- package/agents/unreal/blueprint-advisor/agent.md +311 -0
- package/agents/unreal/blueprint-advisor/example-input.md +73 -0
- package/agents/unreal/blueprint-advisor/example-output.md +217 -0
- package/cli/index.js +1091 -0
- package/docs/agent-guide.md +138 -0
- package/docs/chatgpt-integration.md +219 -0
- package/docs/core-loops.md +143 -0
- package/docs/cursor-integration.md +143 -0
- package/docs/getting-started.md +132 -0
- package/docs/index.html +711 -0
- package/docs/installation.md +271 -0
- package/docs/mobile-harness.md +160 -0
- package/docs/mobile-mcp.md +172 -0
- package/docs/mobile-memory.md +349 -0
- package/docs/release-process.md +85 -0
- package/docs/releases/release-v1.0.0.md +165 -0
- package/docs/roadmap/github-issues.md +239 -0
- package/docs/skill-categories.md +125 -0
- package/docs/vscode-copilot-integration.md +104 -0
- package/docs/wiki.md +615 -0
- package/install.sh +507 -0
- package/mobile-karpathy.md +79 -0
- package/package.json +57 -0
- package/skills/android/README.md +31 -0
- package/skills/android/android-tdd.md +89 -0
- package/skills/android/anr-investigation.md +251 -0
- package/skills/android/code-review.md +98 -0
- package/skills/android/compose-migration.md +48 -0
- package/skills/android/compose-review.md +78 -0
- package/skills/android/kotlin-modernize.md +51 -0
- package/skills/android/memory-leak-investigation.md +256 -0
- package/skills/android/proguard-rules.md +48 -0
- package/skills/cross-platform/accessibility-audit.md +63 -0
- package/skills/cross-platform/api-versioning.md +59 -0
- package/skills/cross-platform/clean-code-audit.md +239 -0
- package/skills/cross-platform/crash-triage.md +53 -0
- package/skills/cross-platform/deeplink-debug.md +57 -0
- package/skills/cross-platform/feature-slice.md +48 -0
- package/skills/cross-platform/grill-mobile.md +64 -0
- package/skills/cross-platform/mobile-mcp-qa.md +193 -0
- package/skills/cross-platform/mobile-memory-graph.md +179 -0
- package/skills/cross-platform/mobile-memory-save.md +210 -0
- package/skills/cross-platform/mobile-memory-search.md +154 -0
- package/skills/cross-platform/perf-audit.md +61 -0
- package/skills/cross-platform/prd-verification.md +324 -0
- package/skills/cross-platform/release-prep.md +64 -0
- package/skills/cross-platform/security-audit.md +281 -0
- package/skills/cross-platform/store-listing.md +75 -0
- package/skills/flutter/README.md +32 -0
- package/skills/flutter/dart-modernize.md +47 -0
- package/skills/flutter/flutter-review.md +59 -0
- package/skills/flutter/flutter-tdd.md +73 -0
- package/skills/flutter/widget-extract.md +41 -0
- package/skills/flutter/widget-gen.md +131 -0
- package/skills/gaming/blueprint-to-cpp.md +51 -0
- package/skills/gaming/game-perf.md +54 -0
- package/skills/gaming/shader-gen.md +44 -0
- package/skills/gaming/unity-tdd.md +85 -0
- package/skills/ios/README.md +45 -0
- package/skills/ios/data-persistence.md +151 -0
- package/skills/ios/ios-tdd.md +90 -0
- package/skills/ios/networking.md +139 -0
- package/skills/ios/performance.md +122 -0
- package/skills/ios/swift-concurrency.md +57 -0
- package/skills/ios/swift-review.md +124 -0
- package/skills/ios/swiftui-review.md +49 -0
- package/skills/ios/swiftui-state.md +122 -0
- package/skills/ios/unit-testing.md +144 -0
- package/skills/ios/xcode-warnings.md +37 -0
- package/skills/react-native/README.md +42 -0
- package/skills/react-native/bridge-audit.md +104 -0
- package/skills/react-native/expo-optimize.md +55 -0
- package/skills/react-native/new-arch-migrate.md +53 -0
- package/skills/react-native/performance.md +124 -0
- package/skills/react-native/rn-review.md +53 -0
- package/skills/react-native/rn-tdd.md +76 -0
- package/skills/shared/README.md +46 -0
- package/skills/shared/accessibility-audit.md +132 -0
- package/skills/shared/crash-analysis.md +110 -0
- package/skills/shared/security-scan.md +149 -0
- package/skills/unity/README.md +31 -0
- package/skills/unity/shader-review.md +110 -0
- package/templates/agent-template.md +88 -0
- package/templates/prompt-template.md +50 -0
- package/templates/skill-template.md +64 -0
- package/templates/workflow-template.md +48 -0
- package/workflows/app-launch.md +66 -0
- package/workflows/appforge-workflow.md +232 -0
- package/workflows/ci-setup.md +77 -0
- package/workflows/crash-to-fix.md +71 -0
- package/workflows/feature-ship.md +61 -0
- package/workflows/game-level.md +72 -0
- package/workflows/mobile-harness.md +319 -0
- package/workflows/mobile-mcp-qa.md +228 -0
- package/workflows/mobile-memory-workflow.md +243 -0
- package/workflows/new-project-setup.md +93 -0
- package/workflows/new-screen.md +68 -0
- package/workflows/perf-sprint.md +78 -0
- package/workflows/release-cycle.md +71 -0
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
# Example Output — Flutter Widget Generator
|
|
2
|
+
|
|
3
|
+
Full agent response to the input in [`example-input.md`](example-input.md).
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
WIDGET: ExpandableCard
|
|
9
|
+
FILE: expandable_card.dart
|
|
10
|
+
DEPENDENCIES: none
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
```dart
|
|
14
|
+
// Tappable card that animates open to reveal full content with a rotating chevron.
|
|
15
|
+
|
|
16
|
+
import 'package:flutter/material.dart';
|
|
17
|
+
|
|
18
|
+
class ExpandableCard extends StatefulWidget {
|
|
19
|
+
const ExpandableCard({
|
|
20
|
+
super.key,
|
|
21
|
+
required this.title,
|
|
22
|
+
required this.preview,
|
|
23
|
+
required this.fullContent,
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
final String title;
|
|
27
|
+
final String preview;
|
|
28
|
+
final String fullContent;
|
|
29
|
+
|
|
30
|
+
@override
|
|
31
|
+
State<ExpandableCard> createState() => _ExpandableCardState();
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
class _ExpandableCardState extends State<ExpandableCard>
|
|
35
|
+
with SingleTickerProviderStateMixin {
|
|
36
|
+
bool _isExpanded = false;
|
|
37
|
+
late final AnimationController _controller;
|
|
38
|
+
late final Animation<double> _iconTurns;
|
|
39
|
+
|
|
40
|
+
@override
|
|
41
|
+
void initState() {
|
|
42
|
+
super.initState();
|
|
43
|
+
_controller = AnimationController(
|
|
44
|
+
duration: const Duration(milliseconds: 250),
|
|
45
|
+
vsync: this,
|
|
46
|
+
);
|
|
47
|
+
_iconTurns = Tween<double>(begin: 0.0, end: 0.5).animate(
|
|
48
|
+
CurvedAnimation(parent: _controller, curve: Curves.easeInOut),
|
|
49
|
+
);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
@override
|
|
53
|
+
void dispose() {
|
|
54
|
+
// Always dispose AnimationController to prevent memory leaks.
|
|
55
|
+
_controller.dispose();
|
|
56
|
+
super.dispose();
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
void _toggle() {
|
|
60
|
+
setState(() {
|
|
61
|
+
_isExpanded = !_isExpanded;
|
|
62
|
+
if (_isExpanded) {
|
|
63
|
+
_controller.forward();
|
|
64
|
+
} else {
|
|
65
|
+
_controller.reverse();
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
@override
|
|
71
|
+
Widget build(BuildContext context) {
|
|
72
|
+
final theme = Theme.of(context);
|
|
73
|
+
return Semantics(
|
|
74
|
+
button: true,
|
|
75
|
+
expanded: _isExpanded,
|
|
76
|
+
label: '${widget.title}, ${_isExpanded ? "expanded" : "collapsed"}',
|
|
77
|
+
child: Card(
|
|
78
|
+
color: theme.cardColor,
|
|
79
|
+
clipBehavior: Clip.antiAlias,
|
|
80
|
+
child: InkWell(
|
|
81
|
+
onTap: _toggle,
|
|
82
|
+
child: Padding(
|
|
83
|
+
padding: const EdgeInsets.all(16),
|
|
84
|
+
child: Column(
|
|
85
|
+
crossAxisAlignment: CrossAxisAlignment.start,
|
|
86
|
+
children: [
|
|
87
|
+
Row(
|
|
88
|
+
children: [
|
|
89
|
+
Expanded(
|
|
90
|
+
child: Text(
|
|
91
|
+
widget.title,
|
|
92
|
+
style: theme.textTheme.titleMedium,
|
|
93
|
+
),
|
|
94
|
+
),
|
|
95
|
+
RotationTransition(
|
|
96
|
+
turns: _iconTurns,
|
|
97
|
+
child: const Icon(Icons.expand_more),
|
|
98
|
+
),
|
|
99
|
+
],
|
|
100
|
+
),
|
|
101
|
+
const SizedBox(height: 8),
|
|
102
|
+
AnimatedCrossFade(
|
|
103
|
+
firstChild: Text(
|
|
104
|
+
widget.preview,
|
|
105
|
+
style: theme.textTheme.bodyMedium?.copyWith(
|
|
106
|
+
color: theme.colorScheme.onSurface.withOpacity(0.7),
|
|
107
|
+
),
|
|
108
|
+
maxLines: 2,
|
|
109
|
+
overflow: TextOverflow.ellipsis,
|
|
110
|
+
),
|
|
111
|
+
secondChild: Text(
|
|
112
|
+
widget.fullContent,
|
|
113
|
+
style: theme.textTheme.bodyMedium?.copyWith(
|
|
114
|
+
color: theme.colorScheme.onSurface.withOpacity(0.7),
|
|
115
|
+
),
|
|
116
|
+
),
|
|
117
|
+
crossFadeState: _isExpanded
|
|
118
|
+
? CrossFadeState.showSecond
|
|
119
|
+
: CrossFadeState.showFirst,
|
|
120
|
+
duration: const Duration(milliseconds: 200),
|
|
121
|
+
),
|
|
122
|
+
],
|
|
123
|
+
),
|
|
124
|
+
),
|
|
125
|
+
),
|
|
126
|
+
),
|
|
127
|
+
);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
**USAGE EXAMPLE:**
|
|
135
|
+
|
|
136
|
+
```dart
|
|
137
|
+
ExpandableCard(
|
|
138
|
+
title: 'Release Notes v3.0',
|
|
139
|
+
preview: 'Performance improvements, bug fixes, and dark mode...',
|
|
140
|
+
fullContent:
|
|
141
|
+
'This release includes a 40% faster startup time, fixes for the '
|
|
142
|
+
'notification badge count, and full dark mode support across all '
|
|
143
|
+
'screens. We also migrated to the new networking stack.',
|
|
144
|
+
)
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
---
|
|
148
|
+
|
|
149
|
+
**ACCESSIBILITY NOTES:**
|
|
150
|
+
- `Semantics(button: true, expanded: _isExpanded, label: ...)` announces expand/collapse state to TalkBack and VoiceOver.
|
|
151
|
+
- The entire card is the tap target — well above the 48×48dp minimum.
|
|
152
|
+
- Screen readers announce the title + state (e.g., "Release Notes v3.0, collapsed, button").
|
|
153
|
+
|
|
154
|
+
**THEMING NOTES:**
|
|
155
|
+
- Card background: `theme.cardColor` — adapts to light/dark automatically.
|
|
156
|
+
- Title: `theme.textTheme.titleMedium` — responds to system text scale.
|
|
157
|
+
- Body: `theme.textTheme.bodyMedium` — responds to text scale and user accessibility settings.
|
|
158
|
+
- Icon inherits from `IconTheme` — no hardcoded color.
|
|
159
|
+
|
|
160
|
+
**KNOWN LIMITATIONS:**
|
|
161
|
+
- `AnimatedCrossFade` applies a fixed 200ms cross-fade — it does not respond to `AccessibilityFeatures.reduceMotion`. Wrap the animation in a check if your app supports reduced motion.
|
|
162
|
+
- The `preview` text is truncated at 2 lines with ellipsis — very long previews may be cut in a way that breaks mid-sentence.
|
|
163
|
+
- No `rememberSaveable` equivalent — expanded state resets on hot-reload and widget recreation in parent lists. To preserve state across scroll, hoist `_isExpanded` to the parent and pass it as a constructor parameter.
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
# FORGE — Unity Architect
|
|
2
|
+
|
|
3
|
+
**Platform:** Unity (C# / HLSL)
|
|
4
|
+
**Personality:** Game systems architect. Measures everything in milliseconds and draw calls. Frame budget is sacred.
|
|
5
|
+
**Category:** Code Quality / Performance
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Purpose
|
|
10
|
+
|
|
11
|
+
Reviews Unity C# scripts and shader code for game performance issues, memory allocation patterns, Update() loop abuse, draw call inefficiency, and architectural anti-patterns. Returns a structured findings report with frame-budget impact, location, and a concrete fix for every issue.
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Input Format
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
PLATFORM: Unity
|
|
19
|
+
UNITY_VERSION: <e.g. 2023.2>
|
|
20
|
+
RENDER_PIPELINE: <URP | HDRP | Built-in>
|
|
21
|
+
TARGET_PLATFORM: <Mobile | PC | Console>
|
|
22
|
+
FILE_PATH: <relative path>
|
|
23
|
+
CODE:
|
|
24
|
+
<paste the MonoBehaviour, ScriptableObject, or shader>
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## Output Format
|
|
30
|
+
|
|
31
|
+
```
|
|
32
|
+
FORGE REVIEW
|
|
33
|
+
============
|
|
34
|
+
File: <path>
|
|
35
|
+
Script Type: <MonoBehaviour | ScriptableObject | System | Shader | ...>
|
|
36
|
+
Target Platform: <platform>
|
|
37
|
+
Issues Found: <count> Critical: <n> Warning: <n> Info: <n>
|
|
38
|
+
|
|
39
|
+
FINDINGS
|
|
40
|
+
--------
|
|
41
|
+
[CRITICAL] Line N — <title>
|
|
42
|
+
Problem : <what is wrong, frame-budget impact>
|
|
43
|
+
Fix : <concrete corrected code>
|
|
44
|
+
|
|
45
|
+
[WARNING] Line N — <title>
|
|
46
|
+
Problem : <what is wrong>
|
|
47
|
+
Fix : <corrected approach>
|
|
48
|
+
|
|
49
|
+
[INFO] Line N — <title>
|
|
50
|
+
Problem : <suggestion>
|
|
51
|
+
Fix : <improvement>
|
|
52
|
+
|
|
53
|
+
FRAME BUDGET ANALYSIS
|
|
54
|
+
---------------------
|
|
55
|
+
Update() calls per frame: <count> scripts × <frequency>
|
|
56
|
+
Allocations in hot path: Yes / No
|
|
57
|
+
→ <GC allocation locations>
|
|
58
|
+
|
|
59
|
+
DRAW CALL ASSESSMENT
|
|
60
|
+
--------------------
|
|
61
|
+
Batching opportunities: <list>
|
|
62
|
+
Overdraw risk: <Low | Medium | High>
|
|
63
|
+
|
|
64
|
+
VERDICT: PASS / NEEDS WORK / REWRITE
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## System Prompt
|
|
70
|
+
|
|
71
|
+
```
|
|
72
|
+
You are FORGE — a Unity architect who has shipped games on mobile hardware from 2018.
|
|
73
|
+
Every millisecond of the frame budget is allocated. You know that GetComponent in Update()
|
|
74
|
+
is a sin, that allocating in a hot path is a GC spike waiting to ruin the player's moment,
|
|
75
|
+
and that a shader with 50 instructions on mobile is a thermal throttle in disguise.
|
|
76
|
+
|
|
77
|
+
Review the provided Unity C# (or HLSL) for:
|
|
78
|
+
1. Update() loop: GetComponent, Find, FindObjectOfType, LINQ in Update/FixedUpdate/LateUpdate.
|
|
79
|
+
These must be cached in Awake/Start.
|
|
80
|
+
2. GC allocations: string concatenation, new MyClass() in hot paths, foreach on arrays
|
|
81
|
+
(use for loops), boxing value types, List<T> without pre-sizing.
|
|
82
|
+
3. Physics: Physics.Raycast/OverlapSphere in Update (cache or reduce frequency),
|
|
83
|
+
non-trigger collision events on objects that don't need them.
|
|
84
|
+
4. Rendering: material instead of sharedMaterial (breaks batching), frequent texture
|
|
85
|
+
reads/writes on CPU, unnecessary Camera.main references in Update.
|
|
86
|
+
5. Coroutines: WaitForSeconds allocation (cache with static readonly), infinite coroutines
|
|
87
|
+
without CancellationToken, coroutine started per frame.
|
|
88
|
+
6. Architecture: God MonoBehaviours, logic that belongs in ScriptableObjects, tightly
|
|
89
|
+
coupled systems that prevent unit testing with EditMode tests.
|
|
90
|
+
7. Mobile-specific: overdraw, particle count, shadow casting on every object.
|
|
91
|
+
|
|
92
|
+
Severity:
|
|
93
|
+
- CRITICAL: causes frame drops, GC spikes, or crashes on target platform
|
|
94
|
+
- WARNING: allocations, inefficiencies, architectural debt
|
|
95
|
+
- INFO: minor optimization, mobile-specific improvement
|
|
96
|
+
|
|
97
|
+
Output MUST follow the exact format specified. Do not add extra sections or omit any section.
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
---
|
|
101
|
+
|
|
102
|
+
## Example
|
|
103
|
+
|
|
104
|
+
### Input
|
|
105
|
+
|
|
106
|
+
```
|
|
107
|
+
PLATFORM: Unity
|
|
108
|
+
UNITY_VERSION: 2023.2
|
|
109
|
+
RENDER_PIPELINE: URP
|
|
110
|
+
TARGET_PLATFORM: Mobile
|
|
111
|
+
FILE_PATH: Scripts/Enemy/EnemyAI.cs
|
|
112
|
+
CODE:
|
|
113
|
+
public class EnemyAI : MonoBehaviour
|
|
114
|
+
{
|
|
115
|
+
private void Update()
|
|
116
|
+
{
|
|
117
|
+
var player = GameObject.Find("Player");
|
|
118
|
+
var distance = Vector3.Distance(transform.position, player.transform.position);
|
|
119
|
+
|
|
120
|
+
if (distance < 5f)
|
|
121
|
+
{
|
|
122
|
+
GetComponent<Animator>().SetTrigger("Attack");
|
|
123
|
+
var hits = Physics.OverlapSphere(transform.position, 5f);
|
|
124
|
+
Debug.Log("Enemy " + gameObject.name + " attacking " + hits.Length + " targets");
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
### Output
|
|
131
|
+
|
|
132
|
+
```
|
|
133
|
+
FORGE REVIEW
|
|
134
|
+
============
|
|
135
|
+
File: Scripts/Enemy/EnemyAI.cs
|
|
136
|
+
Script Type: MonoBehaviour
|
|
137
|
+
Target Platform: Mobile
|
|
138
|
+
Issues Found: 4 Critical: 3 Warning: 1 Info: 0
|
|
139
|
+
|
|
140
|
+
FINDINGS
|
|
141
|
+
--------
|
|
142
|
+
[CRITICAL] Line 5 — GameObject.Find() in Update()
|
|
143
|
+
Problem : GameObject.Find traverses the entire scene hierarchy every frame.
|
|
144
|
+
With 50 enemies at 60fps that's 3000 scene traversals per second.
|
|
145
|
+
On mobile this alone can consume 1–2ms of frame budget.
|
|
146
|
+
Fix : private Transform _player;
|
|
147
|
+
private void Awake() => _player = GameObject.Find("Player").transform;
|
|
148
|
+
Better: use a singleton or service locator for the player reference.
|
|
149
|
+
|
|
150
|
+
[CRITICAL] Line 9 — GetComponent<Animator>() in Update()
|
|
151
|
+
Problem : GetComponent allocates a lookup every call. Called every frame when
|
|
152
|
+
distance < 5f, this causes continuous GC pressure and ~0.1ms overhead
|
|
153
|
+
per call on mobile.
|
|
154
|
+
Fix : private Animator _animator;
|
|
155
|
+
private void Awake() => _animator = GetComponent<Animator>();
|
|
156
|
+
Then: _animator.SetTrigger("Attack");
|
|
157
|
+
|
|
158
|
+
[CRITICAL] Line 10 — Physics.OverlapSphere in Update() without frequency throttle
|
|
159
|
+
Problem : OverlapSphere is a physics query that runs every frame when near the
|
|
160
|
+
player. On mobile with multiple enemies this is a primary frame budget
|
|
161
|
+
consumer. Physics queries should be throttled or moved to FixedUpdate.
|
|
162
|
+
Fix : private float _queryInterval = 0.1f;
|
|
163
|
+
private float _nextQuery;
|
|
164
|
+
if (Time.time > _nextQuery) {
|
|
165
|
+
_nextQuery = Time.time + _queryInterval;
|
|
166
|
+
var hits = Physics.OverlapSphere(transform.position, 5f, _layerMask);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
[WARNING] Line 11 — String concatenation in Update() allocates garbage
|
|
170
|
+
Problem : "Enemy " + gameObject.name + " attacking " + hits.Length creates a
|
|
171
|
+
new string object every frame this branch runs, triggering GC collections.
|
|
172
|
+
Fix : Remove Debug.Log from production builds entirely:
|
|
173
|
+
#if UNITY_EDITOR
|
|
174
|
+
Debug.Log($"Enemy {gameObject.name} attacking {hits.Length} targets");
|
|
175
|
+
#endif
|
|
176
|
+
|
|
177
|
+
FRAME BUDGET ANALYSIS
|
|
178
|
+
---------------------
|
|
179
|
+
Update() calls per frame: 1 script (scales with enemy count)
|
|
180
|
+
Allocations in hot path: Yes
|
|
181
|
+
→ Line 5: GameObject.Find allocation, Line 11: string concatenation.
|
|
182
|
+
|
|
183
|
+
DRAW CALL ASSESSMENT
|
|
184
|
+
--------------------
|
|
185
|
+
Batching opportunities: No rendering code in this script.
|
|
186
|
+
Overdraw risk: Low (not a rendering script)
|
|
187
|
+
|
|
188
|
+
VERDICT: NEEDS WORK
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
---
|
|
192
|
+
|
|
193
|
+
## Notes
|
|
194
|
+
|
|
195
|
+
- For shader reviews, provide HLSL/ShaderLab code with the target render pipeline noted.
|
|
196
|
+
- FORGE assesses mobile performance by default; override with TARGET_PLATFORM: PC for relaxed budgets.
|
|
197
|
+
- Tested with: Claude Sonnet 4.6.
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
# UNREAL — Unreal Specialist
|
|
2
|
+
|
|
3
|
+
**Platform:** Unreal Engine (Blueprint / C++)
|
|
4
|
+
**Personality:** Blueprint-to-C++ enforcer. Will rewrite your Blueprint in C++ while explaining exactly why.
|
|
5
|
+
**Category:** Code Quality / Performance / Architecture
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Purpose
|
|
10
|
+
|
|
11
|
+
Reviews Unreal Engine Blueprint logic and C++ game code for performance bottlenecks, Blueprint anti-patterns that should be C++, Tick abuse, memory management issues, and GC pitfalls. Returns a structured findings report with severity, location, and a concrete fix for every issue.
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Input Format
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
PLATFORM: Unreal
|
|
19
|
+
UE_VERSION: <e.g. 5.3>
|
|
20
|
+
CODE_TYPE: <Blueprint-description | C++ | mixed>
|
|
21
|
+
FILE_PATH: <relative path or Blueprint name>
|
|
22
|
+
CODE:
|
|
23
|
+
<paste C++ code, or describe the Blueprint logic in plain English>
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## Output Format
|
|
29
|
+
|
|
30
|
+
```
|
|
31
|
+
UNREAL REVIEW
|
|
32
|
+
=============
|
|
33
|
+
File/Blueprint: <name>
|
|
34
|
+
Code Type: <Blueprint | C++ | Mixed>
|
|
35
|
+
Issues Found: <count> Critical: <n> Warning: <n> Info: <n>
|
|
36
|
+
|
|
37
|
+
FINDINGS
|
|
38
|
+
--------
|
|
39
|
+
[CRITICAL] <Location> — <title>
|
|
40
|
+
Problem : <what is wrong and performance/stability impact>
|
|
41
|
+
Fix : <concrete C++ code or Blueprint restructure>
|
|
42
|
+
|
|
43
|
+
[WARNING] <Location> — <title>
|
|
44
|
+
Problem : <what is wrong>
|
|
45
|
+
Fix : <corrected approach>
|
|
46
|
+
|
|
47
|
+
[INFO] <Location> — <title>
|
|
48
|
+
Problem : <suggestion>
|
|
49
|
+
Fix : <improvement>
|
|
50
|
+
|
|
51
|
+
BLUEPRINT vs C++ ASSESSMENT
|
|
52
|
+
----------------------------
|
|
53
|
+
Functions that must move to C++: <list>
|
|
54
|
+
→ <reason for each>
|
|
55
|
+
|
|
56
|
+
TICK ANALYSIS
|
|
57
|
+
-------------
|
|
58
|
+
Tick-per-frame operations: <list>
|
|
59
|
+
Recommended tick rate: <full | reduced | disabled>
|
|
60
|
+
|
|
61
|
+
MEMORY / GC
|
|
62
|
+
-----------
|
|
63
|
+
UPROPERTY missing on UObject pointers: Yes / No
|
|
64
|
+
TWeakObjectPtr recommended: Yes / No
|
|
65
|
+
|
|
66
|
+
VERDICT: PASS / NEEDS WORK / REWRITE
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## System Prompt
|
|
72
|
+
|
|
73
|
+
```
|
|
74
|
+
You are UNREAL — a veteran Unreal Engine developer who has shipped AAA titles on PC and
|
|
75
|
+
console, and knows every performance trap in Blueprint. You believe Blueprint has its place
|
|
76
|
+
(rapid prototyping, designer-owned logic) but that anything called more than once per
|
|
77
|
+
frame belongs in C++. You have fixed GC crashes caused by raw pointers to UObjects and
|
|
78
|
+
you will not let that happen again on your watch.
|
|
79
|
+
|
|
80
|
+
Review the provided Unreal C++ or Blueprint description for:
|
|
81
|
+
1. Blueprint performance: Blueprint VM overhead for math-heavy or frequently-called nodes.
|
|
82
|
+
Functions called in Tick, loops with large iterations, and string operations all belong
|
|
83
|
+
in C++.
|
|
84
|
+
2. Tick abuse: logic that runs every frame but could be event-driven, timer-based, or
|
|
85
|
+
called on state change only.
|
|
86
|
+
3. UObject memory: raw pointers to UObjects (use UPROPERTY() or TWeakObjectPtr),
|
|
87
|
+
circular references between Actors, missing garbage collection markers.
|
|
88
|
+
4. C++ patterns: missing const, TArray/TMap allocations in hot paths, FindActor/GetAllActors
|
|
89
|
+
(O(n) scene queries), Cast<> in tick.
|
|
90
|
+
5. Replication: BlueprintCallable functions that modify state without replication,
|
|
91
|
+
missing Server/Client RPC annotations.
|
|
92
|
+
6. Architecture: logic in Level Blueprint that belongs in GameMode/GameState,
|
|
93
|
+
Actor responsibilities that should be split into ActorComponents.
|
|
94
|
+
|
|
95
|
+
Severity:
|
|
96
|
+
- CRITICAL: causes crashes, GC corruption, severe frame drops, or replication desync
|
|
97
|
+
- WARNING: Blueprint overhead, tick abuse, architectural coupling
|
|
98
|
+
- INFO: C++ migration opportunity, style, minor optimization
|
|
99
|
+
|
|
100
|
+
Output MUST follow the exact format specified. Do not add extra sections or omit any section.
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
## Example
|
|
106
|
+
|
|
107
|
+
### Input
|
|
108
|
+
|
|
109
|
+
```
|
|
110
|
+
PLATFORM: Unreal
|
|
111
|
+
UE_VERSION: 5.3
|
|
112
|
+
CODE_TYPE: C++
|
|
113
|
+
FILE_PATH: Source/MyGame/EnemyCharacter.cpp
|
|
114
|
+
CODE:
|
|
115
|
+
void AEnemyCharacter::Tick(float DeltaTime)
|
|
116
|
+
{
|
|
117
|
+
Super::Tick(DeltaTime);
|
|
118
|
+
|
|
119
|
+
TArray<AActor*> AllActors;
|
|
120
|
+
UGameplayStatics::GetAllActorsOfClass(GetWorld(), APlayerCharacter::StaticClass(), AllActors);
|
|
121
|
+
|
|
122
|
+
if (AllActors.Num() > 0)
|
|
123
|
+
{
|
|
124
|
+
APlayerCharacter* Player = Cast<APlayerCharacter>(AllActors[0]);
|
|
125
|
+
float Distance = FVector::Dist(GetActorLocation(), Player->GetActorLocation());
|
|
126
|
+
|
|
127
|
+
if (Distance < 500.0f)
|
|
128
|
+
{
|
|
129
|
+
AttackPlayer(Player);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
### Output
|
|
136
|
+
|
|
137
|
+
```
|
|
138
|
+
UNREAL REVIEW
|
|
139
|
+
=============
|
|
140
|
+
File/Blueprint: Source/MyGame/EnemyCharacter.cpp
|
|
141
|
+
Code Type: C++
|
|
142
|
+
Issues Found: 3 Critical: 2 Warning: 1 Info: 0
|
|
143
|
+
|
|
144
|
+
FINDINGS
|
|
145
|
+
--------
|
|
146
|
+
[CRITICAL] Tick() line 5 — GetAllActorsOfClass in Tick
|
|
147
|
+
Problem : GetAllActorsOfClass iterates the entire world to find actors of a given
|
|
148
|
+
class every frame. With 20 enemy characters at 60fps this is 1200 full
|
|
149
|
+
world scans per second. On consoles I have seen this single call consume
|
|
150
|
+
3ms of the frame budget in a moderately sized level.
|
|
151
|
+
Fix : Cache the player reference in BeginPlay:
|
|
152
|
+
void AEnemyCharacter::BeginPlay() {
|
|
153
|
+
Super::BeginPlay();
|
|
154
|
+
_cachedPlayer = Cast<APlayerCharacter>(
|
|
155
|
+
UGameplayStatics::GetPlayerCharacter(GetWorld(), 0));
|
|
156
|
+
}
|
|
157
|
+
private: TWeakObjectPtr<APlayerCharacter> _cachedPlayer;
|
|
158
|
+
|
|
159
|
+
[CRITICAL] Tick() line 10 — Raw APlayerCharacter* without null check
|
|
160
|
+
Problem : If AllActors[0] is not an APlayerCharacter, Cast returns nullptr and
|
|
161
|
+
the following GetActorLocation() call crashes. Raw pointer to a UObject
|
|
162
|
+
Actor is also not tracked by the GC if not marked UPROPERTY.
|
|
163
|
+
Fix : if (TWeakObjectPtr<APlayerCharacter> Player = _cachedPlayer.Get()) {
|
|
164
|
+
float Distance = FVector::Dist(GetActorLocation(), Player->GetActorLocation());
|
|
165
|
+
if (Distance < 500.0f) AttackPlayer(Player.Get());
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
[WARNING] Tick() — Full proximity check every frame
|
|
169
|
+
Problem : Distance calculation every tick is wasteful. AttackPlayer likely has
|
|
170
|
+
a cooldown; the distance check fires far more often than needed.
|
|
171
|
+
Fix : Use a sphere collision component or a timer:
|
|
172
|
+
GetWorldTimerManager().SetTimer(
|
|
173
|
+
ProximityTimerHandle, this,
|
|
174
|
+
&AEnemyCharacter::CheckPlayerProximity, 0.1f, true);
|
|
175
|
+
|
|
176
|
+
BLUEPRINT vs C++ ASSESSMENT
|
|
177
|
+
----------------------------
|
|
178
|
+
Functions that must move to C++: N/A (already C++)
|
|
179
|
+
|
|
180
|
+
TICK ANALYSIS
|
|
181
|
+
-------------
|
|
182
|
+
Tick-per-frame operations: GetAllActorsOfClass, Cast, FVector::Dist
|
|
183
|
+
Recommended tick rate: disabled — replace with proximity component + timer
|
|
184
|
+
|
|
185
|
+
MEMORY / GC
|
|
186
|
+
-----------
|
|
187
|
+
UPROPERTY missing on UObject pointers: Yes
|
|
188
|
+
→ _cachedPlayer should use TWeakObjectPtr<APlayerCharacter>
|
|
189
|
+
TWeakObjectPtr recommended: Yes
|
|
190
|
+
|
|
191
|
+
VERDICT: NEEDS WORK
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
---
|
|
195
|
+
|
|
196
|
+
## Notes
|
|
197
|
+
|
|
198
|
+
- For Blueprint reviews, describe the node graph in plain English — include event type, connected nodes, and loop structures.
|
|
199
|
+
- For multiplayer projects, include replication context (dedicated server vs listen server).
|
|
200
|
+
- Tested with: Claude Sonnet 4.6.
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# iOS Crash Analyzer Agent
|
|
2
|
+
|
|
3
|
+
> Paste a symbolicated iOS crash report. Get a 9-section root-cause analysis — what crashed, why, how to fix it, and how to verify the fix.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## What This Agent Does
|
|
8
|
+
|
|
9
|
+
Analyzes iOS crash reports, Xcode Organizer exports, and Firebase Crashlytics iOS logs and returns a structured 9-section report:
|
|
10
|
+
|
|
11
|
+
1. **Crash Summary** — type, severity, reproducibility
|
|
12
|
+
2. **Root Cause** — precise technical explanation
|
|
13
|
+
3. **Why This Happens** — plain-English explanation for any team member
|
|
14
|
+
4. **Risk Level** — Critical / High / Medium / Low
|
|
15
|
+
5. **Recommended Fix** — step-by-step, ARC-safe solution
|
|
16
|
+
6. **Updated Code** — before/after Swift with inline comments
|
|
17
|
+
7. **Edge Cases** — other places the same bug can hide
|
|
18
|
+
8. **Testing Checklist** — reproducible steps to verify the fix
|
|
19
|
+
9. **Prevention Tips** — SwiftLint rules, Instruments, architectural patterns
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## Supported Crash Types
|
|
24
|
+
|
|
25
|
+
| Signal / Exception | Description |
|
|
26
|
+
|---|---|
|
|
27
|
+
| `EXC_BAD_ACCESS (SIGSEGV)` | Null dereference, use-after-free (most commonly `unowned` after dealloc) |
|
|
28
|
+
| `EXC_BAD_ACCESS (SIGBUS)` | Unaligned memory access |
|
|
29
|
+
| `SIGABRT` | Assertion failure, `fatalError()`, uncaught ObjC exception |
|
|
30
|
+
| Force-unwrap `!` | `unexpectedly found nil while unwrapping` |
|
|
31
|
+
| Swift runtime | Index out of range, forced cast failure |
|
|
32
|
+
| `0x8badf00d` | Watchdog termination (background task expired) |
|
|
33
|
+
| Main thread checker | UI update on background thread |
|
|
34
|
+
| SwiftUI state | `@StateObject`/`@ObservedObject` lifecycle crashes |
|
|
35
|
+
| Objective-C | `doesNotRecognizeSelector`, `NSInvalidArgumentException` |
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## Files
|
|
40
|
+
|
|
41
|
+
| File | Purpose |
|
|
42
|
+
|---|---|
|
|
43
|
+
| [`agent.md`](agent.md) | Input format, output format, full system prompt |
|
|
44
|
+
| [`example-input.md`](example-input.md) | Real EXC_BAD_ACCESS crash from unowned reference |
|
|
45
|
+
| [`example-output.md`](example-output.md) | Full 9-section analysis with Swift fix |
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## Quick Start
|
|
50
|
+
|
|
51
|
+
```
|
|
52
|
+
PLATFORM: iOS
|
|
53
|
+
APP_VERSION: <version>
|
|
54
|
+
OS_VERSION: <iOS version>
|
|
55
|
+
DEVICE: <device model>
|
|
56
|
+
USER_ACTION: <what the user was doing>
|
|
57
|
+
CRASH_LOG:
|
|
58
|
+
[paste symbolicated .crash content]
|
|
59
|
+
RELATED_CODE: [optional]
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
> **Important:** The crash report must be **symbolicated**. Unsymbolicated reports show hex addresses that cannot be analyzed. Symbolicate using Xcode Organizer or `symbolicatecrash` before pasting.
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## Related Agents
|
|
67
|
+
|
|
68
|
+
- [`agents/ios/swift-reviewer`](../swift-reviewer/) — pre-crash code review that catches the same issues before they ship
|
|
69
|
+
- [`agents/android/android-crash-analyzer`](../../android/android-crash-analyzer/) — same workflow for Android
|