deepline 0.2.57 → 0.2.59

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
@@ -1,358 +1,49 @@
1
- # Deepline V2 SDK + CLI
1
+ # Deepline
2
2
 
3
- TypeScript SDK and CLI for Deepline plays, tools, and enrichment.
3
+ Deepline gives your coding agent the GTM data it needs to do useful work.
4
4
 
5
- ## Dev workflow
5
+ Give it a list of people or companies and ask it to find contact details,
6
+ LinkedIn profiles, hiring signals, job postings, or a company's tech stack. It
7
+ can enrich a CSV, research a market, or help you build a prospect list from
8
+ Claude Code, Codex, or your terminal.
6
9
 
7
- ### Prerequisites
10
+ ## What you can ask Deepline to do
8
11
 
9
- ```bash
10
- bun run dev # starts Next.js + Convex + Temporal + worker
11
- ```
12
-
13
- Wait for health: `curl http://localhost:3000/api/v2/health`
12
+ - Find the right people at a list of companies.
13
+ - Add work emails, phone numbers, and LinkedIn profiles to a CSV.
14
+ - Find companies that match your ideal customer profile.
15
+ - Research a market, its companies, and their recent signals.
14
16
 
15
- ### Auth (one-time)
17
+ ## Install
16
18
 
17
19
  ```bash
18
- ./cli-env sdk-worktree deepline auth register
20
+ npm install -g deepline@latest
21
+ deepline setup --json
19
22
  ```
20
23
 
21
- Opens browser for approval. Stores SDK CLI auth in `~/.local/deepline/<host-slug>/.env`.
22
-
23
- Check status: `./cli-env sdk-worktree deepline auth status --json`
24
-
25
- ### Making changes
26
-
27
- Edit any file in `sdk/src/` and re-run. No build step needed — `deepline-dev.ts` runs source directly via Bun.
28
-
29
- ```bash
30
- # Edit sdk/src/cli/commands/play.ts
31
- # Then immediately:
32
- ./cli-env sdk-worktree deepline plays run --file my-play.play.ts --watch
33
- ```
34
-
35
- The root `package.json` has an alias, `bun run deepline`, that runs the same
36
- source CLI without selecting a host. Use `./cli-env sdk-worktree deepline ...`
37
- for local app/worktree development so the binary and `DEEPLINE_HOST_URL` move
38
- together.
39
-
40
- ### When you need to build
24
+ Setup opens your browser so you can sign in, then installs Deepline's skills
25
+ for your coding agent. If global skill setup is unavailable, Deepline retries
26
+ with project-local skills automatically.
41
27
 
42
- Only two cases require `npm run sdk:build`:
28
+ ## Use it with an agent
43
29
 
44
- 1. **`npx --package=./sdk -- deepline`** the path used by integration tests
45
- 2. **Testing the published artifact** — verifying `dist/cli/index.mjs` works
46
-
47
- ```bash
48
- cd sdk && bun run build # or: npm run sdk:build from root
49
- ```
50
-
51
- The published npm package is intentionally thin: it ships the SDK, CLI, and the
52
- minimal local play bundler required for `plays run --file`, `plays publish`, and
53
- `enrich`, without shipping Convex or broad app/provider source snapshots.
54
-
55
- ## Env files
56
-
57
- | File | Set by | Contains |
58
- | ------------------------------------ | ------------------- | --------------------------------------- |
59
- | `~/.local/deepline/<host-slug>/.env` | SDK `auth register` | `DEEPLINE_HOST_URL`, `DEEPLINE_API_KEY` |
60
- | `.env.deepline` | Developer/agent | `DEEPLINE_HOST_URL`, `DEEPLINE_API_KEY` |
61
-
62
- The SDK CLI env contract is only `DEEPLINE_HOST_URL` and `DEEPLINE_API_KEY`.
63
- Do not route the SDK CLI through `.env`, `.env.local`, or `.env.worktree`.
64
-
65
- Config resolution order:
30
+ Paste this into Claude Code, Codex, or another coding agent:
66
31
 
67
32
  ```text
68
- host: explicit SDK option -> DEEPLINE_HOST_URL -> nearest .env.deepline -> Cowork workspace .env.deepline -> saved production auth -> https://code.deepline.com
69
- key: explicit SDK option -> DEEPLINE_API_KEY -> matching nearest .env.deepline -> matching Cowork workspace .env.deepline -> saved auth for the resolved host
70
- ```
71
-
72
- ## CLI commands
73
-
74
- ```bash
75
- ./cli-env sdk-worktree deepline health
76
- ./cli-env sdk-worktree deepline auth register
77
- ./cli-env sdk-worktree deepline auth status
78
- ./cli-env sdk-worktree deepline tools list
79
- ./cli-env sdk-worktree deepline tools get test_rate_limit
80
- ./cli-env sdk-worktree deepline tools describe test_rate_limit
81
- ./cli-env sdk-worktree deepline tools execute test_rate_limit --input '{"key":"stripe.com"}'
82
- ./cli-env sdk-worktree deepline plays run my-play.play.ts --input '{}' --watch
83
- ./cli-env sdk-worktree deepline plays run company-lookup --input '{}' --watch
84
- ./cli-env sdk-worktree deepline plays get company-lookup --json
85
- ./cli-env sdk-worktree deepline plays versions company-lookup --json
86
- ./cli-env sdk-worktree deepline runs list --play company-lookup --status failed --json
87
- ./cli-env sdk-worktree deepline runs get run_123 --json
88
- ./cli-env sdk-worktree deepline runs tail run_123 --json
89
- ./cli-env sdk-worktree deepline runs stop run_123 --reason "no longer needed" --json
90
- ./cli-env sdk-worktree deepline plays publish my-play.play.ts --latest --json
91
- ./cli-env sdk-worktree deepline update
92
- ```
93
-
94
- `tools describe` is the compact tool contract, `tools get` is a compatibility
95
- alias for `tools describe`, and `tools execute` runs an atomic tool. The SDK CLI
96
- does not expose the legacy `tools run` alias. Unknown `plays run` flags such as
97
- `--limit 5` are passed into the play input object. CSV file inputs should be
98
- passed through `--input`, matching the play contract, for example
99
- `--input '{"file":"leads.csv"}'` for `ctx.csv(input.file)`.
100
-
101
- ## Public play entrypoints
102
-
103
- These are the public ways to run plays. They intentionally map to the external
104
- surfaces we exercise in CI:
105
-
106
- 1. CLI
107
- - Repo-local Bun/source CLI: `bun sdk/bin/deepline-dev.ts plays run ...`
108
- - Repo script alias: `bun run deepline -- plays run ...`
109
- - Installed CLI: `deepline plays run ...`
110
- 2. Programmatic SDK convenience client
111
- - `client.runPlay(...)`
112
- - `client.runs.get(runId)`
113
- - `client.runs.list({ play: name })`
114
- - `client.runs.tail(runId)`
115
- - `client.runs.stop(runId, { reason })`
116
- 3. Connected SDK context (outside a running play)
117
- - `ctx.play(name).run(...)`
118
- - `ctx.play(name).runSync(...)`
119
- - `ctx.runPlay(name, input)`
120
- 4. Raw HTTP API
121
- - `POST /api/v2/plays/run`
122
- - `GET /api/v2/runs/:runId`
123
- - `GET /api/v2/runs/:runId/tail`
124
- 5. In-play composition
125
- - `ctx.runPlay(key, playRef, input, { description })`
126
- - Org-owned `playRef` accepts a bare name, `self/<play>`, or the canonical
127
- `<orgSlug>/<play>` returned by `plays get`.
128
-
129
- Internal / advanced only:
130
-
131
- - `registerPlayArtifact()`
132
- - `stagePlayFiles()`
133
- - `startPlayRun()`
134
- - `getPlayStatus()`
135
- - `getPlayTailStatus()`
136
- - `listPlayRuns()`
137
- - `stopPlay()`
138
-
139
- Those low-level primitives are still available for callers that explicitly need
140
- to own the package-submit-poll flow, but they are not the primary public SDK
141
- surface.
142
-
143
- ## SDK usage (programmatic)
144
-
145
- ```typescript
146
- import { Deepline, definePlay } from 'deepline';
147
-
148
- const ctx = await Deepline.connect();
149
-
150
- // Tools
151
- const tools = await ctx.tools.list();
152
- const toolResult = await ctx.tools.execute('test_company_search', {
153
- domain: 'stripe.com',
154
- });
155
- const company = toolResult.toolOutput.raw;
156
-
157
- // Named play (already live)
158
- const job = await ctx.play('my-play').run({ domain: 'example.com' });
159
- const status = await job.status();
160
- const output = await job.get(); // polls until complete
161
-
162
- // Define + run a play
163
- const myPlay = definePlay('my-play', async (ctx, input: { domain: string }) => {
164
- const company = await ctx.tools.execute({
165
- id: 'company_search',
166
- tool: 'test_company_search',
167
- input: { domain: input.domain },
168
- description: 'Look up company details by domain.',
169
- });
170
- return { company: company.toolOutput.raw };
171
- });
172
-
173
- const detail = await myPlay.get();
174
- const playResult = await myPlay.runSync({ domain: 'example.com' });
175
- ```
176
-
177
- ## Testing
178
-
179
- ```bash
180
- # Unit tests (no server needed)
181
- bun run vitest run tests/lib/plays tests/api/plays-get-route.test.ts
182
-
183
- # SDK + CLI integration (needs running dev server)
184
- bash scripts/test-sdk-play-cli.sh
185
-
186
- # V2 plays e2e — all free test tools, real Temporal (needs running dev server)
187
- bun tests/v2-plays/runner.ts --top 10
188
- bun tests/v2-plays/runner.ts --shard 1/4
189
- bun tests/v2-plays/runner.ts --file tests/v2-plays/plays/07-waterfall-basic.play.ts
190
- ```
191
-
192
- ## Repro: rate limit handling (end-to-end)
193
-
194
- Full sequence from zero to hitting + surviving rate limits via v2 plays.
195
-
196
- ### 1. Install + auth
197
-
198
- ```bash
199
- # Production
200
- bash <(curl -fsSL https://deepline.com/api/v2/sdk/install)
201
-
202
- # Local dev (no install needed)
203
- bun run dev # start server
204
- bun sdk/bin/deepline-dev.ts auth register
205
- ```
206
-
207
- ### 2. Write a play that hammers the rate-limited test tool
208
-
209
- ```bash
210
- cat > rate-limit-repro.play.ts << 'TS'
211
- import { definePlay } from 'deepline';
212
-
213
- // test_rate_limit has a 5 req/s shared window — this play fires 20 calls
214
- // to force 429s and prove the runtime retries + backs off correctly.
215
- export default definePlay('rate-limit-repro', async (ctx) => {
216
- const items = Array.from({ length: 20 }, (_, i) => ({
217
- key: `probe-${i}`,
218
- row_number: i + 1,
219
- }));
220
-
221
- const results = await ctx.dataset('rate_limit_probes', items)
222
- .withColumn("result", (row, ctx) =>
223
- ctx.tools.execute({
224
- id: 'rate_limit_probe',
225
- tool: 'test_rate_limit',
226
- input: {
227
- key: 'redis-shared-scenario',
228
- row_number: row.row_number,
229
- },
230
- description: 'Exercise the shared rate-limit retry path.',
231
- }))
232
- .run();
233
-
234
- return { total: results.length, results };
235
- });
236
- TS
237
- ```
238
-
239
- ### 3. Run it
240
-
241
- ```bash
242
- # Dev
243
- bun sdk/bin/deepline-dev.ts plays run --file rate-limit-repro.play.ts --watch
244
-
245
- # Production
246
- deepline plays run --file rate-limit-repro.play.ts --watch
33
+ Set up https://code.deepline.com/INSTALL.md
247
34
  ```
248
35
 
249
- ### 4. Fallback variant (multi-step with rate limits)
36
+ Once setup is complete, tell your agent what you want to do:
250
37
 
251
- Use `steps()` with `{ runIf }` options to express row-level fallback sequences.
252
- Skipped conditional steps yield `null`.
38
+ - "Find 5 NYC CTOs with work emails."
39
+ - "Enrich the contacts in leads.csv."
40
+ - "Upload a CSV of accounts and add emails, phones, LinkedIn profiles, job postings, or tech stack."
41
+ - "Research this market and the companies in it."
253
42
 
254
- ```bash
255
- cat > rate-limit-waterfall.play.ts << 'TS'
256
- import { definePlay, steps } from 'deepline';
257
-
258
- export default definePlay('rate-limit-waterfall', async (ctx) => {
259
- const leads = Array.from({ length: 24 }, (_, i) => ({
260
- lead_id: `lead-${String(i + 1).padStart(3, '0')}`,
261
- row_number: i + 1,
262
- }));
263
-
264
- const probeFallback = steps<{ lead_id: string; row_number: number }>()
265
- .step("primary_probe", (row, ctx) =>
266
- ctx.tools.execute({
267
- id: 'rate_limit_probe',
268
- tool: 'test_rate_limit',
269
- input: {
270
- key: 'redis-shared-scenario',
271
- lead_id: row.lead_id,
272
- row_number: row.row_number,
273
- },
274
- description: 'Exercise primary rate-limit behavior.',
275
- }))
276
- .step(
277
- "backup_probe",
278
- (row, ctx) =>
279
- ctx.tools.execute({
280
- id: 'rate_limit_probe_backup',
281
- tool: 'test_rate_limit',
282
- input: {
283
- key: 'redis-shared-scenario',
284
- lead_id: row.lead_id,
285
- row_number: row.row_number,
286
- },
287
- description: 'Exercise fallback rate-limit behavior.',
288
- }),
289
- { runIf: (row) => !row.primary_probe },
290
- )
291
- .return((row) => row.primary_probe ?? row.backup_probe ?? null);
292
-
293
- // Fan out over leads — each gets a row-level fallback sequence
294
- const results = await ctx.dataset('leads', leads)
295
- .withColumn("probe", probeFallback)
296
- .run();
297
-
298
- return results;
299
- });
300
- TS
301
- ```
43
+ ## Check your setup
302
44
 
303
45
  ```bash
304
- bun sdk/bin/deepline-dev.ts plays run --file rate-limit-waterfall.play.ts --watch
46
+ deepline doctor --json
305
47
  ```
306
48
 
307
- ### What to expect
308
-
309
- - `test_rate_limit` has a Redis-backed rate limit: **5 req/s, 3 max concurrency**.
310
- - The SDK HTTP client auto-retries 429s with exponential backoff (1s → 2s → 4s, capped at 30s, up to 4 attempts).
311
- - The play rate limit scheduler (`PlayRateLimitScheduler`) paces tool calls using `queue_hint` metadata from rate limit definitions.
312
- - All 20/24 rows should complete — no terminal rate limit errors in the output.
313
- - The waterfall variant proves that short-circuiting (skipping later steps when earlier steps match) works correctly under rate pressure.
314
-
315
- ### V1 equivalent
316
-
317
- The v1 repro scripts use `deepline enrich` (Python CLI) with `--with` JSON specs. The v2 plays replace this with typed TypeScript — same backend rate limit infrastructure, better DX.
318
-
319
- ```bash
320
- # V1 (still works)
321
- scripts/repro-rate-limit-enrich.sh redis_429
322
- scripts/repro-rate-limit-enrich.sh redis_429_waterfall
323
- ```
324
-
325
- ## Prebuilt plays
326
-
327
- V2 prebuilt play sources are authored directly in `src/lib/plays/v2/`. After
328
- editing them, regenerate the committed Workers and share-page artifacts:
329
-
330
- ```bash
331
- bun scripts/regen.ts prebuilt-share-pages
332
- ```
333
-
334
- ## File structure
335
-
336
- ```
337
- sdk/
338
- bin/deepline-dev.ts # Dev entry (bun, no build, points at localhost)
339
- src/
340
- index.ts # Public exports
341
- config.ts # Config + env resolution
342
- http.ts # Fetch client with retries
343
- client.ts # DeeplineClient (tools, plays API)
344
- play.ts # definePlay, Deepline.connect, job handles
345
- types.ts # TypeScript interfaces
346
- errors.ts # DeeplineError, AuthError, RateLimitError
347
- cli/
348
- index.ts # CLI router
349
- commands/
350
- auth.ts # auth register/status
351
- play.ts # plays run/get/tail/runs/publish
352
- tools.ts # tools list/describe/execute
353
- enrich.ts # CSV enrichment (delegates to Python CLI)
354
- plays/
355
- bundle-play-file.ts # esbuild bundler for .play.ts files
356
- local-file-discovery.ts # ctx.csv() file resolution + packaging
357
- dist/ # Build output (gitignored)
358
- ```
49
+ Need help? Visit [code.deepline.com](https://code.deepline.com).
@@ -160,7 +160,7 @@ export const SDK_RELEASE = {
160
160
  // 0.2.0 makes Dataset Handles uniformly async-only after 0.1.320 briefly
161
161
  // exposed storage-dependent synchronous access. This deliberate minor
162
162
  // release keeps lazy paging semantics independent of row residency.
163
- version: '0.2.57',
163
+ version: '0.2.59',
164
164
  contracts: {
165
165
  api: {
166
166
  name: 'sdk-http-api',
package/dist/cli/index.js CHANGED
@@ -1044,7 +1044,7 @@ var SDK_RELEASE = {
1044
1044
  // 0.2.0 makes Dataset Handles uniformly async-only after 0.1.320 briefly
1045
1045
  // exposed storage-dependent synchronous access. This deliberate minor
1046
1046
  // release keeps lazy paging semantics independent of row residency.
1047
- version: "0.2.57",
1047
+ version: "0.2.59",
1048
1048
  contracts: {
1049
1049
  api: {
1050
1050
  name: "sdk-http-api",
@@ -37051,7 +37051,7 @@ var install_commands_default = {
37051
37051
  npx_binary: "npx",
37052
37052
  npx_add_args_template: [
37053
37053
  "--yes",
37054
- "skills@latest",
37054
+ "skills@1.5.18",
37055
37055
  "add",
37056
37056
  "{skills_index_url}",
37057
37057
  "--agent",
@@ -37072,6 +37072,9 @@ var install_commands_default = {
37072
37072
  // src/cli/install-commands.ts
37073
37073
  var INSTALL_COMMANDS = install_commands_default;
37074
37074
  var DEFAULT_SKILL_AGENTS = INSTALL_COMMANDS.skills.default_agents;
37075
+ var SKILLS_NPX_PACKAGE = INSTALL_COMMANDS.skills.npx_add_args_template.find(
37076
+ (arg) => arg.startsWith("skills@")
37077
+ ) ?? "skills@1.5.18";
37075
37078
  var DEFAULT_V1_SKILL_NAMES = [
37076
37079
  "build-tam",
37077
37080
  "clay-to-deepline",
@@ -37278,7 +37281,7 @@ function buildSkillsPlan(input2) {
37278
37281
  args: [
37279
37282
  "exec",
37280
37283
  "--yes",
37281
- "--package=skills@latest",
37284
+ `--package=${SKILLS_NPX_PACKAGE}`,
37282
37285
  "--",
37283
37286
  "skills",
37284
37287
  "remove",
@@ -37294,7 +37297,7 @@ function buildSkillsPlan(input2) {
37294
37297
  args: [
37295
37298
  "exec",
37296
37299
  "--yes",
37297
- "--package=skills@latest",
37300
+ `--package=${SKILLS_NPX_PACKAGE}`,
37298
37301
  "--",
37299
37302
  "skills",
37300
37303
  "add",
@@ -37350,7 +37353,7 @@ function runProcess(command, args, cwd) {
37350
37353
  child.once("error", reject);
37351
37354
  child.once("close", (code) => {
37352
37355
  if (code && stderr.trim()) {
37353
- process.stderr.write(`skills@latest exited ${code}.
37356
+ process.stderr.write(`${SKILLS_NPX_PACKAGE} exited ${code}.
37354
37357
  `);
37355
37358
  }
37356
37359
  resolve19(code ?? 1);
@@ -37535,7 +37538,7 @@ function registerSkillsCommand(program) {
37535
37538
  `
37536
37539
  Notes:
37537
37540
  This command removes and reinstalls only Deepline-managed skill names using
37538
- skills@latest. Local scope writes into the resolved persistent project.
37541
+ skills@1.5.18. Local scope writes into the resolved persistent project.
37539
37542
 
37540
37543
  Examples:
37541
37544
  deepline skills --json
@@ -38854,7 +38857,7 @@ function reportSetupPhaseFailure(input2) {
38854
38857
  failedPhase: input2.phase,
38855
38858
  retry,
38856
38859
  statePath,
38857
- next: retry.command,
38860
+ next: input2.next ?? retry.command,
38858
38861
  ...input2.extra ?? {}
38859
38862
  },
38860
38863
  { json: input2.json }
@@ -39103,7 +39106,7 @@ async function runSetupCommand(options) {
39103
39106
  json: options.json,
39104
39107
  extra: {
39105
39108
  persistentPath: globalCli.persistentPath,
39106
- fallback: "https://code.deepline.com/SKILL.md"
39109
+ fallback: "https://code.deepline.com/INSTALL.md"
39107
39110
  }
39108
39111
  });
39109
39112
  }
@@ -39168,6 +39171,14 @@ async function runSetupCommand(options) {
39168
39171
  );
39169
39172
  skillsPayload = parseCapturedJson(skills.stdout);
39170
39173
  if (skills.exitCode !== 0) {
39174
+ if (scope === "global") {
39175
+ phases.skills = { status: "failed", code: "SKILLS_INSTALL_FAILED" };
39176
+ persistSetupProgress({ baseUrl, scope, root, phases });
39177
+ process.stderr.write(
39178
+ "Global skill setup failed. Trying project-local skills instead.\n"
39179
+ );
39180
+ return runSetupCommand({ scope: "local", json: options.json });
39181
+ }
39171
39182
  return reportSetupPhaseFailure({
39172
39183
  baseUrl,
39173
39184
  scope,
@@ -39178,6 +39189,7 @@ async function runSetupCommand(options) {
39178
39189
  exitCode: skills.exitCode,
39179
39190
  message: typeof skillsPayload?.message === "string" ? skillsPayload.message : "Deepline skills could not be installed.",
39180
39191
  json: options.json,
39192
+ next: `! ${setupResumeCommand(baseUrl, scope)}`,
39181
39193
  extra: { detail: skillsPayload }
39182
39194
  });
39183
39195
  }
@@ -1030,7 +1030,7 @@ var SDK_RELEASE = {
1030
1030
  // 0.2.0 makes Dataset Handles uniformly async-only after 0.1.320 briefly
1031
1031
  // exposed storage-dependent synchronous access. This deliberate minor
1032
1032
  // release keeps lazy paging semantics independent of row residency.
1033
- version: "0.2.57",
1033
+ version: "0.2.59",
1034
1034
  contracts: {
1035
1035
  api: {
1036
1036
  name: "sdk-http-api",
@@ -37131,7 +37131,7 @@ var install_commands_default = {
37131
37131
  npx_binary: "npx",
37132
37132
  npx_add_args_template: [
37133
37133
  "--yes",
37134
- "skills@latest",
37134
+ "skills@1.5.18",
37135
37135
  "add",
37136
37136
  "{skills_index_url}",
37137
37137
  "--agent",
@@ -37152,6 +37152,9 @@ var install_commands_default = {
37152
37152
  // src/cli/install-commands.ts
37153
37153
  var INSTALL_COMMANDS = install_commands_default;
37154
37154
  var DEFAULT_SKILL_AGENTS = INSTALL_COMMANDS.skills.default_agents;
37155
+ var SKILLS_NPX_PACKAGE = INSTALL_COMMANDS.skills.npx_add_args_template.find(
37156
+ (arg) => arg.startsWith("skills@")
37157
+ ) ?? "skills@1.5.18";
37155
37158
  var DEFAULT_V1_SKILL_NAMES = [
37156
37159
  "build-tam",
37157
37160
  "clay-to-deepline",
@@ -37358,7 +37361,7 @@ function buildSkillsPlan(input2) {
37358
37361
  args: [
37359
37362
  "exec",
37360
37363
  "--yes",
37361
- "--package=skills@latest",
37364
+ `--package=${SKILLS_NPX_PACKAGE}`,
37362
37365
  "--",
37363
37366
  "skills",
37364
37367
  "remove",
@@ -37374,7 +37377,7 @@ function buildSkillsPlan(input2) {
37374
37377
  args: [
37375
37378
  "exec",
37376
37379
  "--yes",
37377
- "--package=skills@latest",
37380
+ `--package=${SKILLS_NPX_PACKAGE}`,
37378
37381
  "--",
37379
37382
  "skills",
37380
37383
  "add",
@@ -37430,7 +37433,7 @@ function runProcess(command, args, cwd) {
37430
37433
  child.once("error", reject);
37431
37434
  child.once("close", (code) => {
37432
37435
  if (code && stderr.trim()) {
37433
- process.stderr.write(`skills@latest exited ${code}.
37436
+ process.stderr.write(`${SKILLS_NPX_PACKAGE} exited ${code}.
37434
37437
  `);
37435
37438
  }
37436
37439
  resolve19(code ?? 1);
@@ -37615,7 +37618,7 @@ function registerSkillsCommand(program) {
37615
37618
  `
37616
37619
  Notes:
37617
37620
  This command removes and reinstalls only Deepline-managed skill names using
37618
- skills@latest. Local scope writes into the resolved persistent project.
37621
+ skills@1.5.18. Local scope writes into the resolved persistent project.
37619
37622
 
37620
37623
  Examples:
37621
37624
  deepline skills --json
@@ -38942,7 +38945,7 @@ function reportSetupPhaseFailure(input2) {
38942
38945
  failedPhase: input2.phase,
38943
38946
  retry,
38944
38947
  statePath,
38945
- next: retry.command,
38948
+ next: input2.next ?? retry.command,
38946
38949
  ...input2.extra ?? {}
38947
38950
  },
38948
38951
  { json: input2.json }
@@ -39191,7 +39194,7 @@ async function runSetupCommand(options) {
39191
39194
  json: options.json,
39192
39195
  extra: {
39193
39196
  persistentPath: globalCli.persistentPath,
39194
- fallback: "https://code.deepline.com/SKILL.md"
39197
+ fallback: "https://code.deepline.com/INSTALL.md"
39195
39198
  }
39196
39199
  });
39197
39200
  }
@@ -39256,6 +39259,14 @@ async function runSetupCommand(options) {
39256
39259
  );
39257
39260
  skillsPayload = parseCapturedJson(skills.stdout);
39258
39261
  if (skills.exitCode !== 0) {
39262
+ if (scope === "global") {
39263
+ phases.skills = { status: "failed", code: "SKILLS_INSTALL_FAILED" };
39264
+ persistSetupProgress({ baseUrl, scope, root, phases });
39265
+ process.stderr.write(
39266
+ "Global skill setup failed. Trying project-local skills instead.\n"
39267
+ );
39268
+ return runSetupCommand({ scope: "local", json: options.json });
39269
+ }
39259
39270
  return reportSetupPhaseFailure({
39260
39271
  baseUrl,
39261
39272
  scope,
@@ -39266,6 +39277,7 @@ async function runSetupCommand(options) {
39266
39277
  exitCode: skills.exitCode,
39267
39278
  message: typeof skillsPayload?.message === "string" ? skillsPayload.message : "Deepline skills could not be installed.",
39268
39279
  json: options.json,
39280
+ next: `! ${setupResumeCommand(baseUrl, scope)}`,
39269
39281
  extra: { detail: skillsPayload }
39270
39282
  });
39271
39283
  }
package/dist/index.js CHANGED
@@ -763,7 +763,7 @@ var SDK_RELEASE = {
763
763
  // 0.2.0 makes Dataset Handles uniformly async-only after 0.1.320 briefly
764
764
  // exposed storage-dependent synchronous access. This deliberate minor
765
765
  // release keeps lazy paging semantics independent of row residency.
766
- version: "0.2.57",
766
+ version: "0.2.59",
767
767
  contracts: {
768
768
  api: {
769
769
  name: "sdk-http-api",
package/dist/index.mjs CHANGED
@@ -689,7 +689,7 @@ var SDK_RELEASE = {
689
689
  // 0.2.0 makes Dataset Handles uniformly async-only after 0.1.320 briefly
690
690
  // exposed storage-dependent synchronous access. This deliberate minor
691
691
  // release keeps lazy paging semantics independent of row residency.
692
- version: "0.2.57",
692
+ version: "0.2.59",
693
693
  contracts: {
694
694
  api: {
695
695
  name: "sdk-http-api",
package/package.json CHANGED
@@ -1,12 +1,8 @@
1
1
  {
2
2
  "name": "deepline",
3
- "version": "0.2.57",
4
- "description": "Deepline SDK + CLI B2B data enrichment powered by durable cloud execution",
3
+ "version": "0.2.59",
4
+ "description": "GTM data CLI and TypeScript SDK for coding agents",
5
5
  "license": "MIT",
6
- "repository": {
7
- "type": "git",
8
- "url": "git+https://github.com/deeplineai/deepline.git"
9
- },
10
6
  "homepage": "https://code.deepline.com",
11
7
  "keywords": [
12
8
  "deepline",