Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
128 commits
Select commit Hold shift + click to select a range
c62af44
devlog: closeout for the interview-readiness unit and the v0.2.13 rel…
lidge-jun Aug 25, 2026
02b919f
devlog: plan the read-only subagent evidence-gate trap fix
lidge-jun Aug 26, 2026
93e2a36
skill(dev-devops): own branch and worktree lifecycle hygiene
lidge-jun Aug 26, 2026
bb8b5b5
fix(evidence-gate): stop trapping a read-only subagent forever
lidge-jun Aug 26, 2026
a809417
release(0.2.14): terminal-bounded subagent evidence gate
lidge-jun Aug 26, 2026
615c261
devlog: closeout for the read-only evidence-gate trap unit
lidge-jun Aug 26, 2026
f6bb469
devlog: correct the resolve example in the closeout (--session is val…
lidge-jun Aug 26, 2026
822ba3c
fix(evidence-cli): report every missing resolve argument at once
lidge-jun Aug 26, 2026
ae5e812
docs: analyze OMO beta and Senpi research gaps
lidge-jun Aug 27, 2026
e888f1c
docs: close research gap review blockers
lidge-jun Aug 27, 2026
8a0afc6
docs: finalize research evidence and roadmap
lidge-jun Aug 27, 2026
98cac96
docs: correct task wake-source citation
lidge-jun Aug 27, 2026
4a0c7bc
docs: add full OMO Senpi gap strategy report
lidge-jun Aug 27, 2026
0752124
docs: strengthen full gap report evidence
lidge-jun Aug 27, 2026
9deaa48
docs: densify full gap strategy report
lidge-jun Aug 27, 2026
7f8ebd3
docs: anchor remote score to executable evidence
lidge-jun Aug 27, 2026
aebc05a
docs: turn diagnostics into evidence-led pages
lidge-jun Aug 27, 2026
73d39d7
docs: archive completed gap analysis devlog
lidge-jun Aug 27, 2026
d661ddd
docs: localize full gap report to Korean
lidge-jun Aug 27, 2026
439db1b
docs: polish Korean gap report language
lidge-jun Aug 27, 2026
04620ee
docs: harden Korean report verification
lidge-jun Aug 27, 2026
94c9edf
docs: finalize Korean editorial pass
lidge-jun Aug 27, 2026
4852e03
docs: fix Korean report visual collisions
lidge-jun Aug 27, 2026
b721b0e
docs: archive Korean report correction
lidge-jun Aug 27, 2026
e8ff9f9
config-guard: add a scoped TOML setter for non-feature keys
lidge-jun Aug 28, 2026
0db7b8f
config-guard: revert per key instead of refusing on whole-file drift
lidge-jun Aug 28, 2026
8eeb896
pabcd-state: let a plan request open with the Interview
lidge-jun Aug 28, 2026
7488707
cxc config: surface the managed keys and the interview policy
lidge-jun Aug 28, 2026
2a4abfc
fix(pabcd-state): honour receipt generatedPaths at the C->D gate
lidge-jun Aug 29, 2026
5ede357
feat(config-guard): make a soft feature-flag failure visible
lidge-jun Aug 29, 2026
39c5123
feat(config-guard): self-heal declared codex features on SessionStart
lidge-jun Aug 29, 2026
d9259ca
feat(goalplan): schema v3 stores and preserves dependsOn and task out…
lidge-jun Aug 29, 2026
45b80f1
feat(cxc-ops): add a standing doctor check for the declared codex fea…
lidge-jun Aug 29, 2026
f7d7ac3
feat(goalplan): reject broken dependency graphs before they are trusted
lidge-jun Aug 29, 2026
8321b2d
feat(goalplan): pick work by dependency readiness, not declaration order
lidge-jun Aug 29, 2026
eee1aa9
docs(goalplan): repair the wp5 plan before it is implemented
lidge-jun Aug 29, 2026
a466083
docs(goalplan): make wp5 recovery produce the same plan a normal clos…
lidge-jun Aug 29, 2026
4ad875d
docs(goalplan): keep the shared close helper behind its own gates
lidge-jun Aug 29, 2026
38101e4
docs(goalplan): make the wp5 chat and CLI blocks compile as written
lidge-jun Aug 29, 2026
e96c03c
docs(goalplan): close the last recovery bypass in the shared close he…
lidge-jun Aug 29, 2026
e6bd3ae
docs(goalplan): give the wp5 chat marker fixture the receipt its gate…
lidge-jun Aug 29, 2026
ef42ac4
docs(goalplan): name the two wp5 deletions the count oracle already a…
lidge-jun Aug 29, 2026
edfd6e0
docs(goalplan): cover the CLI dependency-unmet recovery and stop the …
lidge-jun Aug 29, 2026
763e612
docs(goalplan): use the type name goalplan.ts actually exports
lidge-jun Aug 29, 2026
0e421a1
docs(goalplan): let the wp5 chat tests resolve what they call
lidge-jun Aug 29, 2026
418d241
docs(goalplan): make every wp5 name resolve where it is used
lidge-jun Aug 29, 2026
27220b6
docs(goalplan): typecheck the wp5 names instead of listing them by hand
lidge-jun Aug 29, 2026
1272c23
docs(goalplan): record what the unresolved-identifier gate provably c…
lidge-jun Aug 29, 2026
8962fd1
docs(goalplan): stop the typecheck gate from passing when tsc never ran
lidge-jun Aug 29, 2026
808add2
docs(goalplan): fail the typecheck gate when node types never resolve
lidge-jun Aug 29, 2026
fd5a86b
docs(goalplan): judge tsc by its exit code, not by log emptiness
lidge-jun Aug 29, 2026
aca40bb
docs(goalplan): invert the typecheck filter so new error classes cann…
lidge-jun Aug 29, 2026
e83ca8b
docs(goalplan): ratchet suppression comments so they cannot hide a mi…
lidge-jun Aug 29, 2026
d115c7d
docs(goalplan): pin diagnostic counts so an allowed code cannot hide …
lidge-jun Aug 29, 2026
0d1f02c
docs(goalplan): correct the retry-test tallies the new dependency cas…
lidge-jun Aug 29, 2026
459d45f
docs(goalplan): fingerprint tsc diagnostics and count suppressions pr…
lidge-jun Aug 29, 2026
d18bf3a
docs(goalplan): state the one thing the fingerprint baseline cannot see
lidge-jun Aug 29, 2026
7fa55c1
docs(goalplan): close the .d.ts hole skipLibCheck leaves open
lidge-jun Aug 29, 2026
ed4bfc0
fix(goalplan): stop treating a done status as proof the close was com…
lidge-jun Aug 29, 2026
e6c251d
docs(goalplan): pin the allowed suppression to its line and target
lidge-jun Aug 29, 2026
2d3890f
fix(goalplan): let the close helper decide, not its callers
lidge-jun Aug 29, 2026
432cb4f
fix(goalplan): compare the whole post-close shape before skipping the…
lidge-jun Aug 29, 2026
094e317
fix(goalplan): decide commit by plan identity instead of a predicate
lidge-jun Aug 29, 2026
0ef2c7c
docs(goalplan): record why fields outside the shape check are safe to…
lidge-jun Aug 29, 2026
11643bf
fix(goalplan): keep the selection normalization inside recovery only
lidge-jun Aug 29, 2026
1089a71
docs(goalplan): explain why a manually-done target diverges from adva…
lidge-jun Aug 29, 2026
5d99f7b
fix(goalplan): normalize only the phase the cursor names
lidge-jun Aug 29, 2026
a08b317
fix(goalplan): record the intended successor in the recovery marker
lidge-jun Aug 29, 2026
dda6aa0
test(goalplan): drive the marker-beats-cursor repair through the real…
lidge-jun Aug 29, 2026
db9ef5b
fix(goalplan): refresh the marker when recovery picks a different suc…
lidge-jun Aug 29, 2026
61b511f
fix(goalplan): make the recorded successor binding instead of a hint
lidge-jun Aug 29, 2026
423bf34
fix(goalplan): treat a finished successor as settled, not lost
lidge-jun Aug 29, 2026
1929222
fix(goalplan): fail closed on an unreadable marker and name a runnabl…
lidge-jun Aug 29, 2026
f6eae5b
test(goalplan): assert the resumed close still pays its ledger debt
lidge-jun Aug 29, 2026
f10a435
fix(goalplan): let a resume trust the marker over the file it is repa…
lidge-jun Aug 29, 2026
6a8b62b
fix(goalplan): share the absent-target decision and require a done ta…
lidge-jun Aug 29, 2026
f90fe11
docs(goalplan): record why a resume leaves the cursor null
lidge-jun Aug 29, 2026
8b39f27
fix(goalplan): stop a resume from undoing progress the plan already made
lidge-jun Aug 29, 2026
9fd2be0
docs(goalplan): record why the preserved cursor skips a readiness check
lidge-jun Aug 29, 2026
734946d
fix(goalplan): make a resume honour the readiness both cursor readers…
lidge-jun Aug 29, 2026
015777d
feat(goalplan): add the shared write lock and durable D-close recover…
lidge-jun Aug 29, 2026
3a87977
refactor(steering): serialize batches on the shared goalplan lock
lidge-jun Aug 29, 2026
be1316a
feat(orchestrate): make the CLI D-close idempotent under the goalplan…
lidge-jun Aug 29, 2026
a87f0ea
feat(hook): give the chat D-close the same locked idempotent close
lidge-jun Aug 29, 2026
2f860bb
refactor(review): serialize round open, abort, and verdict writes on …
lidge-jun Aug 29, 2026
1b4a2a5
test(goalplan): cover lock contention and CLI D-close recovery
lidge-jun Aug 29, 2026
9356ab9
test(hook): cover chat D-close recovery, contention, and review races
lidge-jun Aug 29, 2026
d5d4970
build(pabcd-state): regenerate the tracked dist for the wp5 write ser…
lidge-jun Aug 29, 2026
aa55a56
chore(steering): keep the dedicated-lock audit clean of a stale path …
lidge-jun Aug 29, 2026
f70dd11
fix(goalplan): resolve the type defects the stripped-type suites coul…
lidge-jun Aug 29, 2026
3f147db
docs(goalplan): repair the wp6 plan defects the round-1 audit found
lidge-jun Aug 29, 2026
f6111d6
docs(goalplan): close the round-2 audit findings on the wp6 plan
lidge-jun Aug 29, 2026
4cf4115
docs(goalplan): close the round-3 audit findings on the wp6 plan
lidge-jun Aug 29, 2026
3a4fdaa
docs(goalplan): pin the npm test gate to the reproduced C10 contention
lidge-jun Aug 29, 2026
714d579
feat(goalplan): expose ready queries and locked lifecycle transitions
lidge-jun Aug 29, 2026
95464cf
feat(goalplan): add the ready and lifecycle CLI verbs and consume the…
lidge-jun Aug 29, 2026
b655189
test(goalplan): lock the public surface contract with 27 new cases
lidge-jun Aug 29, 2026
5935671
docs(loop): sync the shipped schema and CLI surface with wp6
lidge-jun Aug 29, 2026
a322449
build(pabcd-state): regenerate the tracked dist for the wp6 public su…
lidge-jun Aug 29, 2026
583bc44
docs(goalplan): hand the lock AST oracle count to wp6
lidge-jun Aug 29, 2026
00a7f72
docs(goalplan): repair the wp7 plan against the current tree
lidge-jun Aug 29, 2026
04eaa1e
docs(goalplan): fix the wp7 plan escapes and inherited-excerpt authority
lidge-jun Aug 29, 2026
1448a0e
docs(goalplan): record the wp7 audit round 1 disposition
lidge-jun Aug 29, 2026
b3a9303
docs(goalplan): correct the wp7 test count and name the component gat…
lidge-jun Aug 29, 2026
57ffcc5
docs(goalplan): widen the wp7 privacy gate and tighten the corpus floor
lidge-jun Aug 29, 2026
bad140e
docs(goalplan): reconcile the wp7 import and helper blocks with the r…
lidge-jun Aug 29, 2026
3a89295
docs(goalplan): fix the wp7 string count and per-section test arithmetic
lidge-jun Aug 29, 2026
cdd2ba4
docs(goalplan): record the wp7 audit round 2 disposition
lidge-jun Aug 29, 2026
5358242
docs(goalplan): state what the wp7 hash pattern actually defends
lidge-jun Aug 29, 2026
65271c8
docs(goalplan): mark the wp7 privacy patterns as future-baseline defe…
lidge-jun Aug 29, 2026
ae0a86f
docs(goalplan): restore review-binding to the wp7 helper placement list
lidge-jun Aug 29, 2026
97993b2
docs(goalplan): correct the wp7 uuid corpus measurement
lidge-jun Aug 29, 2026
136c626
docs(goalplan): name the file that owns the wp7 alias invariant
lidge-jun Aug 29, 2026
887cfdb
docs(goalplan): replace the wp7 mutation count with a runnable patter…
lidge-jun Aug 29, 2026
4fccc71
test(goalplan): pin the wp7 dependency and outcome regressions
lidge-jun Aug 29, 2026
6d4a90e
test(goalplan): reclaim the wp7 lock render workspaces
lidge-jun Aug 29, 2026
cd090b6
test(goalplan): accept the fractional lock age the status helper reports
lidge-jun Aug 29, 2026
c6b43cb
docs(goalplan): rebut the wp7 observer mutation isolation finding
lidge-jun Aug 29, 2026
78bcd5f
docs(goalplan): close the dependency-execution roadmap contract
lidge-jun Aug 29, 2026
05db9d0
release(0.2.15): dependency-aware goalplan and the terminal evidence …
lidge-jun Aug 29, 2026
639be87
docs(goalplan): plan the v1 default that makes a new goalplan complet…
lidge-jun Aug 29, 2026
30616fb
fix(goalplan): a new goalplan declares v1, so it can actually be comp…
lidge-jun Aug 29, 2026
cac3d32
fix(goalplan): stop the finalGate reason from naming a flag that does…
lidge-jun Aug 30, 2026
6fc1399
release(0.2.16): a new goalplan you can actually finish
lidge-jun Aug 30, 2026
586cfc0
docs(goalplan): record why this unit's own plan stays stranded at v3
lidge-jun Aug 30, 2026
f9c3ee8
docs(goalplan): declare v1 on this unit's own plan and correct the re…
lidge-jun Aug 30, 2026
09bce19
fix(test): make the subagent-evidence suite portable to Windows
lidge-jun Aug 30, 2026
cb67757
fix(test): spawn the tombstone racers with a file URL, and stop hidin…
lidge-jun Aug 30, 2026
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
118 changes: 118 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,124 @@ All notable changes to codexclaw are documented here. The format follows

## [Unreleased]

## [0.2.16] — 2026-08-30

A new plan you can actually finish.

### Fixed

- **A new goalplan can be completed again.** `buildGoalplan()` declared the newest
schema, so every plan `cxc loop init` created claimed v3 — and every version at or
above 2 requires an approved `finalGate` that no shipped verb can produce, because
`review-round open` hardcodes `purpose: "plan_audit"` and never parses a lane. The
result was a permanent validation failure on every fresh plan and a
`GOAL-COMPLETE-GATE-01` denial for all of them. New plans now declare
`DEFAULT_NEW_SCHEMA_VERSION` (1), whose rules a user can actually discharge; the
stricter schema is available on request via `buildGoalplan({schemaVersion})` or
`cxc loop init --schema-version <n>`, clamped to the range this build can read. The
gate itself is unchanged: a plan that declares 2 or 3 still fails without an approved
gate.

- **The `finalGate` reason stops naming a flag that does not exist.** It told the reader
to run `cxc review-round open --lane final_gate`, which no parser accepts, so the round
opened as a plan audit and was then refused for being one. The reason now states that
no command in this build opens a final-gate round, and reports the schema version it
actually saw instead of always saying 2.

## [0.2.15] — 2026-08-30

A plan that knew what order to work in.

### Added

- **goalplan carries a dependency graph.** `GoalplanTask` and `GoalplanWorkPhase` now
take `dependsOn`, and tasks record an `outcome` when they close. Schema v3 writes and
preserves both; v1/v2 plans keep their sequential-cursor meaning exactly, so nothing on
disk has to move. The reviver refuses a future schema version rather than guessing at it.

- **Work is picked by readiness, not declaration order.** `effectiveActiveWorkPhaseId()`,
`nextOpenTask()`, and `advanceWorkPhase()` all honour `dependsOn`, so a phase or task
whose prerequisites are unfinished is not offered as the next thing to do. The Stop
guidance lists what is ready and what each blocked item is waiting for.

- **`cxc loop ready`, `add-task`, `complete-task`, `meet-criterion`, and
`add-work-phase --depends-on`** — registering a dependency and asking what is runnable
right now are both first-class CLI operations.

- **A broken graph is rejected before anything trusts it.** Dangling references, self
references, and cycles fail at registration and at `validateGoalplan()`, and the
goal-gate refuses to certify a plan that carries one. A deadlocked graph reports which
phase is blocked instead of silently offering no work.

- **`cxc config`** surfaces the managed keys and the interview policy, and **`cxc doctor`**
gained a standing check for the declared Codex features.

### Fixed

- **The subagent evidence gate no longer traps a read-only child.** Past the retry cap the
gate records an unresolved verdict and releases the child; `GOAL-COMPLETE-GATE-01` holds
`update_goal {status:"complete"}` until that verdict is settled. Verification moves to
the parent, which is the only actor that can act on it.

- **D-close is idempotent under a shared write lock.** Both the CLI and the chat path take
the goalplan lock and leave a durable recovery marker, so a retry after a committed plan
write closes the fixed phase once instead of advancing twice. A resume trusts the marker
over the file it is repairing, fails closed on an unreadable marker, and treats a
finished successor as settled rather than lost.

- **`config-guard` self-heals declared Codex features on SessionStart** and reverts per key
instead of refusing on whole-file drift. A soft feature-flag failure is now visible
rather than silent.

- **The C→D gate honours a receipt's `generatedPaths`**, so a check that regenerates its
own artifacts by design is no longer read as the source changing under it.

- **`cxc evidence resolve` reports every missing argument at once** instead of one per run.

### Changed

- The ledger records dependency events, so the order work actually ran in is auditable
after the fact.
- `cxc-loop` and `cxc-qa` skills document the dependency-aware surface, and `cxc-dev-devops`
gained branch and worktree lifecycle rules.

## [0.2.14] — 2026-08-26

A gate that could never be satisfied, and therefore never stopped asking.

### Fixed

- **The SubagentStop evidence gate no longer traps a read-only subagent.** A child
dispatched read-only cannot create a receipt under the parent's
`.codexclaw/evidence/`, so the receipt check failed forever. Past `MAX_ATTEMPTS` the
gate returned `decision:"block"` on every subsequent stop with no terminal release —
a real transcript shows 15+ identical escalation blocks against a child that had
already finished its work correctly.

The retry budget is now terminal. At the cap the gate records an unresolved verdict
against the session and releases the child, and `GOAL-COMPLETE-GATE-01` denies
`update_goal {status:"complete"}` until that verdict is settled with a valid receipt.
Verification is not waived; it moves to the parent, which is the only actor that can
act on it. `update_goal {status:"blocked"}` remains the honest escape hatch.

### Added

- **`cxc evidence resolve --session <id> --agent <id> [--turn <id>] --receipt <path>`** —
settles an unresolved verdict. The receipt is validated through the same evidence-root
contract the gate uses, the resolution is ledgered, and there is deliberately no
override flag: a CLI flag cannot authenticate a human, and the agent being held back
must not be able to erase its own verdict.
- **`withSessionLock`** — serialized read-modify-write for session state. `writeState`
publishes atomically but does not serialize, so concurrent subagent stops could
silently erase each other's verdict.

### Changed

- `docs/security-hardening.md`, the dispatch doctrine (new `EVIDENCE-TERMINAL-01`), the
hooks reference, and the QA skill now describe the shipped behavior: fail-closed on
the verdict, bounded on the control flow. Read-only lanes belong on
`agent_type:"explorer"`, which the gate never touches.

## [0.2.13] — 2026-08-25

Three gates that obstructed the agents following them, and the operational
Expand Down
6 changes: 3 additions & 3 deletions README.ko.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,9 @@

<p align="center">
<a href="https://github.com/lidge-jun/codexclaw/actions/workflows/ci.yml"><img src="https://github.com/lidge-jun/codexclaw/actions/workflows/ci.yml/badge.svg" alt="CI"></a>
<img src="https://img.shields.io/badge/tests-1%2C995_passing-brightgreen" alt="1,995 tests passing">
<img src="https://img.shields.io/badge/tests-2%2C026_passing-brightgreen" alt="2,026 tests passing">
<img src="https://img.shields.io/badge/skills-28-blue" alt="28 skills">
<img src="https://img.shields.io/badge/hooks-22-blue" alt="22 hooks">
<img src="https://img.shields.io/badge/hooks-23-blue" alt="23 hooks">
<a href="https://lidge-jun.github.io/codexclaw/"><img src="https://img.shields.io/badge/docs-codexclaw-black" alt="Documentation"></a>
<a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-green" alt="MIT"></a>
</p>
Expand Down Expand Up @@ -103,7 +103,7 @@ plugins/codexclaw/
│ ├── recall/ past-session + memory store search
│ └── repo-map/ tree-sitter + PageRank structure map
├── hooks/ 22 active hooks across the session lifecycle
├── hooks/ 23 active hooks across the session lifecycle
│ ├── session-start-* provider bridge, PABCD bootstrap, map affordance, recall context
│ ├── user-prompt-submit-* PABCD trigger detection, recall intent
│ ├── pre-tool-use-* skill attach, goal guards, patch lint, interview guard
Expand Down
8 changes: 4 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,9 @@

<p align="center">
<a href="https://github.com/lidge-jun/codexclaw/actions/workflows/ci.yml"><img src="https://github.com/lidge-jun/codexclaw/actions/workflows/ci.yml/badge.svg" alt="CI"></a>
<img src="https://img.shields.io/badge/tests-1%2C995_passing-brightgreen" alt="1,995 tests passing">
<img src="https://img.shields.io/badge/tests-2%2C026_passing-brightgreen" alt="2,026 tests passing">
<img src="https://img.shields.io/badge/skills-28-blue" alt="28 skills">
<img src="https://img.shields.io/badge/hooks-22-blue" alt="22 hooks">
<img src="https://img.shields.io/badge/hooks-23-blue" alt="23 hooks">
<a href="https://lidge-jun.github.io/codexclaw/"><img src="https://img.shields.io/badge/docs-codexclaw-black" alt="Documentation"></a>
<a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-green" alt="MIT"></a>
</p>
Expand Down Expand Up @@ -54,7 +54,7 @@ codex plugin marketplace add https://github.com/lidge-jun/codexclaw
codex plugin add codexclaw@codexclaw
```

Then restart Codex and approve the 22 hooks when prompted (upgrades ask again — content-hash trust). Everything runs from chat, and the terminal surface ships too — the payload includes its own `cxc` dispatcher, so agent-driven `cxc orchestrate` commands work on every install:
Then restart Codex and approve the 23 hooks when prompted (upgrades ask again — content-hash trust). Everything runs from chat, and the terminal surface ships too — the payload includes its own `cxc` dispatcher, so agent-driven `cxc orchestrate` commands work on every install:

- `orchestrate status` — check the PABCD state machine
- "Interview me first, then draft a diff-level plan."
Expand Down Expand Up @@ -103,7 +103,7 @@ plugins/codexclaw/
│ ├── recall/ past-session + memory store search
│ └── repo-map/ tree-sitter + PageRank structure map
├── hooks/ 22 active hooks across the session lifecycle
├── hooks/ 23 active hooks across the session lifecycle
│ ├── session-start-* provider bridge, PABCD bootstrap, map affordance, recall context
│ ├── user-prompt-submit-* PABCD trigger detection, recall intent
│ ├── pre-tool-use-* skill attach, goal guards, patch lint, interview guard
Expand Down
6 changes: 3 additions & 3 deletions README.zh.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,9 @@

<p align="center">
<a href="https://github.com/lidge-jun/codexclaw/actions/workflows/ci.yml"><img src="https://github.com/lidge-jun/codexclaw/actions/workflows/ci.yml/badge.svg" alt="CI"></a>
<img src="https://img.shields.io/badge/tests-1%2C995_passing-brightgreen" alt="1,995 tests passing">
<img src="https://img.shields.io/badge/tests-2%2C026_passing-brightgreen" alt="2,026 tests passing">
<img src="https://img.shields.io/badge/skills-28-blue" alt="28 skills">
<img src="https://img.shields.io/badge/hooks-22-blue" alt="22 hooks">
<img src="https://img.shields.io/badge/hooks-23-blue" alt="23 hooks">
<a href="https://lidge-jun.github.io/codexclaw/"><img src="https://img.shields.io/badge/docs-codexclaw-black" alt="Documentation"></a>
<a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-green" alt="MIT"></a>
</p>
Expand Down Expand Up @@ -103,7 +103,7 @@ plugins/codexclaw/
│ ├── recall/ past-session + memory store search
│ └── repo-map/ tree-sitter + PageRank structure map
├── hooks/ 22 active hooks across the session lifecycle
├── hooks/ 23 active hooks across the session lifecycle
│ ├── session-start-* provider bridge, PABCD bootstrap, map affordance, recall context
│ ├── user-prompt-submit-* PABCD trigger detection, recall intent
│ ├── pre-tool-use-* skill attach, goal guards, patch lint, interview guard
Expand Down
30 changes: 24 additions & 6 deletions bin/codexclaw.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -195,9 +195,12 @@ export function commandInvocation(command, args, platform = process.platform, en
};
}

/** Delegate a subcommand to the compiled config-guard CLI; returns its exit code. */
function runConfigGuard(subcommand) {
const res = spawnSync(process.execPath, [configGuardCli, subcommand], { stdio: "inherit" });
/**
* Delegate to the compiled config-guard CLI; returns its exit code.
* Takes an ARRAY: `config set <key> <value>` has to keep its arguments.
*/
function runConfigGuard(args) {
const res = spawnSync(process.execPath, [configGuardCli, ...args], { stdio: "inherit" });
return typeof res.status === "number" ? res.status : 1;
}

Expand Down Expand Up @@ -265,6 +268,7 @@ const TOP_LEVEL_HELP = [
" goalplan init|show|validate deprecated alias for loop",
" plan init <slug> [--phases N] scaffold the devlog/_plan unit the P>A gate verifies",
" receipt test -- <command> produce the test receipt a bound C>D requires",
" evidence resolve settle an unverified subagent verdict (needs --receipt)",
" review-round open|show|abort the opt-in A-gate plan-audit round",
" scan record|show record interview coverage and contradiction scans",
" metric record/show objective metrics",
Expand Down Expand Up @@ -442,14 +446,23 @@ if (isMain) switch (cmd) {
break;
}
case "enable":
process.exit(runConfigGuard("enable"));
process.exit(runConfigGuard(["enable"]));
break;
case "uninstall":
case "disable":
process.exit(runConfigGuard("disable"));
process.exit(runConfigGuard(["disable"]));
break;
case "status":
process.exit(runConfigGuard("status"));
process.exit(runConfigGuard(["status"]));
break;
case "config":
// `config interview` is owned by pabcd-state (it owns codexclaw.json); the managed
// ~/.codex/config.toml keys are owned by config-guard.
process.exit(
process.argv[3] === "interview"
? runPabcdState(process.argv.slice(2))
: runConfigGuard(process.argv.slice(2)),
);
break;
case "doctor":
case "reset":
Expand Down Expand Up @@ -496,6 +509,11 @@ if (isMain) switch (cmd) {
// Runs a command and records the observed exit for the C>D gate (075).
process.exit(runPabcdState(process.argv.slice(2)));
break;
case "evidence":
// pabcd-state CLI expects argv as [kind, ...rest]; kind === "evidence".
// Settles an unresolved subagent verification verdict (EVIDENCE-TERMINAL-01).
process.exit(runPabcdState(process.argv.slice(2)));
break;
case "review-round":
// pabcd-state CLI expects argv as [kind, ...rest]; kind === "review-round".
// Opens and inspects plan-audit rounds for the A>B binding gate (060). There is
Expand Down
2 changes: 1 addition & 1 deletion cli/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@codexclaw/cli",
"version": "0.2.13",
"version": "0.2.16",
"private": true,
"type": "module",
"description": "codexclaw CLI — status, subagent config, provider toggle, GUI launcher.",
Expand Down
Loading
Loading