Metadata-Version: 2.4
Name: denim-cli
Version: 0.1.0
Summary: Compile one exact Ask into a reproducible native-host prompt and record.
Author: Fab7
License-Expression: Apache-2.0
License-File: LICENSE
Requires-Python: >=3.11
Requires-Dist: ringframe-cli==0.1.1
Description-Content-Type: text/markdown

# Denim

Denim deterministically compiles one exact Ask, one explicit requested effect,
one versioned recipe, and optional current RingFrame facts into a reproducible
prompt and consumer-owned record. Its installed skill follows that prompt in
the current Claude Code or Codex session.

Denim does not start an agentic host turn, enforce permissions, evaluate work,
or claim that its recipes improve native-host outcomes.

## Install

```sh
uv tool install denim-cli==0.1.0

codex plugin marketplace add fab7hq/fab7
codex plugin add denim@fab7

claude plugin marketplace add fab7hq/fab7
claude plugin install denim@fab7 --scope user --yes
```

The marketplace coordinate is `fab7hq/fab7`; the shared payload is
`plugins/denim/`. The Python package pins and installs
`ringframe-cli==0.1.1`; promoted-fact projection additionally requires the
published `cuff-cli==0.2.2` executable used by RingFrame.

## Compile

```sh
denim compile --host claude --workspace /path/to/worktree \
  --effect read-only --recipe review --json -- \
  "Review src/parser.py and report direct findings."

denim compile --host codex --workspace /path/to/worktree \
  --effect workspace-write --recipe implement --json -- \
  "Update src/parser.py and run its focused tests."
```

The exact Ask is one decoded positional argument. Denim never joins, trims,
classifies, or rewrites it. Effect and recipe are caller selections; effect is
intent for the native task, not a permission boundary.

Caller-selected facts use one `--bundle` and ordered repeated `--fact` options.
Denim requires external RingFrame `0.1.1` and accepts only active, fresh,
promoted Claim projections with complete Research/Probe/Result, retained-trial,
and Cuff bindings. Facts are attributed context, never authority.

A successful compile creates one atomic pair:

```text
<worktree>/.fab7/denim/compilations/compile_<32 hex>/
  record.json
  prompt.txt
```

Identical inputs reuse the byte-identical pair without rewriting it. A closed
refusal exits `1` and creates no compilation record; invalid CLI grammar exits
`2`.

The explicit `/denim:denim` or `$denim:denim` marketplace skill invokes the
compiler once and follows the returned prompt in the current session. FRAME
evaluation, owner decisions, RingFrame sealing, Cuff commitment, publication,
and deployment remain external.
