@automagik/genie 4.260330.4 → 4.260330.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +1 -1
- package/knip.json +1 -1
- package/openclaw.plugin.json +1 -1
- package/package.json +6 -2
- package/packages/genie-app/index.html +28 -0
- package/packages/genie-app/package.json +12 -3
- package/packages/genie-app/src/App.tsx +98 -0
- package/packages/genie-app/src/main.tsx +11 -0
- package/packages/genie-app/src-tauri/tauri.conf.json +2 -0
- package/packages/genie-app/tsconfig.json +1 -1
- package/packages/genie-app/vite.config.ts +14 -0
- package/plugins/genie/.claude-plugin/plugin.json +1 -1
- package/plugins/genie/package.json +1 -1
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
"plugins": [
|
|
11
11
|
{
|
|
12
12
|
"name": "genie",
|
|
13
|
-
"version": "4.260330.
|
|
13
|
+
"version": "4.260330.6",
|
|
14
14
|
"source": "./plugins/genie",
|
|
15
15
|
"description": "Human-AI partnership for Claude Code. Share a terminal, orchestrate workers, evolve together. Brainstorm ideas, wish them into plans, make with parallel agents, ship as one team. A coding genie that grows with your project."
|
|
16
16
|
}
|
package/knip.json
CHANGED
|
@@ -23,5 +23,5 @@
|
|
|
23
23
|
"project": ["src/**/*.ts", "src/**/*.tsx"],
|
|
24
24
|
"ignoreBinaries": ["tmux", "which"],
|
|
25
25
|
"ignoreExportsUsedInFile": false,
|
|
26
|
-
"ignoreDependencies": ["@tauri-apps/cli"]
|
|
26
|
+
"ignoreDependencies": ["@tauri-apps/cli", "react-dom", "@vitejs/plugin-react", "vite", "@types/react-dom"]
|
|
27
27
|
}
|
package/openclaw.plugin.json
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@automagik/genie",
|
|
3
|
-
"version": "4.260330.
|
|
3
|
+
"version": "4.260330.6",
|
|
4
4
|
"description": "Collaborative terminal toolkit for human + AI workflows",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -32,6 +32,7 @@
|
|
|
32
32
|
"pgserve": "^1.1.6",
|
|
33
33
|
"postgres": "^3.4.8",
|
|
34
34
|
"react": "^19.2.4",
|
|
35
|
+
"react-dom": "^19.2.4",
|
|
35
36
|
"uuid": "^11.1.0",
|
|
36
37
|
"zod": "^3.25.0"
|
|
37
38
|
},
|
|
@@ -44,10 +45,13 @@
|
|
|
44
45
|
"@types/js-yaml": "^4.0.9",
|
|
45
46
|
"@types/node": "^22.0.0",
|
|
46
47
|
"@types/react": "^19.2.14",
|
|
48
|
+
"@types/react-dom": "^19.0.0",
|
|
49
|
+
"@vitejs/plugin-react": "^4.5.2",
|
|
47
50
|
"esbuild": "^0.27.3",
|
|
48
51
|
"husky": "^9.1.7",
|
|
49
52
|
"knip": "^5.86.0",
|
|
50
|
-
"typescript": "^5.8.0"
|
|
53
|
+
"typescript": "^5.8.0",
|
|
54
|
+
"vite": "^6.3.5"
|
|
51
55
|
},
|
|
52
56
|
"repository": {
|
|
53
57
|
"type": "git",
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
|
+
<title>Genie</title>
|
|
7
|
+
<style>
|
|
8
|
+
* { margin: 0; padding: 0; box-sizing: border-box; }
|
|
9
|
+
html, body, #root { height: 100%; width: 100%; overflow: hidden; }
|
|
10
|
+
body {
|
|
11
|
+
background: #1a1028;
|
|
12
|
+
color: #e2e8f0;
|
|
13
|
+
font-family: 'JetBrains Mono', 'Fira Code', 'SF Mono', monospace;
|
|
14
|
+
-webkit-font-smoothing: antialiased;
|
|
15
|
+
}
|
|
16
|
+
/* Prevent text selection on nav elements */
|
|
17
|
+
[data-nav] { user-select: none; -webkit-user-select: none; }
|
|
18
|
+
/* Scrollbar styling */
|
|
19
|
+
::-webkit-scrollbar { width: 6px; height: 6px; }
|
|
20
|
+
::-webkit-scrollbar-track { background: #414868; }
|
|
21
|
+
::-webkit-scrollbar-thumb { background: #7aa2f7; border-radius: 3px; }
|
|
22
|
+
</style>
|
|
23
|
+
</head>
|
|
24
|
+
<body>
|
|
25
|
+
<div id="root"></div>
|
|
26
|
+
<script type="module" src="/src/main.tsx"></script>
|
|
27
|
+
</body>
|
|
28
|
+
</html>
|
|
@@ -9,14 +9,23 @@
|
|
|
9
9
|
"./components": "./components.ts",
|
|
10
10
|
"./views/*": "./views/*/ui/*.tsx"
|
|
11
11
|
},
|
|
12
|
+
"scripts": {
|
|
13
|
+
"dev": "vite",
|
|
14
|
+
"build": "vite build",
|
|
15
|
+
"preview": "vite preview"
|
|
16
|
+
},
|
|
12
17
|
"genieOs": {
|
|
13
18
|
"services": ["sidecar"]
|
|
14
19
|
},
|
|
15
|
-
"
|
|
16
|
-
"react": "
|
|
20
|
+
"dependencies": {
|
|
21
|
+
"react": "^19.2.4",
|
|
22
|
+
"react-dom": "^19.2.4"
|
|
17
23
|
},
|
|
18
24
|
"devDependencies": {
|
|
19
25
|
"typescript": "^5.8.0",
|
|
20
|
-
"@types/react": "^19.2.14"
|
|
26
|
+
"@types/react": "^19.2.14",
|
|
27
|
+
"@types/react-dom": "^19.0.0",
|
|
28
|
+
"@vitejs/plugin-react": "^4.5.2",
|
|
29
|
+
"vite": "^6.3.5"
|
|
21
30
|
}
|
|
22
31
|
}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { Suspense, useState } from 'react';
|
|
2
|
+
import { components } from '../components';
|
|
3
|
+
import { StatusBar } from '../lib/StatusBar';
|
|
4
|
+
import { theme } from '../lib/theme';
|
|
5
|
+
|
|
6
|
+
type ViewKey = keyof typeof components;
|
|
7
|
+
|
|
8
|
+
const NAV_ITEMS: Array<{ key: ViewKey; label: string; icon: string }> = [
|
|
9
|
+
{ key: 'dashboard', label: 'Dashboard', icon: '\u25c6' },
|
|
10
|
+
{ key: 'agents', label: 'Agents', icon: '\u25cb' },
|
|
11
|
+
{ key: 'tasks', label: 'Tasks', icon: '\u2610' },
|
|
12
|
+
{ key: 'terminal', label: 'Terminal', icon: '>' },
|
|
13
|
+
{ key: 'activity', label: 'Activity', icon: '\u2022' },
|
|
14
|
+
];
|
|
15
|
+
|
|
16
|
+
export function App() {
|
|
17
|
+
const [activeView, setActiveView] = useState<ViewKey>('dashboard');
|
|
18
|
+
|
|
19
|
+
const ActiveComponent = components[activeView];
|
|
20
|
+
|
|
21
|
+
return (
|
|
22
|
+
<div style={{ display: 'flex', flexDirection: 'column', height: '100vh', backgroundColor: theme.bg }}>
|
|
23
|
+
{/* Main area: sidebar + content */}
|
|
24
|
+
<div style={{ display: 'flex', flex: 1, overflow: 'hidden' }}>
|
|
25
|
+
{/* Sidebar nav */}
|
|
26
|
+
<nav
|
|
27
|
+
data-nav
|
|
28
|
+
style={{
|
|
29
|
+
width: '56px',
|
|
30
|
+
minWidth: '56px',
|
|
31
|
+
backgroundColor: theme.bgCard,
|
|
32
|
+
borderRight: `1px solid ${theme.border}`,
|
|
33
|
+
display: 'flex',
|
|
34
|
+
flexDirection: 'column',
|
|
35
|
+
alignItems: 'center',
|
|
36
|
+
paddingTop: '12px',
|
|
37
|
+
gap: '4px',
|
|
38
|
+
}}
|
|
39
|
+
>
|
|
40
|
+
{NAV_ITEMS.map((item) => {
|
|
41
|
+
const isActive = activeView === item.key;
|
|
42
|
+
return (
|
|
43
|
+
<button
|
|
44
|
+
key={item.key}
|
|
45
|
+
type="button"
|
|
46
|
+
title={item.label}
|
|
47
|
+
onClick={() => setActiveView(item.key)}
|
|
48
|
+
style={{
|
|
49
|
+
width: '40px',
|
|
50
|
+
height: '40px',
|
|
51
|
+
display: 'flex',
|
|
52
|
+
alignItems: 'center',
|
|
53
|
+
justifyContent: 'center',
|
|
54
|
+
borderRadius: theme.radiusSm,
|
|
55
|
+
border: 'none',
|
|
56
|
+
cursor: 'pointer',
|
|
57
|
+
fontSize: '16px',
|
|
58
|
+
fontFamily: theme.fontFamily,
|
|
59
|
+
backgroundColor: isActive ? theme.bgCardHover : 'transparent',
|
|
60
|
+
color: isActive ? theme.purple : theme.textMuted,
|
|
61
|
+
borderLeft: isActive ? `2px solid ${theme.violet}` : '2px solid transparent',
|
|
62
|
+
transition: 'all 0.1s ease',
|
|
63
|
+
}}
|
|
64
|
+
>
|
|
65
|
+
{item.icon}
|
|
66
|
+
</button>
|
|
67
|
+
);
|
|
68
|
+
})}
|
|
69
|
+
</nav>
|
|
70
|
+
|
|
71
|
+
{/* View content */}
|
|
72
|
+
<main style={{ flex: 1, overflow: 'hidden' }}>
|
|
73
|
+
<Suspense
|
|
74
|
+
fallback={
|
|
75
|
+
<div
|
|
76
|
+
style={{
|
|
77
|
+
display: 'flex',
|
|
78
|
+
alignItems: 'center',
|
|
79
|
+
justifyContent: 'center',
|
|
80
|
+
height: '100%',
|
|
81
|
+
color: theme.textMuted,
|
|
82
|
+
fontSize: '14px',
|
|
83
|
+
}}
|
|
84
|
+
>
|
|
85
|
+
Loading...
|
|
86
|
+
</div>
|
|
87
|
+
}
|
|
88
|
+
>
|
|
89
|
+
{ActiveComponent && <ActiveComponent windowId="main" />}
|
|
90
|
+
</Suspense>
|
|
91
|
+
</main>
|
|
92
|
+
</div>
|
|
93
|
+
|
|
94
|
+
{/* Status bar */}
|
|
95
|
+
<StatusBar activeView={activeView} />
|
|
96
|
+
</div>
|
|
97
|
+
);
|
|
98
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { StrictMode } from 'react';
|
|
2
|
+
import { createRoot } from 'react-dom/client';
|
|
3
|
+
import { App } from './App';
|
|
4
|
+
|
|
5
|
+
const root = document.getElementById('root');
|
|
6
|
+
if (!root) throw new Error('Root element not found');
|
|
7
|
+
createRoot(root).render(
|
|
8
|
+
<StrictMode>
|
|
9
|
+
<App />
|
|
10
|
+
</StrictMode>,
|
|
11
|
+
);
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import react from '@vitejs/plugin-react';
|
|
2
|
+
import { defineConfig } from 'vite';
|
|
3
|
+
|
|
4
|
+
export default defineConfig({
|
|
5
|
+
plugins: [react()],
|
|
6
|
+
server: {
|
|
7
|
+
port: 1420,
|
|
8
|
+
strictPort: true,
|
|
9
|
+
},
|
|
10
|
+
build: {
|
|
11
|
+
outDir: 'dist',
|
|
12
|
+
emptyOutDir: true,
|
|
13
|
+
},
|
|
14
|
+
});
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "genie",
|
|
3
|
-
"version": "4.260330.
|
|
3
|
+
"version": "4.260330.6",
|
|
4
4
|
"description": "Human-AI partnership for Claude Code. Share a terminal, orchestrate workers, evolve together. Brainstorm ideas, turn them into wishes, execute with /work, validate with /review, and ship as one team.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Namastex Labs"
|