@lobu/cli 3.0.12 → 3.0.19
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/dist/commands/connections/add.d.ts +2 -0
- package/dist/commands/connections/add.d.ts.map +1 -0
- package/dist/commands/connections/add.js +46 -0
- package/dist/commands/connections/add.js.map +1 -0
- package/dist/commands/connections/list.d.ts +2 -0
- package/dist/commands/connections/list.d.ts.map +1 -0
- package/dist/commands/connections/list.js +25 -0
- package/dist/commands/connections/list.js.map +1 -0
- package/dist/commands/connections/platforms.d.ts +18 -0
- package/dist/commands/connections/platforms.d.ts.map +1 -0
- package/dist/commands/connections/platforms.js +160 -0
- package/dist/commands/connections/platforms.js.map +1 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +4 -141
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/providers/add.d.ts.map +1 -1
- package/dist/commands/providers/add.js +8 -29
- package/dist/commands/providers/add.js.map +1 -1
- package/dist/commands/skills/add.d.ts.map +1 -1
- package/dist/commands/skills/add.js +15 -29
- package/dist/commands/skills/add.js.map +1 -1
- package/dist/config/agent-helpers.d.ts +37 -0
- package/dist/config/agent-helpers.d.ts.map +1 -0
- package/dist/config/agent-helpers.js +58 -0
- package/dist/config/agent-helpers.js.map +1 -0
- package/dist/config/schema.d.ts +5 -713
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +5 -58
- package/dist/config/schema.js.map +1 -1
- package/dist/eval/types.d.ts +26 -154
- package/dist/eval/types.d.ts.map +1 -1
- package/dist/eval/types.js +1 -1
- package/dist/eval/types.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -1
- package/dist/system-skills.json +7 -1
- package/package.json +9 -4
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { join } from "node:path";
|
|
1
|
+
import { writeFile } from "node:fs/promises";
|
|
3
2
|
import chalk from "chalk";
|
|
4
|
-
import {
|
|
3
|
+
import { appendTomlBlock, loadAgentContext, } from "../../config/agent-helpers.js";
|
|
5
4
|
import { CONFIG_FILENAME } from "../../config/loader.js";
|
|
6
5
|
import { getSkillById } from "./registry.js";
|
|
7
6
|
export async function skillsAddCommand(cwd, skillId) {
|
|
@@ -11,46 +10,33 @@ export async function skillsAddCommand(cwd, skillId) {
|
|
|
11
10
|
console.log(chalk.dim(" Run `npx @lobu/cli skills list` to see available skills.\n"));
|
|
12
11
|
return;
|
|
13
12
|
}
|
|
14
|
-
const
|
|
15
|
-
|
|
16
|
-
try {
|
|
17
|
-
raw = await readFile(configPath, "utf-8");
|
|
18
|
-
}
|
|
19
|
-
catch {
|
|
20
|
-
console.log(chalk.red(`\n No ${CONFIG_FILENAME} found. Run \`lobu init\` first.\n`));
|
|
21
|
-
return;
|
|
22
|
-
}
|
|
23
|
-
const parsed = parseToml(raw);
|
|
24
|
-
const agents = parsed.agents;
|
|
25
|
-
if (!agents || Object.keys(agents).length === 0) {
|
|
26
|
-
console.log(chalk.red("\n No agents found in lobu.toml.\n"));
|
|
13
|
+
const ctx = await loadAgentContext(cwd);
|
|
14
|
+
if (!ctx)
|
|
27
15
|
return;
|
|
28
|
-
}
|
|
29
|
-
const
|
|
30
|
-
const agent = agents[agentId];
|
|
31
|
-
const skills = (agent.skills ?? { enabled: [] });
|
|
32
|
-
const enabled = (skills.enabled ?? []);
|
|
16
|
+
const skillsSection = (ctx.agent.skills ?? { enabled: [] });
|
|
17
|
+
const enabled = (skillsSection.enabled ?? []);
|
|
33
18
|
if (enabled.includes(skillId)) {
|
|
34
19
|
console.log(chalk.yellow(`\n Skill "${skillId}" is already enabled.\n`));
|
|
35
20
|
return;
|
|
36
21
|
}
|
|
37
22
|
// Update the enabled array in-place via regex to preserve file formatting
|
|
38
|
-
const skillsKey = `agents.${agentId}.skills`;
|
|
23
|
+
const skillsKey = `agents.${ctx.agentId}.skills`;
|
|
39
24
|
const enabledPattern = new RegExp(`(\\[${skillsKey.replace(/\./g, "\\.")}\\][^\\[]*enabled\\s*=\\s*\\[)([^\\]]*)\\]`);
|
|
40
|
-
const match = raw.match(enabledPattern);
|
|
25
|
+
const match = ctx.raw.match(enabledPattern);
|
|
41
26
|
if (match) {
|
|
42
27
|
const existing = match[2].trim();
|
|
43
28
|
const newList = existing ? `${existing}, "${skillId}"` : `"${skillId}"`;
|
|
44
|
-
const updated = raw.replace(enabledPattern, `$1${newList}]`);
|
|
45
|
-
await writeFile(configPath, updated);
|
|
29
|
+
const updated = ctx.raw.replace(enabledPattern, `$1${newList}]`);
|
|
30
|
+
await writeFile(ctx.configPath, updated);
|
|
46
31
|
}
|
|
47
32
|
else {
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
33
|
+
await appendTomlBlock(ctx, [
|
|
34
|
+
"",
|
|
35
|
+
`[${skillsKey}]`,
|
|
36
|
+
`enabled = ["${skillId}"]`,
|
|
37
|
+
]);
|
|
51
38
|
}
|
|
52
39
|
console.log(chalk.green(`\n Added "${skillId}" to ${CONFIG_FILENAME}`));
|
|
53
|
-
// Show required secrets if provider
|
|
54
40
|
if (skill.providers) {
|
|
55
41
|
const envVars = skill.providers.map((p) => p.envVarName);
|
|
56
42
|
if (envVars.length > 0) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add.js","sourceRoot":"","sources":["../../../src/commands/skills/add.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"add.js","sourceRoot":"","sources":["../../../src/commands/skills/add.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared helpers for the `lobu {providers,skills,connections} add` commands.
|
|
3
|
+
* All three follow the same pattern: read lobu.toml, locate the first agent,
|
|
4
|
+
* apply a mutation, write the updated file, and optionally set secrets.
|
|
5
|
+
*/
|
|
6
|
+
export interface AgentContext {
|
|
7
|
+
/** Absolute path to lobu.toml */
|
|
8
|
+
configPath: string;
|
|
9
|
+
/** Raw TOML text */
|
|
10
|
+
raw: string;
|
|
11
|
+
/** Parsed TOML object */
|
|
12
|
+
parsed: Record<string, unknown>;
|
|
13
|
+
/** ID of the first agent (Lobu assumes one agent per project today) */
|
|
14
|
+
agentId: string;
|
|
15
|
+
/** The first agent's config object */
|
|
16
|
+
agent: Record<string, unknown>;
|
|
17
|
+
/** All agents keyed by ID */
|
|
18
|
+
agents: Record<string, Record<string, unknown>>;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Load lobu.toml and return the first agent's context.
|
|
22
|
+
* Prints a red error message and returns null if the file or agent is missing.
|
|
23
|
+
*/
|
|
24
|
+
export declare function loadAgentContext(cwd: string): Promise<AgentContext | null>;
|
|
25
|
+
/**
|
|
26
|
+
* Append a block of TOML lines to the end of lobu.toml.
|
|
27
|
+
* Preserves existing comments/formatting by editing the raw text.
|
|
28
|
+
*/
|
|
29
|
+
export declare function appendTomlBlock(ctx: AgentContext, lines: string[]): Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* Write multiple secrets to .env via the secrets command.
|
|
32
|
+
*/
|
|
33
|
+
export declare function setSecrets(cwd: string, secrets: Array<{
|
|
34
|
+
envVar: string;
|
|
35
|
+
value: string;
|
|
36
|
+
}>): Promise<void>;
|
|
37
|
+
//# sourceMappingURL=agent-helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-helpers.d.ts","sourceRoot":"","sources":["../../src/config/agent-helpers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AASH,MAAM,WAAW,YAAY;IAC3B,iCAAiC;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,oBAAoB;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,yBAAyB;IACzB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,uEAAuE;IACvE,OAAO,EAAE,MAAM,CAAC;IAChB,sCAAsC;IACtC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,6BAA6B;IAC7B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACjD;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CA8B9B;AAED;;;GAGG;AACH,wBAAsB,eAAe,CACnC,GAAG,EAAE,YAAY,EACjB,KAAK,EAAE,MAAM,EAAE,GACd,OAAO,CAAC,IAAI,CAAC,CAGf;AAED;;GAEG;AACH,wBAAsB,UAAU,CAC9B,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,KAAK,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,GAChD,OAAO,CAAC,IAAI,CAAC,CAIf"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared helpers for the `lobu {providers,skills,connections} add` commands.
|
|
3
|
+
* All three follow the same pattern: read lobu.toml, locate the first agent,
|
|
4
|
+
* apply a mutation, write the updated file, and optionally set secrets.
|
|
5
|
+
*/
|
|
6
|
+
import { readFile, writeFile } from "node:fs/promises";
|
|
7
|
+
import { join } from "node:path";
|
|
8
|
+
import chalk from "chalk";
|
|
9
|
+
import { parse as parseToml } from "smol-toml";
|
|
10
|
+
import { secretsSetCommand } from "../commands/secrets.js";
|
|
11
|
+
import { CONFIG_FILENAME } from "./loader.js";
|
|
12
|
+
/**
|
|
13
|
+
* Load lobu.toml and return the first agent's context.
|
|
14
|
+
* Prints a red error message and returns null if the file or agent is missing.
|
|
15
|
+
*/
|
|
16
|
+
export async function loadAgentContext(cwd) {
|
|
17
|
+
const configPath = join(cwd, CONFIG_FILENAME);
|
|
18
|
+
let raw;
|
|
19
|
+
try {
|
|
20
|
+
raw = await readFile(configPath, "utf-8");
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
console.log(chalk.red(`\n No ${CONFIG_FILENAME} found. Run \`lobu init\` first.\n`));
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
const parsed = parseToml(raw);
|
|
27
|
+
const agents = parsed.agents;
|
|
28
|
+
if (!agents || Object.keys(agents).length === 0) {
|
|
29
|
+
console.log(chalk.red(`\n No agents found in ${CONFIG_FILENAME}.\n`));
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
const agentId = Object.keys(agents)[0];
|
|
33
|
+
return {
|
|
34
|
+
configPath,
|
|
35
|
+
raw,
|
|
36
|
+
parsed,
|
|
37
|
+
agentId,
|
|
38
|
+
agent: agents[agentId],
|
|
39
|
+
agents,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Append a block of TOML lines to the end of lobu.toml.
|
|
44
|
+
* Preserves existing comments/formatting by editing the raw text.
|
|
45
|
+
*/
|
|
46
|
+
export async function appendTomlBlock(ctx, lines) {
|
|
47
|
+
const block = lines.join("\n");
|
|
48
|
+
await writeFile(ctx.configPath, `${ctx.raw.trimEnd()}\n${block}\n`);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Write multiple secrets to .env via the secrets command.
|
|
52
|
+
*/
|
|
53
|
+
export async function setSecrets(cwd, secrets) {
|
|
54
|
+
for (const secret of secrets) {
|
|
55
|
+
await secretsSetCommand(cwd, secret.envVar, secret.value);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=agent-helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-helpers.js","sourceRoot":"","sources":["../../src/config/agent-helpers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAiB9C;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,GAAW;IAEX,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;IAC9C,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CAAC,UAAU,eAAe,oCAAoC,CAAC,CACzE,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAA4B,CAAC;IACzD,MAAM,MAAM,GAAG,MAAM,CAAC,MAET,CAAC;IACd,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,0BAA0B,eAAe,KAAK,CAAC,CAAC,CAAC;QACvE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAE,CAAC;IACxC,OAAO;QACL,UAAU;QACV,GAAG;QACH,MAAM;QACN,OAAO;QACP,KAAK,EAAE,MAAM,CAAC,OAAO,CAAE;QACvB,MAAM;KACP,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,GAAiB,EACjB,KAAe;IAEf,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,SAAS,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,KAAK,IAAI,CAAC,CAAC;AACtE,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,GAAW,EACX,OAAiD;IAEjD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,iBAAiB,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;IAC5D,CAAC;AACH,CAAC"}
|