@leejungkiin/awkit 1.1.6 → 1.1.9
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/README.md +51 -1
- package/bin/awk.js +2 -2
- package/core/GEMINI.md +45 -7
- package/package.json +8 -5
- package/skill-packs/neural-memory/skills/nm-memory-sync/SKILL.md +14 -1
- package/skills/ab-test-store-listing/SKILL.md +220 -0
- package/skills/android-aso/SKILL.md +197 -0
- package/skills/app-analytics/SKILL.md +210 -0
- package/skills/app-clips/SKILL.md +163 -0
- package/skills/app-icon-optimization/SKILL.md +170 -0
- package/skills/app-launch/SKILL.md +153 -0
- package/skills/app-marketing-context/SKILL.md +129 -0
- package/skills/app-store-featured/SKILL.md +213 -0
- package/skills/apple-search-ads/SKILL.md +205 -0
- package/skills/asc-metrics/SKILL.md +157 -0
- package/skills/aso-audit/SKILL.md +179 -0
- package/skills/competitor-analysis/SKILL.md +163 -0
- package/skills/competitor-tracking/SKILL.md +185 -0
- package/skills/crash-analytics/SKILL.md +181 -0
- package/skills/gitnexus-intelligence/SKILL.md +224 -0
- package/skills/in-app-events/SKILL.md +176 -0
- package/skills/keyword-research/SKILL.md +141 -0
- package/skills/localization/SKILL.md +165 -0
- package/skills/market-movers/SKILL.md +137 -0
- package/skills/market-pulse/SKILL.md +170 -0
- package/skills/metadata-optimization/SKILL.md +170 -0
- package/skills/monetization-strategy/SKILL.md +175 -0
- package/skills/onboarding-optimization/SKILL.md +194 -0
- package/skills/orchestrator/SKILL.md +306 -25
- package/skills/press-and-pr/SKILL.md +204 -0
- package/skills/rating-prompt-strategy/SKILL.md +184 -0
- package/skills/retention-optimization/SKILL.md +165 -0
- package/skills/review-management/SKILL.md +154 -0
- package/skills/screenshot-optimization/SKILL.md +167 -0
- package/skills/seasonal-aso/SKILL.md +141 -0
- package/skills/spec-gate/SKILL.md +312 -0
- package/skills/subscription-lifecycle/SKILL.md +206 -0
- package/skills/swiftui-pro/references/design.md +44 -0
- package/skills/symphony-enforcer/SKILL.md +92 -11
- package/skills/symphony-orchestrator/SKILL.md +9 -7
- package/skills/systematic-debugging/SKILL.md +32 -7
- package/skills/ua-campaign/SKILL.md +207 -0
- package/skills/verification-gate/SKILL.md +23 -2
- package/workflows/gitnexus.md +123 -0
- package/symphony/LICENSE +0 -21
- package/symphony/README.md +0 -178
- package/symphony/app/api/agents/route.js +0 -152
- package/symphony/app/api/events/route.js +0 -22
- package/symphony/app/api/knowledge/route.js +0 -253
- package/symphony/app/api/locks/route.js +0 -29
- package/symphony/app/api/notes/route.js +0 -125
- package/symphony/app/api/preflight/route.js +0 -23
- package/symphony/app/api/projects/route.js +0 -116
- package/symphony/app/api/roles/route.js +0 -134
- package/symphony/app/api/skills/route.js +0 -82
- package/symphony/app/api/status/route.js +0 -18
- package/symphony/app/api/tasks/route.js +0 -157
- package/symphony/app/api/workflows/route.js +0 -61
- package/symphony/app/api/workspaces/route.js +0 -15
- package/symphony/app/globals.css +0 -2605
- package/symphony/app/layout.js +0 -20
- package/symphony/app/page.js +0 -2122
- package/symphony/cli/index.js +0 -1060
- package/symphony/core/agent-manager.js +0 -357
- package/symphony/core/context-bus.js +0 -100
- package/symphony/core/db.js +0 -223
- package/symphony/core/file-lock-manager.js +0 -154
- package/symphony/core/merge-pipeline.js +0 -234
- package/symphony/core/orchestrator.js +0 -236
- package/symphony/core/task-manager.js +0 -335
- package/symphony/core/workspace-manager.js +0 -168
- package/symphony/jsconfig.json +0 -7
- package/symphony/lib/core.mjs +0 -1034
- package/symphony/mcp/index.js +0 -29
- package/symphony/mcp/server.js +0 -110
- package/symphony/mcp/tools/context.js +0 -80
- package/symphony/mcp/tools/locks.js +0 -99
- package/symphony/mcp/tools/status.js +0 -82
- package/symphony/mcp/tools/tasks.js +0 -216
- package/symphony/mcp/tools/workspace.js +0 -143
- package/symphony/next.config.mjs +0 -7
- package/symphony/package.json +0 -53
- package/symphony/scripts/postinstall.js +0 -49
- package/symphony/symphony.config.js +0 -41
|
@@ -29,3 +29,47 @@ Prefer to place standard fonts, sizes, colors, stack spacing, padding, rounding,
|
|
|
29
29
|
- Avoid hard-coded values for padding and stack spacing unless specifically requested.
|
|
30
30
|
- Avoid UIKit colors (`UIColor`) in SwiftUI code; use SwiftUI `Color` or asset catalog colors.
|
|
31
31
|
- The font size `.caption2` is extremely small, and is generally best avoided. Even the font size `.caption` is on the small side, and should be used carefully.
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
## Dark Mode Color Safety Rules
|
|
35
|
+
|
|
36
|
+
These rules prevent common dark mode bugs that are invisible in light mode development.
|
|
37
|
+
|
|
38
|
+
### 1. Never use hardcoded `Color.white` or `Color.black` for backgrounds or fills
|
|
39
|
+
- **Bad**: `.fill(Color.white)`, `.background(Color.black)`
|
|
40
|
+
- **Good**: `.fill(ColorPalette.darkCard)`, `.background(ColorPalette.backgroundPrimary)`
|
|
41
|
+
- **Exception**: White/black on a NON-adaptive surface (e.g., white icon on a camera viewfinder that is always dark, or text on a green gradient button where the gradient is the same in both modes).
|
|
42
|
+
|
|
43
|
+
### 2. Never pair `.foregroundColor(.white)` with an adaptive fill
|
|
44
|
+
- If a button uses an adaptive fill like `ColorPalette.textPrimary` (which flips between dark/light), the text MUST also use an adaptive color that provides contrast in BOTH modes.
|
|
45
|
+
- **Bad**: `.fill(ColorPalette.textPrimary)` + `.foregroundColor(.white)` — in dark mode, textPrimary ≈ #EDEDED and .white = #FFFFFF → invisible text!
|
|
46
|
+
- **Good**: `.fill(ColorPalette.textPrimary)` + `.foregroundColor(ColorPalette.backgroundPrimary)` — backgroundPrimary is always the opposite of textPrimary.
|
|
47
|
+
- **Rule of thumb**: If fill is adaptive, text color MUST be its inverse adaptive token.
|
|
48
|
+
|
|
49
|
+
### 3. Static background images (PNG/JPG) don't adapt to dark mode
|
|
50
|
+
- Background images with light themes (e.g., food illustrations on white/cream) will always render light, breaking dark mode.
|
|
51
|
+
- **Fix options**:
|
|
52
|
+
- Provide dark variants in the Asset catalog and use `@Environment(\.colorScheme)` to switch.
|
|
53
|
+
- Reduce opacity in dark mode: `.opacity(colorScheme == .dark ? 0.08 : 1.0)`.
|
|
54
|
+
- Apply a dark overlay or color multiply blend.
|
|
55
|
+
- **Exception**: Screenshot/mockup images displayed inside a dark phone frame (the frame provides context).
|
|
56
|
+
|
|
57
|
+
### 4. Always verify contrast between text and its immediate background
|
|
58
|
+
- When reading code, mentally resolve what every color token becomes in BOTH modes.
|
|
59
|
+
- Common trap: Card background = `#272727` (dark gray in dark mode), button fill = `#EDEDED` (light in dark mode), text on button = `.white` → barely visible.
|
|
60
|
+
- **Paired tokens for high contrast**:
|
|
61
|
+
- Fill: `textPrimary` ↔ Text: `backgroundPrimary`
|
|
62
|
+
- Fill: `darkCard` ↔ Text: `textPrimary`
|
|
63
|
+
- Fill: `primaryGreen` ↔ Text: `.white` (green is always green)
|
|
64
|
+
|
|
65
|
+
### 5. Shadow colors must be adaptive
|
|
66
|
+
- **Bad**: `.shadow(color: Color.black.opacity(0.1), ...)`
|
|
67
|
+
- **Good**: `.shadow(color: ColorPalette.shadowLight, ...)` or `.shadow(color: ColorPalette.textPrimary.opacity(0.08), ...)`
|
|
68
|
+
- In dark mode, black shadows on dark backgrounds are invisible; use lighter shadow tokens or skip shadows entirely.
|
|
69
|
+
|
|
70
|
+
### 6. Quick dark mode audit checklist
|
|
71
|
+
When writing or reviewing any SwiftUI view:
|
|
72
|
+
1. `grep -n 'Color\.white\|Color\.black\|\.white\b' FileName.swift` — find all hardcoded colors.
|
|
73
|
+
2. For each hit, ask: "Does this element sit on an adaptive background?" If yes → replace with adaptive token.
|
|
74
|
+
3. Check all `Image("asset_name")` — are any light-themed images used as backgrounds? If yes → add dark mode handling.
|
|
75
|
+
4. For every button: verify fill color + text color provide 4.5:1 contrast ratio in BOTH modes.
|
|
@@ -4,10 +4,10 @@ description: |
|
|
|
4
4
|
Mandatory Symphony checkpoint system. Ensures AI never forgets to create,
|
|
5
5
|
update, or complete tasks in Symphony. Enforces progress reporting at every
|
|
6
6
|
milestone and auto-detects task completion without waiting for user confirmation.
|
|
7
|
-
v3.
|
|
7
|
+
v3.3: Completion Status Protocol, Search-Before-Building, Boil-the-Lake.
|
|
8
8
|
metadata:
|
|
9
9
|
stage: core
|
|
10
|
-
version: "3.
|
|
10
|
+
version: "3.3"
|
|
11
11
|
replaces: "v2.0"
|
|
12
12
|
requires: symphony-orchestrator
|
|
13
13
|
tags: [symphony, enforcement, checkpoint, task-lifecycle, core, spec-first, auto-next]
|
|
@@ -24,14 +24,16 @@ invocation-type: auto
|
|
|
24
24
|
priority: 1
|
|
25
25
|
---
|
|
26
26
|
|
|
27
|
-
# Symphony Enforcer v3.
|
|
27
|
+
# Symphony Enforcer v3.3 — Completion Status Protocol + Gstack Principles
|
|
28
28
|
|
|
29
29
|
> **Purpose:** Đảm bảo AI KHÔNG BAO GIỜ quên cập nhật Symphony.
|
|
30
|
-
> **Key Changes v3.
|
|
30
|
+
> **Key Changes v3.3:**
|
|
31
|
+
> - **Completion Status Protocol**: 4-status (DONE/DONE_WITH_CONCERNS/BLOCKED/NEEDS_CONTEXT)
|
|
32
|
+
> - **Design Compliance (TP1.5)**: Đối chiếu schema changes vs approved design doc
|
|
31
33
|
> - **Pre-Plan Gate**: Đọc spec trước khi plan, hỏi user về constraints
|
|
32
34
|
> - **Auto-Lifecycle**: Liên kết task_boundary ↔ Symphony tự động
|
|
33
35
|
> - **Auto-Next**: BẮT BUỘC gợi ý next steps sau mỗi task done
|
|
34
|
-
> - **Atomic Git Commits**: Tự động commit sau mỗi task done
|
|
36
|
+
> - **Atomic Git Commits**: Tự động commit sau mỗi task done
|
|
35
37
|
> **Principle:** AI tự detect completion — user KHÔNG CẦN nói "xong".
|
|
36
38
|
|
|
37
39
|
---
|
|
@@ -168,7 +170,48 @@ symphony_report_progress(
|
|
|
168
170
|
|
|
169
171
|
---
|
|
170
172
|
|
|
171
|
-
###
|
|
173
|
+
### TP1.5: Design Compliance Check (NEW v3.2 — Gate 4 Enforcement)
|
|
174
|
+
|
|
175
|
+
**Khi nào:** Mỗi khi AI sửa file liên quan đến DB/Model/Schema trong EXECUTION mode.
|
|
176
|
+
|
|
177
|
+
**Trigger signals:**
|
|
178
|
+
```
|
|
179
|
+
File patterns:
|
|
180
|
+
- **/models/**, **/entities/**, **/schemas/**
|
|
181
|
+
- **Migration*, **Schema*, **Model*
|
|
182
|
+
- *.entity.*, *.model.*, *.schema.*
|
|
183
|
+
- Database.swift, AppDatabase.swift, schema.prisma, etc.
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
**Action:**
|
|
187
|
+
```
|
|
188
|
+
1. Kiểm tra: docs/architecture/<feature>_design.md tồn tại?
|
|
189
|
+
→ KHÔNG → ⚠️ Warning: "Đang sửa model file nhưng chưa có approved design.
|
|
190
|
+
Recommend chạy spec-gate trước."
|
|
191
|
+
→ Nếu COMPLEX task → ⛔ DỪNG, enforce Gate 2
|
|
192
|
+
→ Nếu TRIVIAL/MODERATE → Warning only, tiếp tục
|
|
193
|
+
|
|
194
|
+
2. Đối chiếu thay đổi vs approved design:
|
|
195
|
+
→ Thêm field KHÔNG có trong design? → ⛔ DỪNG
|
|
196
|
+
→ Đổi type khác design? → ⛔ DỪNG
|
|
197
|
+
→ Xóa field trong design? → ⛔ DỪNG
|
|
198
|
+
→ Thêm field CÓ trong design? → ✅ OK
|
|
199
|
+
|
|
200
|
+
3. Khi DỪNG:
|
|
201
|
+
→ Thông báo: "Schema change ngoài approved design detected.
|
|
202
|
+
[field_name] không có trong docs/architecture/<feature>_design.md.
|
|
203
|
+
Quay lại Gate 2 để update design trước nhé."
|
|
204
|
+
→ Kích hoạt spec-gate skill để update design doc
|
|
205
|
+
→ Sau khi re-approve → tiếp tục code
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
**Enforcement:**
|
|
209
|
+
- ❌ KHÔNG tự ý thêm cột/bảng ngoài approved design cho COMPLEX tasks
|
|
210
|
+
- ✅ NÊN ghi lại mọi deviation attempt vào NeuralMemory cho future reference
|
|
211
|
+
|
|
212
|
+
---
|
|
213
|
+
|
|
214
|
+
### TP2: Task Complete — Completion Status Protocol
|
|
172
215
|
|
|
173
216
|
**Khi nào:** AI detect ≥2/4 completion signals:
|
|
174
217
|
|
|
@@ -179,7 +222,44 @@ Signal 3: Tất cả checklist items trong task.md đã [x]
|
|
|
179
222
|
Signal 4: Verification pass (tests OK, build OK)
|
|
180
223
|
```
|
|
181
224
|
|
|
182
|
-
**
|
|
225
|
+
**Completion Status Protocol (4 statuses):**
|
|
226
|
+
|
|
227
|
+
```
|
|
228
|
+
DONE:
|
|
229
|
+
Điều kiện: Verification pass, không caveats.
|
|
230
|
+
Action: symphony_complete_task với evidence.
|
|
231
|
+
Format: "✅ DONE — {summary}. Build: ✅. Tests: ✅ N/N."
|
|
232
|
+
|
|
233
|
+
DONE_WITH_CONCERNS:
|
|
234
|
+
Điều kiện: Code hoạt động nhưng có caveats/risks cần biết.
|
|
235
|
+
Action: Complete task NHƯNG ghi rõ concerns.
|
|
236
|
+
Format: "⚠️ DONE_WITH_CONCERNS — {summary}.
|
|
237
|
+
Concerns: [list cụ thể]
|
|
238
|
+
Risk: [mức độ ảnh hưởng]
|
|
239
|
+
Recommendation: [đề xuất xử lý]"
|
|
240
|
+
Ví dụ: "Feature works nhưng chưa handle offline mode."
|
|
241
|
+
Ví dụ: "API call thành công nhưng chưa có retry logic."
|
|
242
|
+
|
|
243
|
+
BLOCKED:
|
|
244
|
+
Điều kiện: Không thể tiếp tục vì external dependency/blocker.
|
|
245
|
+
Action: KHÔNG complete task. Report + list attempts.
|
|
246
|
+
Format: "🚫 BLOCKED — {reason}.
|
|
247
|
+
Attempted: [list things đã thử]
|
|
248
|
+
Needs: [what's needed to unblock]"
|
|
249
|
+
Ví dụ: "API endpoint return 500, đã retry 3 lần."
|
|
250
|
+
|
|
251
|
+
NEEDS_CONTEXT:
|
|
252
|
+
Điều kiện: Thiếu thông tin từ user để tiếp tục.
|
|
253
|
+
Action: KHÔNG complete task. Hỏi user cụ thể.
|
|
254
|
+
Format: "❓ NEEDS_CONTEXT — {what's missing}.
|
|
255
|
+
Question: [câu hỏi cụ thể]
|
|
256
|
+
Options: [list options nếu có]"
|
|
257
|
+
Ví dụ: "Cần user clarify: offline-first hay online-only?"
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
⛔ **KHÔNG BAO GIỜ report DONE nếu thực tế là DONE_WITH_CONCERNS hoặc BLOCKED.**
|
|
261
|
+
|
|
262
|
+
**Action (cho DONE status):**
|
|
183
263
|
```
|
|
184
264
|
0. ⚡ VERIFICATION GATE (BẮT BUỘC — Iron Law):
|
|
185
265
|
- IDENTIFY: What command proves this task is done?
|
|
@@ -192,11 +272,12 @@ Signal 4: Verification pass (tests OK, build OK)
|
|
|
192
272
|
|
|
193
273
|
1. symphony_complete_task(
|
|
194
274
|
task_id=current_task,
|
|
195
|
-
summary="mô tả ngắn + VERIFICATION EVIDENCE"
|
|
196
|
-
// ✅ "Implemented X. Build: ✅ exit 0. Tests: ✅ 47/47.
|
|
197
|
-
//
|
|
275
|
+
summary="mô tả ngắn + STATUS + VERIFICATION EVIDENCE"
|
|
276
|
+
// ✅ "DONE — Implemented X. Build: ✅ exit 0. Tests: ✅ 47/47."
|
|
277
|
+
// ✅ "DONE_WITH_CONCERNS — Implemented X. Build: ✅. Concerns: no offline support."
|
|
278
|
+
// ❌ "Implemented X" (không status, không evidence)
|
|
198
279
|
)
|
|
199
|
-
2. Hiển thị: "✅ SYM #sym-XYZ —
|
|
280
|
+
2. Hiển thị: "✅ SYM #sym-XYZ — {STATUS}"
|
|
200
281
|
3. → TRIGGER TP2.5 (Atomic Git Commit)
|
|
201
282
|
4. → TRIGGER TP4 (Auto-Next) NGAY LẬP TỨC
|
|
202
283
|
```
|
|
@@ -8,7 +8,7 @@ metadata:
|
|
|
8
8
|
stage: core
|
|
9
9
|
version: "3.0"
|
|
10
10
|
replaces: null
|
|
11
|
-
requires: awkit-symphony (npm i -g awkit-symphony)
|
|
11
|
+
requires: "@leejungkiin/awkit-symphony" (npm i -g @leejungkiin/awkit-symphony)
|
|
12
12
|
tags: [symphony, setup, server, orchestration, core, preflight, multi-project, agent]
|
|
13
13
|
agent: Symphony Conductor
|
|
14
14
|
allowed-tools:
|
|
@@ -50,13 +50,12 @@ QUAN TRỌNG:
|
|
|
50
50
|
### Bước 1: Install Global
|
|
51
51
|
|
|
52
52
|
```bash
|
|
53
|
-
|
|
54
|
-
npm link
|
|
53
|
+
npm i -g @leejungkiin/awkit-symphony
|
|
55
54
|
```
|
|
56
55
|
|
|
57
|
-
>
|
|
56
|
+
> Dev mode (từ source):
|
|
58
57
|
> ```bash
|
|
59
|
-
>
|
|
58
|
+
> cd ~/Dev/NodeJS/main-awf/symphony && npm link
|
|
60
59
|
> ```
|
|
61
60
|
|
|
62
61
|
### Bước 2: Verify
|
|
@@ -127,9 +126,12 @@ symphony preflight --json # JSON cho AI parsing
|
|
|
127
126
|
→ symphony start -p 3100 &
|
|
128
127
|
→ Đợi 3-5 giây
|
|
129
128
|
→ Retry preflight
|
|
130
|
-
3. Nếu vẫn FAIL:
|
|
129
|
+
3. Nếu vẫn FAIL (command not found):
|
|
130
|
+
→ AI tự chạy: npm i -g @leejungkiin/awkit-symphony
|
|
131
|
+
→ Retry symphony start
|
|
132
|
+
4. Nếu vẫn FAIL:
|
|
131
133
|
→ "⚠️ Symphony không khởi động được"
|
|
132
|
-
→ Hướng dẫn
|
|
134
|
+
→ Hướng dẫn user cài thủ công
|
|
133
135
|
```
|
|
134
136
|
|
|
135
137
|
---
|
|
@@ -98,26 +98,51 @@ You MUST complete each phase before proceeding to the next.
|
|
|
98
98
|
2. **Implement Single Fix** — ONE change at a time. No "while I'm here" improvements
|
|
99
99
|
3. **Verify Fix** — Test passes? No other tests broken? Issue actually resolved?
|
|
100
100
|
|
|
101
|
-
## The 3-
|
|
101
|
+
## The 3-Strike Escalation Protocol
|
|
102
102
|
|
|
103
103
|
```
|
|
104
|
-
If 3+ fixes have FAILED → STOP
|
|
104
|
+
If 3+ fixes have FAILED → STOP. ESCALATE. NO EXCEPTIONS.
|
|
105
105
|
|
|
106
106
|
This is NOT a failed hypothesis.
|
|
107
107
|
This is a WRONG ARCHITECTURE.
|
|
108
108
|
```
|
|
109
109
|
|
|
110
|
-
**
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
110
|
+
**Escalation Protocol (BẮT BUỘC sau 3 failed attempts):**
|
|
111
|
+
|
|
112
|
+
```
|
|
113
|
+
1. STOP — Không thử fix thứ 4.
|
|
114
|
+
2. REPORT full context cho user:
|
|
115
|
+
🚫 ESCALATION — 3 fix attempts failed
|
|
116
|
+
─────────────────────────────────────
|
|
117
|
+
Attempt 1: {what tried} → {why failed}
|
|
118
|
+
Attempt 2: {what tried} → {why failed}
|
|
119
|
+
Attempt 3: {what tried} → {why failed}
|
|
120
|
+
|
|
121
|
+
Root Cause Hypothesis: {current best guess}
|
|
122
|
+
Architectural Concern: {pattern detected}
|
|
123
|
+
|
|
124
|
+
Recommended: [refactor approach | seek expert | alternative solution]
|
|
125
|
+
─────────────────────────────────────
|
|
126
|
+
3. WAIT for user decision — do NOT proceed autonomously.
|
|
127
|
+
```
|
|
115
128
|
|
|
116
129
|
**Pattern indicating architectural problem:**
|
|
117
130
|
- Each fix reveals new shared state/coupling
|
|
118
131
|
- Fixes require "massive refactoring" to implement
|
|
119
132
|
- Each fix creates new symptoms elsewhere
|
|
120
133
|
|
|
134
|
+
## Scope Freeze During Debug
|
|
135
|
+
|
|
136
|
+
```
|
|
137
|
+
Khi đang debug một issue:
|
|
138
|
+
- KHÔNG sửa bug khác "tiện tay"
|
|
139
|
+
- KHÔNG refactor code xung quanh
|
|
140
|
+
- KHÔNG thêm feature "nhân tiện"
|
|
141
|
+
- CHỈ tập trung vào root cause hiện tại
|
|
142
|
+
|
|
143
|
+
Violation → revert side changes, focus on current scope
|
|
144
|
+
```
|
|
145
|
+
|
|
121
146
|
## Red Flags — STOP and Return to Phase 1
|
|
122
147
|
|
|
123
148
|
If you catch yourself thinking:
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ua-campaign
|
|
3
|
+
description: When the user wants to plan or optimize paid user acquisition campaigns. Also use when the user mentions "Apple Search Ads", "user acquisition", "paid ads", "UA", "ad campaign", "install campaign", "Facebook ads for apps", "TikTok ads", or "cost per install". For organic growth, see aso-audit. For launch-specific UA, see app-launch.
|
|
4
|
+
metadata:
|
|
5
|
+
version: 1.0.0
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# User Acquisition Campaigns
|
|
9
|
+
|
|
10
|
+
You are an expert in mobile app user acquisition across all major ad platforms. Your goal is to help the user plan, launch, and optimize paid campaigns that drive profitable installs.
|
|
11
|
+
|
|
12
|
+
## Initial Assessment
|
|
13
|
+
|
|
14
|
+
1. Check for `app-marketing-context.md` — read it for context
|
|
15
|
+
2. Ask for **monthly UA budget** (this determines channel strategy)
|
|
16
|
+
3. Ask for **target CPI** (cost per install) or **target ROAS**
|
|
17
|
+
4. Ask for **current LTV** (lifetime value per user)
|
|
18
|
+
5. Ask for **target audience** (demographics, interests, behaviors)
|
|
19
|
+
6. Ask for **target countries**
|
|
20
|
+
7. Ask for **app category** (affects channel selection)
|
|
21
|
+
|
|
22
|
+
## Channel Selection
|
|
23
|
+
|
|
24
|
+
### Budget-Based Recommendations
|
|
25
|
+
|
|
26
|
+
| Monthly Budget | Recommended Channels |
|
|
27
|
+
|---------------|---------------------|
|
|
28
|
+
| < $1K | Apple Search Ads (Basic) only |
|
|
29
|
+
| $1K-$5K | Apple Search Ads (Advanced) + 1 social channel |
|
|
30
|
+
| $5K-$20K | ASA + Meta + Google UAC |
|
|
31
|
+
| $20K-$100K | ASA + Meta + Google + TikTok + testing new channels |
|
|
32
|
+
| $100K+ | All channels + programmatic + influencer |
|
|
33
|
+
|
|
34
|
+
### Channel Comparison
|
|
35
|
+
|
|
36
|
+
| Channel | Avg CPI | Intent | Best For | Complexity |
|
|
37
|
+
|---------|---------|--------|----------|------------|
|
|
38
|
+
| **Apple Search Ads** | $1-3 | Very High | All iOS apps | Low |
|
|
39
|
+
| **Google UAC** | $0.5-2 | Medium | Android + broad reach | Medium |
|
|
40
|
+
| **Meta (FB/IG)** | $1-4 | Low-Medium | Consumer, social, e-commerce | High |
|
|
41
|
+
| **TikTok** | $0.5-3 | Low | Young demographics, games | Medium |
|
|
42
|
+
| **Snapchat** | $0.5-2 | Low | Gen Z, AR apps | Medium |
|
|
43
|
+
| **Twitter/X** | $2-5 | Low | News, tech, finance | Medium |
|
|
44
|
+
| **Reddit** | $1-3 | Medium | Niche communities | Low |
|
|
45
|
+
|
|
46
|
+
## Apple Search Ads (Priority Channel)
|
|
47
|
+
|
|
48
|
+
### Why Start Here
|
|
49
|
+
- Highest intent (user is actively searching)
|
|
50
|
+
- Best conversion rates (30-50% tap-to-install)
|
|
51
|
+
- Direct App Store integration
|
|
52
|
+
- Works for any budget
|
|
53
|
+
|
|
54
|
+
### Campaign Structure
|
|
55
|
+
|
|
56
|
+
```
|
|
57
|
+
Account
|
|
58
|
+
├── Brand Campaign (exact match)
|
|
59
|
+
│ ├── [your app name]
|
|
60
|
+
│ └── [common misspellings]
|
|
61
|
+
├── Category Campaign (broad + exact)
|
|
62
|
+
│ ├── [category terms]
|
|
63
|
+
│ └── [feature terms]
|
|
64
|
+
├── Competitor Campaign (exact match)
|
|
65
|
+
│ ├── [competitor name 1]
|
|
66
|
+
│ └── [competitor name 2]
|
|
67
|
+
└── Discovery Campaign (Search Match)
|
|
68
|
+
└── Auto-targeting (find new keywords)
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### Bidding Strategy
|
|
72
|
+
|
|
73
|
+
| Campaign Type | Bid Strategy | Target CPA |
|
|
74
|
+
|--------------|-------------|------------|
|
|
75
|
+
| Brand | Low bids, high volume | < $0.50 |
|
|
76
|
+
| Category | Medium bids | $1-3 |
|
|
77
|
+
| Competitor | Higher bids, lower volume | $2-5 |
|
|
78
|
+
| Discovery | Low bids, broad | $1-3 |
|
|
79
|
+
|
|
80
|
+
### Optimization Checklist
|
|
81
|
+
|
|
82
|
+
- [ ] Add negative keywords from Discovery to prevent waste
|
|
83
|
+
- [ ] Move winning Discovery keywords to exact match campaigns
|
|
84
|
+
- [ ] Pause keywords with CPA > 2x target
|
|
85
|
+
- [ ] Increase bids on keywords with CPA < target
|
|
86
|
+
- [ ] Test Custom Product Pages for different keyword intents
|
|
87
|
+
- [ ] Review Search Match terms weekly
|
|
88
|
+
- [ ] Adjust bids by day of week and time
|
|
89
|
+
|
|
90
|
+
## Meta (Facebook/Instagram) Campaigns
|
|
91
|
+
|
|
92
|
+
### Campaign Structure
|
|
93
|
+
|
|
94
|
+
```
|
|
95
|
+
Campaign: App Installs
|
|
96
|
+
├── Ad Set 1: Lookalike (1%) of paying users
|
|
97
|
+
│ ├── Ad: Video (15s feature demo)
|
|
98
|
+
│ ├── Ad: Carousel (feature highlights)
|
|
99
|
+
│ └── Ad: Static (benefit headline)
|
|
100
|
+
├── Ad Set 2: Interest-based targeting
|
|
101
|
+
│ ├── Ad: Video (problem/solution)
|
|
102
|
+
│ └── Ad: UGC-style testimonial
|
|
103
|
+
└── Ad Set 3: Broad targeting (let Meta optimize)
|
|
104
|
+
├── Ad: Best performing from above
|
|
105
|
+
└── Ad: New creative test
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### Creative Best Practices
|
|
109
|
+
|
|
110
|
+
**Video ads (highest performance):**
|
|
111
|
+
- Hook in first 3 seconds
|
|
112
|
+
- Show the app in action
|
|
113
|
+
- 15-30 seconds optimal
|
|
114
|
+
- Works without sound (captions)
|
|
115
|
+
- End with clear CTA and App Store badge
|
|
116
|
+
|
|
117
|
+
**Static ads:**
|
|
118
|
+
- Bold headline with key benefit
|
|
119
|
+
- App screenshot or mockup
|
|
120
|
+
- Social proof (rating, user count)
|
|
121
|
+
- Clear "Download Free" CTA
|
|
122
|
+
|
|
123
|
+
### Audience Strategy
|
|
124
|
+
|
|
125
|
+
1. **Seed:** Upload paying user emails → create Lookalike
|
|
126
|
+
2. **Expand:** Lookalike 1% → 3% → 5% as you scale
|
|
127
|
+
3. **Layer:** Interest targeting for specific segments
|
|
128
|
+
4. **Broad:** Let Meta's algorithm find users (works at scale)
|
|
129
|
+
|
|
130
|
+
## Google UAC (Universal App Campaigns)
|
|
131
|
+
|
|
132
|
+
### Setup
|
|
133
|
+
- Provide 4 text ideas, 20 images, 5 videos
|
|
134
|
+
- Set target CPI or target CPA
|
|
135
|
+
- Google automatically creates and tests ad combinations
|
|
136
|
+
- Runs across Search, Display, YouTube, and Play Store
|
|
137
|
+
|
|
138
|
+
### Optimization
|
|
139
|
+
- Focus on creative quality (Google does the targeting)
|
|
140
|
+
- Test different value propositions in text
|
|
141
|
+
- Provide diverse creative assets
|
|
142
|
+
- Set realistic CPA targets (start high, lower gradually)
|
|
143
|
+
|
|
144
|
+
## Key Metrics & Optimization
|
|
145
|
+
|
|
146
|
+
### Funnel Metrics
|
|
147
|
+
|
|
148
|
+
```
|
|
149
|
+
Impressions → Taps → Installs → Activations → Purchases
|
|
150
|
+
CTR CVR CPI CPA ROAS
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
| Metric | Formula | Target |
|
|
154
|
+
|--------|---------|--------|
|
|
155
|
+
| CTR | Taps / Impressions | > 5% (ASA), > 1% (social) |
|
|
156
|
+
| CVR | Installs / Taps | > 30% (ASA), > 10% (social) |
|
|
157
|
+
| CPI | Spend / Installs | < LTV / 3 |
|
|
158
|
+
| CPA | Spend / Purchases | < LTV |
|
|
159
|
+
| ROAS | Revenue / Spend | > 1.0 (break even), > 2.0 (good) |
|
|
160
|
+
| D7 ROAS | Day 7 Revenue / Spend | Predict long-term ROAS |
|
|
161
|
+
|
|
162
|
+
### Optimization Cadence
|
|
163
|
+
|
|
164
|
+
| Frequency | Action |
|
|
165
|
+
|-----------|--------|
|
|
166
|
+
| Daily | Check spend pacing, pause overspending |
|
|
167
|
+
| Weekly | Review CPI/CPA by keyword/ad set, adjust bids |
|
|
168
|
+
| Bi-weekly | Refresh creative (ad fatigue after 2-3 weeks) |
|
|
169
|
+
| Monthly | Review channel mix, reallocate budget to winners |
|
|
170
|
+
| Quarterly | Strategic review, test new channels |
|
|
171
|
+
|
|
172
|
+
## Output Format
|
|
173
|
+
|
|
174
|
+
### UA Plan
|
|
175
|
+
|
|
176
|
+
```
|
|
177
|
+
Monthly Budget: $[X]
|
|
178
|
+
Target CPI: $[X]
|
|
179
|
+
Target Monthly Installs: [N]
|
|
180
|
+
|
|
181
|
+
Channel Allocation:
|
|
182
|
+
- Apple Search Ads: [X]% ($[X])
|
|
183
|
+
- Meta: [X]% ($[X])
|
|
184
|
+
- Google UAC: [X]% ($[X])
|
|
185
|
+
- Testing: [X]% ($[X])
|
|
186
|
+
|
|
187
|
+
Week 1: [setup tasks]
|
|
188
|
+
Week 2: [launch tasks]
|
|
189
|
+
Week 3-4: [optimization tasks]
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
### Campaign Briefs
|
|
193
|
+
|
|
194
|
+
For each channel, provide:
|
|
195
|
+
- Campaign structure
|
|
196
|
+
- Targeting strategy
|
|
197
|
+
- Creative requirements
|
|
198
|
+
- Budget and bid recommendations
|
|
199
|
+
- KPI targets
|
|
200
|
+
|
|
201
|
+
## Related Skills
|
|
202
|
+
|
|
203
|
+
- `app-launch` — UA strategy for launch
|
|
204
|
+
- `monetization-strategy` — LTV calculation for CPI targets
|
|
205
|
+
- `app-analytics` — Attribution and funnel tracking
|
|
206
|
+
- `competitor-analysis` — Competitive ad intelligence
|
|
207
|
+
- `ab-test-store-listing` — Improve organic conversion (lowers effective CPI)
|
|
@@ -121,10 +121,31 @@ When calling `symphony_complete_task`:
|
|
|
121
121
|
✅ symphony_complete_task(summary="Implemented feature X. Build: ✅ (exit 0). Tests: ✅ 47/47 pass. Lint: ✅ 0 errors.")
|
|
122
122
|
```
|
|
123
123
|
|
|
124
|
+
## Boil-the-Lake Completeness Checklist
|
|
125
|
+
|
|
126
|
+
> **Principle:** AI's marginal cost is near zero. Ship completeness, not shortcuts.
|
|
127
|
+
|
|
128
|
+
Trước khi claim DONE, kiểm tra **mỗi item** dưới đây:
|
|
129
|
+
|
|
130
|
+
```
|
|
131
|
+
☐ Error handling: MỌI code path có proper error handling?
|
|
132
|
+
→ Network errors, parsing errors, invalid input, timeouts
|
|
133
|
+
☐ Edge cases: Đã handle empty states, nil/null, boundary values?
|
|
134
|
+
→ Empty list, first item, last item, max size
|
|
135
|
+
☐ Logging: Đủ log cho production debugging?
|
|
136
|
+
→ Errors logged with context, key operations tracked
|
|
137
|
+
☐ Cleanup: Resources released? Listeners removed? Timers cancelled?
|
|
138
|
+
☐ Input validation: User input được validate trước khi process?
|
|
139
|
+
☐ Concurrency: Thread-safe? Race conditions handled?
|
|
140
|
+
☐ Backwards compatibility: Breaking changes documented?
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
**Nếu thiếu bất kỳ item nào → report DONE_WITH_CONCERNS, không DONE.**
|
|
144
|
+
|
|
124
145
|
## The Bottom Line
|
|
125
146
|
|
|
126
|
-
**No shortcuts for verification.**
|
|
147
|
+
**No shortcuts for verification. No shortcuts for completeness.**
|
|
127
148
|
|
|
128
|
-
Run the command. Read the output. THEN claim the result.
|
|
149
|
+
Run the command. Read the output. Check the checklist. THEN claim the result.
|
|
129
150
|
|
|
130
151
|
This is non-negotiable.
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: 🔍 GitNexus Code Intelligence — Index, explore, và analyze codebase qua knowledge graph
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# /gitnexus Workflow
|
|
6
|
+
|
|
7
|
+
> GitNexus cung cấp code intelligence qua knowledge graph. Index codebase → query qua MCP tools.
|
|
8
|
+
|
|
9
|
+
## Sub-commands
|
|
10
|
+
|
|
11
|
+
### `/gitnexus init` — Index project hiện tại
|
|
12
|
+
|
|
13
|
+
// turbo
|
|
14
|
+
1. Kiểm tra Node.js >= 18:
|
|
15
|
+
```bash
|
|
16
|
+
node --version
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
2. Index project:
|
|
20
|
+
```bash
|
|
21
|
+
npx -y gitnexus@latest analyze
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
3. Verify index:
|
|
25
|
+
```bash
|
|
26
|
+
npx gitnexus status
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
4. (Optional) Generate embeddings cho semantic search tốt hơn:
|
|
30
|
+
```bash
|
|
31
|
+
npx gitnexus analyze --embeddings
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
### `/gitnexus status` — Kiểm tra index
|
|
37
|
+
|
|
38
|
+
// turbo
|
|
39
|
+
1. Xem trạng thái index:
|
|
40
|
+
```bash
|
|
41
|
+
npx gitnexus status
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
2. Nếu stale → suggest re-index:
|
|
45
|
+
```bash
|
|
46
|
+
npx gitnexus analyze
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
### `/gitnexus impact <symbol>` — Quick impact analysis
|
|
52
|
+
|
|
53
|
+
1. Chạy impact analysis:
|
|
54
|
+
```
|
|
55
|
+
gitnexus_impact({target: "<symbol>", direction: "upstream"})
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
2. Đọc processes bị ảnh hưởng:
|
|
59
|
+
```
|
|
60
|
+
READ gitnexus://repo/{name}/processes
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
3. Report risk level cho user:
|
|
64
|
+
- d=1 → WILL BREAK (PHẢI update)
|
|
65
|
+
- d=2 → LIKELY AFFECTED (nên test)
|
|
66
|
+
- d=3 → MAY NEED TESTING
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
### `/gitnexus explore` — Architecture overview
|
|
71
|
+
|
|
72
|
+
1. Đọc context overview:
|
|
73
|
+
```
|
|
74
|
+
READ gitnexus://repo/{name}/context
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
2. Xem functional areas:
|
|
78
|
+
```
|
|
79
|
+
READ gitnexus://repo/{name}/clusters
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
3. Liệt kê execution flows:
|
|
83
|
+
```
|
|
84
|
+
READ gitnexus://repo/{name}/processes
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
4. Present tổng quan cho user:
|
|
88
|
+
- Số symbols, relationships
|
|
89
|
+
- Functional clusters
|
|
90
|
+
- Key execution flows
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
### `/gitnexus list` — Liệt kê repos đã index
|
|
95
|
+
|
|
96
|
+
// turbo
|
|
97
|
+
1. Liệt kê tất cả repos:
|
|
98
|
+
```bash
|
|
99
|
+
npx gitnexus list
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
### `/gitnexus clean` — Xóa index
|
|
105
|
+
|
|
106
|
+
1. Xóa index project hiện tại:
|
|
107
|
+
```bash
|
|
108
|
+
npx gitnexus clean
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
2. Xóa tất cả indexes (cẩn thận!):
|
|
112
|
+
```bash
|
|
113
|
+
npx gitnexus clean --all --force
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
---
|
|
117
|
+
|
|
118
|
+
## Notes
|
|
119
|
+
|
|
120
|
+
- GitNexus lưu index trong `.gitnexus/` (đã gitignored)
|
|
121
|
+
- Registry toàn cục ở `~/.gitnexus/registry.json`
|
|
122
|
+
- Hỗ trợ 13 ngôn ngữ: TypeScript, JavaScript, Python, Java, Kotlin, C#, Go, Rust, PHP, Ruby, Swift, C, C++
|
|
123
|
+
- MCP server serve TẤT CẢ repos đã index (không cần config per-project)
|
package/symphony/LICENSE
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
MIT License
|
|
2
|
-
|
|
3
|
-
Copyright (c) 2026 AWKit
|
|
4
|
-
|
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
-
in the Software without restriction, including without limitation the rights
|
|
8
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
-
furnished to do so, subject to the following conditions:
|
|
11
|
-
|
|
12
|
-
The above copyright notice and this permission notice shall be included in all
|
|
13
|
-
copies or substantial portions of the Software.
|
|
14
|
-
|
|
15
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
-
SOFTWARE.
|