taskchef 7.15.5 → 7.16.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.
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "taskchef",
|
|
3
|
-
"version": "7.
|
|
3
|
+
"version": "7.16.0",
|
|
4
4
|
"description": "Dispatch work from a data-only workspace to visible Codex project tasks.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Favo Yang",
|
|
@@ -29,10 +29,10 @@
|
|
|
29
29
|
],
|
|
30
30
|
"websiteURL": "https://github.com/favoyang/taskchef",
|
|
31
31
|
"defaultPrompt": [
|
|
32
|
-
"$taskchef-bootstrap Set up TaskChef and index my Codex projects.",
|
|
33
|
-
"$taskchef-delegate
|
|
34
|
-
"
|
|
35
|
-
"$taskchef-copilot
|
|
32
|
+
"$taskchef-bootstrap Set up TaskChef and index my local Codex projects.",
|
|
33
|
+
"$taskchef-delegate Do X in Y project.",
|
|
34
|
+
"Start and open the TaskChef dashboard.",
|
|
35
|
+
"$taskchef-copilot Summarize recent delegated work and tell me what needs attention."
|
|
36
36
|
],
|
|
37
37
|
"brandColor": "#D97706",
|
|
38
38
|
"composerIcon": "./assets/taskchef.svg",
|
package/README.md
CHANGED
|
@@ -41,7 +41,7 @@ no elevated permissions.
|
|
|
41
41
|
Ask the bootstrap skill to create the per-user dispatcher:
|
|
42
42
|
|
|
43
43
|
```text
|
|
44
|
-
$taskchef-bootstrap Set up TaskChef.
|
|
44
|
+
$taskchef-bootstrap Set up TaskChef and index my local Codex projects.
|
|
45
45
|
```
|
|
46
46
|
|
|
47
47
|
The canonical workspace is `~/.agents/taskchef`. TaskChef owns only:
|
|
@@ -181,7 +181,7 @@ The dashboard is the primary monitoring and browsing UI. Ask copilot when you
|
|
|
181
181
|
want a concise explanation or recommendation:
|
|
182
182
|
|
|
183
183
|
```text
|
|
184
|
-
$taskchef-copilot
|
|
184
|
+
$taskchef-copilot Summarize recent delegated work and tell me what needs attention.
|
|
185
185
|
```
|
|
186
186
|
|
|
187
187
|
Copilot starts from TaskChef's normalized cached brief. It uses live Codex
|
|
@@ -219,6 +219,12 @@ eight-character prefix.
|
|
|
219
219
|
|
|
220
220
|
## Dashboard
|
|
221
221
|
|
|
222
|
+
Ask the dispatcher to make the dashboard available and open it:
|
|
223
|
+
|
|
224
|
+
```text
|
|
225
|
+
Start and open the TaskChef dashboard.
|
|
226
|
+
```
|
|
227
|
+
|
|
222
228
|
Dispatcher turns call the input-free `ensure_dashboard` MCP tool. It starts at
|
|
223
229
|
most one dashboard inside the existing TaskChef MCP process on
|
|
224
230
|
`127.0.0.1:3210`, or reuses a listener only when its bounded `/api/health`
|
|
@@ -6,6 +6,10 @@ This folder is the canonical per-user TaskChef dispatcher workspace.
|
|
|
6
6
|
- Early in every dispatcher turn, best-effort call the TaskChef
|
|
7
7
|
`ensure_dashboard` MCP tool. Dashboard startup failure must not block direct
|
|
8
8
|
TaskChef answers, reporting, or delegation.
|
|
9
|
+
- A request to start or open the TaskChef dashboard is TaskChef maintenance,
|
|
10
|
+
not delegated project work. Call `ensure_dashboard`, then open or navigate to
|
|
11
|
+
its returned URL when an in-app browser capability is available. Otherwise,
|
|
12
|
+
return the URL as a clickable link.
|
|
9
13
|
- Use `$taskchef-bootstrap` when initializing or refreshing this workspace,
|
|
10
14
|
changing or listing its configured projects, running TaskChef doctor,
|
|
11
15
|
or repairing its managed instructions.
|
package/package.json
CHANGED
package/src/dashboard/app.js
CHANGED
|
@@ -29,6 +29,8 @@ const state = {
|
|
|
29
29
|
};
|
|
30
30
|
let dateRefreshTimer = null;
|
|
31
31
|
let detailRequestGeneration = 0;
|
|
32
|
+
let copyTaskIdGeneration = 0;
|
|
33
|
+
let copyTaskIdTimer = null;
|
|
32
34
|
const relativeTimes = new RelativeTimeController();
|
|
33
35
|
|
|
34
36
|
const elements = {
|
|
@@ -36,7 +38,7 @@ const elements = {
|
|
|
36
38
|
closeDialog: document.querySelector("#close-dialog"),
|
|
37
39
|
connectionDot: document.querySelector("#connection-dot"),
|
|
38
40
|
connectionLabel: document.querySelector("#connection-label"),
|
|
39
|
-
|
|
41
|
+
copyTaskId: document.querySelector("#copy-task-id"),
|
|
40
42
|
dashboardMessage: document.querySelector("#dashboard-message"),
|
|
41
43
|
dashboardMessageText: document.querySelector("#dashboard-message-text"),
|
|
42
44
|
dateFilter: document.querySelector("#date-filter"),
|
|
@@ -211,6 +213,11 @@ function configureOpenTaskControl(control, ariaLabel) {
|
|
|
211
213
|
control.replaceChildren(codexIcon(), label);
|
|
212
214
|
}
|
|
213
215
|
|
|
216
|
+
function setCopyTaskIdLabel(label) {
|
|
217
|
+
elements.copyTaskId.textContent = label;
|
|
218
|
+
elements.copyTaskId.setAttribute("aria-label", label);
|
|
219
|
+
}
|
|
220
|
+
|
|
214
221
|
function setConnection(connected) {
|
|
215
222
|
elements.connectionDot.classList.toggle("connected", connected);
|
|
216
223
|
elements.connectionLabel.textContent = connected ? "Live" : "Reconnecting…";
|
|
@@ -377,6 +384,11 @@ function turnTimeline(task) {
|
|
|
377
384
|
}
|
|
378
385
|
|
|
379
386
|
function renderDialog(task) {
|
|
387
|
+
if (state.selectedTask?.id !== task.id) {
|
|
388
|
+
copyTaskIdGeneration += 1;
|
|
389
|
+
clearTimeout(copyTaskIdTimer);
|
|
390
|
+
copyTaskIdTimer = null;
|
|
391
|
+
}
|
|
380
392
|
const preservedResults = state.selectedTask?.id === task.id
|
|
381
393
|
? state.selectedTask.results
|
|
382
394
|
: null;
|
|
@@ -398,7 +410,8 @@ function renderDialog(task) {
|
|
|
398
410
|
);
|
|
399
411
|
elements.dialogResults.replaceChildren(...turnTimeline(detailedTask));
|
|
400
412
|
elements.dialogInstruction.textContent = task.instruction;
|
|
401
|
-
elements.
|
|
413
|
+
elements.copyTaskId.disabled = !task.id;
|
|
414
|
+
setCopyTaskIdLabel("Copy Task ID");
|
|
402
415
|
elements.dialogMetadata.replaceChildren(
|
|
403
416
|
...detailRow("Current status", taskStatusLabel(task)),
|
|
404
417
|
...detailRow("Current turn ref", task.turnRef),
|
|
@@ -607,14 +620,26 @@ elements.closeDialog.addEventListener("click", () => elements.dialog.close());
|
|
|
607
620
|
elements.dialog.addEventListener("click", (event) => {
|
|
608
621
|
if (event.target === elements.dialog) elements.dialog.close();
|
|
609
622
|
});
|
|
610
|
-
elements.
|
|
611
|
-
|
|
623
|
+
elements.copyTaskId.addEventListener("click", async () => {
|
|
624
|
+
const taskId = state.selectedTask?.id;
|
|
625
|
+
if (!taskId) return;
|
|
626
|
+
const copyGeneration = ++copyTaskIdGeneration;
|
|
627
|
+
clearTimeout(copyTaskIdTimer);
|
|
628
|
+
copyTaskIdTimer = null;
|
|
612
629
|
try {
|
|
613
|
-
await navigator.clipboard.writeText(
|
|
614
|
-
|
|
615
|
-
|
|
630
|
+
await navigator.clipboard.writeText(taskId);
|
|
631
|
+
if (copyGeneration !== copyTaskIdGeneration || state.selectedTask?.id !== taskId) return;
|
|
632
|
+
setCopyTaskIdLabel("Task ID copied");
|
|
633
|
+
copyTaskIdTimer = setTimeout(() => {
|
|
634
|
+
if (copyGeneration === copyTaskIdGeneration && state.selectedTask?.id === taskId) {
|
|
635
|
+
setCopyTaskIdLabel("Copy Task ID");
|
|
636
|
+
}
|
|
637
|
+
copyTaskIdTimer = null;
|
|
638
|
+
}, 1_500);
|
|
616
639
|
} catch {
|
|
617
|
-
|
|
640
|
+
if (copyGeneration === copyTaskIdGeneration && state.selectedTask?.id === taskId) {
|
|
641
|
+
showMessage("Clipboard access is unavailable. Copy the Task ID from the metadata below.");
|
|
642
|
+
}
|
|
618
643
|
}
|
|
619
644
|
});
|
|
620
645
|
elements.openProject.addEventListener("click", async (event) => {
|
package/src/dashboard/index.html
CHANGED
|
@@ -112,7 +112,7 @@
|
|
|
112
112
|
</picture>
|
|
113
113
|
<span>Open task</span>
|
|
114
114
|
</button>
|
|
115
|
-
<button id="copy-
|
|
115
|
+
<button id="copy-task-id" class="secondary-button" type="button" aria-label="Copy Task ID">Copy Task ID</button>
|
|
116
116
|
</div>
|
|
117
117
|
<nav id="dialog-related-links" class="github-links" aria-label="Related GitHub links" hidden></nav>
|
|
118
118
|
<section>
|