@feastalytics/cli 0.1.17 → 0.1.18
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 +11 -2
- package/dist/cli.js +0 -83
- package/package.json +6 -3
- package/{feast → skills/feast}/SKILL.md +3 -3
- package/{feast → skills/feast}/references/workflows/creators.md +2 -0
- package/{feast → skills/feast}/references/workflows/onboarding.md +2 -2
- /package/{feast → skills/feast}/references/domains.md +0 -0
- /package/{feast → skills/feast}/references/links.md +0 -0
- /package/{feast → skills/feast}/references/setup.md +0 -0
- /package/{feast → skills/feast}/references/workflows/ad-copy-creator.md +0 -0
- /package/{feast → skills/feast}/references/workflows/ad-copy-guest.md +0 -0
- /package/{feast → skills/feast}/references/workflows/ads.md +0 -0
- /package/{feast → skills/feast}/references/workflows/automations.md +0 -0
- /package/{feast → skills/feast}/references/workflows/campaigns.md +0 -0
- /package/{feast → skills/feast}/references/workflows/funnels.md +0 -0
- /package/{feast → skills/feast}/references/workflows/guests.md +0 -0
- /package/{feast → skills/feast}/references/workflows/members-program.md +0 -0
package/README.md
CHANGED
|
@@ -6,6 +6,15 @@ Ships with an [agent skill](#agent-skill) so Claude Code, Codex, and other agent
|
|
|
6
6
|
|
|
7
7
|
## Install
|
|
8
8
|
|
|
9
|
+
Feastalytics ships as a plugin (the `feast` skill plus the hosted MCP server at `https://mcp.feast-api.com/mcp`), as a standalone skill, and as this CLI. The MCP server signs you in with OAuth the first time you connect; there is no client id or API key to enter.
|
|
10
|
+
|
|
11
|
+
- **Claude Code**: `/plugin marketplace add feastalytics/cli`, then `/plugin install feastalytics@feast`.
|
|
12
|
+
- **claude.ai and Claude Desktop**: add a custom connector with the URL `https://mcp.feast-api.com/mcp`. A directory listing is to follow.
|
|
13
|
+
- **ChatGPT**: `npm run build:chatgpt` writes `dist/feastalytics-chatgpt.zip` (the root `plugin.json`, `mcp.json` and `skills/`).
|
|
14
|
+
- **Skill only** (Claude Code, Codex, Cursor and other agents): `npx skills add feastalytics/cli`.
|
|
15
|
+
|
|
16
|
+
### CLI
|
|
17
|
+
|
|
9
18
|
```bash
|
|
10
19
|
npm install -g @feastalytics/cli
|
|
11
20
|
```
|
|
@@ -66,7 +75,7 @@ Mutations additionally require `--org` and print the server-resolved org before
|
|
|
66
75
|
|
|
67
76
|
## Agent skill
|
|
68
77
|
|
|
69
|
-
The `feast/` directory is an [agent skill](https://www.skills.sh) that teaches an agent to operate Feastalytics through its tools, either this CLI or the hosted MCP server at `https://mcp.feast-api.com/mcp` (same tools, same names). Install it into your agent(s):
|
|
78
|
+
The `skills/feast/` directory is an [agent skill](https://www.skills.sh) that teaches an agent to operate Feastalytics through its tools, either this CLI or the hosted MCP server at `https://mcp.feast-api.com/mcp` (same tools, same names). Install it into your agent(s):
|
|
70
79
|
|
|
71
80
|
```bash
|
|
72
81
|
npx skills add feastalytics/cli
|
|
@@ -86,7 +95,7 @@ npx skills add feastalytics/cli -g -a '*' -y
|
|
|
86
95
|
- `-a '*'` re-links **all** agents (Claude Code, Codex, …) so each picks up the new version.
|
|
87
96
|
- `-y` skips the confirmation prompts.
|
|
88
97
|
|
|
89
|
-
To refresh from a local checkout instead of GitHub, run `npx skills add
|
|
98
|
+
To refresh from a local checkout instead of GitHub, run `npx skills add . -g -a '*' -y` from the repo root.
|
|
90
99
|
|
|
91
100
|
### Playbook skills from Feastalytics
|
|
92
101
|
|
package/dist/cli.js
CHANGED
|
@@ -15545,30 +15545,6 @@ var CLI_MANIFEST = {
|
|
|
15545
15545
|
"$schema": "http://json-schema.org/draft-07/schema#"
|
|
15546
15546
|
}
|
|
15547
15547
|
},
|
|
15548
|
-
{
|
|
15549
|
-
"id": "purchaseAndConfigurePhoneNumber",
|
|
15550
|
-
"domain": "core",
|
|
15551
|
-
"description": "Buys a real number from Twilio for the organization and bills the account. Nothing here undoes that. Pick a number geographically close to the restaurant: guests answer a local area code and read a distant one as spam, so search by the restaurant's own postal code or coordinates, never a guessed area code. If you don't know where the restaurant is, establish it first from its POS location, its Google Place, or by asking. Don't buy until you do.",
|
|
15552
|
-
"type": "mutation",
|
|
15553
|
-
"path": [
|
|
15554
|
-
"api",
|
|
15555
|
-
"onboarding",
|
|
15556
|
-
"purchaseAndConfigurePhoneNumber"
|
|
15557
|
-
],
|
|
15558
|
-
"inputJsonSchema": {
|
|
15559
|
-
"type": "object",
|
|
15560
|
-
"properties": {
|
|
15561
|
-
"phoneNumber": {
|
|
15562
|
-
"type": "string"
|
|
15563
|
-
}
|
|
15564
|
-
},
|
|
15565
|
-
"required": [
|
|
15566
|
-
"phoneNumber"
|
|
15567
|
-
],
|
|
15568
|
-
"additionalProperties": false,
|
|
15569
|
-
"$schema": "http://json-schema.org/draft-07/schema#"
|
|
15570
|
-
}
|
|
15571
|
-
},
|
|
15572
15548
|
{
|
|
15573
15549
|
"id": "queryData",
|
|
15574
15550
|
"domain": "data",
|
|
@@ -15783,62 +15759,6 @@ var CLI_MANIFEST = {
|
|
|
15783
15759
|
"$schema": "http://json-schema.org/draft-07/schema#"
|
|
15784
15760
|
}
|
|
15785
15761
|
},
|
|
15786
|
-
{
|
|
15787
|
-
"id": "searchAvailablePhoneNumbers",
|
|
15788
|
-
"domain": "core",
|
|
15789
|
-
"description": "Lists Twilio numbers available to buy for texting guests. Free and read-only. Search by the restaurant's own postal code or latitude/longitude: proximity matters, and a guessed area code lands a number in the wrong town.",
|
|
15790
|
-
"type": "query",
|
|
15791
|
-
"path": [
|
|
15792
|
-
"api",
|
|
15793
|
-
"onboarding",
|
|
15794
|
-
"searchAvailablePhoneNumbers"
|
|
15795
|
-
],
|
|
15796
|
-
"inputJsonSchema": {
|
|
15797
|
-
"anyOf": [
|
|
15798
|
-
{
|
|
15799
|
-
"type": "object",
|
|
15800
|
-
"properties": {
|
|
15801
|
-
"areaCode": {
|
|
15802
|
-
"type": "string"
|
|
15803
|
-
}
|
|
15804
|
-
},
|
|
15805
|
-
"required": [
|
|
15806
|
-
"areaCode"
|
|
15807
|
-
],
|
|
15808
|
-
"additionalProperties": false
|
|
15809
|
-
},
|
|
15810
|
-
{
|
|
15811
|
-
"type": "object",
|
|
15812
|
-
"properties": {
|
|
15813
|
-
"postalCode": {
|
|
15814
|
-
"type": "string"
|
|
15815
|
-
}
|
|
15816
|
-
},
|
|
15817
|
-
"required": [
|
|
15818
|
-
"postalCode"
|
|
15819
|
-
],
|
|
15820
|
-
"additionalProperties": false
|
|
15821
|
-
},
|
|
15822
|
-
{
|
|
15823
|
-
"type": "object",
|
|
15824
|
-
"properties": {
|
|
15825
|
-
"latitude": {
|
|
15826
|
-
"type": "number"
|
|
15827
|
-
},
|
|
15828
|
-
"longitude": {
|
|
15829
|
-
"type": "number"
|
|
15830
|
-
}
|
|
15831
|
-
},
|
|
15832
|
-
"required": [
|
|
15833
|
-
"latitude",
|
|
15834
|
-
"longitude"
|
|
15835
|
-
],
|
|
15836
|
-
"additionalProperties": false
|
|
15837
|
-
}
|
|
15838
|
-
],
|
|
15839
|
-
"$schema": "http://json-schema.org/draft-07/schema#"
|
|
15840
|
-
}
|
|
15841
|
-
},
|
|
15842
15762
|
{
|
|
15843
15763
|
"id": "searchGooglePlaces",
|
|
15844
15764
|
"domain": "core",
|
|
@@ -23914,9 +23834,6 @@ var CLI_MANIFEST = {
|
|
|
23914
23834
|
"completionStatus": {
|
|
23915
23835
|
"type": "object",
|
|
23916
23836
|
"properties": {
|
|
23917
|
-
"preProductOnboardingComplete": {
|
|
23918
|
-
"type": "boolean"
|
|
23919
|
-
},
|
|
23920
23837
|
"postProductOnboardingComplete": {
|
|
23921
23838
|
"type": "boolean"
|
|
23922
23839
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@feastalytics/cli",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.18",
|
|
4
4
|
"description": "Command-line client for the Feastalytics platform — list, create, and update campaigns, automations, offers, and members-program rewards from the terminal.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -8,7 +8,8 @@
|
|
|
8
8
|
},
|
|
9
9
|
"files": [
|
|
10
10
|
"dist",
|
|
11
|
-
"
|
|
11
|
+
"!dist/*.zip",
|
|
12
|
+
"skills"
|
|
12
13
|
],
|
|
13
14
|
"author": "Feastalytics",
|
|
14
15
|
"license": "UNLICENSED",
|
|
@@ -28,7 +29,9 @@
|
|
|
28
29
|
"dev": "tsx src/cli.ts",
|
|
29
30
|
"feast": "tsx src/cli.ts",
|
|
30
31
|
"typecheck": "tsc --noEmit",
|
|
31
|
-
"prepublishOnly": "npm run build"
|
|
32
|
+
"prepublishOnly": "npm run build",
|
|
33
|
+
"version": "node scripts/sync-plugin-version.mjs && git add .claude-plugin/plugin.json plugin.json",
|
|
34
|
+
"build:chatgpt": "sh scripts/build-chatgpt-zip.sh"
|
|
32
35
|
},
|
|
33
36
|
"devDependencies": {
|
|
34
37
|
"@trpc/client": "^10.45.2",
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: feast
|
|
3
|
-
description:
|
|
3
|
+
description: >-
|
|
4
|
+
Operate a Feastalytics organization (campaigns, automations, funnels, members-program rewards, the wallet pass, creator sourcing, Meta ads, texting, onboarding, and read-only data queries) through the Feastalytics tools, either the `feast` CLI or the Feastalytics MCP server. Use this skill whenever the user wants to inspect or change Feastalytics data outside the dashboard: "list my campaigns", "create an automation for org X", "approve this creator", "publish the recruitment ad", "text this guest back", "query my guests", "update the members program", or any request to script, batch or automate Feastalytics operations. Reach for it even when the user doesn't name the CLI or the MCP server: if the task is reading or changing Feastalytics data, these are the tools.
|
|
4
5
|
---
|
|
5
6
|
|
|
6
7
|
# Feast
|
|
@@ -53,10 +54,9 @@ That last point matters most for the tools that reach the real world rather than
|
|
|
53
54
|
|
|
54
55
|
- `sendText` texts a guest or creator immediately, one person per call, with no scheduling and no undo.
|
|
55
56
|
- Approving or denying a creator visit (`updateCreatorVisit`) or deciding a submission (`decideCreatorSubmission`) texts that person. `updateCreatorVisit` can preview its texts with `dryRun: true` or skip them with `sideEffects: false`; `decideCreatorSubmission` can skip its text with `skipApprovalText`.
|
|
56
|
-
- Paying a creator's bonus (`createInfluencerPayout
|
|
57
|
+
- Paying a creator's bonus (`createInfluencerPayout`, on the CLI) charges the organization's card. Over the MCP server that tool is not available, so the client pays bonuses in the dashboard.
|
|
57
58
|
- `awardReward` puts a real reward in a member's wallet pass, and a retried call grants a second one.
|
|
58
59
|
- `inviteUser` sends a real email.
|
|
59
|
-
- Buying a phone number bills the account.
|
|
60
60
|
- Publishing a campaign puts it live, and pricing a recurring promotion creates real Stripe products.
|
|
61
61
|
- Activating a Meta campaign spends real ad budget.
|
|
62
62
|
- Saving automation edits changes what guests receive.
|
|
@@ -73,6 +73,8 @@ The ads that bring applicants in are tool-drivable end to end:
|
|
|
73
73
|
|
|
74
74
|
### Paying the bonus
|
|
75
75
|
|
|
76
|
+
Over the MCP server `createInfluencerPayout` is not available: the client pays creator bonuses in the dashboard, so point them there. On the CLI it remains available, as follows.
|
|
77
|
+
|
|
76
78
|
`createInfluencerPayout` with `{ "eventId": "..." }` charges the organization's card and starts the creator's bonus on its way. **Never call it on your own initiative**: every call needs the client's explicit, fresh approval to pay this specific creator; a standing instruction doesn't count. The endpoint enforces its own preconditions (a submission approved with `approvalType: "ad"`, no payout already active for the visit: one per visit). The amount defaults to the bonus stamped on the submission when it was approved (falling back to the board config), grossed up to cover the Stripe fee; pass `amountCents` only when the client explicitly asks to pay this one creator a different amount. It applies to this payout only, is written back to the submission so reporting matches what was paid, and leaves the board config unchanged. A visit whose only attempts are FAILED or REFUNDED may be retried, which voids the earlier attempt's open invoice first. After the charge, Stripe webhooks carry it to the creator with no further action from you. Follow progress in `queryData` `creators.creatorPayout`, joined to the visit on `visitEventId`.
|
|
77
79
|
|
|
78
80
|
### Reimbursing boards
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
`getTaskboard` is the single "what needs fixing or finishing" surface: one `entries` list discriminated by `kind`. `task` entries are the org's onboarding tasks; `issue` entries are live-computed misconfigurations (placeholder content, inactive automations, a missing "Text STOP" opt-out, unawarded rewards, wallet pass and pixel problems), each with a `severity`, a human `message` and a `fixHint`. Funnel checks cover only screens reachable from the funnel's start screen, so an orphaned screen raises no issue. Scope with `{"scope":{"type":"onboarding"}}` for tasks only, `{"type":"task","task":{"taskId":"..."}}` for one task, or leave the default `all`.
|
|
6
6
|
|
|
7
7
|
- **Start from `completionInstructions`, not guesswork.** Every task entry says exactly what completes it and whether it needs a human in a browser. Trust it over inferring from the task name.
|
|
8
|
-
- **Split the work accordingly.** Campaigns, automations, funnel fixes, rewards, brand identity,
|
|
8
|
+
- **Split the work accordingly.** Campaigns, automations, funnel fixes, rewards, brand identity, image uploads and the onboarding form are all completable through the tools, so do them. Tasks that need OAuth (Facebook, POS), physical device setup, or in-restaurant staff training cannot be: hand the user that task's **`completionUrl`**, a page where they complete exactly that task. Paste the URL directly in your reply so the user can open it.
|
|
9
9
|
- **Never claim a task complete or try to mark one.** Statuses are derived from live data by a recompute (triggered by every taskboard read, ~30s lag). Do the underlying work, then re-read the taskboard to confirm the checkmark flipped.
|
|
10
10
|
- Working through onboarding = repeat: `getTaskboard` (scope `onboarding`) → do the tool-doable incomplete required tasks → hand over completionUrls for the rest → re-read to verify.
|
|
11
11
|
|
|
@@ -27,7 +27,7 @@ Browser-only: the brand *import* intelligence (auto-extracting a usable palette
|
|
|
27
27
|
|
|
28
28
|
## Plumbing the taskboard leans on
|
|
29
29
|
|
|
30
|
-
- **
|
|
30
|
+
- **Texting number**: there is no tool to search for or buy one. The restaurant's texting number is bought automatically from its location when its Google place is set (see `updateBrandIdentity` above), or the client chooses one in the dashboard's "Choose texting number" task. If neither has happened, hand the user that task's `completionUrl`.
|
|
31
31
|
- **Media**: `getMediaUploadUrl` (PUT the bytes to the presigned URL, then reference the returned key), `listMedia`, `deleteMedia`. This is how logos and offer images get in through the tools.
|
|
32
32
|
- **Team**: `inviteUser` sends a real email immediately and **defaults to OWNER** (full billing access), so always pass `role` explicitly; VIEWER is read-only, SCANNER is for staff running the scanner app. A new person gets an invitation valid for 14 days; someone with a Feast account gets a login reminder and is added right away. Re-inviting an email cancels its pending invites and sends a fresh one. Only an OWNER can invite.
|
|
33
33
|
- **Billing**: `getBillingStatus`, read-only: `hasAccess` answers "can they use the product," `needsPayment` flags the states worth acting on and is what the dashboard reads to put the app behind a payment form. `currentTier` and `subscriptionStatus` describe the plan. `existingOrganizations` lists every organization billed under the same billing admin's subscription (this one included when it is on that subscription), with names and tiers; it is absent for per-organization billing. Every billing write stays in the dashboard.
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|