rufloui 0.3.1 → 0.3.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.
- package/CHANGELOG.md +14 -0
- package/CLAUDE.md +6 -6
- package/README.md +13 -9
- package/package.json +1 -1
- package/release-notes.md +27 -0
- package/src/backend/server.ts +7 -7
- package/src/frontend/pages/AgentsPanel.tsx +1 -1
- package/src/frontend/pages/TasksPanel.tsx +1 -1
- package/src/frontend/pages/WorkflowsPanel.tsx +1 -1
- package/vite.config.ts +3 -3
- package/{ +0 -0
- package/{, +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,20 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
+
## [0.3.2] - 2026-03-12
|
|
10
|
+
|
|
11
|
+
### Changed
|
|
12
|
+
|
|
13
|
+
- **Port configuration** — Backend moved from 3001 to **28580**, frontend from 5173 to **28588**, daemon from 3002 to **28581**
|
|
14
|
+
- Avoids conflicts with reserved port ranges on Windows (Hyper-V, Docker, antivirus)
|
|
15
|
+
- All documentation, CORS config, WebSocket connections, and Vite proxy updated accordingly
|
|
16
|
+
|
|
17
|
+
### Fixed
|
|
18
|
+
|
|
19
|
+
- **Workflow cancel** — Now properly updates local store, kills running processes, and cancels linked tasks
|
|
20
|
+
- **Task cancel** — Now kills running `claude -p` processes and cancels linked workflows
|
|
21
|
+
- **Workflow delete** — Removes from local store even when CLI fails
|
|
22
|
+
|
|
9
23
|
## [0.3.1] - 2026-03-11
|
|
10
24
|
|
|
11
25
|
### Added
|
package/CLAUDE.md
CHANGED
|
@@ -14,13 +14,13 @@
|
|
|
14
14
|
|
|
15
15
|
```bash
|
|
16
16
|
npm install
|
|
17
|
-
npm run dev # Starts both frontend (Vite :
|
|
17
|
+
npm run dev # Starts both frontend (Vite :28588) and backend (Express :28580)
|
|
18
18
|
# Or individually:
|
|
19
|
-
npm run dev:frontend # Vite dev server on port
|
|
20
|
-
npm run dev:backend # Express API on port
|
|
19
|
+
npm run dev:frontend # Vite dev server on port 28588
|
|
20
|
+
npm run dev:backend # Express API on port 28580 (tsx watch, auto-reloads)
|
|
21
21
|
```
|
|
22
22
|
|
|
23
|
-
The frontend proxies `/api/*` and `/ws` to `localhost:
|
|
23
|
+
The frontend proxies `/api/*` and `/ws` to `localhost:28580` via Vite config.
|
|
24
24
|
|
|
25
25
|
## Project Structure
|
|
26
26
|
|
|
@@ -141,7 +141,7 @@ The backend is a single Express file that wraps CLI commands, manages state, and
|
|
|
141
141
|
|
|
142
142
|
### WebSocket Events
|
|
143
143
|
|
|
144
|
-
- Path: `ws://localhost:
|
|
144
|
+
- Path: `ws://localhost:28580/ws`
|
|
145
145
|
- **Broadcast events**: `swarm:status`, `agent:activity`, `agent:output`, `task:added`, `task:updated`, `task:output`, `workflow:added`, `workflow:updated`, `session:list`, `performance:metrics`, `viz:update`, `swarm-monitor:update`, `log`
|
|
146
146
|
- Frontend connects in `App.tsx` and dispatches to Zustand store
|
|
147
147
|
|
|
@@ -255,7 +255,7 @@ These are critical to understand when modifying the backend:
|
|
|
255
255
|
- ALWAYS read a file before editing it
|
|
256
256
|
- NEVER commit secrets, credentials, or .env files
|
|
257
257
|
- Keep files under 500 lines where possible (server.ts is an exception at ~2200 lines)
|
|
258
|
-
- After editing `server.ts`, the backend must be restarted: `npx kill-port
|
|
258
|
+
- After editing `server.ts`, the backend must be restarted: `npx kill-port 28580; npx tsx src/backend/server.ts`
|
|
259
259
|
- Frontend hot-reloads automatically via Vite
|
|
260
260
|
- When API returns `{ items: [...] }` vs `[...]`, always normalize before setting store
|
|
261
261
|
|
package/README.md
CHANGED
|
@@ -47,14 +47,18 @@ npm run dev
|
|
|
47
47
|
```
|
|
48
48
|
|
|
49
49
|
This starts:
|
|
50
|
-
- **Frontend** (Vite) on `http://localhost:
|
|
51
|
-
- **Backend** (Express + WebSocket) on `http://localhost:
|
|
50
|
+
- **Frontend** (Vite) on `http://localhost:28588`
|
|
51
|
+
- **Backend** (Express + WebSocket) on `http://localhost:28580`
|
|
52
52
|
|
|
53
53
|
The frontend proxies `/api/*` and `/ws` to the backend automatically.
|
|
54
54
|
|
|
55
|
-
### Install via
|
|
55
|
+
### Install via npm
|
|
56
56
|
|
|
57
|
-
|
|
57
|
+
```bash
|
|
58
|
+
npm install rufloui
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### Install via GitHub Packages
|
|
58
62
|
|
|
59
63
|
```bash
|
|
60
64
|
# Configure npm to use GitHub Packages for the @mario-pb scope
|
|
@@ -64,14 +68,14 @@ echo "@mario-pb:registry=https://npm.pkg.github.com" >> .npmrc
|
|
|
64
68
|
npm install @mario-pb/rufloui
|
|
65
69
|
```
|
|
66
70
|
|
|
67
|
-
> **Note:**
|
|
71
|
+
> **Note:** GitHub Packages requires a personal access token with `read:packages` scope.
|
|
68
72
|
> Add it to your `~/.npmrc`: `//npm.pkg.github.com/:_authToken=YOUR_TOKEN`
|
|
69
73
|
|
|
70
74
|
### Individual Services
|
|
71
75
|
|
|
72
76
|
```bash
|
|
73
|
-
npm run dev:frontend # Vite dev server on port
|
|
74
|
-
npm run dev:backend # Express API on port
|
|
77
|
+
npm run dev:frontend # Vite dev server on port 28588
|
|
78
|
+
npm run dev:backend # Express API on port 28580 (auto-reloads)
|
|
75
79
|
```
|
|
76
80
|
|
|
77
81
|
### Production Build
|
|
@@ -123,7 +127,7 @@ src/
|
|
|
123
127
|
```
|
|
124
128
|
Browser (React 19) Express Backend
|
|
125
129
|
┌────────────────────┐ ┌────────────────────────┐
|
|
126
|
-
│ Vite :
|
|
130
|
+
│ Vite :28588 │───REST /api──>│ Express :28580 │
|
|
127
131
|
│ Zustand Store │<──WebSocket──>│ WebSocket Server │
|
|
128
132
|
│ sessionStorage │ │ │
|
|
129
133
|
└────────────────────┘ │ ┌──────────────────┐ │
|
|
@@ -161,7 +165,7 @@ Once the app is running, here's how to go from zero to a working multi-agent swa
|
|
|
161
165
|
2. **Spawn agents** — Go to **Agents**, select a type (e.g. `coder`), give it a name, and click **Spawn**. Repeat for other roles you need (`researcher`, `tester`, etc.).
|
|
162
166
|
3. **Create a task** — Go to **Tasks**, click **Create Task**, fill in a title and description (e.g. "Write a fibonacci function in Python with tests").
|
|
163
167
|
4. **Assign to swarm** — On the task card, click **Assign to Swarm**. The multi-agent pipeline kicks in: a coordinator plans subtasks, specialist agents execute them in parallel waves.
|
|
164
|
-
5. **Watch it live** — Switch to **Swarm Monitor** to see agent cards light up with real-time output and the orange working glow animation.
|
|
168
|
+
5. **Watch it live** — Switch to **Swarm Monitor** to see agent cards light up with real-time output and the orange working glow animation.
|
|
165
169
|
6. **Continue if needed** — When a task completes, click **Continue Task** to send a follow-up instruction with full context from the previous run.
|
|
166
170
|
|
|
167
171
|
## Prerequisites
|
package/package.json
CHANGED
package/release-notes.md
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
## Port Configuration Change
|
|
2
|
+
|
|
3
|
+
Default ports changed to avoid conflicts with Windows reserved ranges (Hyper-V, Docker, antivirus):
|
|
4
|
+
|
|
5
|
+
| Service | Old | New |
|
|
6
|
+
|---------|-----|-----|
|
|
7
|
+
| Backend API | 3001 | **28580** |
|
|
8
|
+
| Frontend UI | 5173 | **28588** |
|
|
9
|
+
| Daemon | 3002 | **28581** |
|
|
10
|
+
|
|
11
|
+
### Breaking Change
|
|
12
|
+
|
|
13
|
+
If you have bookmarks, scripts, or webhook URLs pointing to the old ports, update them.
|
|
14
|
+
|
|
15
|
+
### Other Fixes
|
|
16
|
+
|
|
17
|
+
- **Workflow cancel** now properly kills running processes and cancels linked tasks
|
|
18
|
+
- **Task cancel** now kills `claude -p` processes and cancels linked workflows
|
|
19
|
+
- **Workflow delete** works even when CLI fails
|
|
20
|
+
|
|
21
|
+
### Install
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
npm install rufloui
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
**Full Changelog**: https://github.com/Mario-PB/rufloui/compare/v0.3.1...v0.3.2
|
package/src/backend/server.ts
CHANGED
|
@@ -14,7 +14,7 @@ import { loadGitHubWebhookConfig, githubWebhookRoutes, updateWebhookEventByTaskI
|
|
|
14
14
|
|
|
15
15
|
const execAsync = promisify(exec)
|
|
16
16
|
const execFileAsync = promisify(execFile)
|
|
17
|
-
const PORT = Number(process.env.PORT) ||
|
|
17
|
+
const PORT = Number(process.env.PORT) || 28580
|
|
18
18
|
const CLI = process.env.RUFLO_CLI || 'npx -y @claude-flow/cli@latest'
|
|
19
19
|
const CLI_PARTS = (process.env.RUFLO_CLI || 'npx -y @claude-flow/cli@latest').split(/\s+/)
|
|
20
20
|
const CLI_BIN = CLI_PARTS[0]
|
|
@@ -452,10 +452,10 @@ function systemRoutes(): Router {
|
|
|
452
452
|
checks.push({ id: 'persist-dir', name: 'Persistence (.ruflo/)', status: 'fail', detail: 'Cannot write to .ruflo/ directory', fix: 'Check file permissions in project directory' })
|
|
453
453
|
}
|
|
454
454
|
|
|
455
|
-
// 6. Port availability (
|
|
455
|
+
// 6. Port availability (28580 is us, check 28581 for daemon)
|
|
456
456
|
try {
|
|
457
457
|
await execAsync('npx -y @claude-flow/cli@latest status', { timeout: 15_000 })
|
|
458
|
-
checks.push({ id: 'daemon', name: 'claude-flow daemon', status: 'ok', detail: 'Daemon reachable on port
|
|
458
|
+
checks.push({ id: 'daemon', name: 'claude-flow daemon', status: 'ok', detail: 'Daemon reachable on port 28581' })
|
|
459
459
|
} catch {
|
|
460
460
|
checks.push({ id: 'daemon', name: 'claude-flow daemon', status: 'warn', detail: 'Daemon not running (will start on first use)', fix: 'The daemon starts automatically when needed' })
|
|
461
461
|
}
|
|
@@ -536,8 +536,8 @@ async function ensureDaemon(): Promise<void> {
|
|
|
536
536
|
try { await execCli('init', []) } catch (e) {
|
|
537
537
|
console.log('[daemon] init skipped (may already exist):', e instanceof Error ? e.message : String(e))
|
|
538
538
|
}
|
|
539
|
-
// Start daemon on port
|
|
540
|
-
const daemonPort = String(Number(process.env.DAEMON_PORT) ||
|
|
539
|
+
// Start daemon on port 28581 (28580 is our API)
|
|
540
|
+
const daemonPort = String(Number(process.env.DAEMON_PORT) || 28581)
|
|
541
541
|
await execCli('start', ['--daemon', '--port', daemonPort, '--skip-mcp'])
|
|
542
542
|
daemonStarted = true
|
|
543
543
|
} catch (err) {
|
|
@@ -2777,7 +2777,7 @@ function swarmMonitorRoutes(): Router {
|
|
|
2777
2777
|
|
|
2778
2778
|
// Bootstrap
|
|
2779
2779
|
const app = express()
|
|
2780
|
-
app.use(cors({ origin: process.env.RUFLOUI_CORS_ORIGIN || 'http://localhost:
|
|
2780
|
+
app.use(cors({ origin: process.env.RUFLOUI_CORS_ORIGIN || 'http://localhost:28588' }))
|
|
2781
2781
|
app.use(express.json({
|
|
2782
2782
|
verify: (req: any, _res, buf) => {
|
|
2783
2783
|
// Preserve the raw body buffer for HMAC signature verification (webhook routes)
|
|
@@ -2966,7 +2966,7 @@ server.listen(PORT, async () => {
|
|
|
2966
2966
|
await execCli('--version', [])
|
|
2967
2967
|
console.log(' claude-flow CLI: [OK]')
|
|
2968
2968
|
} catch { console.log(' claude-flow CLI: [WARN] First run may take longer (npx download)') }
|
|
2969
|
-
console.log('Preflight complete. Dashboard: http://localhost:
|
|
2969
|
+
console.log('Preflight complete. Dashboard: http://localhost:28588')
|
|
2970
2970
|
})
|
|
2971
2971
|
|
|
2972
2972
|
export { app, server }
|
|
@@ -85,7 +85,7 @@ export default function AgentsPanel() {
|
|
|
85
85
|
// WebSocket for real-time agent activity
|
|
86
86
|
useEffect(() => {
|
|
87
87
|
const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:'
|
|
88
|
-
const ws = new WebSocket(`${protocol}//${window.location.hostname}:
|
|
88
|
+
const ws = new WebSocket(`${protocol}//${window.location.hostname}:28580/ws`)
|
|
89
89
|
ws.onmessage = (evt) => {
|
|
90
90
|
try {
|
|
91
91
|
const msg = JSON.parse(evt.data)
|
|
@@ -337,7 +337,7 @@ export default function TasksPanel() {
|
|
|
337
337
|
// WebSocket for live task output
|
|
338
338
|
useEffect(() => {
|
|
339
339
|
const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:'
|
|
340
|
-
const ws = new WebSocket(`${protocol}//${window.location.hostname}:
|
|
340
|
+
const ws = new WebSocket(`${protocol}//${window.location.hostname}:28580/ws`)
|
|
341
341
|
wsRef.current = ws
|
|
342
342
|
ws.onmessage = (evt) => {
|
|
343
343
|
try {
|
|
@@ -234,7 +234,7 @@ export default function WorkflowsPanel() {
|
|
|
234
234
|
// WebSocket for live workflow updates
|
|
235
235
|
useEffect(() => {
|
|
236
236
|
const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:'
|
|
237
|
-
const ws = new WebSocket(`${protocol}//${window.location.hostname}:
|
|
237
|
+
const ws = new WebSocket(`${protocol}//${window.location.hostname}:28580/ws`)
|
|
238
238
|
ws.onmessage = (evt) => {
|
|
239
239
|
try {
|
|
240
240
|
const msg = JSON.parse(evt.data)
|
package/vite.config.ts
CHANGED
|
@@ -11,11 +11,11 @@ export default defineConfig({
|
|
|
11
11
|
},
|
|
12
12
|
},
|
|
13
13
|
server: {
|
|
14
|
-
port:
|
|
14
|
+
port: 28588,
|
|
15
15
|
proxy: {
|
|
16
|
-
'/api': 'http://localhost:
|
|
16
|
+
'/api': 'http://localhost:28580',
|
|
17
17
|
'/ws': {
|
|
18
|
-
target: 'ws://localhost:
|
|
18
|
+
target: 'ws://localhost:28580',
|
|
19
19
|
ws: true,
|
|
20
20
|
},
|
|
21
21
|
},
|
package/{
ADDED
|
File without changes
|
package/{,
ADDED
|
File without changes
|