@leejungkiin/awkit 1.7.1 → 1.7.5

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.
Files changed (262) hide show
  1. package/README.md +42 -5
  2. package/bin/awk.js +1148 -92
  3. package/core/CLAUDE.md +1 -1
  4. package/core/GEMINI.md +152 -167
  5. package/core/GEMINI.md.bak +153 -116
  6. package/core/GreetingEngine/index.js +225 -0
  7. package/core/GreetingEngine/locales/en.json +6 -0
  8. package/core/GreetingEngine/locales/ja.json +6 -0
  9. package/core/GreetingEngine/locales/vi.json +6 -0
  10. package/core/GreetingEngine/test.js +37 -0
  11. package/core/skill-runtime-manifest.json +3 -0
  12. package/docs/Claude Fable 5.md +3826 -0
  13. package/docs/PRD.md +57 -0
  14. package/docs/android_kotlin_system_instruction.md +210 -0
  15. package/docs/brainstorm_multi_agent_cli.md +211 -0
  16. package/docs/brainstorm_ponytail_integration.md +146 -0
  17. package/docs/brainstorm_smart_setup.md +113 -0
  18. package/docs/deep-research-report (1).md +293 -0
  19. package/docs/history/GEMINI.v1.md +135 -0
  20. package/docs/history/PRD.v1.md +55 -0
  21. package/docs/history/PRD.v2.md +57 -0
  22. package/docs/history/brainstorm_antigravity_unified_architecture.v1.md +105 -0
  23. package/docs/history/implementation_plan.v1.md +58 -0
  24. package/docs/history/memoizedfibonacci_spec.v1.md +127 -0
  25. package/docs/specs/greetingapp_spec.md +97 -0
  26. package/docs/specs/memoizedfibonacci_spec.md +211 -0
  27. package/package.json +4 -1
  28. package/scripts/artifact-storage.js +130 -0
  29. package/scripts/automation-gate.js +35 -2
  30. package/scripts/claude-plan.js +76 -0
  31. package/scripts/dependency-manager.js +210 -0
  32. package/scripts/exec-rtk.js +11 -5
  33. package/scripts/i18n-helper.js +381 -0
  34. package/scripts/multi-model-pipeline.js +386 -0
  35. package/scripts/qwen-exec.js +147 -0
  36. package/skill-packs/mobile-ios/pack.json +4 -2
  37. package/skill-packs/reverse-engineering/pack.json +1 -0
  38. package/skills/CATALOG.md +20 -0
  39. package/skills/GEMINI.md +9 -1
  40. package/skills/TRIGGER_INDEX.md +10 -0
  41. package/skills/ai-music/SKILL.md +275 -0
  42. package/skills/android-re-analyzer/SKILL.md +238 -0
  43. package/skills/android-re-analyzer/references/api-extraction-patterns.md +119 -0
  44. package/skills/android-re-analyzer/references/call-flow-analysis.md +176 -0
  45. package/skills/android-re-analyzer/references/fernflower-usage.md +115 -0
  46. package/skills/android-re-analyzer/references/jadx-usage.md +116 -0
  47. package/skills/android-re-analyzer/references/setup-guide.md +221 -0
  48. package/skills/android-re-analyzer/scripts/check-deps.sh +129 -0
  49. package/skills/android-re-analyzer/scripts/decompile.sh +375 -0
  50. package/skills/android-re-analyzer/scripts/find-api-calls.sh +118 -0
  51. package/skills/android-re-analyzer/scripts/install-dep.sh +448 -0
  52. package/skills/animal-island-ui-style/SKILL.md +1450 -0
  53. package/skills/app-store-review-agent/SKILL.md +164 -0
  54. package/skills/app-store-review-agent/references/guidelines/README.md +154 -0
  55. package/skills/app-store-review-agent/references/guidelines/by-app-type/ai_apps.md +37 -0
  56. package/skills/app-store-review-agent/references/guidelines/by-app-type/all_apps.md +50 -0
  57. package/skills/app-store-review-agent/references/guidelines/by-app-type/crypto_finance.md +31 -0
  58. package/skills/app-store-review-agent/references/guidelines/by-app-type/games.md +31 -0
  59. package/skills/app-store-review-agent/references/guidelines/by-app-type/health_fitness.md +31 -0
  60. package/skills/app-store-review-agent/references/guidelines/by-app-type/kids.md +27 -0
  61. package/skills/app-store-review-agent/references/guidelines/by-app-type/macos.md +38 -0
  62. package/skills/app-store-review-agent/references/guidelines/by-app-type/social_ugc.md +32 -0
  63. package/skills/app-store-review-agent/references/guidelines/by-app-type/subscription_iap.md +34 -0
  64. package/skills/app-store-review-agent/references/guidelines/by-app-type/vpn.md +18 -0
  65. package/skills/app-store-review-agent/references/rules/design/minimum_functionality.md +96 -0
  66. package/skills/app-store-review-agent/references/rules/design/sign_in_with_apple.md +54 -0
  67. package/skills/app-store-review-agent/references/rules/entitlements/unused_entitlements.md +83 -0
  68. package/skills/app-store-review-agent/references/rules/metadata/accurate_metadata.md +54 -0
  69. package/skills/app-store-review-agent/references/rules/metadata/apple_trademark.md +99 -0
  70. package/skills/app-store-review-agent/references/rules/metadata/china_storefront.md +72 -0
  71. package/skills/app-store-review-agent/references/rules/metadata/competitor_terms.md +56 -0
  72. package/skills/app-store-review-agent/references/rules/metadata/subscription_metadata.md +81 -0
  73. package/skills/app-store-review-agent/references/rules/privacy/privacy_manifest.md +84 -0
  74. package/skills/app-store-review-agent/references/rules/privacy/unnecessary_data.md +60 -0
  75. package/skills/app-store-review-agent/references/rules/subscription/misleading_pricing.md +63 -0
  76. package/skills/app-store-review-agent/references/rules/subscription/missing_tos_pp.md +54 -0
  77. package/skills/awf-ponytail/SKILL.md +91 -0
  78. package/skills/awf-ponytail-review/SKILL.md +67 -0
  79. package/skills/awf-session-restore/SKILL.md +3 -3
  80. package/skills/brainstorm-agent/SKILL.md +11 -2
  81. package/skills/brainstorm-agent/templates/brief-template.md +8 -0
  82. package/skills/claude-planner/SKILL.md +71 -0
  83. package/skills/code-review/SKILL.md +87 -0
  84. package/skills/codex-conductor/SKILL.md +25 -1
  85. package/skills/expo-game-development/SKILL.md +163 -0
  86. package/skills/flutter/LICENSE.txt +202 -0
  87. package/skills/flutter/SKILL.md +127 -0
  88. package/skills/flutter-project-creater/LICENSE.txt +202 -0
  89. package/skills/flutter-project-creater/SKILL.md +106 -0
  90. package/skills/game-developer/SKILL.md +163 -0
  91. package/skills/game-developer/references/ecs-patterns.md +501 -0
  92. package/skills/game-developer/references/multiplayer-networking.md +475 -0
  93. package/skills/game-developer/references/performance-optimization.md +422 -0
  94. package/skills/game-developer/references/unity-patterns.md +271 -0
  95. package/skills/game-developer/references/unreal-cpp.md +352 -0
  96. package/skills/generate-gui-assets/SKILL.md +305 -0
  97. package/skills/generate-gui-assets/agents/openai.yaml +4 -0
  98. package/skills/generate-gui-assets/references/catalog-schema.md +58 -0
  99. package/skills/generate-gui-assets/references/extraction-techniques.md +21 -0
  100. package/skills/generate-gui-assets/references/prompt-patterns.md +58 -0
  101. package/skills/generate-gui-assets/scripts/__pycache__/clean_chroma_edges.cpython-311.pyc +0 -0
  102. package/skills/generate-gui-assets/scripts/build_gui_contact_sheet.py +51 -0
  103. package/skills/generate-gui-assets/scripts/clean_chroma_edges.py +262 -0
  104. package/skills/generate-gui-assets/scripts/copy_approved_icons.py +64 -0
  105. package/skills/generate-gui-assets/scripts/prepare_gui_asset_run.py +91 -0
  106. package/skills/generate-gui-assets/scripts/suggest_grid_options.py +63 -0
  107. package/skills/generate-gui-assets/scripts/validate_gui_catalog.py +50 -0
  108. package/skills/godot-game-development/SKILL.md +142 -0
  109. package/skills/hatch-pet/LICENSE.txt +201 -0
  110. package/skills/hatch-pet/SKILL.md +420 -0
  111. package/skills/hatch-pet/agents/openai.yaml +4 -0
  112. package/skills/hatch-pet/references/animation-rows.md +29 -0
  113. package/skills/hatch-pet/references/codex-pet-contract.md +35 -0
  114. package/skills/hatch-pet/references/qa-rubric.md +60 -0
  115. package/skills/hatch-pet/scripts/__pycache__/clean_chroma_edges.cpython-311.pyc +0 -0
  116. package/skills/hatch-pet/scripts/clean_chroma_edges.py +262 -0
  117. package/skills/hatch-pet/scripts/compose_atlas.py +150 -0
  118. package/skills/hatch-pet/scripts/derive_running_left_from_running_right.py +143 -0
  119. package/skills/hatch-pet/scripts/extract_strip_frames.py +323 -0
  120. package/skills/hatch-pet/scripts/finalize_pet_run.py +382 -0
  121. package/skills/hatch-pet/scripts/generate_pet_images.py +287 -0
  122. package/skills/hatch-pet/scripts/inspect_frames.py +246 -0
  123. package/skills/hatch-pet/scripts/make_contact_sheet.py +96 -0
  124. package/skills/hatch-pet/scripts/package_custom_pet.py +108 -0
  125. package/skills/hatch-pet/scripts/pet_job_status.py +117 -0
  126. package/skills/hatch-pet/scripts/prepare_pet_run.py +673 -0
  127. package/skills/hatch-pet/scripts/queue_pet_repairs.py +172 -0
  128. package/skills/hatch-pet/scripts/record_imagegen_result.py +250 -0
  129. package/skills/hatch-pet/scripts/render_animation_videos.py +134 -0
  130. package/skills/hatch-pet/scripts/render_animation_videos.sh +5 -0
  131. package/skills/hatch-pet/scripts/validate_atlas.py +139 -0
  132. package/skills/i18n-orchestrator/SKILL.md +37 -0
  133. package/skills/ios-simulator-skill/SKILL.md +390 -0
  134. package/skills/ios-simulator-skill/scripts/accessibility_audit.py +300 -0
  135. package/skills/ios-simulator-skill/scripts/app_launcher.py +326 -0
  136. package/skills/ios-simulator-skill/scripts/app_state_capture.py +400 -0
  137. package/skills/ios-simulator-skill/scripts/appearance.py +385 -0
  138. package/skills/ios-simulator-skill/scripts/build_and_test.py +348 -0
  139. package/skills/ios-simulator-skill/scripts/clipboard.py +103 -0
  140. package/skills/ios-simulator-skill/scripts/common/__init__.py +61 -0
  141. package/skills/ios-simulator-skill/scripts/common/cache_utils.py +289 -0
  142. package/skills/ios-simulator-skill/scripts/common/device_utils.py +462 -0
  143. package/skills/ios-simulator-skill/scripts/common/env_config.py +35 -0
  144. package/skills/ios-simulator-skill/scripts/common/hang_pipeline.py +862 -0
  145. package/skills/ios-simulator-skill/scripts/common/hang_sessions.py +490 -0
  146. package/skills/ios-simulator-skill/scripts/common/idb_utils.py +180 -0
  147. package/skills/ios-simulator-skill/scripts/common/screenshot_utils.py +338 -0
  148. package/skills/ios-simulator-skill/scripts/container.py +668 -0
  149. package/skills/ios-simulator-skill/scripts/gesture.py +394 -0
  150. package/skills/ios-simulator-skill/scripts/hang_watcher.py +1533 -0
  151. package/skills/ios-simulator-skill/scripts/keyboard.py +391 -0
  152. package/skills/ios-simulator-skill/scripts/localization_audit.py +483 -0
  153. package/skills/ios-simulator-skill/scripts/location.py +467 -0
  154. package/skills/ios-simulator-skill/scripts/log_monitor.py +493 -0
  155. package/skills/ios-simulator-skill/scripts/model_inspector.py +645 -0
  156. package/skills/ios-simulator-skill/scripts/navigator.py +461 -0
  157. package/skills/ios-simulator-skill/scripts/privacy_manager.py +310 -0
  158. package/skills/ios-simulator-skill/scripts/push_notification.py +240 -0
  159. package/skills/ios-simulator-skill/scripts/screen_mapper.py +296 -0
  160. package/skills/ios-simulator-skill/scripts/sim_health_check.sh +245 -0
  161. package/skills/ios-simulator-skill/scripts/sim_list.py +299 -0
  162. package/skills/ios-simulator-skill/scripts/simctl_boot.py +312 -0
  163. package/skills/ios-simulator-skill/scripts/simctl_create.py +316 -0
  164. package/skills/ios-simulator-skill/scripts/simctl_delete.py +357 -0
  165. package/skills/ios-simulator-skill/scripts/simctl_erase.py +351 -0
  166. package/skills/ios-simulator-skill/scripts/simctl_shutdown.py +290 -0
  167. package/skills/ios-simulator-skill/scripts/simulator_selector.py +375 -0
  168. package/skills/ios-simulator-skill/scripts/status_bar.py +250 -0
  169. package/skills/ios-simulator-skill/scripts/test_recorder.py +323 -0
  170. package/skills/ios-simulator-skill/scripts/visual_diff.py +235 -0
  171. package/skills/ios-simulator-skill/scripts/xcode/__init__.py +13 -0
  172. package/skills/ios-simulator-skill/scripts/xcode/builder.py +397 -0
  173. package/skills/ios-simulator-skill/scripts/xcode/cache.py +204 -0
  174. package/skills/ios-simulator-skill/scripts/xcode/config.py +178 -0
  175. package/skills/ios-simulator-skill/scripts/xcode/reporter.py +343 -0
  176. package/skills/ios-simulator-skill/scripts/xcode/xcresult.py +451 -0
  177. package/skills/ios-visual-qa-strategist/SKILL.md +111 -0
  178. package/skills/ios-visual-qa-strategist/agents/openai.yaml +4 -0
  179. package/skills/ios-visual-qa-strategist/references/ios-tool-selection.md +61 -0
  180. package/skills/ios-visual-qa-strategist/references/minimal-capture-policy.md +56 -0
  181. package/skills/ios-visual-qa-strategist/references/visual-reasoning-heuristics.md +53 -0
  182. package/skills/orchestrator/SKILL.md +0 -20
  183. package/skills/persistent-storage/SKILL.md +55 -0
  184. package/skills/qwen-conductor/SKILL.md +100 -0
  185. package/skills/short-maker/SKILL.md +23 -0
  186. package/skills/short-maker/scripts/effects.js +56 -0
  187. package/skills/short-maker/scripts/shortmaker-bridge.js +332 -0
  188. package/skills/short-maker/scripts/videomix.js +601 -0
  189. package/skills/short-maker/templates/hyperframes/cinematic-character.template.html +172 -0
  190. package/skills/short-maker/templates/hyperframes/index.template.html +194 -0
  191. package/skills/smali-to-kotlin/SKILL.md +128 -0
  192. package/skills/smali-to-kotlin/examples/getting-started/tech-stack.md +58 -0
  193. package/skills/smali-to-kotlin/examples/pipeline/data-ui-parity.md +118 -0
  194. package/skills/smali-to-kotlin/examples/pipeline/scanner-and-bootstrap.md +106 -0
  195. package/skills/smali-to-kotlin/library-patterns.md +189 -0
  196. package/skills/smali-to-kotlin/phase-0-discovery.md +128 -0
  197. package/skills/smali-to-kotlin/phase-1-architecture.md +166 -0
  198. package/skills/smali-to-kotlin/phase-2-blueprint-ui.md +347 -0
  199. package/skills/smali-to-kotlin/phase-2-blueprint.md +228 -0
  200. package/skills/smali-to-kotlin/phase-3-build.md +248 -0
  201. package/skills/smali-to-kotlin/phase-3-logic-build.md +268 -0
  202. package/skills/smali-to-kotlin/smali-reading-guide.md +310 -0
  203. package/skills/smali-to-kotlin/templates/app-map.md +101 -0
  204. package/skills/smali-to-kotlin/templates/architecture.md +142 -0
  205. package/skills/smali-to-kotlin/templates/blueprint.md +145 -0
  206. package/skills/spec-gate/SKILL.md +6 -2
  207. package/skills/symphony-enforcer/SKILL.md +8 -0
  208. package/skills/symphony-enforcer/examples/mindful-stop.md +2 -0
  209. package/skills/symphony-enforcer/examples/three-phase.md +16 -0
  210. package/skills/symphony-enforcer/examples/trigger-points.md +7 -1
  211. package/skills/unity-game-development/SKILL.md +231 -0
  212. package/skills/video-edit/SKILL.md +36 -0
  213. package/skills/video-edit/scripts/video_edit.py +324 -0
  214. package/templates/project-identity/android.json +2 -2
  215. package/templates/project-identity/backend-nestjs.json +2 -2
  216. package/templates/project-identity/expo.json +2 -2
  217. package/templates/project-identity/ios.json +2 -2
  218. package/templates/project-identity/web-nextjs.json +2 -2
  219. package/templates/setup-mapping.json +48 -0
  220. package/templates/specs/design-template.md +161 -71
  221. package/templates/specs/requirements-template.md +65 -133
  222. package/templates/specs/task-spec-template.xml +3 -0
  223. package/workflows/_uncategorized/critic.md +40 -0
  224. package/workflows/_uncategorized/git-rebase-flow.md +81 -0
  225. package/workflows/_uncategorized/image-gen.md +118 -0
  226. package/workflows/_uncategorized/multi-model-pipeline.md +60 -0
  227. package/workflows/_uncategorized/pixel-gen.md +86 -0
  228. package/workflows/_uncategorized/pixel-setup.md +90 -0
  229. package/workflows/_uncategorized/ponytail-review.md +59 -0
  230. package/workflows/_uncategorized/reverse-android-build.md +222 -0
  231. package/workflows/_uncategorized/reverse-android-design.md +139 -0
  232. package/workflows/_uncategorized/reverse-android-discover.md +150 -0
  233. package/workflows/_uncategorized/reverse-android-scan.md +158 -0
  234. package/workflows/_uncategorized/reverse-android.md +143 -0
  235. package/workflows/_uncategorized/reverse-ios-build.md +240 -0
  236. package/workflows/_uncategorized/reverse-ios-design.md +112 -0
  237. package/workflows/_uncategorized/reverse-ios-discover.md +120 -0
  238. package/workflows/_uncategorized/reverse-ios-scan.md +155 -0
  239. package/workflows/_uncategorized/reverse-ios.md +152 -0
  240. package/workflows/_uncategorized/safety-router.md +34 -0
  241. package/workflows/_uncategorized/teach.md +89 -0
  242. package/workflows/_uncategorized/verify-ui.md +53 -0
  243. package/workflows/_uncategorized/visualize-screenshots.md +34 -0
  244. package/workflows/ads/ads-analyst.md +201 -0
  245. package/workflows/ads/ads-audit.md +106 -0
  246. package/workflows/ads/ads-optimize.md +97 -0
  247. package/workflows/ads/ads-targeting.md +241 -0
  248. package/workflows/ads/adsExpert.md +160 -0
  249. package/workflows/ads/smali-ads-config.md +400 -0
  250. package/workflows/ads/smali-ads-flow.md +331 -0
  251. package/workflows/ads/smali-ads-interstitial.md +377 -0
  252. package/workflows/ads/smali-ads-native.md +382 -0
  253. package/workflows/context/teach.md +89 -0
  254. package/workflows/gitnexus.md +8 -8
  255. package/workflows/lifecycle/brainstorm.md +43 -0
  256. package/workflows/lifecycle/code.md +5 -0
  257. package/workflows/lifecycle/init.md +23 -5
  258. package/workflows/lifecycle/multi-model-pipeline.md +60 -0
  259. package/workflows/multi-agent-pipeline.md +52 -0
  260. package/workflows/quality/ponytail-review.md +59 -0
  261. package/workflows/roles/critic.md +40 -0
  262. package/workflows/roles/safety-router.md +34 -0
@@ -0,0 +1,386 @@
1
+ /**
2
+ * Multi-Model Collaborative Pipeline Helper for AWKit
3
+ * Orchestrates tasks across Gemini Flash Medium, agy (Claude Opus), and Codex.
4
+ */
5
+
6
+ const { execSync, spawnSync } = require('child_process');
7
+ const fs = require('fs');
8
+ const path = require('path');
9
+ const os = require('os');
10
+
11
+ const AGY_PATH = path.join(os.homedir(), '.local', 'bin', 'agy');
12
+
13
+ const C = {
14
+ reset: '\x1b[0m',
15
+ red: '\x1b[31m',
16
+ green: '\x1b[32m',
17
+ yellow: '\x1b[33m',
18
+ cyan: '\x1b[36m',
19
+ gray: '\x1b[90m',
20
+ bold: '\x1b[1m',
21
+ };
22
+
23
+ const log = (msg) => console.log(msg);
24
+ const ok = (msg) => log(`${C.green}✔${C.reset} ${msg}`);
25
+ const warn = (msg) => log(`${C.yellow}⚠${C.reset} ${msg}`);
26
+ const err = (msg) => log(`${C.red}✖${C.reset} ${msg}`);
27
+ const info = (msg) => log(`${C.cyan}ℹ${C.reset} ${msg}`);
28
+
29
+ // Load configurations from .project-identity
30
+ let config = {};
31
+ try {
32
+ const configPath = path.join(__dirname, '..', '.project-identity');
33
+ if (fs.existsSync(configPath)) {
34
+ config = JSON.parse(fs.readFileSync(configPath, 'utf8'));
35
+ }
36
+ } catch (_) {}
37
+
38
+ function findAgy() {
39
+ if (fs.existsSync(AGY_PATH)) {
40
+ return AGY_PATH;
41
+ }
42
+ try {
43
+ return execSync('which agy', { encoding: 'utf8' }).trim();
44
+ } catch (_) {
45
+ return 'agy';
46
+ }
47
+ }
48
+
49
+ function findClaudePath() {
50
+ if (config.automation?.multiAgent?.runners?.claude) {
51
+ const p = config.automation.multiAgent.runners.claude;
52
+ if (fs.existsSync(p)) return p;
53
+ }
54
+ const homeClaude = path.join(os.homedir(), '.claude', 'local', 'claude');
55
+ if (fs.existsSync(homeClaude)) return homeClaude;
56
+
57
+ try {
58
+ const shell = process.env.SHELL || '/bin/zsh';
59
+ const shellCmd = shell.endsWith('zsh') ? 'zsh -lc "which claude"' : 'bash -lc "which claude"';
60
+ const detected = execSync(shellCmd, { encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'] }).trim();
61
+ if (detected && fs.existsSync(detected)) return detected;
62
+ } catch (_) {}
63
+
64
+ return 'claude';
65
+ }
66
+
67
+ function findCodexPath() {
68
+ if (config.automation?.multiAgent?.runners?.codex) {
69
+ const p = config.automation.multiAgent.runners.codex;
70
+ if (fs.existsSync(p)) return p;
71
+ }
72
+ try {
73
+ const shell = process.env.SHELL || '/bin/zsh';
74
+ const shellCmd = shell.endsWith('zsh') ? 'zsh -lc "which codex"' : 'bash -lc "which codex"';
75
+ const detected = execSync(shellCmd, { encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'] }).trim();
76
+ if (detected && fs.existsSync(detected)) return detected;
77
+ } catch (_) {}
78
+ return 'codex';
79
+ }
80
+
81
+ function findQwenPath() {
82
+ if (config.automation?.multiAgent?.runners?.qwen) {
83
+ const p = config.automation.multiAgent.runners.qwen;
84
+ if (fs.existsSync(p)) return p;
85
+ }
86
+ try {
87
+ const shell = process.env.SHELL || '/bin/zsh';
88
+ const shellCmd = shell.endsWith('zsh') ? 'zsh -lc "which qwen"' : 'bash -lc "which qwen"';
89
+ const detected = execSync(shellCmd, { encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'] }).trim();
90
+ if (detected && fs.existsSync(detected)) return detected;
91
+ } catch (_) {}
92
+ return 'qwen';
93
+ }
94
+
95
+ function readGlobalConfig() {
96
+ const defaultConf = {
97
+ audioAlerts: true,
98
+ runners: {
99
+ claude: true,
100
+ codex: true,
101
+ qwen: true
102
+ }
103
+ };
104
+ try {
105
+ const globalConfigPath = path.join(os.homedir(), '.awkit_config.json');
106
+ if (fs.existsSync(globalConfigPath)) {
107
+ const parsed = JSON.parse(fs.readFileSync(globalConfigPath, 'utf8'));
108
+ return {
109
+ ...defaultConf,
110
+ ...parsed,
111
+ runners: {
112
+ ...defaultConf.runners,
113
+ ...(parsed.runners || {})
114
+ }
115
+ };
116
+ }
117
+ } catch (_) {}
118
+ return defaultConf;
119
+ }
120
+
121
+ function isRunnerEnabled(runnerName) {
122
+ const localVal = config.automation?.multiAgent?.runnersEnabled?.[runnerName];
123
+ if (localVal !== undefined) return localVal;
124
+
125
+ const globalConfig = readGlobalConfig();
126
+ const globalVal = globalConfig.runners?.[runnerName];
127
+ if (globalVal !== undefined) return globalVal;
128
+
129
+ return true;
130
+ }
131
+
132
+ function isRunnerAvailable(runnerName) {
133
+ if (!isRunnerEnabled(runnerName)) return false;
134
+ let p;
135
+ if (runnerName === 'claude') p = findClaudePath();
136
+ else if (runnerName === 'codex') p = findCodexPath();
137
+ else if (runnerName === 'qwen') p = findQwenPath();
138
+ else return false;
139
+
140
+ if (fs.existsSync(p)) return true;
141
+ try {
142
+ execSync(`which ${p} || command -v ${p}`, { stdio: 'ignore' });
143
+ return true;
144
+ } catch (_) {
145
+ return false;
146
+ }
147
+ }
148
+
149
+
150
+ function playAudioAlert(message = "Quy trình đã hoàn thành") {
151
+ // 1. Read global configuration
152
+ let globalAudio = true;
153
+ try {
154
+ const globalConfigPath = path.join(os.homedir(), '.awkit_config.json');
155
+ if (fs.existsSync(globalConfigPath)) {
156
+ const globalConfig = JSON.parse(fs.readFileSync(globalConfigPath, 'utf8'));
157
+ if (globalConfig.audioAlerts !== undefined) {
158
+ globalAudio = globalConfig.audioAlerts;
159
+ }
160
+ }
161
+ } catch (_) {}
162
+
163
+ // 2. Read local project identity config
164
+ let localAudio = config.automation?.multiAgent?.audioAlerts;
165
+
166
+ // Local configuration takes priority. If not defined, fallback to global config.
167
+ const audioEnabled = localAudio !== undefined ? localAudio : globalAudio;
168
+
169
+ if (audioEnabled) {
170
+ try {
171
+ execSync(`afplay /System/Library/Sounds/Glass.aiff && say "${message}"`, { stdio: 'ignore' });
172
+ } catch (_) {}
173
+ }
174
+ }
175
+
176
+ function runPlanStep(featureName) {
177
+ info(`Khởi chạy Lập kế hoạch Kiến trúc...`);
178
+
179
+ // Ensure docs and docs/specs directories exist
180
+ fs.mkdirSync(path.join(process.cwd(), 'docs', 'specs'), { recursive: true });
181
+
182
+ const specFile = `docs/specs/${featureName.toLowerCase().replace(/\s+/g, '_')}_spec.md`;
183
+ const prompt = `Thực hiện lập kế hoạch chi tiết cho tính năng '${featureName}'. Tạo PRD tại docs/PRD.md và Spec chi tiết tại ${specFile}. Hãy vẽ kèm sơ đồ Mermaid thể hiện luồng xử lý. Hãy phản hồi ngắn gọn bằng JSON tóm tắt các files đã tạo và mô tả kế hoạch.`;
184
+
185
+ let planSuccess = false;
186
+
187
+ if (isRunnerAvailable('claude')) {
188
+ const claudePath = findClaudePath();
189
+ try {
190
+ info(`Calling Claude CLI (${claudePath}) for Architect Planning...`);
191
+ log(`$ ${claudePath} -p "..." --print --no-session-persistence --permission-mode bypassPermissions`);
192
+ const result = spawnSync(claudePath, [
193
+ '-p', prompt,
194
+ '--print',
195
+ '--no-session-persistence',
196
+ '--permission-mode', 'bypassPermissions'
197
+ ], { encoding: 'utf8', timeout: 30000 }); // 30s timeout for Claude
198
+
199
+ if (result.status === 0) {
200
+ log(result.stdout);
201
+ planSuccess = true;
202
+ } else {
203
+ warn(`Claude planning failed: ${result.stderr || result.stdout}`);
204
+ }
205
+ } catch (e) {
206
+ warn(`Claude planning failed or timed out: ${e.message}. Falling back to agy (Gemini)...`);
207
+ }
208
+ } else {
209
+ info(`Claude CLI is disabled or not available. Falling back directly to agy (Gemini)...`);
210
+ }
211
+
212
+ if (!planSuccess) {
213
+ const agyBin = findAgy();
214
+ try {
215
+ log(`$ ${agyBin} --model gemini-3.5-flash --print "..."`);
216
+ const result = spawnSync(agyBin, [
217
+ '--model', 'gemini-3.5-flash',
218
+ '--print', prompt
219
+ ], { encoding: 'utf8', timeout: 60000 });
220
+
221
+ if (result.status === 0) {
222
+ log(result.stdout);
223
+ } else {
224
+ err(`Lỗi lập kế hoạch: ${result.stderr || result.stdout}`);
225
+ process.exit(1);
226
+ }
227
+ } catch (e) {
228
+ err(`Lỗi lập kế hoạch: ${e.message}`);
229
+ process.exit(1);
230
+ }
231
+ }
232
+
233
+ ok(`Hoàn thành lập kế hoạch kiến trúc.`);
234
+ ok(`PRD đã lưu tại docs/PRD.md`);
235
+ ok(`Spec đã lưu tại ${specFile}`);
236
+ playAudioAlert("Kế hoạch kiến trúc đã hoàn thành");
237
+ }
238
+
239
+ function runUiStep(featureName) {
240
+ // Ensure assets/ui directory exists
241
+ fs.mkdirSync(path.join(process.cwd(), 'assets', 'ui'), { recursive: true });
242
+
243
+ // Step A: Prompt to generate layout demo preview HTML/CSS or mockup code
244
+ const promptPreview = `Tạo UI Demo Preview dưới dạng HTML/CSS tĩnh hoặc SwiftUI shell cho tính năng '${featureName}' dựa trên tài liệu docs/PRD.md và spec hiện có. Lưu tệp demo vào assets/ui/demo_preview.html.`;
245
+
246
+ if (isRunnerAvailable('codex')) {
247
+ info(`Khởi chạy Thiết kế Shell & GUI Assets (Codex CLI)...`);
248
+ const cmdPreview = `codex exec "${promptPreview.replace(/"/g, '\\"')}" -s read-only --skip-git-repo-check < /dev/null`;
249
+ try {
250
+ log(`${C.gray}$ ${cmdPreview}${C.reset}`);
251
+ const outPreview = execSync(cmdPreview, { encoding: 'utf8', stdio: ['ignore', 'pipe', 'inherit'] });
252
+ log(outPreview);
253
+ ok(`Đã sinh UI Demo Preview tại assets/ui/demo_preview.html`);
254
+ } catch (e) {
255
+ err(`Lỗi sinh UI Demo Preview: ${e.message}`);
256
+ process.exit(1);
257
+ }
258
+
259
+ // Step B: Prompt to generate spritesheet/image assets
260
+ const promptAssets = `Tạo GUI assets (nút bấm, icons, pet companion, egg) dưới dạng spritesheet hoặc dạng assets lẻ dựa trên thiết kế của UI Demo Preview. Lưu tệp assets vào thư mục assets/ui/.`;
261
+ const cmdAssets = `codex exec "${promptAssets.replace(/"/g, '\\"')}" -s read-only --skip-git-repo-check < /dev/null`;
262
+ try {
263
+ log(`${C.gray}$ ${cmdAssets}${C.reset}`);
264
+ const outAssets = execSync(cmdAssets, { encoding: 'utf8', stdio: ['ignore', 'pipe', 'inherit'] });
265
+ log(outAssets);
266
+ ok(`Đã sinh GUI assets thành công vào assets/ui/`);
267
+ } catch (e) {
268
+ err(`Lỗi sinh GUI assets: ${e.message}`);
269
+ process.exit(1);
270
+ }
271
+ } else {
272
+ info(`Codex CLI is disabled or not available. Falling back to agy (Gemini)...`);
273
+ const agyBin = findAgy();
274
+ try {
275
+ log(`$ ${agyBin} --model gemini-3.5-flash --print "..."`);
276
+ const outPreview = spawnSync(agyBin, [
277
+ '--model', 'gemini-3.5-flash',
278
+ '--print', promptPreview
279
+ ], { encoding: 'utf8', timeout: 60000 });
280
+
281
+ if (outPreview.status === 0) {
282
+ let code = outPreview.stdout;
283
+ const match = code.match(/```html\s*([\s\S]*?)```/i) || code.match(/```xml\s*([\s\S]*?)```/i);
284
+ if (match) {
285
+ code = match[1];
286
+ }
287
+ fs.writeFileSync(path.join(process.cwd(), 'assets', 'ui', 'demo_preview.html'), code, 'utf8');
288
+ ok(`Đã sinh UI Demo Preview tại assets/ui/demo_preview.html`);
289
+ } else {
290
+ err(`Gemini UI Design failed: ${outPreview.stderr || outPreview.stdout}`);
291
+ process.exit(1);
292
+ }
293
+ } catch (e) {
294
+ err(`Lỗi sinh UI Demo Preview qua Gemini: ${e.message}`);
295
+ process.exit(1);
296
+ }
297
+ }
298
+
299
+ playAudioAlert("Thiết kế giao diện đã hoàn thành");
300
+ }
301
+
302
+ function runCodeStep(featureName) {
303
+ const isCostOptimized = config.automation?.multiAgent?.routingMode === 'cost-optimized';
304
+
305
+ if (isCostOptimized && isRunnerAvailable('qwen')) {
306
+ info(`Khởi chạy Thực thi Viết Code (Qwen Coder CLI)...`);
307
+ const promptCode = `Hãy thực hiện viết code cho tính năng '${featureName}' tuân thủ kế hoạch chi tiết trong implementation_plan.md và các spec giao diện trong docs/specs/. Sau đó tự động gọi critic subagent để review code.`;
308
+
309
+ try {
310
+ const qwenScript = path.join(__dirname, 'qwen-exec.js');
311
+ log(`$ node ${qwenScript} --prompt "..."`);
312
+ const result = spawnSync('node', [
313
+ qwenScript,
314
+ '--prompt', promptCode
315
+ ], { encoding: 'utf8', timeout: 180000 });
316
+
317
+ if (result.status === 0) {
318
+ log(result.stdout);
319
+ ok(`Đã viết code và hoàn tất quá trình review từ critic subagent.`);
320
+ } else {
321
+ err(`Lỗi thực thi viết code Qwen: ${result.stderr || result.stdout}`);
322
+ process.exit(1);
323
+ }
324
+ } catch (e) {
325
+ err(`Lỗi thực thi viết code Qwen: ${e.message}`);
326
+ process.exit(1);
327
+ }
328
+ } else {
329
+ const agyBin = findAgy();
330
+ if (isCostOptimized && !isRunnerAvailable('qwen')) {
331
+ info(`Qwen Coder CLI is disabled or not available. Falling back to agy (Gemini)...`);
332
+ }
333
+ info(`Khởi chạy Thực thi Viết Code (Gemini via agy CLI)...`);
334
+ const promptCode = `Hãy thực hiện viết code cho tính năng '${featureName}' tuân thủ kế hoạch chi tiết trong implementation_plan.md và các spec giao diện trong docs/specs/. Sau đó tự động gọi critic subagent để review code.`;
335
+
336
+ try {
337
+ log(`$ ${agyBin} --model gemini-3.5-flash --print "..."`);
338
+ const result = spawnSync(agyBin, [
339
+ '--model', 'gemini-3.5-flash',
340
+ '--print', promptCode
341
+ ], { encoding: 'utf8', timeout: 180000 });
342
+
343
+ if (result.status === 0) {
344
+ log(result.stdout);
345
+ ok(`Đã viết code và hoàn tất quá trình review từ critic subagent.`);
346
+ } else {
347
+ err(`Lỗi thực thi viết code: ${result.stderr || result.stdout}`);
348
+ process.exit(1);
349
+ }
350
+ } catch (e) {
351
+ err(`Lỗi thực thi viết code: ${e.message}`);
352
+ process.exit(1);
353
+ }
354
+ }
355
+
356
+ playAudioAlert("Viết mã nguồn đã hoàn thành");
357
+ }
358
+
359
+ function cmdPipeline(args) {
360
+ const step = args[0];
361
+ const featureName = args[1] || 'NewFeature';
362
+
363
+ if (!step) {
364
+ console.error('Usage: awkit pipeline <plan|ui|code> [FeatureName]');
365
+ process.exit(1);
366
+ }
367
+
368
+ switch (step.toLowerCase()) {
369
+ case 'plan':
370
+ runPlanStep(featureName);
371
+ break;
372
+ case 'ui':
373
+ runUiStep(featureName);
374
+ break;
375
+ case 'code':
376
+ runCodeStep(featureName);
377
+ break;
378
+ default:
379
+ console.error(`Unknown step: ${step}`);
380
+ process.exit(1);
381
+ }
382
+ }
383
+
384
+ module.exports = {
385
+ cmdPipeline,
386
+ };
@@ -0,0 +1,147 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Wrapper script to run Qwen CLI non-interactively within AWKit.
5
+ * Handles temporary files, sandbox options, and fallback protocols.
6
+ */
7
+
8
+ const fs = require('fs');
9
+ const path = require('path');
10
+ const os = require('os');
11
+ const { execSync } = require('child_process');
12
+
13
+ const args = process.argv.slice(2);
14
+ let prompt = '';
15
+ let promptFile = '';
16
+ let outputFile = '';
17
+ let sandbox = 'read-only';
18
+
19
+ for (let i = 0; i < args.length; i++) {
20
+ if (args[i] === '--prompt' && args[i + 1]) {
21
+ prompt = args[i + 1];
22
+ i++;
23
+ } else if (args[i] === '--prompt-file' && args[i + 1]) {
24
+ promptFile = args[i + 1];
25
+ i++;
26
+ } else if (args[i] === '--output' && args[i + 1]) {
27
+ outputFile = args[i + 1];
28
+ i++;
29
+ } else if (args[i] === '--sandbox' && args[i + 1]) {
30
+ sandbox = args[i + 1];
31
+ i++;
32
+ }
33
+ }
34
+
35
+ // Read prompt from file if specified
36
+ if (promptFile && fs.existsSync(promptFile)) {
37
+ prompt = fs.readFileSync(promptFile, 'utf8');
38
+ }
39
+
40
+ if (!prompt) {
41
+ console.error('Error: Prompt is required. Use --prompt or --prompt-file');
42
+ process.exit(1);
43
+ }
44
+
45
+ // Load configurations from .project-identity
46
+ let routingMode = 'cost-optimized';
47
+ let config = {};
48
+
49
+ try {
50
+ const identityPath = path.join(__dirname, '..', '.project-identity');
51
+ if (fs.existsSync(identityPath)) {
52
+ config = JSON.parse(fs.readFileSync(identityPath, 'utf8'));
53
+ if (config.automation?.multiAgent?.routingMode) {
54
+ routingMode = config.automation.multiAgent.routingMode;
55
+ }
56
+ }
57
+ } catch (e) {
58
+ console.warn('⚠️ Could not load config from .project-identity, using defaults.');
59
+ }
60
+
61
+ // Dynamic Qwen CLI Path Detection
62
+ function findQwenPath() {
63
+ // 1. Check config path
64
+ if (config.automation?.multiAgent?.runners?.qwen) {
65
+ const p = config.automation.multiAgent.runners.qwen;
66
+ if (fs.existsSync(p)) return p;
67
+ }
68
+ // 2. Try interactive shell which (resolves aliases/nvm)
69
+ try {
70
+ const shell = process.env.SHELL || '/bin/zsh';
71
+ const shellCmd = shell.endsWith('zsh') ? 'zsh -lc "which qwen"' : 'bash -lc "which qwen"';
72
+ const detected = execSync(shellCmd, { encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'] }).trim();
73
+ if (detected && fs.existsSync(detected)) return detected;
74
+ } catch (_) {}
75
+ // 3. Basic command check
76
+ try {
77
+ const detected = execSync('which qwen || command -v qwen', { encoding: 'utf8' }).trim();
78
+ if (detected) return detected;
79
+ } catch (_) {}
80
+
81
+ return 'qwen';
82
+ }
83
+
84
+ const qwenPath = findQwenPath();
85
+
86
+ // Verify Qwen CLI existence
87
+ let qwenAvailable = false;
88
+ try {
89
+ execSync(`[ -f "${qwenPath}" ] || command -v qwen`, { stdio: 'ignore' });
90
+ qwenAvailable = true;
91
+ } catch (e) {
92
+ console.warn(`⚠️ Qwen CLI not found at ${qwenPath}`);
93
+ }
94
+
95
+ // Temporary file to pipe inputs securely
96
+ const tempInputFile = path.join(__dirname, `temp_qwen_input_${Date.now()}.txt`);
97
+ fs.writeFileSync(tempInputFile, prompt, 'utf8');
98
+
99
+ let success = false;
100
+ let finalOutput = '';
101
+
102
+ if (qwenAvailable) {
103
+ console.log('🤖 Running code generation via Qwen CLI...');
104
+ try {
105
+ const cmd = `"${qwenPath}" --max-session-turns 1 -s ${sandbox} < "${tempInputFile}"`;
106
+ finalOutput = execSync(cmd, { encoding: 'utf8', timeout: 120000 });
107
+ success = true;
108
+ } catch (e) {
109
+ console.warn('⚠️ Qwen execution failed. Fallback triggered.');
110
+ console.error(e.message);
111
+ }
112
+ }
113
+
114
+ // Fallback to Gemini CLI (agy) if Qwen failed or unavailable
115
+ if (!success) {
116
+ console.log('📡 Falling back to Gemini CLI (agy)...');
117
+ try {
118
+ const agyBin = 'agy';
119
+ const cmd = `"${agyBin}" --model gemini-3.5-flash --print "${prompt.replace(/"/g, '\\"')}" < /dev/null`;
120
+ finalOutput = execSync(cmd, { encoding: 'utf8', timeout: 60000 });
121
+ success = true;
122
+ } catch (e) {
123
+ console.error('❌ Fallback to Gemini CLI also failed:', e.message);
124
+ }
125
+ }
126
+
127
+ // Clean up temporary file
128
+ try {
129
+ if (fs.existsSync(tempInputFile)) {
130
+ fs.unlinkSync(tempInputFile);
131
+ }
132
+ } catch (_) {}
133
+
134
+ // Output results
135
+ if (success) {
136
+ if (outputFile) {
137
+ fs.mkdirSync(path.dirname(outputFile), { recursive: true });
138
+ fs.writeFileSync(outputFile, finalOutput, 'utf8');
139
+ console.log(`✅ Output written to ${outputFile}`);
140
+ } else {
141
+ process.stdout.write(finalOutput);
142
+ }
143
+ process.exit(0);
144
+ } else {
145
+ console.error('❌ Failed to execute code step with both Qwen and fallback Gemini.');
146
+ process.exit(1);
147
+ }
@@ -1,9 +1,10 @@
1
1
  {
2
2
  "name": "mobile-ios",
3
3
  "auto_install": false,
4
- "description": "iOS development skills: Xcode, Swift, SwiftUI, reverse engineering, build optimization, and SPM analysis",
4
+ "description": "iOS development skills: Xcode, Swift, SwiftUI, reverse engineering, build optimization, visual QA, and SPM analysis",
5
5
  "skills": [
6
6
  "ios-engineer",
7
+ "ios-visual-qa-strategist",
7
8
  "smali-to-swift",
8
9
  "swiftui-pro",
9
10
  "xcode-build-benchmark",
@@ -11,6 +12,7 @@
11
12
  "xcode-build-orchestrator",
12
13
  "xcode-compilation-analyzer",
13
14
  "xcode-project-analyzer",
14
- "spm-build-analysis"
15
+ "spm-build-analysis",
16
+ "ios-simulator-skill"
15
17
  ]
16
18
  }
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "name": "reverse-engineering",
3
3
  "auto_install": false,
4
+ "hidden": true,
4
5
  "description": "Android & iOS remote engineering, decompilation, code porting, and smali modding capabilities",
5
6
  "skills": [
6
7
  "smali-to-kotlin",
package/skills/CATALOG.md CHANGED
@@ -36,6 +36,26 @@
36
36
  | 15 | `spec-gate` | `auto` | Gate 2 check fail | 2 | 1.0.0 | ✅ Active |
37
37
  | 16 | `visual-design-gate` | `auto` | Gate 2.5 check fail | 2.5 | 1.0.0 | ✅ Active |
38
38
  | 17 | `trello-sync` | `auto` | Always | 2 | 3.0.0 | ✅ Active |
39
+ | 18 | `animal-island-ui-style` | `manual` | keywords (动物森友会, 可爱圆润 UI) | — | 1.0.0 | ✅ Active |
40
+ | 19 | `ios-visual-qa-strategist` | `manual` | iOS visual QA, simulator screenshots, minimal capture testing | — | 1.0.0 | ✅ Active |
41
+ | 20 | `ios-simulator-skill` | `manual` | iOS app building, testing, and simulator control | — | 1.5.0 | ✅ Active |
42
+ | 21 | `unity-game-development` | `manual` | Unity C# coding, ScriptableObjects, and profiling | — | 1.0.0 | ✅ Active |
43
+ | 22 | `godot-game-development` | `manual` | Godot 4 GDScript, composition and signal design | — | 1.0.0 | ✅ Active |
44
+ | 23 | `expo-game-development` | `manual` | Expo/React Native Skia/GL game loop optimization | — | 1.0.0 | ✅ Active |
45
+ | 24 | `ai-music` | `manual` | generate music, make a song, AI music, soundtrack, jingle, compose, inpaint music | — | 1.0.0 | ✅ Active |
46
+ | 25 | `game-developer` | `manual` | Unity, Unreal Engine, ECS architecture, game physics, multiplayer networking, shader programming, game AI | — | 1.1.0 | ✅ Active |
47
+
48
+ ---
49
+
50
+ ## Ponytail (Code Minimalism)
51
+
52
+ > Adapted from [DietrichGebert/ponytail](https://github.com/DietrichGebert/ponytail) (MIT).
53
+ > Enforces lazy senior dev coding: YAGNI, stdlib/native first, no unrequested abstractions.
54
+
55
+ | # | Skill | Type | Trigger | Priority | Version | Status |
56
+ |---|-------|------|---------|----------|---------|--------|
57
+ | 26 | `awf-ponytail` | `auto` | `.project-identity` check (default ON) | 7.6 | 1.0.0 | ✅ Active |
58
+ | 27 | `awf-ponytail-review` | `manual` | `/ponytail-review`, "what can we delete", Gate 5 | — | 1.0.0 | ✅ Active |
39
59
 
40
60
  ---
41
61
 
package/skills/GEMINI.md CHANGED
@@ -78,6 +78,14 @@ Mỗi skill tự xử lý gate logic riêng — xem SKILL.md của từng skill.
78
78
  - Code/Docs/Comments: Tiếng Anh.
79
79
  - Kết thúc task: Tóm tắt + Test + Next steps.
80
80
  - Không rõ: Hỏi lại, tối đa 2 lần.
81
+ - Tài liệu thảo luận & brainstorm (Brief, Requirements, Brainstorm) PHẢI dùng tiếng Việt (hoặc ngôn ngữ giao tiếp của User), chỉ Code/Architecture mới bắt buộc dùng tiếng Anh.
82
+
83
+ ### Brainstorm & Plan Integrity (BPIP)
84
+ - CẤM ghi đè (overwrite) toàn bộ BRIEF.md hoặc plan.md khi tinh chỉnh ý tưởng.
85
+ - PHẢI sử dụng công cụ sửa code (replace_file_content) để cập nhật từng phần.
86
+ - PHẢI duy trì bảng Revision History ở đầu mỗi file design/planning.
87
+ - PHẢI lưu bản sao dự phòng vào `docs/history/` trước khi sửa đổi lớn (định dạng `[filename].v[N].md`, ví dụ: `implementation_plan.v1.md`).
88
+ - CẤM dồn tất cả các phiên/tính năng vào một file `implementation_plan.md` duy nhất. PHẢI tách thành các kế hoạch phân mảnh (ví dụ: `implementation_plan.v2.md` hoặc `implementation_plan_feature.md`) và duy trì liên kết ngữ cảnh (Chain of Plans) đến phiên trước kèm tóm tắt ngắn ở đầu file mới.
81
89
 
82
90
  ### Anti-sycophancy (Trung thực)
83
91
  - PHẢI push back khi approach của user có vấn đề — giải thích rõ trade-offs.
@@ -119,7 +127,7 @@ Khi AI cần tự quyết định mà không hỏi user:
119
127
  - Risk HIGH/CRITICAL → PHẢI cảnh báo user trước khi sửa.
120
128
  - Explore code lạ → ưu tiên `gitnexus_query` thay vì grep thủ công.
121
129
  - Rename symbol → PHẢI dùng `gitnexus_rename` (dry_run trước).
122
- - Index stale → cảnh báo "⚠️ chạy `npx gitnexus analyze`".
130
+ - Index stale → cảnh báo "⚠️ chạy `pnpm dlx gitnexus analyze` (hoặc `npx gitnexus analyze`)".
123
131
  - Chi tiết: xem `gitnexus-intelligence/SKILL.md`.
124
132
 
125
133
  ### Two-Agent Flow (Conductor)
@@ -19,6 +19,16 @@
19
19
  | ship-to-code | Code porting, migration, language translation | ship-to-code/SKILL.md | 🟢 |
20
20
  | visual-design-gate | Gate 2.5 UI/UX design sync | visual-design-gate/SKILL.md | 🟢 |
21
21
  | module-spec-writer | Gate 1.5 COMPLEX + >3 modules | module-spec-writer/SKILL.md | 🟢 |
22
+ | animal-island-ui-style | Animal Crossing (动物森友会) style, animal-island-ui, 可爱圆润风格 UI | animal-island-ui-style/SKILL.md | 🟢 |
23
+ | i18n-orchestrator | Translation, localization, i18n, translations, file ngôn ngữ | i18n-orchestrator/SKILL.md | 🟢 |
24
+ | ios-visual-qa-strategist | iOS visual QA, SwiftUI/UIKit app testing, simulator screenshots, minimal screenshot capture | ios-visual-qa-strategist/SKILL.md | 🟢 |
25
+ | ios-simulator-skill | iOS app testing, building, simulator control, accessibility mapping, and simulator automation | ios-simulator-skill/SKILL.md | 🟢 |
26
+ | unity-game-development | Unity, C#, MonoBehaviour, ScriptableObject, FixedUpdate, object pool | unity-game-development/SKILL.md | 🟢 |
27
+ | godot-game-development | Godot, GDScript, CharacterBody2D, CharacterBody3D, autoload, signal.connect | godot-game-development/SKILL.md | 🟢 |
28
+ | expo-game-development | Expo game, React Native Skia, expo-gl, requestAnimationFrame, expo-av, GestureHandler | expo-game-development/SKILL.md | 🟢 |
29
+ | ai-music | generate music, make a song, AI music, background music, soundtrack, jingle, theme music, royalty-free music, compose, music with lyrics, extend music, fix this song, inpaint music, runcomfy music | ai-music/SKILL.md | 🟢 |
30
+ | game-developer | Unity, Unreal Engine, game development, ECS architecture, game physics, multiplayer networking, game optimization, shader programming, game AI, object pooling, state machine, LOD | game-developer/SKILL.md | 🟢 |
31
+
22
32
 
23
33
  ## File Guards
24
34