taskchef 9.7.0 → 9.7.1

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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "taskchef",
3
- "version": "9.7.0",
3
+ "version": "9.7.1",
4
4
  "description": "Native Codex dashboard with lightweight project delegation.",
5
5
  "author": {
6
6
  "name": "Favo Yang",
package/docs/mcp-app.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # TaskChef sidebar
2
2
 
3
- The public app name is **TaskChef**. “TaskChef Next” remains the internal project name.
3
+ The released app is **TaskChef**. The development app is **TaskChef Dev**, with plugin and MCP server ID `taskchef-dev`.
4
4
 
5
5
  The native dashboard requires Node.js 22.18+, 23.2+, or 24+ for local Codex SQLite access.
6
6
 
@@ -196,7 +196,7 @@ Use this order for every development change:
196
196
  For a full Dev update, give the staging package a unique development version
197
197
  in both `package.json` and `.codex-plugin/plugin.json` (and package-lock metadata
198
198
  if present), such as `9.0.0-dev.1`. Set only the staging manifest's plugin name
199
- to `taskchef-next`; keep the source release manifest named `taskchef`.
199
+ to `taskchef-dev`; keep the source release manifest named `taskchef`.
200
200
  Before installing the staging package through the local development marketplace,
201
201
  run:
202
202
 
@@ -205,12 +205,21 @@ node scripts/prepare-mcp-app-preview.js /path/to/staging/plugin
205
205
  ```
206
206
 
207
207
  The script sets the copied plugin’s display name to **TaskChef Dev** and
208
- normalizes its MCP server key to `taskchef-next`. It refuses release manifests. The sidebar tool reads its
208
+ normalizes its MCP server key to `taskchef-dev`. It refuses release manifests. The sidebar tool reads its
209
209
  name from that manifest. The release checkout and release package keep
210
210
  **TaskChef**. Run this step again whenever rebuilding the development package.
211
211
  Do not register a standalone preview MCP server alongside these two plugins.
212
212
  Restart Codex after changes to plugin identity or backend code.
213
213
 
214
+ When migrating an existing Dev installation, prepare a new staging package with
215
+ plugin ID `taskchef-dev` and a unique Dev version. Set its local marketplace
216
+ name and plugin entry to `taskchef-dev`, then add the marketplace and install
217
+ `taskchef-dev@taskchef-dev`. Verify the new installation before removing
218
+ `taskchef-next@taskchef-next-preview` and the old marketplace registration.
219
+ Both editions continue to share `~/.agents/taskchef`; preserve that state and
220
+ the legacy GitHub credential key. After restarting Codex, the Dev skill is
221
+ `$taskchef-dev:delegate` and its MCP namespace is `taskchef_dev`.
222
+
214
223
  ## Local UI review without restarting Codex
215
224
 
216
225
  For UI-only changes, update the HTML in the installation that the running MCP
@@ -222,10 +231,10 @@ folder. Its next resource read then fails with `ENOENT`, and the sidebar shows
222
231
  From the source checkout, run:
223
232
 
224
233
  ```sh
225
- npm run update:mcp-app-preview -- /path/to/the/running/taskchef-next/version
234
+ npm run update:mcp-app-preview -- /path/to/the/running/taskchef-dev/version
226
235
  ```
227
236
 
228
- The helper builds the UI, checks the development plugin ID is `taskchef-next`, and replaces only
237
+ The helper builds the UI, checks the development plugin ID is `taskchef-dev`, and replaces only
229
238
  `src/mcp-app/dist/index.html` atomically. It preserves the plugin version, server
230
239
  code, dependencies, and local data. It refuses missing or redirected HTML paths.
231
240
  Then right-click **TaskChef Dev** in the Codex sidebar and choose **Refresh**.
@@ -351,13 +360,13 @@ uses this repository's GitHub token; no shared-marketplace deploy key is needed.
351
360
  If the push loses a race with another main update, rerun the Release workflow
352
361
  on main to retry after checking the current published version. Do not force push.
353
362
 
354
- Keep TaskChef Dev in a separate local marketplace named `taskchef-next-preview`,
355
- with plugin ID `taskchef-next` and display name **TaskChef Dev**. Store that
363
+ Keep TaskChef Dev in a separate local marketplace named `taskchef-dev`,
364
+ with plugin ID `taskchef-dev` and display name **TaskChef Dev**. Store that
356
365
  marketplace and its staging packages in a persistent local folder, outside
357
366
  this public checkout. Its catalog uses `source.source: local` with a path to
358
367
  the prepared staging package. Add that folder with
359
368
  `codex plugin marketplace add /path/to/local-dev-marketplace`, then install
360
- `codex plugin add taskchef-next@taskchef-next-preview`. This can coexist with
369
+ `codex plugin add taskchef-dev@taskchef-dev`. This can coexist with
361
370
  `taskchef@taskchef`. Never rename the source release manifest for Dev.
362
371
 
363
372
  Retire the old shared catalog entry only after this repository's catalog is
@@ -378,14 +387,14 @@ There is no custom range. Dates use the view's local timezone, including DST.
378
387
  Range changes and reopening Usage query one shared history snapshot without
379
388
  rescanning logs. The combined snapshot is also saved atomically with private file
380
389
  permissions under `~/.agents/taskchef/cache/usage-history/`, scoped by Codex home
381
- and CLI/exec visibility. It contains the fields needed for charts, including
390
+ and the all-sources accounting policy. It contains the fields needed for charts, including
382
391
  weekly readings, and no message content or per-file parsing records. After an
383
392
  MCP server restart, the first Usage request loads a compatible disk snapshot
384
393
  and returns saved charts before refreshing history in the background. Range and
385
394
  timezone changes share that refresh. A missing, damaged, or incompatible snapshot
386
395
  falls back to a normal scan. A failed background refresh retains the last good
387
- snapshot, shows a Retry action, and never overwrites it with a failed result. The snapshot is scoped by CLI/exec visibility, independently of
388
- range or timezone. After one minute it refreshes in the background while cached
396
+ snapshot, shows a Retry action, and never overwrites it with a failed result. The snapshot is independent of Board visibility, range, and timezone. Older
397
+ visibility-filtered snapshots are not reused. After one minute it refreshes in the background while cached
389
398
  charts remain visible. Refresh explicitly rebuilds it, reusing existing per-file
390
399
  metadata and incremental parsing caches. Unchanged files retain parsed records
391
400
  on disk across restarts and turn or price changes. A session filename index
@@ -419,10 +428,11 @@ interpolate between recorded points; they are not additional measurements.
419
428
  Codex writes service-provided seven-day primary or secondary allowance windows
420
429
  into local rollout token-count events, including events without token counters.
421
430
  TaskChef reads these logs; it does not poll the service for current allowance.
422
- Root-chat CLI/exec visibility controls which logs supply observations.
431
+ Weekly observations include all root-chat sources, regardless of Board visibility.
423
432
 
424
- Archived chats and descendant usage are included. CLI/exec visibility settings
425
- still apply to root chats. Descendants are counted once under their root chat's
433
+ Desktop, CLI, exec, archived chats, and descendant usage are included. Board
434
+ visibility settings do not narrow Usage or change its cached history.
435
+ Descendants are counted once under their root chat's
426
436
  current project. Unassigned chats share one Unassigned project. Daily usage
427
437
  comes from recorded call timestamps, not chat creation or last-update dates.
428
438
  Unexplained cumulative counter gaps stay in lifetime totals but are excluded
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "taskchef",
3
- "version": "9.7.0",
3
+ "version": "9.7.1",
4
4
  "description": "A native Codex dashboard for chats, usage, pull requests, and schedules.",
5
5
  "license": "Apache-2.0",
6
6
  "author": "Favo Yang",
@@ -28,7 +28,7 @@ export async function assertNoStateWriters(paths, runCommand = run) {
28
28
  if (!identities.has(root)) {
29
29
  let name;
30
30
  try { name = JSON.parse(await readFile(join(root, ".codex-plugin/plugin.json"), "utf8")).name; } catch { /* Unrelated process. */ }
31
- identities.set(root, ["taskchef", "taskchef-next"].includes(name));
31
+ identities.set(root, ["taskchef", "taskchef-dev", "taskchef-next"].includes(name));
32
32
  }
33
33
  return identities.get(root);
34
34
  }
@@ -674,10 +674,10 @@ export class CodexSessionScanner {
674
674
  }
675
675
  return { month, timeZone, chats };
676
676
  }
677
- async usageAnalytics({ range, timeZone, settings }) {
678
- return aggregateUsage(await this.usageHistory({ settings }), { range, timeZone, now: this.now() });
677
+ async usageAnalytics({ range, timeZone }) {
678
+ return aggregateUsage(await this.usageHistory(), { range, timeZone, now: this.now() });
679
679
  }
680
- async usageHistory({ settings, onProgress = () => {}, rescan = false }) {
680
+ async usageHistory({ onProgress = () => {}, rescan = false } = {}) {
681
681
  if (rescan) this.sessionUsage.inventoryAt = -Infinity;
682
682
  const snapshot = await this.refresh();
683
683
  if (!snapshot.healthy) throw new Error(snapshot.scan.error);
@@ -690,8 +690,8 @@ export class CodexSessionScanner {
690
690
  })), records.projects);
691
691
  const families = [];
692
692
  const seen = new Set();
693
- // History includes archived chats. CLI/exec preferences still apply.
694
- const tasks = grouped.tasks.filter(task => (settings.showCli || task.observed?.source !== "cli") && (settings.showExec || task.observed?.source !== "exec"));
693
+ // Accounting includes every root, independent of Board visibility settings.
694
+ const tasks = grouped.tasks;
695
695
  let completed = 0;
696
696
  onProgress({ completed, total: tasks.length });
697
697
  for (const task of tasks) {