From 71c57ea647fbc376d1207f11d851c09504c9c02d Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Tue, 25 Aug 2026 10:37:05 +0900 Subject: [PATCH 1/3] release: v2.32.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f73ed2d0e5..063ecfe73e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@bitkyc08/opencodex", - "version": "2.32.0", + "version": "2.32.1", "description": "Universal provider proxy for OpenAI Codex & Claude Code — use any LLM with Codex CLI/App/SDK and Claude Code", "type": "module", "main": "./bin/package-main.mjs", From ec51e42d745d2645bcb22cb67855fa053ba1778e Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Tue, 25 Aug 2026 20:25:22 +0900 Subject: [PATCH 2/3] release: v2.33.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 063ecfe73e..6f8499ffbf 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@bitkyc08/opencodex", - "version": "2.32.1", + "version": "2.33.0", "description": "Universal provider proxy for OpenAI Codex & Claude Code — use any LLM with Codex CLI/App/SDK and Claude Code", "type": "module", "main": "./bin/package-main.mjs", From 6230c429084c5bc4b6b13c05ec6bd1f7b12461be Mon Sep 17 00:00:00 2001 From: luvs01 Date: Sun, 30 Aug 2026 14:39:14 +0900 Subject: [PATCH 3/3] docs(skill): keep access-key creation out of agent sessions --- skills/ocx/SKILL.md | 7 +++++++ skills/ocx/references/03_recipes.md | 17 ++++++++++++----- tests/skill-ocx.test.ts | 8 ++++++++ 3 files changed, 27 insertions(+), 5 deletions(-) diff --git a/skills/ocx/SKILL.md b/skills/ocx/SKILL.md index cba29e7dd9..dea52e4414 100644 --- a/skills/ocx/SKILL.md +++ b/skills/ocx/SKILL.md @@ -90,6 +90,13 @@ starring would be useful, say so and let the user decide. The same boundary covers the session-gated `/api/codex-prompt` writes: read them with `ocx inspect codex-prompt`, and leave the writes to the dashboard. +## Secret-bearing commands + +**Do not run `ocx access key create`.** Its one-time response contains the new plaintext +data-plane credential, and command output can enter the agent transcript. Ask the user to create +the key themselves in a terminal outside the agent session and confirm only the new key id before +continuing with inspection or removal commands. Never ask the user to paste the key into chat. + ## Destructive verbs `storage trash restore` and `storage policy run` refuse without `--yes` (exit 2, nothing sent). diff --git a/skills/ocx/references/03_recipes.md b/skills/ocx/references/03_recipes.md index a6294b277e..e3d687f763 100644 --- a/skills/ocx/references/03_recipes.md +++ b/skills/ocx/references/03_recipes.md @@ -93,20 +93,27 @@ Read `accounts[]`. Two things to respect: `providers[]` and `models[]` carry `estimatedCostUsd`. Costs are estimates; `estimateReasons` in the log rows tells you why (for example `usage_estimated`, `expected_price_overlay`). -## 5. Rotate an access key and confirm it went quiet +## 5. Prepare an access-key rotation without exposing the new key ```bash ocx access key list --json -ocx access key create rotated --json # the plaintext key is in THIS response only +``` + +Creating a key returns its one-time plaintext credential. **Do not run the create command from an +agent session:** terminal output can enter the model transcript. Ask the user to create the key +themselves in a separate terminal and report only the new key id, never the key itself. + +After the user confirms that the replacement is configured, remove the old key: + +```bash ocx access key remove --yes --json ocx access key list --json # the old id is gone; check usage on the rest ``` -Note the argument style: `create ` and `remove ` are **positionals**, not `--label` and -`--id`. `remove` also refuses without `--yes`. +Note the argument style: `remove ` is positional, not `--id`, and refuses without `--yes`. The list carries per-key usage, so a key whose count stops advancing is genuinely unused. The -plaintext key appears once, in the `create` response, and is never retrievable again. +replacement key's plaintext is never retrievable after creation. An `ambiguous` footer on the list means two configured keys share an id, so per-key totals do not exist for them — do not attribute usage to either. diff --git a/tests/skill-ocx.test.ts b/tests/skill-ocx.test.ts index 37edcfb168..3d84deeb39 100644 --- a/tests/skill-ocx.test.ts +++ b/tests/skill-ocx.test.ts @@ -146,6 +146,14 @@ describe("the consent boundary is stated, not implied", () => { } }); + test("agent-facing instructions never invoke the plaintext access-key creation command", () => { + const skill = readFileSync(SKILL, "utf8"); + const recipes = read("references/03_recipes.md"); + expect(skill).toContain("Do not run `ocx access key create`"); + expect(recipes).not.toMatch(/^\s*ocx access key create\b/m); + expect(recipes).toContain("never the key itself"); + }); + test("destructive verbs are documented as requiring --yes", () => { const skill = readFileSync(SKILL, "utf8"); const recipes = read("references/03_recipes.md");