@sellable/install 0.1.91 → 0.1.93

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
@@ -6,6 +6,16 @@ Installs Sellable MCP for Claude Code and Codex.
6
6
  npx -y @sellable/install@latest --host all
7
7
  ```
8
8
 
9
+ After install, `sellable create` is a terminal helper that prints the correct
10
+ agent command for launching a campaign:
11
+
12
+ ```bash
13
+ sellable create
14
+ ```
15
+
16
+ Campaign creation itself runs inside Claude Code or Codex, where the Sellable
17
+ MCP tools and approval flow are available.
18
+
9
19
  If you do not pass a token, the installer prompts you for one and shows where to get it.
10
20
 
11
21
  The installer uses package stdio MCP by default:
@@ -129,9 +129,15 @@ function usage() {
129
129
  return `Sellable agent installer
130
130
 
131
131
  Usage:
132
+ sellable create
132
133
  sellable-install [options]
133
134
  npx -y @sellable/install@latest -- [options]
134
135
 
136
+ Commands:
137
+ create Show how to launch the create-campaign workflow.
138
+ auth set <token> Save a Sellable API token for first-run auth.
139
+ uninstall Remove Sellable host config and installed artifacts.
140
+
135
141
  Options:
136
142
  --host <host> claude, codex, or all. Default: all
137
143
  --server <mode> package, local, or hosted. Default: package
@@ -158,6 +164,34 @@ Auth:
158
164
  `;
159
165
  }
160
166
 
167
+ function printCreateCommandHint() {
168
+ printBanner();
169
+ console.log(
170
+ ` ${C.bold}Create campaigns from Claude Code or Codex.${C.reset}`
171
+ );
172
+ console.log("");
173
+ console.log(
174
+ ` ${C.grey}The terminal command installs and verifies Sellable. Campaign creation runs inside your agent session so the workflow can use MCP tools, live state, and approval gates.${C.reset}`
175
+ );
176
+ console.log("");
177
+ console.log(` ${"═".repeat(63)}`);
178
+ console.log(` ${C.bold}Start a Sellable campaign:${C.reset}`);
179
+ console.log(` ${"═".repeat(63)}`);
180
+ console.log("");
181
+ console.log("");
182
+ printAgentBox("Using Claude Code?", "claude", "/sellable:create-campaign");
183
+ console.log("");
184
+ console.log("");
185
+ printAgentBox("Using Codex?", "codex", "$sellable:create-campaign");
186
+ console.log("");
187
+ console.log(` ${"─".repeat(63)}`);
188
+ console.log(` ${C.grey}If those commands are missing, run:${C.reset}`);
189
+ console.log("");
190
+ console.log(` ${C.cyan}sellable --host all${C.reset}`);
191
+ console.log(` ${C.cyan}sellable --verify-only --host all${C.reset}`);
192
+ console.log("");
193
+ }
194
+
161
195
  function parseArgs(argv) {
162
196
  const opts = {
163
197
  host: process.env.SELLABLE_INSTALL_HOST || "all",
@@ -1524,8 +1558,17 @@ exec npx -y ${INSTALL_PACKAGE_SPEC} "$@"
1524
1558
  writeFile(binPath, shim, opts, 0o755);
1525
1559
  }
1526
1560
 
1561
+ const WATCH_MODE_DRIVER_ENV = {
1562
+ claude: "SELLABLE_WATCH_MODE_DRIVER=claude",
1563
+ codex: "SELLABLE_WATCH_MODE_DRIVER=codex",
1564
+ };
1565
+
1527
1566
  function withWatchModeDriver(command, args, driver) {
1528
- return ["env", [`SELLABLE_WATCH_MODE_DRIVER=${driver}`, command, ...args]];
1567
+ const envArg = WATCH_MODE_DRIVER_ENV[driver];
1568
+ if (!envArg) {
1569
+ throw new Error(`Unknown watch mode driver: ${driver}`);
1570
+ }
1571
+ return ["env", [envArg, command, ...args]];
1529
1572
  }
1530
1573
 
1531
1574
  function mcpCommand(opts) {
@@ -2236,6 +2279,10 @@ async function main() {
2236
2279
  runUninstall();
2237
2280
  process.exit(0);
2238
2281
  }
2282
+ if (rawArgs[0] === "create") {
2283
+ printCreateCommandHint();
2284
+ process.exit(0);
2285
+ }
2239
2286
  const opts = parseArgs(process.argv.slice(2));
2240
2287
  if (opts.help) {
2241
2288
  console.log(usage());
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sellable/install",
3
- "version": "0.1.91",
3
+ "version": "0.1.93",
4
4
  "type": "module",
5
5
  "description": "One-command installer for Sellable MCP in Claude Code and Codex",
6
6
  "bin": {
@@ -191,6 +191,11 @@ a fresh watch link once with `create_campaign({ campaignId })` or `get_campaign`
191
191
  and print that link. Do not claim the browser was opened, inspected, or
192
192
  synchronized.
193
193
 
194
+ Never print a placeholder watch link such as "Open campaign" or "link will
195
+ update once the shell is created." If the shell is not created yet, call
196
+ `create_campaign` first. If `create_campaign` does not return `watchUrl`, stop
197
+ and surface the missing watch-link error before lead sourcing.
198
+
194
199
  After every `update_campaign({ campaignId, currentStep })`, use
195
200
  `get_campaign_navigation_state` when available as a compact orientation check:
196
201
  match the saved campaign state to the expected watch-link step, explain the
@@ -565,6 +570,8 @@ updates.
565
570
  `message-validation.md` proves the message-review safety-gate workflow ran,
566
571
  `message-review.md` approves the template, rubrics are saved, and the
567
572
  approved message set is synced into the campaign brief.
573
+ Do not ask the user to approve the brief before shell creation unless they
574
+ explicitly requested a no-write draft; the shell itself is the review surface.
568
575
  6. The main thread owns watch navigation. Call
569
576
  `mcp__sellable__update_campaign({ campaignId, currentStep })` before major
570
577
  visible work so the user can watch progress in the app: `create-offer` for