node-autotask 0.26.0 → 0.28.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.
- package/CHANGELOG.md +83 -0
- package/MCP_TOOL_CATALOG.json +941 -14
- package/MCP_TOOL_MANIFEST.md +71 -16
- package/N8N_MCP_MANIFEST.json +91 -10
- package/N8N_MCP_MANIFEST.md +14 -11
- package/README.md +11 -9
- package/capabilities.json +13623 -7738
- package/capabilities.schema.json +125 -0
- package/dist/capabilities.cjs +2 -2
- package/dist/capabilities.js +1 -1
- package/dist/{chunk-QXWIQ67O.js → chunk-6EQSXYRW.js} +13622 -7737
- package/dist/{chunk-HQGE4WAV.cjs → chunk-D5IVS6GY.cjs} +1054 -235
- package/dist/{chunk-5OGJTS2E.cjs → chunk-GUY2KK7U.cjs} +157 -136
- package/dist/{chunk-SSUECUVN.js → chunk-IRVZGW5K.js} +947 -128
- package/dist/{chunk-7DOSJS6S.js → chunk-O2D7KDDD.js} +23 -2
- package/dist/{chunk-VVQ6NJYZ.js → chunk-SYX6EWMT.js} +694 -76
- package/dist/{chunk-SG4LIVMG.cjs → chunk-WYKGD5UD.cjs} +1189 -571
- package/dist/{chunk-WM6E5O55.cjs → chunk-ZEGMVEF3.cjs} +13622 -7737
- package/dist/{index-CKYr0unq.d.cts → index-CORcZUNm.d.cts} +457 -50
- package/dist/{index-1zBdJIEy.d.cts → index-DQ9NgraW.d.cts} +281 -1
- package/dist/{index-1zBdJIEy.d.ts → index-DQ9NgraW.d.ts} +281 -1
- package/dist/{index-C8QH3BkP.d.ts → index-DXuV04zM.d.ts} +457 -50
- package/dist/index.cjs +44 -24
- package/dist/index.d.cts +11 -5
- package/dist/index.d.ts +11 -5
- package/dist/index.js +26 -6
- package/dist/operations/index.cjs +147 -120
- package/dist/operations/index.d.cts +136 -7
- package/dist/operations/index.d.ts +136 -7
- package/dist/operations/index.js +33 -6
- package/dist/pool.cjs +42 -9
- package/dist/pool.d.cts +14 -3
- package/dist/pool.d.ts +14 -3
- package/dist/pool.js +38 -5
- package/dist/resources/index.cjs +19 -5
- package/dist/resources/index.d.cts +2 -2
- package/dist/resources/index.d.ts +2 -2
- package/dist/resources/index.js +18 -4
- package/dist/types/index.cjs +1 -1
- package/dist/types/index.d.cts +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.js +1 -1
- package/docs/API.md +246 -10
- package/examples/mcp/schemas.ts +16 -7
- package/package.json +1 -1
- /package/dist/{chunk-S643FDOR.cjs → chunk-IXF7AKOJ.cjs} +0 -0
- /package/dist/{chunk-2TWKEB2L.js → chunk-RMG55JTF.js} +0 -0
- /package/dist/{chunk-W3K5BEVY.cjs → chunk-SDYRQFGL.cjs} +0 -0
- /package/dist/{chunk-EBCHCNPK.js → chunk-WLTLB2ND.js} +0 -0
package/N8N_MCP_MANIFEST.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# N8N MCP Manifest — node-autotask (consumer projection)
|
|
2
2
|
|
|
3
|
-
<!-- GENERATED by scripts/project-n8n-mcp.mjs at 2026-10-
|
|
3
|
+
<!-- GENERATED by scripts/project-n8n-mcp.mjs at 2026-10-26T07:54:09.279Z — do not hand-edit. -->
|
|
4
4
|
|
|
5
5
|
The n8n CONSUMER projection of the capability registry: the canonical source for what the
|
|
6
6
|
n8n-side MCP tools must expose. The SDK is canonical — this is a projection of it, never a
|
|
@@ -23,7 +23,7 @@ user's n8n instances; PROD is read-only for any verification).
|
|
|
23
23
|
|
|
24
24
|
| tool | mode | entity | readOnlyHint | destructiveHint | idempotentHint | openWorldHint | operations |
|
|
25
25
|
|------|------|--------|--------------|-----------------|----------------|---------------|------------|
|
|
26
|
-
| `autotask_ticket` | read | ticket | true | false | true | true |
|
|
26
|
+
| `autotask_ticket` | read | ticket | true | false | true | true | 16 |
|
|
27
27
|
| `autotask_ticket_write` | write | ticket | false | false | false | true | 4 |
|
|
28
28
|
| `autotask_contact` | read | contact | true | false | true | true | 10 |
|
|
29
29
|
| `autotask_contact_write` | write | contact | false | false | false | true | 4 |
|
|
@@ -36,16 +36,17 @@ user's n8n instances; PROD is read-only for any verification).
|
|
|
36
36
|
| `autotask_resource` | read | resource | true | false | true | true | 9 |
|
|
37
37
|
| `autotask_resource_write` | write | resource | false | false | false | true | 2 |
|
|
38
38
|
| `autotask_timeEntry` | read | timeEntry | true | false | true | true | 24 |
|
|
39
|
-
| `autotask_timeEntry_write` | write | timeEntry | false | false | false | true |
|
|
39
|
+
| `autotask_timeEntry_write` | write | timeEntry | false | false | false | true | 5 |
|
|
40
40
|
|
|
41
41
|
### `autotask_ticket` (read — ticket)
|
|
42
42
|
|
|
43
|
-
> Read ticket records (mode: read — effect=read operations only; zero mutating requests, ungated by design). Registry operations for tickets: count: Count ticket records matching a JSON filter. | findByTicketNumber: Find a ticket by its ticketNumber. | fullContext: Get the full context of one ticket in a single call: the ticket, its company, contact, assigned resource and project, plus its notes, time entries, attachment metadata and (opt-in) histories — every part separately reported. | get: Get one Ticket by id. | getContext: Get a ticket with its primary context records in one call. | getEntityInfo: Get the Ticket capability metadata (canCreate/canUpdate/hasUserDefinedFields/...). | getFieldInfo: Get the Ticket field catalog (types, picklists, required, maxLength) — the full raw field dump (the largest read of the info trio; compact discovery: operations.fieldCatalog). | getUdfInfo: Get the Ticket user-defined-field catalog. | query: Query Ticket records with a JSON filter. | resolve: Resolve a Ticket from a numeric id (the direct fetch, tried first) or an exact value of its primary text field(s) (title — exact match only). Returns the Ticket record with the numeric id for get/update/delete. Other identifier forms (e.g. an email address) are NOT tried by resolve — use the resource's dedicated lookup op where one exists (see autotask_catalog). | search: Search ticket records by text (a vendor contains filter on title only — the vendor exposes no free-text search and no matched-field reporting). | slaHealthCheck: Run the SLA health check for a ticket (numeric ticket id). | summary: Get a one-call summary of a ticket (numeric ticket id). | timeline: Get the event timeline of a ticket (numeric ticket id).. Bounds: Bounded: server-side pagination — up to limit records (default 500, max 2500) in one call; 1000-page guard; hasMore flags a truncation. Bounded: limit default 25, max 500. Errors carry the SDK error contract: code, category, retryable, operation, httpStatus, suggestedAction (the nextAction directive — follow the directive), correlationId, vendorError (when the vendor returned a response body — the deep-redacted body, host-sourced text wrapped as untrusted content when untrusted-wrapping is on); credentials never appear in an error message.
|
|
43
|
+
> Read ticket records (mode: read — effect=read operations only; zero mutating requests, ungated by design). Registry operations for tickets: count: Count ticket records matching a JSON filter. | findByTicketNumber: Find a ticket by its ticketNumber. | forResource: List the tickets a resource is assigned to — as primary owner, as a secondary resource, or both — de-duplicated, with the four reconciling counts and an optional open-only filter that uses the tenant's own closed-status set. | fullContext: Get the full context of one ticket in a single call: the ticket, its company, contact, assigned resource and project, plus its notes, time entries, attachment metadata and (opt-in) histories — every part separately reported. | get: Get one Ticket by id. | getContext: Get a ticket with its primary context records in one call. | getEntityInfo: Get the Ticket capability metadata (canCreate/canUpdate/hasUserDefinedFields/...). | getFieldInfo: Get the Ticket field catalog (types, picklists, required, maxLength) — the full raw field dump (the largest read of the info trio; compact discovery: operations.fieldCatalog). | getUdfInfo: Get the Ticket user-defined-field catalog. | query: Query Ticket records with a JSON filter. | resolve: Resolve a Ticket from a numeric id (the direct fetch, tried first) or an exact value of its primary text field(s) (title — exact match only). Returns the Ticket record with the numeric id for get/update/delete. Other identifier forms (e.g. an email address) are NOT tried by resolve — use the resource's dedicated lookup op where one exists (see autotask_catalog). | search: Search ticket records by text (a vendor contains filter on title only — the vendor exposes no free-text search and no matched-field reporting). | slaHealthCheck: Run the SLA health check for a ticket (numeric ticket id). | statusSemantics: Report the ticket status picklist and the ids this SDK treats as CLOSED for the caller's tenant, with the provenance of that set (read from the tenant's picklist, or the documented assumed fallback). | summary: Get a one-call summary of a ticket (numeric ticket id). | timeline: Get the event timeline of a ticket (numeric ticket id).. Bounds: Bounded: server-side pagination — up to limit records (default 500, max 2500) in one call; 1000-page guard; hasMore flags a truncation. Bounded: limit default 25, max 500. Errors carry the SDK error contract: code, category, retryable, operation, httpStatus, suggestedAction (the nextAction directive — follow the directive), correlationId, vendorError (when the vendor returned a response body — the deep-redacted body, host-sourced text wrapped as untrusted content when untrusted-wrapping is on); credentials never appear in an error message.
|
|
44
44
|
|
|
45
45
|
| backingOperation | verb | effect | flags | requiredArgs | purpose |
|
|
46
46
|
|------------------|------|--------|-------|--------------|---------|
|
|
47
47
|
| `tickets.count` | count | read | — | none | Count ticket records matching a JSON filter. |
|
|
48
48
|
| `tickets.findByTicketNumber` | findByTicketNumber | read | — | value | Find a ticket by its ticketNumber. |
|
|
49
|
+
| `tickets.forResource` | forResource | read | — | resourceID | List the tickets a resource is assigned to — as primary owner, as a secondary resource, or both — de-duplicated, with the four reconciling counts and an optional open-only filter that uses the tenant's own closed-status set. |
|
|
49
50
|
| `tickets.fullContext` | fullContext | read | — | id | Get the full context of one ticket in a single call: the ticket, its company, contact, assigned resource and project, plus its notes, time entries, attachment metadata and (opt-in) histories — every part separately reported. |
|
|
50
51
|
| `tickets.get` | get | read | — | id | Get one Ticket by id. |
|
|
51
52
|
| `tickets.getContext` | getContext | read | — | id | Get a ticket with its primary context records in one call. |
|
|
@@ -56,6 +57,7 @@ user's n8n instances; PROD is read-only for any verification).
|
|
|
56
57
|
| `tickets.resolve` | resolve | read | — | identifier | Resolve a Ticket from a numeric id (the direct fetch, tried first) or an exact value of its primary text field(s) (title — exact match only). Returns the Ticket record with the numeric id for get/update/delete. Other identifier forms (e.g. an email address) are NOT tried by resolve — use the resource's dedicated lookup op where one exists (see autotask_catalog). |
|
|
57
58
|
| `tickets.search` | search | read | — | query | Search ticket records by text (a vendor contains filter on title only — the vendor exposes no free-text search and no matched-field reporting). Bounded: limit default 25, max 500. |
|
|
58
59
|
| `tickets.slaHealthCheck` | slaHealthCheck | read | — | id | Run the SLA health check for a ticket (numeric ticket id). |
|
|
60
|
+
| `tickets.statusSemantics` | statusSemantics | read | — | none | Report the ticket status picklist and the ids this SDK treats as CLOSED for the caller's tenant, with the provenance of that set (read from the tenant's picklist, or the documented assumed fallback). |
|
|
59
61
|
| `tickets.summary` | summary | read | — | id | Get a one-call summary of a ticket (numeric ticket id). |
|
|
60
62
|
| `tickets.timeline` | timeline | read | — | id | Get the event timeline of a ticket (numeric ticket id). |
|
|
61
63
|
|
|
@@ -245,12 +247,13 @@ Tool input: {"operation":{"type":"string","enum":["transferOwnership","update"]}
|
|
|
245
247
|
|
|
246
248
|
### `autotask_timeEntry_write` (write — timeEntry)
|
|
247
249
|
|
|
248
|
-
> Write timeEntry records (mode: write — the registry operations with effect=write for time_entries: create, createForResource, createIfNotExists, update). Writes are dry-run first: dry_run defaults to true — the request is validated against the registry inputSchema and a DryRunResult envelope is returned; the mutating request is never issued unless the caller passes confirm (the n8n-side handler must force dry-run unless confirm is present, mirroring the SDK governor). Destructive operations are refused without the confirm flag — confirm must equal the operation key exactly (the deliberate act is the call). The n8n consumer surface excludes destructive operations by curation default (excludeDestructive); they remain available on the canonical SDK server (autotask_delete / per-op tools). By curation default (excludeDestructive) no destructive operation is included; destructive capability remains on the canonical SDK server surface. Per-operation required arguments: create [data]; createForResource [resourceID, params]; createIfNotExists [data]; update [id, data]. Errors carry the SDK error contract: code, category, retryable, operation, httpStatus, suggestedAction (the nextAction directive — follow the directive), correlationId, vendorError (when the vendor returned a response body — the deep-redacted body, host-sourced text wrapped as untrusted content when untrusted-wrapping is on); credentials never appear in an error message.
|
|
250
|
+
> Write timeEntry records (mode: write — the registry operations with effect=write for time_entries: approve, create, createForResource, createIfNotExists, update). Writes are dry-run first: dry_run defaults to true — the request is validated against the registry inputSchema and a DryRunResult envelope is returned; the mutating request is never issued unless the caller passes confirm (the n8n-side handler must force dry-run unless confirm is present, mirroring the SDK governor). Destructive operations are refused without the confirm flag — confirm must equal the operation key exactly (the deliberate act is the call). The n8n consumer surface excludes destructive operations by curation default (excludeDestructive); they remain available on the canonical SDK server (autotask_delete / per-op tools). By curation default (excludeDestructive) no destructive operation is included; destructive capability remains on the canonical SDK server surface. Per-operation required arguments: approve [id]; create [data]; createForResource [resourceID, params]; createIfNotExists [data]; update [id, data]. Errors carry the SDK error contract: code, category, retryable, operation, httpStatus, suggestedAction (the nextAction directive — follow the directive), correlationId, vendorError (when the vendor returned a response body — the deep-redacted body, host-sourced text wrapped as untrusted content when untrusted-wrapping is on); credentials never appear in an error message.
|
|
249
251
|
|
|
250
|
-
Tool input: {"operation":{"type":"string","enum":["create","createForResource","createIfNotExists","update"]},"data":{"type":"object","ref":"time_entries body (see types)"},"resourceID":{"type":"number | string"},"params":{"type":"object — the smart-create params: { internallAllocationCodeID?: number (pin the internal linkage code), ticketID?: number, taskID?: number, roleID?: number (pin the task/ticket roleID — vendor-validated as an allocation code), dateWorked?: UTC YYYY-MM-DD, startDateTime?: UTC ISO, endDateTime?: UTC ISO, hoursWorked?: number, + any other vendor TimeEntry field } (exactly one linkage pin; none → the default internal linkage with the node-resolved code)"},"
|
|
252
|
+
Tool input: {"operation":{"type":"string","enum":["approve","create","createForResource","createIfNotExists","update"]},"id":{"type":"number | string"},"data":{"type":"object","ref":"time_entries body (see types)"},"resourceID":{"type":"number | string"},"params":{"type":"object — the smart-create params: { internallAllocationCodeID?: number (pin the internal linkage code), ticketID?: number, taskID?: number, roleID?: number (pin the task/ticket roleID — vendor-validated as an allocation code), dateWorked?: UTC YYYY-MM-DD, startDateTime?: UTC ISO, endDateTime?: UTC ISO, hoursWorked?: number, + any other vendor TimeEntry field } (exactly one linkage pin; none → the default internal linkage with the node-resolved code)"},"dry_run":{"type":"boolean","default":true,"note":"true (the default) = the pinned DryRunResult envelope; the mutating request is never issued. The handler must force dry-run unless confirm is present."},"confirm":{"type":"string","note":"The operation key (e.g. \"tickets.create\") — its presence lifts the dry run. For destructive/approval-gated operations confirm must equal the operation key exactly; the call is refused pre-request without it."}} (required: operation)
|
|
251
253
|
|
|
252
254
|
| backingOperation | verb | effect | flags | requiredArgs | purpose |
|
|
253
255
|
|------------------|------|--------|-------|--------------|---------|
|
|
256
|
+
| `time_entries.approve` | approve | write | — | id | Approve a time entry (the REST-only approval path): create the BillingItemApprovalLevels record, apply the vendor-documented follow-up update of BillingApprovalDateTime + BillingApprovalResourceID, then read the entry back and report whether the vendor accepted it. Dry-run first (dry_run). |
|
|
254
257
|
| `time_entries.create` | create | write | — | data | Create a time entry. Dry-run first (dry_run). |
|
|
255
258
|
| `time_entries.createForResource` | createForResource | write | — | resourceID, params | Create a time entry for a resource with the allocation-code dependency resolved by the node: it verifies the resource is active, honours the caller's linkage pin (else the default internal linkage), resolves an EXISTING active allocation code applicable to the resource (never creates one — the API user cannot), and posts the vendor-valid body. Dry-run first (dry_run). |
|
|
256
259
|
| `time_entries.createIfNotExists` | createIfNotExists | write | — | data | Create a TimeEntry. Dry-run first (dry_run). |
|
|
@@ -271,19 +274,19 @@ only via a recorded change to `n8n-mcp.curation.json`.
|
|
|
271
274
|
|
|
272
275
|
## Stats
|
|
273
276
|
|
|
274
|
-
- registryRecords:
|
|
277
|
+
- registryRecords: 1277
|
|
275
278
|
- curatedEntities: 7
|
|
276
279
|
- includedEntities: 7
|
|
277
280
|
- readTools: 7
|
|
278
281
|
- writeTools: 7
|
|
279
282
|
- totalTools: 14
|
|
280
|
-
- readOperations:
|
|
281
|
-
- writeOperations:
|
|
283
|
+
- readOperations: 87
|
|
284
|
+
- writeOperations: 22
|
|
282
285
|
- approvalGatedWrites: 2
|
|
283
286
|
- destructiveExcluded: 4
|
|
284
287
|
|
|
285
288
|
## Meta
|
|
286
289
|
|
|
287
|
-
- generatedAt: 2026-10-
|
|
288
|
-
- capabilitiesHash:
|
|
290
|
+
- generatedAt: 2026-10-26T07:54:09.279Z
|
|
291
|
+
- capabilitiesHash: 246ea3a90022972a2a63bc2131ba631b47a664f7f2c000c4f08dc0b380d5ebfa
|
|
289
292
|
- curationHash: e19117ce73e38d9aded3be7e7f077a4e185d2e10294622b76c17d67f63cf9e3b
|
package/README.md
CHANGED
|
@@ -4,7 +4,7 @@ Fully-typed TypeScript SDK for the Autotask (Datto) PSA REST API. Zero runtime
|
|
|
4
4
|
dependencies. Built for building MCP servers and integrations.
|
|
5
5
|
|
|
6
6
|
The SDK is also the **deterministic execution layer for agents** (ARCHITECTURE
|
|
7
|
-
section 19): a generated capability registry (
|
|
7
|
+
section 19): a generated capability registry (1275 operations across the 121-entity
|
|
8
8
|
MVP set), a mechanical MCP substrate (registry → manifest → overrides → core tier +
|
|
9
9
|
catalog meta-tool), and a write governor (dry-run-first, destructive
|
|
10
10
|
confirmation). The SDK boundary also redacts response field values — the
|
|
@@ -288,7 +288,9 @@ The SDK ships the mechanical substrate, not a server (no MCP imports, no zod):
|
|
|
288
288
|
destructive ones; the plan-derived `untrustedFields` read tools additionally
|
|
289
289
|
carry the untrusted-content sentence + the field list as the `x-untrusted`
|
|
290
290
|
output-schema extension (issue #1 — externally-sourced free text is
|
|
291
|
-
marker-wrapped in the projection; the SDK primitives stay raw)
|
|
291
|
+
marker-wrapped in the projection; the SDK primitives stay raw); the
|
|
292
|
+
cross-resource tools carry `["*"]` rather than the union (the per-resource
|
|
293
|
+
lists are the authority, and the served surface has a hard token budget).
|
|
292
294
|
3. **Overrides** — [`MCP_TOOL_OVERRIDES.json`](./MCP_TOOL_OVERRIDES.json): the ONLY
|
|
293
295
|
place a curation delta may live (`{ tool, field, newValue, reason }`); silent
|
|
294
296
|
divergence between projection and curation is a defect; the delta file is reviewed
|
|
@@ -344,10 +346,10 @@ The SDK ships the mechanical substrate, not a server (no MCP imports, no zod):
|
|
|
344
346
|
governor place: `src/operations/invoke.ts`).
|
|
345
347
|
|
|
346
348
|
**Harness approval policy (recommended).** Require approval on every tool
|
|
347
|
-
whose MCP annotation is `readOnlyHint !== true` — today exactly **
|
|
348
|
-
tools**: the
|
|
349
|
+
whose MCP annotation is `readOnlyHint !== true` — today exactly **267
|
|
350
|
+
tools**: the 265 dedicated write/delete tools (209 `effect=write` + 56
|
|
349
351
|
`effect=destructive`, every one of them has a dedicated tool) +
|
|
350
|
-
`autotask_write` + `autotask_delete`. The remaining **
|
|
352
|
+
`autotask_write` + `autotask_delete`. The remaining **631 tools** (the 618
|
|
351
353
|
dedicated read tools + the 10 core read tools + `autotask_read` +
|
|
352
354
|
`autotask_catalog` + `autotask_describe`) all carry `readOnlyHint: true`
|
|
353
355
|
and are safe ungated: every op they can route is `effect=read` (zero
|
|
@@ -359,7 +361,7 @@ The SDK ships the mechanical substrate, not a server (no MCP imports, no zod):
|
|
|
359
361
|
`contacts.moveToCompany`, `resources.transferOwnership`) require the same
|
|
360
362
|
confirm inside `autotask_write`. Migration: `autotask_invoke` is REPLACED
|
|
361
363
|
by `autotask_read`/`autotask_write`/`autotask_delete` — update harness
|
|
362
|
-
config (approve the
|
|
364
|
+
config (approve the 267 above) and remove any `autotask_invoke` entry. The
|
|
363
365
|
rule is derivable from the registry `effect` column (and the mode tools'
|
|
364
366
|
fixed annotations) — it never needs a hand-maintained name list.
|
|
365
367
|
|
|
@@ -413,7 +415,7 @@ The SDK ships the mechanical substrate, not a server (no MCP imports, no zod):
|
|
|
413
415
|
source.
|
|
414
416
|
|
|
415
417
|
7. **Agent QoL surface (the stage-12 issue wave, live-verified on ww29)** —
|
|
416
|
-
the zero-wire planning reads `operations.blindSurfaces` (the
|
|
418
|
+
the zero-wire planning reads `operations.blindSurfaces` (the 124-surface
|
|
417
419
|
blind/data inventory) and `operations.createGuidance` (per-child zone
|
|
418
420
|
facts with verbatim vendor evidence), the bounded live
|
|
419
421
|
`operations.probeReachability` sweep (confirm-gated, over-cap refuses),
|
|
@@ -453,7 +455,7 @@ The SDK ships the mechanical substrate, not a server (no MCP imports, no zod):
|
|
|
453
455
|
## Partial-update merge (collectionUpdate resources)
|
|
454
456
|
|
|
455
457
|
The vendor's top-level **collection PUT** validates the **FULL model**: a partial body is
|
|
456
|
-
rejected with a 500 `Missing Required Field`. This applies to the **
|
|
458
|
+
rejected with a 500 `Missing Required Field`. This applies to the **45 top-level update ops**
|
|
457
459
|
whose spec defines no item-path write (the `collectionUpdate` class — the flag is derived from
|
|
458
460
|
`api-docs.json` by the shared `scripts/lib/collection-update.mjs`, stamped into both the
|
|
459
461
|
generated resource config and the registry record's `metadata.collectionUpdate`, and pinned by
|
|
@@ -519,7 +521,7 @@ node-parity paths the vendored swagger lacks, all UNVERIFIED-live this run), and
|
|
|
519
521
|
| `npm run capabilities:check` | `scripts/check-capabilities.mjs` — the batch gate (missing/incomplete/stale records → exit 1) |
|
|
520
522
|
| `npm run public-surface` | `scripts/public-surface.mjs` — capture (`--write`) / verify the public API surface baseline; default mode fails on unannounced removals, **and** checks the BUILT surface: every tsup entry has a matching `exports` key (and vice versa), every declared target was emitted and loads (ESM+CJS), and no runtime dependency leaks into `dist` |
|
|
521
523
|
| `npm run live-smoke` | `scripts/live-smoke.mjs` — read-only live smoke: 5 vendor probes (5-6 wire calls worst case: 4 GET + 1 bounded query that may walk a 2nd, empty page) + a zero-network shape guard; `--dry` prints the plan with no calls (DRY-RUN-ONLY verdict, exit 0); live via `AUTOTASK_*` env — missing/partial credentials hard-fail exit 2 |
|
|
522
|
-
| `npm run live-coverage` | `scripts/live-coverage.mjs` — the live coverage sweep over all
|
|
524
|
+
| `npm run live-coverage` | `scripts/live-coverage.mjs` — the live coverage sweep over all 1275 registry ops (`--dry`: full call plan, no calls; live: bounded reads for real, mutations `dryRun: true` only — zero mutating requests, every governor-gated row (the 54 delete dry-runs included) routed through invoke with `confirm`; budget <= 1161 plan-honest / <= 1315 wire-honest worst case) |
|
|
523
525
|
| `npm run mcp:project` | `scripts/project-mcp-tools.mjs` — mechanical MCP projection → `MCP_TOOL_MANIFEST.md` (`:check` verifies) |
|
|
524
526
|
| `npm run n8n:project` / `n8n:project:check` | `scripts/project-n8n-mcp.mjs` — the n8n consumer projection from the SAME registry → `N8N_MCP_MANIFEST.json`/`.md` (`--check` rebuilds and diffs; the gate is wired into `verify`) |
|
|
525
527
|
| `npm run catalog:build` / `catalog:check` | `scripts/build-tool-catalog.mjs` — the catalog meta-tool row data → `MCP_TOOL_CATALOG.json` + mechanical CORE profile (`--check` verifies drift) |
|