@kalphq/cli 0.0.0-dev-20260416055233 → 0.0.0-dev-20260416061417

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.
@@ -79,15 +79,15 @@ async function _build() {
79
79
  }
80
80
  s.stop(`Project ${pc.cyan(parsed.projectId)} validated`);
81
81
  s.start("Discovering agents");
82
- const agentEntries = await glob(resolve2(cwd, "kalp/agents/*/index.ts"));
82
+ const agentEntries = await glob(resolve2(cwd, "agents/*/index.ts"));
83
83
  if (agentEntries.length === 0) {
84
- s.stop(pc.yellow("No agents found in kalp/agents/"));
84
+ s.stop(pc.yellow("No agents found in agents/"));
85
85
  p.outro(pc.dim("Create an agent first."));
86
86
  process.exit(0);
87
87
  }
88
88
  s.stop(`Found ${pc.cyan(String(agentEntries.length))} agent(s)`);
89
89
  s.start("Bundling agents");
90
- const outdir = resolve2(cwd, "kalp/meta/dist");
90
+ const outdir = resolve2(cwd, "meta/dist");
91
91
  try {
92
92
  await esbuild.build({
93
93
  entryPoints: agentEntries,
@@ -112,10 +112,10 @@ async function _build() {
112
112
  );
113
113
  p.note(lines.join("\n"), "Bundled agents");
114
114
  p.outro(
115
- `${LOGO} ${pc.green("Build complete.")} ${pc.dim(`Output \u2192 kalp/meta/dist/`)}`
115
+ `${LOGO} ${pc.green("Build complete.")} ${pc.dim(`Output \u2192 meta/dist/`)}`
116
116
  );
117
117
  }
118
118
  export {
119
119
  build_default as default
120
120
  };
121
- //# sourceMappingURL=build-ZMN2247N.js.map
121
+ //# sourceMappingURL=build-WJ6ZTDWJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/build.ts","../src/commands/utils.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { readFile } from \"node:fs/promises\";\nimport { resolve, relative } from \"node:path\";\nimport { z } from \"zod\";\nimport * as esbuild from \"esbuild\";\nimport { glob } from \"./utils.js\";\n\nconst LOGO = \"🦋\";\n\nexport default defineCommand({\n meta: { name: \"build\", description: \"Bundle agents for deployment\" },\n async run() {\n await _build();\n },\n});\n\nconst KalpConfigSchema = z.object({\n projectId: z.string().min(1),\n region: z.string().optional(),\n secrets: z.array(z.string()).optional(),\n});\n\nasync function _build(): Promise<void> {\n p.intro(`${LOGO} ${pc.bold(\"kalp build\")}`);\n\n const cwd = process.cwd();\n const configPath = resolve(cwd, \"kalp.config.ts\");\n\n // ── Validate kalp.config.ts ────────────────────────────────────────────\n const s = p.spinner();\n s.start(\"Reading kalp.config.ts\");\n\n let configRaw = \"\";\n try {\n configRaw = await readFile(configPath, \"utf-8\");\n } catch {\n s.stop(pc.red(\"kalp.config.ts not found\"));\n p.outro(`${pc.dim(\"Run\")} ${pc.cyan(\"kalp init\")} ${pc.dim(\"first.\")}`);\n process.exit(1);\n }\n\n // Extract the config object from defineConfig({...}) using a lightweight regex\n const match = configRaw.match(/defineConfig\\(\\s*(\\{[\\s\\S]*?\\})\\s*\\)/);\n if (!match?.[1]) {\n s.stop(pc.red(\"Could not parse kalp.config.ts\"));\n process.exit(1);\n }\n\n let parsed: z.infer<typeof KalpConfigSchema>;\n try {\n // Evaluate the config object (safe: it's the user's own config file)\n const fn = new Function(`return ${match[1]}`);\n parsed = KalpConfigSchema.parse(fn());\n } catch (err) {\n s.stop(pc.red(\"Invalid kalp.config.ts\"));\n if (err instanceof z.ZodError) {\n for (const issue of err.issues) {\n p.log.error(` ${issue.path.join(\".\")}: ${issue.message}`);\n }\n }\n process.exit(1);\n }\n\n s.stop(`Project ${pc.cyan(parsed.projectId)} validated`);\n\n // ── Discover agent entry points ────────────────────────────────────────\n s.start(\"Discovering agents\");\n\n const agentEntries = await glob(resolve(cwd, \"agents/*/index.ts\"));\n if (agentEntries.length === 0) {\n s.stop(pc.yellow(\"No agents found in agents/\"));\n p.outro(pc.dim(\"Create an agent first.\"));\n process.exit(0);\n }\n\n s.stop(`Found ${pc.cyan(String(agentEntries.length))} agent(s)`);\n\n // ── Bundle with esbuild ────────────────────────────────────────────────\n s.start(\"Bundling agents\");\n\n const outdir = resolve(cwd, \"meta/dist\");\n try {\n await esbuild.build({\n entryPoints: agentEntries,\n bundle: true,\n platform: \"node\",\n target: \"es2022\",\n format: \"esm\",\n outdir,\n minify: true,\n treeShaking: true,\n external: [\"@kalphq/sdk\"],\n logLevel: \"silent\",\n });\n } catch (err) {\n s.stop(pc.red(\"Build failed\"));\n console.error(err);\n process.exit(1);\n }\n\n s.stop(\"Bundle ready\");\n\n // ── Summary ────────────────────────────────────────────────────────────\n const lines = agentEntries.map(\n (e: string) => ` ${pc.dim(\"•\")} ${pc.cyan(relative(cwd, e))}`,\n );\n p.note(lines.join(\"\\n\"), \"Bundled agents\");\n\n p.outro(\n `${LOGO} ${pc.green(\"Build complete.\")} ${pc.dim(`Output → meta/dist/`)}`,\n );\n}\n","import { readdir, stat } from \"node:fs/promises\";\nimport { resolve, dirname } from \"node:path\";\n\n/**\n * Minimal glob for patterns like `some/path/* /index.ts`.\n * Matches one directory level then a fixed filename.\n */\nexport async function glob(pattern: string): Promise<string[]> {\n const dir = dirname(dirname(pattern));\n const filename = pattern.split(\"/\").pop() ?? pattern.split(\"\\\\\").pop() ?? \"\";\n\n const results: string[] = [];\n\n try {\n const entries = await readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n const candidate = resolve(dir, entry.name, filename);\n try {\n const s = await stat(candidate);\n if (s.isFile()) results.push(candidate);\n } catch {\n // file doesn't exist in this subdirectory\n }\n }\n } catch {\n // parent directory doesn't exist\n }\n\n return results;\n}\n"],"mappings":"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","names":["resolve","resolve"]}
@@ -61,7 +61,11 @@ async function replacePlaceholders(dir, map) {
61
61
  }
62
62
  }
63
63
  async function scaffoldProject(opts) {
64
- const { projectName, cwd } = opts;
64
+ const { projectName, targetDir } = opts;
65
+ await cp(join(TEMPLATES_DIR, "project"), targetDir, {
66
+ recursive: true,
67
+ force: true
68
+ });
65
69
  const kalpConfig = `import { defineConfig } from "@kalphq/sdk";
66
70
 
67
71
  export default defineConfig({
@@ -69,18 +73,13 @@ export default defineConfig({
69
73
  secrets: [],
70
74
  });
71
75
  `;
72
- await writeFile(join(cwd, "kalp.config.ts"), kalpConfig, "utf-8");
73
- const kalpDir = join(cwd, "kalp");
74
- await cp(join(TEMPLATES_DIR, "project"), kalpDir, {
75
- recursive: true,
76
- force: true
77
- });
78
- await replacePlaceholders(kalpDir, { __PROJECT_NAME__: projectName });
76
+ await writeFile(join(targetDir, "kalp.config.ts"), kalpConfig, "utf-8");
77
+ await replacePlaceholders(targetDir, { __PROJECT_NAME__: projectName });
79
78
  }
80
79
  async function scaffoldAgent(opts) {
81
80
  const { agentName, templateId, cwd } = opts;
82
81
  const meta = getTemplateMeta(templateId);
83
- const agentDir = join(cwd, "kalp", "agents", agentName);
82
+ const agentDir = join(cwd, "agents", agentName);
84
83
  await cp(join(TEMPLATES_DIR, "agents", templateId), agentDir, {
85
84
  recursive: true,
86
85
  force: true
@@ -106,4 +105,4 @@ export {
106
105
  scaffoldProject,
107
106
  scaffoldAgent
108
107
  };
109
- //# sourceMappingURL=chunk-VMU456Z7.js.map
108
+ //# sourceMappingURL=chunk-FBVCQTQN.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/templates/index.ts","../src/scaffold.ts"],"sourcesContent":["export type TemplateId =\n | \"customer-support\"\n | \"b2b-sales\"\n | \"financial-agent\"\n | \"minimal\";\n\nexport interface TemplateMeta {\n id: TemplateId;\n label: string;\n hint: string;\n secrets: string[];\n}\n\nexport const TEMPLATES: TemplateMeta[] = [\n {\n id: \"customer-support\",\n label: \"Customer Support\",\n hint: \"ticket routing, escalation, knowledge base\",\n secrets: [\"OPENAI_API_KEY\"],\n },\n {\n id: \"b2b-sales\",\n label: \"B2B Sales Outreach\",\n hint: \"CRM enrichment, lead scoring\",\n secrets: [\"OPENAI_API_KEY\", \"CRM_API_KEY\"],\n },\n {\n id: \"financial-agent\",\n label: \"Financial Agent\",\n hint: \"market signals, portfolio analysis\",\n secrets: [\"OPENAI_API_KEY\", \"MARKET_DATA_API_KEY\"],\n },\n {\n id: \"minimal\",\n label: \"Minimal Skeleton\",\n hint: \"bare structure, start from scratch\",\n secrets: [],\n },\n];\n\nexport function getTemplateMeta(id: TemplateId): TemplateMeta {\n return TEMPLATES.find((t) => t.id === id)!;\n}\n","import { writeFile, readFile, readdir, cp } from \"node:fs/promises\";\nimport { fileURLToPath } from \"node:url\";\nimport { join, dirname } from \"node:path\";\nimport { getTemplateMeta, type TemplateId } from \"./templates/index.js\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\nexport const TEMPLATES_DIR = join(__dirname, \"..\", \"templates\");\n\nasync function replacePlaceholders(\n dir: string,\n map: Record<string, string>,\n): Promise<void> {\n const entries = await readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n const fp = join(dir, entry.name);\n if (entry.isDirectory()) {\n await replacePlaceholders(fp, map);\n } else if (entry.isFile() && entry.name !== \".gitkeep\") {\n try {\n let src = await readFile(fp, \"utf-8\");\n let changed = false;\n for (const [from, to] of Object.entries(map)) {\n if (src.includes(from)) {\n src = src.replaceAll(from, to);\n changed = true;\n }\n }\n if (changed) await writeFile(fp, src, \"utf-8\");\n } catch {\n // binary file — skip\n }\n }\n }\n}\n\nexport async function scaffoldProject(opts: {\n projectName: string;\n targetDir: string;\n}): Promise<void> {\n const { projectName, targetDir } = opts;\n\n // ── Copy project template (flat) to target directory ──────────────────\n await cp(join(TEMPLATES_DIR, \"project\"), targetDir, {\n recursive: true,\n force: true,\n });\n\n // ── kalp.config.ts ────────────────────────────────────────────────────\n const kalpConfig = `import { defineConfig } from \"@kalphq/sdk\";\n\nexport default defineConfig({\n projectId: \"${projectName}\",\n secrets: [],\n});\n`;\n await writeFile(join(targetDir, \"kalp.config.ts\"), kalpConfig, \"utf-8\");\n\n // ── Replace placeholders across the whole target ──────────────────────\n await replacePlaceholders(targetDir, { __PROJECT_NAME__: projectName });\n}\n\nexport async function scaffoldAgent(opts: {\n agentName: string;\n templateId: TemplateId;\n cwd: string;\n}): Promise<void> {\n const { agentName, templateId, cwd } = opts;\n const meta = getTemplateMeta(templateId);\n const agentDir = join(cwd, \"agents\", agentName);\n\n // ── Agent files via fs.cp ─────────────────────────────────────────────\n await cp(join(TEMPLATES_DIR, \"agents\", templateId), agentDir, {\n recursive: true,\n force: true,\n });\n await replacePlaceholders(agentDir, { __AGENT_NAME__: agentName });\n\n // ── .env at root (append missing secrets) ─────────────────────────────\n if (meta.secrets.length > 0) {\n const envPath = join(cwd, \".env\");\n let envExisting = \"\";\n try {\n envExisting = await readFile(envPath, \"utf-8\");\n } catch {\n // doesn't exist yet\n }\n const toAdd = meta.secrets\n .filter((s) => !envExisting.includes(s))\n .map((s) => `${s}=`)\n .join(\"\\n\");\n if (toAdd) {\n const content = envExisting\n ? envExisting.trimEnd() + \"\\n\" + toAdd + \"\\n\"\n : toAdd + \"\\n\";\n await writeFile(envPath, content, \"utf-8\");\n }\n }\n}\n"],"mappings":"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","names":[]}
@@ -3,7 +3,7 @@ import {
3
3
  TEMPLATES,
4
4
  scaffoldAgent,
5
5
  scaffoldProject
6
- } from "./chunk-VMU456Z7.js";
6
+ } from "./chunk-FBVCQTQN.js";
7
7
 
8
8
  // src/commands/create.ts
9
9
  import { join } from "path";
@@ -80,16 +80,16 @@ var create_default = defineCommand({
80
80
  const s = p.spinner();
81
81
  if (needsInit && projectName) {
82
82
  s.start("Creating project structure");
83
- await scaffoldProject({ projectName, cwd });
83
+ await scaffoldProject({ projectName, targetDir: cwd });
84
84
  s.stop("Project structure created");
85
85
  const pm = await detectPackageManager(cwd);
86
86
  const pmName = pm?.name ?? "npm";
87
87
  s.start(`Installing dependencies ${pc.dim(`(${pmName} install)`)}`);
88
88
  try {
89
- await installDependencies({ cwd: join(cwd, "kalp"), silent: true });
89
+ await installDependencies({ cwd, silent: true });
90
90
  s.stop("Dependencies installed");
91
91
  } catch {
92
- s.stop(pc.yellow("Install skipped \u2014 run manually inside kalp/"));
92
+ s.stop(pc.yellow("Install skipped \u2014 run npm install manually."));
93
93
  }
94
94
  }
95
95
  s.start(`Scaffolding agent ${pc.cyan(agentAnswers.name)}`);
@@ -101,9 +101,9 @@ var create_default = defineCommand({
101
101
  s.stop("Agent created");
102
102
  p.note(
103
103
  [
104
- `${pc.dim("\u2022")} ${pc.cyan(`kalp/agents/${agentAnswers.name}/index.ts`)}`,
105
- `${pc.dim("\u2022")} ${pc.cyan(`kalp/agents/${agentAnswers.name}/steps/`)}`,
106
- `${pc.dim("\u2022")} ${pc.cyan(`kalp/agents/${agentAnswers.name}/tools/`)}`
104
+ `${pc.dim("\u2022")} ${pc.cyan(`agents/${agentAnswers.name}/index.ts`)}`,
105
+ `${pc.dim("\u2022")} ${pc.cyan(`agents/${agentAnswers.name}/steps/`)}`,
106
+ `${pc.dim("\u2022")} ${pc.cyan(`agents/${agentAnswers.name}/tools/`)}`
107
107
  ].join("\n"),
108
108
  "Created"
109
109
  );
@@ -115,4 +115,4 @@ var create_default = defineCommand({
115
115
  export {
116
116
  create_default as default
117
117
  };
118
- //# sourceMappingURL=create-VKJ6C6DZ.js.map
118
+ //# sourceMappingURL=create-IOQTXJLI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/create.ts"],"sourcesContent":["import { join } from \"node:path\";\nimport { access } from \"node:fs/promises\";\nimport { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { installDependencies, detectPackageManager } from \"nypm\";\nimport { scaffoldProject, scaffoldAgent } from \"../scaffold.js\";\nimport { TEMPLATES, type TemplateId } from \"../templates/index.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 let needsInit = false;\n try {\n await access(join(cwd, \"kalp.config.ts\"));\n } catch {\n needsInit = true;\n }\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\n const initAnswers = await p.group(\n {\n name: () =>\n p.text({\n message: \"Project name?\",\n placeholder: \"my-project\",\n validate: (v) => {\n if (!v.trim()) return \"Project name is required.\";\n if (!/^[a-z0-9-]+$/.test(v))\n return \"Use lowercase letters, numbers, and dashes only.\";\n },\n }),\n },\n {\n onCancel: () => {\n p.cancel(\"Cancelled.\");\n process.exit(0);\n },\n },\n );\n\n projectName = initAnswers.name;\n }\n\n // ── Agent prompts ────────────────────────────────────────────────────\n const agentAnswers = await p.group(\n {\n name: () =>\n p.text({\n message: \"Agent name?\",\n placeholder: \"my-agent\",\n validate: (v) => {\n if (!v.trim()) return \"Agent name is required.\";\n if (!/^[a-z0-9-]+$/.test(v))\n return \"Use lowercase letters, numbers, and dashes only.\";\n },\n }),\n template: () =>\n p.select<TemplateId>({\n message: \"Choose a template\",\n options: TEMPLATES.map((t) => ({\n value: t.id,\n label: t.label,\n hint: pc.dim(t.hint),\n })),\n }),\n },\n {\n onCancel: () => {\n p.cancel(\"Cancelled.\");\n process.exit(0);\n },\n },\n );\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 const pm = await detectPackageManager(cwd);\n const pmName = pm?.name ?? \"npm\";\n s.start(`Installing dependencies ${pc.dim(`(${pmName} install)`)}`);\n try {\n await installDependencies({ cwd, silent: true });\n s.stop(\"Dependencies installed\");\n } catch {\n s.stop(pc.yellow(\"Install skipped — run npm install 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.template as 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":"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","names":[]}
package/dist/index.js CHANGED
@@ -9,9 +9,9 @@ var main = defineCommand({
9
9
  description: "\u{1F98B} Zero-config agent infrastructure"
10
10
  },
11
11
  subCommands: {
12
- init: () => import("./init-5UAVM2WR.js").then((r) => r.default),
13
- create: () => import("./create-VKJ6C6DZ.js").then((r) => r.default),
14
- build: () => import("./build-ZMN2247N.js").then((r) => r.default)
12
+ init: () => import("./init-CB5FVJKL.js").then((r) => r.default),
13
+ create: () => import("./create-IOQTXJLI.js").then((r) => r.default),
14
+ build: () => import("./build-WJ6ZTDWJ.js").then((r) => r.default)
15
15
  }
16
16
  });
17
17
  runMain(main);
@@ -0,0 +1,88 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ scaffoldProject
4
+ } from "./chunk-FBVCQTQN.js";
5
+
6
+ // src/commands/init.ts
7
+ import { join, resolve, basename } from "path";
8
+ import { access, mkdir } from "fs/promises";
9
+ import { defineCommand } from "citty";
10
+ import * as p from "@clack/prompts";
11
+ import pc from "picocolors";
12
+ import { installDependencies } from "nypm";
13
+ var LOGO = "\u{1F98B}";
14
+ var init_default = defineCommand({
15
+ meta: { name: "init", description: "Scaffold a new Kalp project" },
16
+ async run() {
17
+ const cwd = process.cwd();
18
+ p.intro(`${LOGO} ${pc.bold("kalp init")}`);
19
+ const answers = await p.group(
20
+ {
21
+ name: () => p.text({
22
+ message: "What is the name of your project?",
23
+ placeholder: "my-agent",
24
+ initialValue: "",
25
+ validate: (v) => {
26
+ if (!v.trim()) return "Project name is required.";
27
+ if (v.trim() !== "." && !/^[a-z0-9-]+$/.test(v))
28
+ return "Use lowercase letters, numbers, and dashes only (or . for current directory).";
29
+ }
30
+ })
31
+ },
32
+ {
33
+ onCancel: () => {
34
+ p.cancel("Setup cancelled.");
35
+ process.exit(0);
36
+ }
37
+ }
38
+ );
39
+ const isCurrentDir = answers.name.trim() === ".";
40
+ const targetDir = isCurrentDir ? cwd : resolve(cwd, answers.name);
41
+ const projectName = isCurrentDir ? basename(cwd) : answers.name;
42
+ try {
43
+ await access(join(targetDir, "kalp.config.ts"));
44
+ p.log.error(
45
+ `${pc.cyan("kalp.config.ts")} already exists in ${pc.cyan(targetDir)}. Run ${pc.cyan("kalp create")} to add an agent.`
46
+ );
47
+ process.exit(1);
48
+ } catch {
49
+ }
50
+ if (!isCurrentDir) {
51
+ await mkdir(targetDir, { recursive: true });
52
+ }
53
+ const s = p.spinner();
54
+ s.start("Creating project structure");
55
+ await scaffoldProject({ projectName, targetDir });
56
+ s.stop("Project structure created");
57
+ s.start("Installing dependencies");
58
+ try {
59
+ await installDependencies({ cwd: targetDir, silent: true });
60
+ s.stop("Dependencies installed");
61
+ } catch {
62
+ s.stop(
63
+ pc.yellow(
64
+ `Skipped \u2014 run ${pc.cyan("npm install")} in ${isCurrentDir ? "this directory" : answers.name + "/"}`
65
+ )
66
+ );
67
+ }
68
+ const cdHint = isCurrentDir ? "" : ` 1. ${pc.cyan(`cd ${answers.name}`)}
69
+ `;
70
+ const nextStep = isCurrentDir ? "1" : "2";
71
+ p.note(
72
+ [
73
+ `${pc.dim("\u2022")} ${pc.cyan("kalp.config.ts")} ${pc.dim("\u2014 project config")}`,
74
+ `${pc.dim("\u2022")} ${pc.cyan("package.json")} ${pc.dim("\u2014 dependencies")}`,
75
+ `${pc.dim("\u2022")} ${pc.cyan("agents/")} ${pc.dim("\u2014 your agents live here")}`,
76
+ ``,
77
+ `${pc.dim("Next:")}`,
78
+ `${cdHint} ${nextStep}. ${pc.cyan("kalp create")} ${pc.dim("\u2014 add your first agent")}`
79
+ ].join("\n"),
80
+ "You're ready \u{1F98B}"
81
+ );
82
+ p.outro(pc.green("Kalp initialized successfully."));
83
+ }
84
+ });
85
+ export {
86
+ init_default as default
87
+ };
88
+ //# sourceMappingURL=init-CB5FVJKL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/init.ts"],"sourcesContent":["import { join, resolve, basename } from \"node:path\";\nimport { access, mkdir } from \"node:fs/promises\";\nimport { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { installDependencies } from \"nypm\";\nimport { scaffoldProject } from \"../scaffold.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 answers = await p.group(\n {\n name: () =>\n p.text({\n message: \"What is the name of your project?\",\n placeholder: \"my-agent\",\n initialValue: \"\",\n validate: (v) => {\n if (!v.trim()) return \"Project name is required.\";\n if (v.trim() !== \".\" && !/^[a-z0-9-]+$/.test(v))\n return \"Use lowercase letters, numbers, and dashes only (or . for current directory).\";\n },\n }),\n },\n {\n onCancel: () => {\n p.cancel(\"Setup cancelled.\");\n process.exit(0);\n },\n },\n );\n\n const isCurrentDir = answers.name.trim() === \".\";\n const targetDir = isCurrentDir ? cwd : resolve(cwd, answers.name);\n const projectName = isCurrentDir ? basename(cwd) : answers.name;\n\n // ── Guard: already initialized ───────────────────────────────────────\n try {\n await access(join(targetDir, \"kalp.config.ts\"));\n p.log.error(\n `${pc.cyan(\"kalp.config.ts\")} already exists in ${pc.cyan(targetDir)}. Run ${pc.cyan(\"kalp create\")} to add an agent.`,\n );\n process.exit(1);\n } catch {\n // expected: file doesn't exist yet\n }\n\n // ── Create target directory if needed ─────────────────────────────────\n if (!isCurrentDir) {\n await mkdir(targetDir, { recursive: true });\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 installDependencies({ cwd: targetDir, silent: true });\n s.stop(\"Dependencies installed\");\n } catch {\n s.stop(\n pc.yellow(\n `Skipped — run ${pc.cyan(\"npm install\")} in ${isCurrentDir ? \"this directory\" : answers.name + \"/\"}`,\n ),\n );\n }\n\n const cdHint = isCurrentDir\n ? \"\"\n : ` 1. ${pc.cyan(`cd ${answers.name}`)}\\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,MAAM,SAAS,gBAAgB;AACxC,SAAS,QAAQ,aAAa;AAC9B,SAAS,qBAAqB;AAC9B,YAAY,OAAO;AACnB,OAAO,QAAQ;AACf,SAAS,2BAA2B;AAGpC,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,UAAU,MAAQ;AAAA,MACtB;AAAA,QACE,MAAM,MACF,OAAK;AAAA,UACL,SAAS;AAAA,UACT,aAAa;AAAA,UACb,cAAc;AAAA,UACd,UAAU,CAAC,MAAM;AACf,gBAAI,CAAC,EAAE,KAAK,EAAG,QAAO;AACtB,gBAAI,EAAE,KAAK,MAAM,OAAO,CAAC,eAAe,KAAK,CAAC;AAC5C,qBAAO;AAAA,UACX;AAAA,QACF,CAAC;AAAA,MACL;AAAA,MACA;AAAA,QACE,UAAU,MAAM;AACd,UAAE,SAAO,kBAAkB;AAC3B,kBAAQ,KAAK,CAAC;AAAA,QAChB;AAAA,MACF;AAAA,IACF;AAEA,UAAM,eAAe,QAAQ,KAAK,KAAK,MAAM;AAC7C,UAAM,YAAY,eAAe,MAAM,QAAQ,KAAK,QAAQ,IAAI;AAChE,UAAM,cAAc,eAAe,SAAS,GAAG,IAAI,QAAQ;AAG3D,QAAI;AACF,YAAM,OAAO,KAAK,WAAW,gBAAgB,CAAC;AAC9C,MAAE,MAAI;AAAA,QACJ,GAAG,GAAG,KAAK,gBAAgB,CAAC,sBAAsB,GAAG,KAAK,SAAS,CAAC,SAAS,GAAG,KAAK,aAAa,CAAC;AAAA,MACrG;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB,QAAQ;AAAA,IAER;AAGA,QAAI,CAAC,cAAc;AACjB,YAAM,MAAM,WAAW,EAAE,WAAW,KAAK,CAAC;AAAA,IAC5C;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,oBAAoB,EAAE,KAAK,WAAW,QAAQ,KAAK,CAAC;AAC1D,QAAE,KAAK,wBAAwB;AAAA,IACjC,QAAQ;AACN,QAAE;AAAA,QACA,GAAG;AAAA,UACD,sBAAiB,GAAG,KAAK,aAAa,CAAC,OAAO,eAAe,mBAAmB,QAAQ,OAAO,GAAG;AAAA,QACpG;AAAA,MACF;AAAA,IACF;AAEA,UAAM,SAAS,eACX,KACA,QAAQ,GAAG,KAAK,MAAM,QAAQ,IAAI,EAAE,CAAC;AAAA;AACzC,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":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kalphq/cli",
3
- "version": "0.0.0-dev-20260416055233",
3
+ "version": "0.0.0-dev-20260416061417",
4
4
  "description": "Zero-config CLI for deploying Kalp agents",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -24,7 +24,7 @@
24
24
  "nypm": "^0.3.12",
25
25
  "picocolors": "^1.1.1",
26
26
  "zod": "^3.25.76",
27
- "@kalphq/sdk": "0.0.0-dev-20260416055233"
27
+ "@kalphq/sdk": "0.0.0-dev-20260416061417"
28
28
  },
29
29
  "devDependencies": {
30
30
  "@types/node": "^22.15.3",
File without changes
@@ -9,5 +9,8 @@
9
9
  "dependencies": {
10
10
  "@kalphq/sdk": "latest",
11
11
  "zod": "^3.25.76"
12
+ },
13
+ "devDependencies": {
14
+ "@kalphq/cli": "latest"
12
15
  }
13
16
  }
@@ -9,6 +9,6 @@
9
9
  "outDir": "dist",
10
10
  "rootDir": "."
11
11
  },
12
- "include": ["agents/**/*.ts", "../kalp.config.ts"],
12
+ "include": ["agents/**/*.ts", "kalp.config.ts"],
13
13
  "exclude": ["node_modules", "dist", "meta"]
14
14
  }
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/commands/build.ts","../src/commands/utils.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { readFile } from \"node:fs/promises\";\nimport { resolve, relative } from \"node:path\";\nimport { z } from \"zod\";\nimport * as esbuild from \"esbuild\";\nimport { glob } from \"./utils.js\";\n\nconst LOGO = \"🦋\";\n\nexport default defineCommand({\n meta: { name: \"build\", description: \"Bundle agents for deployment\" },\n async run() {\n await _build();\n },\n});\n\nconst KalpConfigSchema = z.object({\n projectId: z.string().min(1),\n region: z.string().optional(),\n secrets: z.array(z.string()).optional(),\n});\n\nasync function _build(): Promise<void> {\n p.intro(`${LOGO} ${pc.bold(\"kalp build\")}`);\n\n const cwd = process.cwd();\n const configPath = resolve(cwd, \"kalp.config.ts\");\n\n // ── Validate kalp.config.ts ────────────────────────────────────────────\n const s = p.spinner();\n s.start(\"Reading kalp.config.ts\");\n\n let configRaw = \"\";\n try {\n configRaw = await readFile(configPath, \"utf-8\");\n } catch {\n s.stop(pc.red(\"kalp.config.ts not found\"));\n p.outro(`${pc.dim(\"Run\")} ${pc.cyan(\"kalp init\")} ${pc.dim(\"first.\")}`);\n process.exit(1);\n }\n\n // Extract the config object from defineConfig({...}) using a lightweight regex\n const match = configRaw.match(/defineConfig\\(\\s*(\\{[\\s\\S]*?\\})\\s*\\)/);\n if (!match?.[1]) {\n s.stop(pc.red(\"Could not parse kalp.config.ts\"));\n process.exit(1);\n }\n\n let parsed: z.infer<typeof KalpConfigSchema>;\n try {\n // Evaluate the config object (safe: it's the user's own config file)\n const fn = new Function(`return ${match[1]}`);\n parsed = KalpConfigSchema.parse(fn());\n } catch (err) {\n s.stop(pc.red(\"Invalid kalp.config.ts\"));\n if (err instanceof z.ZodError) {\n for (const issue of err.issues) {\n p.log.error(` ${issue.path.join(\".\")}: ${issue.message}`);\n }\n }\n process.exit(1);\n }\n\n s.stop(`Project ${pc.cyan(parsed.projectId)} validated`);\n\n // ── Discover agent entry points ────────────────────────────────────────\n s.start(\"Discovering agents\");\n\n const agentEntries = await glob(resolve(cwd, \"kalp/agents/*/index.ts\"));\n if (agentEntries.length === 0) {\n s.stop(pc.yellow(\"No agents found in kalp/agents/\"));\n p.outro(pc.dim(\"Create an agent first.\"));\n process.exit(0);\n }\n\n s.stop(`Found ${pc.cyan(String(agentEntries.length))} agent(s)`);\n\n // ── Bundle with esbuild ────────────────────────────────────────────────\n s.start(\"Bundling agents\");\n\n const outdir = resolve(cwd, \"kalp/meta/dist\");\n try {\n await esbuild.build({\n entryPoints: agentEntries,\n bundle: true,\n platform: \"node\",\n target: \"es2022\",\n format: \"esm\",\n outdir,\n minify: true,\n treeShaking: true,\n external: [\"@kalphq/sdk\"],\n logLevel: \"silent\",\n });\n } catch (err) {\n s.stop(pc.red(\"Build failed\"));\n console.error(err);\n process.exit(1);\n }\n\n s.stop(\"Bundle ready\");\n\n // ── Summary ────────────────────────────────────────────────────────────\n const lines = agentEntries.map(\n (e: string) => ` ${pc.dim(\"•\")} ${pc.cyan(relative(cwd, e))}`,\n );\n p.note(lines.join(\"\\n\"), \"Bundled agents\");\n\n p.outro(\n `${LOGO} ${pc.green(\"Build complete.\")} ${pc.dim(`Output → kalp/meta/dist/`)}`,\n );\n}\n","import { readdir, stat } from \"node:fs/promises\";\nimport { resolve, dirname } from \"node:path\";\n\n/**\n * Minimal glob for patterns like `some/path/* /index.ts`.\n * Matches one directory level then a fixed filename.\n */\nexport async function glob(pattern: string): Promise<string[]> {\n const dir = dirname(dirname(pattern));\n const filename = pattern.split(\"/\").pop() ?? pattern.split(\"\\\\\").pop() ?? \"\";\n\n const results: string[] = [];\n\n try {\n const entries = await readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n const candidate = resolve(dir, entry.name, filename);\n try {\n const s = await stat(candidate);\n if (s.isFile()) results.push(candidate);\n } catch {\n // file doesn't exist in this subdirectory\n }\n }\n } catch {\n // parent directory doesn't exist\n }\n\n return results;\n}\n"],"mappings":"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","names":["resolve","resolve"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/templates/index.ts","../src/scaffold.ts"],"sourcesContent":["export type TemplateId =\n | \"customer-support\"\n | \"b2b-sales\"\n | \"financial-agent\"\n | \"minimal\";\n\nexport interface TemplateMeta {\n id: TemplateId;\n label: string;\n hint: string;\n secrets: string[];\n}\n\nexport const TEMPLATES: TemplateMeta[] = [\n {\n id: \"customer-support\",\n label: \"Customer Support\",\n hint: \"ticket routing, escalation, knowledge base\",\n secrets: [\"OPENAI_API_KEY\"],\n },\n {\n id: \"b2b-sales\",\n label: \"B2B Sales Outreach\",\n hint: \"CRM enrichment, lead scoring\",\n secrets: [\"OPENAI_API_KEY\", \"CRM_API_KEY\"],\n },\n {\n id: \"financial-agent\",\n label: \"Financial Agent\",\n hint: \"market signals, portfolio analysis\",\n secrets: [\"OPENAI_API_KEY\", \"MARKET_DATA_API_KEY\"],\n },\n {\n id: \"minimal\",\n label: \"Minimal Skeleton\",\n hint: \"bare structure, start from scratch\",\n secrets: [],\n },\n];\n\nexport function getTemplateMeta(id: TemplateId): TemplateMeta {\n return TEMPLATES.find((t) => t.id === id)!;\n}\n","import { writeFile, readFile, readdir, cp } from \"node:fs/promises\";\nimport { fileURLToPath } from \"node:url\";\nimport { join, dirname } from \"node:path\";\nimport { getTemplateMeta, type TemplateId } from \"./templates/index.js\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\nexport const TEMPLATES_DIR = join(__dirname, \"..\", \"templates\");\n\nasync function replacePlaceholders(\n dir: string,\n map: Record<string, string>,\n): Promise<void> {\n const entries = await readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n const fp = join(dir, entry.name);\n if (entry.isDirectory()) {\n await replacePlaceholders(fp, map);\n } else if (entry.isFile() && entry.name !== \".gitkeep\") {\n try {\n let src = await readFile(fp, \"utf-8\");\n let changed = false;\n for (const [from, to] of Object.entries(map)) {\n if (src.includes(from)) {\n src = src.replaceAll(from, to);\n changed = true;\n }\n }\n if (changed) await writeFile(fp, src, \"utf-8\");\n } catch {\n // binary file — skip\n }\n }\n }\n}\n\nexport async function scaffoldProject(opts: {\n projectName: string;\n cwd: string;\n}): Promise<void> {\n const { projectName, cwd } = opts;\n\n // ── kalp.config.ts at root ─────────────────────────────────────────────\n const kalpConfig = `import { defineConfig } from \"@kalphq/sdk\";\n\nexport default defineConfig({\n projectId: \"${projectName}\",\n secrets: [],\n});\n`;\n await writeFile(join(cwd, \"kalp.config.ts\"), kalpConfig, \"utf-8\");\n\n // ── kalp/ sub-package via fs.cp ───────────────────────────────────────\n const kalpDir = join(cwd, \"kalp\");\n await cp(join(TEMPLATES_DIR, \"project\"), kalpDir, {\n recursive: true,\n force: true,\n });\n await replacePlaceholders(kalpDir, { __PROJECT_NAME__: projectName });\n}\n\nexport async function scaffoldAgent(opts: {\n agentName: string;\n templateId: TemplateId;\n cwd: string;\n}): Promise<void> {\n const { agentName, templateId, cwd } = opts;\n const meta = getTemplateMeta(templateId);\n const agentDir = join(cwd, \"kalp\", \"agents\", agentName);\n\n // ── Agent files via fs.cp ─────────────────────────────────────────────\n await cp(join(TEMPLATES_DIR, \"agents\", templateId), agentDir, {\n recursive: true,\n force: true,\n });\n await replacePlaceholders(agentDir, { __AGENT_NAME__: agentName });\n\n // ── .env at root (append missing secrets) ─────────────────────────────\n if (meta.secrets.length > 0) {\n const envPath = join(cwd, \".env\");\n let envExisting = \"\";\n try {\n envExisting = await readFile(envPath, \"utf-8\");\n } catch {\n // doesn't exist yet\n }\n const toAdd = meta.secrets\n .filter((s) => !envExisting.includes(s))\n .map((s) => `${s}=`)\n .join(\"\\n\");\n if (toAdd) {\n const content = envExisting\n ? envExisting.trimEnd() + \"\\n\" + toAdd + \"\\n\"\n : toAdd + \"\\n\";\n await writeFile(envPath, content, \"utf-8\");\n }\n }\n}\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/commands/create.ts"],"sourcesContent":["import { join } from \"node:path\";\nimport { access } from \"node:fs/promises\";\nimport { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { installDependencies, detectPackageManager } from \"nypm\";\nimport { scaffoldProject, scaffoldAgent } from \"../scaffold.js\";\nimport { TEMPLATES, type TemplateId } from \"../templates/index.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 let needsInit = false;\n try {\n await access(join(cwd, \"kalp.config.ts\"));\n } catch {\n needsInit = true;\n }\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\n const initAnswers = await p.group(\n {\n name: () =>\n p.text({\n message: \"Project name?\",\n placeholder: \"my-project\",\n validate: (v) => {\n if (!v.trim()) return \"Project name is required.\";\n if (!/^[a-z0-9-]+$/.test(v))\n return \"Use lowercase letters, numbers, and dashes only.\";\n },\n }),\n },\n {\n onCancel: () => {\n p.cancel(\"Cancelled.\");\n process.exit(0);\n },\n },\n );\n\n projectName = initAnswers.name;\n }\n\n // ── Agent prompts ────────────────────────────────────────────────────\n const agentAnswers = await p.group(\n {\n name: () =>\n p.text({\n message: \"Agent name?\",\n placeholder: \"my-agent\",\n validate: (v) => {\n if (!v.trim()) return \"Agent name is required.\";\n if (!/^[a-z0-9-]+$/.test(v))\n return \"Use lowercase letters, numbers, and dashes only.\";\n },\n }),\n template: () =>\n p.select<TemplateId>({\n message: \"Choose a template\",\n options: TEMPLATES.map((t) => ({\n value: t.id,\n label: t.label,\n hint: pc.dim(t.hint),\n })),\n }),\n },\n {\n onCancel: () => {\n p.cancel(\"Cancelled.\");\n process.exit(0);\n },\n },\n );\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, cwd });\n s.stop(\"Project structure created\");\n\n const pm = await detectPackageManager(cwd);\n const pmName = pm?.name ?? \"npm\";\n s.start(`Installing dependencies ${pc.dim(`(${pmName} install)`)}`);\n try {\n await installDependencies({ cwd: join(cwd, \"kalp\"), silent: true });\n s.stop(\"Dependencies installed\");\n } catch {\n s.stop(pc.yellow(\"Install skipped — run manually inside kalp/\"));\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.template as TemplateId,\n cwd,\n });\n s.stop(\"Agent created\");\n\n p.note(\n [\n `${pc.dim(\"•\")} ${pc.cyan(`kalp/agents/${agentAnswers.name}/index.ts`)}`,\n `${pc.dim(\"•\")} ${pc.cyan(`kalp/agents/${agentAnswers.name}/steps/`)}`,\n `${pc.dim(\"•\")} ${pc.cyan(`kalp/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":"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","names":[]}
@@ -1,74 +0,0 @@
1
- #!/usr/bin/env node
2
- import {
3
- scaffoldProject
4
- } from "./chunk-VMU456Z7.js";
5
-
6
- // src/commands/init.ts
7
- import { join } from "path";
8
- import { access } from "fs/promises";
9
- import { defineCommand } from "citty";
10
- import * as p from "@clack/prompts";
11
- import pc from "picocolors";
12
- import { addDependency } from "nypm";
13
- var LOGO = "\u{1F98B}";
14
- var init_default = defineCommand({
15
- meta: { name: "init", description: "Scaffold a new Kalp project" },
16
- async run() {
17
- const cwd = process.cwd();
18
- p.intro(`${LOGO} ${pc.bold("kalp init")}`);
19
- try {
20
- await access(join(cwd, "kalp.config.ts"));
21
- p.log.error(
22
- `${pc.cyan("kalp.config.ts")} already exists. Run ${pc.cyan("kalp create")} to add an agent.`
23
- );
24
- process.exit(1);
25
- } catch {
26
- }
27
- const answers = await p.group(
28
- {
29
- name: () => p.text({
30
- message: "What is the name of your project?",
31
- placeholder: "my-project",
32
- validate: (v) => {
33
- if (!v.trim()) return "Project name is required.";
34
- if (!/^[a-z0-9-]+$/.test(v))
35
- return "Use lowercase letters, numbers, and dashes only.";
36
- }
37
- })
38
- },
39
- {
40
- onCancel: () => {
41
- p.cancel("Setup cancelled.");
42
- process.exit(0);
43
- }
44
- }
45
- );
46
- const s = p.spinner();
47
- s.start("Creating project structure");
48
- await scaffoldProject({ projectName: answers.name, cwd });
49
- s.stop("Project structure created");
50
- s.start(`Adding ${pc.cyan("@kalphq/sdk")} to your project`);
51
- try {
52
- await addDependency("@kalphq/sdk", { cwd, dev: true, silent: true });
53
- s.stop(`${pc.cyan("@kalphq/sdk")} installed`);
54
- } catch {
55
- s.stop(pc.yellow(`Skipped \u2014 run manually: npm install -D @kalphq/sdk`));
56
- }
57
- p.note(
58
- [
59
- `${pc.dim("\u2022")} ${pc.cyan("kalp.config.ts")} ${pc.dim("\u2014 project config")}`,
60
- `${pc.dim("\u2022")} ${pc.cyan("kalp/")} ${pc.dim("\u2014 agents sub-package")}`,
61
- ``,
62
- `${pc.dim("Next:")}`,
63
- ` 1. ${pc.cyan("cd kalp && npm install")}`,
64
- ` 2. ${pc.cyan("kalp create")} ${pc.dim("\u2014 add your first agent")}`
65
- ].join("\n"),
66
- "You're ready \u{1F98B}"
67
- );
68
- p.outro(pc.green("Kalp initialized successfully."));
69
- }
70
- });
71
- export {
72
- init_default as default
73
- };
74
- //# sourceMappingURL=init-5UAVM2WR.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/commands/init.ts"],"sourcesContent":["import { join } from \"node:path\";\nimport { access } from \"node:fs/promises\";\nimport { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { addDependency } from \"nypm\";\nimport { scaffoldProject } from \"../scaffold.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 // ── Guard: already initialized ───────────────────────────────────────\n try {\n await access(join(cwd, \"kalp.config.ts\"));\n p.log.error(\n `${pc.cyan(\"kalp.config.ts\")} already exists. Run ${pc.cyan(\"kalp create\")} to add an agent.`,\n );\n process.exit(1);\n } catch {\n // expected: file doesn't exist yet\n }\n\n const answers = await p.group(\n {\n name: () =>\n p.text({\n message: \"What is the name of your project?\",\n placeholder: \"my-project\",\n validate: (v) => {\n if (!v.trim()) return \"Project name is required.\";\n if (!/^[a-z0-9-]+$/.test(v))\n return \"Use lowercase letters, numbers, and dashes only.\";\n },\n }),\n },\n {\n onCancel: () => {\n p.cancel(\"Setup cancelled.\");\n process.exit(0);\n },\n },\n );\n\n const s = p.spinner();\n\n s.start(\"Creating project structure\");\n await scaffoldProject({ projectName: answers.name, cwd });\n s.stop(\"Project structure created\");\n\n s.start(`Adding ${pc.cyan(\"@kalphq/sdk\")} to your project`);\n try {\n await addDependency(\"@kalphq/sdk\", { cwd, dev: true, silent: true });\n s.stop(`${pc.cyan(\"@kalphq/sdk\")} installed`);\n } catch {\n s.stop(pc.yellow(`Skipped — run manually: npm install -D @kalphq/sdk`));\n }\n\n p.note(\n [\n `${pc.dim(\"•\")} ${pc.cyan(\"kalp.config.ts\")} ${pc.dim(\"— project config\")}`,\n `${pc.dim(\"•\")} ${pc.cyan(\"kalp/\")} ${pc.dim(\"— agents sub-package\")}`,\n ``,\n `${pc.dim(\"Next:\")}`,\n ` 1. ${pc.cyan(\"cd kalp && npm install\")}`,\n ` 2. ${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,YAAY;AACrB,SAAS,cAAc;AACvB,SAAS,qBAAqB;AAC9B,YAAY,OAAO;AACnB,OAAO,QAAQ;AACf,SAAS,qBAAqB;AAG9B,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;AAGzC,QAAI;AACF,YAAM,OAAO,KAAK,KAAK,gBAAgB,CAAC;AACxC,MAAE,MAAI;AAAA,QACJ,GAAG,GAAG,KAAK,gBAAgB,CAAC,wBAAwB,GAAG,KAAK,aAAa,CAAC;AAAA,MAC5E;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB,QAAQ;AAAA,IAER;AAEA,UAAM,UAAU,MAAQ;AAAA,MACtB;AAAA,QACE,MAAM,MACF,OAAK;AAAA,UACL,SAAS;AAAA,UACT,aAAa;AAAA,UACb,UAAU,CAAC,MAAM;AACf,gBAAI,CAAC,EAAE,KAAK,EAAG,QAAO;AACtB,gBAAI,CAAC,eAAe,KAAK,CAAC;AACxB,qBAAO;AAAA,UACX;AAAA,QACF,CAAC;AAAA,MACL;AAAA,MACA;AAAA,QACE,UAAU,MAAM;AACd,UAAE,SAAO,kBAAkB;AAC3B,kBAAQ,KAAK,CAAC;AAAA,QAChB;AAAA,MACF;AAAA,IACF;AAEA,UAAM,IAAM,UAAQ;AAEpB,MAAE,MAAM,4BAA4B;AACpC,UAAM,gBAAgB,EAAE,aAAa,QAAQ,MAAM,IAAI,CAAC;AACxD,MAAE,KAAK,2BAA2B;AAElC,MAAE,MAAM,UAAU,GAAG,KAAK,aAAa,CAAC,kBAAkB;AAC1D,QAAI;AACF,YAAM,cAAc,eAAe,EAAE,KAAK,KAAK,MAAM,QAAQ,KAAK,CAAC;AACnE,QAAE,KAAK,GAAG,GAAG,KAAK,aAAa,CAAC,YAAY;AAAA,IAC9C,QAAQ;AACN,QAAE,KAAK,GAAG,OAAO,yDAAoD,CAAC;AAAA,IACxE;AAEA,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,OAAO,CAAC,IAAI,GAAG,IAAI,2BAAsB,CAAC;AAAA,QACpE;AAAA,QACA,GAAG,GAAG,IAAI,OAAO,CAAC;AAAA,QAClB,QAAQ,GAAG,KAAK,wBAAwB,CAAC;AAAA,QACzC,QAAQ,GAAG,KAAK,aAAa,CAAC,IAAI,GAAG,IAAI,6BAAwB,CAAC;AAAA,MACpE,EAAE,KAAK,IAAI;AAAA,MACX;AAAA,IACF;AAEA,IAAE,QAAM,GAAG,MAAM,gCAAgC,CAAC;AAAA,EACpD;AACF,CAAC;","names":[]}
@@ -1 +0,0 @@
1
- { "deployments": [] }
@@ -1,9 +0,0 @@
1
- {
2
- "name": "__PROJECT_NAME__",
3
- "version": "0.0.1",
4
- "private": true,
5
- "devDependencies": {
6
- "@kalphq/cli": "latest",
7
- "@kalphq/sdk": "latest"
8
- }
9
- }