taskchef 9.7.0 → 9.7.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/.codex-plugin/plugin.json +1 -1
- package/docs/mcp-app.md +29 -17
- package/package.json +1 -1
- package/scripts/migrate-taskchef-state.js +1 -1
- package/src/codex-session-scanner.js +5 -5
- package/src/mcp-app/dist/index.html +27 -27
- package/src/mcp-app/react/CalendarView.test.tsx +19 -0
- package/src/mcp-app/react/CalendarView.tsx +3 -1
- package/src/mcp-app/react/UsageView.tsx +1 -1
- package/src/mcp-app/react/main.test.tsx +27 -8
- package/src/mcp-app/react/main.tsx +1 -1
- package/src/mcp-app/react/styles.css +3 -4
- package/src/mcp-app.js +3 -3
package/docs/mcp-app.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# TaskChef sidebar
|
|
2
2
|
|
|
3
|
-
The
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
355
|
-
with plugin ID `taskchef-
|
|
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-
|
|
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
|
|
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
|
|
388
|
-
|
|
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
|
-
|
|
431
|
+
Weekly observations include all root-chat sources, regardless of Board visibility.
|
|
423
432
|
|
|
424
|
-
|
|
425
|
-
|
|
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
|
|
@@ -440,9 +450,9 @@ refreshes, with their last-update time and scan progress.
|
|
|
440
450
|
Calendar sits beside Board and Usage. It opens on the current local month;
|
|
441
451
|
previous/next arrows surround the month title. Next is disabled at the current
|
|
442
452
|
local month, so future months cannot be selected. There is no Today control.
|
|
443
|
-
Arrows
|
|
444
|
-
|
|
445
|
-
|
|
453
|
+
Arrows are always visible, with a dimmed Next arrow at the current month.
|
|
454
|
+
Button borders appear only when an enabled arrow is hovered; keyboard focus
|
|
455
|
+
keeps a visible outline. Project, search, update window, and Pinned
|
|
446
456
|
filters are remembered locally. An unavailable saved project resets to All
|
|
447
457
|
projects only after the project inventory loads.
|
|
448
458
|
Project, Search Chats, Pinned, and native visibility settings apply. The Board's
|
|
@@ -457,6 +467,8 @@ Each chat's recorded turn intervals become calendar dates in the viewer's
|
|
|
457
467
|
timezone. Adjacent dates merge into one bar. One full idle date breaks the bar,
|
|
458
468
|
including weekends; a later segment has a resumed marker and opens the same
|
|
459
469
|
chat Details. Continuous work across a week boundary uses continuation arrows.
|
|
470
|
+
Hovering a bar highlights every visible segment of the same chat across the month,
|
|
471
|
+
including resumed segments.
|
|
460
472
|
An exact midnight end does not occupy the following date. A current running
|
|
461
473
|
turn extends to now; completed turns do not extend through idle review waits.
|
|
462
474
|
Project colors stay consistent when navigating or filtering. Crowded weeks show
|
package/package.json
CHANGED
|
@@ -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
|
|
678
|
-
return aggregateUsage(await this.usageHistory(
|
|
677
|
+
async usageAnalytics({ range, timeZone }) {
|
|
678
|
+
return aggregateUsage(await this.usageHistory(), { range, timeZone, now: this.now() });
|
|
679
679
|
}
|
|
680
|
-
async usageHistory({
|
|
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
|
-
//
|
|
694
|
-
const tasks = grouped.tasks
|
|
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) {
|