moflo 4.9.23 → 4.9.24
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/guidance/shipped/moflo-spell-scheduling.md +1 -1
- package/.claude/skills/fl/phases.md +1 -1
- package/.claude/skills/spell-schedule/SKILL.md +1 -1
- package/README.md +1 -1
- package/dist/src/cli/commands/daemon.js +4 -4
- package/dist/src/cli/services/daemon-dashboard.js +19 -14
- package/dist/src/cli/version.js +1 -1
- package/package.json +2 -2
|
@@ -94,7 +94,7 @@ Practical floors:
|
|
|
94
94
|
| Namespace | Contents | Written by | Read by |
|
|
95
95
|
|-----------|----------|------------|---------|
|
|
96
96
|
| `scheduled-spells` | `SpellSchedule` records (id, spellName, timing, nextRunAt, enabled, args) | `flo spell schedule create`, definition load | Scheduler poll loop, `flo spell schedule list` |
|
|
97
|
-
| `schedule-executions` | `ScheduleExecution` audit records (startedAt, completedAt, success, error, duration, manualRun) | Scheduler at execute-start and execute-end | The
|
|
97
|
+
| `schedule-executions` | `ScheduleExecution` audit records (startedAt, completedAt, success, error, duration, manualRun) | Scheduler at execute-start and execute-end | The Luminarium, `flo spell schedule executions` |
|
|
98
98
|
|
|
99
99
|
When debugging "did my schedule fire?", read `schedule-executions` directly via `mcp__moflo__memory_list namespace=schedule-executions` if the CLI is unavailable.
|
|
100
100
|
|
|
@@ -4,7 +4,7 @@ Phase-by-phase notes for the full `/flo <issue>` run. Phase 2 (Ticket) lives in
|
|
|
4
4
|
|
|
5
5
|
## Phase 0: Record run start (Flo Runs dashboard)
|
|
6
6
|
|
|
7
|
-
Before research, write a row to the `tasklist` namespace so the
|
|
7
|
+
Before research, write a row to the `tasklist` namespace so the Luminarium "Flo Runs" tab shows this run live and after the next session restart (#968). Skip this phase ONLY when `--epic-branch` is set — the epic orchestrator owns the parent record and the per-story spell engine writes its own row.
|
|
8
8
|
|
|
9
9
|
Compute and **remember** for Phase 5:
|
|
10
10
|
- `runId` — `flo-<issue-number-or-"new">-<startedAt-ms>` (sortable, unique).
|
|
@@ -125,7 +125,7 @@ npx flo spell schedule executions --schedule <schedule-id> 2>&1
|
|
|
125
125
|
|
|
126
126
|
`executions` reads from the daemon-written `schedule-executions` namespace and shows started time, status (success/failed/running), duration, and whether the run was manual. This is the only command that proves a schedule actually fired — `flo spell schedule list` only shows the schedule definition.
|
|
127
127
|
|
|
128
|
-
If the user wants to wait for the first fire (interval ≤ 5m), poll `flo spell schedule executions --schedule <id>` or watch The
|
|
128
|
+
If the user wants to wait for the first fire (interval ≤ 5m), poll `flo spell schedule executions --schedule <id>` or watch The Luminarium (the daemon's localhost UI). Otherwise, summarize and exit:
|
|
129
129
|
|
|
130
130
|
```
|
|
131
131
|
Scheduled: <schedule-id>
|
package/README.md
CHANGED
|
@@ -419,7 +419,7 @@ flo daemon status # shows whether the service is registered AND running
|
|
|
419
419
|
|
|
420
420
|
`flo spell schedule create` warns when the daemon isn't installed so you don't quietly miss runs.
|
|
421
421
|
|
|
422
|
-
**Monitoring.** **The
|
|
422
|
+
**Monitoring.** **The Luminarium** (the moflo daemon's localhost UI) surfaces live schedules, recent executions, and per-schedule controls (disable / re-enable / run now). It starts alongside the daemon at `http://localhost:3117` (override with `--dashboard-port` or disable with `--no-dashboard`).
|
|
423
423
|
|
|
424
424
|
For full configuration (`scheduler:` block in `moflo.yaml`), event types, and the catch-up window after restarts, see [docs/SPELLS.md#scheduling](docs/SPELLS.md#scheduling).
|
|
425
425
|
|
|
@@ -128,7 +128,7 @@ const startCommand = {
|
|
|
128
128
|
`Max Concurrent: ${status.config.maxConcurrent}`,
|
|
129
129
|
`Max CPU Load: ${status.config.resourceThresholds.maxCpuLoad}`,
|
|
130
130
|
`Min Free Memory: ${status.config.resourceThresholds.minFreeMemoryPercent}%`,
|
|
131
|
-
...(dashboard ? [`The
|
|
131
|
+
...(dashboard ? [`The Luminarium: http://localhost:${dashboard.port}`] : []),
|
|
132
132
|
].join('\n'), 'Daemon Status');
|
|
133
133
|
output.writeln();
|
|
134
134
|
output.writeln(output.bold('Scheduled Workers'));
|
|
@@ -215,10 +215,10 @@ async function attachDaemonServices(daemon, opts) {
|
|
|
215
215
|
schedulerEnabledInConfig: schedulerConfig.enabled,
|
|
216
216
|
});
|
|
217
217
|
if (opts.verbose)
|
|
218
|
-
output.printSuccess(`The
|
|
218
|
+
output.printSuccess(`The Luminarium: http://localhost:${dashboard.port}`);
|
|
219
219
|
}
|
|
220
220
|
catch (err) {
|
|
221
|
-
logWarn(`The
|
|
221
|
+
logWarn(`The Luminarium failed to start: ${errorDetail(err)}`);
|
|
222
222
|
}
|
|
223
223
|
}
|
|
224
224
|
if (!schedulerConfig.enabled) {
|
|
@@ -378,7 +378,7 @@ async function startBackgroundDaemon(projectRoot, quiet, maxCpuLoad, minFreeMemo
|
|
|
378
378
|
if (!quiet) {
|
|
379
379
|
output.printSuccess(`Daemon started in background (PID: ${pid})`);
|
|
380
380
|
if (!noDashboard) {
|
|
381
|
-
output.printInfo(`The
|
|
381
|
+
output.printInfo(`The Luminarium: http://localhost:${dashboardPort ?? DEFAULT_DASHBOARD_PORT}`);
|
|
382
382
|
}
|
|
383
383
|
output.printInfo(`Logs: ${logFile}`);
|
|
384
384
|
output.printInfo(`Stop with: claude-flow daemon stop`);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* The
|
|
2
|
+
* The Luminarium — Lightweight localhost HTTP server
|
|
3
3
|
*
|
|
4
|
-
* Serves the moflo
|
|
4
|
+
* Serves the moflo Luminarium (read-only daemon view) for status,
|
|
5
5
|
* scheduled spells, executions, and memory stats. Binds to 127.0.0.1
|
|
6
6
|
* only (no auth needed).
|
|
7
7
|
*
|
|
@@ -560,10 +560,10 @@ const DASHBOARD_HTML = `<!DOCTYPE html>
|
|
|
560
560
|
<head>
|
|
561
561
|
<meta charset="utf-8">
|
|
562
562
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
563
|
-
<title>The
|
|
564
|
-
<meta name="description" content="The
|
|
565
|
-
<meta property="og:title" content="The
|
|
566
|
-
<meta property="og:description" content="The
|
|
563
|
+
<title>The Luminarium</title>
|
|
564
|
+
<meta name="description" content="The Luminarium — moflo daemon, scheduled spells, and live event stream">
|
|
565
|
+
<meta property="og:title" content="The Luminarium">
|
|
566
|
+
<meta property="og:description" content="The Luminarium — moflo daemon, scheduled spells, and live event stream">
|
|
567
567
|
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
568
568
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
569
569
|
<link href="https://fonts.googleapis.com/css2?family=Cinzel+Decorative:wght@700;900&display=swap" rel="stylesheet">
|
|
@@ -575,13 +575,18 @@ const DASHBOARD_HTML = `<!DOCTYPE html>
|
|
|
575
575
|
title still reads "arcane" if the user is offline or behind a font-CDN
|
|
576
576
|
block (Georgia ships everywhere; serif is the universal fallback). */
|
|
577
577
|
h1 { font-family: 'Cinzel Decorative', 'Cinzel', 'Trajan Pro', 'Palatino Linotype', 'Book Antiqua', Georgia, serif; font-weight: 900; letter-spacing: 0.04em; margin-bottom: 4px; font-size: 1.85rem; }
|
|
578
|
-
/*
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
h1 .
|
|
584
|
-
|
|
578
|
+
/* Luminous gradient flowing across the whole title (amber → pale gold → pale
|
|
579
|
+
cyan). background-clip: text paints the gradient through the glyphs;
|
|
580
|
+
color: transparent reveals it. text-shadow doesn't paint on transparent
|
|
581
|
+
text, so the glow uses filter: drop-shadow which respects rendered
|
|
582
|
+
glyph shape. Mid-gradient hue chosen for the glow tint. */
|
|
583
|
+
h1 .luminarium-title {
|
|
584
|
+
background: linear-gradient(90deg, #f59e0b 0%, #fde68a 50%, #67e8f4 100%);
|
|
585
|
+
-webkit-background-clip: text;
|
|
586
|
+
background-clip: text;
|
|
587
|
+
color: transparent;
|
|
588
|
+
filter: drop-shadow(0 0 14px rgba(253, 230, 138, 0.22));
|
|
589
|
+
}
|
|
585
590
|
h2 { color: #8b949e; font-size: 1.1rem; margin: 16px 0 12px; border-bottom: 1px solid #21262d; padding-bottom: 6px; }
|
|
586
591
|
.header { display: flex; align-items: baseline; gap: 12px; margin-bottom: 16px; }
|
|
587
592
|
.subtitle { color: #8b949e; font-size: 0.85rem; }
|
|
@@ -629,7 +634,7 @@ const DASHBOARD_HTML = `<!DOCTYPE html>
|
|
|
629
634
|
</head>
|
|
630
635
|
<body>
|
|
631
636
|
<div class="header">
|
|
632
|
-
<h1><span class="
|
|
637
|
+
<h1><span class="luminarium-title">The Luminarium</span></h1>
|
|
633
638
|
<span class="subtitle">moflo daemon • localhost</span>
|
|
634
639
|
</div>
|
|
635
640
|
<div id="status-bar" class="status-bar"><div class="empty">Loading...</div></div>
|
package/dist/src/cli/version.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "moflo",
|
|
3
|
-
"version": "4.9.
|
|
3
|
+
"version": "4.9.24",
|
|
4
4
|
"description": "MoFlo — AI agent orchestration for Claude Code. A standalone, opinionated toolkit with semantic memory, learned routing, gates, spells, and the /flo issue-execution skill.",
|
|
5
5
|
"main": "dist/src/cli/index.js",
|
|
6
6
|
"type": "module",
|
|
@@ -84,7 +84,7 @@
|
|
|
84
84
|
"@typescript-eslint/eslint-plugin": "^7.18.0",
|
|
85
85
|
"@typescript-eslint/parser": "^7.18.0",
|
|
86
86
|
"eslint": "^8.0.0",
|
|
87
|
-
"moflo": "^4.9.
|
|
87
|
+
"moflo": "^4.9.23",
|
|
88
88
|
"tsx": "^4.21.0",
|
|
89
89
|
"typescript": "^5.9.3",
|
|
90
90
|
"vitest": "^4.0.0"
|