Metadata-Version: 2.4
Name: riposte-sec
Version: 0.1.0
Summary: Continuous AI purple-team platform: every attack it proves, it ships a verified detection.
Project-URL: Homepage, https://github.com/JoakimLarssen/Riposte
Project-URL: Repository, https://github.com/JoakimLarssen/Riposte
Project-URL: Issues, https://github.com/JoakimLarssen/Riposte/issues
Project-URL: Changelog, https://github.com/JoakimLarssen/Riposte/blob/main/CHANGELOG.md
Author: Joakim Larssen
License: Apache-2.0
License-File: LICENSE
Keywords: ai,detection-engineering,llm,penetration-testing,purple-team,security,sigma,soc
Classifier: Development Status :: 3 - Alpha
Classifier: Environment :: Console
Classifier: Intended Audience :: Information Technology
Classifier: Intended Audience :: System Administrators
Classifier: License :: OSI Approved :: Apache Software License
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 3 :: Only
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Topic :: Security
Classifier: Topic :: System :: Networking :: Monitoring
Requires-Python: >=3.11
Requires-Dist: apscheduler<4,>=3.10
Requires-Dist: cryptography<50,>=48.0.1
Requires-Dist: defusedxml<0.8,>=0.7
Requires-Dist: jsonschema<5,>=4
Requires-Dist: pydantic<3,>=2.6
Requires-Dist: pysigma-backend-elasticsearch<3,>=2
Requires-Dist: pysigma<2,>=1.3
Requires-Dist: pyyaml<7,>=6
Requires-Dist: sqlalchemy<3,>=2
Provides-Extra: connect
Requires-Dist: keyring<26,>=24; extra == 'connect'
Provides-Extra: dev
Requires-Dist: mypy<2,>=1.8; extra == 'dev'
Requires-Dist: pytest-cov<8,>=5; extra == 'dev'
Requires-Dist: pytest<10,>=9.0.3; extra == 'dev'
Requires-Dist: ruff<1,>=0.4; extra == 'dev'
Provides-Extra: elastic
Requires-Dist: elasticsearch<10,>=9; extra == 'elastic'
Provides-Extra: freeze
Requires-Dist: pyinstaller-hooks-contrib==2026.6; extra == 'freeze'
Requires-Dist: pyinstaller==6.21.0; extra == 'freeze'
Provides-Extra: llm
Requires-Dist: anthropic<1,>=0.87.0; extra == 'llm'
Requires-Dist: litellm<2,>=1.84.0; extra == 'llm'
Provides-Extra: publish
Requires-Dist: build<2,>=1; extra == 'publish'
Requires-Dist: twine<7,>=5; extra == 'publish'
Provides-Extra: siem-backends
Requires-Dist: pysigma-backend-kusto<2,>=1; extra == 'siem-backends'
Requires-Dist: pysigma-backend-splunk<3,>=2; extra == 'siem-backends'
Provides-Extra: tui
Requires-Dist: rich<16,>=13; extra == 'tui'
Requires-Dist: textual<9,>=0.50; extra == 'tui'
Description-Content-Type: text/markdown

<h1 align="center">Riposte 🤺</h1>

<p align="center"><strong>Red and blue in one terminal.</strong></p>

<p align="center">Attack a target, verify the finding, ship the detection.</p>

<p align="center">
  A terminal-native AI operator that runs the whole loop: recon, exploit, verify, then
  writes the detection that catches it next time. One tool, red team and blue team in
  the same session, offline by default.
</p>

<p align="center">
  <img alt="Version 0.1.0" src="https://img.shields.io/badge/version-0.1.0-c2481f?style=flat-square">
  <img alt="Python 3.11+" src="https://img.shields.io/badge/python-3.11%2B-1c6b86?style=flat-square">
  <a href="LICENSE"><img alt="License Apache-2.0" src="https://img.shields.io/badge/license-Apache--2.0-1c6b86?style=flat-square"></a>
</p>

<!-- Hero: the bare `riposte` launch, the full-screen Cold Steel first frame. A motion demo may replace this still later. -->
<p align="center">
  <img alt="Riposte's full-screen TUI on launch: the hero line, three runnable examples, and a live composer" src="docs/design/_media/hero.png" width="900">
</p>

## What it does

Riposte works one target and both sides of the fight in a single session.

- **Runs the loop.** Recon maps the authorized scope, ranks targets, probes for a
  weakness, and reproduces a finding as a concrete request, response, and the log lines it
  left behind.
- **Writes the detection that had to earn it.** A model can write a rule that is
  syntactically perfect and logically wrong. Every rule proves itself against the exploit
  that produced it before it is allowed to ship. In the offline demo, one of four
  candidate rules cleared every gate and shipped.
- **Carries 57 scope-gated tools.** Recon, web, cloud, credential, and blue/SOC binaries.
  Every call is checked against scope and written to the tamper-evident audit chain;
  sandboxed execution is the container baseline, with egress-policy wiring in progress (see
  [TRUST.md](docs/TRUST.md)). Browse all 57 with `riposte tools list`.
- **Ships an offline demo.** `riposte demo` runs the full red-to-blue flow in a few
  seconds and writes a real run directory you can inspect. The demo is deterministic and
  fully offline; it finds an error-based SQL injection and ships a detection built from a
  vetted template (`report.json` records `provenance: template`), not a model's output.
  Connect a model with `riposte connect` for live drafting.

Authorized use only. Riposte drives real attack tooling. Run it only against systems you
own or have explicit written permission to test.

The demo runs the full loop offline; live third-party engagements are founder-gated.
Apache-2.0. No telemetry. Offline by default.

<p align="center">
  <img alt="riposte demo: the full red-to-blue loop, offline" src="docs/design/_media/demo.gif" width="820">
</p>

<p align="center"><em>riposte demo: the full red-to-blue loop, offline.</em></p>

## What it touches

- **Files.** Writes only under `~/.riposte` (config) and `~/.local/share/riposte`
  (installed versions). Nothing outside your home directory.
- **Network.** Never for `riposte demo`. Otherwise only the provider, SIEM, and the
  in-scope targets you configure. No telemetry, ever.
- **Your data.** Offline by default. Target data stays on your machine.

## Install

> **Pre-alpha: not yet published.** Riposte is not on any package index yet, and no install
> endpoint is live. The one path that runs today is a source checkout, for contributors.
> Every command under "Available at 0.1.0 GA" is the planned install surface and does not
> work yet.

### Runs today (source checkout, for contributors)

Clone the repo, install into a virtual environment, and run the offline demo.

```sh
git clone git@github.com:JoakimLarssen/Riposte.git
cd Riposte
python -m venv .venv && . .venv/bin/activate
pip install -e ".[tui]"
riposte demo
```

`riposte demo` runs the full red-to-blue loop with no model, no Docker, no network, no
key, and writes a real run directory you can inspect. See the [Quickstart](QUICKSTART.md).

### Available at 0.1.0 GA

None of the commands below work yet. They are the install surface planned for the first
published release. Each block is copy-paste ready; after any of them, run `riposte` to start.

**One-line installer** (no Python prerequisite, TLS and protocol pinned):

```sh
curl --proto '=https' --tlsv1.2 -fsSL https://get.riposte.no/install.sh | sh
```

Read it first if you would rather see the script before it runs:

```sh
curl --proto '=https' --tlsv1.2 -fsSL https://get.riposte.no/install.sh | less
```

**pipx** (isolated app environment, recommended if you have Python):

```sh
pipx install riposte-sec
```

**uv** (same isolation, faster):

```sh
uv tool install riposte-sec
```

**pip** (into an environment you manage yourself):

```sh
pip install riposte-sec
```

**Docker** (explicit fallback; copyleft tools are pulled at runtime, not bundled):

```sh
docker run -it --rm ripostesec/riposte
```

Then start it:

```sh
riposte
```

Once published, `riposte update` will check the signed manifest, verify the new version's
checksum before it swaps anything, and roll back with `riposte update --rollback`. Until
then, re-run your install method to upgrade.

Python 3.11 or newer (3.12 recommended). Full detail, including scope setup and provider
auth, is in the [install guide](docs/INSTALL.md).

### Have your agent set it up

Setup (scope, provider auth, model selection) is a good task to delegate. If your agent has
access to this repository, point it at the install guide:

```
Install and configure Riposte by following docs/INSTALL.md in the repository, in full.
```

### For LLM agents

Read [docs/INSTALL.md](docs/INSTALL.md) in full. Do not summarize it: the scope,
provider-auth, and rules-of-engagement flags are exact and load-bearing for a security
tool, and a summarizing fetch drops them. Then follow steps 0 through 9 in order.

## Privacy and telemetry

Riposte collects no telemetry and does not phone home. There are no analytics, usage
beacons, or crash reporters. The demo and the deterministic core run with no network at all.

Two kinds of output stay separate. Operational logs are local diagnostic output you control
with `RIPOSTE_LOG_LEVEL`, and they stay on your machine. The hash-chained audit log is the
separate, tamper-evident record of what Riposte did, and it is never sent anywhere either.
When you connect a model or a SIEM, data flows only to the endpoints you configure. The
canonical data-flow statement (which provider sees what) lives in [DISCLOSURE.md](DISCLOSURE.md).

Read more: [Quickstart](QUICKSTART.md) · [Usage](docs/USAGE.md) ·
[About the loop](docs/ABOUT.md) · [Trust and safety](docs/TRUST.md) ·
[Responsible use](RESPONSIBLE_USE.md)

<p align="center">🤺</p>
