codex-task 0.2.1 → 0.2.3

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/dist/images.js CHANGED
@@ -12,21 +12,43 @@ const MIME_BY_EXTENSION = {
12
12
  };
13
13
  const MAX_IMAGE_BYTES = 20 * 1024 * 1024;
14
14
  const MAX_TOTAL_IMAGE_BYTES = 50 * 1024 * 1024;
15
+ export function validateInputImages(paths) {
16
+ const imagePaths = (paths ?? []).map((path) => resolve(path));
17
+ if (imagePaths.length > 5)
18
+ throw usageError("at most 5 input images are supported");
19
+ let totalBytes = 0;
20
+ for (const path of imagePaths) {
21
+ if (!existsSync(path))
22
+ throw usageError(`input image does not exist: ${path}`);
23
+ const extension = extname(path).toLowerCase();
24
+ if (!MIME_BY_EXTENSION[extension]) {
25
+ throw usageError(`unsupported image type for ${path}; use png, jpg, jpeg, webp, or gif`);
26
+ }
27
+ const bytes = statSync(path).size;
28
+ if (bytes > MAX_IMAGE_BYTES)
29
+ throw usageError(`input image exceeds 20 MiB: ${path}`);
30
+ totalBytes += bytes;
31
+ }
32
+ if (totalBytes > MAX_TOTAL_IMAGE_BYTES)
33
+ throw usageError("input images exceed the 50 MiB total limit");
34
+ return imagePaths;
35
+ }
15
36
  export function validateImageOptions(options) {
16
37
  const count = options.count ?? 1;
17
38
  const concurrency = options.concurrency ?? 1;
18
39
  const size = options.size ?? "auto";
19
40
  const quality = options.quality ?? "auto";
20
41
  const background = options.background ?? "auto";
21
- const imagePaths = options.imagePaths ?? [];
42
+ const imagePaths = validateInputImages(options.imagePaths);
43
+ const temporary = options.temporary ?? false;
44
+ if (temporary && options.output)
45
+ throw usageError("--temp cannot be combined with --output");
22
46
  if (!Number.isInteger(count) || count < 1 || count > 10) {
23
47
  throw usageError("count must be an integer from 1 to 10");
24
48
  }
25
49
  if (!Number.isInteger(concurrency) || concurrency < 1 || concurrency > 3) {
26
50
  throw usageError("concurrency must be an integer from 1 to 3");
27
51
  }
28
- if (imagePaths.length > 5)
29
- throw usageError("at most 5 reference images are supported");
30
52
  if (!/^(auto|[1-9]\d{0,3}x[1-9]\d{0,3})$/.test(size)) {
31
53
  throw usageError("size must be auto or WIDTHxHEIGHT");
32
54
  }
@@ -36,30 +58,15 @@ export function validateImageOptions(options) {
36
58
  throw usageError("image width and height must be at most 3840");
37
59
  }
38
60
  }
39
- let totalBytes = 0;
40
- for (const path of imagePaths) {
41
- if (!existsSync(path))
42
- throw usageError(`reference image does not exist: ${path}`);
43
- const extension = extname(path).toLowerCase();
44
- if (!MIME_BY_EXTENSION[extension]) {
45
- throw usageError(`unsupported image type for ${path}; use png, jpg, jpeg, webp, or gif`);
46
- }
47
- const bytes = statSync(path).size;
48
- if (bytes > MAX_IMAGE_BYTES)
49
- throw usageError(`reference image exceeds 20 MiB: ${path}`);
50
- totalBytes += bytes;
51
- }
52
- if (totalBytes > MAX_TOTAL_IMAGE_BYTES) {
53
- throw usageError("reference images exceed the 50 MiB total limit");
54
- }
55
61
  return {
56
62
  count,
57
63
  concurrency,
58
64
  size,
59
65
  quality,
60
66
  background,
61
- imagePaths: imagePaths.map((path) => resolve(path)),
67
+ imagePaths,
62
68
  overwrite: options.overwrite ?? false,
69
+ temporary,
63
70
  };
64
71
  }
65
72
  export function imageMimeType(path) {
@@ -68,11 +75,12 @@ export function imageMimeType(path) {
68
75
  throw usageError(`unsupported image type: ${path}`);
69
76
  return mime;
70
77
  }
71
- export function outputPathForImage(taskId, output, index, count) {
72
- if (!output) {
78
+ export function outputPathForImage(taskId, output, index, count, temporary = false) {
79
+ if (temporary) {
73
80
  return { path: join(appPaths().tempDir, taskId, `image-${index + 1}.png`), temporary: true };
74
81
  }
75
- const absolute = resolve(output);
82
+ const shortTaskId = taskId.slice(0, 8);
83
+ const absolute = resolve(output ?? ".");
76
84
  const extension = extname(absolute).toLowerCase();
77
85
  if (extension === ".png") {
78
86
  if (count === 1)
@@ -82,10 +90,11 @@ export function outputPathForImage(taskId, output, index, count) {
82
90
  temporary: false,
83
91
  };
84
92
  }
85
- return { path: join(absolute, `image-${index + 1}.png`), temporary: false };
93
+ const suffix = count === 1 ? "" : `-${index + 1}`;
94
+ return { path: join(absolute, `image-${shortTaskId}${suffix}.png`), temporary: false };
86
95
  }
87
- export function writePngArtifact(taskId, buffer, output, index, count, overwrite) {
88
- const target = outputPathForImage(taskId, output, index, count);
96
+ export function writePngArtifact(taskId, buffer, output, index, count, overwrite, temporary = false) {
97
+ const target = outputPathForImage(taskId, output, index, count, temporary);
89
98
  if (existsSync(target.path) && !overwrite) {
90
99
  throw usageError(`output already exists: ${target.path}; pass --overwrite to replace it`);
91
100
  }
@@ -1 +1 @@
1
- {"version":3,"file":"images.js","sourceRoot":"","sources":["../src/images.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"images.js","sourceRoot":"","sources":["../src/images.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { Input } from "@openai/codex-sdk";
2
+ export interface TaskInputSources {
3
+ prompt?: string | undefined;
4
+ promptFiles?: string[] | undefined;
5
+ stdin?: string | undefined;
6
+ imagePaths?: string[] | undefined;
7
+ }
8
+ export interface ResolvedTaskInput {
9
+ text: string;
10
+ imagePaths: string[];
11
+ }
12
+ export declare function resolveTaskInput(sources: TaskInputSources): ResolvedTaskInput;
13
+ export declare function toSdkInput(input: ResolvedTaskInput): Input;
14
+ //# sourceMappingURL=inputs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inputs.d.ts","sourceRoot":"","sources":["../src/inputs.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAI/C,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IACnC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;CACnC;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAcD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,gBAAgB,GAAG,iBAAiB,CAY7E;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,iBAAiB,GAAG,KAAK,CAK1D"}
package/dist/inputs.js ADDED
@@ -0,0 +1,40 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { resolve } from "node:path";
3
+ import { usageError } from "./errors.js";
4
+ import { validateInputImages } from "./images.js";
5
+ function promptFilePart(path) {
6
+ const absolute = resolve(path);
7
+ let content;
8
+ try {
9
+ content = readFileSync(absolute, "utf8");
10
+ }
11
+ catch (error) {
12
+ throw usageError(`could not read prompt file ${path}: ${error instanceof Error ? error.message : String(error)}`);
13
+ }
14
+ if (!content.trim())
15
+ throw usageError(`prompt file must not be empty: ${path}`);
16
+ return `--- BEGIN PROMPT FILE: ${absolute} ---\n${content.trimEnd()}\n--- END PROMPT FILE ---`;
17
+ }
18
+ export function resolveTaskInput(sources) {
19
+ const parts = [];
20
+ if (sources.prompt?.trim())
21
+ parts.push(sources.prompt.trim());
22
+ for (const path of sources.promptFiles ?? [])
23
+ parts.push(promptFilePart(path));
24
+ if (sources.stdin?.trim()) {
25
+ parts.push(`--- BEGIN STDIN ---\n${sources.stdin.trim()}\n--- END STDIN ---`);
26
+ }
27
+ if (parts.length === 0)
28
+ throw usageError("provide a prompt argument, --prompt-file, or non-empty stdin");
29
+ return {
30
+ text: parts.join("\n\n"),
31
+ imagePaths: validateInputImages(sources.imagePaths),
32
+ };
33
+ }
34
+ export function toSdkInput(input) {
35
+ return [
36
+ { type: "text", text: input.text },
37
+ ...input.imagePaths.map((path) => ({ type: "local_image", path })),
38
+ ];
39
+ }
40
+ //# sourceMappingURL=inputs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inputs.js","sourceRoot":"","sources":["../src/inputs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAclD,SAAS,cAAc,CAAC,IAAY;IAClC,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,OAAe,CAAC;IACpB,IAAI,CAAC;QACH,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC3C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,UAAU,CAAC,8BAA8B,IAAI,KAAK,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACpH,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;QAAE,MAAM,UAAU,CAAC,kCAAkC,IAAI,EAAE,CAAC,CAAC;IAChF,OAAO,0BAA0B,QAAQ,SAAS,OAAO,CAAC,OAAO,EAAE,2BAA2B,CAAC;AACjG,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,OAAyB;IACxD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE;QAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IAC9D,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,WAAW,IAAI,EAAE;QAAE,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/E,IAAI,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC;QAC1B,KAAK,CAAC,IAAI,CAAC,wBAAwB,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,qBAAqB,CAAC,CAAC;IAChF,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,UAAU,CAAC,8DAA8D,CAAC,CAAC;IACzG,OAAO;QACL,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC;QACxB,UAAU,EAAE,mBAAmB,CAAC,OAAO,CAAC,UAAU,CAAC;KACpD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAwB;IACjD,OAAO;QACL,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE;QAClC,GAAG,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,aAAsB,EAAE,IAAI,EAAE,CAAC,CAAC;KAC5E,CAAC;AACJ,CAAC"}
package/dist/types.d.ts CHANGED
@@ -101,17 +101,19 @@ export interface CommonOptions {
101
101
  codexHome?: string | undefined;
102
102
  signal?: AbortSignal | undefined;
103
103
  onEvent?: ((event: TaskEvent) => void) | undefined;
104
+ promptFiles?: string[] | undefined;
105
+ imagePaths?: string[] | undefined;
104
106
  }
105
107
  export interface TextOptions extends CommonOptions {
106
- prompt: string;
108
+ prompt?: string | undefined;
107
109
  backend?: Backend | undefined;
108
110
  workingDirectory?: string | undefined;
109
111
  }
110
112
  export interface ImageOptions extends CommonOptions {
111
- prompt: string;
113
+ prompt?: string | undefined;
112
114
  backend?: Backend | undefined;
113
- imagePaths?: string[] | undefined;
114
115
  output?: string | undefined;
116
+ temporary?: boolean | undefined;
115
117
  count?: number | undefined;
116
118
  concurrency?: number | undefined;
117
119
  size?: string | undefined;
@@ -121,8 +123,8 @@ export interface ImageOptions extends CommonOptions {
121
123
  workingDirectory?: string | undefined;
122
124
  }
123
125
  export interface WorkspaceTaskOptions extends CommonOptions {
124
- prompt: string;
125
- backend: "sdk";
126
+ prompt?: string | undefined;
127
+ backend?: "sdk" | undefined;
126
128
  workingDirectory?: string | undefined;
127
129
  sandboxMode?: SandboxMode | undefined;
128
130
  networkAccess?: boolean | undefined;
@@ -130,7 +132,7 @@ export interface WorkspaceTaskOptions extends CommonOptions {
130
132
  }
131
133
  export interface ResumeTaskOptions extends Omit<CommonOptions, "backend"> {
132
134
  taskId: string;
133
- answer: string;
135
+ answer?: string | undefined;
134
136
  noFollowup?: boolean | undefined;
135
137
  }
136
138
  export type TaskRequest = {
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "codex-task",
3
- "version": "0.2.1",
3
+ "version": "0.2.3",
4
4
  "description": "Unofficial agent-to-agent text, image, and workspace task runner for Codex",
5
5
  "type": "module",
6
6
  "author": "wang121ye",
@@ -46,7 +46,7 @@
46
46
  "skills",
47
47
  ".codex-plugin",
48
48
  "README.md",
49
- "README.zh-CN.md",
49
+ "README_EN.md",
50
50
  "LICENSE",
51
51
  "THIRD_PARTY_NOTICES.md"
52
52
  ],
@@ -1,79 +1,100 @@
1
1
  ---
2
2
  name: codex-task
3
- description: Delegate a focused task to CodexTask and return structured text, generated or edited images, or completed workspace changes. Use when another Agent should call the codex-task CLI for text-to-text, text-to-image, image-to-image, or a bounded Codex workspace task, including resuming a task that needs user input.
3
+ description: Delegate a focused task to CodexTask and return structured text, generated or edited images, or completed workspace changes. Use when another Agent should call the codex-task CLI for text-to-text, image-to-text, text-to-image, image-to-image, multimodal workspace work, or resuming a task that needs user input.
4
4
  ---
5
5
 
6
6
  # CodexTask
7
7
 
8
- Use the installed `codex-task` CLI as a companion tool. This skill teaches the calling Agent how to invoke the CLI; it is not injected into the Codex worker.
8
+ Use the installed `codex-task` CLI as a companion tool. This skill teaches the calling Agent how to invoke CodexTask; it is not a skill injected into the underlying Codex worker.
9
9
 
10
10
  ## Resolve the CLI
11
11
 
12
- The skill and the executable are separate. Installing this skill does not install the npm package.
12
+ The skill and executable are separate. Installing this skill does not install the npm package.
13
13
 
14
14
  1. Prefer `codex-task` when `command -v codex-task` succeeds.
15
- 2. Otherwise, when npm and network access are available, use `npx --yes codex-task@latest` in place of `codex-task` in every command below.
16
- 3. If neither is available, tell the user to install the unscoped package with `npm install -g codex-task`.
15
+ 2. Otherwise, when npm and network access are available, replace it with `npx --yes codex-task@latest`.
16
+ 3. If neither works, tell the user to install the unscoped package with `npm install -g codex-task`.
17
17
 
18
- Do not silently perform a global npm installation. The package name is `codex-task`, not `@wang121ye/codex-task`.
18
+ Do not silently perform a global npm installation. The package is `codex-task`, not `@wang121ye/codex-task`.
19
19
 
20
- ## Choose the command
20
+ ## Choose by the desired result
21
21
 
22
- - Need only a text result: run `codex-task text --backend direct`.
23
- - Need a new or edited image: run `codex-task image --backend direct`.
24
- - Need shell commands, file edits, repository work, project rules, or local tools: run `codex-task task --backend sdk`.
25
- - Have a prior `needs_input` result: ask the user the returned questions, then run `codex-task resume`.
22
+ - Need text: use `codex-task text`. This covers text-to-text, image-to-text, and text-plus-image-to-text.
23
+ - Need images: use `codex-task image`. This covers text-to-image, image-to-image, and text-plus-image-to-image.
24
+ - Need shell commands, file changes, repository context, project rules, or local tools: use `codex-task task`.
25
+ - Have a prior `needs_input`: relay its questions, preserve `taskId`, then use `codex-task resume`.
26
26
 
27
- Never send workspace work to Direct. Direct cannot run local tools, read a repository, use local MCP, or modify files.
27
+ `text` and `image` default to Direct. Pass `--backend sdk` only when the result needs normal Codex project context or skills. `task` and `resume` are SDK-only; do not add `--backend sdk` to their normal invocation.
28
28
 
29
- ## Invoke safely
29
+ Direct cannot inspect a repository, execute commands, call local MCP, modify files, or use local Codex skills.
30
30
 
31
- Prefer stdin for long or quote-heavy prompts:
31
+ ## Compose the input
32
+
33
+ All result commands accept these together:
34
+
35
+ - positional text;
36
+ - repeatable `-f/--prompt-file` for long prompt files;
37
+ - non-empty stdin;
38
+ - repeatable `-i/--image`, up to five local images.
39
+
40
+ Use prompt files instead of shell substitution for long content. Preserve file and image order when order affects meaning.
41
+
42
+ ```bash
43
+ printf '%s' "$EXTRA_REQUIREMENT" | codex-task text "Analyze the meal" -f ./nutrition-rules.md -f ./allergies.md -i ./meal-front.png -i ./meal-side.png
44
+ ```
45
+
46
+ ## Invoke each result
47
+
48
+ Generate a durable image in the current directory:
32
49
 
33
50
  ```bash
34
- printf '%s' "$PROMPT" | codex-task text --backend direct
51
+ codex-task image "A clean high-protein fitness meal, top-down view"
35
52
  ```
36
53
 
37
- For an image that must survive temporary cleanup, always pass an explicit output directory:
54
+ Analyze that image as JSON text:
38
55
 
39
56
  ```bash
40
- codex-task image "A clean technical diagram" \
41
- --backend direct \
42
- --output ./artifacts
57
+ codex-task text "Identify foods and estimate calories; return JSON only" -i ./image-a1b2c3d4.png
43
58
  ```
44
59
 
45
- For image-to-image, repeat `--image` up to five times:
60
+ Delegate project work with all relevant context:
46
61
 
47
62
  ```bash
48
- codex-task image "Keep the subject, change the lighting" \
49
- --backend direct \
50
- --image ./reference.png \
51
- --output ./artifacts
63
+ codex-task task "Build the meal detail page and run focused tests" -f ./requirements.md -f ./api-contract.md -i ./meal.png --cwd /absolute/path/to/repo
52
64
  ```
53
65
 
54
- For repository work, pass the intended directory explicitly:
66
+ `--cwd` is the Codex worker's current project. It determines which code, project instructions, and repo-scoped skills the worker sees, where relative paths resolve, and where commands run.
67
+
68
+ If the task asks a question, resume it:
55
69
 
56
70
  ```bash
57
- codex-task task "Implement the requested change and run focused tests" \
58
- --backend sdk \
59
- --cwd /absolute/path/to/repo
71
+ codex-task resume "$TASK_ID" "Use one serving" -f ./copy-guidelines.md -i ./expected-layout.png
60
72
  ```
61
73
 
62
- The SDK task default is `danger-full-access`, network enabled, and approval `never`. Invoke it only when the user's request authorizes the workspace task. Use `--no-followup` when the caller explicitly requires a single caller turn and accepts reasonable assumptions.
74
+ The SDK task default is `danger-full-access`, network enabled, and approval `never`. Invoke it only when the user's request authorizes that access. Use `--sandbox workspace-write` or `--no-network` when the intended scope is narrower. Use `--no-followup` only when the caller accepts reasonable assumptions and requires completion or failure in one caller turn.
75
+
76
+ ## Manage image output
77
+
78
+ Without `--output`, `image` writes a unique durable PNG to the current directory. Do not add `--output .` unless explicitness helps readability.
79
+
80
+ - Use `-o ./artifacts` or `-o ./meal.png` for an explicit durable destination.
81
+ - Use `--temp` only when the artifact is disposable after the current workflow. It writes under the managed OS temporary directory and can be removed by `codex-task gc`.
82
+ - Never combine `--temp` and `--output`.
83
+ - Add `--overwrite` only when replacing existing user data is authorized.
63
84
 
64
85
  ## Handle the result
65
86
 
66
- Parse stdout as JSON. Treat these statuses as follows:
87
+ Parse stdout as JSON:
67
88
 
68
- - `completed`: return `text`, show or link `artifacts`, and summarize `changes` and `commands` when present.
69
- - `needs_input`: relay every question to the user. Preserve `taskId`; after the user answers, run `codex-task resume <taskId>` with the answer through stdin or as the argument.
70
- - `failed`: report `error.code` and `error.message`. Retry only when `error.retryable` is true.
71
- - `cancelled`: report cancellation or timeout; do not claim the task completed.
89
+ - `completed`: return `text`, surface `artifacts`, and summarize `changes`/`commands` when present.
90
+ - `needs_input`: ask every returned question, preserve `taskId`, then resume after receiving the answer.
91
+ - `failed`: report `error.code` and `error.message`; retry only when `error.retryable` is true.
92
+ - `cancelled`: report cancellation or timeout and do not claim completion.
72
93
 
73
- Use `--stream` only when progress events are useful. It changes stdout from one JSON object to JSONL events; it is an item/progress stream, not guaranteed token streaming.
94
+ Use `--stream` only when JSONL progress events are useful. It is an item/task event stream, not guaranteed token streaming.
74
95
 
75
- ## Diagnose
96
+ ## Diagnose and clean
76
97
 
77
- Run `codex-task doctor` when Direct authentication, native transport, model resolution, or SDK availability is uncertain. The command is read-only and does not send a model request.
98
+ Run `codex-task doctor` when Direct authentication, native transport, model resolution, or SDK availability is uncertain. It is read-only and sends no model request.
78
99
 
79
- Run `codex-task gc` only to clean CodexTask-managed temporary artifacts and expired pending-task metadata. Files created under an explicit `--output` path are never managed by this cleanup.
100
+ Run `codex-task gc` only for CodexTask-managed temporary artifacts and expired pending-task metadata. It never deletes default current-directory images or files under an explicit output path.
@@ -1,4 +1,4 @@
1
1
  interface:
2
2
  display_name: "CodexTask"
3
- short_description: "Delegate text, image, and Codex workspace tasks"
3
+ short_description: "Delegate multimodal text, image, and workspace tasks"
4
4
  default_prompt: "Use $codex-task to delegate this task to a focused Codex worker."
package/README.zh-CN.md DELETED
@@ -1,209 +0,0 @@
1
- # CodexTask
2
-
3
- > 把一个明确的小任务交给另一个 AI Agent,拿回文本、图片或已经完成的工作。直接复用你现有的 Codex 环境。
4
-
5
- [English](./README.md) · [产品需求文档](./docs/PRD.md) · [Companion skill](./skills/codex-task/SKILL.md)
6
-
7
- CodexTask 把 Codex 封装成可供其他 Agent 调用的轻量 worker,统一提供三类能力:
8
-
9
- - 文生文;
10
- - 文生图和图生图;
11
- - 通过官方 Codex SDK 执行边界明确的工作区任务。
12
-
13
- 没有 daemon,没有托管服务,也不需要额外 API key。所有结果都使用适合 Agent 解析的稳定 JSON。
14
-
15
- > [!IMPORTANT]
16
- > CodexTask 是独立的非官方开源项目,与 OpenAI 不存在隶属、认可或赞助关系。Codex 与 OpenAI 为 OpenAI 的商标。
17
-
18
- ## 30 秒上手
19
-
20
- 需要 Node.js 20+,并已执行过 `codex login`。
21
-
22
- ```bash
23
- npm install -g codex-task
24
- codex-task doctor
25
- ```
26
-
27
- 生成文本:
28
-
29
- ```bash
30
- codex-task text "把这些笔记整理成简洁的发布公告" --backend direct
31
- ```
32
-
33
- 生成持久图片:
34
-
35
- ```bash
36
- codex-task image "精确、克制的机器人关节爆炸图" \
37
- --backend direct \
38
- --size 1536x1024 \
39
- --quality high \
40
- --output ./artifacts
41
- ```
42
-
43
- 基于参考图编辑:
44
-
45
- ```bash
46
- codex-task image "保留主体,把背景换成整洁的工作室" \
47
- --backend direct \
48
- --image ./reference.png \
49
- --output ./artifacts
50
- ```
51
-
52
- 委派仓库任务:
53
-
54
- ```bash
55
- codex-task task "实现这个功能并运行聚焦测试" \
56
- --backend sdk \
57
- --cwd /absolute/path/to/repo
58
- ```
59
-
60
- ## 两种后端
61
-
62
- CodexTask 不猜测后端。CLI 默认是 Direct,但工作区任务必须显式写出 SDK。
63
-
64
- | 能力 | `direct` | `sdk` |
65
- | --- | --- | --- |
66
- | 独立文本结果 | 支持 | 支持 |
67
- | 文生图 / 图生图 | 原生提取图片 | 通过已安装的 `$imagegen` skill |
68
- | shell 和文件修改 | 不支持 | 支持 |
69
- | 项目 rules 和本地工具 | 不支持 | 支持 |
70
- | 本地 Codex skills | 不支持 | 按 Codex 正常发现 |
71
- | 底层 | 非官方 ChatGPT Codex Responses | 官方 `@openai/codex-sdk` |
72
-
73
- Direct 会复用 `$CODEX_HOME/auth.json`、Codex installation metadata、TLS impersonation 和 ChatGPT 私有 Codex Responses 接口。输入仍会发往 ChatGPT,接口也可能随时变化。
74
-
75
- SDK task 默认权限为:
76
-
77
- ```text
78
- sandbox: danger-full-access
79
- approval: never
80
- network: true
81
- ```
82
-
83
- 这意味着它可以访问工作区外路径、执行命令并联网,而且不会询问权限。只把可信 prompt 和可信仓库交给它。
84
-
85
- ## 追问与恢复
86
-
87
- SDK 默认先执行一个 turn。确实需要澄清时返回:
88
-
89
- ```json
90
- {
91
- "status": "needs_input",
92
- "taskId": "...",
93
- "threadId": "...",
94
- "questions": ["是否必须保持旧响应格式?"],
95
- "artifacts": []
96
- }
97
- ```
98
-
99
- 向用户确认后恢复同一个 Codex thread:
100
-
101
- ```bash
102
- printf '%s' "是,必须保持。" | codex-task resume <task-id>
103
- ```
104
-
105
- `--no-followup` 会要求 Codex 使用合理假设,只能完成或失败;它不保证模型一定成功。
106
-
107
- ## 安装给其他 Agent
108
-
109
- 仓库内置 `skills/codex-task/SKILL.md`。它教调用方 Agent 选择 `text`、`image`、`task` 或 `resume`,并不是注入底层 Codex worker 的 skill。
110
-
111
- 使用 [skillmanager](https://github.com/wangyendt/skillmanager) 安装:
112
-
113
- ```bash
114
- npm install -g @wang121ye/skillmanager
115
- skillmanager install https://github.com/wangyendt/codex-task --global
116
- ```
117
-
118
- 也可以查看 npm 包内 skill 的位置:
119
-
120
- ```bash
121
- codex-task skill path
122
- ```
123
-
124
- ## TypeScript API
125
-
126
- ```ts
127
- import { generateImage, generateText, runTask } from "codex-task";
128
-
129
- const text = await generateText({
130
- prompt: "写一个标题和三个卖点。",
131
- backend: "direct",
132
- });
133
-
134
- const image = await generateImage({
135
- prompt: "Agent 之间传递任务的克制等距插画。",
136
- backend: "direct",
137
- output: "./artifacts",
138
- });
139
-
140
- const work = await runTask({
141
- prompt: "实现功能并运行聚焦测试。",
142
- backend: "sdk",
143
- workingDirectory: "/absolute/path/to/repo",
144
- });
145
- ```
146
-
147
- ## 图片参数
148
-
149
- ```text
150
- 参考图 0–5 张本地 PNG/JPEG/WebP/GIF
151
- size auto 或 WIDTHxHEIGHT,最长边 ≤3840
152
- quality auto | low | medium | high
153
- background auto | opaque | transparent
154
- count 1–10
155
- concurrency 1–3,默认 1
156
- ```
157
-
158
- 单张参考图不超过 20 MiB,总和不超过 50 MiB。默认拒绝覆盖已有文件,只有显式传 `--overwrite` 才会替换。每张图片完成后立即原子落盘,后续图片失败不会丢失已经生成的产物。
159
-
160
- ## Agent 友好的输出
161
-
162
- - 默认 stdout 是一个最终 JSON。
163
- - `--stream` 将 stdout 改为 JSONL 进度事件,不保证逐 token 输出。
164
- - 诊断信息写 stderr。
165
- - exit code:完成/追问为 `0`,运行失败为 `1`,参数错误为 `2`,取消或超时为 `130`。
166
-
167
- 长 prompt 推荐使用文件或 stdin:
168
-
169
- ```bash
170
- codex-task text --prompt-file task.md --backend direct
171
- printf '%s' "$PROMPT" | codex-task task --backend sdk --cwd .
172
- ```
173
-
174
- ## 模型和配置
175
-
176
- SDK 默认不覆写模型和 reasoning,继续按 Codex 正常配置读取。
177
-
178
- Direct 按以下顺序选择模型:显式参数 → Codex `config.toml` → `models_cache.json` 首选模型 → 兼容 fallback。它同时实现 classic Responses 和 Responses Lite encoder;当前模型目录下文本默认是 `gpt-5.6-sol + medium`。私有 Responses Lite 路由会拒绝托管 `image_generation`,因此 Direct 图片会在发出请求前选择兼容的 classic `gpt-5.5`。最终 JSON 会返回真实的 `effectiveModel` 和 `reasoningEffort`。
179
-
180
- 配置优先级为 API/CLI → `CODEX_TASK_*` 环境变量 → 用户配置 → Codex 配置 → fallback。运行 `codex-task doctor` 可以查看真实路径和解析结果。迁移期间,仅当新的变量或路径不存在时才兼容读取旧的 `CODEXERRAND_*` 环境变量以及 CodexErrand 配置/待恢复任务;新状态始终写入 CodexTask 路径。
181
-
182
- ## 临时文件
183
-
184
- - 不传 `--output` 的图片放系统临时目录,默认 24 小时过期。
185
- - `needs_input` 的小型状态放平台 state 目录,默认保存 7 天。
186
- - 临时产物总上限 1 GiB。
187
- - 显式 `--output` 下的文件属于用户数据,`codex-task gc` 永远不会删除。
188
- - 官方 SDK 的 session 仍由 Codex 自己保存在 `$CODEX_HOME`,CodexTask 不删除。
189
-
190
- ## 开发和发布
191
-
192
- ```bash
193
- npm install
194
- npm run verify
195
- ```
196
-
197
- `verify` 会执行 lint、类型检查、单元测试、构建、npm 包内容检查和干净安装/import smoke test。真实 Direct endpoint 测试必须显式开启,CI 永远不会运行:
198
-
199
- ```bash
200
- RUN_DIRECT_E2E=1 npm run test:e2e
201
- ```
202
-
203
- 每次 push 到 `main` 自动发布 patch 版本。详细设置见 [发布说明](./docs/RELEASING.md)。
204
-
205
- ## 致谢与许可
206
-
207
- Direct 后端部分技术和 MIT 代码源自 [`lawrencewzen/imgen`](https://github.com/lawrencewzen/imgen),详见 [第三方声明](./THIRD_PARTY_NOTICES.md)。
208
-
209
- MIT © 2026 ye.wang