@leejungkiin/awkit 1.6.5 → 1.6.8

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 (35) hide show
  1. package/README.md +121 -130
  2. package/bin/awk.js +111 -8
  3. package/package.json +5 -3
  4. package/schemas/onboarding-screen.schema.json +108 -0
  5. package/scripts/__pycache__/openrouter_image_gen.cpython-311.pyc +0 -0
  6. package/scripts/cockpit-quota.js +93 -0
  7. package/scripts/openrouter_image_gen.py +772 -0
  8. package/scripts/video-analyzer.js +172 -0
  9. package/skills/CATALOG.md +2 -1
  10. package/skills/ai-sprite-maker/SKILL.md +27 -6
  11. package/skills/ai-sprite-maker/scripts/__pycache__/remove_chroma_key.cpython-311.pyc +0 -0
  12. package/skills/ai-sprite-maker/scripts/remove_chroma_key.py +440 -0
  13. package/skills/awf-caveman/SKILL.md +65 -0
  14. package/skills/expo-build-optimizer/SKILL.md +33 -0
  15. package/skills/ios-app-store-audit/SKILL.md +48 -0
  16. package/skills/ios-expert-coder/SKILL.md +45 -0
  17. package/skills/mascot-designer/SKILL.md +66 -0
  18. package/skills/mascot-designer/examples/witny-case-study.md +35 -0
  19. package/skills/orchestrator/SKILL.md +20 -0
  20. package/skills/short-maker/scripts/google-flow-cli/README.md +227 -115
  21. package/skills/short-maker/scripts/google-flow-cli/gflow/api/client.py +32 -3
  22. package/skills/short-maker/scripts/google-flow-cli/gflow/api/models.py +4 -2
  23. package/skills/short-maker/scripts/google-flow-cli/gflow/cli/main.py +33 -6
  24. package/skills/short-maker/scripts/google-flow-cli/pyproject.toml +1 -1
  25. package/skills/verification-gate/SKILL.md +4 -0
  26. package/templates/help.html +21 -0
  27. package/templates/project-identity/android.json +24 -0
  28. package/templates/project-identity/backend-nestjs.json +24 -0
  29. package/templates/project-identity/expo.json +24 -0
  30. package/templates/project-identity/ios.json +24 -0
  31. package/templates/project-identity/web-nextjs.json +24 -0
  32. package/templates/specs/design-template.md +71 -161
  33. package/templates/specs/requirements-template.md +133 -65
  34. package/workflows/ui/create-spec-architect.md +80 -50
  35. package/workflows/ui/image-gen.md +118 -0
@@ -0,0 +1,108 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "title": "Onboarding Quiz Funnel Configuration",
4
+ "description": "Schema for defining a highly-converting, behaviorally-driven onboarding quiz funnel.",
5
+ "type": "object",
6
+ "required": ["funnelId", "screens"],
7
+ "properties": {
8
+ "funnelId": {
9
+ "type": "string",
10
+ "description": "Unique identifier for this onboarding funnel."
11
+ },
12
+ "defaultMascotId": {
13
+ "type": "string",
14
+ "description": "ID of the default mascot to use if a screen doesn't override it."
15
+ },
16
+ "screens": {
17
+ "type": "array",
18
+ "description": "An ordered array of screens the user will navigate through.",
19
+ "items": {
20
+ "$ref": "#/definitions/Screen"
21
+ }
22
+ }
23
+ },
24
+ "definitions": {
25
+ "Screen": {
26
+ "type": "object",
27
+ "required": ["id", "phase", "type", "title"],
28
+ "properties": {
29
+ "id": {
30
+ "type": "string",
31
+ "description": "Unique identifier for the screen."
32
+ },
33
+ "phase": {
34
+ "type": "string",
35
+ "enum": ["hook", "therapy", "objection", "labor_illusion", "reveal", "paywall"],
36
+ "description": "The psychological phase this screen belongs to."
37
+ },
38
+ "type": {
39
+ "type": "string",
40
+ "enum": ["intro", "single_choice", "multi_choice", "slider", "loading_simulation", "summary", "paywall"],
41
+ "description": "The functional UI type of the screen."
42
+ },
43
+ "title": {
44
+ "type": "string",
45
+ "description": "Main heading or question displayed to the user."
46
+ },
47
+ "subtitle": {
48
+ "type": "string",
49
+ "description": "Secondary text providing context or reassurance."
50
+ },
51
+ "mascotState": {
52
+ "type": "string",
53
+ "enum": ["none", "greeting", "thinking", "encouraging", "empathizing", "analyzing", "presenting", "celebrating", "idle"],
54
+ "description": "The emotional state of the virtual coach to display."
55
+ },
56
+ "progressSpeed": {
57
+ "type": "string",
58
+ "enum": ["fast", "normal", "slow", "jump"],
59
+ "description": "Manipulative progress bar speed for this screen."
60
+ },
61
+ "options": {
62
+ "type": "array",
63
+ "description": "Choices presented to the user (for single_choice or multi_choice types).",
64
+ "items": {
65
+ "$ref": "#/definitions/Option"
66
+ }
67
+ },
68
+ "loadingConfiguration": {
69
+ "type": "object",
70
+ "description": "Configuration specifically for labor_illusion screens.",
71
+ "properties": {
72
+ "durationMs": { "type": "integer" },
73
+ "fakeSteps": {
74
+ "type": "array",
75
+ "items": { "type": "string" }
76
+ }
77
+ }
78
+ }
79
+ }
80
+ },
81
+ "Option": {
82
+ "type": "object",
83
+ "required": ["id", "label"],
84
+ "properties": {
85
+ "id": {
86
+ "type": "string"
87
+ },
88
+ "label": {
89
+ "type": "string",
90
+ "description": "The text displayed on the button."
91
+ },
92
+ "icon": {
93
+ "type": "string",
94
+ "description": "Optional icon identifier for the option."
95
+ },
96
+ "tagsToApply": {
97
+ "type": "array",
98
+ "description": "List of tags to assign to the user if they select this option.",
99
+ "items": { "type": "string" }
100
+ },
101
+ "reinforcementMessage": {
102
+ "type": "string",
103
+ "description": "An intermittent reinforcement message to show after selecting this option (e.g., '70% of our users feel the same way.')."
104
+ }
105
+ }
106
+ }
107
+ }
108
+ }
@@ -0,0 +1,93 @@
1
+ const fs = require('fs');
2
+ const path = require('path');
3
+ const os = require('os');
4
+
5
+ const C = {
6
+ reset: '\x1b[0m',
7
+ green: '\x1b[32m',
8
+ yellow: '\x1b[33m',
9
+ red: '\x1b[31m',
10
+ cyan: '\x1b[36m',
11
+ bold: '\x1b[1m',
12
+ gray: '\x1b[90m',
13
+ };
14
+
15
+ function cmdQuota(args) {
16
+ const quotaDir = path.join(os.homedir(), '.antigravity_cockpit', 'cache', 'quota_api_v1_plugin', 'authorized');
17
+
18
+ if (!fs.existsSync(quotaDir)) {
19
+ console.log(`${C.yellow}⚠️ Cockpit quota cache not found at ${quotaDir}${C.reset}`);
20
+ return;
21
+ }
22
+
23
+ const files = fs.readdirSync(quotaDir).filter(f => f.endsWith('.json'));
24
+ if (files.length === 0) {
25
+ console.log(`${C.yellow}⚠️ No authorized quota files found. Make sure Cockpit extension is logged in.${C.reset}`);
26
+ return;
27
+ }
28
+
29
+ let allAccounts = [];
30
+
31
+ for (const file of files) {
32
+ try {
33
+ const data = JSON.parse(fs.readFileSync(path.join(quotaDir, file), 'utf8'));
34
+ if (data && data.email && data.payload && data.payload.models) {
35
+ allAccounts.push(data);
36
+ }
37
+ } catch (e) {
38
+ // ignore parse error
39
+ }
40
+ }
41
+
42
+ if (allAccounts.length === 0) {
43
+ console.log(`${C.yellow}⚠️ Quota files unreadable.${C.reset}`);
44
+ return;
45
+ }
46
+
47
+ // Sort by most recently updated
48
+ allAccounts.sort((a, b) => (b.updatedAt || 0) - (a.updatedAt || 0));
49
+
50
+ console.log(`${C.cyan}${C.bold}🚀 AI Model Quota Status (Antigravity Cockpit)${C.reset}\n`);
51
+
52
+ for (const account of allAccounts) {
53
+ const timeAgoMs = Date.now() - (account.updatedAt || Date.now());
54
+ const timeAgoMins = Math.round(Math.max(0, timeAgoMs) / 60000);
55
+ console.log(`${C.bold}📧 Account: ${account.email}${C.reset} ${C.gray}(Updated ${timeAgoMins} mins ago)${C.reset}`);
56
+
57
+ const models = Object.values(account.payload.models).filter(m => m.quotaInfo && m.quotaInfo.remainingFraction !== undefined);
58
+
59
+ if (models.length === 0) {
60
+ console.log(` ${C.gray}No models found with quota info.${C.reset}\n`);
61
+ continue;
62
+ }
63
+
64
+ // Sort by displayName length to pad
65
+ const maxLen = Math.max(...models.map(m => (m.displayName || m.model).length));
66
+
67
+ // Sort models by displayName for consistent viewing
68
+ models.sort((a, b) => (a.displayName || a.model).localeCompare(b.displayName || b.model));
69
+
70
+ for (const m of models) {
71
+ const name = (m.displayName || m.model).padEnd(maxLen);
72
+ const fraction = m.quotaInfo.remainingFraction;
73
+ const pct = (fraction * 100).toFixed(2).padStart(6, ' ') + '%';
74
+
75
+ let color = C.green;
76
+ if (fraction <= 0.2) color = C.red;
77
+ else if (fraction < 0.5) color = C.yellow;
78
+
79
+ let resetTimeStr = '';
80
+ if (m.quotaInfo.resetTime) {
81
+ const resetDate = new Date(m.quotaInfo.resetTime);
82
+ if (resetDate.getTime() > Date.now()) {
83
+ resetTimeStr = ` (Resets: ${resetDate.toLocaleTimeString()})`;
84
+ }
85
+ }
86
+
87
+ console.log(` ${name} : ${color}${pct}${C.reset}${C.gray}${resetTimeStr}${C.reset}`);
88
+ }
89
+ console.log('');
90
+ }
91
+ }
92
+
93
+ module.exports = { cmdQuota };