@ductape/mcp 0.2.10 → 0.2.12

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 (2) hide show
  1. package/dist/index.js +31 -1
  2. package/package.json +2 -2
package/dist/index.js CHANGED
@@ -98,7 +98,7 @@ There are THREE categories of operations. Use the right tool for each:
98
98
 
99
99
  RESOLVING "No linked project" ERRORS:
100
100
  Some commands (declarative sync below, db migrate/schema, products environments *) need a
101
- linked project — a local .ductape/config.json with a product tag and env slug. The "link"
101
+ linked project — a local ductape/config.json with a product tag and env slug. The "link"
102
102
  command does NOT validate against the server: it just writes that local file. This means you
103
103
  can run ductape_cli("link --product <tag> --env <slug>") even before that environment exists on
104
104
  the product yet — do not treat "no linked environment exists server-side" as a reason to avoid
@@ -235,6 +235,36 @@ There are THREE categories of operations. Use the right tool for each:
235
235
  - For cloud-linked envs, set config.cloud to the connection tag for that env and
236
236
  omit raw credentials; the cloud connection must exist for that env too.
237
237
 
238
+ ⚠ PERSIST AGAINST AN ALREADY-REGISTERED COMPONENT TAG CAN SILENTLY NO-OP:
239
+ import-persist-all / provision-persist-all call the component's create method first and only
240
+ fall back to update if create throws. Depending on platform version, create against an existing
241
+ tag can resolve successfully without changing anything instead of throwing — so the response can
242
+ report success (and, for provision, a real cloud resource gets created) while the Ductape
243
+ component record is left completely unchanged, still pointing at whatever it pointed at before.
244
+ Never trust a success response alone when persisting against an existing tag:
245
+ 1. ALWAYS re-fetch the component immediately after — ductape_cli("resources <type> get -t <tag> --json")
246
+ 2. Diff the fields you meant to change (e.g. envs[].config.cloud) against what you intended.
247
+ 3. If unchanged, treat the persist as failed even though it reported success, and say so —
248
+ do not retry the same call in a loop; report it and ask before continuing.
249
+
250
+ ⚠ DUCTAPE NEVER DEPROVISIONS REAL CLOUD RESOURCES — THIS IS INTENTIONAL, NOT A GAP:
251
+ There is no verb, flag, or code path anywhere in Ductape (CLI, SDK, or backend) that deletes an
252
+ actual cloud resource (a GCS/S3 bucket, a Pub/Sub/SNS topic, a database instance, etc.). This is a
253
+ deliberate product decision — auto-deprovisioning real infrastructure risks destroying real data,
254
+ so that responsibility is left entirely to the human operator via the cloud provider's own console
255
+ or CLI (gcloud, aws, az, …). Concretely:
256
+ - ductape_cli("resources <type> delete -t <tag>") only clears Ductape's own catalog record
257
+ (soft delete). It never touches the underlying cloud resource — that resource still exists and
258
+ still costs money/still needs manual cleanup after this call succeeds.
259
+ - provision-persist(-all) and import-persist(-all) create/link real cloud resources but there
260
+ is no symmetric "deprovision" or "cloud resources delete" operation — attempting
261
+ ductape_cli("cloud resources delete ...") returns a clear error explaining this by design.
262
+ - If a provisioning attempt fails partway through, or a component is deleted, any real cloud
263
+ resources it created are orphaned and will keep existing (and accruing cost) until the operator
264
+ deletes them manually. Surface this to the user explicitly rather than treating it as something
265
+ this tooling can clean up — do not propose scripting cloud-provider deletes on the user's behalf
266
+ unless they explicitly ask for that as a separate, one-off action outside of Ductape.
267
+
238
268
  2. RUNTIME OPERATIONS (run, dispatch, execute, start, send, produce, query, insert, update, delete…)
239
269
  The "input" field shape is product- and operation-specific — it is NOT derivable from Joi validators.
240
270
  It is defined by how the product's action/feature/session/quota/etc. was configured in Ductape.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ductape/mcp",
3
- "version": "0.2.10",
3
+ "version": "0.2.12",
4
4
  "description": "MCP server that exposes Ductape SDK operations via the backend proxy",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -15,7 +15,7 @@
15
15
  ],
16
16
  "scripts": {
17
17
  "build": "tsc",
18
- "test": "npm run build && node scripts/check-cli-command-security.mjs && node scripts/check-frontend-analytics-guidance.mjs && node scripts/check-events-discovery.mjs && node scripts/check-schema-fallback.mjs && node scripts/check-portable-functions.mjs",
18
+ "test": "npm run build && node scripts/check-cli-command-security.mjs && node scripts/check-frontend-analytics-guidance.mjs && node scripts/check-events-discovery.mjs && node scripts/check-schema-fallback.mjs && node scripts/check-portable-functions.mjs && node scripts/check-project-link-guidance.mjs",
19
19
  "start": "node dist/index.js",
20
20
  "dev": "tsx src/index.ts"
21
21
  },