@kalphq/cli 0.0.0-dev-20260420023057 → 0.0.0-dev-20260420050715

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.
Files changed (48) hide show
  1. package/dist/{add-5NOYFTJV.js → add-UCN5EAL3.js} +37 -5
  2. package/dist/add-UCN5EAL3.js.map +1 -0
  3. package/dist/{chunk-HD5FT7T6.js → chunk-22WOAGNG.js} +144 -64
  4. package/dist/chunk-22WOAGNG.js.map +1 -0
  5. package/dist/{chunk-CJCIZDCF.js → chunk-EAMMDUE3.js} +24 -24
  6. package/dist/chunk-EAMMDUE3.js.map +1 -0
  7. package/dist/{chunk-Q455HC3P.js → chunk-TPTPZH2W.js} +6 -10
  8. package/dist/chunk-TPTPZH2W.js.map +1 -0
  9. package/dist/{create-RSQEKCI6.js → create-T7KGVPNR.js} +4 -8
  10. package/dist/create-T7KGVPNR.js.map +1 -0
  11. package/dist/{delete-ZJB2JGAL.js → delete-6MKUQ3XK.js} +26 -1
  12. package/dist/delete-6MKUQ3XK.js.map +1 -0
  13. package/dist/index.js +9 -9
  14. package/dist/index.js.map +1 -1
  15. package/dist/{init-CUBJEWPE.js → init-VBOTPFNB.js} +3 -3
  16. package/dist/link-YCIA4JJ3.js +37 -0
  17. package/dist/link-YCIA4JJ3.js.map +1 -0
  18. package/dist/login-22HHVS52.js +39 -0
  19. package/dist/login-22HHVS52.js.map +1 -0
  20. package/dist/logout-OJM3VAOF.js +32 -0
  21. package/dist/logout-OJM3VAOF.js.map +1 -0
  22. package/dist/{build-SUIPVJO6.js → migrate-GA7EHSDG.js} +14 -14
  23. package/dist/migrate-GA7EHSDG.js.map +1 -0
  24. package/dist/{push-L3BXB6OC.js → push-2B4NWFGC.js} +10 -8
  25. package/dist/push-2B4NWFGC.js.map +1 -0
  26. package/dist/secrets-SIK6J5AF.js +46 -0
  27. package/dist/secrets-SIK6J5AF.js.map +1 -0
  28. package/package.json +2 -2
  29. package/templates/project/package.json +4 -4
  30. package/templates/project/tsconfig.json +6 -2
  31. package/dist/add-5NOYFTJV.js.map +0 -1
  32. package/dist/build-SUIPVJO6.js.map +0 -1
  33. package/dist/chunk-CJCIZDCF.js.map +0 -1
  34. package/dist/chunk-HD5FT7T6.js.map +0 -1
  35. package/dist/chunk-Q455HC3P.js.map +0 -1
  36. package/dist/create-RSQEKCI6.js.map +0 -1
  37. package/dist/delete-ZJB2JGAL.js.map +0 -1
  38. package/dist/link-YKDZ7Y6K.js +0 -23
  39. package/dist/link-YKDZ7Y6K.js.map +0 -1
  40. package/dist/login-LBEXP7ET.js +0 -27
  41. package/dist/login-LBEXP7ET.js.map +0 -1
  42. package/dist/logout-S3PV4WE7.js +0 -27
  43. package/dist/logout-S3PV4WE7.js.map +0 -1
  44. package/dist/push-L3BXB6OC.js.map +0 -1
  45. package/dist/secrets-3SKCSAGD.js +0 -33
  46. package/dist/secrets-3SKCSAGD.js.map +0 -1
  47. /package/dist/{init-CUBJEWPE.js.map → init-VBOTPFNB.js.map} +0 -0
  48. /package/templates/project/meta/{manifest-registry.json → snapshot.json} +0 -0
@@ -195,7 +195,7 @@ function getHash(payload) {
195
195
  return createHash("sha256").update(payload).digest("hex");
196
196
  }
197
197
  function isManifestVersionFile(fileName) {
198
- return fileName.endsWith(".json") && fileName !== "latest.json";
198
+ return fileName.endsWith(".json");
199
199
  }
200
200
  function createVersionId(payload, generatedAt) {
201
201
  return createHash("sha256").update(payload).update(generatedAt).digest("hex").slice(0, 8);
@@ -210,7 +210,7 @@ async function readManifestVersionFile(filePath) {
210
210
  }
211
211
  async function writeVersionedManifest(params) {
212
212
  const { cwd, agentName, manifest } = params;
213
- const agentMetaDir = join(cwd, "meta", "manifests", agentName);
213
+ const agentMetaDir = join(cwd, "meta", "migrations", agentName);
214
214
  await mkdir(agentMetaDir, { recursive: true });
215
215
  const files = await readdir(agentMetaDir);
216
216
  const versionFiles = files.filter(isManifestVersionFile);
@@ -234,19 +234,14 @@ async function writeVersionedManifest(params) {
234
234
  };
235
235
  const versionFile = join(agentMetaDir, `${versionId}.json`);
236
236
  await writeFile(versionFile, JSON.stringify(record, null, 2) + "\n", "utf-8");
237
- await writeFile(
238
- join(agentMetaDir, "latest.json"),
239
- JSON.stringify(record, null, 2) + "\n",
240
- "utf-8"
241
- );
242
- const registryPath = join(cwd, "meta", "manifest-registry.json");
243
- const registry = await readManifestRegistry(registryPath);
244
- const prev = registry[agentName] ?? { latest: "", versions: [] };
237
+ const snapshotPath = join(cwd, "meta", "snapshot.json");
238
+ const snapshot = await readSnapshot(snapshotPath);
239
+ const prev = snapshot[agentName] ?? { latest: "", versions: [] };
245
240
  const versions = prev.versions.includes(versionId) ? prev.versions : [...prev.versions, versionId];
246
- registry[agentName] = { latest: versionId, versions };
241
+ snapshot[agentName] = { latest: versionId, versions };
247
242
  await writeFile(
248
- registryPath,
249
- JSON.stringify(registry, null, 2) + "\n",
243
+ snapshotPath,
244
+ JSON.stringify(snapshot, null, 2) + "\n",
250
245
  "utf-8"
251
246
  );
252
247
  return {
@@ -256,14 +251,19 @@ async function writeVersionedManifest(params) {
256
251
  }
257
252
  async function readLatestVersionedManifest(params) {
258
253
  const { cwd, agentName } = params;
259
- const agentMetaDir = join(cwd, "meta", "manifests", agentName);
260
- const latestPath = join(agentMetaDir, "latest.json");
261
- const latest = await readManifestVersionFile(latestPath);
262
- if (latest) {
263
- return {
264
- ...latest,
265
- outputPath: latestPath
266
- };
254
+ const agentMetaDir = join(cwd, "meta", "migrations", agentName);
255
+ const snapshotPath = join(cwd, "meta", "snapshot.json");
256
+ const snapshot = await readSnapshot(snapshotPath);
257
+ const agentEntry = snapshot[agentName];
258
+ if (agentEntry?.latest) {
259
+ const latestFile = join(agentMetaDir, `${agentEntry.latest}.json`);
260
+ const latest = await readManifestVersionFile(latestFile);
261
+ if (latest) {
262
+ return {
263
+ ...latest,
264
+ outputPath: latestFile
265
+ };
266
+ }
267
267
  }
268
268
  const files = await readdir(agentMetaDir).catch(() => []);
269
269
  const records = (await Promise.all(
@@ -281,9 +281,9 @@ async function readLatestVersionedManifest(params) {
281
281
  outputPath: join(agentMetaDir, `${newest.versionId}.json`)
282
282
  };
283
283
  }
284
- async function readManifestRegistry(registryPath) {
284
+ async function readSnapshot(snapshotPath) {
285
285
  try {
286
- const src = await readFile(registryPath, "utf-8");
286
+ const src = await readFile(snapshotPath, "utf-8");
287
287
  return JSON.parse(src);
288
288
  } catch {
289
289
  return {};
@@ -295,4 +295,4 @@ export {
295
295
  writeVersionedManifest,
296
296
  readLatestVersionedManifest
297
297
  };
298
- //# sourceMappingURL=chunk-CJCIZDCF.js.map
298
+ //# sourceMappingURL=chunk-EAMMDUE3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/manifest.ts"],"sourcesContent":["import { createHash } from \"node:crypto\";\nimport { existsSync } from \"node:fs\";\nimport {\n access,\n mkdtemp,\n mkdir,\n readFile,\n readdir,\n rm,\n writeFile,\n} from \"node:fs/promises\";\nimport { join, resolve } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { build } from \"esbuild\";\nimport type { ZodTypeAny } from \"zod\";\nimport { zodToJsonSchema } from \"zod-to-json-schema\";\n\nexport interface AgentManifestV1 {\n format: \"kalp-agent-manifest\";\n schemaVersion: 1;\n generatedAt: string;\n agent: {\n id?: string;\n name: string;\n description: string;\n systemPrompt:\n | { type: \"static\"; value: string }\n | { type: \"dynamic\" }\n | { type: \"none\" };\n lifecycle: {\n onInit: boolean;\n onMessage: boolean;\n onTick: boolean;\n };\n actions: {\n ai: boolean;\n wait: boolean;\n fetch: boolean;\n runStep: boolean;\n callTool: boolean;\n runFlow: boolean;\n };\n steps: Array<{\n id: string;\n order: number;\n description: string;\n inputSchema: Record<string, unknown> | null;\n outputSchema: Record<string, unknown> | null;\n }>;\n tools: Array<{\n id: string;\n order: number;\n description: string;\n inputSchema: Record<string, unknown> | null;\n }>;\n routes: Array<{\n id: string;\n order: number;\n method: string;\n path: string;\n inputSchema: Record<string, unknown> | null;\n }>;\n flows: Array<{\n id: string;\n order: number;\n description: string;\n steps: Array<{\n order: number;\n stepId: string;\n existsInAgentSteps: boolean;\n }>;\n }>;\n execution: {\n stepOrder: string[];\n toolOrder: string[];\n routeOrder: string[];\n flowOrder: string[];\n };\n };\n}\n\nexport interface ManifestVersionRecord {\n version: number;\n versionId: string;\n hash: string;\n generatedAt: string;\n immutable: true;\n manifest: AgentManifestV1;\n}\n\ninterface ManifestRegistryEntry {\n latest: string;\n versions: string[];\n}\n\ninterface LoadedAgentModule {\n agent: unknown;\n tempDir: string;\n}\n\ninterface AgentItemWithInput {\n id?: unknown;\n description?: unknown;\n input?: unknown;\n}\n\ninterface AgentStepItem extends AgentItemWithInput {\n output?: unknown;\n}\n\ninterface AgentRouteItem extends AgentItemWithInput {\n method?: unknown;\n path?: unknown;\n}\n\ninterface AgentFlowItem {\n id?: unknown;\n description?: unknown;\n steps?: unknown;\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 toJsonSchema(\n schema: unknown,\n name: string,\n): Record<string, unknown> | null {\n try {\n return zodToJsonSchema(schema as ZodTypeAny, name) as Record<\n string,\n unknown\n >;\n } catch {\n return null;\n }\n}\n\nfunction serializeSystemPrompt(\n systemPrompt: unknown,\n): AgentManifestV1[\"agent\"][\"systemPrompt\"] {\n if (typeof systemPrompt === \"string\") {\n return { type: \"static\", value: systemPrompt };\n }\n\n if (typeof systemPrompt === \"function\") {\n return { type: \"dynamic\" };\n }\n\n return { type: \"none\" };\n}\n\nfunction serializeSteps(steps: unknown[]): AgentManifestV1[\"agent\"][\"steps\"] {\n return steps.map((step, index) => {\n const item = asRecord(step) as AgentStepItem;\n return {\n id: asString(item.id) ?? `step_${index + 1}`,\n order: index + 1,\n description: asString(item.description) ?? \"\",\n inputSchema: toJsonSchema(item.input, `step_${index + 1}_input`),\n outputSchema: toJsonSchema(item.output, `step_${index + 1}_output`),\n };\n });\n}\n\nfunction serializeTools(tools: unknown[]): AgentManifestV1[\"agent\"][\"tools\"] {\n return tools.map((tool, index) => {\n const item = asRecord(tool) as AgentItemWithInput;\n return {\n id: asString(item.id) ?? `tool_${index + 1}`,\n order: index + 1,\n description: asString(item.description) ?? \"\",\n inputSchema: toJsonSchema(item.input, `tool_${index + 1}_input`),\n };\n });\n}\n\nfunction serializeRoutes(\n routes: unknown[],\n): AgentManifestV1[\"agent\"][\"routes\"] {\n return routes.map((route, index) => {\n const item = asRecord(route) as AgentRouteItem;\n return {\n id: asString(item.id) ?? `route_${index + 1}`,\n order: index + 1,\n method: asString(item.method) ?? \"GET\",\n path: asString(item.path) ?? \"/\",\n inputSchema: toJsonSchema(item.input, `route_${index + 1}_input`),\n };\n });\n}\n\nfunction serializeFlows(\n flows: unknown[],\n stepIds: Set<string>,\n): AgentManifestV1[\"agent\"][\"flows\"] {\n return flows.map((flow, index) => {\n const item = asRecord(flow) as AgentFlowItem;\n const steps = asArray(item.steps).map((s, stepIndex) => {\n const step = asRecord(s);\n const stepId = asString(step.id) ?? `step_${stepIndex + 1}`;\n return {\n order: stepIndex + 1,\n stepId,\n existsInAgentSteps: stepIds.has(stepId),\n };\n });\n\n return {\n id: asString(item.id) ?? `flow_${index + 1}`,\n order: index + 1,\n description: asString(item.description) ?? \"\",\n steps,\n };\n });\n}\n\nasync function loadAgentModule(\n agentPath: string,\n cwd: string,\n): Promise<LoadedAgentModule> {\n const tempDir = await mkdtemp(join(cwd, \".kalp-manifest-\"));\n const outFile = join(tempDir, \"agent.manifest.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 async function readAgentManifest(params: {\n cwd: string;\n agentName: string;\n}): Promise<AgentManifestV1> {\n const { cwd, agentName } = params;\n const agentPath = join(cwd, \"agents\", agentName, \"index.ts\");\n await access(agentPath);\n\n let tempDir: string | undefined;\n\n try {\n const loaded = await loadAgentModule(agentPath, cwd);\n tempDir = loaded.tempDir;\n const agent = asRecord(loaded.agent);\n const steps = serializeSteps(asArray(agent.steps));\n const tools = serializeTools(asArray(agent.tools));\n const routes = serializeRoutes(asArray(agent.routes));\n const stepIds = new Set(steps.map((step) => step.id));\n const flows = serializeFlows(asArray(agent.flows), stepIds);\n\n return {\n format: \"kalp-agent-manifest\",\n schemaVersion: 1,\n generatedAt: new Date().toISOString(),\n agent: {\n id: asString(agent.id),\n name: asString(agent.name) ?? agentName,\n description: asString(agent.description) ?? \"\",\n systemPrompt: serializeSystemPrompt(agent.systemPrompt),\n lifecycle: {\n onInit: typeof agent.onInit === \"function\",\n onMessage: typeof agent.onMessage === \"function\",\n onTick: typeof agent.onTick === \"function\",\n },\n actions: {\n ai: true,\n wait: true,\n fetch: true,\n runStep: true,\n callTool: true,\n runFlow: true,\n },\n steps,\n tools,\n routes,\n flows,\n execution: {\n stepOrder: steps.map((step) => step.id),\n toolOrder: tools.map((tool) => tool.id),\n routeOrder: routes.map((route) => route.id),\n flowOrder: flows.map((flow) => flow.id),\n },\n },\n };\n } finally {\n if (tempDir) {\n await rm(tempDir, { recursive: true, force: true });\n }\n }\n}\n\nfunction getHash(payload: string): string {\n return createHash(\"sha256\").update(payload).digest(\"hex\");\n}\n\nfunction isManifestVersionFile(fileName: string): boolean {\n return fileName.endsWith(\".json\");\n}\n\nfunction createVersionId(payload: string, generatedAt: string): string {\n return createHash(\"sha256\")\n .update(payload)\n .update(generatedAt)\n .digest(\"hex\")\n .slice(0, 8);\n}\n\nasync function readManifestVersionFile(\n filePath: string,\n): Promise<ManifestVersionRecord | null> {\n try {\n const src = await readFile(filePath, \"utf-8\");\n return JSON.parse(src) as ManifestVersionRecord;\n } catch {\n return null;\n }\n}\n\nexport async function writeVersionedManifest(params: {\n cwd: string;\n agentName: string;\n manifest: AgentManifestV1;\n}): Promise<ManifestVersionRecord & { outputPath: string }> {\n const { cwd, agentName, manifest } = params;\n const agentMetaDir = join(cwd, \"meta\", \"migrations\", agentName);\n await mkdir(agentMetaDir, { recursive: true });\n\n const files = await readdir(agentMetaDir);\n const versionFiles = files.filter(isManifestVersionFile);\n const existingRecords = (\n await Promise.all(\n versionFiles.map((file) =>\n readManifestVersionFile(join(agentMetaDir, file)),\n ),\n )\n ).filter((record): record is ManifestVersionRecord => record !== null);\n\n const latestVersion =\n existingRecords\n .map((record) => record.version)\n .sort((a, b) => a - b)\n .at(-1) ?? 0;\n const nextVersion = latestVersion + 1;\n\n const payload = JSON.stringify(manifest);\n const generatedAt = new Date().toISOString();\n const versionId = createVersionId(payload, generatedAt);\n const record: ManifestVersionRecord = {\n version: nextVersion,\n versionId,\n hash: getHash(payload),\n generatedAt,\n immutable: true,\n manifest,\n };\n\n const versionFile = join(agentMetaDir, `${versionId}.json`);\n await writeFile(versionFile, JSON.stringify(record, null, 2) + \"\\n\", \"utf-8\");\n\n const snapshotPath = join(cwd, \"meta\", \"snapshot.json\");\n const snapshot = await readSnapshot(snapshotPath);\n const prev = snapshot[agentName] ?? { latest: \"\", versions: [] };\n const versions = prev.versions.includes(versionId)\n ? prev.versions\n : [...prev.versions, versionId];\n snapshot[agentName] = { latest: versionId, versions };\n await writeFile(\n snapshotPath,\n JSON.stringify(snapshot, null, 2) + \"\\n\",\n \"utf-8\",\n );\n\n return {\n ...record,\n outputPath: versionFile,\n };\n}\n\nexport async function readLatestVersionedManifest(params: {\n cwd: string;\n agentName: string;\n}): Promise<(ManifestVersionRecord & { outputPath: string }) | null> {\n const { cwd, agentName } = params;\n const agentMetaDir = join(cwd, \"meta\", \"migrations\", agentName);\n const snapshotPath = join(cwd, \"meta\", \"snapshot.json\");\n\n // Try to read from snapshot first\n const snapshot = await readSnapshot(snapshotPath);\n const agentEntry = snapshot[agentName];\n\n if (agentEntry?.latest) {\n const latestFile = join(agentMetaDir, `${agentEntry.latest}.json`);\n const latest = await readManifestVersionFile(latestFile);\n if (latest) {\n return {\n ...latest,\n outputPath: latestFile,\n };\n }\n }\n\n // Fallback: scan directory and find latest by version number\n const files = await readdir(agentMetaDir).catch(() => [] as string[]);\n const records = (\n await Promise.all(\n files\n .filter(isManifestVersionFile)\n .map((file) => readManifestVersionFile(join(agentMetaDir, file))),\n )\n ).filter((record): record is ManifestVersionRecord => record !== null);\n\n if (records.length === 0) {\n return null;\n }\n\n const newest = records.sort((a, b) => b.version - a.version)[0] ?? null;\n if (!newest) {\n return null;\n }\n\n return {\n ...newest,\n outputPath: join(agentMetaDir, `${newest.versionId}.json`),\n };\n}\n\nasync function readSnapshot(\n snapshotPath: string,\n): Promise<Record<string, ManifestRegistryEntry>> {\n try {\n const src = await readFile(snapshotPath, \"utf-8\");\n return JSON.parse(src) as Record<string, ManifestRegistryEntry>;\n } catch {\n return {};\n }\n}\n"],"mappings":"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","names":["record"]}
@@ -3,7 +3,9 @@
3
3
  // src/utils/fs.ts
4
4
  import { access, mkdir } from "fs/promises";
5
5
  import { join } from "path";
6
- import { execSync } from "child_process";
6
+ import { exec } from "child_process";
7
+ import { promisify } from "util";
8
+ var execAsync = promisify(exec);
7
9
  async function isProjectInitialized(cwd) {
8
10
  try {
9
11
  await access(join(cwd, "kalp.config.ts"));
@@ -23,15 +25,9 @@ async function ensureDirectory(path) {
23
25
  }
24
26
  async function installDeps(cwd) {
25
27
  try {
26
- execSync("npx --no-install nci", {
27
- cwd,
28
- stdio: "pipe"
29
- });
28
+ await execAsync("npx --no-install nci", { cwd });
30
29
  } catch {
31
- execSync("npm install", {
32
- cwd,
33
- stdio: "pipe"
34
- });
30
+ await execAsync("npm install", { cwd });
35
31
  }
36
32
  }
37
33
 
@@ -41,4 +37,4 @@ export {
41
37
  ensureDirectory,
42
38
  installDeps
43
39
  };
44
- //# sourceMappingURL=chunk-Q455HC3P.js.map
40
+ //# sourceMappingURL=chunk-TPTPZH2W.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 { exec } from \"node:child_process\";\nimport { promisify } from \"node:util\";\n\nconst execAsync = promisify(exec);\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 await execAsync(\"npx --no-install nci\", { cwd });\n } catch {\n await execAsync(\"npm install\", { cwd });\n }\n}\n"],"mappings":";;;AAAA,SAAS,QAAQ,aAAa;AAC9B,SAAS,YAAY;AACrB,SAAS,YAAY;AACrB,SAAS,iBAAiB;AAE1B,IAAM,YAAY,UAAU,IAAI;AAEhC,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,UAAM,UAAU,wBAAwB,EAAE,IAAI,CAAC;AAAA,EACjD,QAAQ;AACN,UAAM,UAAU,eAAe,EAAE,IAAI,CAAC;AAAA,EACxC;AACF;","names":[]}
@@ -4,11 +4,11 @@ import {
4
4
  promptProjectName,
5
5
  scaffoldAgent,
6
6
  scaffoldProject
7
- } from "./chunk-HD5FT7T6.js";
7
+ } from "./chunk-22WOAGNG.js";
8
8
  import {
9
9
  installDeps,
10
10
  isProjectInitialized
11
- } from "./chunk-Q455HC3P.js";
11
+ } from "./chunk-TPTPZH2W.js";
12
12
  import "./chunk-2H7UOFLK.js";
13
13
 
14
14
  // src/commands/create.ts
@@ -43,11 +43,7 @@ var create_default = defineCommand({
43
43
  await installDeps(cwd);
44
44
  s.stop("Dependencies installed");
45
45
  } catch {
46
- s.stop(
47
- pc.yellow(
48
- "Install failed \u2014 run npx --no-install nci (or npm install) manually."
49
- )
50
- );
46
+ s.stop(pc.yellow("Install failed \u2014 run npm install manually."));
51
47
  }
52
48
  }
53
49
  s.start(`Scaffolding agent ${pc.cyan(agentAnswers.name)}`);
@@ -74,4 +70,4 @@ var create_default = defineCommand({
74
70
  export {
75
71
  create_default as default
76
72
  };
77
- //# sourceMappingURL=create-RSQEKCI6.js.map
73
+ //# sourceMappingURL=create-T7KGVPNR.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(pc.yellow(\"Install failed — 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 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 `${pc.dim(\"•\")} ${pc.cyan(`agents/${agentAnswers.name}/routes/`)}`,\n `${pc.dim(\"•\")} ${pc.cyan(`agents/${agentAnswers.name}/flows/`)}`,\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,iDAA4C,CAAC;AAAA,MAChE;AAAA,IACF;AAGA,MAAE,MAAM,qBAAqB,GAAG,KAAK,aAAa,IAAI,CAAC,EAAE;AACzD,UAAM,cAAc;AAAA,MAClB,WAAW,aAAa;AAAA,MACxB;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,QAC/D,GAAG,GAAG,IAAI,QAAG,CAAC,IAAI,GAAG,KAAK,UAAU,aAAa,IAAI,UAAU,CAAC;AAAA,QAChE,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":[]}
@@ -45,6 +45,30 @@ async function removeSecretFromLocalConfig(cwd, key) {
45
45
  );
46
46
  await writeFile(configPath, content, "utf-8");
47
47
  }
48
+ async function removeSecretFromTypes(cwd, key) {
49
+ const dtsPath = join(cwd, "kalp.d.ts");
50
+ let content;
51
+ try {
52
+ content = await readFile(dtsPath, "utf-8");
53
+ } catch {
54
+ return;
55
+ }
56
+ if (!content.includes(`"${key}"`)) {
57
+ return;
58
+ }
59
+ const match = content.match(/keys:\s*\[([^\]]*)\]/);
60
+ if (!match) {
61
+ return;
62
+ }
63
+ const currentArray = match[1];
64
+ if (!currentArray) {
65
+ return;
66
+ }
67
+ let newArray = currentArray.replace(new RegExp(`["']${key}["']\\s*,?\\s*`), "").trim();
68
+ newArray = newArray.replace(/,\s*$/, "");
69
+ content = content.replace(/keys:\s*\[([^\]]*)\]/, `keys: [${newArray}]`);
70
+ await writeFile(dtsPath, content, "utf-8");
71
+ }
48
72
  var delete_default = defineCommand({
49
73
  meta: {
50
74
  name: "delete",
@@ -116,6 +140,7 @@ var delete_default = defineCommand({
116
140
  try {
117
141
  await deleteSecretFromCloud(key);
118
142
  await removeSecretFromLocalConfig(cwd, key);
143
+ await removeSecretFromTypes(cwd, key);
119
144
  s.stop(`Secret ${pc.cyan(key)} deleted successfully`);
120
145
  p.outro("Done");
121
146
  } catch (error) {
@@ -133,4 +158,4 @@ var delete_default = defineCommand({
133
158
  export {
134
159
  delete_default as default
135
160
  };
136
- //# sourceMappingURL=delete-ZJB2JGAL.js.map
161
+ //# sourceMappingURL=delete-6MKUQ3XK.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/secrets/delete.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { getAuthToken } from \"../../utils/auth.js\";\n\nconst LOGO = \"🦋\";\n\ninterface CloudSecret {\n key: string;\n}\n\nasync function fetchSecretsFromCloud(): Promise<CloudSecret[]> {\n // TODO: Implement real API call to Kalp Cloud\n return [{ key: \"STRIPE_SECRET_KEY\" }, { key: \"OPENAI_API_KEY\" }];\n}\n\nasync function deleteSecretFromCloud(key: string): Promise<void> {\n // TODO: Implement real API call to Kalp Cloud\n console.log(pc.dim(`[Simulated] Deleting secret ${key} from Kalp Cloud...`));\n}\n\nasync function removeSecretFromLocalConfig(\n cwd: string,\n key: string,\n): Promise<void> {\n const configPath = join(cwd, \"kalp.config.ts\");\n let content: string;\n\n try {\n content = await readFile(configPath, \"utf-8\");\n } catch {\n throw new Error(\"kalp.config.ts not found. Run `kalp init` first.\");\n }\n\n // Check if key exists\n const regex = new RegExp(`[\"']${key}[\"']`);\n if (!regex.test(content)) {\n // Key not in local config, that's ok\n throw new Error(`Secret ${key} not found in local config`);\n }\n\n // Remove secret from array\n const match = content.match(/secrets:\\s*\\[([^\\]]*)\\]/);\n\n if (!match) {\n throw new Error(\"Could not find secrets array in kalp.config.ts\");\n }\n\n const currentArray = match[1];\n if (!currentArray) {\n throw new Error(\"Secrets array is empty in kalp.config.ts\");\n }\n\n // Remove the key and clean up commas\n let newArray = currentArray\n .replace(new RegExp(`[\"']${key}[\"']\\\\s*,?\\\\s*`), \"\")\n .trim();\n // Remove trailing comma if any\n newArray = newArray.replace(/,\\s*$/, \"\");\n\n content = content.replace(\n /secrets:\\s*\\[([^\\]]*)\\]/,\n `secrets: [${newArray}]`,\n );\n\n await writeFile(configPath, content, \"utf-8\");\n}\n\nasync function removeSecretFromTypes(cwd: string, key: string): Promise<void> {\n const dtsPath = join(cwd, \"kalp.d.ts\");\n let content: string;\n\n try {\n content = await readFile(dtsPath, \"utf-8\");\n } catch {\n // File doesn't exist, nothing to do\n return;\n }\n\n // Check if key exists\n if (!content.includes(`\"${key}\"`)) {\n return; // Not there, skip\n }\n\n // Remove key from the keys tuple\n const match = content.match(/keys:\\s*\\[([^\\]]*)\\]/);\n if (!match) {\n return; // No keys array found\n }\n\n const currentArray = match[1];\n if (!currentArray) {\n return;\n }\n\n // Remove the key and clean up commas\n let newArray = currentArray\n .replace(new RegExp(`[\"']${key}[\"']\\\\s*,?\\\\s*`), \"\")\n .trim();\n // Remove trailing comma if any\n newArray = newArray.replace(/,\\s*$/, \"\");\n\n content = content.replace(/keys:\\s*\\[([^\\]]*)\\]/, `keys: [${newArray}]`);\n\n await writeFile(dtsPath, content, \"utf-8\");\n}\n\nexport default defineCommand({\n meta: {\n name: \"delete\",\n description: \"Delete a secret from Kalp Cloud and local config\",\n },\n args: {\n key: {\n type: \"string\",\n alias: \"k\",\n description: \"Secret key name to delete\",\n },\n help: {\n type: \"boolean\",\n alias: \"h\",\n description: \"Show help\",\n default: false,\n },\n yes: {\n type: \"boolean\",\n alias: \"y\",\n description: \"Skip confirmation\",\n default: false,\n },\n },\n async run({ args }) {\n const cwd = process.cwd();\n\n if (args.help) {\n p.log.info(`${pc.bold(\"Usage\")}: kalp secrets delete -k <key>`);\n p.log.info(pc.dim(\"Example: kalp secrets delete -k STRIPE_SECRET_KEY\"));\n return;\n }\n\n p.intro(`${LOGO} ${pc.bold(\"kalp secrets delete\")}`);\n\n const token = await getAuthToken();\n if (!token) {\n p.log.warn(pc.yellow(\"Not logged in. Run `kalp login` first.\"));\n p.outro(\"Authentication required\");\n return;\n }\n\n let key = args.key;\n\n // Interactive selection if not provided\n if (!key) {\n const secrets = await fetchSecretsFromCloud();\n if (secrets.length === 0) {\n p.log.info(pc.dim(\"No secrets found in Kalp Cloud.\"));\n p.outro(\"Nothing to delete\");\n return;\n }\n\n const selected = await p.select({\n message: \"Select a secret to delete\",\n options: secrets.map((s) => ({ value: s.key, label: s.key })),\n });\n\n if (p.isCancel(selected)) {\n p.outro(\"Cancelled\");\n return;\n }\n\n key = selected as string;\n }\n\n // Confirmation unless --yes flag\n if (!args.yes) {\n const confirm = await p.confirm({\n message: `Are you sure you want to delete ${pc.cyan(key)}? This action cannot be undone.`,\n initialValue: false,\n });\n\n if (p.isCancel(confirm) || !confirm) {\n p.outro(\"Cancelled\");\n return;\n }\n }\n\n const s = p.spinner();\n s.start(`Deleting ${pc.cyan(key)}...`);\n\n try {\n // Delete from cloud (simulated)\n await deleteSecretFromCloud(key);\n\n // Remove from local config\n await removeSecretFromLocalConfig(cwd, key);\n\n // Remove from types\n await removeSecretFromTypes(cwd, key);\n\n s.stop(`Secret ${pc.cyan(key)} deleted successfully`);\n p.outro(\"Done\");\n } catch (error) {\n s.stop(\"Failed to delete secret\");\n p.log.error(\n pc.red(\n `Error: ${error instanceof Error ? error.message : String(error)}`,\n ),\n );\n p.outro(\"Failed\");\n process.exit(1);\n }\n },\n});\n"],"mappings":"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","names":["s","confirm"]}
package/dist/index.js CHANGED
@@ -8,7 +8,7 @@ var LOGO = "\u{1F98B}";
8
8
  var COMMANDS = [
9
9
  ["init", "Create a new Kalp project"],
10
10
  ["create", "Add a new agent"],
11
- ["build", "Build agent manifest (DSL -> IR JSON)"],
11
+ ["migrate", "Migrate agent schema"],
12
12
  ["push", "Push agent to Kalp"],
13
13
  ["link", "Link project to Kalp cloud"],
14
14
  ["secrets", "Manage secrets"],
@@ -40,14 +40,14 @@ var main = defineCommand({
40
40
  }
41
41
  },
42
42
  subCommands: {
43
- init: () => import("./init-CUBJEWPE.js").then((r) => r.default),
44
- create: () => import("./create-RSQEKCI6.js").then((r) => r.default),
45
- build: () => import("./build-SUIPVJO6.js").then((r) => r.default),
46
- push: () => import("./push-L3BXB6OC.js").then((r) => r.default),
47
- link: () => import("./link-YKDZ7Y6K.js").then((r) => r.default),
48
- secrets: () => import("./secrets-3SKCSAGD.js").then((r) => r.default),
49
- login: () => import("./login-LBEXP7ET.js").then((r) => r.default),
50
- logout: () => import("./logout-S3PV4WE7.js").then((r) => r.default)
43
+ init: () => import("./init-VBOTPFNB.js").then((r) => r.default),
44
+ create: () => import("./create-T7KGVPNR.js").then((r) => r.default),
45
+ migrate: () => import("./migrate-GA7EHSDG.js").then((r) => r.default),
46
+ push: () => import("./push-2B4NWFGC.js").then((r) => r.default),
47
+ link: () => import("./link-YCIA4JJ3.js").then((r) => r.default),
48
+ secrets: () => import("./secrets-SIK6J5AF.js").then((r) => r.default),
49
+ login: () => import("./login-22HHVS52.js").then((r) => r.default),
50
+ logout: () => import("./logout-OJM3VAOF.js").then((r) => r.default)
51
51
  },
52
52
  run({ args }) {
53
53
  const firstArg = process.argv[2];
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 COMMANDS = [\n [\"init\", \"Create a new Kalp project\"],\n [\"create\", \"Add a new agent\"],\n [\"build\", \"Build agent manifest (DSL -> IR JSON)\"],\n [\"push\", \"Push agent to Kalp\"],\n [\"link\", \"Link project to Kalp cloud\"],\n [\"secrets\", \"Manage secrets\"],\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 build: () => import(\"./commands/build.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 secrets: () => import(\"./commands/secrets/index.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 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,SAAS,uCAAuC;AAAA,EACjD,CAAC,QAAQ,oBAAoB;AAAA,EAC7B,CAAC,QAAQ,4BAA4B;AAAA,EACrC,CAAC,WAAW,gBAAgB;AAAA,EAC5B,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,OAAO,MAAM,OAAO,qBAAqB,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,IAChE,MAAM,MAAM,OAAO,oBAAoB,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,IAC9D,MAAM,MAAM,OAAO,oBAAoB,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,IAC9D,SAAS,MAAM,OAAO,uBAA6B,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,IAC1E,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;AAEA,IAAE,QAAM,GAAG,IAAI,IAAI,GAAG,KAAK,MAAM,CAAC,EAAE;AACpC,cAAU;AACV,IAAE,QAAM,wBAAiB;AAAA,EAC3B;AACF,CAAC;AAED,QAAQ,IAAI;","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 [\"migrate\", \"Migrate agent schema\"],\n [\"push\", \"Push agent to Kalp\"],\n [\"link\", \"Link project to Kalp cloud\"],\n [\"secrets\", \"Manage secrets\"],\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 migrate: () => import(\"./commands/migrate.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 secrets: () => import(\"./commands/secrets/index.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 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,WAAW,sBAAsB;AAAA,EAClC,CAAC,QAAQ,oBAAoB;AAAA,EAC7B,CAAC,QAAQ,4BAA4B;AAAA,EACrC,CAAC,WAAW,gBAAgB;AAAA,EAC5B,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,SAAS,MAAM,OAAO,uBAAuB,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,IACpE,MAAM,MAAM,OAAO,oBAAoB,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,IAC9D,MAAM,MAAM,OAAO,oBAAoB,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,IAC9D,SAAS,MAAM,OAAO,uBAA6B,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,IAC1E,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;AAEA,IAAE,QAAM,GAAG,IAAI,IAAI,GAAG,KAAK,MAAM,CAAC,EAAE;AACpC,cAAU;AACV,IAAE,QAAM,wBAAiB;AAAA,EAC3B;AACF,CAAC;AAED,QAAQ,IAAI;","names":[]}
@@ -2,12 +2,12 @@
2
2
  import {
3
3
  promptProjectName,
4
4
  scaffoldProject
5
- } from "./chunk-HD5FT7T6.js";
5
+ } from "./chunk-22WOAGNG.js";
6
6
  import {
7
7
  ensureDirectory,
8
8
  installDeps,
9
9
  isProjectInitialized
10
- } from "./chunk-Q455HC3P.js";
10
+ } from "./chunk-TPTPZH2W.js";
11
11
  import "./chunk-2H7UOFLK.js";
12
12
 
13
13
  // src/commands/init.ts
@@ -70,4 +70,4 @@ var init_default = defineCommand({
70
70
  export {
71
71
  init_default as default
72
72
  };
73
- //# sourceMappingURL=init-CUBJEWPE.js.map
73
+ //# sourceMappingURL=init-VBOTPFNB.js.map
@@ -0,0 +1,37 @@
1
+ #!/usr/bin/env node
2
+ import "./chunk-2H7UOFLK.js";
3
+
4
+ // src/commands/link.ts
5
+ import { defineCommand } from "citty";
6
+ import * as p from "@clack/prompts";
7
+ import pc from "picocolors";
8
+ import { mkdir, writeFile } from "fs/promises";
9
+ import { join } from "path";
10
+ var LOGO = "\u{1F98B}";
11
+ var link_default = defineCommand({
12
+ meta: { name: "link", description: "Link project to Kalp cloud" },
13
+ async run() {
14
+ const cwd = process.cwd();
15
+ p.intro(`${LOGO} ${pc.bold("kalp link")}`);
16
+ const s = p.spinner();
17
+ s.start("Linking to workspace");
18
+ const tempDir = join(cwd, ".temp");
19
+ await mkdir(tempDir, { recursive: true });
20
+ const workspaceConfig = {
21
+ workspaceId: "mock-workspace-id",
22
+ linkedAt: (/* @__PURE__ */ new Date()).toISOString(),
23
+ projectPath: cwd
24
+ };
25
+ await writeFile(
26
+ join(tempDir, "workspace.json"),
27
+ JSON.stringify(workspaceConfig, null, 2),
28
+ "utf-8"
29
+ );
30
+ s.stop("Workspace linked");
31
+ p.outro(pc.green("Project linked to Kalp Cloud"));
32
+ }
33
+ });
34
+ export {
35
+ link_default as default
36
+ };
37
+ //# sourceMappingURL=link-YCIA4JJ3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/link.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nconst LOGO = \"🦋\";\n\nexport default defineCommand({\n meta: { name: \"link\", description: \"Link project to Kalp cloud\" },\n async run() {\n const cwd = process.cwd();\n\n p.intro(`${LOGO} ${pc.bold(\"kalp link\")}`);\n\n const s = p.spinner();\n s.start(\"Linking to workspace\");\n\n // Create .temp directory and workspace config (project local)\n const tempDir = join(cwd, \".temp\");\n await mkdir(tempDir, { recursive: true });\n\n // TODO: Get actual workspace ID from API after login\n const workspaceConfig = {\n workspaceId: \"mock-workspace-id\",\n linkedAt: new Date().toISOString(),\n projectPath: cwd,\n };\n\n await writeFile(\n join(tempDir, \"workspace.json\"),\n JSON.stringify(workspaceConfig, null, 2),\n \"utf-8\",\n );\n\n s.stop(\"Workspace linked\");\n p.outro(pc.green(\"Project linked to Kalp Cloud\"));\n },\n});\n"],"mappings":";;;;AAAA,SAAS,qBAAqB;AAC9B,YAAY,OAAO;AACnB,OAAO,QAAQ;AACf,SAAS,OAAO,iBAAiB;AACjC,SAAS,YAAY;AAErB,IAAM,OAAO;AAEb,IAAO,eAAQ,cAAc;AAAA,EAC3B,MAAM,EAAE,MAAM,QAAQ,aAAa,6BAA6B;AAAA,EAChE,MAAM,MAAM;AACV,UAAM,MAAM,QAAQ,IAAI;AAExB,IAAE,QAAM,GAAG,IAAI,IAAI,GAAG,KAAK,WAAW,CAAC,EAAE;AAEzC,UAAM,IAAM,UAAQ;AACpB,MAAE,MAAM,sBAAsB;AAG9B,UAAM,UAAU,KAAK,KAAK,OAAO;AACjC,UAAM,MAAM,SAAS,EAAE,WAAW,KAAK,CAAC;AAGxC,UAAM,kBAAkB;AAAA,MACtB,aAAa;AAAA,MACb,WAAU,oBAAI,KAAK,GAAE,YAAY;AAAA,MACjC,aAAa;AAAA,IACf;AAEA,UAAM;AAAA,MACJ,KAAK,SAAS,gBAAgB;AAAA,MAC9B,KAAK,UAAU,iBAAiB,MAAM,CAAC;AAAA,MACvC;AAAA,IACF;AAEA,MAAE,KAAK,kBAAkB;AACzB,IAAE,QAAM,GAAG,MAAM,8BAA8B,CAAC;AAAA,EAClD;AACF,CAAC;","names":[]}
@@ -0,0 +1,39 @@
1
+ #!/usr/bin/env node
2
+ import "./chunk-2H7UOFLK.js";
3
+
4
+ // src/commands/login.ts
5
+ import { defineCommand } from "citty";
6
+ import * as p from "@clack/prompts";
7
+ import pc from "picocolors";
8
+ import { mkdir, writeFile } from "fs/promises";
9
+ import { join } from "path";
10
+ import { homedir } from "os";
11
+ var LOGO = "\u{1F98B}";
12
+ var login_default = defineCommand({
13
+ meta: { name: "login", description: "Authenticate with Kalp" },
14
+ async run() {
15
+ const home = homedir();
16
+ p.intro(`${LOGO} ${pc.bold("kalp login")}`);
17
+ const s = p.spinner();
18
+ s.start("Authenticating...");
19
+ const kalpDir = join(home, ".kalp");
20
+ await mkdir(kalpDir, { recursive: true });
21
+ const authData = {
22
+ token: "mock-token-" + Date.now(),
23
+ email: "user@example.com",
24
+ expiresAt: new Date(Date.now() + 30 * 24 * 60 * 60 * 1e3).toISOString()
25
+ };
26
+ await writeFile(
27
+ join(kalpDir, "auth.json"),
28
+ JSON.stringify(authData, null, 2),
29
+ "utf-8"
30
+ );
31
+ s.stop("Authenticated successfully");
32
+ p.log.success(`Logged in as ${pc.cyan(authData.email)}`);
33
+ p.outro(pc.green("Ready to use Kalp Cloud"));
34
+ }
35
+ });
36
+ export {
37
+ login_default as default
38
+ };
39
+ //# sourceMappingURL=login-22HHVS52.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/login.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { mkdir, writeFile, rm } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\n\nconst LOGO = \"🦋\";\n\nexport default defineCommand({\n meta: { name: \"login\", description: \"Authenticate with Kalp\" },\n async run() {\n const home = homedir();\n\n p.intro(`${LOGO} ${pc.bold(\"kalp login\")}`);\n\n const s = p.spinner();\n s.start(\"Authenticating...\");\n\n // Create ~/.kalp directory (global user config)\n const kalpDir = join(home, \".kalp\");\n await mkdir(kalpDir, { recursive: true });\n\n // Create mock auth.json\n const authData = {\n token: \"mock-token-\" + Date.now(),\n email: \"user@example.com\",\n expiresAt: new Date(Date.now() + 30 * 24 * 60 * 60 * 1000).toISOString(),\n };\n\n await writeFile(\n join(kalpDir, \"auth.json\"),\n JSON.stringify(authData, null, 2),\n \"utf-8\",\n );\n\n s.stop(\"Authenticated successfully\");\n p.log.success(`Logged in as ${pc.cyan(authData.email)}`);\n p.outro(pc.green(\"Ready to use Kalp Cloud\"));\n },\n});\n"],"mappings":";;;;AAAA,SAAS,qBAAqB;AAC9B,YAAY,OAAO;AACnB,OAAO,QAAQ;AACf,SAAS,OAAO,iBAAqB;AACrC,SAAS,YAAY;AACrB,SAAS,eAAe;AAExB,IAAM,OAAO;AAEb,IAAO,gBAAQ,cAAc;AAAA,EAC3B,MAAM,EAAE,MAAM,SAAS,aAAa,yBAAyB;AAAA,EAC7D,MAAM,MAAM;AACV,UAAM,OAAO,QAAQ;AAErB,IAAE,QAAM,GAAG,IAAI,IAAI,GAAG,KAAK,YAAY,CAAC,EAAE;AAE1C,UAAM,IAAM,UAAQ;AACpB,MAAE,MAAM,mBAAmB;AAG3B,UAAM,UAAU,KAAK,MAAM,OAAO;AAClC,UAAM,MAAM,SAAS,EAAE,WAAW,KAAK,CAAC;AAGxC,UAAM,WAAW;AAAA,MACf,OAAO,gBAAgB,KAAK,IAAI;AAAA,MAChC,OAAO;AAAA,MACP,WAAW,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,KAAK,KAAK,GAAI,EAAE,YAAY;AAAA,IACzE;AAEA,UAAM;AAAA,MACJ,KAAK,SAAS,WAAW;AAAA,MACzB,KAAK,UAAU,UAAU,MAAM,CAAC;AAAA,MAChC;AAAA,IACF;AAEA,MAAE,KAAK,4BAA4B;AACnC,IAAE,MAAI,QAAQ,gBAAgB,GAAG,KAAK,SAAS,KAAK,CAAC,EAAE;AACvD,IAAE,QAAM,GAAG,MAAM,yBAAyB,CAAC;AAAA,EAC7C;AACF,CAAC;","names":[]}
@@ -0,0 +1,32 @@
1
+ #!/usr/bin/env node
2
+ import "./chunk-2H7UOFLK.js";
3
+
4
+ // src/commands/logout.ts
5
+ import { defineCommand } from "citty";
6
+ import * as p from "@clack/prompts";
7
+ import pc from "picocolors";
8
+ import { rm } from "fs/promises";
9
+ import { join } from "path";
10
+ import { homedir } from "os";
11
+ var LOGO = "\u{1F98B}";
12
+ var logout_default = defineCommand({
13
+ meta: { name: "logout", description: "Sign out from Kalp" },
14
+ async run() {
15
+ const home = homedir();
16
+ p.intro(`${LOGO} ${pc.bold("kalp logout")}`);
17
+ const s = p.spinner();
18
+ s.start("Signing out...");
19
+ try {
20
+ await rm(join(home, ".kalp", "auth.json"), { force: true });
21
+ s.stop("Signed out successfully");
22
+ p.outro(pc.green("Logged out from Kalp"));
23
+ } catch {
24
+ s.stop("Nothing to do");
25
+ p.outro(pc.dim("No active session found"));
26
+ }
27
+ }
28
+ });
29
+ export {
30
+ logout_default as default
31
+ };
32
+ //# sourceMappingURL=logout-OJM3VAOF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/logout.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { rm } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\n\nconst LOGO = \"🦋\";\n\nexport default defineCommand({\n meta: { name: \"logout\", description: \"Sign out from Kalp\" },\n async run() {\n const home = homedir();\n\n p.intro(`${LOGO} ${pc.bold(\"kalp logout\")}`);\n\n const s = p.spinner();\n s.start(\"Signing out...\");\n\n try {\n await rm(join(home, \".kalp\", \"auth.json\"), { force: true });\n s.stop(\"Signed out successfully\");\n p.outro(pc.green(\"Logged out from Kalp\"));\n } catch {\n s.stop(\"Nothing to do\");\n p.outro(pc.dim(\"No active session found\"));\n }\n },\n});\n"],"mappings":";;;;AAAA,SAAS,qBAAqB;AAC9B,YAAY,OAAO;AACnB,OAAO,QAAQ;AACf,SAAS,UAAU;AACnB,SAAS,YAAY;AACrB,SAAS,eAAe;AAExB,IAAM,OAAO;AAEb,IAAO,iBAAQ,cAAc;AAAA,EAC3B,MAAM,EAAE,MAAM,UAAU,aAAa,qBAAqB;AAAA,EAC1D,MAAM,MAAM;AACV,UAAM,OAAO,QAAQ;AAErB,IAAE,QAAM,GAAG,IAAI,IAAI,GAAG,KAAK,aAAa,CAAC,EAAE;AAE3C,UAAM,IAAM,UAAQ;AACpB,MAAE,MAAM,gBAAgB;AAExB,QAAI;AACF,YAAM,GAAG,KAAK,MAAM,SAAS,WAAW,GAAG,EAAE,OAAO,KAAK,CAAC;AAC1D,QAAE,KAAK,yBAAyB;AAChC,MAAE,QAAM,GAAG,MAAM,sBAAsB,CAAC;AAAA,IAC1C,QAAQ;AACN,QAAE,KAAK,eAAe;AACtB,MAAE,QAAM,GAAG,IAAI,yBAAyB,CAAC;AAAA,IAC3C;AAAA,EACF;AACF,CAAC;","names":[]}
@@ -2,23 +2,23 @@
2
2
  import {
3
3
  readAgentManifest,
4
4
  writeVersionedManifest
5
- } from "./chunk-CJCIZDCF.js";
5
+ } from "./chunk-EAMMDUE3.js";
6
6
  import {
7
7
  ensureConfig
8
- } from "./chunk-Q455HC3P.js";
8
+ } from "./chunk-TPTPZH2W.js";
9
9
  import "./chunk-2H7UOFLK.js";
10
10
 
11
- // src/commands/build.ts
11
+ // src/commands/migrate.ts
12
12
  import { access } from "fs/promises";
13
13
  import { join } from "path";
14
14
  import { defineCommand } from "citty";
15
15
  import * as p from "@clack/prompts";
16
16
  import pc from "picocolors";
17
17
  var LOGO = "\u{1F98B}";
18
- var build_default = defineCommand({
18
+ var migrate_default = defineCommand({
19
19
  meta: {
20
- name: "build",
21
- description: "Build Agent"
20
+ name: "migrate",
21
+ description: "Migrate Agent schema to new version"
22
22
  },
23
23
  args: {
24
24
  agent: {
@@ -30,11 +30,11 @@ var build_default = defineCommand({
30
30
  },
31
31
  async run({ args }) {
32
32
  const cwd = process.cwd();
33
- p.intro(`${LOGO} ${pc.bold("kalp build")}`);
33
+ p.intro(`${LOGO} ${pc.bold("kalp migrate")}`);
34
34
  const agentName = args.agent;
35
35
  if (!agentName) {
36
36
  p.log.error(`Missing required flag ${pc.cyan("-a <agent-name>")}`);
37
- p.outro(pc.dim(`Example: ${pc.cyan("kalp build -a my-agent")}`));
37
+ p.outro(pc.dim(`Example: ${pc.cyan("kalp migrate -a my-agent")}`));
38
38
  process.exit(1);
39
39
  }
40
40
  try {
@@ -54,7 +54,7 @@ var build_default = defineCommand({
54
54
  process.exit(1);
55
55
  }
56
56
  const s = p.spinner();
57
- s.start(`Compiling ${pc.cyan(agentName)}`);
57
+ s.start(`Migrating ${pc.cyan(agentName)}`);
58
58
  try {
59
59
  const manifest = await readAgentManifest({ cwd, agentName });
60
60
  const version = await writeVersionedManifest({
@@ -62,19 +62,19 @@ var build_default = defineCommand({
62
62
  agentName,
63
63
  manifest
64
64
  });
65
- s.stop(`Build ${pc.cyan(version.versionId)} generated`);
65
+ s.stop(`Migration ${pc.cyan(version.versionId)} generated`);
66
66
  p.outro(
67
- `${LOGO} ${pc.green("Build ready")} ${pc.dim("\u2014 run kalp push -a <agent>")}`
67
+ `${LOGO} ${pc.green("Migration ready")} ${pc.dim("\u2014 run kalp push -a <agent>")}`
68
68
  );
69
69
  } catch (err) {
70
70
  const msg = err instanceof Error ? err.message : String(err);
71
- s.stop(pc.red("Build failed"));
71
+ s.stop(pc.red("Migration failed"));
72
72
  p.log.info(pc.dim(msg.split("\n")[0] ?? "Unknown error"));
73
73
  process.exit(1);
74
74
  }
75
75
  }
76
76
  });
77
77
  export {
78
- build_default as default
78
+ migrate_default as default
79
79
  };
80
- //# sourceMappingURL=build-SUIPVJO6.js.map
80
+ //# sourceMappingURL=migrate-GA7EHSDG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/migrate.ts"],"sourcesContent":["import { access } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { ensureConfig } from \"../utils/fs.js\";\nimport {\n readAgentManifest,\n writeVersionedManifest,\n} from \"../utils/manifest.js\";\n\nconst LOGO = \"🦋\";\n\nexport default defineCommand({\n meta: {\n name: \"migrate\",\n description: \"Migrate Agent schema to new version\",\n },\n args: {\n agent: {\n type: \"string\",\n alias: \"a\",\n description: \"Agent name\",\n required: false,\n },\n },\n async run({ args }) {\n const cwd = process.cwd();\n\n p.intro(`${LOGO} ${pc.bold(\"kalp migrate\")}`);\n\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 migrate -a my-agent\")}`));\n process.exit(1);\n }\n\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 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(`Migrating ${pc.cyan(agentName)}`);\n\n try {\n const manifest = await readAgentManifest({ cwd, agentName });\n const version = await writeVersionedManifest({\n cwd,\n agentName,\n manifest,\n });\n\n s.stop(`Migration ${pc.cyan(version.versionId)} generated`);\n p.outro(\n `${LOGO} ${pc.green(\"Migration ready\")} ${pc.dim(\"— run kalp push -a <agent>\")}`,\n );\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n s.stop(pc.red(\"Migration failed\"));\n p.log.info(pc.dim(msg.split(\"\\n\")[0] ?? \"Unknown error\"));\n process.exit(1);\n }\n },\n});\n"],"mappings":";;;;;;;;;;;AAAA,SAAS,cAAc;AACvB,SAAS,YAAY;AACrB,SAAS,qBAAqB;AAC9B,YAAY,OAAO;AACnB,OAAO,QAAQ;AAOf,IAAM,OAAO;AAEb,IAAO,kBAAQ,cAAc;AAAA,EAC3B,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA,MAAM;AAAA,IACJ,OAAO;AAAA,MACL,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,EACF;AAAA,EACA,MAAM,IAAI,EAAE,KAAK,GAAG;AAClB,UAAM,MAAM,QAAQ,IAAI;AAExB,IAAE,QAAM,GAAG,IAAI,IAAI,GAAG,KAAK,cAAc,CAAC,EAAE;AAE5C,UAAM,YAAY,KAAK;AACvB,QAAI,CAAC,WAAW;AACd,MAAE,MAAI,MAAM,yBAAyB,GAAG,KAAK,iBAAiB,CAAC,EAAE;AACjE,MAAE,QAAM,GAAG,IAAI,YAAY,GAAG,KAAK,0BAA0B,CAAC,EAAE,CAAC;AACjE,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,QAAI;AACF,YAAM,aAAa,GAAG;AAAA,IACxB,QAAQ;AACN,MAAE,MAAI,MAAM,GAAG,GAAG,KAAK,gBAAgB,CAAC,YAAY;AACpD,MAAE,QAAM,GAAG,IAAI,OAAO,GAAG,KAAK,WAAW,CAAC,SAAS,CAAC;AACpD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,YAAY,KAAK,KAAK,UAAU,WAAW,UAAU;AAC3D,QAAI;AACF,YAAM,OAAO,SAAS;AAAA,IACxB,QAAQ;AACN,MAAE,MAAI;AAAA,QACJ,SAAS,GAAG,KAAK,SAAS,CAAC,iBAAiB,GAAG,KAAK,UAAU,SAAS,WAAW,CAAC;AAAA,MACrF;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,IAAM,UAAQ;AACpB,MAAE,MAAM,aAAa,GAAG,KAAK,SAAS,CAAC,EAAE;AAEzC,QAAI;AACF,YAAM,WAAW,MAAM,kBAAkB,EAAE,KAAK,UAAU,CAAC;AAC3D,YAAM,UAAU,MAAM,uBAAuB;AAAA,QAC3C;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAED,QAAE,KAAK,aAAa,GAAG,KAAK,QAAQ,SAAS,CAAC,YAAY;AAC1D,MAAE;AAAA,QACA,GAAG,IAAI,IAAI,GAAG,MAAM,iBAAiB,CAAC,IAAI,GAAG,IAAI,iCAA4B,CAAC;AAAA,MAChF;AAAA,IACF,SAAS,KAAK;AACZ,YAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC3D,QAAE,KAAK,GAAG,IAAI,kBAAkB,CAAC;AACjC,MAAE,MAAI,KAAK,GAAG,IAAI,IAAI,MAAM,IAAI,EAAE,CAAC,KAAK,eAAe,CAAC;AACxD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AACF,CAAC;","names":[]}