@withone/cli 1.13.0 → 1.13.2
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/dist/index.js +120 -78
- package/package.json +1 -1
- package/skills/one-flow/SKILL.md +168 -1
package/dist/index.js
CHANGED
|
@@ -3498,7 +3498,7 @@ function getWorkflowExamples(connectedPlatforms) {
|
|
|
3498
3498
|
}
|
|
3499
3499
|
|
|
3500
3500
|
// src/commands/onboard.ts
|
|
3501
|
-
async function onboardCommand() {
|
|
3501
|
+
async function onboardCommand(step) {
|
|
3502
3502
|
if (!configExists()) {
|
|
3503
3503
|
error("Not configured. Run `one init` first.");
|
|
3504
3504
|
}
|
|
@@ -3506,30 +3506,97 @@ async function onboardCommand() {
|
|
|
3506
3506
|
if (!apiKey) {
|
|
3507
3507
|
error("No API key found. Run `one init` first.");
|
|
3508
3508
|
}
|
|
3509
|
+
const currentStep = step || 1;
|
|
3510
|
+
if (currentStep < 1 || currentStep > 3) {
|
|
3511
|
+
error("Invalid step. Use --step 1, --step 2, or --step 3.");
|
|
3512
|
+
return;
|
|
3513
|
+
}
|
|
3509
3514
|
let connections = [];
|
|
3510
|
-
|
|
3511
|
-
|
|
3512
|
-
|
|
3513
|
-
|
|
3515
|
+
if (currentStep >= 2) {
|
|
3516
|
+
try {
|
|
3517
|
+
const api = new OneApi(apiKey);
|
|
3518
|
+
connections = await api.listConnections();
|
|
3519
|
+
} catch {
|
|
3520
|
+
}
|
|
3514
3521
|
}
|
|
3515
|
-
const
|
|
3522
|
+
const result = buildStep(currentStep, connections);
|
|
3516
3523
|
if (isAgentMode()) {
|
|
3517
|
-
json(
|
|
3524
|
+
json(result);
|
|
3518
3525
|
} else {
|
|
3519
|
-
console.log(
|
|
3526
|
+
console.log(result.message);
|
|
3520
3527
|
}
|
|
3521
3528
|
}
|
|
3522
|
-
function
|
|
3529
|
+
function buildStep1() {
|
|
3530
|
+
return {
|
|
3531
|
+
step: 1,
|
|
3532
|
+
totalSteps: 3,
|
|
3533
|
+
nextCommand: "one onboard --step 2",
|
|
3534
|
+
message: `# One CLI \u2014 Agent Onboarding
|
|
3535
|
+
|
|
3536
|
+
You now have access to the One CLI. It connects you to 200+ platforms
|
|
3537
|
+
(Gmail, Slack, Stripe, Notion, etc.) \u2014 you'll learn the details shortly.
|
|
3538
|
+
|
|
3539
|
+
IMPORTANT: Your only task right now is to send the message below to the
|
|
3540
|
+
user. Do not run any other commands yet. Do not explore the CLI yet.
|
|
3541
|
+
Do not offer demos yet. Just send this message and wait for their reply:
|
|
3542
|
+
|
|
3543
|
+
---
|
|
3544
|
+
|
|
3545
|
+
I just got access to the One CLI \u2014 it connects me to your platforms like
|
|
3546
|
+
Gmail, Slack, Stripe, and 200+ others so I can work with them directly.
|
|
3547
|
+
I'll show you what I can do in a moment.
|
|
3548
|
+
|
|
3549
|
+
First, one quick setup step: right now only this conversation knows about
|
|
3550
|
+
the One CLI. If you start a new session, the agent won't remember any of
|
|
3551
|
+
this and you'd have to re-onboard from scratch. I can fix that by adding
|
|
3552
|
+
a short reference block to your project instructions file (like CLAUDE.md)
|
|
3553
|
+
so every future session automatically knows how to use your integrations.
|
|
3554
|
+
|
|
3555
|
+
It's a one-time thing and takes 10 seconds. Can I go ahead and do that?
|
|
3556
|
+
|
|
3557
|
+
---
|
|
3558
|
+
|
|
3559
|
+
After the user replies, run: one onboard --step 2`
|
|
3560
|
+
};
|
|
3561
|
+
}
|
|
3562
|
+
function buildStep2(connections) {
|
|
3523
3563
|
const sections = [];
|
|
3524
|
-
sections.push(
|
|
3564
|
+
sections.push("# One CLI \u2014 Onboarding (Step 2 of 3)");
|
|
3565
|
+
sections.push(`## Project Instructions Update
|
|
3525
3566
|
|
|
3526
|
-
|
|
3527
|
-
|
|
3528
|
-
|
|
3529
|
-
simple CLI commands.
|
|
3567
|
+
If the user agreed in Step 1, add the following to their CLAUDE.md (or
|
|
3568
|
+
.cursorrules or equivalent). If the file exists, append it. If not, create it.
|
|
3569
|
+
If they declined, skip this section.
|
|
3530
3570
|
|
|
3531
|
-
|
|
3532
|
-
|
|
3571
|
+
\`\`\`
|
|
3572
|
+
## One CLI \u2014 Platform Integrations
|
|
3573
|
+
|
|
3574
|
+
The One CLI (\`one\`) is installed and configured on this machine. It is a
|
|
3575
|
+
command-line tool that gives AI agents the ability to interact with 200+
|
|
3576
|
+
third-party platforms (Gmail, Slack, Shopify, HubSpot, Stripe, GitHub,
|
|
3577
|
+
Notion, Salesforce, etc.) through a single, unified interface.
|
|
3578
|
+
|
|
3579
|
+
**Whenever you need to interact with any third-party platform or external
|
|
3580
|
+
service, use the One CLI.** This is your primary tool for all integrations.
|
|
3581
|
+
|
|
3582
|
+
### IMPORTANT: Always use the --agent flag
|
|
3583
|
+
The \`--agent\` flag gives structured JSON output. Always include it right
|
|
3584
|
+
after \`one\`:
|
|
3585
|
+
one --agent <command>
|
|
3586
|
+
|
|
3587
|
+
### Quick reference:
|
|
3588
|
+
- \`one --agent list\` \u2014 See connected platforms and connection keys
|
|
3589
|
+
- \`one --agent actions search <platform> "<query>"\` \u2014 Find actions
|
|
3590
|
+
- \`one --agent actions knowledge <platform> <actionId>\` \u2014 Read docs (REQUIRED before execute)
|
|
3591
|
+
- \`one --agent actions execute <platform> <actionId> <connectionKey>\` \u2014 Execute action
|
|
3592
|
+
- \`one --agent flow create\` \u2014 Build multi-step workflows
|
|
3593
|
+
- \`one --agent guide\` \u2014 Full documentation
|
|
3594
|
+
- \`one add <platform>\` \u2014 Connect a new platform (interactive, no --agent)
|
|
3595
|
+
|
|
3596
|
+
### Workflow: search -> knowledge -> execute
|
|
3597
|
+
Always read the knowledge before executing. It tells you required parameters,
|
|
3598
|
+
validation rules, and platform-specific details.
|
|
3599
|
+
\`\`\``);
|
|
3533
3600
|
sections.push(buildCurrentState(connections));
|
|
3534
3601
|
sections.push(`## How To Use the CLI
|
|
3535
3602
|
|
|
@@ -3555,17 +3622,48 @@ Use \`one flow create\` to build JSON workflows that chain actions across
|
|
|
3555
3622
|
platforms with conditions, loops, parallel execution, and transforms.
|
|
3556
3623
|
|
|
3557
3624
|
Run \`one --agent guide\` for the complete reference documentation with examples.`);
|
|
3625
|
+
sections.push(`## What to tell the user
|
|
3626
|
+
|
|
3627
|
+
Now present what you can do. Tell the user which platforms are connected
|
|
3628
|
+
and offer to do something useful right away.`);
|
|
3629
|
+
sections.push("## Next step\n\nRun `one onboard --step 3` to see demo actions and workflow ideas.");
|
|
3630
|
+
return {
|
|
3631
|
+
step: 2,
|
|
3632
|
+
totalSteps: 3,
|
|
3633
|
+
nextCommand: "one onboard --step 3",
|
|
3634
|
+
message: sections.join("\n\n")
|
|
3635
|
+
};
|
|
3636
|
+
}
|
|
3637
|
+
function buildStep3(connections) {
|
|
3638
|
+
const sections = [];
|
|
3639
|
+
sections.push("# One CLI \u2014 Onboarding (Step 3 of 3)");
|
|
3558
3640
|
sections.push(buildDemoActions(connections));
|
|
3559
3641
|
sections.push(buildWorkflowIdeas(connections));
|
|
3560
|
-
sections.push(buildUserScript(connections));
|
|
3561
|
-
sections.push(buildClaudeMdSuggestion());
|
|
3562
3642
|
sections.push(`## All Available Platforms
|
|
3563
3643
|
|
|
3564
3644
|
The user can connect any of these popular platforms:
|
|
3565
3645
|
Gmail, Google Calendar, Slack, Notion, Shopify, Stripe, HubSpot, GitHub,
|
|
3566
3646
|
Salesforce, QuickBooks, Asana, Jira, Linear, Intercom, Zendesk, Twilio,
|
|
3567
3647
|
and 200+ more. Run \`one platforms\` for the full list.`);
|
|
3568
|
-
|
|
3648
|
+
sections.push("## Onboarding complete!\n\nYou're all set. Use `one --agent guide` any time you need the full reference.");
|
|
3649
|
+
return {
|
|
3650
|
+
step: 3,
|
|
3651
|
+
totalSteps: 3,
|
|
3652
|
+
nextCommand: "one --agent guide",
|
|
3653
|
+
message: sections.join("\n\n")
|
|
3654
|
+
};
|
|
3655
|
+
}
|
|
3656
|
+
function buildStep(step, connections) {
|
|
3657
|
+
switch (step) {
|
|
3658
|
+
case 1:
|
|
3659
|
+
return buildStep1();
|
|
3660
|
+
case 2:
|
|
3661
|
+
return buildStep2(connections);
|
|
3662
|
+
case 3:
|
|
3663
|
+
return buildStep3(connections);
|
|
3664
|
+
default:
|
|
3665
|
+
return buildStep1();
|
|
3666
|
+
}
|
|
3569
3667
|
}
|
|
3570
3668
|
function buildCurrentState(connections) {
|
|
3571
3669
|
if (connections.length === 0) {
|
|
@@ -3594,7 +3692,7 @@ You have ${connections.length} platform(s) connected:
|
|
|
3594
3692
|
function buildDemoActions(connections) {
|
|
3595
3693
|
const lines = ["## Suggested Demo Actions"];
|
|
3596
3694
|
lines.push("");
|
|
3597
|
-
lines.push("
|
|
3695
|
+
lines.push("Try these to prove it works:");
|
|
3598
3696
|
const connectedPlatforms = connections.map((c) => c.platform.toLowerCase());
|
|
3599
3697
|
const popularPlatforms = ["gmail", "google-calendar", "slack", "shopify", "hub-spot", "github"];
|
|
3600
3698
|
const platformsToShow = [
|
|
@@ -3634,62 +3732,6 @@ function buildWorkflowIdeas(connections) {
|
|
|
3634
3732
|
lines.push("These can be built as reusable workflows with `one flow create`.");
|
|
3635
3733
|
return lines.join("\n");
|
|
3636
3734
|
}
|
|
3637
|
-
function buildUserScript(connections) {
|
|
3638
|
-
const hasConnections = connections.length > 0;
|
|
3639
|
-
const lines = ["## What To Tell The User"];
|
|
3640
|
-
lines.push("");
|
|
3641
|
-
lines.push("Present the One CLI to the user with enthusiasm. Here's what to communicate:");
|
|
3642
|
-
lines.push("");
|
|
3643
|
-
lines.push('1. "I just learned about the One CLI \u2014 it gives me the ability to work with');
|
|
3644
|
-
lines.push(" your connected platforms directly. I can read and send emails, manage your");
|
|
3645
|
-
lines.push(' calendar, interact with your CRM, and much more across 200+ platforms."');
|
|
3646
|
-
lines.push("");
|
|
3647
|
-
if (hasConnections) {
|
|
3648
|
-
lines.push("2. Offer a quick win \u2014 do something useful with what's already connected:");
|
|
3649
|
-
lines.push(' "Want me to check your calendar for today?" or "I can search your recent');
|
|
3650
|
-
lines.push(' emails for anything important."');
|
|
3651
|
-
} else {
|
|
3652
|
-
lines.push("2. Suggest connecting platforms the user likely uses:");
|
|
3653
|
-
lines.push(' "Want to connect Gmail, Slack, or any other tool? Just run `one add <platform>`');
|
|
3654
|
-
lines.push(` and I'll be able to help you with it immediately."`);
|
|
3655
|
-
}
|
|
3656
|
-
lines.push("");
|
|
3657
|
-
lines.push("3. Suggest updating their project memory so you always know about One:");
|
|
3658
|
-
lines.push(' "To make sure I always have access to the One CLI in future conversations,');
|
|
3659
|
-
lines.push(' you could add a note to your CLAUDE.md."');
|
|
3660
|
-
return lines.join("\n");
|
|
3661
|
-
}
|
|
3662
|
-
function buildClaudeMdSuggestion() {
|
|
3663
|
-
return `## Suggested CLAUDE.md Addition
|
|
3664
|
-
|
|
3665
|
-
Suggest the user add this to their CLAUDE.md or project instructions:
|
|
3666
|
-
|
|
3667
|
-
---
|
|
3668
|
-
## One CLI \u2014 Platform Integrations
|
|
3669
|
-
|
|
3670
|
-
This project has the One CLI configured. It connects AI agents to 200+
|
|
3671
|
-
platforms (Gmail, Slack, Shopify, HubSpot, Stripe, etc.) through a single
|
|
3672
|
-
interface.
|
|
3673
|
-
|
|
3674
|
-
### IMPORTANT: Always use the --agent flag
|
|
3675
|
-
The \`--agent\` flag gives structured JSON output. Always include it right
|
|
3676
|
-
after \`one\`:
|
|
3677
|
-
one --agent <command>
|
|
3678
|
-
|
|
3679
|
-
### Quick reference:
|
|
3680
|
-
- \`one --agent list\` \u2014 See connected platforms and connection keys
|
|
3681
|
-
- \`one --agent actions search <platform> "<query>"\` \u2014 Find actions
|
|
3682
|
-
- \`one --agent actions knowledge <platform> <actionId>\` \u2014 Read docs (REQUIRED before execute)
|
|
3683
|
-
- \`one --agent actions execute <platform> <actionId> <connectionKey>\` \u2014 Execute action
|
|
3684
|
-
- \`one --agent flow create\` \u2014 Build multi-step workflows
|
|
3685
|
-
- \`one --agent guide\` \u2014 Full documentation
|
|
3686
|
-
- \`one add <platform>\` \u2014 Connect a new platform (interactive, no --agent)
|
|
3687
|
-
|
|
3688
|
-
### Workflow: search -> knowledge -> execute
|
|
3689
|
-
Always read the knowledge before executing. It tells you required parameters,
|
|
3690
|
-
validation rules, and platform-specific details.
|
|
3691
|
-
---`;
|
|
3692
|
-
}
|
|
3693
3735
|
|
|
3694
3736
|
// src/commands/update.ts
|
|
3695
3737
|
import { createRequire } from "module";
|
|
@@ -3901,8 +3943,8 @@ flow.command("runs [flowKey]").description("List workflow runs (optionally filte
|
|
|
3901
3943
|
program.command("guide [topic]").description("Full CLI usage guide for agents (topics: overview, actions, flows, all)").action(async (topic) => {
|
|
3902
3944
|
await guideCommand(topic);
|
|
3903
3945
|
});
|
|
3904
|
-
program.command("onboard").description("Agent onboarding \u2014 teaches your agent what the One CLI can do").action(async () => {
|
|
3905
|
-
await onboardCommand();
|
|
3946
|
+
program.command("onboard").description("Agent onboarding \u2014 teaches your agent what the One CLI can do").option("--step <number>", "Run a specific onboarding step (1, 2, or 3)").action(async (options) => {
|
|
3947
|
+
await onboardCommand(options.step ? parseInt(options.step, 10) : void 0);
|
|
3906
3948
|
});
|
|
3907
3949
|
program.command("update").description("Update the One CLI to the latest version").action(async () => {
|
|
3908
3950
|
await updateCommand();
|
package/package.json
CHANGED
package/skills/one-flow/SKILL.md
CHANGED
|
@@ -32,6 +32,22 @@ You have access to the One CLI's workflow engine, which lets you create and exec
|
|
|
32
32
|
|
|
33
33
|
**You MUST follow this process to build a correct workflow:**
|
|
34
34
|
|
|
35
|
+
### Step 0: Design the workflow
|
|
36
|
+
|
|
37
|
+
Before touching any CLI commands, understand what you are building:
|
|
38
|
+
|
|
39
|
+
1. **Clarify the end goal.** What output does the user actually need? A report? A notification? An enriched dataset? Do not assume — ask if unclear.
|
|
40
|
+
2. **Map the full value chain.** List every step required to deliver that output at production quality. Fetching raw data is never the final step — ask yourself: "If I handed this raw API response to the user, would they be satisfied?" If no, you need analysis or enrichment steps.
|
|
41
|
+
3. **Identify where AI analysis is needed.** Any time raw data needs summarization, scoring, classification, comparison, or natural-language generation, plan a `bash` step using `claude --print`. See the AI-Augmented Patterns section below.
|
|
42
|
+
4. **Write the step sequence as a plain list** before constructing JSON. Example:
|
|
43
|
+
- Fetch competitor pricing from API
|
|
44
|
+
- Write data to temp file
|
|
45
|
+
- Claude analyzes competitive positioning (bash step)
|
|
46
|
+
- Parse Claude's JSON output (code step)
|
|
47
|
+
- Send formatted report via email
|
|
48
|
+
|
|
49
|
+
**Common mistake:** Jumping straight to `one actions search` and building a workflow that only fetches and pipes raw data. The result is a shallow data dump, not a useful workflow. Always design first.
|
|
50
|
+
|
|
35
51
|
### Step 1: Discover connections
|
|
36
52
|
|
|
37
53
|
```bash
|
|
@@ -693,7 +709,158 @@ To modify an existing workflow:
|
|
|
693
709
|
}
|
|
694
710
|
```
|
|
695
711
|
|
|
696
|
-
|
|
712
|
+
### Example 4: AI-Augmented — Fetch CRM data, analyze with Claude, email report
|
|
713
|
+
|
|
714
|
+
This example demonstrates the **file-write → bash → code** pattern. Instead of just piping raw data, it uses Claude to perform competitive analysis and delivers an actionable report.
|
|
715
|
+
|
|
716
|
+
```json
|
|
717
|
+
{
|
|
718
|
+
"key": "competitor-analysis",
|
|
719
|
+
"name": "AI Competitor Analysis",
|
|
720
|
+
"description": "Fetch deals from HubSpot, analyze competitive landscape with Claude, email the report",
|
|
721
|
+
"version": "1",
|
|
722
|
+
"inputs": {
|
|
723
|
+
"hubspotConnectionKey": {
|
|
724
|
+
"type": "string",
|
|
725
|
+
"required": true,
|
|
726
|
+
"connection": { "platform": "hub-spot" }
|
|
727
|
+
},
|
|
728
|
+
"gmailConnectionKey": {
|
|
729
|
+
"type": "string",
|
|
730
|
+
"required": true,
|
|
731
|
+
"connection": { "platform": "gmail" }
|
|
732
|
+
},
|
|
733
|
+
"reportEmail": {
|
|
734
|
+
"type": "string",
|
|
735
|
+
"required": true,
|
|
736
|
+
"description": "Email address to send the analysis report to"
|
|
737
|
+
}
|
|
738
|
+
},
|
|
739
|
+
"steps": [
|
|
740
|
+
{
|
|
741
|
+
"id": "fetchDeals",
|
|
742
|
+
"name": "Fetch recent deals from HubSpot",
|
|
743
|
+
"type": "action",
|
|
744
|
+
"action": {
|
|
745
|
+
"platform": "hub-spot",
|
|
746
|
+
"actionId": "HUBSPOT_LIST_DEALS_ACTION_ID",
|
|
747
|
+
"connectionKey": "$.input.hubspotConnectionKey",
|
|
748
|
+
"queryParams": { "limit": "100" }
|
|
749
|
+
}
|
|
750
|
+
},
|
|
751
|
+
{
|
|
752
|
+
"id": "writeDeals",
|
|
753
|
+
"name": "Write deals data for Claude analysis",
|
|
754
|
+
"type": "file-write",
|
|
755
|
+
"fileWrite": {
|
|
756
|
+
"path": "/tmp/competitor-analysis-deals.json",
|
|
757
|
+
"content": "$.steps.fetchDeals.response"
|
|
758
|
+
}
|
|
759
|
+
},
|
|
760
|
+
{
|
|
761
|
+
"id": "analyzeCompetitors",
|
|
762
|
+
"name": "Claude analyzes competitive landscape",
|
|
763
|
+
"type": "bash",
|
|
764
|
+
"bash": {
|
|
765
|
+
"command": "cat /tmp/competitor-analysis-deals.json | claude --print 'You are a competitive intelligence analyst. Analyze these CRM deals and return a JSON object with: {\"totalDeals\": number, \"competitorMentions\": [{\"competitor\": \"name\", \"count\": number, \"winRate\": number, \"commonObjections\": [\"...\"]}], \"summary\": \"2-3 paragraph executive summary\", \"recommendations\": [\"actionable items\"]}. Return ONLY valid JSON.' --output-format json",
|
|
766
|
+
"timeout": 120000,
|
|
767
|
+
"parseJson": true
|
|
768
|
+
}
|
|
769
|
+
},
|
|
770
|
+
{
|
|
771
|
+
"id": "formatReport",
|
|
772
|
+
"name": "Format analysis into email body",
|
|
773
|
+
"type": "code",
|
|
774
|
+
"code": {
|
|
775
|
+
"source": "const a = $.steps.analyzeCompetitors.output;\nconst competitors = a.competitorMentions.map(c => `- ${c.competitor}: ${c.count} mentions, ${c.winRate}% win rate. Objections: ${c.commonObjections.join(', ')}`).join('\\n');\nreturn {\n subject: `Competitive Analysis — ${a.totalDeals} deals analyzed`,\n body: `${a.summary}\\n\\nCompetitor Breakdown:\\n${competitors}\\n\\nRecommendations:\\n${a.recommendations.map((r, i) => `${i+1}. ${r}`).join('\\n')}`\n};"
|
|
776
|
+
}
|
|
777
|
+
},
|
|
778
|
+
{
|
|
779
|
+
"id": "sendReport",
|
|
780
|
+
"name": "Email the analysis report",
|
|
781
|
+
"type": "action",
|
|
782
|
+
"action": {
|
|
783
|
+
"platform": "gmail",
|
|
784
|
+
"actionId": "GMAIL_SEND_EMAIL_ACTION_ID",
|
|
785
|
+
"connectionKey": "$.input.gmailConnectionKey",
|
|
786
|
+
"data": {
|
|
787
|
+
"to": "{{$.input.reportEmail}}",
|
|
788
|
+
"subject": "{{$.steps.formatReport.output.subject}}",
|
|
789
|
+
"body": "{{$.steps.formatReport.output.body}}"
|
|
790
|
+
}
|
|
791
|
+
}
|
|
792
|
+
}
|
|
793
|
+
]
|
|
794
|
+
}
|
|
795
|
+
```
|
|
796
|
+
|
|
797
|
+
Execute with:
|
|
798
|
+
```bash
|
|
799
|
+
one --agent flow execute competitor-analysis --allow-bash -i reportEmail=team@company.com
|
|
800
|
+
```
|
|
801
|
+
|
|
802
|
+
## 9. AI-Augmented Workflow Patterns
|
|
803
|
+
|
|
804
|
+
Use this pattern whenever raw API data needs analysis, summarization, scoring, classification, or natural-language generation. This is the difference between a shallow data pipe and a workflow that delivers real value.
|
|
805
|
+
|
|
806
|
+
### The file-write → bash → code pattern
|
|
807
|
+
|
|
808
|
+
**Step A: `file-write`** — Write raw data to a temp file. API responses are often too large to inline into a shell command.
|
|
809
|
+
|
|
810
|
+
```json
|
|
811
|
+
{
|
|
812
|
+
"id": "writeData",
|
|
813
|
+
"name": "Write raw data for analysis",
|
|
814
|
+
"type": "file-write",
|
|
815
|
+
"fileWrite": {
|
|
816
|
+
"path": "/tmp/{{$.input.flowKey}}-data.json",
|
|
817
|
+
"content": "$.steps.fetchData.response"
|
|
818
|
+
}
|
|
819
|
+
}
|
|
820
|
+
```
|
|
821
|
+
|
|
822
|
+
**Step B: `bash`** — Call `claude --print` to analyze the data. This is where intelligence happens.
|
|
823
|
+
|
|
824
|
+
```json
|
|
825
|
+
{
|
|
826
|
+
"id": "analyze",
|
|
827
|
+
"name": "AI analysis",
|
|
828
|
+
"type": "bash",
|
|
829
|
+
"bash": {
|
|
830
|
+
"command": "cat /tmp/{{$.input.flowKey}}-data.json | claude --print 'You are a [domain] analyst. Analyze this data and return JSON with: {\"summary\": \"...\", \"insights\": [...], \"score\": 0-100, \"recommendations\": [...]}. Return ONLY valid JSON, no markdown.' --output-format json",
|
|
831
|
+
"timeout": 120000,
|
|
832
|
+
"parseJson": true
|
|
833
|
+
}
|
|
834
|
+
}
|
|
835
|
+
```
|
|
836
|
+
|
|
837
|
+
**Step C: `code`** — Parse and structure the AI output for downstream steps.
|
|
838
|
+
|
|
839
|
+
```json
|
|
840
|
+
{
|
|
841
|
+
"id": "formatResult",
|
|
842
|
+
"name": "Structure analysis for output",
|
|
843
|
+
"type": "code",
|
|
844
|
+
"code": {
|
|
845
|
+
"source": "const analysis = $.steps.analyze.output;\nreturn {\n report: `Summary: ${analysis.summary}\\n\\nInsights:\\n${analysis.insights.map((insight, i) => `${i+1}. ${insight}`).join('\\n')}`,\n score: analysis.score\n};"
|
|
846
|
+
}
|
|
847
|
+
}
|
|
848
|
+
```
|
|
849
|
+
|
|
850
|
+
### When to use this pattern
|
|
851
|
+
|
|
852
|
+
- **Use it** when the user expects analysis, not raw data (e.g., "analyze my competitors", "qualify these leads", "summarize these reviews")
|
|
853
|
+
- **Use it** when data from one API needs intelligent transformation before being sent to another (e.g., generating a personalized email based on CRM data)
|
|
854
|
+
- **Don't use it** for simple field mapping or filtering — use `transform` or `code` steps instead
|
|
855
|
+
|
|
856
|
+
### Prompt engineering tips for bash steps
|
|
857
|
+
|
|
858
|
+
- **Request JSON output** so downstream code steps can parse it — include `Return ONLY valid JSON, no markdown.` in the prompt and use `--output-format json`
|
|
859
|
+
- **Be specific about the analysis** — "Score each lead 0-100 based on company size, role seniority, and engagement recency" beats "analyze these leads"
|
|
860
|
+
- **Include domain context** — "You are a B2B sales analyst" produces better results than a generic prompt
|
|
861
|
+
- **Keep prompts focused** — one analysis task per bash step; chain multiple bash steps for multi-stage analysis
|
|
862
|
+
|
|
863
|
+
## 10. CLI Commands Reference
|
|
697
864
|
|
|
698
865
|
```bash
|
|
699
866
|
# Create a workflow
|