deepline 0.1.264 → 0.1.265

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.
@@ -125,7 +125,7 @@ export const SDK_RELEASE = {
125
125
  // 0.1.253 makes play-page browser opening opt-in and retires --no-open.
126
126
  // 0.1.254 removes the internal operations tree from the published SDK CLI.
127
127
  // Operators use the checkout-local deepline-admin binary instead.
128
- version: '0.1.264',
128
+ version: '0.1.265',
129
129
  apiContract: '2026-07-admin-cli-local-cutover',
130
130
  supportPolicy: {
131
131
  minimumSupported: '0.1.53',
package/dist/cli/index.js CHANGED
@@ -718,7 +718,7 @@ var SDK_RELEASE = {
718
718
  // 0.1.253 makes play-page browser opening opt-in and retires --no-open.
719
719
  // 0.1.254 removes the internal operations tree from the published SDK CLI.
720
720
  // Operators use the checkout-local deepline-admin binary instead.
721
- version: "0.1.264",
721
+ version: "0.1.265",
722
722
  apiContract: "2026-07-admin-cli-local-cutover",
723
723
  supportPolicy: {
724
724
  minimumSupported: "0.1.53",
@@ -25686,243 +25686,82 @@ Examples:
25686
25686
  );
25687
25687
  }
25688
25688
 
25689
- // src/cli/commands/quickstart.ts
25690
- var import_node_child_process2 = require("child_process");
25691
- var import_node_crypto6 = require("crypto");
25692
- var import_node_http = require("http");
25693
- var EXIT_OK2 = 0;
25694
- var EXIT_AUTH2 = 1;
25695
- var EXIT_SERVER3 = 2;
25696
- var MAX_PROMPT_LENGTH = 8e3;
25697
- var MAX_BODY_BYTES = 64 * 1024;
25698
- function shellQuote3(arg) {
25699
- return `'${arg.replace(/'/g, `'\\''`)}'`;
25700
- }
25701
- function hasClaudeBinary() {
25702
- try {
25703
- const result = (0, import_node_child_process2.spawnSync)("claude", ["--version"], {
25704
- stdio: "ignore",
25705
- shell: process.platform === "win32"
25706
- });
25707
- return result.status === 0;
25708
- } catch {
25709
- return false;
25689
+ // src/cli/getting-started.ts
25690
+ var DEEPLINE_GTM_SKILL = "/deepline-gtm";
25691
+ var DEEPLINE_GTM_STARTER_PROMPTS = [
25692
+ {
25693
+ id: "waterfall-email-lookup",
25694
+ title: "Waterfall email lookup",
25695
+ prompt: "/deepline-gtm Find 5 CTOs in NYC and get their verified work emails."
25696
+ },
25697
+ {
25698
+ id: "signal-based-outbound",
25699
+ title: "Signal-based outbound",
25700
+ prompt: "/deepline-gtm Find 5 leads engaging with Gong's competitors on LinkedIn. Score against CMO or VP of Marketing. Waterfall enrich their emails. Build a sequence-ready list with personalized first lines."
25701
+ },
25702
+ {
25703
+ id: "vc-portfolio-scrape",
25704
+ title: "VC portfolio scrape",
25705
+ prompt: "/deepline-gtm Pull 5 companies from Y Combinator W26. Find the Head of Marketing or VP Sales at each one. Waterfall their emails and write a personalized first line."
25710
25706
  }
25707
+ ];
25708
+ var DEEPLINE_GTM_HANDOFF_QUESTION = "Would you like to try one of these examples, or tell me your own business problem?";
25709
+ function deeplineGtmGettingStartedPayload() {
25710
+ return {
25711
+ skill: DEEPLINE_GTM_SKILL,
25712
+ examples: DEEPLINE_GTM_STARTER_PROMPTS,
25713
+ question: DEEPLINE_GTM_HANDOFF_QUESTION,
25714
+ customProblemBehavior: "Turn the business problem into one exact /deepline-gtm prompt, show that reusable prompt, then execute it without asking the user to paste it again."
25715
+ };
25711
25716
  }
25712
- function launchClaude(prompt) {
25713
- return new Promise((resolve15) => {
25714
- const child = (0, import_node_child_process2.spawn)("claude", [prompt], {
25715
- stdio: "inherit",
25716
- shell: process.platform === "win32"
25717
- });
25718
- child.on("error", () => resolve15(EXIT_SERVER3));
25719
- child.on("close", (status) => resolve15(status ?? EXIT_OK2));
25720
- });
25721
- }
25722
- function readBody(req) {
25723
- return new Promise((resolve15, reject) => {
25724
- let raw = "";
25725
- req.setEncoding("utf8");
25726
- req.on("data", (chunk) => {
25727
- raw += chunk;
25728
- if (raw.length > MAX_BODY_BYTES) {
25729
- reject(new Error("Request body too large."));
25730
- req.destroy();
25731
- }
25732
- });
25733
- req.on("end", () => resolve15(raw));
25734
- req.on("error", reject);
25735
- });
25736
- }
25737
- function writeJson(res, status, payload) {
25738
- res.writeHead(status, { "content-type": "application/json" });
25739
- res.end(JSON.stringify(payload));
25740
- }
25741
- function startCallbackServer(input2) {
25742
- const server = (0, import_node_http.createServer)((req, res) => {
25743
- res.setHeader("Access-Control-Allow-Origin", req.headers.origin ?? "*");
25744
- res.setHeader("Vary", "Origin");
25745
- res.setHeader("Access-Control-Allow-Methods", "POST, OPTIONS");
25746
- res.setHeader("Access-Control-Allow-Headers", "content-type");
25747
- res.setHeader("Access-Control-Allow-Private-Network", "true");
25748
- res.setHeader("Access-Control-Max-Age", "600");
25749
- if (req.method === "OPTIONS") {
25750
- res.writeHead(204);
25751
- res.end();
25752
- return;
25753
- }
25754
- if (req.method !== "POST" || req.url !== "/submit") {
25755
- writeJson(res, 404, { error: "Not found." });
25756
- return;
25757
- }
25758
- void readBody(req).then((raw) => {
25759
- let body = null;
25760
- try {
25761
- body = JSON.parse(raw);
25762
- } catch {
25763
- body = null;
25764
- }
25765
- const state = typeof body?.state === "string" ? body.state : "";
25766
- const prompt = typeof body?.prompt === "string" ? body.prompt.trim() : "";
25767
- const workflowId = typeof body?.workflow_id === "string" && body.workflow_id.trim() ? body.workflow_id.trim() : null;
25768
- if (!state || state !== input2.state) {
25769
- writeJson(res, 403, { error: "Invalid quickstart state token." });
25770
- return;
25771
- }
25772
- if (!prompt) {
25773
- writeJson(res, 400, { error: "prompt is required." });
25774
- return;
25775
- }
25776
- if (prompt.length > MAX_PROMPT_LENGTH) {
25777
- writeJson(res, 400, {
25778
- error: `prompt exceeds ${MAX_PROMPT_LENGTH} characters.`
25779
- });
25780
- return;
25781
- }
25782
- writeJson(res, 200, { ok: true });
25783
- setImmediate(() => input2.onSelection({ prompt, workflowId }));
25784
- }).catch(() => {
25785
- writeJson(res, 400, { error: "Invalid request body." });
25786
- });
25787
- });
25788
- return new Promise((resolve15, reject) => {
25789
- server.once("error", reject);
25790
- server.listen(0, "127.0.0.1", () => {
25791
- const address = server.address();
25792
- if (!address || typeof address === "string") {
25793
- reject(new Error("Failed to bind quickstart callback server."));
25794
- return;
25795
- }
25796
- resolve15({ server, port: address.port });
25797
- });
25798
- });
25799
- }
25717
+
25718
+ // src/cli/commands/quickstart.ts
25800
25719
  async function handleQuickstart(options) {
25801
25720
  const jsonOutput = shouldEmitJson(options.json === true);
25802
- const baseUrl = autoDetectBaseUrl().replace(/\/$/, "");
25803
- const installerMode = String(process.env.DEEPLINE_INSTALLER_MODE ?? "").trim().toLowerCase() === "true";
25804
- const interactive = Boolean(
25805
- !installerMode && process.stdin.isTTY && process.stdout.isTTY
25806
- );
25807
- let apiKey = resolveApiKeyForBaseUrl(baseUrl);
25808
- if (!apiKey) {
25809
- if (interactive) {
25810
- console.error("Not connected yet \u2014 registering this device first.");
25811
- const registerExit = await handleRegister([]);
25812
- if (registerExit !== EXIT_OK2) return registerExit;
25813
- apiKey = resolveApiKeyForBaseUrl(baseUrl);
25814
- }
25815
- if (!apiKey) {
25816
- console.error("Not connected. Run: deepline auth register");
25817
- return EXIT_AUTH2;
25818
- }
25819
- }
25820
- const state = (0, import_node_crypto6.randomBytes)(32).toString("hex");
25821
- let resolveSelection;
25822
- const selectionPromise = new Promise((resolve15) => {
25823
- resolveSelection = resolve15;
25824
- });
25825
- let callback;
25826
- try {
25827
- callback = await startCallbackServer({
25828
- state,
25829
- onSelection: (selection) => resolveSelection(selection)
25830
- });
25831
- } catch (error) {
25832
- console.error(
25833
- `Could not start the local quickstart listener: ${error instanceof Error ? error.message : String(error)}`
25834
- );
25835
- return EXIT_SERVER3;
25836
- }
25837
- const quickstartUrl = `${baseUrl}/cli/quickstart?cb=${callback.port}&state=${state}`;
25838
- console.error(" Opening the recipe picker in your browser.");
25839
- console.error(` If it didn't open, cmd+click: ${quickstartUrl}`);
25840
- if (options.open !== false) {
25841
- openInBrowser(quickstartUrl);
25842
- }
25843
- const timeoutSeconds = Number.parseInt(options.timeout ?? "300", 10);
25844
- const timeoutMs = (Number.isFinite(timeoutSeconds) && timeoutSeconds > 0 ? timeoutSeconds : 300) * 1e3;
25845
- const timeoutHandle = setTimeout(
25846
- () => resolveSelection("timeout"),
25847
- timeoutMs
25848
- );
25849
- const progress = createCliProgress(!jsonOutput);
25850
- progress.phase("waiting for your pick in the browser (Ctrl+C to skip)");
25851
- const onSigint = () => resolveSelection("sigint");
25852
- process.once("SIGINT", onSigint);
25853
- const outcome = await selectionPromise;
25854
- clearTimeout(timeoutHandle);
25855
- process.removeListener("SIGINT", onSigint);
25856
- callback.server.close();
25857
- if (outcome === "sigint") {
25858
- progress.fail();
25859
- console.error("\nSkipped \u2014 run `deepline quickstart` anytime.");
25860
- return EXIT_OK2;
25861
- }
25862
- if (outcome === "timeout") {
25863
- progress.fail();
25864
- console.error(
25865
- "Timed out waiting for a selection. Run: deepline quickstart"
25866
- );
25867
- return EXIT_AUTH2;
25868
- }
25869
- progress.complete();
25870
- const { prompt, workflowId } = outcome;
25871
- const claudeCommand = `claude ${shellQuote3(prompt)}`;
25872
- const claudeAvailable = hasClaudeBinary();
25873
- const willLaunch = options.launch !== false && !jsonOutput && interactive && claudeAvailable;
25721
+ const gettingStarted = {
25722
+ skill: DEEPLINE_GTM_SKILL,
25723
+ examples: DEEPLINE_GTM_STARTER_PROMPTS
25724
+ };
25874
25725
  printCommandEnvelope(
25875
25726
  {
25876
- status: "submitted",
25877
- workflowId,
25878
- prompt,
25879
- claudeCommand,
25880
- url: quickstartUrl,
25881
- launched: willLaunch,
25727
+ ok: true,
25728
+ status: "deprecated",
25729
+ code: "QUICKSTART_DEPRECATED",
25730
+ exitCode: 0,
25731
+ message: "`deepline quickstart` is deprecated. Start with the installed /deepline-gtm skill in your agent.",
25732
+ deprecatedCommand: "deepline quickstart",
25733
+ replacement: DEEPLINE_GTM_SKILL,
25734
+ gettingStarted,
25735
+ next: DEEPLINE_GTM_SKILL,
25882
25736
  render: {
25883
25737
  sections: [
25884
25738
  {
25885
- title: "quickstart",
25739
+ title: "quickstart deprecated",
25886
25740
  lines: [
25887
- ...workflowId ? [`Recipe: ${workflowId}`] : [],
25888
- willLaunch ? "Launching Claude Code with your recipe..." : claudeAvailable ? "Run the command below to start your recipe." : "Claude Code not found. Install it (https://code.claude.com/docs/en/overview), then run the command below."
25741
+ `Use ${DEEPLINE_GTM_SKILL} in your agent instead.`,
25742
+ ...DEEPLINE_GTM_STARTER_PROMPTS.map(
25743
+ (example, index) => `${index + 1}. ${example.title}: ${example.prompt}`
25744
+ )
25889
25745
  ]
25890
25746
  }
25891
- ],
25892
- actions: [{ label: "Run", command: claudeCommand }]
25747
+ ]
25893
25748
  }
25894
25749
  },
25895
25750
  { json: jsonOutput }
25896
25751
  );
25897
- if (willLaunch) {
25898
- return launchClaude(prompt);
25899
- }
25900
- return EXIT_OK2;
25752
+ return 0;
25901
25753
  }
25902
25754
  function registerQuickstartCommands(program) {
25903
25755
  program.command("quickstart").description(
25904
- "Pick a starter recipe in the browser and launch it with Claude Code."
25756
+ "Deprecated compatibility command. Use /deepline-gtm in your agent."
25905
25757
  ).addHelpText(
25906
25758
  "after",
25907
25759
  `
25908
- Notes:
25909
- Opens the hosted recipe picker in your browser. The picker sends your
25910
- selection back to a temporary listener on 127.0.0.1, so the browser must run
25911
- on the same machine as the CLI. Once a recipe arrives, the CLI prints the
25912
- matching claude command and, when Claude Code is installed and the shell is
25913
- interactive, launches it directly. Press Ctrl+C while waiting to skip.
25914
-
25915
- Examples:
25916
- deepline quickstart
25917
- deepline quickstart --no-open
25918
- deepline quickstart --no-launch --json
25919
- deepline quickstart --timeout 120
25760
+ Deprecated:
25761
+ Use the installed /deepline-gtm skill in your agent. This compatibility
25762
+ command prints three starter prompts and no longer opens a browser.
25920
25763
  `
25921
- ).option("--json", "Emit JSON output. Also automatic when stdout is piped").option("--no-open", "Do not open the browser; print the URL only").option("--no-launch", "Print the claude command instead of launching it").option(
25922
- "--timeout <seconds>",
25923
- "Maximum seconds to wait for a selection",
25924
- "300"
25925
- ).action(async (options) => {
25764
+ ).option("--json", "Emit JSON output. Also automatic when stdout is piped").option("--no-open", "Deprecated compatibility option").option("--no-launch", "Deprecated compatibility option").option("--timeout <seconds>", "Deprecated compatibility option").action(async (options) => {
25926
25765
  process.exitCode = await handleQuickstart(options);
25927
25766
  });
25928
25767
  }
@@ -27883,9 +27722,9 @@ function apifySyncRecoveryNext(rawResponse) {
27883
27722
  const getDatasetItemsTool = stringField2(getDatasetItems, "tool");
27884
27723
  const getDatasetItemsPayload = recordField2(getDatasetItems, "payload");
27885
27724
  return {
27886
- getActorRun: `deepline tools execute ${getActorRunTool} --input ${shellQuote4(JSON.stringify(getActorRunPayload))} --json`,
27725
+ getActorRun: `deepline tools execute ${getActorRunTool} --input ${shellQuote3(JSON.stringify(getActorRunPayload))} --json`,
27887
27726
  ...getDatasetItemsTool && Object.keys(getDatasetItemsPayload).length > 0 ? {
27888
- getDatasetItems: `deepline tools execute ${getDatasetItemsTool} --input ${shellQuote4(JSON.stringify(getDatasetItemsPayload))} --json`
27727
+ getDatasetItems: `deepline tools execute ${getDatasetItemsTool} --input ${shellQuote3(JSON.stringify(getDatasetItemsPayload))} --json`
27889
27728
  } : {}
27890
27729
  };
27891
27730
  }
@@ -28058,7 +27897,7 @@ function parseExecuteOptions(args) {
28058
27897
  function safeFileStem(value) {
28059
27898
  return value.trim().replace(/[^a-zA-Z0-9_-]+/g, "-").replace(/^-+|-+$/g, "").slice(0, 64) || "tool";
28060
27899
  }
28061
- function shellQuote4(value) {
27900
+ function shellQuote3(value) {
28062
27901
  return `'${value.replace(/'/g, `'\\''`)}'`;
28063
27902
  }
28064
27903
  function powerShellQuote(value) {
@@ -28128,7 +27967,7 @@ export default definePlay(${JSON.stringify(playName)}, async (ctx) => {
28128
27967
  path: scriptPath,
28129
27968
  sourceCode: script,
28130
27969
  projectDir,
28131
- macCopyCommand: `mkdir -p ${shellQuote4(projectDir)} && cp ${shellQuote4(scriptPath)} ${shellQuote4(`${projectDir}/${fileName}`)}`,
27970
+ macCopyCommand: `mkdir -p ${shellQuote3(projectDir)} && cp ${shellQuote3(scriptPath)} ${shellQuote3(`${projectDir}/${fileName}`)}`,
28132
27971
  windowsCopyCommand: `New-Item -ItemType Directory -Force -Path ${powerShellQuote(projectDir.replace(/\//g, "\\"))} | Out-Null; Copy-Item -LiteralPath ${powerShellQuote(scriptPath)} -Destination ${powerShellQuote(`${projectDir.replace(/\//g, "\\")}\\${fileName}`)}`
28133
27972
  };
28134
27973
  }
@@ -28152,7 +27991,7 @@ function buildToolExecuteBaseEnvelope(input2) {
28152
27991
  envelope,
28153
27992
  "output"
28154
27993
  );
28155
- const inspectCommand = `deepline tools execute ${input2.toolId} --input ${shellQuote4(JSON.stringify(input2.params))} --json`;
27994
+ const inspectCommand = `deepline tools execute ${input2.toolId} --input ${shellQuote3(JSON.stringify(input2.params))} --json`;
28156
27995
  const actions = input2.listConversion ? [
28157
27996
  {
28158
27997
  label: "next",
@@ -28469,7 +28308,7 @@ var import_promises5 = require("fs/promises");
28469
28308
  var import_node_path17 = require("path");
28470
28309
 
28471
28310
  // src/cli/workflow-to-play.ts
28472
- var import_node_crypto7 = require("crypto");
28311
+ var import_node_crypto6 = require("crypto");
28473
28312
 
28474
28313
  // ../shared_libs/plays/secret-guardrails.ts
28475
28314
  var SECRET_ENV_PATTERN = /\bprocess(?:\.env|\[['"]env['"]\])(?:\.|\[['"])([A-Z0-9_]*(?:API[_-]?KEY|TOKEN|SECRET|PASSWORD|PRIVATE[_-]?KEY|ACCESS[_-]?KEY)[A-Z0-9_]*)(?:['"]\])?/g;
@@ -28621,7 +28460,7 @@ function sanitizePlayNameSegment(value) {
28621
28460
  }
28622
28461
  function deriveWorkflowPlayName(workflowName) {
28623
28462
  const base = sanitizePlayNameSegment(workflowName) || "workflow";
28624
- const suffix = (0, import_node_crypto7.createHash)("sha256").update(workflowName).digest("hex").slice(0, 8);
28463
+ const suffix = (0, import_node_crypto6.createHash)("sha256").update(workflowName).digest("hex").slice(0, 8);
28625
28464
  const reserved = suffix.length + 1;
28626
28465
  const allowedBase = Math.max(1, MAX_PLAY_NAME_LENGTH - reserved);
28627
28466
  let name = `${base.slice(0, allowedBase)}_${suffix}`;
@@ -29006,13 +28845,13 @@ Notes:
29006
28845
  }
29007
28846
 
29008
28847
  // src/cli/commands/update.ts
29009
- var import_node_child_process4 = require("child_process");
28848
+ var import_node_child_process3 = require("child_process");
29010
28849
  var import_node_fs17 = require("fs");
29011
28850
  var import_node_os14 = require("os");
29012
28851
  var import_node_path19 = require("path");
29013
28852
 
29014
28853
  // src/cli/commands/skills.ts
29015
- var import_node_child_process3 = require("child_process");
28854
+ var import_node_child_process2 = require("child_process");
29016
28855
  var import_node_fs16 = require("fs");
29017
28856
  var import_node_os13 = require("os");
29018
28857
  var import_node_path18 = require("path");
@@ -29286,7 +29125,7 @@ function readSkillsInstallState(path) {
29286
29125
  }
29287
29126
  function runProcess(command, args, cwd) {
29288
29127
  return new Promise((resolve15, reject) => {
29289
- const child = (0, import_node_child_process3.spawn)(command, args, {
29128
+ const child = (0, import_node_child_process2.spawn)(command, args, {
29290
29129
  cwd,
29291
29130
  env: process.env,
29292
29131
  stdio: ["ignore", "ignore", "pipe"],
@@ -29526,14 +29365,14 @@ function posixShellQuote(value) {
29526
29365
  function windowsCmdQuote(value) {
29527
29366
  return `"${value.replace(/"/g, '""')}"`;
29528
29367
  }
29529
- function shellQuote5(value) {
29368
+ function shellQuote4(value) {
29530
29369
  if (process.platform === "win32") {
29531
29370
  return /^[A-Za-z0-9_./:@%+=,-]+$/.test(value) ? value : windowsCmdQuote(value);
29532
29371
  }
29533
29372
  return posixShellQuote(value);
29534
29373
  }
29535
29374
  function buildSourceUpdateCommand(sourceRoot) {
29536
- const quotedRoot = shellQuote5(sourceRoot);
29375
+ const quotedRoot = shellQuote4(sourceRoot);
29537
29376
  const cdCommand = process.platform === "win32" ? `cd /d ${quotedRoot}` : `cd ${quotedRoot}`;
29538
29377
  return `${cdCommand} && git fetch origin main --tags && git merge --ff-only origin/main`;
29539
29378
  }
@@ -29545,7 +29384,7 @@ function buildSidecarProjectConfigCommand(versionDir, nodeBin) {
29545
29384
  "fs.mkdirSync(dir,{recursive:true});",
29546
29385
  `fs.writeFileSync(path.join(dir,'package.json'),${JSON.stringify(NPM_SDK_SIDECAR_PACKAGE_JSON)});`
29547
29386
  ].join("");
29548
- return `${shellQuote5(nodeBin)} -e ${shellQuote5(script)} ${shellQuote5(versionDir)}`;
29387
+ return `${shellQuote4(nodeBin)} -e ${shellQuote4(script)} ${shellQuote4(versionDir)}`;
29549
29388
  }
29550
29389
  function sidecarStateDir(input2) {
29551
29390
  const scope = input2.env.DEEPLINE_CONFIG_SCOPE?.trim();
@@ -29608,7 +29447,7 @@ function resolvePythonSidecarUpdatePlan(options) {
29608
29447
  const npmCommand = "npm";
29609
29448
  const registryUrl = sidecarRegistryUrl(hostUrl);
29610
29449
  const versionDir = (0, import_node_path19.join)(stateDir, "versions", "<version>");
29611
- const manualCommand = `${buildSidecarProjectConfigCommand(versionDir, nodeBin)} && ${npmCommand} install --prefix ${shellQuote5(versionDir)} --registry ${shellQuote5(registryUrl)} ${NPM_SDK_INSTALL_COMMON_FLAGS.map(shellQuote5).join(" ")} ${shellQuote5(packageSpec)}`;
29450
+ const manualCommand = `${buildSidecarProjectConfigCommand(versionDir, nodeBin)} && ${npmCommand} install --prefix ${shellQuote4(versionDir)} --registry ${shellQuote4(registryUrl)} ${NPM_SDK_INSTALL_COMMON_FLAGS.map(shellQuote4).join(" ")} ${shellQuote4(packageSpec)}`;
29612
29451
  return {
29613
29452
  kind: "python-sidecar",
29614
29453
  stateDir,
@@ -29692,7 +29531,7 @@ function resolveUpdatePlan(options = {}) {
29692
29531
  fallbackRegistryUrl: publicNpmFallbackRegistryUrl(
29693
29532
  env.DEEPLINE_HOST_URL?.trim() || autoDetectBaseUrl()
29694
29533
  ),
29695
- manualCommand: `${command} ${args.map(shellQuote5).join(" ")}`
29534
+ manualCommand: `${command} ${args.map(shellQuote4).join(" ")}`
29696
29535
  };
29697
29536
  }
29698
29537
  var AUTO_UPDATE_FAILURE_FILE = ".auto-update-failure.json";
@@ -29812,7 +29651,7 @@ function installedPackageVersion(versionDir) {
29812
29651
  function runCommand(command, args, env = process.env) {
29813
29652
  return new Promise((resolveResult) => {
29814
29653
  let output2 = "";
29815
- const child = (0, import_node_child_process4.spawn)(command, args, {
29654
+ const child = (0, import_node_child_process3.spawn)(command, args, {
29816
29655
  stdio: ["inherit", "pipe", "pipe"],
29817
29656
  shell: process.platform === "win32",
29818
29657
  env
@@ -29897,9 +29736,9 @@ function writeSidecarLauncher(input2) {
29897
29736
  input2.path,
29898
29737
  [
29899
29738
  "#!/usr/bin/env sh",
29900
- `export DEEPLINE_HOST_URL=${shellQuote5(input2.hostUrl)}`,
29901
- `export DEEPLINE_CONFIG_SCOPE=${shellQuote5(input2.scope)}`,
29902
- `exec ${shellQuote5(input2.nodeBin)} ${shellQuote5(input2.entryPath)} "$@"`,
29739
+ `export DEEPLINE_HOST_URL=${shellQuote4(input2.hostUrl)}`,
29740
+ `export DEEPLINE_CONFIG_SCOPE=${shellQuote4(input2.scope)}`,
29741
+ `exec ${shellQuote4(input2.nodeBin)} ${shellQuote4(input2.entryPath)} "$@"`,
29903
29742
  ""
29904
29743
  ].join("\n"),
29905
29744
  { encoding: "utf8", mode: 493 }
@@ -30111,7 +29950,7 @@ Examples:
30111
29950
  }
30112
29951
 
30113
29952
  // src/cli/commands/setup.ts
30114
- var import_node_child_process5 = require("child_process");
29953
+ var import_node_child_process4 = require("child_process");
30115
29954
  var import_node_fs18 = require("fs");
30116
29955
  var import_node_os15 = require("os");
30117
29956
  var import_node_path20 = require("path");
@@ -30214,6 +30053,15 @@ function resolveScopeRoot(scope) {
30214
30053
  function authScopeForSetup(scope) {
30215
30054
  return scope === "local" ? "folder" : "global";
30216
30055
  }
30056
+ function shouldOpenSetupAuthorization(runtime = detectAgentRuntime()) {
30057
+ return runtime !== "claude_cowork";
30058
+ }
30059
+ function openSetupAuthorization(authorizationUrl, options = {}) {
30060
+ const url = authorizationUrl.trim();
30061
+ if (!url || !shouldOpenSetupAuthorization(options.runtime)) return false;
30062
+ (options.open ?? openInBrowser)(url);
30063
+ return true;
30064
+ }
30217
30065
  function setupStatePath(baseUrl, scope, root) {
30218
30066
  return scope === "local" && root ? (0, import_node_path20.join)(root, ".deepline", "setup", "state.json") : (0, import_node_path20.join)(sdkCliStateDirPath(baseUrl), "setup.json");
30219
30067
  }
@@ -30296,7 +30144,7 @@ function removeKnownLegacyPaths(baseUrl) {
30296
30144
  return removed;
30297
30145
  }
30298
30146
  function resolvePathCommands(command) {
30299
- const lookup = (0, import_node_child_process5.spawnSync)(
30147
+ const lookup = (0, import_node_child_process4.spawnSync)(
30300
30148
  process.platform === "win32" ? "where" : "which",
30301
30149
  process.platform === "win32" ? [command] : ["-a", command],
30302
30150
  { encoding: "utf8", shell: process.platform === "win32" }
@@ -30311,7 +30159,7 @@ function resolvePathCommand(command) {
30311
30159
  return resolvePathCommands(command)[0] ?? null;
30312
30160
  }
30313
30161
  function resolvePersistentGlobalCommand() {
30314
- const prefix = (0, import_node_child_process5.spawnSync)("npm", ["prefix", "-g"], { encoding: "utf8" });
30162
+ const prefix = (0, import_node_child_process4.spawnSync)("npm", ["prefix", "-g"], { encoding: "utf8" });
30315
30163
  if (prefix.status !== 0) return null;
30316
30164
  const root = String(prefix.stdout ?? "").trim();
30317
30165
  if (!root) return null;
@@ -30403,9 +30251,6 @@ function rollbackCommand(scope, root) {
30403
30251
  const prefix = scope === "local" && root ? ` --prefix ${JSON.stringify((0, import_node_path20.join)(root, ".deepline", "runtime"))}` : "";
30404
30252
  return `npm install -g${prefix} --no-audit --no-fund --include=optional --allow-scripts=esbuild deepline@${SDK_VERSION}`;
30405
30253
  }
30406
- function setupQuickstartCommand(baseUrl) {
30407
- return baseUrl === "https://code.deepline.com" ? "deepline quickstart" : `DEEPLINE_HOST_URL=${JSON.stringify(baseUrl)} deepline quickstart`;
30408
- }
30409
30254
  function setupResumeCommand(baseUrl, scope) {
30410
30255
  const hostPrefix = baseUrl === "https://code.deepline.com" ? "" : `DEEPLINE_HOST_URL=${JSON.stringify(baseUrl)} `;
30411
30256
  return `${hostPrefix}deepline setup --scope ${scope} --json`;
@@ -30555,7 +30400,7 @@ async function runDoctorCommand(options) {
30555
30400
  root,
30556
30401
  authStatus
30557
30402
  });
30558
- const quickstart = setupQuickstartCommand(baseUrl);
30403
+ const gettingStarted = deeplineGtmGettingStartedPayload();
30559
30404
  printCommandEnvelope(
30560
30405
  {
30561
30406
  ok,
@@ -30563,7 +30408,8 @@ async function runDoctorCommand(options) {
30563
30408
  code: ok ? "DOCTOR_OK" : "DOCTOR_FAILED",
30564
30409
  exitCode: ok ? 0 : 7,
30565
30410
  checks,
30566
- next: ok ? quickstart : "Review failed checks, then rerun: deepline doctor --json",
30411
+ next: ok ? DEEPLINE_GTM_SKILL : "Review failed checks, then rerun: deepline doctor --json",
30412
+ ...ok ? { gettingStarted } : {},
30567
30413
  render: {
30568
30414
  sections: [
30569
30415
  {
@@ -30592,6 +30438,7 @@ function pendingResult(input2) {
30592
30438
  phases: input2.phases
30593
30439
  });
30594
30440
  if (input2.authorizationUrl) {
30441
+ openSetupAuthorization(input2.authorizationUrl);
30595
30442
  process.stderr.write(`Authorize Deepline: ${input2.authorizationUrl}
30596
30443
  `);
30597
30444
  }
@@ -30675,7 +30522,7 @@ async function runSetupCommand(options) {
30675
30522
  json: options.json,
30676
30523
  extra: {
30677
30524
  persistentPath: globalCli.persistentPath,
30678
- fallback: "https://code.deepline.com/INSTALL.md"
30525
+ fallback: "https://code.deepline.com/SKILL.md"
30679
30526
  }
30680
30527
  });
30681
30528
  }
@@ -30878,14 +30725,15 @@ async function runSetupCommand(options) {
30878
30725
  root,
30879
30726
  authStatus: auth
30880
30727
  });
30881
- const quickstart = setupQuickstartCommand(baseUrl);
30728
+ const gettingStarted = deeplineGtmGettingStartedPayload();
30882
30729
  const doctorPayload = {
30883
30730
  ok: assessment.ok,
30884
30731
  status: assessment.ok ? "complete" : "failed",
30885
30732
  code: assessment.ok ? "DOCTOR_OK" : "DOCTOR_FAILED",
30886
30733
  exitCode: assessment.ok ? 0 : 7,
30887
30734
  checks: assessment.checks,
30888
- next: assessment.ok ? quickstart : `deepline doctor --scope ${scope} --json`
30735
+ next: assessment.ok ? DEEPLINE_GTM_SKILL : `deepline doctor --scope ${scope} --json`,
30736
+ ...assessment.ok ? { gettingStarted } : {}
30889
30737
  };
30890
30738
  if (!assessment.ok) {
30891
30739
  return reportSetupPhaseFailure({
@@ -30932,14 +30780,19 @@ async function runSetupCommand(options) {
30932
30780
  currentPhase: null,
30933
30781
  failedPhase: null,
30934
30782
  resumed,
30935
- next: quickstart,
30783
+ next: DEEPLINE_GTM_SKILL,
30784
+ gettingStarted,
30936
30785
  render: {
30937
30786
  sections: [
30938
30787
  {
30939
30788
  title: "setup",
30940
30789
  lines: [
30941
30790
  "Deepline is installed and connected.",
30942
- `Next: ${quickstart}`
30791
+ `Use ${DEEPLINE_GTM_SKILL} in your agent.`,
30792
+ ...DEEPLINE_GTM_STARTER_PROMPTS.map(
30793
+ (example, index) => `${index + 1}. ${example.title}: ${example.prompt}`
30794
+ ),
30795
+ gettingStarted.question
30943
30796
  ]
30944
30797
  }
30945
30798
  ]
@@ -30955,7 +30808,7 @@ function registerSetupCommands(program) {
30955
30808
  `
30956
30809
  Notes:
30957
30810
  Setup is idempotent. Bare setup resumes the first incomplete or failed phase.
30958
- It installs skills before auth and does not run quickstart.
30811
+ It installs skills before auth and does not run a starter workflow.
30959
30812
  JSON output includes phase status and an exact retry command.
30960
30813
 
30961
30814
  Examples:
@@ -31078,7 +30931,7 @@ function unknownCommandNameFromMessage(message) {
31078
30931
  }
31079
30932
 
31080
30933
  // src/cli/self-update.ts
31081
- var import_node_child_process6 = require("child_process");
30934
+ var import_node_child_process5 = require("child_process");
31082
30935
  function envTruthy(name) {
31083
30936
  const value = process.env[name]?.trim().toLowerCase();
31084
30937
  return value === "1" || value === "true" || value === "yes";
@@ -31127,7 +30980,7 @@ function relaunchCurrentCommand(plan) {
31127
30980
  return new Promise((resolve15) => {
31128
30981
  const command = plan.kind === "python-sidecar" ? plan.sidecarPath : process.execPath;
31129
30982
  const args = plan.kind === "python-sidecar" ? process.argv.slice(2) : process.argv.slice(1);
31130
- const child = (0, import_node_child_process6.spawn)(command, args, {
30983
+ const child = (0, import_node_child_process5.spawn)(command, args, {
31131
30984
  stdio: "inherit",
31132
30985
  shell: process.platform === "win32",
31133
30986
  env: {
@@ -31192,7 +31045,7 @@ async function maybeAutoUpdateAndRelaunch(response) {
31192
31045
  }
31193
31046
 
31194
31047
  // src/cli/skills-sync.ts
31195
- var import_node_child_process7 = require("child_process");
31048
+ var import_node_child_process6 = require("child_process");
31196
31049
  var import_node_fs19 = require("fs");
31197
31050
  var import_node_path21 = require("path");
31198
31051
  var CHECK_TIMEOUT_MS2 = 3e3;
@@ -31335,13 +31188,13 @@ function buildBunxSkillsInstallArgs(baseUrl, skillNames) {
31335
31188
  });
31336
31189
  }
31337
31190
  function hasCommand(command) {
31338
- const result = (0, import_node_child_process7.spawnSync)(command, ["--version"], {
31191
+ const result = (0, import_node_child_process6.spawnSync)(command, ["--version"], {
31339
31192
  stdio: "ignore",
31340
31193
  shell: process.platform === "win32"
31341
31194
  });
31342
31195
  return result.status === 0;
31343
31196
  }
31344
- function shellQuote6(arg) {
31197
+ function shellQuote5(arg) {
31345
31198
  return `'${arg.replace(/'/g, `'\\''`)}'`;
31346
31199
  }
31347
31200
  function resolveSkillsInstallCommands(baseUrl, skillNames = DEFAULT_SDK_SKILL_NAMES) {
@@ -31351,7 +31204,7 @@ function resolveSkillsInstallCommands(baseUrl, skillNames = DEFAULT_SDK_SKILL_NA
31351
31204
  commands.push({
31352
31205
  command: "bunx",
31353
31206
  args: bunxArgs,
31354
- manualCommand: `bunx ${bunxArgs.map(shellQuote6).join(" ")}`
31207
+ manualCommand: `bunx ${bunxArgs.map(shellQuote5).join(" ")}`
31355
31208
  });
31356
31209
  }
31357
31210
  if (hasCommand("npx")) {
@@ -31359,14 +31212,14 @@ function resolveSkillsInstallCommands(baseUrl, skillNames = DEFAULT_SDK_SKILL_NA
31359
31212
  commands.push({
31360
31213
  command: "npx",
31361
31214
  args: npxArgs,
31362
- manualCommand: `npx ${npxArgs.map(shellQuote6).join(" ")}`
31215
+ manualCommand: `npx ${npxArgs.map(shellQuote5).join(" ")}`
31363
31216
  });
31364
31217
  }
31365
31218
  return commands;
31366
31219
  }
31367
31220
  function runOneSkillsInstall(install) {
31368
31221
  return new Promise((resolve15) => {
31369
- const child = (0, import_node_child_process7.spawn)(install.command, install.args, {
31222
+ const child = (0, import_node_child_process6.spawn)(install.command, install.args, {
31370
31223
  stdio: ["ignore", "ignore", "pipe"],
31371
31224
  env: process.env
31372
31225
  });
@@ -31450,7 +31303,7 @@ function runLegacySkillsCleanup() {
31450
31303
  }
31451
31304
  ];
31452
31305
  for (const candidate of candidates) {
31453
- const result = (0, import_node_child_process7.spawnSync)(candidate.command, candidate.args, {
31306
+ const result = (0, import_node_child_process6.spawnSync)(candidate.command, candidate.args, {
31454
31307
  stdio: "ignore",
31455
31308
  env: process.env,
31456
31309
  shell: process.platform === "win32"