taskchef 9.2.0 → 9.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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "taskchef",
3
- "version": "9.2.0",
3
+ "version": "9.3.0",
4
4
  "description": "Native Codex dashboard with lightweight project delegation.",
5
5
  "author": {
6
6
  "name": "Favo Yang",
package/README.md CHANGED
@@ -6,9 +6,33 @@ Chats appear regardless of how they were started.
6
6
 
7
7
  ## Install
8
8
 
9
- Install **TaskChef** from the `favoyang-plugins` Codex marketplace. TaskChef uses
10
- a local Node.js MCP server; Node.js 22.18+, 23.2+, or 24+ is required. Open **TaskChef**
11
- from the Codex sidebar. No dispatcher workspace or project indexing is needed.
9
+ TaskChef's marketplace lives in this repository. In Codex, open **Settings →
10
+ Plugins → Add → Add a marketplace** and use
11
+ `https://github.com/favoyang/taskchef.git`. Leave the Git ref as `main` and Sparse
12
+ paths empty. Open **Plugins → Personal**, find **TaskChef** under **TaskChef**,
13
+ and install it.
14
+
15
+ Alternatively, use the Codex CLI:
16
+
17
+ ```sh
18
+ codex plugin marketplace add favoyang/taskchef
19
+ codex plugin add taskchef@taskchef
20
+ ```
21
+
22
+ Restart Codex. Open **…** below Plugins in the left dock, find **TaskChef**, and
23
+ pin it to keep the board in the sidebar. TaskChef uses a local Node.js MCP
24
+ server and npm. Supported Node.js versions are 22.18+ in the 22 series, or
25
+ 23.2 and newer. Node.js 24 is recommended for a new installation. Server
26
+ dependencies are included in the published package.
27
+
28
+ ### Move from the shared marketplace
29
+
30
+ If you installed `taskchef@favoyang-plugins`, add the new marketplace and install
31
+ `taskchef@taskchef` with the commands above. After it installs successfully,
32
+ remove the old plugin with `codex plugin remove taskchef@favoyang-plugins`, then
33
+ restart Codex. Keep only one released TaskChef installation enabled. Local
34
+ settings, GitHub credentials, and Codex chat history are independent of the
35
+ marketplace cache and do not need to be reset. TaskChef Dev stays separate.
12
36
 
13
37
  Codex databases and logs stay on your computer and remain the source of truth.
14
38
  TaskChef keeps its own settings, manual Done marks, notification state, and
@@ -48,3 +72,8 @@ name; apply that identity only to its local staging package. See
48
72
  [development packaging](docs/mcp-app.md#development-plugin-identity).
49
73
 
50
74
  [Native app guide](docs/mcp-app.md) · [GitHub setup](docs/taskchef-next-github.md)
75
+
76
+ ## Feedback
77
+
78
+ [Report a bug](https://github.com/favoyang/taskchef/issues/new?template=bug_report.yml)
79
+ or [request a feature](https://github.com/favoyang/taskchef/issues/new?template=feature_request.yml).
package/docs/mcp-app.md CHANGED
@@ -337,3 +337,31 @@ message does not cause polling to replay it. Other features continue working. Th
337
337
  second, and missing chat snapshots wait at most 250 ms for all subscriptions
338
338
  combined. Hidden views do not initiate refreshes; an existing subscription can
339
339
  still receive live updates while the MCP process remains running.
340
+
341
+ ## Marketplace and release ownership
342
+
343
+ The public catalog is `.agents/plugins/marketplace.json` in this repository.
344
+ Its marketplace name is `taskchef`; the released install is `taskchef@taskchef`.
345
+ The catalog pins a published npm package containing the built UI and production
346
+ server dependencies. A raw Git checkout is not a packaged release.
347
+
348
+ After semantic-release publishes, the marketplace job checks the expected npm
349
+ version and archive, then commits only the catalog pin on the latest `main`.
350
+ A failed check leaves the prior pin in place and fails the workflow. The job
351
+ uses this repository's GitHub token; no shared-marketplace deploy key is needed.
352
+ If the push loses a race with another main update, rerun the Release workflow
353
+ on main to retry after checking the current published version. Do not force push.
354
+
355
+ Keep TaskChef Dev in a separate local marketplace named `taskchef-next-preview`,
356
+ with plugin ID `taskchef-next` and display name **TaskChef Dev**. Store that
357
+ marketplace and its staging packages in a persistent local folder, outside
358
+ this public checkout. Its catalog uses `source.source: local` with a path to
359
+ the prepared staging package. Add that folder with
360
+ `codex plugin marketplace add /path/to/local-dev-marketplace`, then install
361
+ `codex plugin add taskchef-next@taskchef-next-preview`. This can coexist with
362
+ `taskchef@taskchef`. Never rename the source release manifest for Dev.
363
+
364
+ Retire the old shared catalog entry only after this repository's catalog is
365
+ live, the release workflow has completed, and a clean installation from the
366
+ new marketplace succeeds. Existing users must migrate explicitly; changing
367
+ a marketplace does not automatically move their installed plugin identity.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "taskchef",
3
- "version": "9.2.0",
3
+ "version": "9.3.0",
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",
package/src/mcp-app.js CHANGED
@@ -43,9 +43,13 @@ export async function pluginSettingsUrl({ pluginRoot = fileURLToPath(new URL("..
43
43
  const marketplace = basename(dirname(dirname(pluginRoot)));
44
44
  try {
45
45
  const config = parseToml(await readFile(join(codexHome, "config.toml"), "utf8"));
46
- const source = config.marketplaces?.[marketplace]?.source;
47
- if (typeof source === "string" && isAbsolute(source)) {
48
- const marketplacePath = join(source, ".agents", "plugins", "marketplace.json");
46
+ const entry = config.marketplaces?.[marketplace];
47
+ const source = entry?.source;
48
+ const root = entry?.source_type === "git"
49
+ ? join(codexHome, ".tmp", "marketplaces", marketplace)
50
+ : source;
51
+ if (typeof source === "string" && typeof root === "string" && isAbsolute(root)) {
52
+ const marketplacePath = join(root, ".agents", "plugins", "marketplace.json");
49
53
  const catalog = JSON.parse(await readFile(marketplacePath, "utf8"));
50
54
  if (catalog.name !== marketplace || !catalog.plugins?.some((entry) => entry.name === plugin)) return null;
51
55
  return `codex://plugins/${encodeURIComponent(plugin)}?${new URLSearchParams({ marketplacePath })}`;