Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -186,3 +186,4 @@ nf-benchmark/baseline.json
# they accumulate one file per session forever. Local state, never committed.
.claude/nf-session-seen-*.flag
.copilot/nf-session-seen-*.flag
.codex/nf-session-seen-*.flag
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
## [Unreleased]

### Added
- feat(runtime): **native OpenAI Codex support.** The installer now accepts `--codex` for global or project-local installs, converts every `/nf:*` command into a discoverable `$nf:*` Codex skill, emits native TOML custom agents, writes Codex `hooks.json`, and manages nForma-owned MCP server blocks in `config.toml` without replacing user settings. Reinstall and uninstall paths migrate legacy Codex files, preserve unrelated configuration, and keep generated skills and MCP registrations idempotent. New conversion/unit coverage and a Codex virgin-install suite exercise install, hook adaptation, quorum context, MCP configuration, reinstall, and uninstall behavior.
- feat(quorum): **opt-in thread persistence per slot** (`quorum.persistent_threads`, default false). The CE-5 full-convergence loop was stateless by design: each round spawns a fresh CLI invocation with prior-round outputs spliced into the prompt, and the convergence check diffs that prompt-injected state. With `persistent_threads: true`, slot CLIs keep a native conversation across rounds — `codex exec resume <thread_id>`, `-p --resume <session_id>`, or `-c` for CWD-scoped continue (agy, kimi). Round 1 captures the session id from stdout (codex JSONL `thread.started`, claude `--output-format json`) and persists it to `.planning/quorum/sessions/<slot>-<invocation>.json`; round 2+ reads the file and replaces the fresh argv template with the resume argv before `{prompt}` substitution. GC: every invocation sweeps session files >24h old, fail-open. Drop-guard mirrors the existing pattern (garbage `persistent_threads` warns + falls back to false; absent restores silently). New: `bin/quorum-resume.cjs` (helper), `bin/quorum-sessions-store.cjs` (scratch store), `bin/quorum-resume.test.cjs` (28 PURE tests, red-proven). Also fixes a latent path bug: `bin/call-quorum-slot.cjs` required `./config-loader` which resolves to a nonexistent path; corrected to `../hooks/config-loader`.

**Empirical findings (3 task classes, codex/gpt-5.5, judged on the FINAL design produced, not on word-reuse proxies):** the prevailing assumption "thread memory always helps" is **not what the data shows**. Across a 2-round essay expansion, a 3-round plan review, and a 5-round complex synthesis, the **default `false` (stateless) is at least as good as `true`** (persistent) in 2 of 3 task classes and ties the third. `FRESH` (no context at all) always refuses with a safety message — better than hallucinating. The right rule of thumb: enable persistent when the reasoning chain spans 10+ rounds, the orchestrator's prompt-injection window is too narrow for prior rounds, or the model is *evolving* its own prior reasoning rather than answering fresh; otherwise stateless preserves the documented CE-5 "team has nothing left to add" semantics and beats the model's noisier thread memory in mid-complexity tasks. **No change for existing callers** — default `false` preserves the current stateless CE-5 semantics.
Expand Down
15 changes: 13 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -156,9 +156,15 @@ npm install @huggingface/transformers
> Runs a local [all-MiniLM-L6-v2](https://huggingface.co/Xenova/all-MiniLM-L6-v2) model on CPU (~23MB). No API keys or cloud calls. The `/nf:proximity` pipeline automatically uses embeddings when this dependency is present.

The installer prompts you to choose:
1. **Runtime** — Claude Code, OpenCode, Gemini, or all
1. **Runtime** — Claude Code, OpenCode, Gemini, Codex, or another supported runtime
2. **Location** — Global (all projects) or local (current project only)

> [!NOTE]
> **Using Codex?** Choose Codex in the installer, or run
> `npx @nforma.ai/nforma --codex --global`. nForma installs native Codex skills,
> custom agents, hooks, and MCP servers. Invoke workflows with `$nf:help`,
> `$nf:new-project`, and the other `$nf:*` skill names.

### 2. Use Skip-Permissions Mode

nForma is designed for frictionless automation. Run Claude Code with:
Expand Down Expand Up @@ -201,6 +207,7 @@ If you prefer not to use that flag, add this to your project's `.claude/settings
```

You should see the full command list. If not, restart your runtime to reload commands.
In Codex, use `$nf:help` (or open `/skills` and select `nf:help`) instead.

### 4. Set Up Your Quorum (Optional)

Expand Down Expand Up @@ -272,12 +279,16 @@ npx @nforma.ai/nforma --opencode --global # Install to ~/.config/opencode/
# Gemini CLI
npx @nforma.ai/nforma --gemini --global # Install to ~/.gemini/

# OpenAI Codex
npx @nforma.ai/nforma --codex --global # Skills: ~/.agents/skills; config: ~/.codex/
npx @nforma.ai/nforma --codex --local # Skills: ./.agents/skills; config: ./.codex/

# All runtimes
npx @nforma.ai/nforma --all --global # Install to all directories
```

Use `--global` (`-g`) or `--local` (`-l`) to skip the location prompt.
Use `--claude`, `--opencode`, `--gemini`, or `--all` to skip the runtime prompt.
Use `--claude`, `--opencode`, `--gemini`, `--codex`, or `--all` to skip the runtime prompt.

</details>

Expand Down
Loading