@growthub/cli 0.3.59 → 0.4.1

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 (72) hide show
  1. package/assets/worker-kits/growthub-custom-workspace-starter-v1/.env.example +10 -0
  2. package/assets/worker-kits/growthub-custom-workspace-starter-v1/QUICKSTART.md +44 -0
  3. package/assets/worker-kits/growthub-custom-workspace-starter-v1/brands/NEW-CLIENT.md +10 -0
  4. package/assets/worker-kits/growthub-custom-workspace-starter-v1/brands/_template/brand-kit.md +27 -0
  5. package/assets/worker-kits/growthub-custom-workspace-starter-v1/brands/growthub/brand-kit.md +25 -0
  6. package/assets/worker-kits/growthub-custom-workspace-starter-v1/bundles/growthub-custom-workspace-starter-v1.json +47 -0
  7. package/assets/worker-kits/growthub-custom-workspace-starter-v1/docs/fork-sync-integration.md +32 -0
  8. package/assets/worker-kits/growthub-custom-workspace-starter-v1/docs/starter-kit-overview.md +26 -0
  9. package/assets/worker-kits/growthub-custom-workspace-starter-v1/docs/vite-ui-shell-guide.md +24 -0
  10. package/assets/worker-kits/growthub-custom-workspace-starter-v1/examples/workspace-sample.md +10 -0
  11. package/assets/worker-kits/growthub-custom-workspace-starter-v1/growthub-meta/README.md +3 -0
  12. package/assets/worker-kits/growthub-custom-workspace-starter-v1/growthub-meta/kit-standard.md +10 -0
  13. package/assets/worker-kits/growthub-custom-workspace-starter-v1/kit.json +101 -0
  14. package/assets/worker-kits/growthub-custom-workspace-starter-v1/output/README.md +3 -0
  15. package/assets/worker-kits/growthub-custom-workspace-starter-v1/output-standards.md +11 -0
  16. package/assets/worker-kits/growthub-custom-workspace-starter-v1/runtime-assumptions.md +8 -0
  17. package/assets/worker-kits/growthub-custom-workspace-starter-v1/setup/check-deps.sh +20 -0
  18. package/assets/worker-kits/growthub-custom-workspace-starter-v1/setup/verify-env.mjs +20 -0
  19. package/assets/worker-kits/growthub-custom-workspace-starter-v1/skills.md +14 -0
  20. package/assets/worker-kits/growthub-custom-workspace-starter-v1/studio/index.html +12 -0
  21. package/assets/worker-kits/growthub-custom-workspace-starter-v1/studio/package.json +20 -0
  22. package/assets/worker-kits/growthub-custom-workspace-starter-v1/studio/serve.mjs +42 -0
  23. package/assets/worker-kits/growthub-custom-workspace-starter-v1/studio/src/App.jsx +32 -0
  24. package/assets/worker-kits/growthub-custom-workspace-starter-v1/studio/src/app.css +20 -0
  25. package/assets/worker-kits/growthub-custom-workspace-starter-v1/studio/src/main.jsx +10 -0
  26. package/assets/worker-kits/growthub-custom-workspace-starter-v1/studio/vite.config.js +8 -0
  27. package/assets/worker-kits/growthub-custom-workspace-starter-v1/templates/agent-contract.md +9 -0
  28. package/assets/worker-kits/growthub-custom-workspace-starter-v1/templates/deployment-plan.md +22 -0
  29. package/assets/worker-kits/growthub-custom-workspace-starter-v1/templates/workspace-brief.md +11 -0
  30. package/assets/worker-kits/growthub-custom-workspace-starter-v1/validation-checklist.md +13 -0
  31. package/assets/worker-kits/growthub-custom-workspace-starter-v1/workers/custom-workspace-operator/CLAUDE.md +32 -0
  32. package/assets/worker-kits/growthub-zernio-social-v1/.env.example +5 -0
  33. package/assets/worker-kits/growthub-zernio-social-v1/QUICKSTART.md +36 -4
  34. package/assets/worker-kits/growthub-zernio-social-v1/bundles/growthub-zernio-social-v1.json +30 -1
  35. package/assets/worker-kits/growthub-zernio-social-v1/docs/growthub-agentic-social-platform-ui-shell.md +134 -0
  36. package/assets/worker-kits/growthub-zernio-social-v1/docs/local-adapters.md +2 -2
  37. package/assets/worker-kits/growthub-zernio-social-v1/growthub-meta/README.md +5 -8
  38. package/assets/worker-kits/growthub-zernio-social-v1/growthub-meta/kit-standard.md +1 -1
  39. package/assets/worker-kits/growthub-zernio-social-v1/kit.json +33 -1
  40. package/assets/worker-kits/growthub-zernio-social-v1/skills.md +1 -1
  41. package/assets/worker-kits/growthub-zernio-social-v1/studio/.env.example +3 -0
  42. package/assets/worker-kits/growthub-zernio-social-v1/studio/dist/assets/index-DTmBMuXr.js +78 -0
  43. package/assets/worker-kits/growthub-zernio-social-v1/studio/dist/assets/index-gHr-nTMF.css +1 -0
  44. package/assets/worker-kits/growthub-zernio-social-v1/studio/dist/index.html +14 -0
  45. package/assets/worker-kits/growthub-zernio-social-v1/studio/index.html +13 -0
  46. package/assets/worker-kits/growthub-zernio-social-v1/studio/package-lock.json +1677 -0
  47. package/assets/worker-kits/growthub-zernio-social-v1/studio/package.json +20 -0
  48. package/assets/worker-kits/growthub-zernio-social-v1/studio/serve.mjs +60 -0
  49. package/assets/worker-kits/growthub-zernio-social-v1/studio/src/App.jsx +130 -0
  50. package/assets/worker-kits/growthub-zernio-social-v1/studio/src/api.js +146 -0
  51. package/assets/worker-kits/growthub-zernio-social-v1/studio/src/app.css +558 -0
  52. package/assets/worker-kits/growthub-zernio-social-v1/studio/src/lib/rules.js +64 -0
  53. package/assets/worker-kits/growthub-zernio-social-v1/studio/src/lib/templates.js +207 -0
  54. package/assets/worker-kits/growthub-zernio-social-v1/studio/src/main.jsx +10 -0
  55. package/assets/worker-kits/growthub-zernio-social-v1/studio/src/views/Accounts.jsx +57 -0
  56. package/assets/worker-kits/growthub-zernio-social-v1/studio/src/views/Agent.jsx +167 -0
  57. package/assets/worker-kits/growthub-zernio-social-v1/studio/src/views/Analytics.jsx +164 -0
  58. package/assets/worker-kits/growthub-zernio-social-v1/studio/src/views/ApiKeys.jsx +143 -0
  59. package/assets/worker-kits/growthub-zernio-social-v1/studio/src/views/Automations.jsx +122 -0
  60. package/assets/worker-kits/growthub-zernio-social-v1/studio/src/views/CommentRules.jsx +592 -0
  61. package/assets/worker-kits/growthub-zernio-social-v1/studio/src/views/Compose.jsx +185 -0
  62. package/assets/worker-kits/growthub-zernio-social-v1/studio/src/views/Dashboard.jsx +87 -0
  63. package/assets/worker-kits/growthub-zernio-social-v1/studio/src/views/Inbox.jsx +144 -0
  64. package/assets/worker-kits/growthub-zernio-social-v1/studio/src/views/Queues.jsx +167 -0
  65. package/assets/worker-kits/growthub-zernio-social-v1/studio/src/views/Scheduled.jsx +85 -0
  66. package/assets/worker-kits/growthub-zernio-social-v1/studio/src/views/Sequences.jsx +160 -0
  67. package/assets/worker-kits/growthub-zernio-social-v1/studio/src/views/Templates.jsx +275 -0
  68. package/assets/worker-kits/growthub-zernio-social-v1/studio/vite.config.js +7 -0
  69. package/assets/worker-kits/growthub-zernio-social-v1/workers/zernio-social-operator/CLAUDE.md +3 -3
  70. package/dist/index.js +1183 -592
  71. package/package.json +1 -1
  72. package/assets/worker-kits/growthub-zernio-social-v1/docs/postiz-ui-shell-integration.md +0 -166
@@ -0,0 +1,143 @@
1
+ import { useState, useEffect, useCallback } from 'react';
2
+ import { api } from '../api.js';
3
+ import { useApp } from '../App.jsx';
4
+
5
+ export default function ApiKeys() {
6
+ const { showToast } = useApp();
7
+ const [keys, setKeys] = useState([]);
8
+ const [loading, setLoading] = useState(true);
9
+ const [revoking, setRevoking] = useState(null);
10
+ const [creating, setCreating] = useState(false);
11
+ const [showForm, setShowForm] = useState(false);
12
+ const [scope, setScope] = useState('read-write');
13
+ const [permission, setPerm] = useState('full');
14
+ const [newKey, setNewKey] = useState(null);
15
+
16
+ const load = useCallback(() => {
17
+ api.getApiKeys()
18
+ .then(d => setKeys(d.keys || d.apiKeys || []))
19
+ .catch(e => showToast(e.message, false))
20
+ .finally(() => setLoading(false));
21
+ }, []);
22
+
23
+ useEffect(load, [load]);
24
+
25
+ const create = async () => {
26
+ setCreating(true);
27
+ try {
28
+ const res = await api.createApiKey({ scope, permission });
29
+ setNewKey(res.key || res.apiKey || res);
30
+ showToast('API key created ✓');
31
+ setShowForm(false);
32
+ load();
33
+ } catch (e) {
34
+ showToast(e.message, false);
35
+ } finally {
36
+ setCreating(false);
37
+ }
38
+ };
39
+
40
+ const revoke = async (id) => {
41
+ if (!confirm('Revoke this API key? This cannot be undone.')) return;
42
+ setRevoking(id);
43
+ try {
44
+ await api.deleteApiKey(id);
45
+ showToast('Key revoked');
46
+ load();
47
+ } catch (e) {
48
+ showToast(e.message, false);
49
+ } finally {
50
+ setRevoking(null);
51
+ }
52
+ };
53
+
54
+ if (loading) return <div className="loading-row"><span className="spinner" />Loading API keys…</div>;
55
+
56
+ return (
57
+ <div>
58
+ <div className="row mb16" style={{ justifyContent: 'space-between' }}>
59
+ <div className="section-title" style={{ marginBottom: 0 }}>{keys.length} API Key{keys.length !== 1 ? 's' : ''}</div>
60
+ <button className="btn btn-primary btn-sm" onClick={() => { setShowForm(f => !f); setNewKey(null); }}>
61
+ {showForm ? '✕ Cancel' : '+ New Key'}
62
+ </button>
63
+ </div>
64
+
65
+ {newKey && (
66
+ <div className="banner banner-ok mb16">
67
+ <div style={{ fontWeight: 600, marginBottom: 4 }}>New key created — copy it now, it will not be shown again</div>
68
+ <div style={{ fontFamily: 'monospace', fontSize: 12, wordBreak: 'break-all' }}>{typeof newKey === 'string' ? newKey : JSON.stringify(newKey)}</div>
69
+ <button className="btn btn-ghost btn-sm mt8" onClick={() => { navigator.clipboard.writeText(typeof newKey === 'string' ? newKey : JSON.stringify(newKey)); showToast('Copied'); }}>
70
+ Copy
71
+ </button>
72
+ </div>
73
+ )}
74
+
75
+ {showForm && (
76
+ <div className="card mb16">
77
+ <div className="section-title mb16">Create API Key</div>
78
+ <div className="field">
79
+ <label>Scope</label>
80
+ <select className="select" value={scope} onChange={e => setScope(e.target.value)}>
81
+ <option value="read">read — list profiles, accounts, analytics, inbox</option>
82
+ <option value="read-write">read-write — everything including create/schedule posts</option>
83
+ </select>
84
+ </div>
85
+ <div className="field">
86
+ <label>Permission</label>
87
+ <select className="select" value={permission} onChange={e => setPerm(e.target.value)}>
88
+ <option value="full">full — any profile on account</option>
89
+ <option value="profiles-specific">profiles-specific — restricted to specific profile IDs</option>
90
+ </select>
91
+ </div>
92
+ <div className="row-end">
93
+ <button className="btn btn-primary" onClick={create} disabled={creating}>
94
+ {creating ? <><span className="spinner" style={{ marginRight: 7 }} />Creating…</> : 'Create Key'}
95
+ </button>
96
+ </div>
97
+ </div>
98
+ )}
99
+
100
+ {!keys.length && !showForm && (
101
+ <div className="empty">
102
+ <div className="empty-icon">🔑</div>
103
+ <div className="empty-msg">No API keys found.</div>
104
+ </div>
105
+ )}
106
+
107
+ {keys.length > 0 && (
108
+ <div className="table-wrap">
109
+ <table>
110
+ <thead>
111
+ <tr>
112
+ <th>Key ID</th>
113
+ <th>Scope</th>
114
+ <th>Permission</th>
115
+ <th>Created</th>
116
+ <th></th>
117
+ </tr>
118
+ </thead>
119
+ <tbody>
120
+ {keys.map(k => (
121
+ <tr key={k._id || k.id}>
122
+ <td style={{ fontFamily: 'monospace', fontSize: 12 }}>{k._id || k.id}</td>
123
+ <td><span className={`badge ${k.scope === 'read-write' ? 'badge-purple' : 'badge-neutral'}`}>{k.scope}</span></td>
124
+ <td><span className="badge badge-neutral">{k.permission || k.permissions || '—'}</span></td>
125
+ <td style={{ fontSize: 12, color: 'var(--muted)' }}>{k.createdAt ? new Date(k.createdAt).toLocaleDateString() : '—'}</td>
126
+ <td>
127
+ <button
128
+ className="btn btn-danger btn-xs"
129
+ onClick={() => revoke(k._id || k.id)}
130
+ disabled={revoking === (k._id || k.id)}
131
+ >
132
+ {revoking === (k._id || k.id) ? '…' : 'Revoke'}
133
+ </button>
134
+ </td>
135
+ </tr>
136
+ ))}
137
+ </tbody>
138
+ </table>
139
+ </div>
140
+ )}
141
+ </div>
142
+ );
143
+ }
@@ -0,0 +1,122 @@
1
+ import { useState, useEffect, useCallback } from 'react';
2
+ import { api } from '../api.js';
3
+ import { useApp } from '../App.jsx';
4
+
5
+ export default function Automations() {
6
+ const { showToast } = useApp();
7
+ const [automations, setAutomations] = useState([]);
8
+ const [loading, setLoading] = useState(true);
9
+ const [running, setRunning] = useState(null);
10
+ const [logs, setLogs] = useState({});
11
+ const [logsOpen, setLogsOpen] = useState(null);
12
+ const [logsLoading, setLogsLoading] = useState(false);
13
+
14
+ const load = useCallback(() => {
15
+ api.getAutomations()
16
+ .then(d => setAutomations(d.automations || d.data || []))
17
+ .catch(e => showToast(e.message, false))
18
+ .finally(() => setLoading(false));
19
+ }, []);
20
+
21
+ useEffect(load, [load]);
22
+
23
+ const run = async (id) => {
24
+ setRunning(id);
25
+ try {
26
+ await api.runAutomation(id);
27
+ showToast('Automation triggered ✓');
28
+ load();
29
+ } catch (e) {
30
+ showToast(e.message, false);
31
+ } finally {
32
+ setRunning(null);
33
+ }
34
+ };
35
+
36
+ const fetchLogs = async (id) => {
37
+ if (logsOpen === id) { setLogsOpen(null); return; }
38
+ setLogsOpen(id);
39
+ if (logs[id]) return;
40
+ setLogsLoading(true);
41
+ try {
42
+ const data = await api.getAutomationLogs(id);
43
+ setLogs(l => ({ ...l, [id]: data.logs || data.data || [] }));
44
+ } catch (e) {
45
+ showToast(e.message, false);
46
+ } finally {
47
+ setLogsLoading(false);
48
+ }
49
+ };
50
+
51
+ if (loading) return <div className="loading-row"><span className="spinner" />Loading automations…</div>;
52
+
53
+ if (!automations.length) return (
54
+ <div className="empty">
55
+ <div className="empty-icon">⚡</div>
56
+ <div className="empty-msg">No automations found on this account.<br />Create automations in the Zernio dashboard.</div>
57
+ </div>
58
+ );
59
+
60
+ return (
61
+ <div>
62
+ <div className="section-title mb16">{automations.length} Automation{automations.length !== 1 ? 's' : ''}</div>
63
+ {automations.map(a => {
64
+ const id = a._id || a.id;
65
+ return (
66
+ <div key={id} className="card mb16">
67
+ <div className="row mb8" style={{ justifyContent: 'space-between' }}>
68
+ <div>
69
+ <span style={{ fontWeight: 600 }}>{a.name || a.title || id}</span>
70
+ <span className={`badge ${a.status === 'active' ? 'badge-green' : 'badge-neutral'} ml8`} style={{ marginLeft: 10 }}>
71
+ {a.status || 'unknown'}
72
+ </span>
73
+ </div>
74
+ <div className="row">
75
+ <button className="btn btn-ghost btn-sm" onClick={() => fetchLogs(id)}>
76
+ {logsOpen === id ? 'Hide Logs' : 'Logs'}
77
+ </button>
78
+ <button className="btn btn-primary btn-sm" onClick={() => run(id)} disabled={running === id}>
79
+ {running === id ? <><span className="spinner" style={{ marginRight: 6 }} />Running…</> : '▶ Run'}
80
+ </button>
81
+ </div>
82
+ </div>
83
+ {a.description && <div style={{ fontSize: 12, color: 'var(--muted)', marginBottom: 6 }}>{a.description}</div>}
84
+ {a.trigger && <div style={{ fontSize: 12, color: 'var(--dim)' }}>Trigger: <span style={{ color: 'var(--accentl)', fontFamily: 'monospace' }}>{a.trigger}</span></div>}
85
+
86
+ {logsOpen === id && (
87
+ <div style={{ marginTop: 12 }}>
88
+ <div className="section-title mb8">Execution Logs</div>
89
+ {logsLoading ? (
90
+ <div className="loading-row"><span className="spinner" />Loading…</div>
91
+ ) : logs[id]?.length ? (
92
+ <div style={{ maxHeight: 220, overflow: 'auto' }}>
93
+ <table style={{ fontSize: 12 }}>
94
+ <thead><tr><th>Time</th><th>Status</th><th>Message</th></tr></thead>
95
+ <tbody>
96
+ {logs[id].map((l, i) => (
97
+ <tr key={i}>
98
+ <td style={{ fontFamily: 'monospace', whiteSpace: 'nowrap' }}>
99
+ {l.createdAt ? new Date(l.createdAt).toLocaleString() : '—'}
100
+ </td>
101
+ <td>
102
+ <span className={`badge ${l.status === 'success' ? 'badge-green' : l.status === 'error' ? 'badge-red' : 'badge-neutral'}`}>
103
+ {l.status}
104
+ </span>
105
+ </td>
106
+ <td style={{ color: 'var(--muted)' }}>{l.message || l.msg || '—'}</td>
107
+ </tr>
108
+ ))}
109
+ </tbody>
110
+ </table>
111
+ </div>
112
+ ) : (
113
+ <div style={{ color: 'var(--muted)', fontSize: 12 }}>No logs yet.</div>
114
+ )}
115
+ </div>
116
+ )}
117
+ </div>
118
+ );
119
+ })}
120
+ </div>
121
+ );
122
+ }