rippletide-package 0.1.1 → 0.2.0
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/PUBLISHING.md +39 -25
- package/README.md +5 -5
- package/bin/rippletide.js +14 -7
- package/counter/README.md +1 -1
- package/counter/src/cli.js +2 -2
- package/package.json +2 -2
- package/reviewer/README.md +3 -3
- package/reviewer/src/integrations/cli/rippletide.js +7 -7
- package/tide/README.md +4 -4
- package/tide/bin/tide.js +1 -1
- package/tide/src/cli.js +2 -2
package/PUBLISHING.md
CHANGED
|
@@ -7,9 +7,9 @@ subcommand of the same command:
|
|
|
7
7
|
npx rippletide-package <feature-name> [flags]
|
|
8
8
|
```
|
|
9
9
|
|
|
10
|
-
> Published on npm as **`rippletide-package
|
|
11
|
-
>
|
|
12
|
-
>
|
|
10
|
+
> Published on npm as **`rippletide-package`**, and the installed command is also
|
|
11
|
+
> **`rippletide-package`**. Via `npx`: `npx rippletide-package …`; after
|
|
12
|
+
> `npm i -g rippletide-package` you run `rippletide-package …`.
|
|
13
13
|
|
|
14
14
|
## One product, many features
|
|
15
15
|
|
|
@@ -17,10 +17,10 @@ npx rippletide-package <feature-name> [flags]
|
|
|
17
17
|
before product-market fit — but it should feel like **one product** to users:
|
|
18
18
|
|
|
19
19
|
- the publishing unit is the repo root;
|
|
20
|
-
- the npm package name
|
|
20
|
+
- the npm package name and the installed command are both `rippletide-package`;
|
|
21
21
|
- each user-facing feature is a **subcommand** (`<feature-name>`), implemented in its own
|
|
22
22
|
self-contained top-level folder;
|
|
23
|
-
- **flags** choose behavior *inside* a feature, e.g. `rippletide <feature-name> --<flag>`;
|
|
23
|
+
- **flags** choose behavior *inside* a feature, e.g. `rippletide-package <feature-name> --<flag>`;
|
|
24
24
|
- a new feature becomes a subcommand or flag before we ever create another package name.
|
|
25
25
|
|
|
26
26
|
This keeps experiments cheap without fragmenting the user experience: users learn one
|
|
@@ -49,7 +49,7 @@ When it graduates from experiment to a user-facing surface:
|
|
|
49
49
|
|
|
50
50
|
Do not create a new public npm package for every experiment. Create another package only
|
|
51
51
|
when a feature needs a separate install surface, audience, or lifecycle that would make the
|
|
52
|
-
single `rippletide` CLI worse.
|
|
52
|
+
single `rippletide-package` CLI worse.
|
|
53
53
|
|
|
54
54
|
## Package shape
|
|
55
55
|
|
|
@@ -57,7 +57,7 @@ single `rippletide` CLI worse.
|
|
|
57
57
|
npm registry : https://registry.npmjs.org/
|
|
58
58
|
repo folder : ./
|
|
59
59
|
package name : rippletide-package
|
|
60
|
-
command : rippletide
|
|
60
|
+
command : rippletide-package
|
|
61
61
|
```
|
|
62
62
|
|
|
63
63
|
The published tarball ships the root dispatcher plus each user-facing feature's runtime and
|
|
@@ -91,28 +91,40 @@ npm run release:dry # dry-run
|
|
|
91
91
|
npm run release:publish # publish (prompts for a 2FA OTP if your account requires one)
|
|
92
92
|
```
|
|
93
93
|
|
|
94
|
-
### Publishing rights:
|
|
94
|
+
### Publishing rights: CI (OIDC) and teammates
|
|
95
95
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
96
|
+
Releases go through CI using npm **Trusted Publishing (OIDC)** — no token and no 2FA. This is
|
|
97
|
+
the recommended path and the reason it's used here: on this account 2FA is required to publish,
|
|
98
|
+
and **npm access tokens do not bypass 2FA** (only classic Automation tokens do, and the npm UI
|
|
99
|
+
now only offers granular tokens, which get `EOTP` in CI). OIDC sidesteps all of that: GitHub's
|
|
100
|
+
workflow identity is the credential, verified cryptographically per run.
|
|
99
101
|
|
|
100
102
|
**CI release (recommended).** [`.github/workflows/release.yml`](.github/workflows/release.yml)
|
|
101
103
|
publishes automatically when a `rippletide-package-v*` tag is pushed (or via Actions → *Run
|
|
102
|
-
workflow*).
|
|
104
|
+
workflow*). The job has `permissions: id-token: write`, upgrades npm to a version that supports
|
|
105
|
+
OIDC, and runs `npm publish` — no secret is involved. One-time setup (already done for this
|
|
106
|
+
package):
|
|
103
107
|
|
|
104
|
-
1. On npmjs.com → **
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
2.
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
108
|
+
1. On npmjs.com → the **rippletide-package** package → **Settings** → **Trusted Publisher** →
|
|
109
|
+
*GitHub Actions*, with organization `rippletideco`, repository `rippletide-package`, and
|
|
110
|
+
workflow file `release.yml` (leave *Environment* blank). Allow the `npm publish` action.
|
|
111
|
+
2. That's it. Release by pushing a version tag — **any teammate who can push** can cut a
|
|
112
|
+
release; no npm login, token, or OTP (see the checklist below). (Signed build provenance
|
|
113
|
+
is not enabled: npm provenance requires a public source repo, and this repo is internal.)
|
|
114
|
+
|
|
115
|
+
**First publish caveat.** Trusted publishing (and provenance) can only be configured on a
|
|
116
|
+
package that already exists, so the *very first* publish of a brand-new package name must be
|
|
117
|
+
done manually (below), after which OIDC handles every subsequent release.
|
|
118
|
+
|
|
119
|
+
**Manual publish (first publish, or a one-off).** With a passkey/WebAuthn 2FA method, npm can
|
|
120
|
+
only complete the 2FA challenge in a browser, and it only offers that when it has a real
|
|
121
|
+
terminal. So run it in an interactive terminal (not a script/CI context):
|
|
113
122
|
|
|
114
|
-
|
|
115
|
-
|
|
123
|
+
```bash
|
|
124
|
+
npm publish # prints "Authenticate your account at: <url>" — approve with Touch ID
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
To let a teammate publish manually, a current owner grants them rights:
|
|
116
128
|
|
|
117
129
|
```bash
|
|
118
130
|
npm owner add <their-npm-username> rippletide-package # run by a current owner
|
|
@@ -131,10 +143,12 @@ VERSION=$(node -p "require('./package.json').version")
|
|
|
131
143
|
git add package.json
|
|
132
144
|
git commit -m "Release rippletide-package v${VERSION}"
|
|
133
145
|
git tag "rippletide-package-v${VERSION}"
|
|
134
|
-
git push origin main --tags
|
|
135
|
-
npm run release:publish
|
|
146
|
+
git push origin main --tags # pushing the tag triggers CI, which publishes via OIDC
|
|
136
147
|
```
|
|
137
148
|
|
|
149
|
+
Pushing the `rippletide-package-v*` tag is the whole release — the
|
|
150
|
+
[release workflow](.github/workflows/release.yml) publishes it. No local `npm publish` needed.
|
|
151
|
+
|
|
138
152
|
## Hosted direction (optional, per feature)
|
|
139
153
|
|
|
140
154
|
The CLI stays the user entry point. A feature may later move its heavy logic behind a hosted
|
package/README.md
CHANGED
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
Rippletide's product package. It ships as **one npm CLI** — `npx rippletide-package <feature-name>` —
|
|
4
4
|
while each feature lives in its own self-contained top-level folder.
|
|
5
5
|
|
|
6
|
-
> Published on npm as **`rippletide-package
|
|
7
|
-
>
|
|
8
|
-
> `npm i -g rippletide-package` then `rippletide <feature-name>`.
|
|
6
|
+
> Published on npm as **`rippletide-package`**, and the installed command is also
|
|
7
|
+
> **`rippletide-package`**. So: `npx rippletide-package <feature-name>`, or
|
|
8
|
+
> `npm i -g rippletide-package` then `rippletide-package <feature-name>`.
|
|
9
9
|
|
|
10
10
|
**Zero sharing between folders.** Each feature folder is fully self-contained — its own
|
|
11
11
|
code, dependencies, config, and docs. Nothing imports from or reaches into another
|
|
@@ -14,7 +14,7 @@ to the feature that owns it.
|
|
|
14
14
|
|
|
15
15
|
## Features
|
|
16
16
|
|
|
17
|
-
Each feature is a **subcommand** of `rippletide`, implemented in its own top-level folder.
|
|
17
|
+
Each feature is a **subcommand** of `rippletide-package`, implemented in its own top-level folder.
|
|
18
18
|
**A feature is explained in its own folder** — see that folder's `README.md` (and any
|
|
19
19
|
`PRD.md`/`docs`) for what it does and how to use it.
|
|
20
20
|
|
|
@@ -27,7 +27,7 @@ npx rippletide-package <feature-name> [flags]
|
|
|
27
27
|
One product, one command, many features. The root [`bin/rippletide.js`](bin/rippletide.js)
|
|
28
28
|
is a small, **feature-agnostic dispatcher**: it reads the first argument and hands off to
|
|
29
29
|
the feature folder that owns that subcommand. Behavior *within* a feature is chosen with
|
|
30
|
-
flags (e.g. `rippletide <feature-name> --<flag>`). Runtime code is not shared across feature
|
|
30
|
+
flags (e.g. `rippletide-package <feature-name> --<flag>`). Runtime code is not shared across feature
|
|
31
31
|
folders until a shared contract is deliberately designed.
|
|
32
32
|
|
|
33
33
|
## Adding a feature
|
package/bin/rippletide.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
// Rippletide product CLI — the single public entry point (`npx rippletide <feature> …`).
|
|
2
|
+
// Rippletide product CLI — the single public entry point (`npx rippletide-package <feature> …`).
|
|
3
3
|
//
|
|
4
4
|
// The repo is one product with several self-contained feature folders. This dispatcher
|
|
5
5
|
// routes a subcommand to the feature that owns it; it is feature-agnostic — add one route
|
|
6
6
|
// per user-facing feature. See PUBLISHING.md.
|
|
7
7
|
//
|
|
8
|
-
// rippletide review
|
|
9
|
-
// rippletide tide [...] -> tide/ (compile, install, check, …)
|
|
10
|
-
// rippletide counter [...] -> counter/ (live Codex calls/tokens/cost window)
|
|
8
|
+
// rippletide-package review [...] -> reviewer/ (review, inspect, …)
|
|
9
|
+
// rippletide-package tide [...] -> tide/ (compile, install, check, …)
|
|
10
|
+
// rippletide-package counter [...] -> counter/ (live Codex calls/tokens/cost window)
|
|
11
11
|
|
|
12
12
|
const argv = process.argv.slice(2);
|
|
13
13
|
const sub = argv[0];
|
|
@@ -22,6 +22,13 @@ if (sub === "counter") {
|
|
|
22
22
|
process.exit(await main(argv.slice(1)));
|
|
23
23
|
}
|
|
24
24
|
|
|
25
|
-
// Every other subcommand (review, inspect, --help, …) is owned by the reviewer feature
|
|
26
|
-
//
|
|
27
|
-
|
|
25
|
+
// Every other subcommand (review, inspect, --help, …) is owned by the reviewer feature.
|
|
26
|
+
// Its main() reads process.argv itself (command = argv[2]); call it explicitly here — the
|
|
27
|
+
// module's own run-as-main guard doesn't fire when imported through this dispatcher.
|
|
28
|
+
const { main } = await import("../reviewer/src/integrations/cli/rippletide.js");
|
|
29
|
+
try {
|
|
30
|
+
await main();
|
|
31
|
+
} catch (error) {
|
|
32
|
+
console.error(error instanceof Error ? error.message : String(error));
|
|
33
|
+
process.exit(1);
|
|
34
|
+
}
|
package/counter/README.md
CHANGED
|
@@ -6,7 +6,7 @@ Ported from the [x-ray](https://github.com/tototozip/x-ray) counter — the coun
|
|
|
6
6
|
token/cost half only (no risk scanning, no enforcement).
|
|
7
7
|
|
|
8
8
|
```bash
|
|
9
|
-
rippletide counter
|
|
9
|
+
rippletide-package counter
|
|
10
10
|
```
|
|
11
11
|
|
|
12
12
|
Then use Codex — the desktop app or the CLI. The window updates on every model call.
|
package/counter/src/cli.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
// The `counter` feature entry point — `rippletide counter`.
|
|
1
|
+
// The `counter` feature entry point — `rippletide-package counter`.
|
|
2
2
|
// Starts the Codex live counter: a floating sticky window that tallies LLM calls, tokens,
|
|
3
3
|
// and estimated cost in real time. macOS for the window; counting works anywhere.
|
|
4
4
|
import { run } from "./counter.js";
|
|
5
5
|
|
|
6
6
|
const HELP = `counter — a live Codex sticky window: LLM calls, tokens, and estimated cost.
|
|
7
7
|
|
|
8
|
-
Usage: rippletide counter
|
|
8
|
+
Usage: rippletide-package counter
|
|
9
9
|
|
|
10
10
|
Run it, then use Codex (the desktop app or the CLI). A floating window shows the running
|
|
11
11
|
call count, total tokens, and estimated USD cost. It points Codex's openai_base_url at a
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "rippletide-package",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "Rippletide's CLI for AI coding agents — one command, each feature a subcommand.",
|
|
6
6
|
"keywords": [
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
"registry": "https://registry.npmjs.org/"
|
|
20
20
|
},
|
|
21
21
|
"bin": {
|
|
22
|
-
"rippletide": "bin/rippletide.js"
|
|
22
|
+
"rippletide-package": "bin/rippletide.js"
|
|
23
23
|
},
|
|
24
24
|
"files": [
|
|
25
25
|
"bin/",
|
package/reviewer/README.md
CHANGED
|
@@ -24,7 +24,7 @@ RIPPLETIDE_MODEL=gpt-5.5
|
|
|
24
24
|
Run a review with npx:
|
|
25
25
|
|
|
26
26
|
```bash
|
|
27
|
-
npx rippletide review
|
|
27
|
+
npx rippletide-package review
|
|
28
28
|
```
|
|
29
29
|
|
|
30
30
|
The command reviews the current directory by default.
|
|
@@ -32,10 +32,10 @@ The command reviews the current directory by default.
|
|
|
32
32
|
Explicit path:
|
|
33
33
|
|
|
34
34
|
```bash
|
|
35
|
-
npx rippletide review /path/to/agent
|
|
35
|
+
npx rippletide-package review /path/to/agent
|
|
36
36
|
```
|
|
37
37
|
|
|
38
|
-
Current local reviewer mode requires `OPENAI_API_KEY`. The product direction is hosted-first, so the final `npx rippletide review` flow will use the Rippletide hosted reviewer instead of asking users to configure model keys.
|
|
38
|
+
Current local reviewer mode requires `OPENAI_API_KEY`. The product direction is hosted-first, so the final `npx rippletide-package review` flow will use the Rippletide hosted reviewer instead of asking users to configure model keys.
|
|
39
39
|
|
|
40
40
|
Run a review from a local checkout:
|
|
41
41
|
|
|
@@ -290,17 +290,17 @@ function usage() {
|
|
|
290
290
|
return `Rippletide Reviewer
|
|
291
291
|
|
|
292
292
|
Usage:
|
|
293
|
-
rippletide review [path] [--evidence-budget 140000] [--fix]
|
|
294
|
-
rippletide inspect [path] [--evidence-budget 140000]
|
|
293
|
+
rippletide-package review [path] [--evidence-budget 140000] [--fix]
|
|
294
|
+
rippletide-package inspect [path] [--evidence-budget 140000]
|
|
295
295
|
npm run inspect -- [path]
|
|
296
296
|
npm run review -- [path]
|
|
297
297
|
|
|
298
298
|
Example:
|
|
299
|
-
npx rippletide review
|
|
300
|
-
npx rippletide review ../my-agent
|
|
301
|
-
rippletide review ../my-agent
|
|
302
|
-
rippletide review ../my-agent --fix
|
|
303
|
-
rippletide inspect ../my-agent
|
|
299
|
+
npx rippletide-package review
|
|
300
|
+
npx rippletide-package review ../my-agent
|
|
301
|
+
rippletide-package review ../my-agent
|
|
302
|
+
rippletide-package review ../my-agent --fix
|
|
303
|
+
rippletide-package inspect ../my-agent
|
|
304
304
|
|
|
305
305
|
Interactive fix mode:
|
|
306
306
|
--fix shows a short findings menu first, then proposes an action for the finding you choose.
|
package/tide/README.md
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
|
|
6
6
|
## What it is
|
|
7
7
|
|
|
8
|
-
Write your guardrails in plain English in a `POLICY.md`. `rippletide --tide` compiles
|
|
8
|
+
Write your guardrails in plain English in a `POLICY.md`. `rippletide-package --tide` compiles
|
|
9
9
|
that policy — **once**, with an LLM — into deterministic, reviewable rules, and then
|
|
10
10
|
**enforces them at the agent's tool-call boundary at runtime** (no LLM in the hot path).
|
|
11
11
|
|
|
@@ -71,9 +71,9 @@ one interface, so switching later is a contained change.
|
|
|
71
71
|
|
|
72
72
|
## Usage (v1 — Codex)
|
|
73
73
|
|
|
74
|
-
Node package (unified with the `rippletide` npm CLI). Locally: `cd tide && npm install`,
|
|
74
|
+
Node package (unified with the `rippletide-package` npm CLI). Locally: `cd tide && npm install`,
|
|
75
75
|
then use `node bin/tide.js <cmd>` (or the `tide` bin). Wired into the parent it's
|
|
76
|
-
`rippletide tide <cmd>`.
|
|
76
|
+
`rippletide-package tide <cmd>`.
|
|
77
77
|
|
|
78
78
|
```bash
|
|
79
79
|
tide compile --policy POLICY.md --project .tide # POLICY.md -> rules (LLM) + golden tests
|
|
@@ -111,7 +111,7 @@ local and needs no credentials.
|
|
|
111
111
|
- **v1 shipped — Codex (Node):** compile (your key, model auto-matched) → deterministic
|
|
112
112
|
engine → PreToolUse hook. Verified end-to-end against real `codex` instances:
|
|
113
113
|
file-modifying commands **and** `apply_patch` edits are blocked; reads run; unit +
|
|
114
|
-
golden + e2e tests pass. Implemented in Node/ESM (`src/`) to unify with the `rippletide`
|
|
114
|
+
golden + e2e tests pass. Implemented in Node/ESM (`src/`) to unify with the `rippletide-package`
|
|
115
115
|
npm package — one dependency (`js-yaml`).
|
|
116
116
|
- **Placeholders:** Claude Code / OpenCode / Pi adapters are stubbed with their target seam
|
|
117
117
|
(see [`PRD.md`](PRD.md) §8). **Escalate** currently holds by blocking-with-reason (a live
|
package/tide/bin/tide.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
// Tide CLI entry. Also the
|
|
2
|
+
// Tide CLI entry. Also the tide feature entry point for the parent rippletide-package CLI.
|
|
3
3
|
import { main } from "../src/cli.js";
|
|
4
4
|
process.exit(await main(process.argv.slice(2)));
|
package/tide/src/cli.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
// The `tide` CLI — and the
|
|
1
|
+
// The `tide` CLI — and the tide feature entry point for the parent rippletide-package CLI.
|
|
2
2
|
// tide compile | test | check | install | uninstall | status
|
|
3
|
-
// The parent wires `rippletide
|
|
3
|
+
// The parent wires `rippletide-package tide <args>` to `main(args)`.
|
|
4
4
|
|
|
5
5
|
import fs from "node:fs";
|
|
6
6
|
import path from "node:path";
|