@myapihq/cli 2.10.0 → 2.11.0

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.
Files changed (48) hide show
  1. package/dist/commands/import-key.test.d.ts +1 -0
  2. package/dist/commands/import-key.test.js +69 -0
  3. package/dist/commands/org.js +5 -1
  4. package/dist/commands/setup.d.ts +5 -1
  5. package/dist/commands/setup.js +67 -6
  6. package/dist/commands/storage.js +151 -14
  7. package/dist/config.d.ts +2 -0
  8. package/dist/errors.d.ts +4 -0
  9. package/dist/errors.js +30 -3
  10. package/dist/helpers.d.ts +20 -1
  11. package/dist/helpers.js +79 -1
  12. package/dist/index.js +6 -1
  13. package/dist/org-not-found.test.d.ts +1 -0
  14. package/dist/org-not-found.test.js +42 -0
  15. package/dist/org-notice.test.d.ts +1 -0
  16. package/dist/org-notice.test.js +37 -0
  17. package/dist/output.d.ts +6 -0
  18. package/dist/output.js +8 -1
  19. package/dist/skills/my-api-hq/SKILL.md +34 -14
  20. package/dist/skills/my-audience-api/SKILL.md +16 -1
  21. package/dist/skills/my-auth-api/SKILL.md +17 -2
  22. package/dist/skills/my-company-api/SKILL.md +16 -1
  23. package/dist/skills/my-container-api/SKILL.md +22 -7
  24. package/dist/skills/my-crm-api/SKILL.md +16 -1
  25. package/dist/skills/my-database-api/SKILL.md +13 -17
  26. package/dist/skills/my-domain-api/SKILL.md +16 -1
  27. package/dist/skills/my-email-api/SKILL.md +12 -16
  28. package/dist/skills/my-email-verify-api/SKILL.md +16 -1
  29. package/dist/skills/my-feedback-api/README.md +33 -0
  30. package/dist/skills/my-feedback-api/SKILL.md +118 -0
  31. package/dist/skills/my-feedback-api/claude/.claude-plugin/plugin.json +7 -0
  32. package/dist/skills/my-function-api/README.md +34 -0
  33. package/dist/skills/my-function-api/SKILL.md +16 -1
  34. package/dist/skills/my-funnel-api/SKILL.md +16 -1
  35. package/dist/skills/my-git-api/SKILL.md +17 -1
  36. package/dist/skills/my-image-api/SKILL.md +17 -1
  37. package/dist/skills/my-llm-api/SKILL.md +20 -6
  38. package/dist/skills/my-payments-api/README.md +33 -0
  39. package/dist/skills/my-payments-api/SKILL.md +16 -1
  40. package/dist/skills/my-people-api/SKILL.md +16 -1
  41. package/dist/skills/my-pixel-api/SKILL.md +26 -3
  42. package/dist/skills/my-queue-api/SKILL.md +35 -2
  43. package/dist/skills/my-storage-api/SKILL.md +37 -29
  44. package/dist/skills/my-task-api/SKILL.md +35 -2
  45. package/dist/skills/my-url-to/SKILL.md +16 -1
  46. package/dist/skills/my-webhook-api/SKILL.md +23 -3
  47. package/dist/skills/my-workflow-api/SKILL.md +32 -6
  48. package/package.json +2 -2
@@ -0,0 +1,118 @@
1
+ ---
2
+ name: my-feedback-api
3
+ version: 1.0.0
4
+ description: >
5
+ Collect feedback from the people using what you built. A public widget key lets a page submit without a credential; you list, filter and resolve the results. Kind is chosen by the person reporting, not inferred from their wording.
6
+ triggers: [feedback, bug report, user feedback, feature request, widget, support, complaints, praise]
7
+ checksum: sha256-41627c4bdf19a5af131adc0e7bab76816e7be47acdc15601bdcef7cdb47b2e26
8
+ ---
9
+
10
+ # MyFeedbackAPI
11
+
12
+ The loop back from the people using your product. A page collects feedback with
13
+ a public key that authenticates nobody; you read, filter and close it.
14
+
15
+ ## Capabilities
16
+ <!-- llm:start -->
17
+ Two halves: a **widget key** a page embeds, and the **items** it produces.
18
+
19
+ ### The widget key is public, and that is the point
20
+
21
+ `myapi feedback widget create <name>` mints a key that ships in your page
22
+ source. It is **not a secret** — it names your org so a visitor can submit
23
+ without signing in, and it authenticates nobody.
24
+
25
+ Treating it as a credential is the mistake to avoid: people hide it, and then
26
+ the widget cannot work. What it does need is `--origins`, so another site
27
+ cannot post through it:
28
+
29
+ ```bash
30
+ myapi feedback widget create site --origins app.example.com,example.com
31
+ ```
32
+
33
+ Revoke with `myapi feedback widget revoke <id>`. Submissions stop immediately;
34
+ feedback already collected is kept.
35
+
36
+ **The browser-side submit contract is not documented yet.** The CLI and SDK
37
+ cover minting, revoking, listing and resolving; how a page posts with only the
38
+ widget key is not published anywhere you can read it, so don't guess the
39
+ endpoint. Until it lands, collect through a route you control — a funnel form
40
+ (`my-funnel-api`) or a webhook (`my-webhook-api`) — and file items with
41
+ `myapi feedback create`.
42
+
43
+ ### Kind is a claim, not a guess
44
+
45
+ `--kind` is one of `bug`, `issue`, `suggestion`, and it is **what the person
46
+ reporting says it is**. Someone filing a `bug` is telling you
47
+ they believe the product is broken — which is a different and more urgent
48
+ signal than a wish for something new. Do not re-classify from the wording.
49
+
50
+ Classification and duplicate-grouping exist in the platform's design and are
51
+ not built yet, so treat `kind` as the person's own label rather than a
52
+ processed signal.
53
+
54
+ ### Reading it back
55
+
56
+ `myapi feedback list` is newest first, filterable by `--kind` and `--status`
57
+ (`open` | `resolved`), paged with `--limit` / `--offset`. **`total` is the
58
+ number of matches, not the size of the page**, and `has_more` flags a truncated
59
+ result — both describe the whole match set.
60
+
61
+ `myapi feedback resolve <id>` closes an item. An unknown id answers the same
62
+ way as an already-resolved one, so a success is not proof the item existed —
63
+ that is deliberate, so ids cannot be probed across orgs.
64
+ <!-- llm:end -->
65
+
66
+ ## Commands
67
+ <!-- generated:start -->
68
+ | Command | What it does |
69
+ |---|---|
70
+ | `myapi feedback create "<text>" --kind <k>` | Record one item (`--page-url`, `--route` for context) |
71
+ | `myapi feedback list [--kind bug\|issue\|suggestion] [--status open\|resolved] [--limit N] [--offset N]` | List feedback, newest first |
72
+ | `myapi feedback resolve <id>` | Close an item |
73
+ | `myapi feedback widget create <name> [--origins a.com,b.com]` | Mint a PUBLIC widget key for a site |
74
+ | `myapi feedback widget revoke <id>` | Revoke a key; collected feedback is kept |
75
+ <!-- generated:end -->
76
+
77
+ ## Examples
78
+ <!-- llm:start -->
79
+ ```bash
80
+ # 1. Mint a key for your site. Restrict the origins.
81
+ myapi feedback widget create marketing --origins example.com,www.example.com
82
+ # → prints a PUBLIC key to embed in the page
83
+
84
+ # 2. Read what came back, newest first
85
+ myapi feedback list --status open
86
+ myapi feedback list --kind bug --limit 20
87
+
88
+ # 3. Record something yourself (support call, your own testing)
89
+ myapi feedback create "checkout 500s on the second attempt" --kind bug \
90
+ --route /checkout
91
+
92
+ # 4. Close it
93
+ myapi feedback resolve <id>
94
+ ```
95
+ <!-- llm:end -->
96
+
97
+ ## Notes
98
+
99
+ - The widget key is public by design — restrict it with `--origins` rather than hiding it.
100
+ - `resolve` is idempotent and deliberately indistinguishable from an unknown id.
101
+ - Feedback survives widget revocation.
102
+
103
+ ## HTTP (from deployed code)
104
+
105
+ <!-- http:start -->
106
+ <!-- generated by `npm run canonical-sync` — do not edit -->
107
+ ```
108
+ base https://api.myapihq.com
109
+ path POST /feedback/orgs/{org_id}/widgets
110
+ auth Authorization: Bearer <key> (fn: env.__MYAPI_KEY · container: env.MYAPI_KEY)
111
+ reply { "success": true, "data": …, "error": null, "meta": {…} }
112
+ ```
113
+
114
+ - **Per-slot host** — do not assume one host serves every slot.
115
+ - **Org id goes in the PATH** — there is no `X-Org-Id` header.
116
+ <!-- http:end -->
117
+
118
+ Run `myapi feedback --help` for the full flag reference.
@@ -0,0 +1,7 @@
1
+ {
2
+ "name": "my-feedback-api",
3
+ "description": "Collect feedback from the people using what you built. A public widget key lets a page submit without a credential; you list, filter, and resolve the results.",
4
+ "version": "1.0.0",
5
+ "status": "preview",
6
+ "published": true
7
+ }
@@ -0,0 +1,34 @@
1
+ ---
2
+ # my-function-api
3
+
4
+ Deploy JavaScript to the MyAPI edge runtime. Register a function, upload a single-file bundle, and it goes live on a public invocation URL — or runs on a cron schedule.
5
+
6
+ ## What it does
7
+
8
+ - Two-step lifecycle: `create` registers and mints a scoped key, `deploy` ships a ≤4MB single-file bundle
9
+ - HTTP or cron triggers, fixed at create time
10
+ - Scoped capability key, org-locked, narrowable with `--scope <slot>,...` — a function never out-reaches the credential that made it
11
+ - The key is injected as `env.__MYAPI_KEY` and stays current across deploys
12
+ - Encrypted secrets via `fn env`, invocation history via `fn runs`
13
+
14
+ ## Quickstart
15
+
16
+ ```bash
17
+ myapi fn create --name my-app-api
18
+ myapi fn deploy fn_abc123 ./dist/bundle.js
19
+ myapi fn runs fn_abc123
20
+ ```
21
+
22
+ ## Authentication
23
+
24
+ ```bash
25
+ export MYAPI_KEY=hq_live_...
26
+ ```
27
+
28
+ Requires `api_key` + `org_id` from **myapihq**.
29
+
30
+ ## Documentation
31
+
32
+ Full command reference, the `__MYAPI_KEY` injection contract, and why `--scope` is effectively permanent: see `SKILL.md`.
33
+
34
+ Run `myapi fn --help` for inline reference.
@@ -4,7 +4,7 @@ version: 1.0.0
4
4
  description: >
5
5
  Deploy JavaScript functions to the MyAPI edge runtime. Register a function, upload a single-file JS bundle, get a live HTTP invocation URL or run it on a cron schedule. Each function gets a scoped capability key for cross-slot calls.
6
6
  triggers: [function, deploy function, edge function, serverless, cloudflare worker, cron, scoped api key, capability key, invocation url, bundle]
7
- checksum: sha256-a29b3c96645c59317c0896c9a886d9904bdb2ebde9eb8582d0cb7071d0b9ac2c
7
+ checksum: sha256-0ab1d08fb6c9cc917fd3d1aa5d730ff3e4fe5dd37e8e30ebe225085593139cca
8
8
  ---
9
9
 
10
10
  # MyFunctionAPI
@@ -135,4 +135,19 @@ curl -H "Authorization: Bearer $SCOPED_KEY" \
135
135
  handed out — docs, front-end config, webhooks, anything given to a third
136
136
  party. Decide the full slot list before you publish the URL.
137
137
 
138
+ ## HTTP (from deployed code)
139
+
140
+ <!-- http:start -->
141
+ <!-- generated by `npm run canonical-sync` — do not edit -->
142
+ ```
143
+ base https://api.myapihq.com
144
+ path POST /function/orgs/{org_id}/functions
145
+ auth Authorization: Bearer <key> (fn: env.__MYAPI_KEY · container: env.MYAPI_KEY)
146
+ reply { "success": true, "data": …, "error": null, "meta": {…} }
147
+ ```
148
+
149
+ - **Per-slot host** — do not assume one host serves every slot.
150
+ - **Org id goes in the PATH** — there is no `X-Org-Id` header.
151
+ <!-- http:end -->
152
+
138
153
  Run `myapi fn --help` or `myapi fn <subcommand> --help` for full flag reference.
@@ -4,7 +4,7 @@ version: 1.0.0
4
4
  description: >
5
5
  Create and publish websites (funnels) to the edge. Push raw HTML to any slug and it goes live instantly on your org's domain or preview subdomain.
6
6
  triggers: [funnel, landing page, website, page, publish, push, slug, html, edge, preview subdomain, makeautonomous]
7
- checksum: sha256-849afbb7c2c60ea88c3476d50bf51289b77cedc819a0c2b69787075ff9c23b4b
7
+ checksum: sha256-24c12e48a6153087641369319ac67e79c1fa36b950b140621d1e118128755b53
8
8
  ---
9
9
 
10
10
  # MyFunnelAPI
@@ -121,4 +121,19 @@ myapi funnel form <funnel_id> --slug survey \
121
121
  - Deleting a funnel purges all its edge pages immediately.
122
122
  - `402 INSUFFICIENT_FUNDS` → top up (`myapi billing topup`) or enable `myapi billing auto-recharge`.
123
123
 
124
+ ## HTTP (from deployed code)
125
+
126
+ <!-- http:start -->
127
+ <!-- generated by `npm run canonical-sync` — do not edit -->
128
+ ```
129
+ base https://api.myfunnelapi.com
130
+ path POST /funnel/orgs/{org_id}/funnels
131
+ auth Authorization: Bearer <key> (fn: env.__MYAPI_KEY · container: env.MYAPI_KEY)
132
+ reply { "success": true, "data": …, "error": null, "meta": {…} }
133
+ ```
134
+
135
+ - **Per-slot host** — do not assume one host serves every slot.
136
+ - **Org id goes in the PATH** — there is no `X-Org-Id` header.
137
+ <!-- http:end -->
138
+
124
139
  Run `myapi funnel --help` or `myapi funnel <subcommand> --help` for full flag reference.
@@ -4,7 +4,7 @@ version: 1.0.0
4
4
  description: >
5
5
  Hosted git repositories over HTTP. Create repos, read history (log/show/tree/blob/diff), and write atomically (commit/branch/tag/merge) — no clone needed. Real `git clone`/`push` also work over HTTPS with your API key as the password.
6
6
  triggers: [git, repo, repository, clone, push, commit, branch, tag, merge, diff, version control, source control, vcs]
7
- checksum: sha256-417bafc3e56707f637937f98341d6200c8a9bb6ad5d0b13f84f7b6810e0340f5
7
+ checksum: sha256-0ce9ebdde1ec29160d186ab0e4fb254d47473af3b57829f0156845bfb08c4ab1
8
8
  ---
9
9
 
10
10
  # MyGitAPI
@@ -117,6 +117,7 @@ surface never leaks which repos exist).
117
117
  - **`commit --base`** is the concurrency guard: pass the expected tip SHA to reject a stale write, or `--base ""` to require the branch be newly created. Omit it to create-or-update.
118
118
  - **Metering.** A `git push` (and `myapi git commit`) is metered like a commit. Clone/fetch (`upload-pack`) is free.
119
119
  - **Limits.** A push body is capped at 100 MiB; per-repo size limits apply (a push past the cap is reported as a receive-pack failure).
120
+ - **`402`** — `INSUFFICIENT_FUNDS`: top up or enable `myapi billing auto-recharge`. `SPEND_CAP_EXCEEDED`: raise your own ceiling with `myapi billing spend-cap`.
120
121
  - **Auth field.** git may put the API key in the username or password slot — both work. Embedding it in the URL (`https://x:$KEY@…`) avoids the interactive prompt but writes the API key into `.git/config`; use a credential helper for anything persistent.
121
122
 
122
123
  ## Commit authorship
@@ -125,4 +126,19 @@ surface never leaks which repos exist).
125
126
  author. Without them the commit is attributed to the API key's account, which
126
127
  makes every agent-written commit look like the same person.
127
128
 
129
+ ## HTTP (from deployed code)
130
+
131
+ <!-- http:start -->
132
+ <!-- generated by `npm run canonical-sync` — do not edit -->
133
+ ```
134
+ base https://api.myapihq.com
135
+ path POST /git/orgs/{org_id}/repos
136
+ auth Authorization: Bearer <key> (fn: env.__MYAPI_KEY · container: env.MYAPI_KEY)
137
+ reply { "success": true, "data": …, "error": null, "meta": {…} }
138
+ ```
139
+
140
+ - **Per-slot host** — do not assume one host serves every slot.
141
+ - **Org id goes in the PATH** — there is no `X-Org-Id` header.
142
+ <!-- http:end -->
143
+
128
144
  Run `myapi git --help` for the full flag reference.
@@ -4,7 +4,7 @@ version: 1.0.0
4
4
  description: >
5
5
  Generate AI images from a text prompt. Async — submit a prompt, the CLI polls until the image is ready, then returns a public CDN URL. Image lands automatically in your org's storage.
6
6
  triggers: [image, generate image, ai image, hero image, logo, illustration, watercolor, prompt, cyberpunk, ratio, aspect ratio]
7
- checksum: sha256-17f496ae8c575743872e87c5c3b281e621b3557ef3ff9eeb0b3d664ec4212e57
7
+ checksum: sha256-c12686cd9f53f18dbc692c3aca9391409cc1540b693b6f2059074e02bafff72c
8
8
  ---
9
9
 
10
10
  # MyImageAPI
@@ -73,6 +73,22 @@ Tips for agents:
73
73
 
74
74
  - Cost is per-image at the selected model's catalog rate (`myapi image models`). Failed jobs aren't charged.
75
75
  - The asset URL is public — don't generate sensitive content.
76
+ - **`402`** — `INSUFFICIENT_FUNDS`: top up or enable `myapi billing auto-recharge`. `SPEND_CAP_EXCEEDED`: raise your own ceiling with `myapi billing spend-cap`.
76
77
  - `delete` is permanent for the asset; the job record (prompt + metadata) stays for history. Look before you delete: `myapi image list` first, pass `--org` explicitly; delete verbs require `--yes` in non-interactive runs.
77
78
 
79
+ ## HTTP (from deployed code)
80
+
81
+ <!-- http:start -->
82
+ <!-- generated by `npm run canonical-sync` — do not edit -->
83
+ ```
84
+ base https://api.myimageapi.com
85
+ path POST /image/orgs/{org_id}/generate
86
+ auth Authorization: Bearer <key> (fn: env.__MYAPI_KEY · container: env.MYAPI_KEY)
87
+ reply { "success": true, "data": …, "error": null, "meta": {…} }
88
+ ```
89
+
90
+ - **Per-slot host** — do not assume one host serves every slot.
91
+ - **Org id goes in the PATH** — there is no `X-Org-Id` header.
92
+ <!-- http:end -->
93
+
78
94
  Run `myapi image --help` or `myapi image <subcommand> --help` for full flag reference.
@@ -7,7 +7,7 @@ description: >
7
7
  (classify / extract / summarize / draft) that hide the model behind a
8
8
  task. Pricing in cents per 1M tokens; charged from your MyAPI balance.
9
9
  triggers: [llm, completion, chat, embed, embedding, inference, classify, extract, summarize, draft, qwen]
10
- checksum: sha256-2a9070e118134aea98a1be986d29f9c4e3a969aa960e7dfc87137bbc490ac04e
10
+ checksum: sha256-d89e5c7ccadb7e967f97ec201b745f2313e4263f8f08a695f4cc9fbaa0c4b500
11
11
  ---
12
12
 
13
13
  # MyLLMAPI
@@ -17,8 +17,6 @@ A two-surface LLM gateway:
17
17
  - **Raw** — `complete` / `embed` / `models`. You pick a self-hosted catalog model (run `myapi llm models` for the live list). Proprietary models are not callable here.
18
18
  - **Verbs** — `classify` / `extract` / `summarize` / `draft`. You ask for a task done; the model is implementation detail.
19
19
 
20
- Pricing is cents per 1M tokens at the actual upstream rate, debited from your MyAPI balance.
21
-
22
20
  ## Capabilities
23
21
  <!-- llm:start -->
24
22
  For workflow tasks — summarize, classify, extract, draft. The reply goes to stdout and the usage footer (tokens, cost, finish reason) to stderr, so `myapi llm complete ... | jq` works.
@@ -112,7 +110,7 @@ r = client.chat.completions.create(model="<model-id>",
112
110
  | `myapi llm classify "<input>" --labels <csv> [--multi] [--tier <t>] [--json]` | Pick a label from a set |
113
111
  | `myapi llm extract "<input>" --schema <path\|json> [--tier <t>] [--json]` | Pull structured data conforming to a JSON Schema |
114
112
  | `myapi llm summarize "<input>" [--style brief\|exec\|bullet] [--tier <t>] [--json]` | Summarize text |
115
- | `myapi llm draft --kind <what> [--prompt "<s>"] [--context <json>] ["<src>"] [--tier <t>] [--json]` | Draft an email / reply / message / … |
113
+ | `myapi llm draft --kind <what> [--prompt "<s>"] [--facts <json>] [--directives <json>] ["<src>"] [--tier <t>] [--json]` | Draft an email / reply / message / … |
116
114
  <!-- generated:end -->
117
115
 
118
116
  Pass `-` as the prompt/input to read from stdin. Pass `--file <path>` to read longer content from disk.
@@ -145,7 +143,7 @@ myapi llm summarize --file long-thread.txt --style bullet
145
143
 
146
144
  myapi llm draft --kind email \
147
145
  --prompt "Friendly welcome, under 60 words." \
148
- --context '{"recipient":"a new signup","product":"MyAPI"}'
146
+ --facts '{"recipient":"a new signup","product":"MyAPI"}'
149
147
 
150
148
  # Classify + route an inbound webhook delivery
151
149
  BODY=$(myapi webhook delivery <id> --json | jq -r '.body')
@@ -156,7 +154,8 @@ INTENT=$(printf '%s' "$BODY" | myapi llm classify - \
156
154
 
157
155
  ## Notes
158
156
 
159
- - **`draft` context safety.** `context` fields are quoted into the prompt verbatim; sensitive-named keys (`secret`, `api_key`, `password`, …) are NOT redacted. Two guards on top: (a) injection-defense strips `instructions`/`system`/`prompt`/`override` keys and surfaces them in `meta.warnings`; (b) output guardrail substring-scans fact values (length 4) in the response and lists matches in `meta.guardrails.facts_in_output` (signal, not redaction). Rule of thumb: never put credentials, PII, or internal metadata in `context` — pass identifiers, reference them indirectly.
157
+ - **`draft --facts` safety.** Fact values are quoted into the prompt verbatim and sensitive-named keys (`secret`, `api_key`, `password`, …) are NOT redacted. Two guards: injection-defense strips `instructions`/`system`/`prompt`/`override` keys into `meta.warnings`; an output guardrail substring-scans fact values (≥4 chars) and lists hits in `meta.guardrails.facts_in_output` (signal, not redaction). Never put credentials, PII, or internal metadata in `--facts` — pass identifiers and reference them indirectly.
158
+ - **`402`** — `INSUFFICIENT_FUNDS`: top up or enable `myapi billing auto-recharge`. `SPEND_CAP_EXCEEDED`: raise your own ceiling with `myapi billing spend-cap`.
160
159
  - **Self-hosted raw, server-picked verbs.** Raw runs on MyAPI's TPU; verbs route wherever the server picks.
161
160
  - **Cost + latency.** `usage.cost_cents` is authoritative — no markup. Varies by tier: 200–600 ms to first token, 1–3 s end-to-end.
162
161
  - **Live catalog, no streaming, no BYOK.** Don't hard-code ids — `models` is truth (CLI auto-picks if `--model` omitted). Full reply only.
@@ -173,3 +172,18 @@ myapi llm draft --kind email --prompt "the invoice is due" \
173
172
  ```
174
173
 
175
174
  `--context` is the old name for `--facts`; accepted, deprecated upstream.
175
+
176
+ ## HTTP (from deployed code)
177
+
178
+ <!-- http:start -->
179
+ <!-- generated by `npm run canonical-sync` — do not edit -->
180
+ ```
181
+ base https://api.myapihq.com
182
+ path POST /llm/orgs/{org_id}/complete
183
+ auth Authorization: Bearer <key> (fn: env.__MYAPI_KEY · container: env.MYAPI_KEY)
184
+ reply { "success": true, "data": …, "error": null, "meta": {…} }
185
+ ```
186
+
187
+ - **Per-slot host** — do not assume one host serves every slot.
188
+ - **Org id goes in the PATH** — there is no `X-Org-Id` header.
189
+ <!-- http:end -->
@@ -0,0 +1,33 @@
1
+ ---
2
+ # my-payments-api
3
+
4
+ Take payments via Stripe. Connect your own Stripe account, then create hosted Checkout URLs for one-off or recurring charges. No raw card data touches your code.
5
+
6
+ ## What it does
7
+
8
+ - Bring your own Stripe key (T0) — your account stays the merchant of record
9
+ - One verb for both models: `charge --amount 9.99`, or add `--every month|year` for a subscription
10
+ - Returns a hosted Stripe Checkout URL to paste into a frontend, email, or redirect
11
+ - Full refunds; list and inspect charges
12
+
13
+ ## Quickstart
14
+
15
+ ```bash
16
+ myapi payments connect --stripe-key sk_live_...
17
+ myapi payments charge --amount 9.99 --description "Pro plan upgrade"
18
+ myapi payments refund <charge_id>
19
+ ```
20
+
21
+ ## Authentication
22
+
23
+ ```bash
24
+ export MYAPI_KEY=hq_live_...
25
+ ```
26
+
27
+ Requires `api_key` + `org_id` from **myapihq**, plus your own Stripe secret key.
28
+
29
+ ## Documentation
30
+
31
+ Full command reference and what is deliberately not available yet (T1 Connect Express, partial refunds, coupons, Stripe Tax): see `SKILL.md`.
32
+
33
+ Run `myapi payments --help` for inline reference.
@@ -4,7 +4,7 @@ version: 1.1.0
4
4
  description: >
5
5
  Take payments via Stripe — one-off or recurring. Connect your own Stripe account, then create hosted Stripe Checkout URLs. No raw card data ever touches your code.
6
6
  triggers: [payment, stripe, checkout, charge, subscription, take payments, billing, refund, recurring, sell]
7
- checksum: sha256-bdf124b2a3d32c87676ad34f0a20df134099bcbebe7f9a11f05ceddf74a6b2a9
7
+ checksum: sha256-742d42da2441fb3ce1317b503dd68f706a1f3d4a7d0f8128473683c26fa3be18
8
8
  ---
9
9
 
10
10
  # MyPaymentsAPI
@@ -82,4 +82,19 @@ myapi payments refund <charge_id>
82
82
  - Multi-currency on a single charge.
83
83
  - Customer object as a first-class resource (Stripe tracks by email; `my-crm-api` has the engagement view).
84
84
 
85
+ ## HTTP (from deployed code)
86
+
87
+ <!-- http:start -->
88
+ <!-- generated by `npm run canonical-sync` — do not edit -->
89
+ ```
90
+ base https://api.myapihq.com
91
+ path POST /payments/orgs/{org_id}/connect
92
+ auth Authorization: Bearer <key> (fn: env.__MYAPI_KEY · container: env.MYAPI_KEY)
93
+ reply { "success": true, "data": …, "error": null, "meta": {…} }
94
+ ```
95
+
96
+ - **Per-slot host** — do not assume one host serves every slot.
97
+ - **Org id goes in the PATH** — there is no `X-Org-Id` header.
98
+ <!-- http:end -->
99
+
85
100
  Run `myapi payments --help` or `myapi payments <subcommand> --help` for full flag reference.
@@ -4,7 +4,7 @@ version: 1.0.0
4
4
  description: >
5
5
  Contact database backed by the Goldfox crawl. Filter people by Goldfox confidence tier, seniority, email type, country, link confidence, plus rich behavioral company signals (has_c_level, has_careers_page, has_decision_maker, etc.). The targeting layer for outbound campaigns.
6
6
  triggers: [people, contacts, leads, prospects, search, filter, goldfox, decision-makers, c-level, b2b targeting, corporate email]
7
- checksum: sha256-1eb93087638966eee65fb7a88fe37baaa27a01dd5d97c1ef17387b1a36300c0e
7
+ checksum: sha256-e3f793369aebacfedad165f6bfa1ef831cbf17951e18f34110197697149bf416
8
8
  ---
9
9
 
10
10
  # MyPeopleAPI
@@ -104,4 +104,19 @@ myapi audience members $AID --limit 100 --json > targets.json
104
104
  - `keyword` matches the row's **domain**, not name/title. Use `--keyword acme` to find people whose domain contains "acme".
105
105
  - For a persistent target list, use `my-audience-api` (snapshot the filter; re-evaluate on `audience refresh`).
106
106
 
107
+ ## HTTP (from deployed code)
108
+
109
+ <!-- http:start -->
110
+ <!-- generated by `npm run canonical-sync` — do not edit -->
111
+ ```
112
+ base https://api.myapihq.com
113
+ path POST /people/orgs/{org_id}/search
114
+ auth Authorization: Bearer <key> (fn: env.__MYAPI_KEY · container: env.MYAPI_KEY)
115
+ reply { "success": true, "data": …, "error": null, "meta": {…} }
116
+ ```
117
+
118
+ - **Per-slot host** — do not assume one host serves every slot.
119
+ - **Org id goes in the PATH** — there is no `X-Org-Id` header.
120
+ <!-- http:end -->
121
+
107
122
  Run `myapi people --help` for full flag reference.
@@ -4,7 +4,7 @@ version: 1.0.0
4
4
  description: >
5
5
  Tracking pixel + identity resolution for MyAPI funnels and email. Capture visits and events, resolve known users to anonymous sessions, stream interaction events for analytics. Pairs with mycrmapi for auto-ingest of pixel_visit events on known contacts.
6
6
  triggers: [pixel, analytics, tracking, visit, event, identity, session, attribution, geo, open pixel]
7
- checksum: sha256-562f081ef28c0dae01045a4135f9d073d69c50899145e75c6c97fe75b974cb15
7
+ checksum: sha256-2c6508a5fdfa752cc5fd4231c087380e6d904f514973830a34e919b277ad31de
8
8
  ---
9
9
 
10
10
  # MyPixelAPI
@@ -50,9 +50,13 @@ Pixel data lives ~90 days hot; aggregated geo/audience samples persist longer. D
50
50
  | `myapi pixel events (--campaign-id <id> \| --domain <domain>) [--from <iso>] [--to <iso>] [--limit N] [--offset N]` | Engagement events (sent / open / click / page_visit). Requires at least one filter: `--campaign-id` or `--domain` |
51
51
  | `myapi pixel interactions [--website <domain>] [--campaign-id <id>] [--domain <domain>] [--from <iso>] [--to <iso>] [--limit N] [--offset N]` | Unified timeline of visits + events |
52
52
  | `myapi pixel identity <pixel_id> --website <domain>` | Resolve a pixel ID's identity graph (returns `{uuid, is_resolved, nodes, …}`) |
53
+ | `myapi pixel identify <pixel_id> (--email <addr> \| --external-id <id>)` | Attach a known identity to an anonymous visitor — the write half of identity resolution |
53
54
  | `myapi pixel audience` | Geographic distribution sample of your pixel audience |
54
55
  <!-- generated:end -->
55
56
 
57
+ `identity` reads the graph; `identify` writes to it. Everything else in this
58
+ slot is read-only.
59
+
56
60
  ## Examples
57
61
  <!-- llm:start -->
58
62
  ```bash
@@ -94,8 +98,27 @@ visitor:
94
98
  Pass either or both. After this, `pixel identity <pixel_id>` resolves the
95
99
  graph across the visitor's sessions.
96
100
 
101
+ ## HTTP (from deployed code)
102
+
103
+ <!-- http:start -->
104
+ <!-- generated by `npm run canonical-sync` — do not edit -->
105
+ ```
106
+ base https://api.mypixelapi.com
107
+ path POST /pixel/orgs/{org_id}/identify
108
+ auth Authorization: Bearer <key> (fn: env.__MYAPI_KEY · container: env.MYAPI_KEY)
109
+ reply { "success": true, "data": …, "error": null, "meta": {…} }
110
+ ```
111
+
112
+ - **Per-slot host** — do not assume one host serves every slot.
113
+ - **Org id goes in the PATH** — there is no `X-Org-Id` header.
114
+ <!-- http:end -->
115
+
97
116
  Run `myapi pixel --help` for inline reference.
98
117
 
99
- ## Status
118
+ ## Maturity
100
119
 
101
- **Backend reads are GA; agent-facing skill content is draft.** This skill publishes (status flips from `planned` to `ga` in `services.ts`) once pixel → CRM auto-ingest is wired so the cross-primitive examples above resolve end-to-end.
120
+ Reads are live and the CLI surface is stable. The slot is `preview` for one
121
+ reason: **pixel → CRM auto-ingest is not wired yet**, so a `pixel_visit` does
122
+ not appear on a contact's CRM timeline today. Every read verb works; the
123
+ cross-primitive examples that join pixel data to CRM contacts do not resolve
124
+ end-to-end until that lands.
@@ -4,7 +4,7 @@ version: 1.0.0
4
4
  description: >
5
5
  Durable job queue — enqueue work and have it retried against your HTTP consumer, with concurrency caps and a dependency DAG.
6
6
  triggers: [queue, job queue, background job, enqueue, retry, async work, dead letter, delayed job, concurrency]
7
- checksum: sha256-528a48bc9adcde7c48ad7208db7796ec37032f6df31bf5a2ca1f2bf63f643fe9
7
+ checksum: sha256-e3079f05a9f0b6eb1860749e42a3feea3cc4f18997b8bd6a0d5ff892e29bc628
8
8
  ---
9
9
 
10
10
  # MyQueueAPI
@@ -29,7 +29,7 @@ A job carries an arbitrary JSON `payload` (≤256 KB). Jobs support:
29
29
  - `delay_seconds` — hold the job before it becomes eligible.
30
30
  - `depends_on` — job ids this job waits on. Immutable — a DAG by construction. A job with unsucceeded `depends_on` starts blocked.
31
31
 
32
- **queue vs workflow vs task** — see `docs/orchestration-decision-guide.md`. Short version: `workflow` reacts to inbound webhooks inline; `queue` runs durable retried machine work; `task` is for work that needs an agent/human decision.
32
+ **queue vs workflow vs task** — see the section at the end of this skill.
33
33
  <!-- llm:end -->
34
34
 
35
35
  ## Commands
@@ -75,4 +75,37 @@ myapi queue job <job_id>
75
75
  - `depends_on` is immutable: the DAG is declared at enqueue time.
76
76
  - `payload` is capped at 256 KB.
77
77
 
78
+ ## HTTP (from deployed code)
79
+
80
+ <!-- http:start -->
81
+ <!-- generated by `npm run canonical-sync` — do not edit -->
82
+ ```
83
+ base https://api.myapihq.com
84
+ path POST /queue/orgs/{org_id}/queues
85
+ auth Authorization: Bearer <key> (fn: env.__MYAPI_KEY · container: env.MYAPI_KEY)
86
+ reply { "success": true, "data": …, "error": null, "meta": {…} }
87
+ ```
88
+
89
+ - **Per-slot host** — do not assume one host serves every slot.
90
+ - **Org id goes in the PATH** — there is no `X-Org-Id` header.
91
+ <!-- http:end -->
92
+
93
+ ## workflow vs queue vs task
94
+
95
+ | If you are saying… | Use |
96
+ |---|---|
97
+ | "When this webhook arrives, do these steps." | **workflow** |
98
+ | "Run this reliably, eventually — retry it, don't block on it." | **queue** |
99
+ | "Someone (agent or human) needs to look at this and decide." | **task** |
100
+
101
+ **Retry is not the distinction** — workflow and queue both retry. What differs
102
+ is where the work runs: a workflow step runs inline during the delivery that
103
+ triggered it; a queue job runs asynchronously against your external
104
+ `consumer_url`, bounded by `max_concurrency`.
105
+
106
+ They chain one way: a workflow's `enqueue_job` step hands durable work to a
107
+ queue. And they listen to two different surfaces — workflow fires on inbound
108
+ **webhook deliveries**; task `resolve_on` matches the internal **platform
109
+ events** bus, which is not the CRM timeline.
110
+
78
111
  Run `myapi queue --help` for the full flag reference.