@cargo-ai/cli 1.0.135 → 1.0.138

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.
@@ -19,7 +19,8 @@
19
19
  /** One line, for a footer where vertical space is somebody else's error. */
20
20
  export declare const AGENT_SKILLS_HINT = "Coding agents: install the Cargo skills with `npx skills add getcargohq/cargo-skills`";
21
21
  /**
22
- * Printed after a successful sign-in.
22
+ * Printed after a successful sign-in that did not end with the skills
23
+ * installed (see `offerAgentSkills`).
23
24
  *
24
25
  * Deliberately two lines and no more. A sign-in banner that scrolls is a banner
25
26
  * people configure away, and this fires at most a handful of times per machine
@@ -31,4 +32,23 @@ export declare const AGENT_SKILLS_HINT = "Coding agents: install the Cargo skill
31
32
  * somebody adds one, and nothing in CI was ever going to catch it here.
32
33
  */
33
34
  export declare const AGENT_SKILLS_NEXT_STEP: string;
35
+ export type AgentSkillsOfferDeps = {
36
+ ensureSkillsInstalled: (cwd: string) => Promise<boolean>;
37
+ print: (message: string) => void;
38
+ };
39
+ /**
40
+ * Offer the skills install right after sign-in, falling back to printing the
41
+ * commands.
42
+ *
43
+ * Printing alone is what produced the gap above: the lines scroll past and the
44
+ * install never happens. Asking turns the one moment we know someone is
45
+ * watching into a single keypress. The prompt is the agent handoff's own, so a
46
+ * machine that already has the bundle (globally or in this repo) is not asked,
47
+ * and an agent or a CI run never is.
48
+ *
49
+ * Whatever stops the install — no terminal, a declined prompt, an installer
50
+ * that failed — still leaves the commands on screen, so nobody ends sign-in
51
+ * with less than they used to get.
52
+ */
53
+ export declare function offerAgentSkills(deps?: AgentSkillsOfferDeps): Promise<void>;
34
54
  //# sourceMappingURL=agentSkills.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"agentSkills.d.ts","sourceRoot":"","sources":["../src/agentSkills.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,4EAA4E;AAC5E,eAAO,MAAM,iBAAiB,0FAC2D,CAAC;AAE1F;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,sBAAsB,QAIvB,CAAC"}
1
+ {"version":3,"file":"agentSkills.d.ts","sourceRoot":"","sources":["../src/agentSkills.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAMH,4EAA4E;AAC5E,eAAO,MAAM,iBAAiB,0FAC2D,CAAC;AAE1F;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,sBAAsB,QAIvB,CAAC;AAEb,MAAM,MAAM,oBAAoB,GAAG;IACjC,qBAAqB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACzD,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAClC,CAAC;AAOF;;;;;;;;;;;;;GAaG;AACH,wBAAsB,gBAAgB,CACpC,IAAI,GAAE,oBAAkC,GACvC,OAAO,CAAC,IAAI,CAAC,CAQf"}
@@ -16,10 +16,13 @@
16
16
  * Keep the strings here rather than at each call site, so a change to how the
17
17
  * bundles are named or installed cannot land in `--help` and miss sign-in.
18
18
  */
19
+ import { ensureSkillsInstalled } from "@cargo-ai/cdk/cli";
20
+ import { info } from "./commands/runHandler.js";
19
21
  /** One line, for a footer where vertical space is somebody else's error. */
20
22
  export const AGENT_SKILLS_HINT = "Coding agents: install the Cargo skills with `npx skills add getcargohq/cargo-skills`";
21
23
  /**
22
- * Printed after a successful sign-in.
24
+ * Printed after a successful sign-in that did not end with the skills
25
+ * installed (see `offerAgentSkills`).
23
26
  *
24
27
  * Deliberately two lines and no more. A sign-in banner that scrolls is a banner
25
28
  * people configure away, and this fires at most a handful of times per machine
@@ -35,3 +38,28 @@ export const AGENT_SKILLS_NEXT_STEP = [
35
38
  " npx skills add getcargohq/cargo-skills every command, as agent skills",
36
39
  " npx skills add getcargohq/gtm-skills standalone one-job GTM skills",
37
40
  ].join("\n");
41
+ const machineDeps = {
42
+ ensureSkillsInstalled,
43
+ print: info,
44
+ };
45
+ /**
46
+ * Offer the skills install right after sign-in, falling back to printing the
47
+ * commands.
48
+ *
49
+ * Printing alone is what produced the gap above: the lines scroll past and the
50
+ * install never happens. Asking turns the one moment we know someone is
51
+ * watching into a single keypress. The prompt is the agent handoff's own, so a
52
+ * machine that already has the bundle (globally or in this repo) is not asked,
53
+ * and an agent or a CI run never is.
54
+ *
55
+ * Whatever stops the install — no terminal, a declined prompt, an installer
56
+ * that failed — still leaves the commands on screen, so nobody ends sign-in
57
+ * with less than they used to get.
58
+ */
59
+ export async function offerAgentSkills(deps = machineDeps) {
60
+ const installed = await deps.ensureSkillsInstalled(process.cwd());
61
+ if (installed === true) {
62
+ return;
63
+ }
64
+ deps.print(AGENT_SKILLS_NEXT_STEP);
65
+ }
@@ -1,4 +1,4 @@
1
- import { AGENT_SKILLS_NEXT_STEP } from "../../agentSkills.js";
1
+ import { offerAgentSkills } from "../../agentSkills.js";
2
2
  import { getCredentialsPath } from "../../credentials.js";
3
3
  import { askQuestion, openPromptInput } from "../../utils/prompt.js";
4
4
  import { ExitCodes, failWith, info, outputJson, startSpinner, success, } from "../runHandler.js";
@@ -52,7 +52,7 @@ export async function runEmailLogin(opts) {
52
52
  return;
53
53
  }
54
54
  success(`Signed in as ${result.email}. Workspace: ${result.workspace.name}.`);
55
- info(AGENT_SKILLS_NEXT_STEP);
55
+ await offerAgentSkills();
56
56
  outputJson({
57
57
  ok: true,
58
58
  status: "signedIn",
@@ -1,6 +1,6 @@
1
1
  import { declarePrompt, revokeSession } from "@cargo-ai/cdk/cli";
2
2
  import { Option } from "commander";
3
- import { AGENT_SKILLS_NEXT_STEP } from "../../agentSkills.js";
3
+ import { offerAgentSkills } from "../../agentSkills.js";
4
4
  import { getConfig } from "../../config.js";
5
5
  import { clearCredentials, CredentialsNotClearedError, getCredentialsPath, loadCredentials, saveCredentials, } from "../../credentials.js";
6
6
  import { parseBooleanOption } from "../../utils/booleanOption.js";
@@ -140,7 +140,7 @@ async function runLogin(opts) {
140
140
  baseUrl: opts.baseUrl,
141
141
  });
142
142
  success("Signed in with API token.");
143
- info(AGENT_SKILLS_NEXT_STEP);
143
+ await offerAgentSkills();
144
144
  outputJson({
145
145
  ok: true,
146
146
  status: "signedIn",
@@ -159,7 +159,7 @@ async function runLogin(opts) {
159
159
  workspaceName: opts.workspaceName,
160
160
  });
161
161
  success(`Signed in. Default workspace: ${workspace.name}.`);
162
- info(AGENT_SKILLS_NEXT_STEP);
162
+ await offerAgentSkills();
163
163
  outputJson({
164
164
  ok: true,
165
165
  status: "signedIn",
@@ -1 +1 @@
1
- {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA+KzC,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,OAAO,EAChB,cAAc,EAAE,MAAM,GACrB,IAAI,CAgFN"}
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA+KzC,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,OAAO,EAChB,cAAc,EAAE,MAAM,GACrB,IAAI,CAkFN"}
@@ -125,7 +125,8 @@ export function registerDoctorCommand(program, currentVersion) {
125
125
  Runs every check and reports all results as one JSON object, then exits with the
126
126
  most severe failure:
127
127
 
128
- 0 healthy (an outdated CLI or a pin mismatch is reported but never fails the check)
128
+ 0 healthy (an outdated CLI, a pin mismatch or missing agent skills is
129
+ reported but never fails the check)
129
130
  1 API unreachable or returned an unexpected error
130
131
  3 not authenticated (no credentials, or the API rejected them)
131
132
  4 permission denied for the configured workspace
@@ -167,6 +168,7 @@ Examples:
167
168
  currentVersion,
168
169
  latestVersion,
169
170
  latestSkillsPin,
171
+ cwd: process.cwd(),
170
172
  });
171
173
  const apiIssue = describeApiIssue(api);
172
174
  const issues = apiIssue === undefined
@@ -1 +1 @@
1
- {"version":3,"file":"action.d.ts","sourceRoot":"","sources":["../../../src/commands/orchestration/action.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AA0BxC,eAAO,MAAM,mBAAmB,8BAA8B,CAAC;AAC/D,eAAO,MAAM,eAAe,yCAAyC,CAAC;AAEtE,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,OAAO,EACf,MAAM,EAAE,MAAM,GAAG,EACjB,YAAY,EAAE,CAAC,OAAO,CAAC,EAAE,MAAM,KAAK,GAAG,GACtC,IAAI,CA6UN"}
1
+ {"version":3,"file":"action.d.ts","sourceRoot":"","sources":["../../../src/commands/orchestration/action.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AA0BxC,eAAO,MAAM,mBAAmB,8BAA8B,CAAC;AAC/D,eAAO,MAAM,eAAe,yCAAyC,CAAC;AAEtE,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,OAAO,EACf,MAAM,EAAE,MAAM,GAAG,EACjB,YAAY,EAAE,CAAC,OAAO,CAAC,EAAE,MAAM,KAAK,GAAG,GACtC,IAAI,CAkWN"}
@@ -20,6 +20,11 @@ graph needed. Creates a run and consumes credits.
20
20
  - List first: 'cargo-ai orchestration action list enrich'
21
21
  Each result includes an 'action' object for execute / execute-batch /
22
22
  get-output-schema.
23
+ - Cargo's presets (Find email, Find phone, Verify email, ...) are read-only
24
+ tools and agents seeded into every workspace, and list first on equal
25
+ relevance. A preset can also be addressed by its templateSlug, and then the
26
+ same action works in every workspace:
27
+ '{"kind":"tool","templateSlug":"email_waterfall"}'.
23
28
  - Inputs go in --data, not in the action. 'config' is optional; omit it.
24
29
  - The run is asynchronous: pass --wait-until-finished, or poll it with
25
30
  'cargo-ai orchestration run get <uuid>'.
@@ -41,11 +46,19 @@ To debug a node inside an existing workflow instead, use
41
46
  .addHelpText("after", `
42
47
  Each result includes an 'action' object you can pass to execute, execute-batch,
43
48
  or get-output-schema. All query terms must match (AND). Matches on the action
44
- slug or name rank above integration matches, which rank above description.
49
+ slug or name rank above integration matches, which rank above description. On
50
+ equal relevance a Cargo preset ranks first: presets are the read-only tools and
51
+ agents seeded into every workspace, and a preset tool is the one call that
52
+ tries several providers.
45
53
 
46
54
  Billed actions carry a 'credits' array — this is where pricing lives, so it is
47
- the answer to "what does <action> cost". Actions without it cost no credits.
48
- Each entry is one of three shapes, selected by the 'config' it matches:
55
+ the answer to "what does <action> cost". A connector or native action without
56
+ it costs no credits; a tool or agent without it is priced by the steps it runs,
57
+ so its absence does not mean free. A tool that declares its price carries fixed
58
+ entries for the cheapest and the dearest path through it (a waterfall stops at
59
+ the first provider that answers): it costs between the lowest and the highest.
60
+
61
+ Each 'credits' entry is one of three shapes, selected by the 'config' it matches:
49
62
 
50
63
  - fixed: 'cost' credits per call.
51
64
  - unit: 'cost' credits per 'unit' consumed, plus 'fixedCost' per call.
@@ -53,11 +66,12 @@ Each entry is one of three shapes, selected by the 'config' it matches:
53
66
 
54
67
  'fixedCost' is a base charge on top of the metered rate, not an alternative to
55
68
  it — a search billed 0.175 fixedCost + 0.025 per item costs 0.2 for one item.
56
- When several entries are present the price depends on config, and each entry's
57
- 'config.jsonSchema' const/enum is what selects it (an LLM model, a phone-or-
58
- email toggle).
69
+ On a connector or native action, several entries mean the price depends on
70
+ config, and each entry's 'config.jsonSchema' const/enum is what selects it (an
71
+ LLM model, a phone-or-email toggle).
59
72
 
60
73
  Examples:
74
+ $ cargo-ai orchestration action list find email
61
75
  $ cargo-ai orchestration action list enrich
62
76
  $ cargo-ai orchestration action list --kind tool
63
77
  $ cargo-ai orchestration action list send --kind connector --integration-slug slack
@@ -105,7 +119,12 @@ from the action's output schema, marked
105
119
  "dryRun", with no provider called and no credits used. An action whose output
106
120
  depends on its configuration has no fixed shape to show, and the dry run says so.
107
121
 
122
+ A Cargo preset can also be addressed by its templateSlug, which resolves to this
123
+ workspace's copy of the tool or agent, so the same command works in every
124
+ workspace.
125
+
108
126
  Examples:
127
+ $ cargo-ai orchestration action execute --action '{"kind":"tool","templateSlug":"email_waterfall"}' --data '{"firstName":"Ada","lastName":"Lovelace","companyDomain":"example.com"}' --wait-until-finished
109
128
  $ cargo-ai orchestration action execute --action '{"kind":"tool","toolUuid":"550e8400-..."}' --data '{"email":"user@example.com"}'
110
129
  $ cargo-ai orchestration action execute --action '{"kind":"connector","integrationSlug":"slack","actionSlug":"postMessage","connectorUuid":"..."}' --data '{"channelId":"C0123456789","format":"markdown","body":"hello"}' --wait-until-finished
111
130
  $ cargo-ai orchestration action execute --action '{"kind":"connector","integrationSlug":"aiArk","actionSlug":"enrichCompany"}' --data '{"domain":"example.com"}' --dry-run`)
@@ -143,6 +162,7 @@ Examples:
143
162
  .option("--polling-interval <ms>", "Polling interval in milliseconds, used with --wait-until-finished (integer, default: 5000)", "5000")
144
163
  .addHelpText("after", `
145
164
  Examples:
165
+ $ cargo-ai orchestration action execute-batch --action '{"kind":"tool","templateSlug":"email_validator"}' --records '[{"email":"a@b.com"},{"email":"c@d.com"}]' --limit 1 --wait-until-finished
146
166
  $ cargo-ai orchestration action execute-batch --action '{"kind":"tool","toolUuid":"550e8400-..."}' --records '[{"email":"a@b.com"},{"email":"c@d.com"}]'
147
167
  $ cargo-ai orchestration action execute-batch --action '{"kind":"connector","integrationSlug":"slack","actionSlug":"postMessage","connectorUuid":"..."}' --records '[{"channelId":"C0123456789","format":"markdown","body":"hello"}]' --wait-until-finished
148
168
  $ cargo-ai orchestration action execute-batch --action '{"kind":"connector","integrationSlug":"findyMail","actionSlug":"findEmail"}' --records '[{"name":"Ada Lovelace","domain":"example.com"},{"linkedinUrl":"https://www.linkedin.com/in/ada"}]' --limit 1 --wait-until-finished`)
@@ -186,6 +206,7 @@ Some actions shape their output from their inputs — a HubSpot object type, a
186
206
  Google Sheet. Pass those in --data, exactly as you would to 'action execute'.
187
207
 
188
208
  Examples:
209
+ $ cargo-ai orchestration action get-output-schema --action '{"kind":"tool","templateSlug":"phone_waterfall"}'
189
210
  $ cargo-ai orchestration action get-output-schema --action '{"kind":"tool","toolUuid":"550e8400-..."}'
190
211
  $ cargo-ai orchestration action get-output-schema --action '{"kind":"connector","integrationSlug":"clearbit","actionSlug":"enrichCompany"}'
191
212
  $ cargo-ai orchestration action get-output-schema --action '{"kind":"connector","integrationSlug":"hubspot","actionSlug":"findRecords"}' --data '{"objectType":"contacts"}'`)
package/build/index.js CHANGED
@@ -300,10 +300,13 @@ async function openPalette(startPath) {
300
300
  const agents = availableCodingAgents();
301
301
  // Read after the refresh above, which fetches the skills pin alongside.
302
302
  const latestSkillsPin = cachedLatestSkillsPin();
303
+ // The cwd is read per call: a command run from the palette can install the
304
+ // skills into the project it is standing in.
303
305
  const collectIssues = () => collectSetupIssues({
304
306
  currentVersion: version,
305
307
  latestVersion,
306
308
  latestSkillsPin,
309
+ cwd: process.cwd(),
307
310
  });
308
311
  // Re-read after each command: signing in or out from inside the palette
309
312
  // changes both what the setup line says and which rows are worth pinning.
@@ -19,15 +19,25 @@ export type SetupIssueInput = {
19
19
  * stale pin and the warning has nothing to offer.
20
20
  */
21
21
  latestSkillsPin?: string;
22
+ /**
23
+ * Where a coding agent would be opened. Passing one opts this caller in to
24
+ * reporting skills that are not installed at all, which only the palette and
25
+ * `doctor` do. The pre-command header does not: it prints before every
26
+ * command, and someone working the CLI by hand, with no coding agent, would
27
+ * see a line they could only clear by installing something they do not use.
28
+ * Agents, who do need the skills, run without a TTY and never see the header.
29
+ */
30
+ cwd?: string;
22
31
  };
23
32
  /**
24
- * The two facts this reads off the machine. Injected so the rules — which side
25
- * of a pin mismatch to update, when an outdated CLI is this line's business at
33
+ * The facts this reads off the machine. Injected so the rules — which side of
34
+ * a pin mismatch to update, when an outdated CLI is this line's business at
26
35
  * all — can be tested without a home directory.
27
36
  */
28
37
  export type SetupIssueDeps = {
29
38
  isSignedIn: () => boolean;
30
39
  readSkillsPin: () => SkillsPin | undefined;
40
+ skillsInstalledFor: (cwd: string) => boolean;
31
41
  };
32
42
  export declare function collectSetupIssues(input: SetupIssueInput, deps?: SetupIssueDeps): SetupIssue[];
33
43
  //# sourceMappingURL=setupIssues.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"setupIssues.d.ts","sourceRoot":"","sources":["../src/setupIssues.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EACL,UAAU,EACV,aAAa,EAEd,MAAM,mBAAmB,CAAC;AAM3B,YAAY,EAAE,SAAS,EAAE,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,CAAC;AAErC,MAAM,MAAM,eAAe,GAAG;IAC5B,cAAc,EAAE,MAAM,CAAC;IACvB;;;;;OAKG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;;;OAMG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF;;;;GAIG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B,UAAU,EAAE,MAAM,OAAO,CAAC;IAC1B,aAAa,EAAE,MAAM,SAAS,GAAG,SAAS,CAAC;CAC5C,CAAC;AAIF,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,eAAe,EACtB,IAAI,GAAE,cAA4B,GACjC,UAAU,EAAE,CAgDd"}
1
+ {"version":3,"file":"setupIssues.d.ts","sourceRoot":"","sources":["../src/setupIssues.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EACL,UAAU,EACV,aAAa,EAGd,MAAM,mBAAmB,CAAC;AAM3B,YAAY,EAAE,SAAS,EAAE,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,CAAC;AAErC,MAAM,MAAM,eAAe,GAAG;IAC5B,cAAc,EAAE,MAAM,CAAC;IACvB;;;;;OAKG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;;;OAMG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;;;;;OAOG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,CAAC;AAEF;;;;GAIG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B,UAAU,EAAE,MAAM,OAAO,CAAC;IAC1B,aAAa,EAAE,MAAM,SAAS,GAAG,SAAS,CAAC;IAC3C,kBAAkB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;CAC9C,CAAC;AAQF,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,eAAe,EACtB,IAAI,GAAE,cAA4B,GACjC,UAAU,EAAE,CAwDd"}
@@ -1,14 +1,18 @@
1
1
  // What is wrong with this machine's Cargo setup, and the command that fixes
2
2
  // each one.
3
3
  //
4
- // This runs before every command, so every check here is a small file read or
5
- // cheaper — no network. `cargo-ai doctor` is the same list with the online
4
+ // This runs before every command (and in the palette), so every check here is
5
+ // a small file read or cheaper — no network. `cargo-ai doctor` is the same list with the online
6
6
  // checks added.
7
- import { isSignedIn, readSkillsPin, SKILLS_INSTALL_COMMAND, } from "@cargo-ai/cdk/cli";
7
+ import { isSignedIn, readSkillsPin, SKILLS_INSTALL_COMMAND, skillsInstalledFor, } from "@cargo-ai/cdk/cli";
8
8
  import { isOutdated, UPDATE_COMMAND } from "./version.js";
9
9
  const LOGIN_COMMAND = "cargo-ai login --oauth";
10
10
  export { isSignedIn, readSkillsPin };
11
- const machineDeps = { isSignedIn, readSkillsPin };
11
+ const machineDeps = {
12
+ isSignedIn,
13
+ readSkillsPin,
14
+ skillsInstalledFor,
15
+ };
12
16
  export function collectSetupIssues(input, deps = machineDeps) {
13
17
  const issues = [];
14
18
  if (deps.isSignedIn() === false) {
@@ -46,5 +50,12 @@ export function collectSetupIssues(input, deps = machineDeps) {
46
50
  });
47
51
  }
48
52
  }
53
+ if (input.cwd !== undefined && deps.skillsInstalledFor(input.cwd) === false) {
54
+ issues.push({
55
+ key: "skills-missing",
56
+ label: "no Cargo skills for coding agents",
57
+ fix: SKILLS_INSTALL_COMMAND,
58
+ });
59
+ }
49
60
  return issues;
50
61
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cargo-ai/cli",
3
- "version": "1.0.135",
3
+ "version": "1.0.138",
4
4
  "mcpName": "io.github.getcargohq/cargo",
5
5
  "private": false,
6
6
  "license": "UNLICENSED",
@@ -74,13 +74,13 @@
74
74
  "dependencies": {
75
75
  "@ai-sdk/harness": "1.0.144",
76
76
  "@ai-sdk/harness-claude-code": "1.0.148",
77
- "@cargo-ai/api": "^1.0.102",
77
+ "@cargo-ai/api": "^1.0.103",
78
78
  "@cargo-ai/app-sdk": "^1.0.11",
79
- "@cargo-ai/cdk": "^1.0.126",
79
+ "@cargo-ai/cdk": "^1.0.127",
80
80
  "@cargo-ai/types": "^1.0.104",
81
81
  "@cargo-ai/utils": "^1.0.35",
82
82
  "@cargo-ai/worker-sdk": "^1.0.21",
83
- "@modelcontextprotocol/sdk": "^1.31.0",
83
+ "@modelcontextprotocol/sdk": "^1.32.0",
84
84
  "ai": "^7.0.133",
85
85
  "ai-sdk-sandbox-local": "^0.1.2",
86
86
  "commander": "^12.1.0",