@shipstatic/ship 2.3.1 → 2.3.3

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/SKILL.md CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: ship
3
3
  description: "Deploy static websites to ShipStatic. Use when the user wants to deploy a site, publish a website, upload to hosting, go live, set up a custom domain, manage deployments, or share a site URL. No account required — instant deployment. CLI (`ship`) and Node.js/browser SDK."
4
- compatibility: "Node.js >= 20. Run via npx (no install) or install globally: npm install -g @shipstatic/ship"
4
+ compatibility: "Node.js >= 20.19. Run via npx (no install) or install globally: npm install -g @shipstatic/ship"
5
5
  metadata:
6
6
  openclaw:
7
7
  requires:
@@ -203,6 +203,8 @@ ship domains set www.example.com <dep> --json
203
203
  }
204
204
  ```
205
205
 
206
+ Always show the user the records **from this response**, never values copied out of this document — they come from the platform and can change.
207
+
206
208
  ```bash
207
209
  ship domains records www.example.com --json
208
210
  ```
@@ -212,7 +214,7 @@ ship domains records www.example.com --json
212
214
  "domain": "www.example.com",
213
215
  "apex": "example.com",
214
216
  "records": [
215
- {"type": "A", "name": "@", "value": "76.76.21.21"},
217
+ {"type": "A", "name": "@", "value": "15.204.149.253"},
216
218
  {"type": "CNAME", "name": "www", "value": "cname.shipstatic.com"}
217
219
  ]
218
220
  }
@@ -311,16 +313,34 @@ ship tokens delete <token> # Delete (revokes immediately)
311
313
 
312
314
  ## Errors
313
315
 
314
- | Message | Cause | Fix |
315
- |---------|-------|-----|
316
- | `too many requests` | Rate limited | Wait, or set an API key |
317
- | `authentication failed` | Bad credentials | Check key/token |
318
- | `not found` | No such resource | Verify the ID/name |
319
- | `path does not exist` | Bad deploy path | Check file/directory |
320
- | `invalid domain name` | Not a subdomain | Use `www.example.com`, not `example.com` |
321
- | `--ttl sets an expiry, which needs a token` | `--ttl` without credentials | Set an API key, or drop `--ttl` |
322
- | `--ttl and --domain cannot be combined` | Both flags given | A domain cannot point at an expiring deployment — pick one |
323
- | `<resource> limit reached` | Plan caps hit (deployments, domains) | Suggest upgrading the plan; do not retry |
324
- | `Account has been deleted` / `Account terminated` | Account is gone | Stop; the account cannot deploy |
325
- | `DNS information is only available for external domains` | DNS op on internal domain | Only custom domains need DNS |
326
- | `DNS verification already requested recently` | Rate limited | Wait |
316
+ Exit code is non-zero on failure, and with `--json` the error goes to **stderr** as the platform's wire shape:
317
+
318
+ ```json
319
+ {
320
+ "error": "validation_failed",
321
+ "message": "File \"index.html\" too large. Maximum 20 MB allowed.",
322
+ "status": 400
323
+ }
324
+ ```
325
+
326
+ **Branch on `error` and `status`, never on `message`.** Messages are written for the human reading them and get reworded; the type tag and the status are the contract.
327
+
328
+ | `error` | `status` | Means | Do |
329
+ |---------|----------|-------|----|
330
+ | `validation_failed` | 400 | Bad input — path, domain name, label, password, ttl | Read `message`, fix the input, retry |
331
+ | `authentication_failed` | 401 | Missing or bad credential | Check `SHIP_TOKEN`; do not retry unchanged |
332
+ | `forbidden` | 403 | Plan cap reached, account terminated, or an action this credential may never take | **Do not retry.** Suggest upgrading if it is a cap |
333
+ | `not_found` | 404 | No such deployment or domain | Verify the identifier |
334
+ | `rate_limit_exceeded` | 429 | Too many requests | Wait — `details.expires` is when it clears. An API key raises the limit |
335
+ | `business_logic_error` | 400 or 422 | Valid request, refused by a state rule (e.g. unlinking a domain, suspended account) | Read `message`; the rule will not change on retry |
336
+ | `maintenance` | 503 | Platform closed on purpose | `message` says when it reopens. Wait; do not retry in a loop |
337
+
338
+ Common cases worth recognising before they happen:
339
+
340
+ | Situation | What you get |
341
+ |-----------|--------------|
342
+ | Deploying a project root (`package.json`, `node_modules`) | `validation_failed` — build first, deploy the output |
343
+ | `--ttl` or `--domain` with no credential | `validation_failed`, refused **before** anything uploads |
344
+ | `--ttl` together with `--domain` | `validation_failed` — a domain must not point at something expiring |
345
+ | DNS commands on an internal `*.shipstatic.com` domain | `validation_failed` — only custom domains have DNS |
346
+ | `domains verify` called again too soon | `rate_limit_exceeded` — verification is already queued |
@@ -5,7 +5,7 @@ Their copyright notices travel with that copy, and are reproduced here in
5
5
  full. This file is GENERATED from the build's own metafile — edit the
6
6
  bundle, not this list.
7
7
 
8
- ## @shipstatic/types 2.9.0
8
+ ## @shipstatic/types 2.10.0
9
9
 
10
10
  License: MIT
11
11
 
package/dist/browser.d.ts CHANGED
@@ -73,12 +73,14 @@ declare const DeploymentVia: {
73
73
  * A deploy that reached the REST API naming no origin at all — the
74
74
  * platform-wide fallback, one altitude below `mcp`'s family fallback.
75
75
  *
76
- * **Declared ahead of its emitter, deliberately.** Nothing sends it yet and
77
- * the server still records an unattributed deploy as `null`. Vocabulary must
78
- * exist before a consumer can adopt it, and adding a member costs a full
79
- * constellation convoy — so the word ships first and the API adopts it as a
80
- * default whenever that decision is taken, with no convoy standing between
81
- * the decision and the deploy.
76
+ * **The API stamps it, since 2026-08-15.** A deploy that names no origin —
77
+ * or names one this vocabulary does not know — is stored as `api`, so a
78
+ * stored `null` now means only that the row predates attribution.
79
+ *
80
+ * It was declared one wave ahead of that decision, deliberately: vocabulary
81
+ * must exist before a consumer can adopt it, and adding a member costs a
82
+ * full constellation convoy, so the word shipped first and the server
83
+ * adopted it with no convoy standing between the decision and the deploy.
82
84
  */
83
85
  readonly API: "api";
84
86
  };
@@ -104,7 +106,10 @@ interface Deployment {
104
106
  /** Labels for categorization and filtering (lowercase, alphanumeric with separators). Always present, empty array when none. */
105
107
  labels: string[];
106
108
  /**
107
- * The client/tool that created this deployment, null if unknown.
109
+ * The client/tool that created this deployment. Every deployment created
110
+ * today names one — {@link DeploymentVia.API} when the caller named nothing
111
+ * the vocabulary knows — so `null` is historical: the row predates
112
+ * attribution.
108
113
  *
109
114
  * Deliberately wider than {@link DeploymentViaType}: this is stored data,
110
115
  * and rows predate the vocabulary being closed. Narrowing the ENTITY would
@@ -1793,6 +1798,17 @@ interface ActivityMeta {
1793
1798
  hasConfig?: boolean;
1794
1799
  /** Whether deployment has a password set */
1795
1800
  hasPassword?: boolean;
1801
+ /**
1802
+ * The client/tool that created the deployment.
1803
+ *
1804
+ * Narrower than {@link Deployment.via}, deliberately: the entity is
1805
+ * `string | null` because stored rows predate the vocabulary, while an
1806
+ * activity is only ever written by code that names one. It is here rather
1807
+ * than read off the deployment because the deployment row is deleted at
1808
+ * expiry or on request and the activity is not — this is where a deploy's
1809
+ * origin stays answerable afterwards.
1810
+ */
1811
+ via?: DeploymentViaType;
1796
1812
  /** Whether this was an update (vs create) */
1797
1813
  isUpdate?: boolean;
1798
1814
  /** Whether domain was already verified */