feinai 0.8.4 → 0.8.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/CHANGELOG.md +12 -0
- package/package.json +4 -4
- package/src/cli.ts +3 -1
- package/src/dashboard.html +12 -2
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,18 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
Format follows [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
|
5
5
|
|
|
6
|
+
## [0.8.6] - 2026-09-08
|
|
7
|
+
|
|
8
|
+
### Fixed
|
|
9
|
+
|
|
10
|
+
- **`--version` mostraba un número desactualizado.** `src/cli.ts` tenía `VERSION` hardcodeado como string literal, separado de `package.json` — al bumpear la versión en 0.8.5 quedó desincronizado y `feinai --version` seguía reportando `0.8.4`. Ahora `VERSION` se lee de `package.json` en runtime, así que no se puede volver a desincronizar.
|
|
11
|
+
|
|
12
|
+
## [0.8.5] - 2026-09-07
|
|
13
|
+
|
|
14
|
+
### Fixed
|
|
15
|
+
|
|
16
|
+
- **Contador "active agents" del navbar sobrecontaba y oscilaba.** El pill sumaba `agentProcesses.length`, es decir, todos los procesos con cwd dentro de un worktree — pero una sesión de agente real suele lanzar procesos hijos (`git`, `bun`, `rg`, `tsc`, ...) que también quedan momentáneamente con cwd en ese worktree y se contaban como agentes separados. Esto inflaba el número (ej. 5 en vez de 1) y lo hacía oscilar entre polls de 5s a medida que esos hijos aparecían y desaparecían, mientras que la card de un task individual sólo reflejaba ese task puntual. `renderAgentsPill()` ahora agrupa por `taskId` y cuenta tasks distintas con al menos un proceso matcheado, en línea con lo que ya mostraba cada worktree card.
|
|
17
|
+
|
|
6
18
|
## [0.8.4] - 2026-09-02
|
|
7
19
|
|
|
8
20
|
### Fixed
|
package/package.json
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "feinai",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.6",
|
|
4
4
|
"description": "Task & spec manager for AI agents — parallel worktrees, live dashboard, SDD skills",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
|
-
"feinai": "
|
|
8
|
-
"opengit": "
|
|
7
|
+
"feinai": "src/cli.ts",
|
|
8
|
+
"opengit": "src/opengit.sh"
|
|
9
9
|
},
|
|
10
10
|
"scripts": {
|
|
11
11
|
"dev": "bun src/cli.ts",
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
"license": "MIT",
|
|
31
31
|
"repository": {
|
|
32
32
|
"type": "git",
|
|
33
|
-
"url": "https://github.com/mvisca/feinai.git"
|
|
33
|
+
"url": "git+https://github.com/mvisca/feinai.git"
|
|
34
34
|
},
|
|
35
35
|
"homepage": "https://github.com/mvisca/feinai#readme",
|
|
36
36
|
"bugs": {
|
package/src/cli.ts
CHANGED
|
@@ -57,7 +57,9 @@ import {
|
|
|
57
57
|
type OrphanKillResult,
|
|
58
58
|
} from "./server-state";
|
|
59
59
|
|
|
60
|
-
const VERSION =
|
|
60
|
+
const VERSION: string = JSON.parse(
|
|
61
|
+
readFileSync(resolve(dirname(fileURLToPath(import.meta.url)), "../package.json"), "utf-8"),
|
|
62
|
+
).version;
|
|
61
63
|
|
|
62
64
|
interface ParsedArgs {
|
|
63
65
|
positional: string[];
|
package/src/dashboard.html
CHANGED
|
@@ -1721,8 +1721,18 @@
|
|
|
1721
1721
|
function renderAgentsPill() {
|
|
1722
1722
|
const el = $("#agents-pill");
|
|
1723
1723
|
if (!el) return;
|
|
1724
|
-
|
|
1725
|
-
|
|
1724
|
+
// Group by taskId: a single agent session commonly spawns child
|
|
1725
|
+
// processes (git, bun, rg, tsc, ...) whose cwd also lands inside the
|
|
1726
|
+
// worktree, so agentProcesses.length overcounts and flickers as those
|
|
1727
|
+
// children come and go. What "active agents" means is distinct tasks
|
|
1728
|
+
// with at least one matched process.
|
|
1729
|
+
const byTask = new Map();
|
|
1730
|
+
for (const a of agentProcesses) {
|
|
1731
|
+
if (!byTask.has(a.taskId)) byTask.set(a.taskId, []);
|
|
1732
|
+
byTask.get(a.taskId).push(a);
|
|
1733
|
+
}
|
|
1734
|
+
const total = byTask.size;
|
|
1735
|
+
const verified = [...byTask.values()].filter((procs) => procs.some((a) => a.verified)).length;
|
|
1726
1736
|
const unverified = total - verified;
|
|
1727
1737
|
el.classList.toggle("live", total > 0);
|
|
1728
1738
|
const title = total === 0
|