opencode-flema-engram-sidebar 0.2.0 → 0.3.0

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/README.md CHANGED
@@ -1,20 +1,20 @@
1
- # Flema Engram para OpenCode
1
+ # Flema Engram para OpenCode y Pi
2
2
 
3
3
  [![CI](https://github.com/oniricosistemas/flema-engram/actions/workflows/ci.yml/badge.svg)](https://github.com/oniricosistemas/flema-engram/actions/workflows/ci.yml)
4
4
  [![npm](https://img.shields.io/npm/v/opencode-flema-engram-sidebar?logo=npm)](https://www.npmjs.com/package/opencode-flema-engram-sidebar)
5
5
  [![Node.js](https://img.shields.io/badge/Node.js-%3E%3D22-339933?logo=nodedotjs&logoColor=white)](https://nodejs.org/)
6
6
  [![License: MIT](https://img.shields.io/github/license/oniricosistemas/flema-engram)](https://github.com/oniricosistemas/flema-engram/blob/main/LICENSE)
7
7
 
8
- Un sidebar local y de solo lectura que mantiene visible el contexto reciente de
9
- [Engram](https://github.com/Gentleman-Programming/engram) mientras trabajás dentro de OpenCode.
8
+ Una integración local y de solo lectura que mantiene visible el contexto reciente de
9
+ [Engram](https://github.com/Gentleman-Programming/engram) mientras trabajás dentro de OpenCode o Pi/Gentle Shell.
10
10
 
11
11
  La canción **“Y aún yo te recuerdo”** inspiró artísticamente la idea central: que la
12
12
  última memoria guardada siga presente en el contexto de desarrollo. Esta referencia
13
13
  es un homenaje a esa inspiración; no implica afiliación, patrocinio ni titularidad
14
14
  sobre la obra.
15
15
 
16
- > **English summary:** Flema Engram is a local-first, read-only OpenCode
17
- > plugin/sidebar that surfaces Engram health, project context, recent memories,
16
+ > **English summary:** Flema Engram is a local-first, read-only OpenCode and Pi
17
+ > integration that surfaces Engram health, project context, recent memories,
18
18
  > blockers, and ODD task progress by default. An MCP stdio adapter is included only as an optional
19
19
  > integration path.
20
20
 
@@ -36,7 +36,7 @@ Configuración mínima:
36
36
  ```json
37
37
  {
38
38
  "$schema": "https://opencode.ai/tui.json",
39
- "plugin": ["opencode-flema-engram-sidebar@0.2.0"]
39
+ "plugin": ["opencode-flema-engram-sidebar@0.3.0"]
40
40
  }
41
41
  ```
42
42
 
@@ -96,18 +96,53 @@ Si vas a conectarte a una instancia remota de OpenCode mediante `opencode attach
96
96
  El sidebar hace una carga inicial, vuelve a consultar cada 30 segundos de forma
97
97
  predeterminada y permite refrescar manualmente con <kbd>Alt</kbd>+<kbd>R</kbd>.
98
98
 
99
+ ## Viewer para Pi / Gentle Shell
100
+
101
+ El mismo paquete incluye una extensión Pi de solo lectura. Instalá una versión exacta
102
+ compatible con esta documentación:
103
+
104
+ ```sh
105
+ pi install npm:opencode-flema-engram-sidebar@0.3.0
106
+ ```
107
+
108
+ La extensión publica un status breve y un widget compacto debajo del editor. Refresca
109
+ al iniciar, reanudar o recargar una sesión, después de que `mem_save` (o el alias
110
+ `save_memory`) termina correctamente y mediante el comando:
111
+
112
+ ```text
113
+ /engram-refresh
114
+ ```
115
+
116
+ No usa polling periódico y no agrega herramientas para escribir memorias. En modos
117
+ sin UI no consulta Engram ni intenta renderizar componentes terminales. En RPC usa
118
+ solamente status y widgets de líneas de texto, sin iniciar una segunda TUI.
119
+
120
+ La resolución del endpoint usa `ENGRAM_URL`, luego `ENGRAM_BASE_URL` y finalmente
121
+ `http://127.0.0.1:7437`. `ENGRAM_PROJECT` puede fijar el candidato de proyecto; de lo
122
+ contrario se valida el nombre del directorio actual contra Engram. Los fallos de
123
+ inicialización se contienen en un estado `Engram unavailable` sin mostrar URLs,
124
+ tokens ni diagnósticos con credenciales.
125
+
126
+ Para desarrollo local, después de compilar el paquete:
127
+
128
+ ```sh
129
+ npm run build
130
+ pi --extension ./dist/pi.js
131
+ ```
132
+
99
133
  ## Qué es — y qué no es
100
134
 
101
135
  | Sí es | No es |
102
136
  | --- | --- |
103
- | Un plugin para el slot `sidebar_content` de OpenCode | Una TUI independiente |
137
+ | Un plugin para `sidebar_content` de OpenCode y una extensión Pi | Una TUI independiente |
104
138
  | Una vista local y de solo lectura sobre Engram | Un reemplazo de Engram |
105
139
  | Project context, activity, and ODD task progress | A memory editor or manager |
106
140
  | Un cliente del HTTP local de Engram | Un servicio cloud o de sincronización |
107
141
  | Un paquete con un adaptador MCP stdio opcional | Un producto centrado en MCP |
108
142
 
109
- El sidebar es el producto principal. El comando MCP existe para integraciones
110
- avanzadas y puede ignorarse por completo al usar el plugin de OpenCode.
143
+ Los viewers de OpenCode y Pi son las integraciones visuales principales. El comando
144
+ MCP existe para integraciones avanzadas y puede ignorarse por completo al usar cualquiera
145
+ de los viewers.
111
146
 
112
147
  ## Cómo funciona
113
148
 
@@ -148,7 +183,7 @@ Usá la forma `[plugin, options]` solamente cuando necesites opciones:
148
183
  "$schema": "https://opencode.ai/tui.json",
149
184
  "plugin": [
150
185
  [
151
- "opencode-flema-engram-sidebar@0.2.0",
186
+ "opencode-flema-engram-sidebar@0.3.0",
152
187
  {
153
188
  "enabled": true,
154
189
  "project": "mi-proyecto",
@@ -303,7 +338,7 @@ Si Engram conoce `mi-proyecto`, el sidebar valida ese nombre y carga sus memoria
303
338
  {
304
339
  "$schema": "https://opencode.ai/tui.json",
305
340
  "plugin": [
306
- ["opencode-flema-engram-sidebar@0.2.0", { "project": "backend-api" }]
341
+ ["opencode-flema-engram-sidebar@0.3.0", { "project": "backend-api" }]
307
342
  ]
308
343
  }
309
344
  ```
@@ -317,7 +352,7 @@ Engram. El valor debe coincidir; una configuración incorrecta queda como `unres
317
352
  {
318
353
  "$schema": "https://opencode.ai/tui.json",
319
354
  "plugin": [
320
- ["opencode-flema-engram-sidebar@0.2.0", { "pollInterval": 60000 }]
355
+ ["opencode-flema-engram-sidebar@0.3.0", { "pollInterval": 60000 }]
321
356
  ]
322
357
  }
323
358
  ```
package/dist/core.d.ts ADDED
@@ -0,0 +1,4 @@
1
+ export * from "./adapters/types.js";
2
+ export * from "./viewer/core.js";
3
+ export { resolveProject, resolveProjectName, type ProjectResolution, type ProjectResolutionOptions, type ProjectValidation, } from "./utils/project-resolver.js";
4
+ //# sourceMappingURL=core.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,KAAK,iBAAiB,EACtB,KAAK,wBAAwB,EAC7B,KAAK,iBAAiB,GACvB,MAAM,6BAA6B,CAAC"}
package/dist/core.js ADDED
@@ -0,0 +1,4 @@
1
+ export * from "./adapters/types.js";
2
+ export * from "./viewer/core.js";
3
+ export { resolveProject, resolveProjectName, } from "./utils/project-resolver.js";
4
+ //# sourceMappingURL=core.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core.js","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,OAAO,EACL,cAAc,EACd,kBAAkB,GAInB,MAAM,6BAA6B,CAAC"}
package/dist/pi.d.ts ADDED
@@ -0,0 +1,34 @@
1
+ import type { EngramAdapter } from "./adapters/types.js";
2
+ import { type ProjectResolution } from "./utils/project-resolver.js";
3
+ export interface PiExtensionUi {
4
+ setStatus: (key: string, value: string | undefined) => void;
5
+ setWidget: (key: string, value: string[] | undefined, options?: {
6
+ placement?: "aboveEditor" | "belowEditor";
7
+ }) => void;
8
+ notify: (message: string, level?: "info" | "warning" | "error") => void;
9
+ }
10
+ export interface PiExtensionContext {
11
+ cwd: string;
12
+ hasUI: boolean;
13
+ ui: PiExtensionUi;
14
+ }
15
+ export interface PiToolResultEvent {
16
+ type: "tool_result";
17
+ toolName: string;
18
+ isError: boolean;
19
+ }
20
+ export interface PiExtensionApi {
21
+ on: (event: string, handler: (event: Record<string, unknown>, context: PiExtensionContext) => unknown) => () => void;
22
+ registerCommand: (name: string, command: {
23
+ description: string;
24
+ handler: (args: string, context: PiExtensionContext) => unknown;
25
+ }) => void;
26
+ }
27
+ export interface PiEngramExtensionDependencies {
28
+ createAdapter?: () => EngramAdapter;
29
+ resolveProject?: (adapter: EngramAdapter, cwd: string) => Promise<ProjectResolution>;
30
+ }
31
+ export declare function createPiEngramExtension(dependencies?: PiEngramExtensionDependencies): (pi: PiExtensionApi) => void;
32
+ declare const _default: (pi: PiExtensionApi) => void;
33
+ export default _default;
34
+ //# sourceMappingURL=pi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pi.d.ts","sourceRoot":"","sources":["../src/pi.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAQzD,OAAO,EAEL,KAAK,iBAAiB,EACvB,MAAM,6BAA6B,CAAC;AAMrC,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC;IAC5D,SAAS,EAAE,CACT,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EAAE,GAAG,SAAS,EAC3B,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,aAAa,GAAG,aAAa,CAAA;KAAE,KACpD,IAAI,CAAC;IACV,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,KAAK,IAAI,CAAC;CACzE;AAED,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,OAAO,CAAC;IACf,EAAE,EAAE,aAAa,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,aAAa,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,CACF,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,kBAAkB,KAAK,OAAO,KAC9E,MAAM,IAAI,CAAC;IAChB,eAAe,EAAE,CACf,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;QACP,WAAW,EAAE,MAAM,CAAC;QACpB,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,kBAAkB,KAAK,OAAO,CAAC;KACjE,KACE,IAAI,CAAC;CACX;AAED,MAAM,WAAW,6BAA6B;IAC5C,aAAa,CAAC,EAAE,MAAM,aAAa,CAAC;IACpC,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,iBAAiB,CAAC,CAAC;CACtF;AAQD,wBAAgB,uBAAuB,CACrC,YAAY,GAAE,6BAAkC,GAC/C,CAAC,EAAE,EAAE,cAAc,KAAK,IAAI,CAoF9B;6BApFO,cAAc,KAAK,IAAI;AA8H/B,wBAAyC"}
package/dist/pi.js ADDED
@@ -0,0 +1,123 @@
1
+ import { createConfiguredAdapter } from "./adapters/factory.js";
2
+ import { createEngramReadController, } from "./viewer/core.js";
3
+ import { resolveProject as resolveValidatedProject, } from "./utils/project-resolver.js";
4
+ const UI_KEY = "flema-engram";
5
+ const REFRESH_COMMAND = "engram-refresh";
6
+ const MEMORY_SAVE_TOOLS = new Set(["mem_save", "save_memory"]);
7
+ export function createPiEngramExtension(dependencies = {}) {
8
+ const createAdapter = dependencies.createAdapter ?? (() => createConfiguredAdapter());
9
+ const resolveProject = dependencies.resolveProject
10
+ ?? ((adapter, cwd) => resolveValidatedProject(adapter, cwd));
11
+ return (pi) => {
12
+ let active;
13
+ let sessionToken;
14
+ const clearUi = (context) => {
15
+ if (!context.hasUI)
16
+ return;
17
+ context.ui.setStatus(UI_KEY, undefined);
18
+ context.ui.setWidget(UI_KEY, undefined);
19
+ };
20
+ const stopActive = () => {
21
+ if (!active)
22
+ return;
23
+ active.controller.dispose();
24
+ clearUi(active.context);
25
+ active = undefined;
26
+ };
27
+ const renderUnavailable = (context) => {
28
+ context.ui.setStatus(UI_KEY, "Engram unavailable");
29
+ context.ui.setWidget(UI_KEY, ["Engram unavailable"], { placement: "belowEditor" });
30
+ };
31
+ const refreshActive = async () => {
32
+ const current = active;
33
+ if (!current)
34
+ return undefined;
35
+ const outcome = await current.controller.refresh();
36
+ return active?.token === current.token ? outcome : undefined;
37
+ };
38
+ pi.on("session_start", async (_event, context) => {
39
+ stopActive();
40
+ const token = Symbol("pi-engram-session");
41
+ sessionToken = token;
42
+ if (!context.hasUI)
43
+ return;
44
+ try {
45
+ const adapter = createAdapter();
46
+ const controller = createEngramReadController(adapter, {
47
+ resolveProject: () => resolveProject(adapter, context.cwd),
48
+ onState: (state) => {
49
+ if (active?.token !== token)
50
+ return;
51
+ renderState(context, state);
52
+ },
53
+ });
54
+ active = { controller, context, token };
55
+ await refreshActive();
56
+ }
57
+ catch {
58
+ if (sessionToken !== token)
59
+ return;
60
+ stopActive();
61
+ renderUnavailable(context);
62
+ }
63
+ });
64
+ pi.on("tool_result", async (event, _context) => {
65
+ if (!isPiToolResultEvent(event) || event.isError || !MEMORY_SAVE_TOOLS.has(event.toolName))
66
+ return;
67
+ await refreshActive();
68
+ });
69
+ pi.on("session_shutdown", (_event, _context) => {
70
+ sessionToken = undefined;
71
+ stopActive();
72
+ });
73
+ pi.registerCommand(REFRESH_COMMAND, {
74
+ description: "Refresh the Flema Engram status and widget",
75
+ handler: async (_args, context) => {
76
+ if (!active) {
77
+ context.ui.notify("Engram viewer is not active", "warning");
78
+ return;
79
+ }
80
+ const outcome = await refreshActive();
81
+ if (outcome?.status === "success") {
82
+ context.ui.notify("Engram refreshed", "info");
83
+ }
84
+ else {
85
+ context.ui.notify("Engram refresh incomplete", "warning");
86
+ }
87
+ },
88
+ });
89
+ };
90
+ }
91
+ function isPiToolResultEvent(event) {
92
+ return typeof event.toolName === "string" && typeof event.isError === "boolean";
93
+ }
94
+ function renderState(context, state) {
95
+ const health = state.health.toUpperCase();
96
+ const project = state.projectName ?? "unresolved project";
97
+ const progress = aggregateOddProgress(state);
98
+ const blockerCount = state.blockers.length + progress.blocked;
99
+ const statusParts = [`Engram ${health}`, project];
100
+ if (progress.total > 0)
101
+ statusParts.push(`ODD ${progress.done}/${progress.total}`);
102
+ if (blockerCount > 0)
103
+ statusParts.push(`${blockerCount} blocked`);
104
+ context.ui.setStatus(UI_KEY, statusParts.join(" · "));
105
+ const lines = [`Engram · ${project} [${health}]`];
106
+ lines.push(progress.total > 0
107
+ ? `ODD ${progress.done}/${progress.total} done · ${progress.inProgress} active · ${blockerCount} blocked`
108
+ : "ODD no tracked feature");
109
+ const latest = state.recentActivity[0];
110
+ if (latest)
111
+ lines.push(`Latest: ${latest.title}`);
112
+ context.ui.setWidget(UI_KEY, lines, { placement: "belowEditor" });
113
+ }
114
+ function aggregateOddProgress(state) {
115
+ return (state.odd?.features ?? []).reduce((total, feature) => ({
116
+ total: total.total + feature.progress.total,
117
+ done: total.done + feature.progress.done,
118
+ inProgress: total.inProgress + feature.progress.in_progress,
119
+ blocked: total.blocked + feature.progress.blocked,
120
+ }), { total: 0, done: 0, inProgress: 0, blocked: 0 });
121
+ }
122
+ export default createPiEngramExtension();
123
+ //# sourceMappingURL=pi.js.map
package/dist/pi.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pi.js","sourceRoot":"","sources":["../src/pi.ts"],"names":[],"mappings":"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"}
@@ -5,12 +5,12 @@ export declare const localHealthResponseSchema: z.ZodObject<{
5
5
  version: z.ZodString;
6
6
  }, "strip", z.ZodTypeAny, {
7
7
  status: string;
8
- service: string;
9
8
  version: string;
9
+ service: string;
10
10
  }, {
11
11
  status: string;
12
- service: string;
13
12
  version: string;
13
+ service: string;
14
14
  }>;
15
15
  export type LocalHealthResponse = z.infer<typeof localHealthResponseSchema>;
16
16
  export declare const cloudHealthResponseSchema: z.ZodObject<{
@@ -19,12 +19,12 @@ export declare const cloudHealthResponseSchema: z.ZodObject<{
19
19
  version: z.ZodOptional<z.ZodString>;
20
20
  }, "strip", z.ZodTypeAny, {
21
21
  status: string;
22
- service?: string | undefined;
23
22
  version?: string | undefined;
23
+ service?: string | undefined;
24
24
  }, {
25
25
  status: string;
26
- service?: string | undefined;
27
26
  version?: string | undefined;
27
+ service?: string | undefined;
28
28
  }>;
29
29
  export type CloudHealthResponse = z.infer<typeof cloudHealthResponseSchema>;
30
30
  //# sourceMappingURL=health.d.ts.map
@@ -11,9 +11,9 @@ export declare const observationSchema: z.ZodObject<{
11
11
  created_at: z.ZodEffects<z.ZodString, string, unknown>;
12
12
  }, "strip", z.ZodTypeAny, {
13
13
  project: string;
14
- type: string;
15
14
  id: number;
16
15
  title: string;
16
+ type: string;
17
17
  topic_key: string;
18
18
  content: string;
19
19
  scope: "project" | "personal";
@@ -21,9 +21,9 @@ export declare const observationSchema: z.ZodObject<{
21
21
  created_at: string;
22
22
  }, {
23
23
  project: string;
24
- type: string;
25
24
  id: number;
26
25
  title: string;
26
+ type: string;
27
27
  content: string;
28
28
  scope: "project" | "personal";
29
29
  topic_key?: string | undefined;
@@ -5,13 +5,13 @@ export declare const oddTaskSchema: z.ZodObject<{
5
5
  title: z.ZodString;
6
6
  status: z.ZodEnum<["pending", "in_progress", "blocked", "done", "cancelled"]>;
7
7
  }, "strip", z.ZodTypeAny, {
8
- status: "pending" | "in_progress" | "blocked" | "done" | "cancelled";
9
8
  id: string;
10
9
  title: string;
10
+ status: "pending" | "done" | "in_progress" | "blocked" | "cancelled";
11
11
  }, {
12
- status: "pending" | "in_progress" | "blocked" | "done" | "cancelled";
13
12
  id: string;
14
13
  title: string;
14
+ status: "pending" | "done" | "in_progress" | "blocked" | "cancelled";
15
15
  }>;
16
16
  export declare const oddProvenanceSchema: z.ZodObject<{
17
17
  observationId: z.ZodNumber;
@@ -38,13 +38,13 @@ export declare const oddFeatureSchema: z.ZodObject<{
38
38
  title: z.ZodString;
39
39
  status: z.ZodEnum<["pending", "in_progress", "blocked", "done", "cancelled"]>;
40
40
  }, "strip", z.ZodTypeAny, {
41
- status: "pending" | "in_progress" | "blocked" | "done" | "cancelled";
42
41
  id: string;
43
42
  title: string;
43
+ status: "pending" | "done" | "in_progress" | "blocked" | "cancelled";
44
44
  }, {
45
- status: "pending" | "in_progress" | "blocked" | "done" | "cancelled";
46
45
  id: string;
47
46
  title: string;
47
+ status: "pending" | "done" | "in_progress" | "blocked" | "cancelled";
48
48
  }>, "many">;
49
49
  progress: z.ZodObject<{
50
50
  total: z.ZodNumber;
@@ -55,16 +55,16 @@ export declare const oddFeatureSchema: z.ZodObject<{
55
55
  cancelled: z.ZodNumber;
56
56
  }, "strip", z.ZodTypeAny, {
57
57
  pending: number;
58
+ done: number;
58
59
  in_progress: number;
59
60
  blocked: number;
60
- done: number;
61
61
  cancelled: number;
62
62
  total: number;
63
63
  }, {
64
64
  pending: number;
65
+ done: number;
65
66
  in_progress: number;
66
67
  blocked: number;
67
- done: number;
68
68
  cancelled: number;
69
69
  total: number;
70
70
  }>;
@@ -85,19 +85,19 @@ export declare const oddFeatureSchema: z.ZodObject<{
85
85
  updatedAt: string;
86
86
  }>;
87
87
  }, "strip", z.ZodTypeAny, {
88
- title: string;
89
- version: 1;
90
- featureId: string;
91
88
  tasks: {
92
- status: "pending" | "in_progress" | "blocked" | "done" | "cancelled";
93
89
  id: string;
94
90
  title: string;
91
+ status: "pending" | "done" | "in_progress" | "blocked" | "cancelled";
95
92
  }[];
93
+ title: string;
94
+ version: 1;
95
+ featureId: string;
96
96
  progress: {
97
97
  pending: number;
98
+ done: number;
98
99
  in_progress: number;
99
100
  blocked: number;
100
- done: number;
101
101
  cancelled: number;
102
102
  total: number;
103
103
  };
@@ -108,19 +108,19 @@ export declare const oddFeatureSchema: z.ZodObject<{
108
108
  updatedAt: string;
109
109
  };
110
110
  }, {
111
- title: string;
112
- version: 1;
113
- featureId: string;
114
111
  tasks: {
115
- status: "pending" | "in_progress" | "blocked" | "done" | "cancelled";
116
112
  id: string;
117
113
  title: string;
114
+ status: "pending" | "done" | "in_progress" | "blocked" | "cancelled";
118
115
  }[];
116
+ title: string;
117
+ version: 1;
118
+ featureId: string;
119
119
  progress: {
120
120
  pending: number;
121
+ done: number;
121
122
  in_progress: number;
122
123
  blocked: number;
123
- done: number;
124
124
  cancelled: number;
125
125
  total: number;
126
126
  };
@@ -183,13 +183,13 @@ export declare const oddStateSchema: z.ZodObject<{
183
183
  title: z.ZodString;
184
184
  status: z.ZodEnum<["pending", "in_progress", "blocked", "done", "cancelled"]>;
185
185
  }, "strip", z.ZodTypeAny, {
186
- status: "pending" | "in_progress" | "blocked" | "done" | "cancelled";
187
186
  id: string;
188
187
  title: string;
188
+ status: "pending" | "done" | "in_progress" | "blocked" | "cancelled";
189
189
  }, {
190
- status: "pending" | "in_progress" | "blocked" | "done" | "cancelled";
191
190
  id: string;
192
191
  title: string;
192
+ status: "pending" | "done" | "in_progress" | "blocked" | "cancelled";
193
193
  }>, "many">;
194
194
  progress: z.ZodObject<{
195
195
  total: z.ZodNumber;
@@ -200,16 +200,16 @@ export declare const oddStateSchema: z.ZodObject<{
200
200
  cancelled: z.ZodNumber;
201
201
  }, "strip", z.ZodTypeAny, {
202
202
  pending: number;
203
+ done: number;
203
204
  in_progress: number;
204
205
  blocked: number;
205
- done: number;
206
206
  cancelled: number;
207
207
  total: number;
208
208
  }, {
209
209
  pending: number;
210
+ done: number;
210
211
  in_progress: number;
211
212
  blocked: number;
212
- done: number;
213
213
  cancelled: number;
214
214
  total: number;
215
215
  }>;
@@ -230,19 +230,19 @@ export declare const oddStateSchema: z.ZodObject<{
230
230
  updatedAt: string;
231
231
  }>;
232
232
  }, "strip", z.ZodTypeAny, {
233
- title: string;
234
- version: 1;
235
- featureId: string;
236
233
  tasks: {
237
- status: "pending" | "in_progress" | "blocked" | "done" | "cancelled";
238
234
  id: string;
239
235
  title: string;
236
+ status: "pending" | "done" | "in_progress" | "blocked" | "cancelled";
240
237
  }[];
238
+ title: string;
239
+ version: 1;
240
+ featureId: string;
241
241
  progress: {
242
242
  pending: number;
243
+ done: number;
243
244
  in_progress: number;
244
245
  blocked: number;
245
- done: number;
246
246
  cancelled: number;
247
247
  total: number;
248
248
  };
@@ -253,19 +253,19 @@ export declare const oddStateSchema: z.ZodObject<{
253
253
  updatedAt: string;
254
254
  };
255
255
  }, {
256
- title: string;
257
- version: 1;
258
- featureId: string;
259
256
  tasks: {
260
- status: "pending" | "in_progress" | "blocked" | "done" | "cancelled";
261
257
  id: string;
262
258
  title: string;
259
+ status: "pending" | "done" | "in_progress" | "blocked" | "cancelled";
263
260
  }[];
261
+ title: string;
262
+ version: 1;
263
+ featureId: string;
264
264
  progress: {
265
265
  pending: number;
266
+ done: number;
266
267
  in_progress: number;
267
268
  blocked: number;
268
- done: number;
269
269
  cancelled: number;
270
270
  total: number;
271
271
  };
@@ -320,19 +320,19 @@ export declare const oddStateSchema: z.ZodObject<{
320
320
  }, "strip", z.ZodTypeAny, {
321
321
  bounded: true;
322
322
  features: {
323
- title: string;
324
- version: 1;
325
- featureId: string;
326
323
  tasks: {
327
- status: "pending" | "in_progress" | "blocked" | "done" | "cancelled";
328
324
  id: string;
329
325
  title: string;
326
+ status: "pending" | "done" | "in_progress" | "blocked" | "cancelled";
330
327
  }[];
328
+ title: string;
329
+ version: 1;
330
+ featureId: string;
331
331
  progress: {
332
332
  pending: number;
333
+ done: number;
333
334
  in_progress: number;
334
335
  blocked: number;
335
- done: number;
336
336
  cancelled: number;
337
337
  total: number;
338
338
  };
@@ -357,19 +357,19 @@ export declare const oddStateSchema: z.ZodObject<{
357
357
  }, {
358
358
  bounded: true;
359
359
  features: {
360
- title: string;
361
- version: 1;
362
- featureId: string;
363
360
  tasks: {
364
- status: "pending" | "in_progress" | "blocked" | "done" | "cancelled";
365
361
  id: string;
366
362
  title: string;
363
+ status: "pending" | "done" | "in_progress" | "blocked" | "cancelled";
367
364
  }[];
365
+ title: string;
366
+ version: 1;
367
+ featureId: string;
368
368
  progress: {
369
369
  pending: number;
370
+ done: number;
370
371
  in_progress: number;
371
372
  blocked: number;
372
- done: number;
373
373
  cancelled: number;
374
374
  total: number;
375
375
  };
@@ -5,14 +5,14 @@ export declare const projectSchema: z.ZodObject<{
5
5
  lastActiveAt: z.ZodString;
6
6
  scopes: z.ZodArray<z.ZodEnum<["project", "personal"]>, "many">;
7
7
  }, "strip", z.ZodTypeAny, {
8
+ name: string;
8
9
  observationCount: number;
9
10
  lastActiveAt: string;
10
- name: string;
11
11
  scopes: ("project" | "personal")[];
12
12
  }, {
13
+ name: string;
13
14
  observationCount: number;
14
15
  lastActiveAt: string;
15
- name: string;
16
16
  scopes: ("project" | "personal")[];
17
17
  }>;
18
18
  export type ProjectSchema = z.infer<typeof projectSchema>;