@leejungkiin/awkit 1.3.8 → 1.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. package/bin/awk.js +630 -52
  2. package/bin/claude-generators.js +122 -0
  3. package/core/AGENTS.md +54 -0
  4. package/core/CLAUDE.md +155 -0
  5. package/core/GEMINI.md +44 -9
  6. package/core/GEMINI.md.bak +126 -199
  7. package/package.json +1 -1
  8. package/skills/ai-sprite-maker/SKILL.md +81 -0
  9. package/skills/ai-sprite-maker/scripts/animate_sprite.py +102 -0
  10. package/skills/ai-sprite-maker/scripts/process_sprites.py +140 -0
  11. package/skills/awf-session-restore/SKILL.md +12 -2
  12. package/skills/brainstorm-agent/SKILL.md +11 -8
  13. package/skills/code-review/SKILL.md +21 -33
  14. package/skills/gitnexus/gitnexus-cli/SKILL.md +82 -0
  15. package/skills/gitnexus/gitnexus-debugging/SKILL.md +89 -0
  16. package/skills/gitnexus/gitnexus-exploring/SKILL.md +78 -0
  17. package/skills/gitnexus/gitnexus-guide/SKILL.md +64 -0
  18. package/skills/gitnexus/gitnexus-impact-analysis/SKILL.md +97 -0
  19. package/skills/gitnexus/gitnexus-refactoring/SKILL.md +121 -0
  20. package/skills/lucylab-tts/SKILL.md +64 -0
  21. package/skills/lucylab-tts/resources/voices_library.json +908 -0
  22. package/skills/lucylab-tts/scripts/.env +1 -0
  23. package/skills/lucylab-tts/scripts/lucylab_tts.py +506 -0
  24. package/skills/nm-memory-sync/SKILL.md +14 -1
  25. package/skills/orchestrator/SKILL.md +5 -38
  26. package/skills/ship-to-code/SKILL.md +115 -0
  27. package/skills/short-maker/SKILL.md +150 -0
  28. package/skills/short-maker/_backup/storyboard.html +106 -0
  29. package/skills/short-maker/_backup/video_mixer.py +296 -0
  30. package/skills/short-maker/outputs/fitbite-promo/background.jpg +0 -0
  31. package/skills/short-maker/outputs/fitbite-promo/final/promo-final.mp4 +0 -0
  32. package/skills/short-maker/outputs/fitbite-promo/script.md +19 -0
  33. package/skills/short-maker/outputs/fitbite-promo/segments/scene-01.mp4 +0 -0
  34. package/skills/short-maker/outputs/fitbite-promo/segments/scene-02.mp4 +0 -0
  35. package/skills/short-maker/outputs/fitbite-promo/segments/scene-03.mp4 +0 -0
  36. package/skills/short-maker/outputs/fitbite-promo/segments/scene-04.mp4 +0 -0
  37. package/skills/short-maker/outputs/fitbite-promo/storyboard/scene-01.png +0 -0
  38. package/skills/short-maker/outputs/fitbite-promo/storyboard/scene-02.png +0 -0
  39. package/skills/short-maker/outputs/fitbite-promo/storyboard/scene-03.png +0 -0
  40. package/skills/short-maker/outputs/fitbite-promo/storyboard/scene-04.png +0 -0
  41. package/skills/short-maker/outputs/fitbite-promo/storyboard.html +133 -0
  42. package/skills/short-maker/outputs/fitbite-promo/storyboard.json +38 -0
  43. package/skills/short-maker/outputs/fitbite-promo/temp/merged_chroma.mp4 +0 -0
  44. package/skills/short-maker/outputs/fitbite-promo/temp/merged_crossfaded.mp4 +0 -0
  45. package/skills/short-maker/outputs/fitbite-promo/temp/ready_00.mp4 +0 -0
  46. package/skills/short-maker/outputs/fitbite-promo/temp/ready_01.mp4 +0 -0
  47. package/skills/short-maker/outputs/fitbite-promo/temp/ready_02.mp4 +0 -0
  48. package/skills/short-maker/outputs/fitbite-promo/temp/ready_03.mp4 +0 -0
  49. package/skills/short-maker/outputs/fitbite-promo/tts/manifest.json +31 -0
  50. package/skills/short-maker/outputs/fitbite-promo/tts/scene-01.wav +0 -0
  51. package/skills/short-maker/outputs/fitbite-promo/tts/scene-02.wav +0 -0
  52. package/skills/short-maker/outputs/fitbite-promo/tts/scene-03.wav +0 -0
  53. package/skills/short-maker/outputs/fitbite-promo/tts/scene-04.wav +0 -0
  54. package/skills/short-maker/outputs/fitbite-promo/tts_script.txt +11 -0
  55. package/skills/short-maker/scripts/google-flow-cli/.project-identity +41 -0
  56. package/skills/short-maker/scripts/google-flow-cli/.trae/rules/project_rules.md +52 -0
  57. package/skills/short-maker/scripts/google-flow-cli/CODEBASE.md +67 -0
  58. package/skills/short-maker/scripts/google-flow-cli/GoogleFlowCli.code-workspace +29 -0
  59. package/skills/short-maker/scripts/google-flow-cli/README.md +168 -0
  60. package/skills/short-maker/scripts/google-flow-cli/docs/specs/PROJECT.md +12 -0
  61. package/skills/short-maker/scripts/google-flow-cli/docs/specs/REQUIREMENTS.md +22 -0
  62. package/skills/short-maker/scripts/google-flow-cli/docs/specs/ROADMAP.md +16 -0
  63. package/skills/short-maker/scripts/google-flow-cli/docs/specs/TECH-SPEC.md +13 -0
  64. package/skills/short-maker/scripts/google-flow-cli/gflow/__init__.py +3 -0
  65. package/skills/short-maker/scripts/google-flow-cli/gflow/api/__init__.py +19 -0
  66. package/skills/short-maker/scripts/google-flow-cli/gflow/api/client.py +1921 -0
  67. package/skills/short-maker/scripts/google-flow-cli/gflow/api/models.py +64 -0
  68. package/skills/short-maker/scripts/google-flow-cli/gflow/api/rpc_ids.py +98 -0
  69. package/skills/short-maker/scripts/google-flow-cli/gflow/auth/__init__.py +15 -0
  70. package/skills/short-maker/scripts/google-flow-cli/gflow/auth/browser_auth.py +692 -0
  71. package/skills/short-maker/scripts/google-flow-cli/gflow/auth/humanizer.py +417 -0
  72. package/skills/short-maker/scripts/google-flow-cli/gflow/auth/proxy_ext.py +120 -0
  73. package/skills/short-maker/scripts/google-flow-cli/gflow/auth/recaptcha.py +482 -0
  74. package/skills/short-maker/scripts/google-flow-cli/gflow/batchexecute/__init__.py +5 -0
  75. package/skills/short-maker/scripts/google-flow-cli/gflow/batchexecute/client.py +414 -0
  76. package/skills/short-maker/scripts/google-flow-cli/gflow/cli/__init__.py +1 -0
  77. package/skills/short-maker/scripts/google-flow-cli/gflow/cli/main.py +1075 -0
  78. package/skills/short-maker/scripts/google-flow-cli/pyproject.toml +36 -0
  79. package/skills/short-maker/scripts/google-flow-cli/script.txt +22 -0
  80. package/skills/short-maker/scripts/google-flow-cli/tests/__init__.py +0 -0
  81. package/skills/short-maker/scripts/google-flow-cli/tests/test_batchexecute.py +113 -0
  82. package/skills/short-maker/scripts/google-flow-cli/tests/test_client.py +190 -0
  83. package/skills/short-maker/templates/aida_script.md +40 -0
  84. package/skills/short-maker/templates/mimic_analyzer.md +29 -0
  85. package/skills/single-flow-task-execution/SKILL.md +412 -0
  86. package/skills/single-flow-task-execution/code-quality-reviewer-prompt.md +20 -0
  87. package/skills/single-flow-task-execution/implementer-prompt.md +78 -0
  88. package/skills/single-flow-task-execution/spec-reviewer-prompt.md +61 -0
  89. package/skills/skill-creator/SKILL.md +44 -0
  90. package/skills/spm-build-analysis/SKILL.md +92 -0
  91. package/skills/spm-build-analysis/references/build-optimization-sources.md +155 -0
  92. package/skills/spm-build-analysis/references/recommendation-format.md +85 -0
  93. package/skills/spm-build-analysis/references/spm-analysis-checks.md +105 -0
  94. package/skills/spm-build-analysis/scripts/check_spm_pins.py +118 -0
  95. package/skills/symphony-enforcer/SKILL.md +83 -97
  96. package/skills/symphony-orchestrator/SKILL.md +1 -1
  97. package/skills/trello-sync/SKILL.md +52 -45
  98. package/skills/verification-gate/SKILL.md +13 -2
  99. package/skills/xcode-build-benchmark/SKILL.md +88 -0
  100. package/skills/xcode-build-benchmark/references/benchmark-artifacts.md +94 -0
  101. package/skills/xcode-build-benchmark/references/benchmarking-workflow.md +67 -0
  102. package/skills/xcode-build-benchmark/schemas/build-benchmark.schema.json +230 -0
  103. package/skills/xcode-build-benchmark/scripts/benchmark_builds.py +308 -0
  104. package/skills/xcode-build-fixer/SKILL.md +218 -0
  105. package/skills/xcode-build-fixer/references/build-settings-best-practices.md +216 -0
  106. package/skills/xcode-build-fixer/references/fix-patterns.md +290 -0
  107. package/skills/xcode-build-fixer/references/recommendation-format.md +85 -0
  108. package/skills/xcode-build-fixer/scripts/benchmark_builds.py +308 -0
  109. package/skills/xcode-build-orchestrator/SKILL.md +156 -0
  110. package/skills/xcode-build-orchestrator/references/benchmark-artifacts.md +94 -0
  111. package/skills/xcode-build-orchestrator/references/build-settings-best-practices.md +216 -0
  112. package/skills/xcode-build-orchestrator/references/orchestration-report-template.md +143 -0
  113. package/skills/xcode-build-orchestrator/references/recommendation-format.md +85 -0
  114. package/skills/xcode-build-orchestrator/scripts/benchmark_builds.py +308 -0
  115. package/skills/xcode-build-orchestrator/scripts/diagnose_compilation.py +273 -0
  116. package/skills/xcode-build-orchestrator/scripts/generate_optimization_report.py +533 -0
  117. package/skills/xcode-compilation-analyzer/SKILL.md +89 -0
  118. package/skills/xcode-compilation-analyzer/references/build-optimization-sources.md +155 -0
  119. package/skills/xcode-compilation-analyzer/references/code-compilation-checks.md +106 -0
  120. package/skills/xcode-compilation-analyzer/references/recommendation-format.md +85 -0
  121. package/skills/xcode-compilation-analyzer/scripts/diagnose_compilation.py +273 -0
  122. package/skills/xcode-project-analyzer/SKILL.md +76 -0
  123. package/skills/xcode-project-analyzer/references/build-optimization-sources.md +155 -0
  124. package/skills/xcode-project-analyzer/references/build-settings-best-practices.md +216 -0
  125. package/skills/xcode-project-analyzer/references/project-audit-checks.md +101 -0
  126. package/skills/xcode-project-analyzer/references/recommendation-format.md +85 -0
  127. package/templates/CODEBASE.md +26 -42
  128. package/templates/configs/trello-config.json +2 -2
  129. package/templates/workflow_dual_mode_template.md +5 -5
  130. package/workflows/_uncategorized/conductor-codex.md +125 -0
  131. package/workflows/_uncategorized/conductor.md +97 -0
  132. package/workflows/_uncategorized/ship-to-code.md +85 -0
  133. package/workflows/_uncategorized/trello-sync.md +52 -0
  134. package/workflows/context/codebase-sync.md +10 -87
  135. package/workflows/quality/visual-debug.md +66 -12
@@ -0,0 +1,19 @@
1
+ # FitBite Pro - Promo Script (Green Screen)
2
+
3
+ **Concept:** A modern fitness coach avatar on a green screen, explaining the core value of FitBite Pro. The background will be replaced later in video_mixer.
4
+
5
+ ## Scene 1: Hook (Attention)
6
+ - **Visual:** A young enthusiastic female fitness coach wearing sports attire, pointing directly at the camera with an excited but empathetic expression. She is standing on a solid chroma green screen background.
7
+ - **Audio (Vietnamese):** Gặp khó khăn khi theo dõi dinh dưỡng hàng ngày?
8
+
9
+ ## Scene 2: Interest
10
+ - **Visual:** The same fitness coach looking at a modern smartphone in her hand, smiling broadly. Solid chroma green screen background.
11
+ - **Audio (Vietnamese):** FitBite Pro với AI thông minh sẽ tự động lên thực đơn chuẩn y khoa cho bạn.
12
+
13
+ ## Scene 3: Desire
14
+ - **Visual:** The fitness coach standing in a strong, confident pose with arms crossed, nodding approvingly. Solid chroma green screen background.
15
+ - **Audio (Vietnamese):** Báo cáo chi tiết, giao diện tối ưu hoàn hảo cho cả iPad.
16
+
17
+ ## Scene 4: Action (CTA)
18
+ - **Visual:** The fitness coach showing a "Download now" gesture with both hands pointing down. Solid chroma green screen background.
19
+ - **Audio (Vietnamese):** Tải ngay FitBite Pro trên App Store để thay đổi vóc dáng!
@@ -0,0 +1,133 @@
1
+ <!DOCTYPE html>
2
+ <html lang="vi">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Storyboard Preview</title>
7
+ <style>
8
+ :root {
9
+ --bg: #121212; --card-bg: #1E1E1E; --text: #E0E0E0; --accent: #BB86FC; --accent-hover: #9965f4;
10
+ }
11
+ body {
12
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
13
+ background-color: var(--bg); color: var(--text); padding: 20px;
14
+ }
15
+ header { text-align: center; margin-bottom: 30px; }
16
+ h1 { margin: 0; color: var(--accent); }
17
+ .meta { color: #888; font-size: 0.9em; margin-top: 5px; }
18
+ .grid {
19
+ display: grid; grid-template-columns: repeat(auto-fill, minmax(320px, 1fr)); gap: 20px;
20
+ }
21
+ .card {
22
+ background: var(--card-bg); border-radius: 12px; overflow: hidden;
23
+ box-shadow: 0 4px 6px rgba(0,0,0,0.3); border: 1px solid #333;
24
+ }
25
+ .card-img-wrapper { position: relative; padding-top: 56.25%; /* 16:9 Aspect Ratio */ background: #000; }
26
+ .card img {
27
+ position: absolute; top: 0; left: 0; width: 100%; height: 100%; object-fit: cover;
28
+ }
29
+ .scene-number {
30
+ position: absolute; top: 10px; left: 10px; background: rgba(0,0,0,0.7);
31
+ color: #fff; padding: 4px 8px; border-radius: 6px; font-weight: bold; font-size: 0.8em;
32
+ }
33
+ .card-content { padding: 15px; }
34
+ .duration { color: var(--accent); font-weight: bold; font-size: 0.9em; margin-bottom: 8px; }
35
+ .script { font-size: 1em; line-height: 1.4; margin-bottom: 12px; }
36
+ .prompt { font-size: 0.8em; color: #888; font-style: italic; background: #2a2a2a; padding: 8px; border-radius: 6px; }
37
+ .timeline-bar {
38
+ height: 6px; background: #333; margin-top: 30px; border-radius: 3px; position: relative; overflow: hidden;
39
+ }
40
+ .timeline-progress { height: 100%; background: var(--accent); width: 0%; }
41
+ </style>
42
+ </head>
43
+ <body>
44
+
45
+ <header>
46
+ <h1 id="title">Loading Storyboard...</h1>
47
+ <div class="meta" id="meta">Duration: 0s</div>
48
+ </header>
49
+
50
+ <div class="timeline-bar">
51
+ <div class="timeline-progress" id="timeline"></div>
52
+ </div>
53
+
54
+ <div class="grid" id="grid">
55
+ <!-- Cards will be injected here -->
56
+ </div>
57
+
58
+ <script>
59
+ async function loadStoryboard() {
60
+ const data = {
61
+ "title": "FitBite Pro - Promo Storyboard",
62
+ "duration": 12,
63
+ "target_format": "16:9",
64
+ "scenes": [
65
+ {
66
+ "id": "1",
67
+ "duration": 3,
68
+ "image": "storyboard/scene-01.png",
69
+ "script": "Gặp khó khăn khi theo dõi dinh dưỡng hàng ngày?",
70
+ "prompt": "A young enthusiastic female fitness coach wearing modern sports attire..."
71
+ },
72
+ {
73
+ "id": "2",
74
+ "duration": 3,
75
+ "image": "storyboard/scene-02.png",
76
+ "script": "FitBite Pro với AI thông minh sẽ tự động lên thực đơn chuẩn y khoa cho bạn.",
77
+ "prompt": "A young enthusiastic female fitness coach looking at a smartphone..."
78
+ },
79
+ {
80
+ "id": "3",
81
+ "duration": 3,
82
+ "image": "storyboard/scene-03.png",
83
+ "script": "Báo cáo chi tiết, giao diện tối ưu hoàn hảo cho cả iPad.",
84
+ "prompt": "A young enthusiastic female fitness coach standing in a strong confident pose..."
85
+ },
86
+ {
87
+ "id": "4",
88
+ "duration": 3,
89
+ "image": "storyboard/scene-04.png",
90
+ "script": "Tải ngay FitBite Pro trên App Store để thay đổi vóc dáng!",
91
+ "prompt": "A young enthusiastic female fitness coach showing a download now gesture..."
92
+ }
93
+ ]
94
+ };
95
+
96
+ document.getElementById('title').textContent = data.title || 'App Promo Storyboard';
97
+ document.getElementById('meta').textContent = `Total Duration: ${data.duration || 0}s | Video Target: ${data.target_format || '16:9'}`;
98
+
99
+ const grid = document.getElementById('grid');
100
+ grid.innerHTML = '';
101
+
102
+ let totalTime = data.duration || 1; // avoid /0
103
+ let cumulative = 0;
104
+
105
+ data.scenes.forEach((scene, index) => {
106
+ cumulative += scene.duration;
107
+
108
+ const card = document.createElement('div');
109
+ card.className = 'card';
110
+ card.innerHTML = `
111
+ <div class="card-img-wrapper">
112
+ <img src="${scene.image || 'https://via.placeholder.com/640x360?text=Generating+Image...'}" alt="Scene ${scene.id}">
113
+ <div class="scene-number">Scene ${scene.id}</div>
114
+ </div>
115
+ <div class="card-content">
116
+ <div class="duration">⏱️ ${scene.duration}s</div>
117
+ <div class="script">🎙️ "${scene.script}"</div>
118
+ <div class="prompt">🎨 Prompt: ${scene.prompt}</div>
119
+ </div>
120
+ `;
121
+ grid.appendChild(card);
122
+ });
123
+
124
+ // Setup dumb timeline animation for fun
125
+ const timeline = document.getElementById('timeline');
126
+ timeline.style.width = '100%';
127
+ timeline.style.transition = `width ${data.duration}s linear`;
128
+ }
129
+
130
+ loadStoryboard();
131
+ </script>
132
+ </body>
133
+ </html>
@@ -0,0 +1,38 @@
1
+ {
2
+ "project": "fitbite-promo",
3
+ "background_music": "energetic_corporate_pop",
4
+ "scenes": [
5
+ {
6
+ "id": "scene-01",
7
+ "type": "hook",
8
+ "image_prompt": "A young enthusiastic female fitness coach wearing modern sports attire, pointing directly at the camera with an excited but empathetic expression, standing on a solid chroma green screen background, highly detailed, cinematic lighting, 8k resolution.",
9
+ "video_prompt": "A young enthusiastic female fitness coach wearing modern sports attire, pointing directly at the camera with an excited but empathetic expression, standing on a solid chroma green screen background. She speaks with a British accent: \"Struggling to keep track of your daily nutrition?\". High quality, smooth motion, 4k.",
10
+ "tts_text": "Struggling to keep track of your daily nutrition?",
11
+ "status": "pending_image"
12
+ },
13
+ {
14
+ "id": "scene-02",
15
+ "type": "interest",
16
+ "image_prompt": "A young enthusiastic female fitness coach wearing modern sports attire, looking at a modern smartphone in her hand and smiling broadly, standing on a solid chroma green screen background, highly detailed, cinematic lighting, 8k resolution.",
17
+ "video_prompt": "A young enthusiastic female fitness coach wearing modern sports attire, looking at a modern smartphone in her hand and smiling broadly, standing on a solid chroma green screen background. She speaks with a British accent: \"FitWitness, with its smart AI, will automatically create medically approved meal plans for you.\". High quality, smooth motion, 4k.",
18
+ "tts_text": "FitWitness, with its smart AI, will automatically create medically approved meal plans for you.",
19
+ "status": "pending_image"
20
+ },
21
+ {
22
+ "id": "scene-03",
23
+ "type": "desire",
24
+ "image_prompt": "A young enthusiastic female fitness coach wearing modern sports attire, standing in a strong confident pose with arms crossed, nodding approvingly, standing on a solid chroma green screen background, highly detailed, cinematic lighting, 8k resolution.",
25
+ "video_prompt": "A young enthusiastic female fitness coach wearing modern sports attire, standing in a strong confident pose with arms crossed, nodding approvingly, standing on a solid chroma green screen background. She speaks with a British accent: \"Detailed reports, and an interface perfectly optimised for iPad.\". High quality, smooth motion, 4k.",
26
+ "tts_text": "Detailed reports, and an interface perfectly optimised for iPad.",
27
+ "status": "pending_image"
28
+ },
29
+ {
30
+ "id": "scene-04",
31
+ "type": "action",
32
+ "image_prompt": "A young enthusiastic female fitness coach wearing modern sports attire, showing a download now gesture by pointing down with both index fingers, standing on a solid chroma green screen background, highly detailed, cinematic lighting, 8k resolution.",
33
+ "video_prompt": "A young enthusiastic female fitness coach wearing modern sports attire, showing a download now gesture by pointing down with both index fingers, standing on a solid chroma green screen background. She speaks with a British accent: \"Download FitWitness on the App Store today to transform your body!\". High quality, smooth motion, 4k.",
34
+ "tts_text": "Download FitWitness on the App Store today to transform your body!",
35
+ "status": "pending_image"
36
+ }
37
+ ]
38
+ }
@@ -0,0 +1,31 @@
1
+ {
2
+ "endpoint": "https://api.lucylab.io/json-rpc",
3
+ "speed": 1.0,
4
+ "blockVersion": 0,
5
+ "mode": "script-scenes",
6
+ "voices": [
7
+ {
8
+ "id": "nqak8C85bsAG5mihyunRkj",
9
+ "name": "Chi Chi",
10
+ "slug": "chi-chi"
11
+ }
12
+ ],
13
+ "items": [
14
+ {
15
+ "label": "scene-01",
16
+ "text": "Gặp khó khăn khi theo dõi dinh dưỡng hàng ngày?"
17
+ },
18
+ {
19
+ "label": "scene-02",
20
+ "text": "FitBite Pro với AI thông minh sẽ tự động lên thực đơn chuẩn y khoa cho bạn."
21
+ },
22
+ {
23
+ "label": "scene-03",
24
+ "text": "Báo cáo chi tiết, giao diện tối ưu hoàn hảo cho cả iPad."
25
+ },
26
+ {
27
+ "label": "scene-04",
28
+ "text": "Tải ngay FitBite Pro trên App Store để thay đổi vóc dáng!"
29
+ }
30
+ ]
31
+ }
@@ -0,0 +1,11 @@
1
+ SCENE 1:
2
+ Tông giọng: 'Gặp khó khăn khi theo dõi dinh dưỡng hàng ngày?'
3
+
4
+ SCENE 2:
5
+ Tông giọng: 'FitBite Pro với AI thông minh sẽ tự động lên thực đơn chuẩn y khoa cho bạn.'
6
+
7
+ SCENE 3:
8
+ Tông giọng: 'Báo cáo chi tiết, giao diện tối ưu hoàn hảo cho cả iPad.'
9
+
10
+ SCENE 4:
11
+ Tông giọng: 'Tải ngay FitBite Pro trên App Store để thay đổi vóc dáng!'
@@ -0,0 +1,41 @@
1
+ {
2
+ "_comments": {
3
+ "projectId": "Auto-generated. DO NOT change — used by Symphony for task scoping.",
4
+ "trello": "Fill in your Trello board/list/card names. Run \"awkit trello info\" to verify."
5
+ },
6
+ "projectName": "GoogleFlowCli",
7
+ "projectId": "googleflowcli",
8
+ "projectType": "mobile-firebase",
9
+ "bundleIdentifier": "com.company.googleflowcli",
10
+ "primaryLanguage": "en",
11
+ "techStack": {
12
+ "platform": "Mobile",
13
+ "backend": "Firebase"
14
+ },
15
+ "services": {
16
+ "firebase": {
17
+ "enabled": true,
18
+ "features": [
19
+ "analytics",
20
+ "crashlytics",
21
+ "remote-config",
22
+ "auth"
23
+ ]
24
+ }
25
+ },
26
+ "trello": {
27
+ "board": "Your Board Name",
28
+ "list": "Your List Name",
29
+ "card": "Your Card Name"
30
+ },
31
+ "projectStage": "development",
32
+ "codingStandards": {
33
+ "language": "en",
34
+ "namingConvention": "camelCase",
35
+ "indentation": "spaces-4",
36
+ "lineLength": 120
37
+ },
38
+ "projectGoals": [],
39
+ "createdDate": "2026-03-29",
40
+ "lastUpdated": "2026-03-29"
41
+ }
@@ -0,0 +1,52 @@
1
+ # Project Rules (gflow)
2
+
3
+ ## Cost Model
4
+
5
+ - Image generation is free (0 credits).
6
+ - Video generation costs 20 credits per video.
7
+
8
+ ## Workflow Optimization (Credits)
9
+
10
+ - Default to images first: use image generation to validate prompts, style, character consistency, and scene composition.
11
+ - Only generate videos after explicit approval that the image storyboard is acceptable.
12
+ - When videos are required, minimize iterations:
13
+ - Keep prompts stable and only adjust one variable at a time.
14
+ - Prefer shorter runs (e.g., single segment) before multi-segment/extended workflows.
15
+ - Avoid unnecessary retries or batch runs unless requested.
16
+
17
+ ## Output Planning
18
+
19
+ - For scripts/storyboards: generate one image per scene first, then move to video generation.
20
+ - Always save outputs under `outputs/` with a predictable naming scheme (scene/seg numbering).
21
+
22
+ ## Voiceover (TTS)
23
+
24
+ - Videos generated by Flow may come without voice. Treat voice as a separate pipeline step.
25
+ - TTS is mandatory via LucyLab JSON-RPC only (use runtime config, avoid keeping local capture/log files in repo).
26
+ - Do not use local TTS (e.g., macOS `say`) in this project.
27
+
28
+ ## TTS Tooling
29
+
30
+ - **LucyLab batch TTS script**: `python lucylab_tts.py`
31
+ - Token handling:
32
+ - Use environment variable `LUCYLAB_BEARER` (do not store bearer tokens in repo files).
33
+ - Voice selection:
34
+ - Prefer explicit `--voice <id>[:name]` to avoid storing voice catalogs in repo.
35
+ - If a voice catalog is needed for AI selection, keep a compact library file with only `items[].{id,name,description,tag}`.
36
+ - Common usage:
37
+ - Plain text:
38
+ - `LUCYLAB_BEARER=... python lucylab_tts.py --out-dir outputs/tts-lucylab --voice <id>:<name> --text "..." `
39
+ - Script mode (extracts thoại from `SCENE ... '...')`:
40
+ - `LUCYLAB_BEARER=... python lucylab_tts.py --out-dir outputs/tts-lucylab --voice <id>:<name> --text-file script.txt`
41
+ - Build compact voice library from a captured log file:
42
+ - `python lucylab_tts.py --voice-json voice.json --export-voice-library voices_library.json`
43
+ - Build split voice library folder (load only one chunk/category into AI context):
44
+ - `python lucylab_tts.py --voice-json voice.json --export-voice-library outputs/voice_library`
45
+ - **Audio to video merge** (ffmpeg): add the generated voiceover track to the final merged video after transitions.
46
+ - Output naming convention:
47
+ - Video without VO: `outputs/.../script-full.mp4`
48
+ - Video with VO: `outputs/.../script-full-vo.mp4`
49
+
50
+ ## Safety
51
+
52
+ - Never commit or share bearer tokens (e.g., from `tts_curl.txt`). Use `LUCYLAB_BEARER` and keep local-only artifacts under `outputs/`.
@@ -0,0 +1,67 @@
1
+ # GoogleFlowCli — Codebase Map
2
+
3
+ > **Project Type:** mobile-firebase | **Tech Stack:** Mobile + Firebase
4
+ > **Last Synced:** 2026-03-29
5
+
6
+ > [!NOTE]
7
+ > AI PHẢI đọc file này TRƯỚC KHI dùng `grep_search` / `codebase_search` / `list_dir`.
8
+ > Đọc → xác định target → search cụ thể. KHÔNG search "mù".
9
+
10
+ ---
11
+
12
+ ## 🗺️ Directory Structure
13
+
14
+ ```
15
+ src/
16
+ ├── features/
17
+ ├── services/
18
+ └── models/
19
+ ```
20
+
21
+ ---
22
+
23
+ ## 📁 File Index
24
+
25
+ > Compact format: `path` → purpose (1 line mỗi file)
26
+
27
+ ### Core / Infrastructure
28
+
29
+ | Path | Purpose |
30
+ |------|---------|
31
+ | `{{CORE_FILE_1}}` | {{PURPOSE_1}} |
32
+ | `{{CORE_FILE_2}}` | {{PURPOSE_2}} |
33
+
34
+ ### Features
35
+
36
+ | Path | Purpose |
37
+ |------|---------|
38
+ | `{{FEATURE_FILE_1}}` | {{PURPOSE_1}} |
39
+ | `{{FEATURE_FILE_2}}` | {{PURPOSE_2}} |
40
+
41
+ ### UI / Views
42
+
43
+ | Path | Purpose |
44
+ |------|---------|
45
+ | `{{VIEW_FILE_1}}` | {{PURPOSE_1}} |
46
+ | `{{VIEW_FILE_2}}` | {{PURPOSE_2}} |
47
+
48
+ > ⚠️ Thêm file mới vào section phù hợp. Dùng `/codebase-sync` để auto-update.
49
+
50
+ ---
51
+
52
+ ## 🔑 Key Files
53
+
54
+ | File | Purpose |
55
+ |------|---------|
56
+ | `.project-identity` | AI project context |
57
+ | `CODEBASE.md` | This file — codebase map for AI |
58
+
59
+ ---
60
+
61
+ ## 📝 Notes
62
+
63
+ _Architecture decisions, gotchas, và context quan trọng._
64
+
65
+ ---
66
+
67
+ *Auto-generated by `awkit init` — keep updated with `/codebase-sync`*
@@ -0,0 +1,29 @@
1
+ {
2
+ "folders": [
3
+ {
4
+ "path": "."
5
+ }
6
+ ],
7
+ "settings": {
8
+ "editor.formatOnSave": true,
9
+ "editor.tabSize": 4,
10
+ "files.exclude": {
11
+ "**/.DS_Store": true,
12
+ "**/node_modules": true,
13
+ "**/.git": true,
14
+ "**/build": false,
15
+ "**/.gradle": false,
16
+ "**/DerivedData": false
17
+ },
18
+ "files.watcherExclude": {
19
+ "**/node_modules/**": true,
20
+ "**/build/**": true,
21
+ "**/DerivedData/**": true
22
+ }
23
+ },
24
+ "extensions": {
25
+ "recommendations": [
26
+ "github.copilot"
27
+ ]
28
+ }
29
+ }
@@ -0,0 +1,168 @@
1
+ # gflow — CLI for Google Flow
2
+
3
+ A command-line interface to [Google Flow](https://flow.google) (AI image & video generation), built using the same reverse-engineering approach as [tmc/nlm](https://github.com/tmc/nlm) for NotebookLM.
4
+
5
+ Lets AI agents and scripts generate images/videos via Google Flow without the GUI.
6
+
7
+ ## Architecture
8
+
9
+ ```
10
+ ┌────────────────────────────────────┐
11
+ │ CLI Layer (click) │ gflow/cli/main.py
12
+ │ generate-image, generate-video, │
13
+ │ list, download, collections, raw │
14
+ ├────────────────────────────────────┤
15
+ │ API Client (FlowClient) │ gflow/api/client.py
16
+ │ High-level ops, polling, parsing │
17
+ ├────────────────────────────────────┤
18
+ │ BatchExecute Protocol │ gflow/batchexecute/client.py
19
+ │ RPC encoding, SAPISIDHASH, │
20
+ │ chunked response decoding │
21
+ ├────────────────────────────────────┤
22
+ │ Browser Auth │ gflow/auth/browser_auth.py
23
+ │ Cookie extraction from Chrome, │
24
+ │ Selenium interactive login │
25
+ └────────────────────────────────────┘
26
+ ```
27
+
28
+ This is the same layered architecture as `tmc/nlm`:
29
+ - **Auth** extracts Google cookies from your browser (browser_cookie3 or Selenium)
30
+ - **BatchExecute** encodes RPCs into Google's wire format and decodes responses
31
+ - **API Client** wraps BatchExecute with typed methods for each Flow feature
32
+ - **CLI** exposes everything as clean subcommands
33
+
34
+ ## Install
35
+
36
+ ```bash
37
+ pip install -e .
38
+ ```
39
+
40
+ Or with optional Selenium support for interactive login:
41
+ ```bash
42
+ pip install -e ".[dev]"
43
+ pip install selenium
44
+ ```
45
+
46
+ ## Quick Start
47
+
48
+ ```bash
49
+ # 1. Authenticate (extracts cookies from your Chrome browser)
50
+ gflow auth
51
+
52
+ # 2. Generate an image
53
+ gflow generate-image "a cat astronaut floating in space"
54
+
55
+ # 3. Generate a video
56
+ gflow generate-video "a timelapse of a flower blooming"
57
+
58
+ # 4. List your assets
59
+ gflow list
60
+
61
+ # 5. Download an asset
62
+ gflow download <asset-id> -o output.png
63
+ ```
64
+
65
+ ## Setup: Discovering RPC IDs
66
+
67
+ Google Flow uses the same BatchExecute protocol as NotebookLM, but with different RPC endpoint IDs. You need to discover these by inspecting network traffic:
68
+
69
+ 1. Open [flow.google](https://flow.google) in Chrome
70
+ 2. Open DevTools → Network tab
71
+ 3. Filter requests by `batchexecute`
72
+ 4. Perform an action (e.g., generate an image)
73
+ 5. In the request payload, find the `rpcids` parameter — that's the RPC ID
74
+ 6. Update `gflow/api/rpc_ids.py` with the real ID
75
+
76
+ Check which IDs are configured:
77
+ ```bash
78
+ gflow rpc-ids
79
+ ```
80
+
81
+ Use raw mode to test discovered IDs:
82
+ ```bash
83
+ gflow raw "xYz123" --args '["my prompt", "16:9"]'
84
+ ```
85
+
86
+ ## Commands
87
+
88
+ | Command | Description |
89
+ |---------|-------------|
90
+ | `gflow auth` | Authenticate with Google Flow |
91
+ | `gflow auth --status` | Check auth status |
92
+ | `gflow auth --clear` | Clear saved credentials |
93
+ | `gflow generate-image PROMPT` | Generate images (Imagen 4) |
94
+ | `gflow generate-video PROMPT` | Generate videos (Veo 3.1) |
95
+ | `gflow list` | List assets in your library |
96
+ | `gflow get ASSET_ID` | Get asset details |
97
+ | `gflow download ASSET_ID` | Download an asset |
98
+ | `gflow delete ASSET_ID` | Delete an asset |
99
+ | `gflow collections list` | List collections |
100
+ | `gflow collections create NAME` | Create a collection |
101
+ | `gflow collections add COL_ID ASSET_ID` | Add asset to collection |
102
+ | `gflow raw RPC_ID` | Execute raw RPC (discovery mode) |
103
+ | `gflow rpc-ids` | Show configured RPC IDs |
104
+
105
+ All commands support `--json` for machine-readable output (ideal for scripts/agents).
106
+
107
+ ## Environment Variables
108
+
109
+ | Variable | Description |
110
+ |----------|-------------|
111
+ | `GFLOW_AUTH_TOKEN` | Auth token (overrides saved credentials) |
112
+ | `GFLOW_COOKIES` | Cookie string (overrides saved credentials) |
113
+ | `GFLOW_CHROME_PATH` | Path to Chrome executable |
114
+ | `GFLOW_DEBUG` | Set to `true` for debug output |
115
+
116
+ ## For AI Agents / Scripts
117
+
118
+ Every command supports `--json` output:
119
+
120
+ ```bash
121
+ # Generate and get JSON response
122
+ gflow generate-image "a logo" --json | jq '.[0].url'
123
+
124
+ # List assets as JSON for processing
125
+ gflow list --type image --json | jq '.[].id'
126
+
127
+ # Pipeline: generate, wait, download
128
+ ASSET_ID=$(gflow generate-video "ocean waves" --json | jq -r '.[0].id')
129
+ gflow download "$ASSET_ID" -o waves.mp4
130
+ ```
131
+
132
+ ## How It Works (Same as tmc/nlm)
133
+
134
+ 1. **Browser Auth**: Extracts Google cookies from Chrome/Brave/Edge profiles using `browser_cookie3`, then fetches the XSRF token from the Flow page HTML
135
+ 2. **BatchExecute Protocol**: Encodes RPC calls into Google's `batchexecute` wire format — form-encoded POST with nested JSON arrays, SAPISIDHASH authorization header
136
+ 3. **Response Decoding**: Parses Google's chunked response format (byte-count prefixed JSON chunks with `wrb.fr` markers and multi-layer JSON encoding)
137
+ 4. **Retry Logic**: Exponential backoff for transient errors (429, 500, 502, 503, 504)
138
+
139
+ ## Project Structure
140
+
141
+ ```
142
+ gflow-py/
143
+ ├── pyproject.toml # Package config & dependencies
144
+ ├── README.md
145
+ ├── gflow/
146
+ │ ├── __init__.py
147
+ │ ├── auth/
148
+ │ │ ├── __init__.py
149
+ │ │ └── browser_auth.py # Cookie extraction & Selenium login
150
+ │ ├── batchexecute/
151
+ │ │ ├── __init__.py
152
+ │ │ └── client.py # Google BatchExecute protocol
153
+ │ ├── api/
154
+ │ │ ├── __init__.py
155
+ │ │ ├── client.py # FlowClient (high-level API)
156
+ │ │ ├── models.py # Pydantic models (Asset, Collection, etc.)
157
+ │ │ └── rpc_ids.py # RPC endpoint IDs (fill these in!)
158
+ │ └── cli/
159
+ │ ├── __init__.py
160
+ │ └── main.py # Click CLI commands
161
+ └── tests/
162
+ ├── __init__.py
163
+ └── test_batchexecute.py # Unit tests
164
+ ```
165
+
166
+ ## License
167
+
168
+ MIT
@@ -0,0 +1,12 @@
1
+ # Project Vision: GoogleFlowCli
2
+
3
+ GoogleFlowCli (gflow) is a streamlined CLI-based workflow and pipeline for generating AI videos systematically, optimizing for cost (credits) and consistency.
4
+
5
+ ## Target Audience
6
+ Video creators, AI filmmakers, and developers needing a structured bulk generation framework with separate audio pipelines.
7
+
8
+ ## Success Metrics
9
+ - Stable, consistent video outputs based on predictable image storyboards.
10
+ - High cost efficiency by validating free image scenes before running 20-credit video generations.
11
+ - Automated, seamless merging of generated high-quality voiceovers using the LucyLab pipeline.
12
+ - Secure token handling and artifact management.