odd-studio 3.3.4 → 3.3.6

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/README.md CHANGED
@@ -45,9 +45,15 @@ npx odd-studio init my-project --agent codex
45
45
  cd my-project
46
46
  ```
47
47
 
48
- In Codex, start ODD by saying `use ODD` or `start ODD`.
49
- Codex reads `AGENTS.md`, which routes the session to `plugins/odd-studio/skills/odd/SKILL.md`.
50
- Once ODD is active, the same starred flow works there too, including commands like `*plan`, `*build`, and `*status`.
48
+ In Codex, start ODD with `/odd`.
49
+ Use `/odd-status` when you want the current project state without entering the full planning or build flow.
50
+ `AGENTS.md` remains supporting context, but the Codex plugin command is the primary entrypoint.
51
+
52
+ If this project was originally set up for Claude Code or OpenCode and you want to add Codex later, run:
53
+
54
+ ```bash
55
+ npx odd-studio upgrade --agent codex
56
+ ```
51
57
 
52
58
  ### For Claude Code and OpenCode on the same machine
53
59
 
@@ -77,7 +83,7 @@ That single command:
77
83
  **Then open your project in your AI coding agent and start ODD:**
78
84
  ```
79
85
  Claude Code / OpenCode: /odd
80
- Codex: use ODD
86
+ Codex: /odd
81
87
  ```
82
88
 
83
89
  ---
@@ -88,7 +94,7 @@ Codex: use ODD
88
94
  |-------|-------------------|---------------|
89
95
  | **Claude Code** | Project-local skills (`.claude/skills/`), hooks (`.claude/settings.local.json`), odd-flow MCP (`.mcp.json`) | Claude (Opus, Sonnet, Haiku) |
90
96
  | **OpenCode** | Project-local commands (`.opencode/commands/`), JS plugin (`.opencode/plugins/`), odd-flow MCP (`opencode.json`) | Any provider — Ollama (Qwen3-Coder, MiniMax M2.7, DeepSeek), OpenAI, Anthropic, Google, Groq, and 75+ more |
91
- | **Codex** | Project-local plugin (`plugins/odd-studio/`), local marketplace registration (`.agents/plugins/marketplace.json`), plugin MCP (`plugins/odd-studio/.mcp.json`) | Codex |
97
+ | **Codex** | Project-local plugin (`plugins/odd-studio/`), slash-command entrypoints (`plugins/odd-studio/commands/`), local marketplace registration (`.agents/plugins/marketplace.json`), plugin MCP (`plugins/odd-studio/.mcp.json`) | Codex |
92
98
 
93
99
  All supported agents get the same methodology, the same safety enforcement, and the same odd-flow-powered cross-session memory. The only difference is the delivery mechanism.
94
100
 
@@ -101,7 +107,7 @@ Your AI coding agent loads the ODD orchestrator. It checks whether you have an e
101
107
  - **New project:** Welcomes you, explains what you're about to build together, and starts with the first question: *Who uses this system, and what do they actually need?*
102
108
  - **Returning project:** Shows you exactly where you left off and resumes from there. Nothing is lost between sessions.
103
109
 
104
- From there, use the dedicated direct commands listed below in Claude Code or OpenCode, or type sub-commands inside the active ODD session.
110
+ From there, use the dedicated direct commands listed below in Claude Code, OpenCode, or Codex, or type sub-commands inside the active ODD session.
105
111
 
106
112
  ---
107
113
 
@@ -158,8 +164,7 @@ ODD Studio installs safety gates that run automatically throughout your build. T
158
164
 
159
165
  **Claude Code:** Implemented as shell hooks registered in `.claude/settings.local.json` (project-local).
160
166
  **OpenCode:** Implemented as a JS plugin (`odd-studio-plugin.js`) in `.opencode/plugins/` (project-local).
161
- **Codex:** Implemented as a project-local plugin in `plugins/odd-studio/` with `hooks.json` and plugin-local skills.
162
- Codex starts through `AGENTS.md` instructions (`use ODD` / `start ODD`) rather than a guaranteed `/odd` composer command.
167
+ **Codex:** Implemented as a project-local plugin in `plugins/odd-studio/` with `hooks.json`, plugin-local skills, and slash commands such as `/odd` and `/odd-status`.
163
168
 
164
169
  ---
165
170
 
@@ -218,7 +218,7 @@ function printNextSteps({ isClaude, isOpenCode, isCodex, projectName }) {
218
218
  }
219
219
  if (isCodex) {
220
220
  console.log(` ${stepN++}. Open your project in Codex`);
221
- console.log(` ${stepN++}. Start ODD by saying: ` + chalk.cyan('use ODD') + chalk.dim(' (Codex reads AGENTS.md automatically no /odd command needed)'));
221
+ console.log(` ${stepN++}. Start ODD in Codex: ` + chalk.cyan('/odd') + chalk.dim(' (use /odd-status to inspect state first)'));
222
222
  }
223
223
  if (isClaude || isOpenCode) {
224
224
  console.log(` ${stepN++}. Start your ODD session: ` + chalk.cyan('/odd'));
@@ -43,7 +43,7 @@ export function registerStatus(program, deps) {
43
43
  }
44
44
 
45
45
  print.blank();
46
- console.log(chalk.dim(' Open your AI coding agent and type /odd to resume.'));
46
+ console.log(chalk.dim(' Open your AI coding agent and type /odd to resume. Use /odd-status for a state-only check.'));
47
47
  print.blank();
48
48
  });
49
49
  }
package/bin/odd-studio.js CHANGED
@@ -15,7 +15,7 @@ import { registerUninstall } from './commands/uninstall.js';
15
15
  const __filename = fileURLToPath(import.meta.url);
16
16
  const __dirname = path.dirname(__filename);
17
17
  const require = createRequire(import.meta.url);
18
- const pkg = require('../package.json'); // v3.3.4
18
+ const pkg = require('../package.json'); // v3.3.6
19
19
 
20
20
  const PACKAGE_ROOT = path.resolve(__dirname, '..');
21
21
  const deps = { PACKAGE_ROOT, print };
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "odd-studio",
3
- "version": "3.3.3",
3
+ "version": "3.3.6",
4
4
  "description": "Outcome-Driven Development planning and build harness for domain experts building serious software with AI.",
5
5
  "author": {
6
6
  "name": "ODD Studio"
@@ -21,7 +21,7 @@
21
21
  "interface": {
22
22
  "displayName": "ODD Studio",
23
23
  "shortDescription": "Guide planning, build sequencing, and verification with Outcome-Driven Development",
24
- "longDescription": "Use ODD Studio to plan around personas, outcomes, contracts, and phased delivery, then run a disciplined build and verification flow with odd-flow memory and safety gates.",
24
+ "longDescription": "Use ODD Studio to plan around personas, outcomes, contracts, and phased delivery, then run a disciplined build and verification flow with odd-flow memory, safety gates, and Codex slash commands such as /odd and /odd-status.",
25
25
  "developerName": "ODD Studio",
26
26
  "category": "Coding",
27
27
  "capabilities": [
@@ -32,7 +32,7 @@
32
32
  "websiteURL": "https://github.com/odd-studio/odd-studio",
33
33
  "privacyPolicyURL": "https://github.com/odd-studio/odd-studio",
34
34
  "termsOfServiceURL": "https://github.com/odd-studio/odd-studio",
35
- "defaultPrompt": "Start or resume an ODD Studio planning and build session for this project",
35
+ "defaultPrompt": "Run /odd to start or resume this ODD Studio project, or /odd-status to inspect the current state",
36
36
  "brandColor": "#111111",
37
37
  "screenshots": []
38
38
  }
@@ -1,3 +1,6 @@
1
1
  # ODD Studio for Codex
2
2
 
3
3
  This plugin installs the ODD Studio planning and build harness into Codex as a project-local plugin.
4
+
5
+ Primary entrypoints in Codex are `/odd` to start or resume and `/odd-status` to inspect the current project state.
6
+ `AGENTS.md` can reinforce the workflow, but the plugin command is the canonical startup path.
@@ -184,13 +184,30 @@ verify-gate)
184
184
  # Only intercept writes to state.json
185
185
  echo "$FILE_PATH" | grep -q 'state\.json' || exit 0
186
186
 
187
- # Check if the write is setting buildStatus to "verified"
188
- NEW_CONTENT=$(echo "$INPUT" | jq -r '.tool_input.new_string // .tool_input.content // empty')
189
- echo "$NEW_CONTENT" | grep -q '"verified"' || exit 0
187
+ # Count verified statuses: only block if NEW outcomes are being marked verified
188
+ # (not when existing verified outcomes are preserved in a full file write)
189
+ if [ "$TOOL_NAME" = "Write" ]; then
190
+ # Full file write — compare verified count against existing file
191
+ NEW_CONTENT=$(echo "$INPUT" | jq -r '.tool_input.content // empty')
192
+ NEW_VERIFIED=$(echo "$NEW_CONTENT" | grep -c '"buildStatus"[[:space:]]*:[[:space:]]*"verified"' || echo 0)
193
+ if [ -f "$FILE_PATH" ]; then
194
+ OLD_VERIFIED=$(grep -c '"buildStatus"[[:space:]]*:[[:space:]]*"verified"' "$FILE_PATH" || echo 0)
195
+ else
196
+ OLD_VERIFIED=0
197
+ fi
198
+ [ "$NEW_VERIFIED" -gt "$OLD_VERIFIED" ] || exit 0
199
+ else
200
+ # Edit — check if new_string introduces "verified" that old_string didn't have
201
+ OLD_STRING=$(echo "$INPUT" | jq -r '.tool_input.old_string // empty')
202
+ NEW_STRING=$(echo "$INPUT" | jq -r '.tool_input.new_string // empty')
203
+ OLD_HAS=$(echo "$OLD_STRING" | grep -c '"verified"' || echo 0)
204
+ NEW_HAS=$(echo "$NEW_STRING" | grep -c '"verified"' || echo 0)
205
+ [ "$NEW_HAS" -gt "$OLD_HAS" ] || exit 0
206
+ fi
190
207
 
191
208
  VERIFIED_CONFIRMED=$(get_state_field "verificationConfirmed")
192
209
  if [ "$VERIFIED_CONFIRMED" != "true" ]; then
193
- echo "ODD STUDIO [verify-gate]: Cannot mark outcomes as verified." >&2
210
+ echo "ODD STUDIO [verify-gate]: Cannot mark NEW outcomes as verified." >&2
194
211
  echo "Walk through the verification checklist first. Set verificationConfirmed: true after all steps pass." >&2
195
212
  exit 2
196
213
  fi
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "odd-studio",
3
- "version": "3.3.4",
3
+ "version": "3.3.6",
4
4
  "description": "Outcome-Driven Development for AI coding agents — a planning and build harness for domain experts building serious software with AI. Works with Claude Code, OpenCode, and Codex.",
5
5
  "keywords": [
6
6
  "claude-code",
package/skill/SKILL.md CHANGED
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: "odd"
3
- version: "3.3.4"
3
+ version: "3.3.6"
4
4
  description: "Outcome-Driven Development planning and build coach. Use /odd to start or resume an ODD project — building personas, writing outcomes, mapping contracts, creating a Master Implementation Plan, and directing a odd-flow-powered build. Designed for domain experts who are not developers. Works with Claude Code, OpenCode, and Codex."
5
5
  ---
6
6
 
@@ -35,7 +35,7 @@ Display this when no existing state is found:
35
35
 
36
36
  ---
37
37
 
38
- Welcome to ODD Studio v3.3.4.
38
+ Welcome to ODD Studio v3.3.6.
39
39
 
40
40
  You are about to plan and build something real — using a methodology called Outcome-Driven Development. Before we write a single line of code, we are going to get precise about three things:
41
41
 
@@ -59,7 +59,7 @@ Display this when existing state is found. Replace the bracketed values with act
59
59
 
60
60
  ---
61
61
 
62
- Welcome back to ODD Studio v3.3.4.
62
+ Welcome back to ODD Studio v3.3.6.
63
63
 
64
64
  **Project:** [project.name]
65
65
  **Current Phase:** [state.currentPhase]
@@ -5,13 +5,13 @@
5
5
 
6
6
  This project uses ODD Studio for planning and building. To activate the ODD coach:
7
7
 
8
- **In Codex:** Say `use ODD` or `start ODD` there is no `/odd` slash command in Codex.
9
- The agent will read the coaching protocol below and guide you through planning or building.
8
+ **In Codex:** Type `/odd` to start, or `/odd-status` to check the current state before resuming.
9
+ If slash commands are unavailable in this workspace, `use ODD`, `start ODD`, or `begin ODD` are acceptable fallbacks.
10
10
 
11
11
  **In OpenCode:** Type `/odd` to start.
12
12
 
13
13
  When activated, read the full coaching protocol:
14
- - `plugins/odd-studio/skills/odd/SKILL.md` (Codex) or `.opencode/commands/odd/SKILL.md` (OpenCode)
14
+ - `plugins/odd-studio/skills/odd/SKILL.md` (Codex) or `.opencode/odd/SKILL.md` (OpenCode)
15
15
 
16
16
  Then execute the startup state check documented in that file.
17
17
 
@@ -148,8 +148,10 @@ _Until then, the ODD defaults apply:_
148
148
  _This section is populated by Rachel during Step 9b of the planning phase._
149
149
 
150
150
  ## Session Start Protocol
151
- Every new session begins with the user saying **"use ODD"** or **"start ODD"**.
152
- When you see this, read the full coaching protocol from the skill file (see "How to Start ODD" above),
151
+ Every new session begins with an explicit ODD command.
152
+ In Codex and OpenCode, the primary entrypoint is `/odd`. In Codex, `/odd-status` is the status-only entrypoint.
153
+ If Codex slash commands are unavailable, treat `use ODD`, `start ODD`, or `begin ODD` as `/odd`, `ODD status` as `/odd-status`, and `ODD build` as `/odd-build`.
154
+ When you see one of these triggers, read the full coaching protocol from the skill file (see "How to Start ODD" above),
153
155
  then execute the startup state check from that skill exactly as written.
154
156
 
155
157
  Do not skip straight to persona naming or build questions.