@usecoil/skill-claude 0.1.2 → 0.1.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/README.md CHANGED
@@ -7,7 +7,7 @@ installed CLI and installs the compatible `@usecoil/cli` package when
7
7
  `coil` is not already available:
8
8
 
9
9
  ```bash
10
- npx --yes @usecoil/skill-claude@0.1.2 --base-url https://www.usecoil.com
10
+ npx --yes @usecoil/skill-claude@0.1.3 --base-url https://www.usecoil.com
11
11
  coil config set-base-url https://www.usecoil.com --profile prod
12
12
  printf '%s' "$COIL_API_KEY" | coil auth login --profile prod --key -
13
13
  coil --profile prod agent-context --json
package/bin/install.mjs CHANGED
@@ -307,6 +307,12 @@ function checkCli() {
307
307
  && fetchCount?.required === true
308
308
  && fetchCount?.minimum === 1
309
309
  && fetchCount?.maximum === 25;
310
+ const hasCommand = (group, name) => Array.isArray(context.commands?.[group]?.commands)
311
+ && context.commands[group].commands.some((command) => command?.name === name);
312
+ const hasLeadImport = hasCommand('leads', 'leads import');
313
+ const hasImportOutcomes = hasCommand('recipes', 'recipe-runs import-outcomes');
314
+ const hasImportedLeads = hasCommand('recipes', 'recipe-runs leads');
315
+ const hasNamedAgents = hasCommand('agents', 'agents list');
310
316
  const compatible = contextResult.status === 0
311
317
  && context.cli?.name === 'coil'
312
318
  && context.cli?.version === version.replace(/^v/, '')
@@ -314,7 +320,11 @@ function checkCli() {
314
320
  && hasSpendGate
315
321
  && hasStarterCap
316
322
  && Array.isArray(context.commands?.recipes?.commands)
317
- && context.commands.recipes.commands.some((command) => command?.name === 'recipes run');
323
+ && context.commands.recipes.commands.some((command) => command?.name === 'recipes run')
324
+ && hasLeadImport
325
+ && hasImportOutcomes
326
+ && hasImportedLeads
327
+ && hasNamedAgents;
318
328
  return {
319
329
  ok: Boolean(compatible),
320
330
  present: true,
@@ -561,7 +571,7 @@ if (!cli.ok) {
561
571
  if (!cli.ok) {
562
572
  const rollbackFailed = installedCli && !rollbackCliInstall();
563
573
  const detail = cli.reason ?? (cli.version ? `Found ${cli.version}; supported versions are ${SUPPORTED_CLI_RANGE}.` : 'No coil executable was found.');
564
- console.error(`Error: ${detail} Install @usecoil/cli ${PUBLIC_CLI_SPEC} from the public npm registry, or rerun with --cli-package <path-to-reviewed-tarball>.`);
574
+ console.error(`Error: ${detail} Install ${PUBLIC_CLI_SPEC} from the public npm registry, or rerun with --cli-package <path-to-reviewed-tarball>.`);
565
575
  if (rollbackFailed) console.error('Warning: automatic rollback of the newly installed Coil CLI failed; remove @usecoil/cli manually.');
566
576
  process.exit(1);
567
577
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@usecoil/skill-claude",
3
- "version": "0.1.2",
3
+ "version": "0.1.3",
4
4
  "description": "Claude Code skill package for Coil agent workflows",
5
5
  "type": "module",
6
6
  "bin": {
@@ -28,7 +28,7 @@
28
28
  },
29
29
  "coilCompatibility": {
30
30
  "cli": "0.1.x",
31
- "preferredVersion": "0.1.2"
31
+ "preferredVersion": "0.1.4"
32
32
  },
33
33
  "coilRuntime": {
34
34
  "name": "claude",
package/skill/SKILL.md CHANGED
@@ -16,7 +16,7 @@ it can do:
16
16
 
17
17
  ```bash
18
18
  if ! command -v coil >/dev/null 2>&1; then
19
- npm install --global @usecoil/cli@0.1.2
19
+ npm install --global @usecoil/cli@0.1.4
20
20
  fi
21
21
  coil --version
22
22
  ```
@@ -77,7 +77,7 @@ The runtime-specific installer or registry handles placement; Coil operations
77
77
  always use the same public JSON CLI:
78
78
 
79
79
  ```bash
80
- npm install --global @usecoil/cli@0.1.2
80
+ npm install --global @usecoil/cli@0.1.4
81
81
  coil config set-base-url https://www.usecoil.com --profile prod
82
82
  printf '%s' "$COIL_API_KEY" | coil auth login --profile prod --key -
83
83
  coil --profile prod agent-context --json
@@ -124,6 +124,18 @@ result has `reconciliation_required`, relay the required reconciliation action
124
124
  verbatim and do not retry the webhook. A policy-review action means a human
125
125
  must decide the governance policy; it is not an instruction to weaken policy.
126
126
 
127
+ Provider integration status is a specific success-envelope case. When the
128
+ current credential-scoped `execution_readiness` contains a `blocked` scope,
129
+ `GET /api/integrations/{provider}` returns the same required Coil action at
130
+ `meta.human_action` and the temporary compatibility alias `data.human_action`.
131
+ The current CLI promotes one copy to top-level `human_action`; older clients
132
+ that unwrap `data` still retain the alias. Relay the Coil `url` verbatim even
133
+ when `execution_readiness[].actionUrl` is `null`. A non-null provider
134
+ `actionUrl` is a separate safe external provider-authorization link. Do not
135
+ invent, rewrite, or treat either URL as approval or authority. Automatic
136
+ `open`, `half_open`, `degraded`, `ready`, and `unknown` states do not require
137
+ this handoff.
138
+
127
139
  ## Common Workflows
128
140
 
129
141
  ### Orient
@@ -193,6 +205,23 @@ coil --profile prod recipe-runs retry <run-id> --json
193
205
 
194
206
  Publication and ambiguous-effect reconciliation require a human organization admin. If a run has an unresolved provider effect, relay the server-provided `human_action.url` from the view/wait/watch state (or `error.details.human_action` from a machine reconcile denial) verbatim. The URL opens `/dashboard/recipe-runs/{runId}` for evidence review; it is navigation only and does not prove provider acceptance or authorize a decision. Retry/cancel behavior follows the durable run state and `next_actions`, not the presence of a URL.
195
207
 
208
+ ### Lead-list imports
209
+
210
+ ```bash
211
+ coil --profile prod --json leads import ./prospects.csv --mapping '{"Work email":"email"}' --admission-key import-september-001
212
+ coil --profile prod recipe-runs view <run-id> --json
213
+ coil --profile prod recipe-runs import-outcomes <run-id> --outcome rejected --json
214
+ coil --profile prod recipe-runs leads <run-id> --json
215
+ ```
216
+
217
+ Imports accept at most 2,000 data rows and 2 MiB of CSV input. Use header
218
+ mapping for ambiguous columns and a stable admission key when a retry could be
219
+ uncertain. A `202` response means durable admission, not terminal success. Do
220
+ not report completion until the run is terminal and its outcomes and attributed
221
+ leads have been inspected. Rejected-row PII is not printed. Successful inputs
222
+ are scrubbed after completion; failed or cancelled normalized replay data is
223
+ retained for up to 30 days. The original CSV is never stored.
224
+
196
225
  ### Scrapes
197
226
 
198
227
  ```bash
@@ -11,6 +11,12 @@ Content-Type: application/json
11
11
 
12
12
  Coil organization API keys (`ak_...`) are accepted by agent-compatible routes.
13
13
 
14
+ Coil first-party credentials authenticate durable named agents. The agent ID is
15
+ the machine actor ID; the credential ID identifies only one credential.
16
+ Existing credentials were identity-preserving backfilled. Credential
17
+ administration requires a human organization admin, and permanent credential
18
+ plaintext is returned only once.
19
+
14
20
  ## Auth and Context
15
21
 
16
22
  | Method | Path | Notes |
@@ -20,6 +26,20 @@ Coil organization API keys (`ak_...`) are accepted by agent-compatible routes.
20
26
  | DELETE | `/api/auth/api-keys/{id}` | Revokes a Coil organization API key for human org admins. |
21
27
  | POST | `/api/auth/verify-key` | Verifies a Coil organization API key without exposing it. |
22
28
 
29
+ Named-agent management is human-admin only:
30
+
31
+ | Method | Path | CLI |
32
+ | --- | --- | --- |
33
+ | GET | `/api/agents` | `coil agents list --json` |
34
+ | POST | `/api/agents` | `coil agents create --name ... --json` |
35
+ | GET | `/api/agents/{id}` | `coil agents view <agent-id> --json` |
36
+ | POST | `/api/agents/{id}/setup` | `coil agents setup <agent-id> --runtime ... --profile ... --json` |
37
+ | POST | `/api/agents/{id}/credentials` | `coil agents issue-credential <agent-id> --json` |
38
+ | DELETE | `/api/agents/{id}/credentials/{credentialId}` | `coil agents revoke-credential <agent-id> <credential-id> --json` |
39
+
40
+ `--replace` changes the generated local setup command. It does not revoke an
41
+ existing credential. Replacement credentials keep the same durable agent ID.
42
+
23
43
  CLI discovery wrapper:
24
44
 
25
45
  ```bash
@@ -76,6 +96,20 @@ Machine callers can create scrapes. Admin-gated destructive routes require a hum
76
96
  | PATCH | `/api/leads/bulk` | `coil leads bulk-update --ids ... --fields '{...}' --json` |
77
97
  | POST | `/api/export/csv` | `coil leads export <scrape-id> [--filter/--view/--ids] [--output]` |
78
98
  | GET | `/api/leads/emails?scrapeId={id}` | `coil leads emails <scrape-id>` |
99
+ | POST | `/api/leads/import` | `coil --json leads import <file> [--mapping ...] [--admission-key ...]` |
100
+ | GET | `/api/recipe-runs/{id}/import-outcomes` | `coil recipe-runs import-outcomes <run-id> --outcome rejected --json` |
101
+ | GET | `/api/recipe-runs/{id}/leads` | `coil recipe-runs leads <run-id> --json` |
102
+
103
+ Lead-list imports accept at most 2,000 data rows and 2 MiB of CSV input. The
104
+ CLI maps supported headers before admission; use `--mapping` for ambiguous
105
+ headers and a stable `--admission-key` when a retry may be uncertain. A `202`
106
+ response means durable admission, not terminal success. Inspect
107
+ `coil recipe-runs view`, `coil recipe-runs import-outcomes`, and
108
+ `coil recipe-runs leads` and wait for a terminal run state before reporting
109
+ completion. The API is organization-scoped, does not retain the original CSV,
110
+ and does not print rejected-row PII. Successful inputs are scrubbed after
111
+ completion; failed or cancelled normalized replay data is retained for up to
112
+ 30 days.
79
113
 
80
114
  ## Automations
81
115
 
@@ -130,6 +164,17 @@ under `error.details.human_action`.
130
164
  | GET | `/api/integrations/smartlead/campaigns/sequences?campaignId={id}` | `coil smartlead sequences --campaign <id> --json` |
131
165
  | POST | `/api/integrations/smartlead/send` | `coil smartlead send <scrape-id> --campaign <id> --json` |
132
166
 
167
+ `GET /api/integrations/{provider}` includes current credential-scoped
168
+ `execution_readiness`. For a `blocked` scope, the response returns one
169
+ server-generated absolute Coil operator URL at canonical `meta.human_action`
170
+ and the temporary compatibility alias `data.human_action`. Relay that Coil URL
171
+ verbatim even when `execution_readiness[].actionUrl` is `null`. The CLI exposes
172
+ one top-level `human_action` in JSON and an explicit text-mode URL. A safe,
173
+ non-null `execution_readiness[].actionUrl` remains a separate provider-side
174
+ authorization link and must not be rewritten or treated as Coil approval.
175
+ `open`, `half_open`, `degraded`, `ready`, and `unknown` states do not include a
176
+ required human action.
177
+
133
178
  ## Feedback
134
179
 
135
180
  | Method | Path | CLI |
@@ -53,6 +53,23 @@ URL explicitly. Do not invent
53
53
  one when the server does not return it. Legacy Actor Lab `approval_url` remains
54
54
  available during the compatibility window.
55
55
 
56
+ ### Provider integration status
57
+
58
+ `GET /api/integrations/{provider}` reports the current credential-scoped
59
+ `execution_readiness` records. If a current scope is `blocked`, the raw API
60
+ success envelope contains the same `Human action` object at both
61
+ `meta.human_action` (canonical) and `data.human_action` (temporary compatibility
62
+ alias for clients that unwrap `data`). The current CLI exposes one copy as
63
+ top-level `human_action` in JSON and prints its label and URL explicitly in
64
+ text mode.
65
+
66
+ `execution_readiness[].actionUrl` remains the separately validated provider
67
+ authorization URL and may be `null`; it must not be copied into the Coil
68
+ action. Relay the absolute Coil URL verbatim even when the provider URL is
69
+ `null`. Only `blocked` requires this operator handoff. `open`, `half_open`,
70
+ `degraded`, `ready`, and `unknown` retain automatic retry or reconciliation
71
+ semantics and do not advertise required human intervention.
72
+
56
73
  ## Scrape
57
74
 
58
75
  | Field | Type | Notes |
@@ -146,8 +163,8 @@ Supported operators include equality, contains, empty/not-empty, booleans, and d
146
163
  | `scrape_id` | string/null | Required for scrape-scoped automation. |
147
164
  | `status` | `draft`/`published`/`disabled` | API-key agents create drafts. |
148
165
  | `created_by_actor_type` | `human`/`machine` | Actor attribution. |
149
- | `created_by_actor_id` | string | User ID or API key ID. |
150
- | `created_by_actor_name` | string/null | API key display name when available. |
166
+ | `created_by_actor_id` | string | User ID or durable Coil agent ID. |
167
+ | `created_by_actor_name` | string/null | Durable agent display name when available. |
151
168
  | `published_by_user_id` | string/null | Human admin publisher. |
152
169
  | `published_at` | ISO string/null | Publication timestamp. |
153
170
 
@@ -225,5 +242,9 @@ Settings are stored in org-scoped JSON. Common keys:
225
242
  ## Agent Caveats
226
243
 
227
244
  - API-key agents currently behave as org members, not org admins.
245
+ - A first-party credential authenticates a durable named agent. Credential IDs and agent IDs are separate; existing credentials were identity-preserving backfilled.
246
+ - Browser credential checking does not update `last_used_at` and does not prove that an external agent runtime is connected.
247
+ - Replacement uses temporary credential overlap and explicit old-credential revocation.
248
+ - Clerk organization API keys remain a separate compatibility path.
228
249
  - Admin-gated actions include destructive scrape/automation operations, automation policy management, and automation publishing.
229
250
  - Prefer `coil feedback` for platform friction discovered while operating Coil.