@kalphq/cli 0.0.0-dev-20260416084549 → 0.0.0-dev-20260416091527

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.
@@ -22,10 +22,17 @@ async function ensureDirectory(path) {
22
22
  await mkdir(path, { recursive: true });
23
23
  }
24
24
  async function installDeps(cwd) {
25
- execSync("npx nci", {
26
- cwd,
27
- stdio: "pipe"
28
- });
25
+ try {
26
+ execSync("npx --no-install nci", {
27
+ cwd,
28
+ stdio: "pipe"
29
+ });
30
+ } catch {
31
+ execSync("npm install", {
32
+ cwd,
33
+ stdio: "pipe"
34
+ });
35
+ }
29
36
  }
30
37
 
31
38
  export {
@@ -34,4 +41,4 @@ export {
34
41
  ensureDirectory,
35
42
  installDeps
36
43
  };
37
- //# sourceMappingURL=chunk-LAKPXKSS.js.map
44
+ //# sourceMappingURL=chunk-Q455HC3P.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/fs.ts"],"sourcesContent":["import { access, mkdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { execSync } from \"node:child_process\";\n\nexport async function isProjectInitialized(cwd: string): Promise<boolean> {\n try {\n await access(join(cwd, \"kalp.config.ts\"));\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function ensureConfig(cwd: string): Promise<void> {\n const initialized = await isProjectInitialized(cwd);\n if (!initialized) {\n throw new Error(\"kalp.config.ts not found\");\n }\n}\n\nexport async function ensureDirectory(path: string): Promise<void> {\n await mkdir(path, { recursive: true });\n}\n\nexport async function installDeps(cwd: string): Promise<void> {\n try {\n execSync(\"npx --no-install nci\", {\n cwd,\n stdio: \"pipe\",\n });\n } catch {\n execSync(\"npm install\", {\n cwd,\n stdio: \"pipe\",\n });\n }\n}\n"],"mappings":";;;AAAA,SAAS,QAAQ,aAAa;AAC9B,SAAS,YAAY;AACrB,SAAS,gBAAgB;AAEzB,eAAsB,qBAAqB,KAA+B;AACxE,MAAI;AACF,UAAM,OAAO,KAAK,KAAK,gBAAgB,CAAC;AACxC,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,aAAa,KAA4B;AAC7D,QAAM,cAAc,MAAM,qBAAqB,GAAG;AAClD,MAAI,CAAC,aAAa;AAChB,UAAM,IAAI,MAAM,0BAA0B;AAAA,EAC5C;AACF;AAEA,eAAsB,gBAAgB,MAA6B;AACjE,QAAM,MAAM,MAAM,EAAE,WAAW,KAAK,CAAC;AACvC;AAEA,eAAsB,YAAY,KAA4B;AAC5D,MAAI;AACF,aAAS,wBAAwB;AAAA,MAC/B;AAAA,MACA,OAAO;AAAA,IACT,CAAC;AAAA,EACH,QAAQ;AACN,aAAS,eAAe;AAAA,MACtB;AAAA,MACA,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AACF;","names":[]}
@@ -8,7 +8,7 @@ import {
8
8
  import {
9
9
  installDeps,
10
10
  isProjectInitialized
11
- } from "./chunk-LAKPXKSS.js";
11
+ } from "./chunk-Q455HC3P.js";
12
12
  import "./chunk-2H7UOFLK.js";
13
13
 
14
14
  // src/commands/create.ts
@@ -43,7 +43,11 @@ var create_default = defineCommand({
43
43
  await installDeps(cwd);
44
44
  s.stop("Dependencies installed");
45
45
  } catch {
46
- s.stop(pc.yellow("Install failed \u2014 run npx nci manually."));
46
+ s.stop(
47
+ pc.yellow(
48
+ "Install failed \u2014 run npx --no-install nci (or npm install) manually."
49
+ )
50
+ );
47
51
  }
48
52
  }
49
53
  s.start(`Scaffolding agent ${pc.cyan(agentAnswers.name)}`);
@@ -69,4 +73,4 @@ var create_default = defineCommand({
69
73
  export {
70
74
  create_default as default
71
75
  };
72
- //# sourceMappingURL=create-T76IFYRP.js.map
76
+ //# sourceMappingURL=create-XJURMQC4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/create.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { scaffoldProject, scaffoldAgent } from \"../scaffold.js\";\nimport { installDeps, isProjectInitialized } from \"../utils/fs.js\";\nimport { promptAgentDetails, promptProjectName } from \"../utils/ui.js\";\n\nconst LOGO = \"🦋\";\n\nexport default defineCommand({\n meta: { name: \"create\", description: \"Add a new agent to the project\" },\n async run() {\n const cwd = process.cwd();\n\n p.intro(`${LOGO} ${pc.bold(\"kalp create\")}`);\n\n // ── Check if project is initialized ─────────────────────────────────\n const needsInit = !(await isProjectInitialized(cwd));\n\n // ── Init phase (inline — one unified timeline) ───────────────────────\n let projectName: string | undefined;\n if (needsInit) {\n p.log.warn(\n `No ${pc.cyan(\"kalp.config.ts\")} found — initializing project first.`,\n );\n projectName = await promptProjectName({\n message: \"Project name?\",\n placeholder: \"my-project\",\n });\n }\n\n // ── Agent prompts ────────────────────────────────────────────────────\n const agentAnswers = await promptAgentDetails();\n\n const s = p.spinner();\n\n // ── Scaffold project if needed ───────────────────────────────────────\n if (needsInit && projectName) {\n s.start(\"Creating project structure\");\n await scaffoldProject({ projectName, targetDir: cwd });\n s.stop(\"Project structure created\");\n\n s.start(\"Installing dependencies\");\n try {\n await installDeps(cwd);\n s.stop(\"Dependencies installed\");\n } catch {\n s.stop(\n pc.yellow(\n \"Install failed — run npx --no-install nci (or npm install) manually.\",\n ),\n );\n }\n }\n\n // ── Scaffold agent ───────────────────────────────────────────────────\n s.start(`Scaffolding agent ${pc.cyan(agentAnswers.name)}`);\n await scaffoldAgent({\n agentName: agentAnswers.name,\n templateId: agentAnswers.templateId,\n cwd,\n });\n s.stop(\"Agent created\");\n\n p.note(\n [\n `${pc.dim(\"•\")} ${pc.cyan(`agents/${agentAnswers.name}/index.ts`)}`,\n `${pc.dim(\"•\")} ${pc.cyan(`agents/${agentAnswers.name}/steps/`)}`,\n `${pc.dim(\"•\")} ${pc.cyan(`agents/${agentAnswers.name}/tools/`)}`,\n ].join(\"\\n\"),\n \"Created\",\n );\n\n p.outro(\n `${LOGO} ${pc.green(`Agent ${pc.bold(agentAnswers.name)} is ready.`)}`,\n );\n },\n});\n"],"mappings":";;;;;;;;;;;;;;AAAA,SAAS,qBAAqB;AAC9B,YAAY,OAAO;AACnB,OAAO,QAAQ;AAKf,IAAM,OAAO;AAEb,IAAO,iBAAQ,cAAc;AAAA,EAC3B,MAAM,EAAE,MAAM,UAAU,aAAa,iCAAiC;AAAA,EACtE,MAAM,MAAM;AACV,UAAM,MAAM,QAAQ,IAAI;AAExB,IAAE,QAAM,GAAG,IAAI,IAAI,GAAG,KAAK,aAAa,CAAC,EAAE;AAG3C,UAAM,YAAY,CAAE,MAAM,qBAAqB,GAAG;AAGlD,QAAI;AACJ,QAAI,WAAW;AACb,MAAE,MAAI;AAAA,QACJ,MAAM,GAAG,KAAK,gBAAgB,CAAC;AAAA,MACjC;AACA,oBAAc,MAAM,kBAAkB;AAAA,QACpC,SAAS;AAAA,QACT,aAAa;AAAA,MACf,CAAC;AAAA,IACH;AAGA,UAAM,eAAe,MAAM,mBAAmB;AAE9C,UAAM,IAAM,UAAQ;AAGpB,QAAI,aAAa,aAAa;AAC5B,QAAE,MAAM,4BAA4B;AACpC,YAAM,gBAAgB,EAAE,aAAa,WAAW,IAAI,CAAC;AACrD,QAAE,KAAK,2BAA2B;AAElC,QAAE,MAAM,yBAAyB;AACjC,UAAI;AACF,cAAM,YAAY,GAAG;AACrB,UAAE,KAAK,wBAAwB;AAAA,MACjC,QAAQ;AACN,UAAE;AAAA,UACA,GAAG;AAAA,YACD;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,MAAE,MAAM,qBAAqB,GAAG,KAAK,aAAa,IAAI,CAAC,EAAE;AACzD,UAAM,cAAc;AAAA,MAClB,WAAW,aAAa;AAAA,MACxB,YAAY,aAAa;AAAA,MACzB;AAAA,IACF,CAAC;AACD,MAAE,KAAK,eAAe;AAEtB,IAAE;AAAA,MACA;AAAA,QACE,GAAG,GAAG,IAAI,QAAG,CAAC,IAAI,GAAG,KAAK,UAAU,aAAa,IAAI,WAAW,CAAC;AAAA,QACjE,GAAG,GAAG,IAAI,QAAG,CAAC,IAAI,GAAG,KAAK,UAAU,aAAa,IAAI,SAAS,CAAC;AAAA,QAC/D,GAAG,GAAG,IAAI,QAAG,CAAC,IAAI,GAAG,KAAK,UAAU,aAAa,IAAI,SAAS,CAAC;AAAA,MACjE,EAAE,KAAK,IAAI;AAAA,MACX;AAAA,IACF;AAEA,IAAE;AAAA,MACA,GAAG,IAAI,IAAI,GAAG,MAAM,SAAS,GAAG,KAAK,aAAa,IAAI,CAAC,YAAY,CAAC;AAAA,IACtE;AAAA,EACF;AACF,CAAC;","names":[]}
package/dist/index.js CHANGED
@@ -5,6 +5,24 @@ import { defineCommand, runMain } from "citty";
5
5
  import * as p from "@clack/prompts";
6
6
  import pc from "picocolors";
7
7
  var LOGO = "\u{1F98B}";
8
+ var COMMANDS = [
9
+ ["init", "Create a new Kalp project"],
10
+ ["create", "Add a new agent"],
11
+ ["push", "Push agent to Kalp"],
12
+ ["link", "Link project to Kalp cloud"],
13
+ ["login", "Authenticate with Kalp"],
14
+ ["logout", "Sign out from Kalp"]
15
+ ];
16
+ function printHelp() {
17
+ p.log.info(`${pc.bold("Usage")}: kalp <command> [options]`);
18
+ console.log("");
19
+ p.log.info(pc.bold("Commands"));
20
+ for (const [name, desc] of COMMANDS) {
21
+ console.log(` ${pc.cyan(name.padEnd(10))}${desc}`);
22
+ }
23
+ console.log("");
24
+ p.log.info(`Run ${pc.cyan("kalp <command> --help")} for more info.`);
25
+ }
8
26
  var main = defineCommand({
9
27
  meta: {
10
28
  name: "kalp",
@@ -20,51 +38,27 @@ var main = defineCommand({
20
38
  }
21
39
  },
22
40
  subCommands: {
23
- init: () => import("./init-SDITDMG6.js").then((r) => r.default),
24
- create: () => import("./create-T76IFYRP.js").then((r) => r.default),
25
- push: () => import("./push-YFAB7TWQ.js").then((r) => r.default),
41
+ init: () => import("./init-K7EASUMM.js").then((r) => r.default),
42
+ create: () => import("./create-XJURMQC4.js").then((r) => r.default),
43
+ push: () => import("./push-YFHHNITO.js").then((r) => r.default),
26
44
  link: () => import("./link-YKDZ7Y6K.js").then((r) => r.default),
27
45
  login: () => import("./login-LBEXP7ET.js").then((r) => r.default),
28
46
  logout: () => import("./logout-S3PV4WE7.js").then((r) => r.default)
29
47
  },
30
48
  run({ args }) {
49
+ const firstArg = process.argv[2];
31
50
  if (args.help) {
32
51
  p.intro(`${LOGO} ${pc.bold("kalp")}`);
33
- p.note(
34
- [
35
- `${pc.dim("Available commands:")}`,
36
- ``,
37
- ` ${pc.cyan("kalp init")} ${pc.dim("\u2014 Create a new Kalp project")}`,
38
- ` ${pc.cyan("kalp create")} ${pc.dim("\u2014 Add a new agent")}`,
39
- ` ${pc.cyan("kalp push")} ${pc.dim("\u2014 Push agent to Kalp")}`,
40
- ` ${pc.cyan("kalp link")} ${pc.dim("\u2014 Link project to Kalp cloud")}`,
41
- ` ${pc.cyan("kalp login")} ${pc.dim("\u2014 Authenticate with Kalp")}`,
42
- ` ${pc.cyan("kalp logout")} ${pc.dim("\u2014 Sign out from Kalp")}`,
43
- ``,
44
- `${pc.dim("Run")} ${pc.cyan("kalp <command> --help")} ${pc.dim("for more info.")}`
45
- ].join("\n"),
46
- "Commands"
47
- );
48
- p.outro(pc.dim("Happy coding \u{1F98B}"));
52
+ printHelp();
53
+ p.outro("Happy coding \u{1F98B}");
54
+ return;
55
+ }
56
+ if (firstArg) {
49
57
  return;
50
58
  }
51
59
  p.intro(`${LOGO} ${pc.bold("kalp")}`);
52
- p.note(
53
- [
54
- `${pc.dim("Available commands:")}`,
55
- ``,
56
- ` ${pc.cyan("kalp init")} ${pc.dim("\u2014 Create a new Kalp project")}`,
57
- ` ${pc.cyan("kalp create")} ${pc.dim("\u2014 Add a new agent")}`,
58
- ` ${pc.cyan("kalp push")} ${pc.dim("\u2014 Push agent to Kalp")}`,
59
- ` ${pc.cyan("kalp link")} ${pc.dim("\u2014 Link project to Kalp cloud")}`,
60
- ` ${pc.cyan("kalp login")} ${pc.dim("\u2014 Authenticate with Kalp")}`,
61
- ` ${pc.cyan("kalp logout")} ${pc.dim("\u2014 Sign out from Kalp")}`,
62
- ``,
63
- `${pc.dim("Run")} ${pc.cyan("kalp <command> --help")} ${pc.dim("for more info.")}`
64
- ].join("\n"),
65
- "Commands"
66
- );
67
- p.outro(pc.dim("Happy coding \u{1F98B}"));
60
+ printHelp();
61
+ p.outro("Happy coding \u{1F98B}");
68
62
  }
69
63
  });
70
64
  runMain(main);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { defineCommand, runMain } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\n\nconst LOGO = \"🦋\";\n\nconst main = defineCommand({\n meta: {\n name: \"kalp\",\n version: \"0.0.1\",\n description: \"🦋 Zero-config agent infrastructure\",\n },\n args: {\n help: {\n type: \"boolean\",\n alias: \"h\",\n description: \"Show help\",\n default: false,\n },\n },\n subCommands: {\n init: () => import(\"./commands/init.js\").then((r) => r.default),\n create: () => import(\"./commands/create.js\").then((r) => r.default),\n push: () => import(\"./commands/push.js\").then((r) => r.default),\n link: () => import(\"./commands/link.js\").then((r) => r.default),\n login: () => import(\"./commands/login.js\").then((r) => r.default),\n logout: () => import(\"./commands/logout.js\").then((r) => r.default),\n },\n run({ args }) {\n if (args.help) {\n p.intro(`${LOGO} ${pc.bold(\"kalp\")}`);\n p.note(\n [\n `${pc.dim(\"Available commands:\")}`,\n ``,\n ` ${pc.cyan(\"kalp init\")} ${pc.dim(\"— Create a new Kalp project\")}`,\n ` ${pc.cyan(\"kalp create\")} ${pc.dim(\"— Add a new agent\")}`,\n ` ${pc.cyan(\"kalp push\")} ${pc.dim(\"— Push agent to Kalp\")}`,\n ` ${pc.cyan(\"kalp link\")} ${pc.dim(\"— Link project to Kalp cloud\")}`,\n ` ${pc.cyan(\"kalp login\")} ${pc.dim(\"— Authenticate with Kalp\")}`,\n ` ${pc.cyan(\"kalp logout\")} ${pc.dim(\"— Sign out from Kalp\")}`,\n ``,\n `${pc.dim(\"Run\")} ${pc.cyan(\"kalp <command> --help\")} ${pc.dim(\"for more info.\")}`,\n ].join(\"\\n\"),\n \"Commands\",\n );\n p.outro(pc.dim(\"Happy coding 🦋\"));\n return;\n }\n // Default: show commands (same as help)\n p.intro(`${LOGO} ${pc.bold(\"kalp\")}`);\n p.note(\n [\n `${pc.dim(\"Available commands:\")}`,\n ``,\n ` ${pc.cyan(\"kalp init\")} ${pc.dim(\"— Create a new Kalp project\")}`,\n ` ${pc.cyan(\"kalp create\")} ${pc.dim(\"— Add a new agent\")}`,\n ` ${pc.cyan(\"kalp push\")} ${pc.dim(\"— Push agent to Kalp\")}`,\n ` ${pc.cyan(\"kalp link\")} ${pc.dim(\"— Link project to Kalp cloud\")}`,\n ` ${pc.cyan(\"kalp login\")} ${pc.dim(\"— Authenticate with Kalp\")}`,\n ` ${pc.cyan(\"kalp logout\")} ${pc.dim(\"— Sign out from Kalp\")}`,\n ``,\n `${pc.dim(\"Run\")} ${pc.cyan(\"kalp <command> --help\")} ${pc.dim(\"for more info.\")}`,\n ].join(\"\\n\"),\n \"Commands\",\n );\n p.outro(pc.dim(\"Happy coding 🦋\"));\n },\n});\n\nrunMain(main);\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { defineCommand, runMain } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\n\nconst LOGO = \"🦋\";\n\nconst COMMANDS = [\n [\"init\", \"Create a new Kalp project\"],\n [\"create\", \"Add a new agent\"],\n [\"push\", \"Push agent to Kalp\"],\n [\"link\", \"Link project to Kalp cloud\"],\n [\"login\", \"Authenticate with Kalp\"],\n [\"logout\", \"Sign out from Kalp\"],\n] as const;\n\nfunction printHelp(): void {\n p.log.info(`${pc.bold(\"Usage\")}: kalp <command> [options]`);\n console.log(\"\");\n p.log.info(pc.bold(\"Commands\"));\n\n for (const [name, desc] of COMMANDS) {\n console.log(` ${pc.cyan(name.padEnd(10))}${desc}`);\n }\n\n console.log(\"\");\n p.log.info(`Run ${pc.cyan(\"kalp <command> --help\")} for more info.`);\n}\n\nconst main = defineCommand({\n meta: {\n name: \"kalp\",\n version: \"0.0.1\",\n description: \"🦋 Zero-config agent infrastructure\",\n },\n args: {\n help: {\n type: \"boolean\",\n alias: \"h\",\n description: \"Show help\",\n default: false,\n },\n },\n subCommands: {\n init: () => import(\"./commands/init.js\").then((r) => r.default),\n create: () => import(\"./commands/create.js\").then((r) => r.default),\n push: () => import(\"./commands/push.js\").then((r) => r.default),\n link: () => import(\"./commands/link.js\").then((r) => r.default),\n login: () => import(\"./commands/login.js\").then((r) => r.default),\n logout: () => import(\"./commands/logout.js\").then((r) => r.default),\n },\n run({ args }) {\n const firstArg = process.argv[2];\n\n if (args.help) {\n p.intro(`${LOGO} ${pc.bold(\"kalp\")}`);\n printHelp();\n p.outro(\"Happy coding 🦋\");\n return;\n }\n\n if (firstArg) {\n return;\n }\n\n // Default: show commands (same as help)\n p.intro(`${LOGO} ${pc.bold(\"kalp\")}`);\n printHelp();\n p.outro(\"Happy coding 🦋\");\n },\n});\n\nrunMain(main);\n"],"mappings":";;;AAAA,SAAS,eAAe,eAAe;AACvC,YAAY,OAAO;AACnB,OAAO,QAAQ;AAEf,IAAM,OAAO;AAEb,IAAM,WAAW;AAAA,EACf,CAAC,QAAQ,2BAA2B;AAAA,EACpC,CAAC,UAAU,iBAAiB;AAAA,EAC5B,CAAC,QAAQ,oBAAoB;AAAA,EAC7B,CAAC,QAAQ,4BAA4B;AAAA,EACrC,CAAC,SAAS,wBAAwB;AAAA,EAClC,CAAC,UAAU,oBAAoB;AACjC;AAEA,SAAS,YAAkB;AACzB,EAAE,MAAI,KAAK,GAAG,GAAG,KAAK,OAAO,CAAC,4BAA4B;AAC1D,UAAQ,IAAI,EAAE;AACd,EAAE,MAAI,KAAK,GAAG,KAAK,UAAU,CAAC;AAE9B,aAAW,CAAC,MAAM,IAAI,KAAK,UAAU;AACnC,YAAQ,IAAI,KAAK,GAAG,KAAK,KAAK,OAAO,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE;AAAA,EACpD;AAEA,UAAQ,IAAI,EAAE;AACd,EAAE,MAAI,KAAK,OAAO,GAAG,KAAK,uBAAuB,CAAC,iBAAiB;AACrE;AAEA,IAAM,OAAO,cAAc;AAAA,EACzB,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,SAAS;AAAA,IACT,aAAa;AAAA,EACf;AAAA,EACA,MAAM;AAAA,IACJ,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA,aAAa;AAAA,IACX,MAAM,MAAM,OAAO,oBAAoB,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,IAC9D,QAAQ,MAAM,OAAO,sBAAsB,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,IAClE,MAAM,MAAM,OAAO,oBAAoB,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,IAC9D,MAAM,MAAM,OAAO,oBAAoB,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,IAC9D,OAAO,MAAM,OAAO,qBAAqB,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,IAChE,QAAQ,MAAM,OAAO,sBAAsB,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,EACpE;AAAA,EACA,IAAI,EAAE,KAAK,GAAG;AACZ,UAAM,WAAW,QAAQ,KAAK,CAAC;AAE/B,QAAI,KAAK,MAAM;AACb,MAAE,QAAM,GAAG,IAAI,IAAI,GAAG,KAAK,MAAM,CAAC,EAAE;AACpC,gBAAU;AACV,MAAE,QAAM,wBAAiB;AACzB;AAAA,IACF;AAEA,QAAI,UAAU;AACZ;AAAA,IACF;AAGA,IAAE,QAAM,GAAG,IAAI,IAAI,GAAG,KAAK,MAAM,CAAC,EAAE;AACpC,cAAU;AACV,IAAE,QAAM,wBAAiB;AAAA,EAC3B;AACF,CAAC;AAED,QAAQ,IAAI;","names":[]}
@@ -7,7 +7,7 @@ import {
7
7
  ensureDirectory,
8
8
  installDeps,
9
9
  isProjectInitialized
10
- } from "./chunk-LAKPXKSS.js";
10
+ } from "./chunk-Q455HC3P.js";
11
11
  import "./chunk-2H7UOFLK.js";
12
12
 
13
13
  // src/commands/init.ts
@@ -50,28 +50,26 @@ var init_default = defineCommand({
50
50
  const msg = err instanceof Error ? err.message : String(err);
51
51
  s.stop(pc.yellow("Install failed"));
52
52
  p.log.warn(
53
- `Run ${pc.cyan("npx nci")} manually in ${isCurrentDir ? "this directory" : projectInputName + "/"}`
53
+ `Run ${pc.cyan("npx --no-install nci")} (or ${pc.cyan("npm install")}) manually in ${isCurrentDir ? "this directory" : projectInputName + "/"}`
54
54
  );
55
55
  p.log.info(pc.dim(msg.split("\n")[0] ?? "Unknown error"));
56
56
  }
57
- const cdHint = isCurrentDir ? "" : ` 1. ${pc.cyan(`cd ${projectInputName}`)}
58
- `;
59
- const nextStep = isCurrentDir ? "1" : "2";
60
- p.note(
61
- [
62
- `${pc.dim("\u2022")} ${pc.cyan("kalp.config.ts")} ${pc.dim("\u2014 project config")}`,
63
- `${pc.dim("\u2022")} ${pc.cyan("package.json")} ${pc.dim("\u2014 dependencies")}`,
64
- `${pc.dim("\u2022")} ${pc.cyan("agents/")} ${pc.dim("\u2014 your agents live here")}`,
65
- ``,
66
- `${pc.dim("Next:")}`,
67
- `${cdHint} ${nextStep}. ${pc.cyan("kalp create")} ${pc.dim("\u2014 add your first agent")}`
68
- ].join("\n"),
69
- "You're ready \u{1F98B}"
70
- );
57
+ p.log.success("Project scaffolded");
58
+ p.log.info(`${pc.cyan("kalp.config.ts")} \u2014 project config`);
59
+ p.log.info(`${pc.cyan("package.json")} \u2014 dependencies`);
60
+ p.log.info(`${pc.cyan("agents/")} \u2014 your agents live here`);
61
+ console.log("");
62
+ p.log.info(pc.bold("Next"));
63
+ if (!isCurrentDir) {
64
+ p.log.info(`1. ${pc.cyan(`cd ${projectInputName}`)}`);
65
+ p.log.info(`2. ${pc.cyan("kalp create")} \u2014 add your first agent`);
66
+ } else {
67
+ p.log.info(`1. ${pc.cyan("kalp create")} \u2014 add your first agent`);
68
+ }
71
69
  p.outro(pc.green("Kalp initialized successfully."));
72
70
  }
73
71
  });
74
72
  export {
75
73
  init_default as default
76
74
  };
77
- //# sourceMappingURL=init-SDITDMG6.js.map
75
+ //# sourceMappingURL=init-K7EASUMM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/init.ts"],"sourcesContent":["import { resolve, basename } from \"node:path\";\nimport { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { scaffoldProject } from \"../scaffold.js\";\nimport { promptProjectName } from \"../utils/ui.js\";\nimport {\n ensureDirectory,\n installDeps,\n isProjectInitialized,\n} from \"../utils/fs.js\";\n\nconst LOGO = \"🦋\";\n\nexport default defineCommand({\n meta: { name: \"init\", description: \"Scaffold a new Kalp project\" },\n async run() {\n const cwd = process.cwd();\n\n p.intro(`${LOGO} ${pc.bold(\"kalp init\")}`);\n\n const projectInputName = await promptProjectName({\n message: \"What is the name of your project?\",\n placeholder: \"my-agent\",\n allowCurrentDir: true,\n });\n\n const isCurrentDir = projectInputName === \".\";\n const targetDir = isCurrentDir ? cwd : resolve(cwd, projectInputName);\n const projectName = isCurrentDir ? basename(cwd) : projectInputName;\n\n // ── Guard: already initialized ───────────────────────────────────────\n if (await isProjectInitialized(targetDir)) {\n p.log.error(\n `${pc.cyan(\"kalp.config.ts\")} already exists in this directory. Run ${pc.cyan(\"kalp create\")} to add an agent.`,\n );\n process.exit(1);\n }\n\n // ── Create target directory if needed ─────────────────────────────────\n if (!isCurrentDir) {\n await ensureDirectory(targetDir);\n }\n\n const s = p.spinner();\n\n s.start(\"Creating project structure\");\n await scaffoldProject({ projectName, targetDir });\n s.stop(\"Project structure created\");\n\n s.start(\"Installing dependencies\");\n try {\n await installDeps(targetDir);\n s.stop(\"Dependencies installed\");\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n s.stop(pc.yellow(\"Install failed\"));\n p.log.warn(\n `Run ${pc.cyan(\"npx --no-install nci\")} (or ${pc.cyan(\"npm install\")}) manually in ${isCurrentDir ? \"this directory\" : projectInputName + \"/\"}`,\n );\n p.log.info(pc.dim(msg.split(\"\\n\")[0] ?? \"Unknown error\"));\n }\n\n p.log.success(\"Project scaffolded\");\n p.log.info(`${pc.cyan(\"kalp.config.ts\")} — project config`);\n p.log.info(`${pc.cyan(\"package.json\")} — dependencies`);\n p.log.info(`${pc.cyan(\"agents/\")} — your agents live here`);\n console.log(\"\");\n p.log.info(pc.bold(\"Next\"));\n if (!isCurrentDir) {\n p.log.info(`1. ${pc.cyan(`cd ${projectInputName}`)}`);\n p.log.info(`2. ${pc.cyan(\"kalp create\")} — add your first agent`);\n } else {\n p.log.info(`1. ${pc.cyan(\"kalp create\")} — add your first agent`);\n }\n\n p.outro(pc.green(\"Kalp initialized successfully.\"));\n },\n});\n"],"mappings":";;;;;;;;;;;;;AAAA,SAAS,SAAS,gBAAgB;AAClC,SAAS,qBAAqB;AAC9B,YAAY,OAAO;AACnB,OAAO,QAAQ;AASf,IAAM,OAAO;AAEb,IAAO,eAAQ,cAAc;AAAA,EAC3B,MAAM,EAAE,MAAM,QAAQ,aAAa,8BAA8B;AAAA,EACjE,MAAM,MAAM;AACV,UAAM,MAAM,QAAQ,IAAI;AAExB,IAAE,QAAM,GAAG,IAAI,IAAI,GAAG,KAAK,WAAW,CAAC,EAAE;AAEzC,UAAM,mBAAmB,MAAM,kBAAkB;AAAA,MAC/C,SAAS;AAAA,MACT,aAAa;AAAA,MACb,iBAAiB;AAAA,IACnB,CAAC;AAED,UAAM,eAAe,qBAAqB;AAC1C,UAAM,YAAY,eAAe,MAAM,QAAQ,KAAK,gBAAgB;AACpE,UAAM,cAAc,eAAe,SAAS,GAAG,IAAI;AAGnD,QAAI,MAAM,qBAAqB,SAAS,GAAG;AACzC,MAAE,MAAI;AAAA,QACJ,GAAG,GAAG,KAAK,gBAAgB,CAAC,0CAA0C,GAAG,KAAK,aAAa,CAAC;AAAA,MAC9F;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAGA,QAAI,CAAC,cAAc;AACjB,YAAM,gBAAgB,SAAS;AAAA,IACjC;AAEA,UAAM,IAAM,UAAQ;AAEpB,MAAE,MAAM,4BAA4B;AACpC,UAAM,gBAAgB,EAAE,aAAa,UAAU,CAAC;AAChD,MAAE,KAAK,2BAA2B;AAElC,MAAE,MAAM,yBAAyB;AACjC,QAAI;AACF,YAAM,YAAY,SAAS;AAC3B,QAAE,KAAK,wBAAwB;AAAA,IACjC,SAAS,KAAK;AACZ,YAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC3D,QAAE,KAAK,GAAG,OAAO,gBAAgB,CAAC;AAClC,MAAE,MAAI;AAAA,QACJ,OAAO,GAAG,KAAK,sBAAsB,CAAC,QAAQ,GAAG,KAAK,aAAa,CAAC,iBAAiB,eAAe,mBAAmB,mBAAmB,GAAG;AAAA,MAC/I;AACA,MAAE,MAAI,KAAK,GAAG,IAAI,IAAI,MAAM,IAAI,EAAE,CAAC,KAAK,eAAe,CAAC;AAAA,IAC1D;AAEA,IAAE,MAAI,QAAQ,oBAAoB;AAClC,IAAE,MAAI,KAAK,GAAG,GAAG,KAAK,gBAAgB,CAAC,wBAAmB;AAC1D,IAAE,MAAI,KAAK,GAAG,GAAG,KAAK,cAAc,CAAC,sBAAiB;AACtD,IAAE,MAAI,KAAK,GAAG,GAAG,KAAK,SAAS,CAAC,+BAA0B;AAC1D,YAAQ,IAAI,EAAE;AACd,IAAE,MAAI,KAAK,GAAG,KAAK,MAAM,CAAC;AAC1B,QAAI,CAAC,cAAc;AACjB,MAAE,MAAI,KAAK,MAAM,GAAG,KAAK,MAAM,gBAAgB,EAAE,CAAC,EAAE;AACpD,MAAE,MAAI,KAAK,MAAM,GAAG,KAAK,aAAa,CAAC,8BAAyB;AAAA,IAClE,OAAO;AACL,MAAE,MAAI,KAAK,MAAM,GAAG,KAAK,aAAa,CAAC,8BAAyB;AAAA,IAClE;AAEA,IAAE,QAAM,GAAG,MAAM,gCAAgC,CAAC;AAAA,EACpD;AACF,CAAC;","names":[]}
@@ -0,0 +1,174 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ ensureConfig
4
+ } from "./chunk-Q455HC3P.js";
5
+ import "./chunk-2H7UOFLK.js";
6
+
7
+ // src/commands/push.ts
8
+ import { existsSync } from "fs";
9
+ import { access, mkdtemp, rm } from "fs/promises";
10
+ import { join, resolve } from "path";
11
+ import { pathToFileURL } from "url";
12
+ import { defineCommand } from "citty";
13
+ import * as p from "@clack/prompts";
14
+ import { build } from "esbuild";
15
+ import pc from "picocolors";
16
+ import { zodToJsonSchema } from "zod-to-json-schema";
17
+ var LOGO = "\u{1F98B}";
18
+ function toJsonSchema(schema, name) {
19
+ try {
20
+ return zodToJsonSchema(schema, name);
21
+ } catch {
22
+ return null;
23
+ }
24
+ }
25
+ function asRecord(value) {
26
+ return typeof value === "object" && value !== null ? value : {};
27
+ }
28
+ function asString(value) {
29
+ return typeof value === "string" ? value : void 0;
30
+ }
31
+ function asArray(value) {
32
+ return Array.isArray(value) ? value : [];
33
+ }
34
+ function serializeSteps(steps) {
35
+ return steps.map((step, index) => {
36
+ const item = asRecord(step);
37
+ return {
38
+ id: asString(item.id) ?? `step_${index}`,
39
+ description: asString(item.description) ?? "",
40
+ inputSchema: toJsonSchema(item.input, `step_${index}_input`),
41
+ outputSchema: toJsonSchema(item.output, `step_${index}_output`)
42
+ };
43
+ });
44
+ }
45
+ function serializeItems(items, kind) {
46
+ return items.map((item, index) => {
47
+ const parsed = asRecord(item);
48
+ return {
49
+ id: asString(parsed.id) ?? `${kind}_${index}`,
50
+ description: asString(parsed.description) ?? "",
51
+ inputSchema: toJsonSchema(parsed.input, `${kind}_${index}_input`)
52
+ };
53
+ });
54
+ }
55
+ async function loadAgentModule(agentPath, cwd) {
56
+ const tempDir = await mkdtemp(join(cwd, ".kalp-push-"));
57
+ const outFile = join(tempDir, "agent.preview.mjs");
58
+ await build({
59
+ entryPoints: [agentPath],
60
+ outfile: outFile,
61
+ bundle: true,
62
+ format: "esm",
63
+ platform: "node",
64
+ target: "node18",
65
+ logLevel: "silent",
66
+ packages: "external",
67
+ plugins: [
68
+ {
69
+ name: "relative-js-to-ts",
70
+ setup(buildCtx) {
71
+ buildCtx.onResolve({ filter: /^\.+\/.*\.js$/ }, (args) => {
72
+ const resolved = resolve(args.resolveDir, args.path);
73
+ if (existsSync(resolved)) {
74
+ return { path: resolved };
75
+ }
76
+ const tsPath = resolved.replace(/\.js$/, ".ts");
77
+ if (existsSync(tsPath)) {
78
+ return { path: tsPath };
79
+ }
80
+ const tsxPath = resolved.replace(/\.js$/, ".tsx");
81
+ if (existsSync(tsxPath)) {
82
+ return { path: tsxPath };
83
+ }
84
+ return null;
85
+ });
86
+ }
87
+ }
88
+ ]
89
+ });
90
+ const loaded = await import(`${pathToFileURL(outFile).href}?t=${Date.now()}`);
91
+ return {
92
+ agent: loaded.default,
93
+ tempDir
94
+ };
95
+ }
96
+ var push_default = defineCommand({
97
+ meta: { name: "push", description: "Push an agent to Kalp (preview mode)" },
98
+ args: {
99
+ agent: {
100
+ type: "string",
101
+ alias: "a",
102
+ description: "Agent name to push",
103
+ required: false
104
+ }
105
+ },
106
+ async run({ args }) {
107
+ const cwd = process.cwd();
108
+ p.intro(`${LOGO} ${pc.bold("kalp push")}`);
109
+ const agentName = args.agent;
110
+ if (!agentName) {
111
+ p.log.error(`Missing required flag ${pc.cyan("-a <agent-name>")}`);
112
+ p.outro(pc.dim(`Example: ${pc.cyan("kalp push -a my-agent")}`));
113
+ process.exit(1);
114
+ }
115
+ try {
116
+ await ensureConfig(cwd);
117
+ } catch {
118
+ p.log.error(`${pc.cyan("kalp.config.ts")} not found`);
119
+ p.outro(pc.dim(`Run ${pc.cyan("kalp init")} first.`));
120
+ process.exit(1);
121
+ }
122
+ const agentPath = join(cwd, "agents", agentName, "index.ts");
123
+ try {
124
+ await access(agentPath);
125
+ } catch {
126
+ p.log.error(
127
+ `Agent ${pc.cyan(agentName)} not found at ${pc.cyan(`agents/${agentName}/index.ts`)}`
128
+ );
129
+ process.exit(1);
130
+ }
131
+ const s = p.spinner();
132
+ s.start(`Parsing agent ${pc.cyan(agentName)}`);
133
+ let tempDir;
134
+ let agentConfig;
135
+ try {
136
+ const loaded = await loadAgentModule(agentPath, cwd);
137
+ tempDir = loaded.tempDir;
138
+ const agent = asRecord(loaded.agent);
139
+ agentConfig = {
140
+ id: asString(agent.id) ?? void 0,
141
+ name: asString(agent.name) ?? agentName,
142
+ description: asString(agent.description) ?? "",
143
+ source: agentPath,
144
+ systemPrompt: asString(agent.systemPrompt) ?? "",
145
+ steps: serializeSteps(asArray(agent.steps)),
146
+ tools: serializeItems(asArray(agent.tools), "tool"),
147
+ webhooks: serializeItems(asArray(agent.webhooks), "webhook"),
148
+ signals: serializeItems(asArray(agent.signals), "signal")
149
+ };
150
+ } catch (err) {
151
+ const msg = err instanceof Error ? err.message : String(err);
152
+ s.stop(pc.red("Could not parse agent module"));
153
+ p.log.info(pc.dim(msg.split("\n")[0] ?? "Unknown error"));
154
+ process.exit(1);
155
+ } finally {
156
+ if (tempDir) {
157
+ await rm(tempDir, { recursive: true, force: true });
158
+ }
159
+ }
160
+ s.stop("Agent parsed");
161
+ console.log("\n" + pc.dim("\u2500".repeat(50)));
162
+ console.log(pc.cyan("Agent Configuration (JSON):"));
163
+ console.log(pc.dim("\u2500".repeat(50)));
164
+ console.log(JSON.stringify(agentConfig, null, 2));
165
+ console.log(pc.dim("\u2500".repeat(50)) + "\n");
166
+ p.outro(
167
+ `${LOGO} ${pc.green("Preview ready")} ${pc.dim("\u2014 push to deploy coming soon")}`
168
+ );
169
+ }
170
+ });
171
+ export {
172
+ push_default as default
173
+ };
174
+ //# sourceMappingURL=push-YFHHNITO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/push.ts"],"sourcesContent":["import { existsSync } from \"node:fs\";\nimport { access, mkdtemp, rm } from \"node:fs/promises\";\nimport { join, resolve } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport { build } from \"esbuild\";\nimport pc from \"picocolors\";\nimport type { ZodTypeAny } from \"zod\";\nimport { zodToJsonSchema } from \"zod-to-json-schema\";\nimport { ensureConfig } from \"../utils/fs.js\";\n\nconst LOGO = \"🦋\";\n\ntype JsonSchema = Record<string, unknown>;\n\ninterface AgentItemWithInput {\n id?: unknown;\n description?: unknown;\n input?: unknown;\n}\n\ninterface AgentStepItem extends AgentItemWithInput {\n output?: unknown;\n}\n\ninterface LoadedAgentModule {\n agent: unknown;\n tempDir: string;\n}\n\nfunction toJsonSchema(schema: unknown, name: string): JsonSchema | null {\n try {\n return zodToJsonSchema(schema as ZodTypeAny, name) as JsonSchema;\n } catch {\n return null;\n }\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> {\n return typeof value === \"object\" && value !== null\n ? (value as Record<string, unknown>)\n : {};\n}\n\nfunction asString(value: unknown): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction asArray(value: unknown): unknown[] {\n return Array.isArray(value) ? value : [];\n}\n\nfunction serializeSteps(steps: unknown[]): Record<string, unknown>[] {\n return steps.map((step, index) => {\n const item = asRecord(step) as AgentStepItem;\n return {\n id: asString(item.id) ?? `step_${index}`,\n description: asString(item.description) ?? \"\",\n inputSchema: toJsonSchema(item.input, `step_${index}_input`),\n outputSchema: toJsonSchema(item.output, `step_${index}_output`),\n };\n });\n}\n\nfunction serializeItems(\n items: unknown[],\n kind: \"tool\" | \"webhook\" | \"signal\",\n): Record<string, unknown>[] {\n return items.map((item, index) => {\n const parsed = asRecord(item) as AgentItemWithInput;\n return {\n id: asString(parsed.id) ?? `${kind}_${index}`,\n description: asString(parsed.description) ?? \"\",\n inputSchema: toJsonSchema(parsed.input, `${kind}_${index}_input`),\n };\n });\n}\n\nasync function loadAgentModule(\n agentPath: string,\n cwd: string,\n): Promise<LoadedAgentModule> {\n const tempDir = await mkdtemp(join(cwd, \".kalp-push-\"));\n const outFile = join(tempDir, \"agent.preview.mjs\");\n\n await build({\n entryPoints: [agentPath],\n outfile: outFile,\n bundle: true,\n format: \"esm\",\n platform: \"node\",\n target: \"node18\",\n logLevel: \"silent\",\n packages: \"external\",\n plugins: [\n {\n name: \"relative-js-to-ts\",\n setup(buildCtx) {\n buildCtx.onResolve({ filter: /^\\.+\\/.*\\.js$/ }, (args) => {\n const resolved = resolve(args.resolveDir, args.path);\n if (existsSync(resolved)) {\n return { path: resolved };\n }\n\n const tsPath = resolved.replace(/\\.js$/, \".ts\");\n if (existsSync(tsPath)) {\n return { path: tsPath };\n }\n\n const tsxPath = resolved.replace(/\\.js$/, \".tsx\");\n if (existsSync(tsxPath)) {\n return { path: tsxPath };\n }\n\n return null;\n });\n },\n },\n ],\n });\n\n const loaded = (await import(\n `${pathToFileURL(outFile).href}?t=${Date.now()}`\n )) as { default?: unknown };\n\n return {\n agent: loaded.default,\n tempDir,\n };\n}\n\nexport default defineCommand({\n meta: { name: \"push\", description: \"Push an agent to Kalp (preview mode)\" },\n args: {\n agent: {\n type: \"string\",\n alias: \"a\",\n description: \"Agent name to push\",\n required: false,\n },\n },\n async run({ args }) {\n const cwd = process.cwd();\n\n p.intro(`${LOGO} ${pc.bold(\"kalp push\")}`);\n\n // ── Validate agent name ─────────────────────────────────────────────────\n const agentName = args.agent;\n if (!agentName) {\n p.log.error(`Missing required flag ${pc.cyan(\"-a <agent-name>\")}`);\n p.outro(pc.dim(`Example: ${pc.cyan(\"kalp push -a my-agent\")}`));\n process.exit(1);\n }\n\n // ── Validate kalp.config.ts exists ─────────────────────────────────────\n try {\n await ensureConfig(cwd);\n } catch {\n p.log.error(`${pc.cyan(\"kalp.config.ts\")} not found`);\n p.outro(pc.dim(`Run ${pc.cyan(\"kalp init\")} first.`));\n process.exit(1);\n }\n\n // ── Find agent ──────────────────────────────────────────────────────────\n const agentPath = join(cwd, \"agents\", agentName, \"index.ts\");\n try {\n await access(agentPath);\n } catch {\n p.log.error(\n `Agent ${pc.cyan(agentName)} not found at ${pc.cyan(`agents/${agentName}/index.ts`)}`,\n );\n process.exit(1);\n }\n\n const s = p.spinner();\n s.start(`Parsing agent ${pc.cyan(agentName)}`);\n let tempDir: string | undefined;\n let agentConfig: Record<string, unknown>;\n\n try {\n const loaded = await loadAgentModule(agentPath, cwd);\n tempDir = loaded.tempDir;\n\n const agent = asRecord(loaded.agent);\n agentConfig = {\n id: asString(agent.id) ?? undefined,\n name: asString(agent.name) ?? agentName,\n description: asString(agent.description) ?? \"\",\n source: agentPath,\n systemPrompt: asString(agent.systemPrompt) ?? \"\",\n steps: serializeSteps(asArray(agent.steps)),\n tools: serializeItems(asArray(agent.tools), \"tool\"),\n webhooks: serializeItems(asArray(agent.webhooks), \"webhook\"),\n signals: serializeItems(asArray(agent.signals), \"signal\"),\n };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n s.stop(pc.red(\"Could not parse agent module\"));\n p.log.info(pc.dim(msg.split(\"\\n\")[0] ?? \"Unknown error\"));\n process.exit(1);\n } finally {\n if (tempDir) {\n await rm(tempDir, { recursive: true, force: true });\n }\n }\n\n s.stop(\"Agent parsed\");\n\n // ── Output JSON ─────────────────────────────────────────────────────────\n console.log(\"\\n\" + pc.dim(\"─\".repeat(50)));\n console.log(pc.cyan(\"Agent Configuration (JSON):\"));\n console.log(pc.dim(\"─\".repeat(50)));\n console.log(JSON.stringify(agentConfig, null, 2));\n console.log(pc.dim(\"─\".repeat(50)) + \"\\n\");\n\n p.outro(\n `${LOGO} ${pc.green(\"Preview ready\")} ${pc.dim(\"— push to deploy coming soon\")}`,\n );\n },\n});\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kalphq/cli",
3
- "version": "0.0.0-dev-20260416084549",
3
+ "version": "0.0.0-dev-20260416091527",
4
4
  "description": "Zero-config CLI for deploying Kalp agents",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -17,14 +17,14 @@
17
17
  "access": "public"
18
18
  },
19
19
  "dependencies": {
20
- "@clack/prompts": "^0.9.1",
21
- "citty": "^0.1.6",
22
- "esbuild": "^0.25.0",
23
- "giget": "^1.2.3",
24
- "nypm": "^0.3.12",
25
- "picocolors": "^1.1.1",
26
- "zod": "^3.25.76",
27
- "@kalphq/sdk": "0.0.0-dev-20260416084549"
20
+ "@antfu/ni": "24.4.0",
21
+ "@clack/prompts": "0.9.1",
22
+ "citty": "0.1.6",
23
+ "esbuild": "0.25.0",
24
+ "picocolors": "1.1.1",
25
+ "zod": "3.25.76",
26
+ "zod-to-json-schema": "3.25.2",
27
+ "@kalphq/sdk": "0.0.0-dev-20260416091527"
28
28
  },
29
29
  "devDependencies": {
30
30
  "@types/node": "^22.15.3",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/utils/fs.ts"],"sourcesContent":["import { access, mkdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { execSync } from \"node:child_process\";\n\nexport async function isProjectInitialized(cwd: string): Promise<boolean> {\n try {\n await access(join(cwd, \"kalp.config.ts\"));\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function ensureConfig(cwd: string): Promise<void> {\n const initialized = await isProjectInitialized(cwd);\n if (!initialized) {\n throw new Error(\"kalp.config.ts not found\");\n }\n}\n\nexport async function ensureDirectory(path: string): Promise<void> {\n await mkdir(path, { recursive: true });\n}\n\nexport async function installDeps(cwd: string): Promise<void> {\n execSync(\"npx nci\", {\n cwd,\n stdio: \"pipe\",\n });\n}\n"],"mappings":";;;AAAA,SAAS,QAAQ,aAAa;AAC9B,SAAS,YAAY;AACrB,SAAS,gBAAgB;AAEzB,eAAsB,qBAAqB,KAA+B;AACxE,MAAI;AACF,UAAM,OAAO,KAAK,KAAK,gBAAgB,CAAC;AACxC,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,aAAa,KAA4B;AAC7D,QAAM,cAAc,MAAM,qBAAqB,GAAG;AAClD,MAAI,CAAC,aAAa;AAChB,UAAM,IAAI,MAAM,0BAA0B;AAAA,EAC5C;AACF;AAEA,eAAsB,gBAAgB,MAA6B;AACjE,QAAM,MAAM,MAAM,EAAE,WAAW,KAAK,CAAC;AACvC;AAEA,eAAsB,YAAY,KAA4B;AAC5D,WAAS,WAAW;AAAA,IAClB;AAAA,IACA,OAAO;AAAA,EACT,CAAC;AACH;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/commands/create.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { scaffoldProject, scaffoldAgent } from \"../scaffold.js\";\nimport { installDeps, isProjectInitialized } from \"../utils/fs.js\";\nimport { promptAgentDetails, promptProjectName } from \"../utils/ui.js\";\n\nconst LOGO = \"🦋\";\n\nexport default defineCommand({\n meta: { name: \"create\", description: \"Add a new agent to the project\" },\n async run() {\n const cwd = process.cwd();\n\n p.intro(`${LOGO} ${pc.bold(\"kalp create\")}`);\n\n // ── Check if project is initialized ─────────────────────────────────\n const needsInit = !(await isProjectInitialized(cwd));\n\n // ── Init phase (inline — one unified timeline) ───────────────────────\n let projectName: string | undefined;\n if (needsInit) {\n p.log.warn(\n `No ${pc.cyan(\"kalp.config.ts\")} found — initializing project first.`,\n );\n projectName = await promptProjectName({\n message: \"Project name?\",\n placeholder: \"my-project\",\n });\n }\n\n // ── Agent prompts ────────────────────────────────────────────────────\n const agentAnswers = await promptAgentDetails();\n\n const s = p.spinner();\n\n // ── Scaffold project if needed ───────────────────────────────────────\n if (needsInit && projectName) {\n s.start(\"Creating project structure\");\n await scaffoldProject({ projectName, targetDir: cwd });\n s.stop(\"Project structure created\");\n\n s.start(\"Installing dependencies\");\n try {\n await installDeps(cwd);\n s.stop(\"Dependencies installed\");\n } catch {\n s.stop(pc.yellow(\"Install failed — run npx nci manually.\"));\n }\n }\n\n // ── Scaffold agent ───────────────────────────────────────────────────\n s.start(`Scaffolding agent ${pc.cyan(agentAnswers.name)}`);\n await scaffoldAgent({\n agentName: agentAnswers.name,\n templateId: agentAnswers.templateId,\n cwd,\n });\n s.stop(\"Agent created\");\n\n p.note(\n [\n `${pc.dim(\"•\")} ${pc.cyan(`agents/${agentAnswers.name}/index.ts`)}`,\n `${pc.dim(\"•\")} ${pc.cyan(`agents/${agentAnswers.name}/steps/`)}`,\n `${pc.dim(\"•\")} ${pc.cyan(`agents/${agentAnswers.name}/tools/`)}`,\n ].join(\"\\n\"),\n \"Created\",\n );\n\n p.outro(\n `${LOGO} ${pc.green(`Agent ${pc.bold(agentAnswers.name)} is ready.`)}`,\n );\n },\n});\n"],"mappings":";;;;;;;;;;;;;;AAAA,SAAS,qBAAqB;AAC9B,YAAY,OAAO;AACnB,OAAO,QAAQ;AAKf,IAAM,OAAO;AAEb,IAAO,iBAAQ,cAAc;AAAA,EAC3B,MAAM,EAAE,MAAM,UAAU,aAAa,iCAAiC;AAAA,EACtE,MAAM,MAAM;AACV,UAAM,MAAM,QAAQ,IAAI;AAExB,IAAE,QAAM,GAAG,IAAI,IAAI,GAAG,KAAK,aAAa,CAAC,EAAE;AAG3C,UAAM,YAAY,CAAE,MAAM,qBAAqB,GAAG;AAGlD,QAAI;AACJ,QAAI,WAAW;AACb,MAAE,MAAI;AAAA,QACJ,MAAM,GAAG,KAAK,gBAAgB,CAAC;AAAA,MACjC;AACA,oBAAc,MAAM,kBAAkB;AAAA,QACpC,SAAS;AAAA,QACT,aAAa;AAAA,MACf,CAAC;AAAA,IACH;AAGA,UAAM,eAAe,MAAM,mBAAmB;AAE9C,UAAM,IAAM,UAAQ;AAGpB,QAAI,aAAa,aAAa;AAC5B,QAAE,MAAM,4BAA4B;AACpC,YAAM,gBAAgB,EAAE,aAAa,WAAW,IAAI,CAAC;AACrD,QAAE,KAAK,2BAA2B;AAElC,QAAE,MAAM,yBAAyB;AACjC,UAAI;AACF,cAAM,YAAY,GAAG;AACrB,UAAE,KAAK,wBAAwB;AAAA,MACjC,QAAQ;AACN,UAAE,KAAK,GAAG,OAAO,6CAAwC,CAAC;AAAA,MAC5D;AAAA,IACF;AAGA,MAAE,MAAM,qBAAqB,GAAG,KAAK,aAAa,IAAI,CAAC,EAAE;AACzD,UAAM,cAAc;AAAA,MAClB,WAAW,aAAa;AAAA,MACxB,YAAY,aAAa;AAAA,MACzB;AAAA,IACF,CAAC;AACD,MAAE,KAAK,eAAe;AAEtB,IAAE;AAAA,MACA;AAAA,QACE,GAAG,GAAG,IAAI,QAAG,CAAC,IAAI,GAAG,KAAK,UAAU,aAAa,IAAI,WAAW,CAAC;AAAA,QACjE,GAAG,GAAG,IAAI,QAAG,CAAC,IAAI,GAAG,KAAK,UAAU,aAAa,IAAI,SAAS,CAAC;AAAA,QAC/D,GAAG,GAAG,IAAI,QAAG,CAAC,IAAI,GAAG,KAAK,UAAU,aAAa,IAAI,SAAS,CAAC;AAAA,MACjE,EAAE,KAAK,IAAI;AAAA,MACX;AAAA,IACF;AAEA,IAAE;AAAA,MACA,GAAG,IAAI,IAAI,GAAG,MAAM,SAAS,GAAG,KAAK,aAAa,IAAI,CAAC,YAAY,CAAC;AAAA,IACtE;AAAA,EACF;AACF,CAAC;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/commands/init.ts"],"sourcesContent":["import { resolve, basename } from \"node:path\";\nimport { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { scaffoldProject } from \"../scaffold.js\";\nimport { promptProjectName } from \"../utils/ui.js\";\nimport {\n ensureDirectory,\n installDeps,\n isProjectInitialized,\n} from \"../utils/fs.js\";\n\nconst LOGO = \"🦋\";\n\nexport default defineCommand({\n meta: { name: \"init\", description: \"Scaffold a new Kalp project\" },\n async run() {\n const cwd = process.cwd();\n\n p.intro(`${LOGO} ${pc.bold(\"kalp init\")}`);\n\n const projectInputName = await promptProjectName({\n message: \"What is the name of your project?\",\n placeholder: \"my-agent\",\n allowCurrentDir: true,\n });\n\n const isCurrentDir = projectInputName === \".\";\n const targetDir = isCurrentDir ? cwd : resolve(cwd, projectInputName);\n const projectName = isCurrentDir ? basename(cwd) : projectInputName;\n\n // ── Guard: already initialized ───────────────────────────────────────\n if (await isProjectInitialized(targetDir)) {\n p.log.error(\n `${pc.cyan(\"kalp.config.ts\")} already exists in this directory. Run ${pc.cyan(\"kalp create\")} to add an agent.`,\n );\n process.exit(1);\n }\n\n // ── Create target directory if needed ─────────────────────────────────\n if (!isCurrentDir) {\n await ensureDirectory(targetDir);\n }\n\n const s = p.spinner();\n\n s.start(\"Creating project structure\");\n await scaffoldProject({ projectName, targetDir });\n s.stop(\"Project structure created\");\n\n s.start(\"Installing dependencies\");\n try {\n await installDeps(targetDir);\n s.stop(\"Dependencies installed\");\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n s.stop(pc.yellow(\"Install failed\"));\n p.log.warn(\n `Run ${pc.cyan(\"npx nci\")} manually in ${isCurrentDir ? \"this directory\" : projectInputName + \"/\"}`,\n );\n p.log.info(pc.dim(msg.split(\"\\n\")[0] ?? \"Unknown error\"));\n }\n\n const cdHint = isCurrentDir\n ? \"\"\n : ` 1. ${pc.cyan(`cd ${projectInputName}`)}\\n`;\n const nextStep = isCurrentDir ? \"1\" : \"2\";\n\n p.note(\n [\n `${pc.dim(\"•\")} ${pc.cyan(\"kalp.config.ts\")} ${pc.dim(\"— project config\")}`,\n `${pc.dim(\"•\")} ${pc.cyan(\"package.json\")} ${pc.dim(\"— dependencies\")}`,\n `${pc.dim(\"•\")} ${pc.cyan(\"agents/\")} ${pc.dim(\"— your agents live here\")}`,\n ``,\n `${pc.dim(\"Next:\")}`,\n `${cdHint} ${nextStep}. ${pc.cyan(\"kalp create\")} ${pc.dim(\"— add your first agent\")}`,\n ].join(\"\\n\"),\n \"You're ready 🦋\",\n );\n\n p.outro(pc.green(\"Kalp initialized successfully.\"));\n },\n});\n"],"mappings":";;;;;;;;;;;;;AAAA,SAAS,SAAS,gBAAgB;AAClC,SAAS,qBAAqB;AAC9B,YAAY,OAAO;AACnB,OAAO,QAAQ;AASf,IAAM,OAAO;AAEb,IAAO,eAAQ,cAAc;AAAA,EAC3B,MAAM,EAAE,MAAM,QAAQ,aAAa,8BAA8B;AAAA,EACjE,MAAM,MAAM;AACV,UAAM,MAAM,QAAQ,IAAI;AAExB,IAAE,QAAM,GAAG,IAAI,IAAI,GAAG,KAAK,WAAW,CAAC,EAAE;AAEzC,UAAM,mBAAmB,MAAM,kBAAkB;AAAA,MAC/C,SAAS;AAAA,MACT,aAAa;AAAA,MACb,iBAAiB;AAAA,IACnB,CAAC;AAED,UAAM,eAAe,qBAAqB;AAC1C,UAAM,YAAY,eAAe,MAAM,QAAQ,KAAK,gBAAgB;AACpE,UAAM,cAAc,eAAe,SAAS,GAAG,IAAI;AAGnD,QAAI,MAAM,qBAAqB,SAAS,GAAG;AACzC,MAAE,MAAI;AAAA,QACJ,GAAG,GAAG,KAAK,gBAAgB,CAAC,0CAA0C,GAAG,KAAK,aAAa,CAAC;AAAA,MAC9F;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAGA,QAAI,CAAC,cAAc;AACjB,YAAM,gBAAgB,SAAS;AAAA,IACjC;AAEA,UAAM,IAAM,UAAQ;AAEpB,MAAE,MAAM,4BAA4B;AACpC,UAAM,gBAAgB,EAAE,aAAa,UAAU,CAAC;AAChD,MAAE,KAAK,2BAA2B;AAElC,MAAE,MAAM,yBAAyB;AACjC,QAAI;AACF,YAAM,YAAY,SAAS;AAC3B,QAAE,KAAK,wBAAwB;AAAA,IACjC,SAAS,KAAK;AACZ,YAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC3D,QAAE,KAAK,GAAG,OAAO,gBAAgB,CAAC;AAClC,MAAE,MAAI;AAAA,QACJ,OAAO,GAAG,KAAK,SAAS,CAAC,gBAAgB,eAAe,mBAAmB,mBAAmB,GAAG;AAAA,MACnG;AACA,MAAE,MAAI,KAAK,GAAG,IAAI,IAAI,MAAM,IAAI,EAAE,CAAC,KAAK,eAAe,CAAC;AAAA,IAC1D;AAEA,UAAM,SAAS,eACX,KACA,QAAQ,GAAG,KAAK,MAAM,gBAAgB,EAAE,CAAC;AAAA;AAC7C,UAAM,WAAW,eAAe,MAAM;AAEtC,IAAE;AAAA,MACA;AAAA,QACE,GAAG,GAAG,IAAI,QAAG,CAAC,IAAI,GAAG,KAAK,gBAAgB,CAAC,IAAI,GAAG,IAAI,uBAAkB,CAAC;AAAA,QACzE,GAAG,GAAG,IAAI,QAAG,CAAC,IAAI,GAAG,KAAK,cAAc,CAAC,IAAI,GAAG,IAAI,qBAAgB,CAAC;AAAA,QACrE,GAAG,GAAG,IAAI,QAAG,CAAC,IAAI,GAAG,KAAK,SAAS,CAAC,IAAI,GAAG,IAAI,8BAAyB,CAAC;AAAA,QACzE;AAAA,QACA,GAAG,GAAG,IAAI,OAAO,CAAC;AAAA,QAClB,GAAG,MAAM,KAAK,QAAQ,KAAK,GAAG,KAAK,aAAa,CAAC,IAAI,GAAG,IAAI,6BAAwB,CAAC;AAAA,MACvF,EAAE,KAAK,IAAI;AAAA,MACX;AAAA,IACF;AAEA,IAAE,QAAM,GAAG,MAAM,gCAAgC,CAAC;AAAA,EACpD;AACF,CAAC;","names":[]}
@@ -1,104 +0,0 @@
1
- #!/usr/bin/env node
2
- import {
3
- ensureConfig
4
- } from "./chunk-LAKPXKSS.js";
5
- import "./chunk-2H7UOFLK.js";
6
-
7
- // src/commands/push.ts
8
- import { join } from "path";
9
- import { readFile } from "fs/promises";
10
- import { defineCommand } from "citty";
11
- import * as p from "@clack/prompts";
12
- import pc from "picocolors";
13
- var LOGO = "\u{1F98B}";
14
- var push_default = defineCommand({
15
- meta: { name: "push", description: "Push an agent to Kalp (preview mode)" },
16
- args: {
17
- agent: {
18
- type: "string",
19
- alias: "a",
20
- description: "Agent name to push",
21
- required: false
22
- }
23
- },
24
- async run({ args }) {
25
- const cwd = process.cwd();
26
- p.intro(`${LOGO} ${pc.bold("kalp push")}`);
27
- const agentName = args.agent;
28
- if (!agentName) {
29
- p.log.error(`Missing required flag ${pc.cyan("-a <agent-name>")}`);
30
- p.outro(pc.dim(`Example: ${pc.cyan("kalp push -a my-agent")}`));
31
- process.exit(1);
32
- }
33
- try {
34
- await ensureConfig(cwd);
35
- } catch {
36
- p.log.error(`${pc.cyan("kalp.config.ts")} not found`);
37
- p.outro(pc.dim(`Run ${pc.cyan("kalp init")} first.`));
38
- process.exit(1);
39
- }
40
- const agentPath = join(cwd, "agents", agentName, "index.ts");
41
- let agentCode;
42
- try {
43
- agentCode = await readFile(agentPath, "utf-8");
44
- } catch {
45
- p.log.error(
46
- `Agent ${pc.cyan(agentName)} not found at ${pc.cyan(`agents/${agentName}/index.ts`)}`
47
- );
48
- process.exit(1);
49
- }
50
- const s = p.spinner();
51
- s.start(`Parsing agent ${pc.cyan(agentName)}`);
52
- const defineAgentMatch = agentCode.match(
53
- /defineAgent\(\s*(\{[\s\S]*?\})\s*\)/
54
- );
55
- if (!defineAgentMatch?.[1]) {
56
- s.stop(pc.red("Could not parse defineAgent call"));
57
- process.exit(1);
58
- }
59
- const stepMatches = [
60
- ...agentCode.matchAll(/createStep\(\s*(\{[\s\S]*?\})\s*\)/g)
61
- ];
62
- const toolMatches = [
63
- ...agentCode.matchAll(/createTool\(\s*(\{[\s\S]*?\})\s*\)/g)
64
- ];
65
- const steps = stepMatches.map((match, i) => {
66
- const content = match[1] ?? "";
67
- const idMatch = content.match(/id:\s*["']([^"']+)["']/);
68
- const descMatch = content.match(/description:\s*["']([^"']+)["']/);
69
- return {
70
- id: idMatch?.[1] ?? `step_${i}`,
71
- description: descMatch?.[1] ?? ""
72
- };
73
- });
74
- const tools = toolMatches.map((match, i) => {
75
- const content = match[1] ?? "";
76
- const idMatch = content.match(/id:\s*["']([^"']+)["']/);
77
- const descMatch = content.match(/description:\s*["']([^"']+)["']/);
78
- return {
79
- id: idMatch?.[1] ?? `tool_${i}`,
80
- description: descMatch?.[1] ?? ""
81
- };
82
- });
83
- const agentConfig = {
84
- name: agentName,
85
- source: agentPath,
86
- steps,
87
- tools
88
- // Future: full AST parsing with Zod schema extraction
89
- };
90
- s.stop("Agent parsed");
91
- console.log("\n" + pc.dim("\u2500".repeat(50)));
92
- console.log(pc.cyan("Agent Configuration (JSON):"));
93
- console.log(pc.dim("\u2500".repeat(50)));
94
- console.log(JSON.stringify(agentConfig, null, 2));
95
- console.log(pc.dim("\u2500".repeat(50)) + "\n");
96
- p.outro(
97
- `${LOGO} ${pc.green("Preview ready")} ${pc.dim("\u2014 push to deploy coming soon")}`
98
- );
99
- }
100
- });
101
- export {
102
- push_default as default
103
- };
104
- //# sourceMappingURL=push-YFAB7TWQ.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/commands/push.ts"],"sourcesContent":["import { join } from \"node:path\";\nimport { readFile } from \"node:fs/promises\";\nimport { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { ensureConfig } from \"../utils/fs.js\";\n\nconst LOGO = \"🦋\";\n\nexport default defineCommand({\n meta: { name: \"push\", description: \"Push an agent to Kalp (preview mode)\" },\n args: {\n agent: {\n type: \"string\",\n alias: \"a\",\n description: \"Agent name to push\",\n required: false,\n },\n },\n async run({ args }) {\n const cwd = process.cwd();\n\n p.intro(`${LOGO} ${pc.bold(\"kalp push\")}`);\n\n // ── Validate agent name ─────────────────────────────────────────────────\n const agentName = args.agent;\n if (!agentName) {\n p.log.error(`Missing required flag ${pc.cyan(\"-a <agent-name>\")}`);\n p.outro(pc.dim(`Example: ${pc.cyan(\"kalp push -a my-agent\")}`));\n process.exit(1);\n }\n\n // ── Validate kalp.config.ts exists ─────────────────────────────────────\n try {\n await ensureConfig(cwd);\n } catch {\n p.log.error(`${pc.cyan(\"kalp.config.ts\")} not found`);\n p.outro(pc.dim(`Run ${pc.cyan(\"kalp init\")} first.`));\n process.exit(1);\n }\n\n // ── Find agent ──────────────────────────────────────────────────────────\n const agentPath = join(cwd, \"agents\", agentName, \"index.ts\");\n let agentCode: string;\n try {\n agentCode = await readFile(agentPath, \"utf-8\");\n } catch {\n p.log.error(\n `Agent ${pc.cyan(agentName)} not found at ${pc.cyan(`agents/${agentName}/index.ts`)}`,\n );\n process.exit(1);\n }\n\n const s = p.spinner();\n s.start(`Parsing agent ${pc.cyan(agentName)}`);\n\n // ── Parse agent config from TypeScript ──────────────────────────────────\n // Extract defineAgent({...}) call using regex\n const defineAgentMatch = agentCode.match(\n /defineAgent\\(\\s*(\\{[\\s\\S]*?\\})\\s*\\)/,\n );\n if (!defineAgentMatch?.[1]) {\n s.stop(pc.red(\"Could not parse defineAgent call\"));\n process.exit(1);\n }\n\n // Extract steps and tools arrays for schema generation\n const stepMatches = [\n ...agentCode.matchAll(/createStep\\(\\s*(\\{[\\s\\S]*?\\})\\s*\\)/g),\n ];\n const toolMatches = [\n ...agentCode.matchAll(/createTool\\(\\s*(\\{[\\s\\S]*?\\})\\s*\\)/g),\n ];\n\n const steps = stepMatches.map((match, i) => {\n const content = match[1] ?? \"\";\n const idMatch = content.match(/id:\\s*[\"']([^\"']+)[\"']/);\n const descMatch = content.match(/description:\\s*[\"']([^\"']+)[\"']/);\n return {\n id: idMatch?.[1] ?? `step_${i}`,\n description: descMatch?.[1] ?? \"\",\n };\n });\n\n const tools = toolMatches.map((match, i) => {\n const content = match[1] ?? \"\";\n const idMatch = content.match(/id:\\s*[\"']([^\"']+)[\"']/);\n const descMatch = content.match(/description:\\s*[\"']([^\"']+)[\"']/);\n return {\n id: idMatch?.[1] ?? `tool_${i}`,\n description: descMatch?.[1] ?? \"\",\n };\n });\n\n // ── Build JSON representation ───────────────────────────────────────────\n const agentConfig = {\n name: agentName,\n source: agentPath,\n steps,\n tools,\n // Future: full AST parsing with Zod schema extraction\n };\n\n s.stop(\"Agent parsed\");\n\n // ── Output JSON ─────────────────────────────────────────────────────────\n console.log(\"\\n\" + pc.dim(\"─\".repeat(50)));\n console.log(pc.cyan(\"Agent Configuration (JSON):\"));\n console.log(pc.dim(\"─\".repeat(50)));\n console.log(JSON.stringify(agentConfig, null, 2));\n console.log(pc.dim(\"─\".repeat(50)) + \"\\n\");\n\n p.outro(\n `${LOGO} ${pc.green(\"Preview ready\")} ${pc.dim(\"— push to deploy coming soon\")}`,\n );\n },\n});\n"],"mappings":"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","names":[]}