@interactive-inc/claude-funnel 0.15.2 → 0.16.1

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/README.md CHANGED
@@ -96,29 +96,38 @@ Or drop a `funnel.json` in the repo and `fnl claude` (no args) inside the repo w
96
96
  ```json
97
97
  {
98
98
  "$schema": "./node_modules/@interactive-inc/claude-funnel/funnel.schema.json",
99
- "channel": "ops",
100
- "options": ["--brief", "--agent", "cto"],
99
+ "options": ["--brief"],
101
100
  "env": {
102
101
  "ANTHROPIC_MODEL": "claude-sonnet-4-6"
103
102
  },
104
- "connectors": [
103
+ "channels": [
105
104
  {
106
- "type": "slack",
107
- "name": "my-slack",
108
- "env": {
109
- "botToken": "SLACK_BOT_TOKEN",
110
- "appToken": "SLACK_APP_TOKEN"
111
- }
105
+ "name": "ops",
106
+ "options": ["--agent", "pm"],
107
+ "connectors": [
108
+ {
109
+ "type": "slack",
110
+ "name": "my-slack",
111
+ "env": {
112
+ "botToken": "SLACK_BOT_TOKEN",
113
+ "appToken": "SLACK_APP_TOKEN"
114
+ }
115
+ }
116
+ ]
117
+ },
118
+ {
119
+ "name": "review",
120
+ "options": ["--agent", "reviewer"]
112
121
  }
113
122
  ]
114
123
  }
115
124
  ```
116
125
 
117
- Only `channel` is required.
126
+ `channels[]` is required and the first entry is the default. `fnl claude --channel review` picks one by name; `fnl claude` with no `--channel` uses the first.
118
127
 
119
- The optional `options` array is prepended to the claude argv on every launch, before any args the user types after `fnl claude`. Use it for repo-wide claude flags (e.g. `--brief`, `--agent <name>`, `--model <name>`). User-supplied CLI args appear later in the argv so they still win on collision.
128
+ The optional top-level `options` array is shared by every channel and prepended to each channel's own `options` (and both appear before user-supplied CLI args, which still come last). Use it for flags that should apply repo-wide (e.g. `--brief`). Per-channel `options` add channel-specific flags (e.g. a different `--agent`).
120
129
 
121
- The optional top-level `env` is a `Record<string, string>` of environment variables to layer under the claude process. `process.env` from the launching shell wins on collision, so funnel.json sets defaults that the user can still override one-off via the shell.
130
+ The optional top-level `env` is a `Record<string, string>` of environment variables shared by every channel; each channel's own `env` shallow-merges on top. `process.env` from the launching shell wins overall, so funnel.json sets defaults that the user can still override one-off via the shell.
122
131
 
123
132
  The optional `connectors` array is treated as the source of truth for the declared channel: missing connectors are created, an existing connector that the spec references by token (not by name) is renamed in place, and connectors not declared in the spec are removed on launch. An absent `connectors` field leaves `~/.funnel` alone.
124
133
 
@@ -188,9 +197,9 @@ fnl profiles <name> as-default move to the front of the list
188
197
  fnl profiles rename <old> <new>
189
198
  fnl profiles remove <name>
190
199
 
191
- fnl claude launch using ./funnel.json, or the default profile
192
- fnl claude --profile <name> launch a named profile
193
- fnl claude --channel <name> raw launch (no profile, cwd = current dir)
200
+ fnl claude launch the first channel from ./funnel.json, or the default profile
201
+ fnl claude --channel <name> with funnel.json: pick that channel; without: raw launch
202
+ fnl claude --profile <name> launch a named profile (ignores funnel.json)
194
203
  fnl claude [...] positionals and any flag other than -p / --profile / --channel
195
204
  (e.g. --agent, --resume, -c, --model) pass through to claude
196
205
  fnl mcp run as an MCP server (invoked from .mcp.json)
@@ -250,12 +259,16 @@ Connector =
250
259
  Profile = { name, path, subAgent, channelId }
251
260
  named launch preset; the first profile in the list is the default
252
261
 
253
- LocalConfig = { channel, options?, env?, connectors? }
254
- per-repo file (funnel.json) checked by `fnl claude` when no --profile / --channel is given
255
- options[] is prepended to claude argv (user CLI args override); env merges under process.env;
256
- connectors[] declares connectors to materialize on launch (each token field accepts a literal,
257
- an env-var reference at `env.<field>` resolved from process.env and ./.env.local, or omission
258
- for a TTY prompt persisted to ~/.funnel)
262
+ LocalConfig = { options?, env?, channels: ChannelSpec[] }
263
+ per-repo file (funnel.json). channels[] required; first entry is default, --channel selects.
264
+ Top-level options/env are shared defaults merged into each channel.
265
+
266
+ ChannelSpec = { name, options?, env?, connectors? }
267
+ options[] is appended to the shared options (user CLI args still come last); env shallow-merges
268
+ on top of the shared env (process.env wins overall); connectors[] declares connectors to
269
+ materialize on launch (each token field accepts a literal, an env-var reference at
270
+ `env.<field>` resolved from process.env and ./.env.local, or omission for a TTY prompt
271
+ persisted to ~/.funnel)
259
272
 
260
273
  Settings = { channels[], profiles[] } → ~/.funnel/settings.json
261
274
  ```