Skip to content

Commit 0d9c5cc

Browse files
committed
install_check: interactive Conductor server setup + 8 README examples
install_check.sh — new interactive Conductor server flow. When CONDUCTOR_SERVER_URL is missing or unreachable, prompts the user: 1) provide URL of existing server 2) start a local one for me (with port-collision detection — falls back to 8081/8090/9080/18080/28080 if 8080 is taken) 3) skip Reachability is verified via <root>/health before continuing. In --auto-install mode the local-server path runs without prompting; in --non-interactive it just reports missing. SKILL.md — updates the Prerequisites section to describe the new interactive flow and tells Claude how to use it when guiding a non-technical user (provide URL vs. start local). README.md — restructures the "finish setup" paragraph to surface the three Conductor choices, and adds an "Examples — prompts you can paste" section with 8 concrete prompts covering Mode A/B/C, mid-run status, voice override, pause/resume, repositioning iteration, and short-circuit fast runs.
1 parent a2fe5d3 commit 0d9c5cc

3 files changed

Lines changed: 206 additions & 14 deletions

File tree

gtm-mavericks/README.md

Lines changed: 71 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -86,18 +86,30 @@ Valid IDs: `claude-code`, `claude-code-plugins`, `codex`, `gemini`, `opencode` (
8686

8787
**Note on compatibility:** the skill file format (markdown with YAML frontmatter) is largely portable across these agents, but tool-name conventions differ slightly between platforms (Claude Code's `Bash` vs Codex's equivalents, for example). The `allowed-tools` line in `SKILL.md` is written for Claude Code; on other platforms most tool calls still work but some may need light adaptation. File issues at [`conductoross/awesome-skills`](https://github.com/conductoross/awesome-skills) if you hit a tool-name mismatch.
8888

89-
To finish setup (install Conductor CLI deps and register workflows on your server):
89+
To finish setup, run the bootstrap. It handles **both** the deps (conductor CLI / pandoc / marp) **and** the Conductor server:
9090

9191
```bash
92-
export CONDUCTOR_SERVER_URL="http://localhost:8080/api" # or your Orkes Cloud URL
93-
# For Orkes Cloud (authenticated servers):
92+
gtm-install
93+
```
94+
95+
`gtm-install` is interactive. For each missing piece it asks before doing anything. For the Conductor server specifically, it offers three choices:
96+
97+
1. **You already have a server** — provide the URL (e.g. `http://localhost:8080/api`, or your Orkes Cloud cluster URL).
98+
2. **Start one locally for me** — the script runs `conductor server start`, checks port 8080 first, and falls back to 8081 / 8090 / 9080 / 18080 if 8080 is taken. The OSS jar (~600 MB) downloads once on first run. After boot, the script prints the `export CONDUCTOR_SERVER_URL=...` line for you to add to your shell rc file.
99+
3. **Skip for now** — useful if you only want to install the skill files and configure later.
100+
101+
Re-runnable and idempotent. If you set `CONDUCTOR_SERVER_URL` ahead of time, the prompt is skipped.
102+
103+
For **Orkes Cloud** (authenticated remote servers), set the auth env vars yourself before `gtm-install`:
104+
105+
```bash
106+
export CONDUCTOR_SERVER_URL="https://<your-cluster>.orkesconductor.io/api"
94107
export CONDUCTOR_AUTH_KEY="<your-key-id>"
95108
export CONDUCTOR_AUTH_SECRET="<your-key-secret>"
96-
97109
gtm-install
98110
```
99111

100-
`gtm-install` is interactive — it'll prompt before installing the `conductor` CLI, `pandoc`, and `marp`. Re-runnable; safe to retry.
112+
For **OSS Conductor** (local or self-hosted), no auth is needed.
101113

102114
To remove:
103115

@@ -203,6 +215,60 @@ The skill reads `.gtm/active-run`, queries Conductor, and gives you a plain-Engl
203215

204216
---
205217

218+
## Examples — prompts you can paste
219+
220+
Copy any of these into Claude (or whichever agent you use) to trigger the skill. The skill will run the intake wizard from there, one question at a time.
221+
222+
### 1. New product, no traction yet (Mode A)
223+
224+
> Let's run a gtm for a new product. I'm building **FlightCalm** — an iOS app that uses Apple Watch heart-rate variability to trigger personalized breathing exercises mid-flight for people with flight anxiety. No traction yet. I have 4 interview transcripts in `~/Desktop/flightcalm/interviews/` and a one-pager concept doc.
225+
226+
What happens: intake wizard → Mode A confirmed → discovery (with corpus + web search) → ICP panel → ICP gate → positioning panel → positioning gate → messaging house → asset voice gate → assets → bundle + PDF.
227+
228+
### 2. Repositioning a B2B SaaS that hit a plateau (Mode B)
229+
230+
> We sell **Hublink** — async-first team workspace. $8M ARR, Series B. Win rate dropped 15% YoY against Linear/Notion. Demos land but deals stall. We need to reposition. I'm uploading lost-deal transcripts and current website copy. Run a full repositioning.
231+
232+
What happens: Mode B → discovery focused on current-positioning audit + lost-deal patterns → 6-persona ICP panel that argues over who the *real* buyer is now → positioning panel surfaces "broaden vs narrow the category" forks → messaging house with anti-messaging that names what to stop saying → assets in Dunford's voice (B2B operational default).
233+
234+
### 3. Launch campaign with positioning already set (Mode C)
235+
236+
> Launch campaign for **Earnpay Advance** — instant earned-wage access for hourly workers, just approved in 12 states. Positioning is set: "Cash you've earned, before payday — no fees, no credit check, no debt." Buyers are 22-38 hourly workers earning $15-25/hr at retail/food service. I need messaging house, landing copy, ad copy variants, and a 4-email outbound sequence in Halbert's direct-response voice.
237+
238+
What happens: Mode C → skips ICP/positioning debate → discovery focused on channels + trigger events → messaging house → voice pick (Halbert recommended for direct-response) → 4 assets generated in his voice → bundle + PDF.
239+
240+
### 4. Mid-run check-in
241+
242+
> Where are we on the GTM run?
243+
244+
What happens: the skill reads `.gtm/active-run`, queries Conductor, and translates the workflow state into plain English ("we're 40% through, ~12 min in, the panel is debating positioning; want to see the ICP draft now?").
245+
246+
### 5. Force a specific persona voice on assets
247+
248+
> When you get to the asset voice pick, use Draper — the emotional-truth one. I want headlines, not bullet lists.
249+
250+
What happens: at the voice gate, the skill commits to Draper for `artifact_generation`. Outbound sequences, ad copy, and landing copy all carry his signature moves (the reframe, lead with feeling, no proof points above story).
251+
252+
### 6. Pause a long-running run
253+
254+
> Pause the run. I'll come back to it tomorrow.
255+
256+
What happens: `conductor workflow pause <id>`. Resume with "resume the gtm run" any time.
257+
258+
### 7. Iterate on positioning without re-running everything
259+
260+
> The positioning we just landed is good but I want to test a category-creation play instead. Can we re-run positioning with that frame?
261+
262+
What happens: the skill terminates the current run, kicks off a new one with `positioning_hypothesis` carrying the category-creation framing, and tells you when the new positioning is ready for review.
263+
264+
### 8. Get just the deliverables, no debate
265+
266+
> Give me messaging house + landing copy + 3 ad copy variants for **<product description>**, voice: Dunford. Skip the long synthesis loops.
267+
268+
What happens: Mode C intake with `max_synthesis_iterations: 1`, deliverables narrowed to the 3 requested. Run completes in ~10-15 min instead of 30-60.
269+
270+
---
271+
206272
## What you'll get
207273

208274
When a run completes, you'll find in `gtm-output/<run-id>/`:

gtm-mavericks/SKILL.md

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,14 +42,21 @@ You are a senior GTM strategist running a deep go-to-market workflow on behalf o
4242
On first use, run these two scripts in order:
4343

4444
```bash
45-
# 1) Install dependencies (conductor CLI optional; pandoc/marp optional for local re-render)
45+
# 1) Bootstrap deps AND set up a Conductor server interactively.
46+
# Will prompt to either:
47+
# (a) accept an existing CONDUCTOR_SERVER_URL,
48+
# (b) ask for one if not set,
49+
# (c) start a local OSS Conductor server (port-collision-aware).
50+
# Also prompts (y/N) for conductor CLI, pandoc, marp installs.
4651
./gtm-mavericks/scripts/install_check.sh
4752

4853
# 2) Register all 4 workflow defs into Conductor (PUT-array upsert; idempotent)
4954
./gtm-mavericks/scripts/register_workflows.sh
5055
```
5156

52-
`CONDUCTOR_SERVER_URL` must be exported (e.g. `http://localhost:8080/api`). For Orkes Cloud, also set `CONDUCTOR_AUTH_KEY` + `CONDUCTOR_AUTH_SECRET`. OSS Conductor needs no auth.
57+
If `CONDUCTOR_SERVER_URL` isn't set when the user starts a run, ask them: do they want to (a) provide a URL of an existing server, or (b) have us start one locally for them? Run `install_check.sh` (no flags) to drive the conversation — it will detect port 8080 collisions and pick an available port automatically.
58+
59+
For Orkes Cloud, set `CONDUCTOR_AUTH_KEY` + `CONDUCTOR_AUTH_SECRET` in addition to `CONDUCTOR_SERVER_URL`. OSS Conductor (local or remote) needs no auth.
5360

5461
**No prompt-upload step.** All prompts are inlined into the workflow JSON via `allowRawPrompts: true`. Fully self-contained — there's no `setup_prompts.sh` to run.
5562

gtm-mavericks/scripts/install_check.sh

Lines changed: 126 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -118,14 +118,133 @@ else
118118
fi
119119
fi
120120

121-
# --- 3. CONDUCTOR_SERVER_URL (REQUIRED; cannot auto-set) ---
121+
# --- 3. CONDUCTOR_SERVER_URL — interactive setup ---
122+
#
123+
# Three paths: (a) already set & reachable → ok; (b) user provides a URL;
124+
# (c) start a local server (with port-availability detection).
125+
126+
server_reachable() {
127+
# $1: full URL (http://host:port/api). Probes <root>/health (no /api suffix).
128+
local url="$1"
129+
local root="${url%/api}"
130+
curl -fsS --max-time 4 "$root/health" >/dev/null 2>&1
131+
}
132+
133+
find_free_port() {
134+
for p in 8080 8081 8090 9080 18080 28080; do
135+
if ! lsof -nP -iTCP:"$p" -sTCP:LISTEN >/dev/null 2>&1; then
136+
echo "$p"
137+
return 0
138+
fi
139+
done
140+
echo ""
141+
return 1
142+
}
143+
144+
start_local_conductor() {
145+
# Returns 0 + sets LOCAL_CONDUCTOR_URL on success; 1 on failure.
146+
local port
147+
port=$(find_free_port)
148+
if [ -z "$port" ]; then
149+
fail "No free port found in 8080/8081/8090/9080/18080/28080."
150+
return 1
151+
fi
152+
if [ "$port" != "8080" ]; then
153+
info "Port 8080 is busy. Using port $port instead."
154+
fi
155+
info "Starting Conductor server on port $port (this downloads ~600MB on first run)..."
156+
conductor server start --port "$port" >/tmp/conductor-server.log 2>&1 &
157+
local start_pid=$!
158+
local url="http://localhost:$port/api"
159+
for i in $(seq 1 90); do
160+
if server_reachable "$url"; then
161+
ok "Conductor server is up: $url"
162+
LOCAL_CONDUCTOR_URL="$url"
163+
return 0
164+
fi
165+
[ $((i % 6)) -eq 0 ] && info " …still waiting (attempt $i / 90)…"
166+
sleep 5
167+
done
168+
fail "Conductor server didn't come up within 7.5 minutes."
169+
fail "Last 30 lines of /tmp/conductor-server.log:"
170+
tail -30 /tmp/conductor-server.log 2>&1 | sed 's/^/ /'
171+
return 1
172+
}
173+
174+
CONDUCTOR_SET=false
175+
122176
if [ -n "${CONDUCTOR_SERVER_URL:-}" ]; then
123-
ok "CONDUCTOR_SERVER_URL: $CONDUCTOR_SERVER_URL"
124-
else
125-
fail "CONDUCTOR_SERVER_URL not set."
126-
info "Set it for the current shell: export CONDUCTOR_SERVER_URL=http://localhost:8080/api"
127-
info "To persist, add the line to ~/.zshrc or ~/.bashrc."
128-
HARD_FAILS=$((HARD_FAILS + 1))
177+
if server_reachable "$CONDUCTOR_SERVER_URL"; then
178+
ok "CONDUCTOR_SERVER_URL: $CONDUCTOR_SERVER_URL (reachable)"
179+
CONDUCTOR_SET=true
180+
else
181+
warn "CONDUCTOR_SERVER_URL=$CONDUCTOR_SERVER_URL — set but not reachable."
182+
fi
183+
fi
184+
185+
if [ "$CONDUCTOR_SET" = "false" ]; then
186+
case "$MODE" in
187+
check-only)
188+
fail "CONDUCTOR_SERVER_URL not set or not reachable."
189+
info "Set it: export CONDUCTOR_SERVER_URL=http://localhost:8080/api"
190+
info "Or run interactively to be guided through server setup."
191+
HARD_FAILS=$((HARD_FAILS + 1))
192+
;;
193+
auto-install)
194+
info "auto-install mode → starting a local Conductor server."
195+
if start_local_conductor; then
196+
CONDUCTOR_SET=true
197+
else
198+
HARD_FAILS=$((HARD_FAILS + 1))
199+
fi
200+
;;
201+
interactive)
202+
echo ""
203+
echo " This skill needs a Conductor server. Choose:"
204+
echo " 1) I have a server — I'll provide the URL"
205+
echo " 2) Start a local one for me (downloads ~600MB on first run)"
206+
echo " 3) Skip for now (you'll set it up later)"
207+
printf " Choice [1/2/3]: "
208+
read -r conductor_choice
209+
case "$conductor_choice" in
210+
1)
211+
printf " Server URL (default: http://localhost:8080/api): "
212+
read -r user_url
213+
user_url="${user_url:-http://localhost:8080/api}"
214+
if server_reachable "$user_url"; then
215+
ok "Reachable. Export this in your shell:"
216+
echo ""
217+
echo " export CONDUCTOR_SERVER_URL=\"$user_url\""
218+
echo ""
219+
info "Then re-run: $0"
220+
CONDUCTOR_SET=true
221+
else
222+
fail "Couldn't reach $user_url/health"
223+
info "Check the URL and your network, then re-run."
224+
HARD_FAILS=$((HARD_FAILS + 1))
225+
fi
226+
;;
227+
2)
228+
if start_local_conductor; then
229+
CONDUCTOR_SET=true
230+
echo ""
231+
ok "Local server running. To use it, export in your shell:"
232+
echo ""
233+
echo " export CONDUCTOR_SERVER_URL=\"$LOCAL_CONDUCTOR_URL\""
234+
echo ""
235+
info "Add the line to ~/.zshrc (or your shell's rc file) to persist."
236+
info "Stop the server later with: conductor server stop"
237+
else
238+
HARD_FAILS=$((HARD_FAILS + 1))
239+
fi
240+
;;
241+
*)
242+
warn "Skipped. Set CONDUCTOR_SERVER_URL before running the skill."
243+
HARD_FAILS=$((HARD_FAILS + 1))
244+
;;
245+
esac
246+
;;
247+
esac
129248
fi
130249

131250
# --- 4. pandoc (OPTIONAL; warn-only; auto-install offered) ---

0 commit comments

Comments
 (0)