@kalphq/cli 0.0.0-dev-20260422003724 → 0.0.0

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 (71) hide show
  1. package/dist/{add-LVQAW23G.js → add-KRHLYYTO.js} +4 -3
  2. package/dist/add-KRHLYYTO.js.map +1 -0
  3. package/dist/chunk-INB3LG6O.js +25 -0
  4. package/dist/chunk-INB3LG6O.js.map +1 -0
  5. package/dist/{create-VTJKDUMA.js → create-7J5R6OVF.js} +44 -35
  6. package/dist/create-7J5R6OVF.js.map +1 -0
  7. package/dist/{delete-AFDTCA52.js → delete-47ZP6XRB.js} +4 -3
  8. package/dist/delete-47ZP6XRB.js.map +1 -0
  9. package/dist/index.js +6 -10
  10. package/dist/index.js.map +1 -1
  11. package/dist/{link-YCIA4JJ3.js → link-WZQSR2TM.js} +1 -2
  12. package/dist/{link-YCIA4JJ3.js.map → link-WZQSR2TM.js.map} +1 -1
  13. package/dist/{list-OKKHGKJA.js → list-3ZQIFUOT.js} +1 -2
  14. package/dist/{list-OKKHGKJA.js.map → list-3ZQIFUOT.js.map} +1 -1
  15. package/dist/{login-SIKUBDGO.js → login-JYPWGL6P.js} +1 -2
  16. package/dist/{login-SIKUBDGO.js.map → login-JYPWGL6P.js.map} +1 -1
  17. package/dist/{logout-OJM3VAOF.js → logout-V67DZZXO.js} +1 -2
  18. package/dist/{logout-OJM3VAOF.js.map → logout-V67DZZXO.js.map} +1 -1
  19. package/dist/push-RBTBXCP7.js +205 -0
  20. package/dist/push-RBTBXCP7.js.map +1 -0
  21. package/dist/{secrets-PXU3BYSN.js → secrets-KFMVBKJQ.js} +5 -6
  22. package/dist/{secrets-PXU3BYSN.js.map → secrets-KFMVBKJQ.js.map} +1 -1
  23. package/dist/{sync-HEIRRPCA.js → sync-YFM5P3IS.js} +1 -2
  24. package/dist/{sync-HEIRRPCA.js.map → sync-YFM5P3IS.js.map} +1 -1
  25. package/package.json +4 -4
  26. package/dist/acorn-I3UGQPDC.js +0 -3132
  27. package/dist/acorn-I3UGQPDC.js.map +0 -1
  28. package/dist/add-LVQAW23G.js.map +0 -1
  29. package/dist/angular-5QCYWYQS.js +0 -3032
  30. package/dist/angular-5QCYWYQS.js.map +0 -1
  31. package/dist/babel-VVMWCS4G.js +0 -7298
  32. package/dist/babel-VVMWCS4G.js.map +0 -1
  33. package/dist/chunk-2H7UOFLK.js +0 -11
  34. package/dist/chunk-2H7UOFLK.js.map +0 -1
  35. package/dist/chunk-3DCOV57B.js +0 -19947
  36. package/dist/chunk-3DCOV57B.js.map +0 -1
  37. package/dist/chunk-TMVNFUDA.js +0 -452
  38. package/dist/chunk-TMVNFUDA.js.map +0 -1
  39. package/dist/chunk-TPTPZH2W.js +0 -40
  40. package/dist/chunk-TPTPZH2W.js.map +0 -1
  41. package/dist/create-VTJKDUMA.js.map +0 -1
  42. package/dist/delete-AFDTCA52.js.map +0 -1
  43. package/dist/estree-3QNQSWX3.js +0 -4614
  44. package/dist/estree-3QNQSWX3.js.map +0 -1
  45. package/dist/flow-CCY52CGJ.js +0 -27548
  46. package/dist/flow-CCY52CGJ.js.map +0 -1
  47. package/dist/glimmer-WEH5BTZ2.js +0 -2896
  48. package/dist/glimmer-WEH5BTZ2.js.map +0 -1
  49. package/dist/graphql-UERTLN2S.js +0 -1268
  50. package/dist/graphql-UERTLN2S.js.map +0 -1
  51. package/dist/html-2G7A573F.js +0 -2928
  52. package/dist/html-2G7A573F.js.map +0 -1
  53. package/dist/init-O2XMITQ6.js +0 -73
  54. package/dist/init-O2XMITQ6.js.map +0 -1
  55. package/dist/markdown-XILCBMG4.js +0 -3553
  56. package/dist/markdown-XILCBMG4.js.map +0 -1
  57. package/dist/meriyah-THC5AUEQ.js +0 -2686
  58. package/dist/meriyah-THC5AUEQ.js.map +0 -1
  59. package/dist/migrate-CIEU36X6.js +0 -94
  60. package/dist/migrate-CIEU36X6.js.map +0 -1
  61. package/dist/postcss-WBGWHY5F.js +0 -5082
  62. package/dist/postcss-WBGWHY5F.js.map +0 -1
  63. package/dist/push-Y57MBTBB.js +0 -81
  64. package/dist/push-Y57MBTBB.js.map +0 -1
  65. package/dist/typescript-NS3CY6IL.js +0 -13205
  66. package/dist/typescript-NS3CY6IL.js.map +0 -1
  67. package/dist/yaml-2RE4A77K.js +0 -4226
  68. package/dist/yaml-2RE4A77K.js.map +0 -1
  69. package/templates/project/meta/snapshot.json +0 -1
  70. package/templates/project/package.json +0 -16
  71. package/templates/project/tsconfig.json +0 -18
@@ -5,7 +5,6 @@ import {
5
5
  import {
6
6
  getAuthToken
7
7
  } from "./chunk-6LLXGS2P.js";
8
- import "./chunk-2H7UOFLK.js";
9
8
 
10
9
  // src/commands/secrets/add.ts
11
10
  import { defineCommand } from "citty";
@@ -23,7 +22,9 @@ async function addSecretToLocalConfig(cwd, key) {
23
22
  try {
24
23
  content = await readFile(configPath, "utf-8");
25
24
  } catch {
26
- throw new Error("kalp.config.ts not found. Run `kalp init` first.");
25
+ throw new Error(
26
+ "kalp.config.ts not found. Run `npx create-kalp@latest` first."
27
+ );
27
28
  }
28
29
  const regex = new RegExp(`["']${key}["']`);
29
30
  if (regex.test(content)) {
@@ -134,4 +135,4 @@ var add_default = defineCommand({
134
135
  export {
135
136
  add_default as default
136
137
  };
137
- //# sourceMappingURL=add-LVQAW23G.js.map
138
+ //# sourceMappingURL=add-KRHLYYTO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/secrets/add.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 { generateTypes } from \"@/utils/codegen\";\nimport { getAuthToken } from \"@/utils/auth\";\n\nconst LOGO = \"🦋\";\n\nasync function addSecretToCloud(key: string, value: string): Promise<void> {\n // TODO: Implement real API call to Kalp Cloud\n console.log(pc.dim(`[Simulated] Adding secret ${key} to Kalp Cloud...`));\n}\n\nasync function addSecretToLocalConfig(cwd: string, key: string): 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(\n \"kalp.config.ts not found. Run `npx create-kalp@latest` first.\",\n );\n }\n\n // Check if key already exists\n const regex = new RegExp(`[\"']${key}[\"']`);\n if (regex.test(content)) {\n throw new Error(`Secret ${key} already exists in kalp.config.ts`);\n }\n\n // Add secret to array\n const match = content.match(/secrets:\\s*\\[([^\\]]*)\\]/);\n if (!match) {\n throw new Error(\"Could not find secrets array in kalp.config.ts\");\n }\n\n const currentArray = match[1]?.trim() ?? \"\";\n\n const newSecret = currentArray.length > 0 ? `, \"${key}\"` : `\"${key}\"`;\n const newArray = `secrets: [${currentArray}${newSecret}]`;\n\n content = content.replace(/secrets:\\s*\\[([^\\]]*)\\]/, newArray);\n\n await writeFile(configPath, content, \"utf-8\");\n}\n\nasync function regenerateTypes(cwd: string): Promise<void> {\n // Regenerate .kalp/types.d.ts based on kalp.config.ts\n await generateTypes(cwd);\n}\n\nexport default defineCommand({\n meta: {\n name: \"add\",\n description: \"Add a secret to Kalp Cloud and local config\",\n },\n args: {\n key: {\n type: \"string\",\n alias: \"k\",\n description: \"Secret key name (e.g., STRIPE_SECRET_KEY)\",\n },\n value: {\n type: \"string\",\n alias: \"v\",\n description: \"Secret value\",\n },\n help: {\n type: \"boolean\",\n alias: \"h\",\n description: \"Show help\",\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 add -k <key> -v <value>`);\n p.log.info(\n pc.dim(\"Example: kalp secrets add -k STRIPE_SECRET_KEY -v sk_test_...\"),\n );\n return;\n }\n\n p.intro(`${LOGO} ${pc.bold(\"kalp secrets add\")}`);\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 let value = args.value;\n\n // Interactive prompts if not provided\n if (!key) {\n const input = await p.text({\n message: \"Secret key name\",\n placeholder: \"STRIPE_SECRET_KEY\",\n validate: (v) => {\n if (!v) return \"Key is required\";\n if (!/^[A-Z_][A-Z0-9_]*$/.test(v)) {\n return \"Key must be UPPER_SNAKE_CASE\";\n }\n },\n });\n if (p.isCancel(input)) {\n p.outro(\"Cancelled\");\n return;\n }\n key = input;\n }\n\n if (!value) {\n const input = await p.password({\n message: `Enter value for ${key}`,\n mask: \"*\",\n });\n if (p.isCancel(input)) {\n p.outro(\"Cancelled\");\n return;\n }\n value = input;\n }\n\n const s = p.spinner();\n s.start(`Adding ${pc.cyan(key)}...`);\n\n try {\n // Add to cloud (simulated)\n await addSecretToCloud(key, value);\n\n // Add to local config\n await addSecretToLocalConfig(cwd, key);\n\n // Regenerate types from config\n await regenerateTypes(cwd);\n\n s.stop(`Secret ${pc.cyan(key)} added successfully`);\n p.outro(\"Done\");\n } catch (error) {\n s.stop(\"Failed to add 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":[]}
@@ -0,0 +1,25 @@
1
+ #!/usr/bin/env node
2
+
3
+ // src/utils/fs.ts
4
+ import { access } from "fs/promises";
5
+ import { join } from "path";
6
+ async function isProjectInitialized(cwd) {
7
+ try {
8
+ await access(join(cwd, "kalp.config.ts"));
9
+ return true;
10
+ } catch {
11
+ return false;
12
+ }
13
+ }
14
+ async function ensureConfig(cwd) {
15
+ const initialized = await isProjectInitialized(cwd);
16
+ if (!initialized) {
17
+ throw new Error("kalp.config.ts not found");
18
+ }
19
+ }
20
+
21
+ export {
22
+ isProjectInitialized,
23
+ ensureConfig
24
+ };
25
+ //# sourceMappingURL=chunk-INB3LG6O.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/fs.ts"],"sourcesContent":["import { access } from \"node:fs/promises\";\nimport { join } from \"node:path\";\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"],"mappings":";;;AAAA,SAAS,cAAc;AACvB,SAAS,YAAY;AAErB,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;","names":[]}
@@ -1,58 +1,67 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
- promptAgentDetails,
4
- promptProjectName,
5
- scaffoldAgent,
6
- scaffoldProject
7
- } from "./chunk-3DCOV57B.js";
8
- import {
9
- installDeps,
10
3
  isProjectInitialized
11
- } from "./chunk-TPTPZH2W.js";
12
- import "./chunk-2H7UOFLK.js";
4
+ } from "./chunk-INB3LG6O.js";
13
5
 
14
6
  // src/commands/create.ts
15
7
  import { defineCommand } from "citty";
16
- import * as p from "@clack/prompts";
8
+ import * as p2 from "@clack/prompts";
17
9
  import pc from "picocolors";
10
+ import { scaffoldAgent } from "@kalphq/project";
11
+
12
+ // src/utils/ui.ts
13
+ import * as p from "@clack/prompts";
14
+ async function promptAgentDetails() {
15
+ const answers = await p.group(
16
+ {
17
+ name: () => p.text({
18
+ message: "Agent name?",
19
+ placeholder: "my-agent",
20
+ validate: (v) => {
21
+ if (!v.trim()) return "Agent name is required.";
22
+ if (!/^[a-z0-9-]+$/.test(v)) {
23
+ return "Use lowercase letters, numbers, and dashes only.";
24
+ }
25
+ }
26
+ })
27
+ },
28
+ {
29
+ onCancel: () => {
30
+ p.cancel("Cancelled.");
31
+ process.exit(0);
32
+ }
33
+ }
34
+ );
35
+ return {
36
+ name: answers.name
37
+ };
38
+ }
39
+
40
+ // src/commands/create.ts
18
41
  var LOGO = "\u{1F98B}";
19
42
  var create_default = defineCommand({
20
43
  meta: { name: "create", description: "Add a new agent to the project" },
21
44
  async run() {
22
45
  const cwd = process.cwd();
23
- p.intro(`${LOGO} ${pc.bold("kalp create")}`);
46
+ p2.intro(`${LOGO} ${pc.bold("kalp create")}`);
24
47
  const needsInit = !await isProjectInitialized(cwd);
25
- let projectName;
26
48
  if (needsInit) {
27
- p.log.warn(
28
- `No ${pc.cyan("kalp.config.ts")} found \u2014 initializing project first.`
29
- );
30
- projectName = await promptProjectName({
31
- message: "Project name?",
32
- placeholder: "my-project"
33
- });
49
+ p2.log.error("This is not a Kalp project.");
50
+ console.log("");
51
+ console.log(" Run:");
52
+ console.log(` ${pc.cyan("npx create-kalp@latest")}`);
53
+ console.log("");
54
+ process.exit(1);
34
55
  }
35
56
  const agentAnswers = await promptAgentDetails();
36
- const s = p.spinner();
37
- if (needsInit && projectName) {
38
- s.start("Creating project structure");
39
- await scaffoldProject({ projectName, targetDir: cwd });
40
- s.stop("Project structure created");
41
- s.start("Installing Dependencies");
42
- try {
43
- await installDeps(cwd);
44
- s.stop("Dependencies installed");
45
- } catch {
46
- s.stop(pc.yellow("Install failed \u2014 run npm install manually."));
47
- }
48
- }
57
+ const s = p2.spinner();
49
58
  s.start(`Scaffolding agent ${pc.cyan(agentAnswers.name)}`);
50
59
  await scaffoldAgent({
51
60
  agentName: agentAnswers.name,
52
61
  cwd
53
62
  });
54
63
  s.stop("Agent created");
55
- p.note(
64
+ p2.note(
56
65
  [
57
66
  `${pc.dim("\u2022")} ${pc.cyan(`agents/${agentAnswers.name}/index.ts`)}`,
58
67
  `${pc.dim("\u2022")} ${pc.cyan(`agents/${agentAnswers.name}/steps/`)}`,
@@ -62,7 +71,7 @@ var create_default = defineCommand({
62
71
  ].join("\n"),
63
72
  "Created"
64
73
  );
65
- p.outro(
74
+ p2.outro(
66
75
  `${LOGO} ${pc.green(`Agent ${pc.bold(agentAnswers.name)} is ready.`)}`
67
76
  );
68
77
  }
@@ -70,4 +79,4 @@ var create_default = defineCommand({
70
79
  export {
71
80
  create_default as default
72
81
  };
73
- //# sourceMappingURL=create-VTJKDUMA.js.map
82
+ //# sourceMappingURL=create-7J5R6OVF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/create.ts","../src/utils/ui.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { scaffoldAgent } from \"@kalphq/project\";\nimport { isProjectInitialized } from \"@/utils/fs\";\nimport { promptAgentDetails } from \"@/utils/ui\";\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 if (needsInit) {\n p.log.error(\"This is not a Kalp project.\");\n console.log(\"\");\n console.log(\" Run:\");\n console.log(` ${pc.cyan(\"npx create-kalp@latest\")}`);\n console.log(\"\");\n process.exit(1);\n }\n\n // ── Agent prompts ────────────────────────────────────────────────────\n const agentAnswers = await promptAgentDetails();\n\n const s = p.spinner();\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","import * as p from \"@clack/prompts\";\n\nexport async function promptProjectName(opts?: {\n message?: string;\n placeholder?: string;\n allowCurrentDir?: boolean;\n}): Promise<string> {\n const message = opts?.message ?? \"Project name?\";\n const placeholder = opts?.placeholder ?? \"my-project\";\n const allowCurrentDir = opts?.allowCurrentDir ?? false;\n\n const answer = await p.text({\n message,\n placeholder,\n validate: (v) => {\n const value = v.trim();\n if (!value) return \"Project name is required.\";\n if (allowCurrentDir && value === \".\") return;\n if (!/^[a-z0-9-]+$/.test(value)) {\n return allowCurrentDir\n ? \"Use lowercase letters, numbers, and dashes only (or . for current directory).\"\n : \"Use lowercase letters, numbers, and dashes only.\";\n }\n },\n });\n\n if (p.isCancel(answer)) {\n p.cancel(\"Cancelled.\");\n process.exit(0);\n }\n\n return answer.trim();\n}\n\nexport async function promptAgentDetails(): Promise<{\n name: string;\n}> {\n const answers = 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 }),\n },\n {\n onCancel: () => {\n p.cancel(\"Cancelled.\");\n process.exit(0);\n },\n },\n );\n\n return {\n name: answers.name,\n };\n}\n"],"mappings":";;;;;;AAAA,SAAS,qBAAqB;AAC9B,YAAYA,QAAO;AACnB,OAAO,QAAQ;AACf,SAAS,qBAAqB;;;ACH9B,YAAY,OAAO;AAkCnB,eAAsB,qBAEnB;AACD,QAAM,UAAU,MAAQ;AAAA,IACtB;AAAA,MACE,MAAM,MACF,OAAK;AAAA,QACL,SAAS;AAAA,QACT,aAAa;AAAA,QACb,UAAU,CAAC,MAAM;AACf,cAAI,CAAC,EAAE,KAAK,EAAG,QAAO;AACtB,cAAI,CAAC,eAAe,KAAK,CAAC,GAAG;AAC3B,mBAAO;AAAA,UACT;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACL;AAAA,IACA;AAAA,MACE,UAAU,MAAM;AACd,QAAE,SAAO,YAAY;AACrB,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM,QAAQ;AAAA,EAChB;AACF;;;ADvDA,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,SAAM,GAAG,IAAI,IAAI,GAAG,KAAK,aAAa,CAAC,EAAE;AAG3C,UAAM,YAAY,CAAE,MAAM,qBAAqB,GAAG;AAElD,QAAI,WAAW;AACb,MAAE,OAAI,MAAM,6BAA6B;AACzC,cAAQ,IAAI,EAAE;AACd,cAAQ,IAAI,QAAQ;AACpB,cAAQ,IAAI,OAAO,GAAG,KAAK,wBAAwB,CAAC,EAAE;AACtD,cAAQ,IAAI,EAAE;AACd,cAAQ,KAAK,CAAC;AAAA,IAChB;AAGA,UAAM,eAAe,MAAM,mBAAmB;AAE9C,UAAM,IAAM,WAAQ;AAGpB,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":["p"]}
@@ -5,7 +5,6 @@ import {
5
5
  import {
6
6
  getAuthToken
7
7
  } from "./chunk-6LLXGS2P.js";
8
- import "./chunk-2H7UOFLK.js";
9
8
 
10
9
  // src/commands/secrets/delete.ts
11
10
  import { defineCommand } from "citty";
@@ -26,7 +25,9 @@ async function removeSecretFromLocalConfig(cwd, key) {
26
25
  try {
27
26
  content = await readFile(configPath, "utf-8");
28
27
  } catch {
29
- throw new Error("kalp.config.ts not found. Run `kalp init` first.");
28
+ throw new Error(
29
+ "kalp.config.ts not found. Run `npx create-kalp@latest` first."
30
+ );
30
31
  }
31
32
  const regex = new RegExp(`["']${key}["']`);
32
33
  if (!regex.test(content)) {
@@ -140,4 +141,4 @@ var delete_default = defineCommand({
140
141
  export {
141
142
  delete_default as default
142
143
  };
143
- //# sourceMappingURL=delete-AFDTCA52.js.map
144
+ //# sourceMappingURL=delete-47ZP6XRB.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\";\nimport { generateTypes } from \"@/utils/codegen\";\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(\n \"kalp.config.ts not found. Run `npx create-kalp@latest` first.\",\n );\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 regenerateTypes(cwd: string): Promise<void> {\n // Regenerate .kalp/types.d.ts based on kalp.config.ts\n await generateTypes(cwd);\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 // Regenerate types from config\n await regenerateTypes(cwd);\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":";;;;;;;;;AAAA,SAAS,qBAAqB;AAC9B,YAAY,OAAO;AACnB,OAAO,QAAQ;AACf,SAAS,UAAU,iBAAiB;AACpC,SAAS,YAAY;AAIrB,IAAM,OAAO;AAMb,eAAe,wBAAgD;AAE7D,SAAO,CAAC,EAAE,KAAK,oBAAoB,GAAG,EAAE,KAAK,iBAAiB,CAAC;AACjE;AAEA,eAAe,sBAAsB,KAA4B;AAE/D,UAAQ,IAAI,GAAG,IAAI,+BAA+B,GAAG,qBAAqB,CAAC;AAC7E;AAEA,eAAe,4BACb,KACA,KACe;AACf,QAAM,aAAa,KAAK,KAAK,gBAAgB;AAC7C,MAAI;AAEJ,MAAI;AACF,cAAU,MAAM,SAAS,YAAY,OAAO;AAAA,EAC9C,QAAQ;AACN,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAGA,QAAM,QAAQ,IAAI,OAAO,OAAO,GAAG,MAAM;AACzC,MAAI,CAAC,MAAM,KAAK,OAAO,GAAG;AAExB,UAAM,IAAI,MAAM,UAAU,GAAG,4BAA4B;AAAA,EAC3D;AAGA,QAAM,QAAQ,QAAQ,MAAM,yBAAyB;AAErD,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,MAAM,gDAAgD;AAAA,EAClE;AAEA,QAAM,eAAe,MAAM,CAAC;AAC5B,MAAI,CAAC,cAAc;AACjB,UAAM,IAAI,MAAM,0CAA0C;AAAA,EAC5D;AAGA,MAAI,WAAW,aACZ,QAAQ,IAAI,OAAO,OAAO,GAAG,gBAAgB,GAAG,EAAE,EAClD,KAAK;AAER,aAAW,SAAS,QAAQ,SAAS,EAAE;AAEvC,YAAU,QAAQ;AAAA,IAChB;AAAA,IACA,aAAa,QAAQ;AAAA,EACvB;AAEA,QAAM,UAAU,YAAY,SAAS,OAAO;AAC9C;AAEA,eAAe,gBAAgB,KAA4B;AAEzD,QAAM,cAAc,GAAG;AACzB;AAEA,IAAO,iBAAQ,cAAc;AAAA,EAC3B,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA,MAAM;AAAA,IACJ,KAAK;AAAA,MACH,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,IACf;AAAA,IACA,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA,KAAK;AAAA,MACH,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA,MAAM,IAAI,EAAE,KAAK,GAAG;AAClB,UAAM,MAAM,QAAQ,IAAI;AAExB,QAAI,KAAK,MAAM;AACb,MAAE,MAAI,KAAK,GAAG,GAAG,KAAK,OAAO,CAAC,gCAAgC;AAC9D,MAAE,MAAI,KAAK,GAAG,IAAI,mDAAmD,CAAC;AACtE;AAAA,IACF;AAEA,IAAE,QAAM,GAAG,IAAI,IAAI,GAAG,KAAK,qBAAqB,CAAC,EAAE;AAEnD,UAAM,QAAQ,MAAM,aAAa;AACjC,QAAI,CAAC,OAAO;AACV,MAAE,MAAI,KAAK,GAAG,OAAO,wCAAwC,CAAC;AAC9D,MAAE,QAAM,yBAAyB;AACjC;AAAA,IACF;AAEA,QAAI,MAAM,KAAK;AAGf,QAAI,CAAC,KAAK;AACR,YAAM,UAAU,MAAM,sBAAsB;AAC5C,UAAI,QAAQ,WAAW,GAAG;AACxB,QAAE,MAAI,KAAK,GAAG,IAAI,iCAAiC,CAAC;AACpD,QAAE,QAAM,mBAAmB;AAC3B;AAAA,MACF;AAEA,YAAM,WAAW,MAAQ,SAAO;AAAA,QAC9B,SAAS;AAAA,QACT,SAAS,QAAQ,IAAI,CAACA,QAAO,EAAE,OAAOA,GAAE,KAAK,OAAOA,GAAE,IAAI,EAAE;AAAA,MAC9D,CAAC;AAED,UAAM,WAAS,QAAQ,GAAG;AACxB,QAAE,QAAM,WAAW;AACnB;AAAA,MACF;AAEA,YAAM;AAAA,IACR;AAGA,QAAI,CAAC,KAAK,KAAK;AACb,YAAMC,WAAU,MAAQ,UAAQ;AAAA,QAC9B,SAAS,mCAAmC,GAAG,KAAK,GAAG,CAAC;AAAA,QACxD,cAAc;AAAA,MAChB,CAAC;AAED,UAAM,WAASA,QAAO,KAAK,CAACA,UAAS;AACnC,QAAE,QAAM,WAAW;AACnB;AAAA,MACF;AAAA,IACF;AAEA,UAAM,IAAM,UAAQ;AACpB,MAAE,MAAM,YAAY,GAAG,KAAK,GAAG,CAAC,KAAK;AAErC,QAAI;AAEF,YAAM,sBAAsB,GAAG;AAG/B,YAAM,4BAA4B,KAAK,GAAG;AAG1C,YAAM,gBAAgB,GAAG;AAEzB,QAAE,KAAK,UAAU,GAAG,KAAK,GAAG,CAAC,uBAAuB;AACpD,MAAE,QAAM,MAAM;AAAA,IAChB,SAAS,OAAO;AACd,QAAE,KAAK,yBAAyB;AAChC,MAAE,MAAI;AAAA,QACJ,GAAG;AAAA,UACD,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,QAClE;AAAA,MACF;AACA,MAAE,QAAM,QAAQ;AAChB,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AACF,CAAC;","names":["s","confirm"]}
package/dist/index.js CHANGED
@@ -9,9 +9,7 @@ var require2 = createRequire(import.meta.url);
9
9
  var pkg = require2("../package.json");
10
10
  var LOGO = "\u{1F98B}";
11
11
  var COMMANDS = [
12
- ["init", "Create a new Kalp project"],
13
12
  ["create", "Add a new agent"],
14
- ["migrate", "Migrate agent schema"],
15
13
  ["push", "Push agent to Kalp"],
16
14
  ["link", "Link project to Kalp cloud"],
17
15
  ["secrets", "Manage secrets"],
@@ -43,14 +41,12 @@ var main = defineCommand({
43
41
  }
44
42
  },
45
43
  subCommands: {
46
- init: () => import("./init-O2XMITQ6.js").then((r) => r.default),
47
- create: () => import("./create-VTJKDUMA.js").then((r) => r.default),
48
- migrate: () => import("./migrate-CIEU36X6.js").then((r) => r.default),
49
- push: () => import("./push-Y57MBTBB.js").then((r) => r.default),
50
- link: () => import("./link-YCIA4JJ3.js").then((r) => r.default),
51
- secrets: () => import("./secrets-PXU3BYSN.js").then((r) => r.default),
52
- login: () => import("./login-SIKUBDGO.js").then((r) => r.default),
53
- logout: () => import("./logout-OJM3VAOF.js").then((r) => r.default)
44
+ create: () => import("./create-7J5R6OVF.js").then((r) => r.default),
45
+ push: () => import("./push-RBTBXCP7.js").then((r) => r.default),
46
+ link: () => import("./link-WZQSR2TM.js").then((r) => r.default),
47
+ secrets: () => import("./secrets-KFMVBKJQ.js").then((r) => r.default),
48
+ login: () => import("./login-JYPWGL6P.js").then((r) => r.default),
49
+ logout: () => import("./logout-V67DZZXO.js").then((r) => r.default)
54
50
  },
55
51
  run({ args }) {
56
52
  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\";\nimport { createRequire } from \"node:module\";\n\nconst require = createRequire(import.meta.url);\nconst pkg = require(\"../package.json\");\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: pkg.version,\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\").then((r) => r.default),\n create: () => import(\"./commands/create\").then((r) => r.default),\n migrate: () => import(\"./commands/migrate\").then((r) => r.default),\n push: () => import(\"./commands/push\").then((r) => r.default),\n link: () => import(\"./commands/link\").then((r) => r.default),\n secrets: () => import(\"./commands/secrets\").then((r) => r.default),\n login: () => import(\"./commands/login\").then((r) => r.default),\n logout: () => import(\"./commands/logout\").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;AACf,SAAS,qBAAqB;AAE9B,IAAMA,WAAU,cAAc,YAAY,GAAG;AAC7C,IAAM,MAAMA,SAAQ,iBAAiB;AAErC,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,IAAI;AAAA,IACb,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,oBAAiB,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,IAC3D,QAAQ,MAAM,OAAO,sBAAmB,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,IAC/D,SAAS,MAAM,OAAO,uBAAoB,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,IACjE,MAAM,MAAM,OAAO,oBAAiB,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,IAC3D,MAAM,MAAM,OAAO,oBAAiB,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,IAC3D,SAAS,MAAM,OAAO,uBAAoB,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,IACjE,OAAO,MAAM,OAAO,qBAAkB,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,IAC7D,QAAQ,MAAM,OAAO,sBAAmB,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,EACjE;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":["require"]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { defineCommand, runMain } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { createRequire } from \"node:module\";\n\nconst require = createRequire(import.meta.url);\nconst pkg = require(\"../package.json\");\n\nconst LOGO = \"🦋\";\n\nconst COMMANDS = [\n [\"create\", \"Add a new agent\"],\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: pkg.version,\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 create: () => import(\"./commands/create\").then((r) => r.default),\n push: () => import(\"./commands/push\").then((r) => r.default),\n link: () => import(\"./commands/link\").then((r) => r.default),\n secrets: () => import(\"./commands/secrets\").then((r) => r.default),\n login: () => import(\"./commands/login\").then((r) => r.default),\n logout: () => import(\"./commands/logout\").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;AACf,SAAS,qBAAqB;AAE9B,IAAMA,WAAU,cAAc,YAAY,GAAG;AAC7C,IAAM,MAAMA,SAAQ,iBAAiB;AAErC,IAAM,OAAO;AAEb,IAAM,WAAW;AAAA,EACf,CAAC,UAAU,iBAAiB;AAAA,EAC5B,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,IAAI;AAAA,IACb,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,QAAQ,MAAM,OAAO,sBAAmB,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,IAC/D,MAAM,MAAM,OAAO,oBAAiB,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,IAC3D,MAAM,MAAM,OAAO,oBAAiB,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,IAC3D,SAAS,MAAM,OAAO,uBAAoB,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,IACjE,OAAO,MAAM,OAAO,qBAAkB,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,IAC7D,QAAQ,MAAM,OAAO,sBAAmB,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,EACjE;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":["require"]}
@@ -1,5 +1,4 @@
1
1
  #!/usr/bin/env node
2
- import "./chunk-2H7UOFLK.js";
3
2
 
4
3
  // src/commands/link.ts
5
4
  import { defineCommand } from "citty";
@@ -34,4 +33,4 @@ var link_default = defineCommand({
34
33
  export {
35
34
  link_default as default
36
35
  };
37
- //# sourceMappingURL=link-YCIA4JJ3.js.map
36
+ //# sourceMappingURL=link-WZQSR2TM.js.map
@@ -1 +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":[]}
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":[]}
@@ -2,7 +2,6 @@
2
2
  import {
3
3
  getAuthToken
4
4
  } from "./chunk-6LLXGS2P.js";
5
- import "./chunk-2H7UOFLK.js";
6
5
 
7
6
  // src/commands/secrets/list.ts
8
7
  import { defineCommand } from "citty";
@@ -117,4 +116,4 @@ var list_default = defineCommand({
117
116
  export {
118
117
  list_default as default
119
118
  };
120
- //# sourceMappingURL=list-OKKHGKJA.js.map
119
+ //# sourceMappingURL=list-3ZQIFUOT.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/commands/secrets/list.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { getAuthToken } from \"@/utils/auth\";\n\nconst LOGO = \"🦋\";\n\ninterface CloudSecret {\n key: string;\n createdAt: string;\n}\n\nasync function fetchSecretsFromCloud(): Promise<CloudSecret[]> {\n return [\n { key: \"STRIPE_SECRET_KEY\", createdAt: \"2024-01-15T10:30:00Z\" },\n { key: \"OPENAI_API_KEY\", createdAt: \"2024-01-16T14:22:00Z\" },\n ];\n}\n\nasync function readLocalSecrets(cwd: string): Promise<string[]> {\n try {\n const configPath = join(cwd, \"kalp.config.ts\");\n const content = await readFile(configPath, \"utf-8\");\n // Extract secrets array from config\n const match = content.match(/secrets:\\s*\\[([^\\]]*)\\]/);\n if (!match) return [];\n const secretsStr = match[1];\n // Extract quoted strings\n const secrets: string[] = [];\n const regex = /[\"']([^\"']+)[\"']/g;\n\n if (!secretsStr) {\n return [];\n }\n\n let m: RegExpExecArray | null;\n while ((m = regex.exec(secretsStr)) !== null) {\n if (m[1]) {\n secrets.push(m[1]);\n }\n }\n return secrets;\n } catch {\n return [];\n }\n}\n\nexport default defineCommand({\n meta: {\n name: \"list\",\n description: \"List all secrets from Kalp Cloud\",\n },\n args: {\n help: {\n type: \"boolean\",\n alias: \"h\",\n description: \"Show help\",\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 list`);\n return;\n }\n\n p.intro(`${LOGO} ${pc.bold(\"kalp secrets list\")}`);\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 const s = p.spinner();\n s.start(\"Fetching secrets from Kalp Cloud...\");\n\n try {\n const [cloudSecrets, localSecrets] = await Promise.all([\n fetchSecretsFromCloud(),\n readLocalSecrets(cwd),\n ]);\n\n s.stop(`Found ${cloudSecrets.length} secrets`);\n\n if (cloudSecrets.length === 0) {\n p.log.info(pc.dim(\"No secrets found in Kalp Cloud.\"));\n p.log.info(pc.dim(`Add secrets with: ${pc.cyan(\"kalp secrets add\")}`));\n } else {\n console.log(\"\");\n p.log.info(pc.bold(\"Cloud Secrets:\"));\n for (const secret of cloudSecrets) {\n const isSynced = localSecrets.includes(secret.key);\n const syncIcon = isSynced ? pc.green(\"✓\") : pc.yellow(\"○\");\n console.log(\n ` ${syncIcon} ${pc.cyan(secret.key)} ${pc.dim(`(${secret.createdAt})`)}`,\n );\n }\n\n if (localSecrets.length > 0) {\n const unsynced = localSecrets.filter(\n (k) => !cloudSecrets.some((s) => s.key === k),\n );\n if (unsynced.length > 0) {\n console.log(\"\");\n p.log.warn(\n pc.yellow(\n `Local-only secrets (not synced): ${unsynced.join(\", \")}`,\n ),\n );\n }\n }\n }\n\n p.outro(\"Done\");\n } catch (error) {\n s.stop(\"Failed to fetch secrets\");\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"]}
1
+ {"version":3,"sources":["../src/commands/secrets/list.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { getAuthToken } from \"@/utils/auth\";\n\nconst LOGO = \"🦋\";\n\ninterface CloudSecret {\n key: string;\n createdAt: string;\n}\n\nasync function fetchSecretsFromCloud(): Promise<CloudSecret[]> {\n return [\n { key: \"STRIPE_SECRET_KEY\", createdAt: \"2024-01-15T10:30:00Z\" },\n { key: \"OPENAI_API_KEY\", createdAt: \"2024-01-16T14:22:00Z\" },\n ];\n}\n\nasync function readLocalSecrets(cwd: string): Promise<string[]> {\n try {\n const configPath = join(cwd, \"kalp.config.ts\");\n const content = await readFile(configPath, \"utf-8\");\n // Extract secrets array from config\n const match = content.match(/secrets:\\s*\\[([^\\]]*)\\]/);\n if (!match) return [];\n const secretsStr = match[1];\n // Extract quoted strings\n const secrets: string[] = [];\n const regex = /[\"']([^\"']+)[\"']/g;\n\n if (!secretsStr) {\n return [];\n }\n\n let m: RegExpExecArray | null;\n while ((m = regex.exec(secretsStr)) !== null) {\n if (m[1]) {\n secrets.push(m[1]);\n }\n }\n return secrets;\n } catch {\n return [];\n }\n}\n\nexport default defineCommand({\n meta: {\n name: \"list\",\n description: \"List all secrets from Kalp Cloud\",\n },\n args: {\n help: {\n type: \"boolean\",\n alias: \"h\",\n description: \"Show help\",\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 list`);\n return;\n }\n\n p.intro(`${LOGO} ${pc.bold(\"kalp secrets list\")}`);\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 const s = p.spinner();\n s.start(\"Fetching secrets from Kalp Cloud...\");\n\n try {\n const [cloudSecrets, localSecrets] = await Promise.all([\n fetchSecretsFromCloud(),\n readLocalSecrets(cwd),\n ]);\n\n s.stop(`Found ${cloudSecrets.length} secrets`);\n\n if (cloudSecrets.length === 0) {\n p.log.info(pc.dim(\"No secrets found in Kalp Cloud.\"));\n p.log.info(pc.dim(`Add secrets with: ${pc.cyan(\"kalp secrets add\")}`));\n } else {\n console.log(\"\");\n p.log.info(pc.bold(\"Cloud Secrets:\"));\n for (const secret of cloudSecrets) {\n const isSynced = localSecrets.includes(secret.key);\n const syncIcon = isSynced ? pc.green(\"✓\") : pc.yellow(\"○\");\n console.log(\n ` ${syncIcon} ${pc.cyan(secret.key)} ${pc.dim(`(${secret.createdAt})`)}`,\n );\n }\n\n if (localSecrets.length > 0) {\n const unsynced = localSecrets.filter(\n (k) => !cloudSecrets.some((s) => s.key === k),\n );\n if (unsynced.length > 0) {\n console.log(\"\");\n p.log.warn(\n pc.yellow(\n `Local-only secrets (not synced): ${unsynced.join(\", \")}`,\n ),\n );\n }\n }\n }\n\n p.outro(\"Done\");\n } catch (error) {\n s.stop(\"Failed to fetch secrets\");\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"]}
@@ -1,5 +1,4 @@
1
1
  #!/usr/bin/env node
2
- import "./chunk-2H7UOFLK.js";
3
2
 
4
3
  // src/commands/login.ts
5
4
  import { defineCommand } from "citty";
@@ -36,4 +35,4 @@ var login_default = defineCommand({
36
35
  export {
37
36
  login_default as default
38
37
  };
39
- //# sourceMappingURL=login-SIKUBDGO.js.map
38
+ //# sourceMappingURL=login-JYPWGL6P.js.map
@@ -1 +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 } 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,iBAAiB;AACjC,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":[]}
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 } 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,iBAAiB;AACjC,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":[]}
@@ -1,5 +1,4 @@
1
1
  #!/usr/bin/env node
2
- import "./chunk-2H7UOFLK.js";
3
2
 
4
3
  // src/commands/logout.ts
5
4
  import { defineCommand } from "citty";
@@ -29,4 +28,4 @@ var logout_default = defineCommand({
29
28
  export {
30
29
  logout_default as default
31
30
  };
32
- //# sourceMappingURL=logout-OJM3VAOF.js.map
31
+ //# sourceMappingURL=logout-V67DZZXO.js.map
@@ -1 +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":[]}
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":[]}
@@ -0,0 +1,205 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ ensureConfig
4
+ } from "./chunk-INB3LG6O.js";
5
+
6
+ // src/commands/push.ts
7
+ import { access as access2 } from "fs/promises";
8
+ import { join as join3 } from "path";
9
+ import { defineCommand } from "citty";
10
+ import * as p from "@clack/prompts";
11
+ import pc from "picocolors";
12
+
13
+ // src/utils/manifest/index.ts
14
+ import { access } from "fs/promises";
15
+ import { join as join2 } from "path";
16
+ import { compileAgent } from "@kalphq/compiler";
17
+
18
+ // src/utils/manifest/build.ts
19
+ import { existsSync } from "fs";
20
+ import { mkdtemp, readFile, rm } from "fs/promises";
21
+ import { basename, join, resolve } from "path";
22
+ import { pathToFileURL } from "url";
23
+ import { build } from "esbuild";
24
+ async function getHash(payload) {
25
+ const { createHash: createHash2 } = await import("crypto");
26
+ return createHash2("sha256").update(payload).digest("hex");
27
+ }
28
+ async function loadAgentModule(agentPath, cwd) {
29
+ const tempDir = await mkdtemp(join(cwd, ".kalp-temp-"));
30
+ const outFile = join(tempDir, "agent.manifest.mjs");
31
+ await build({
32
+ entryPoints: [agentPath],
33
+ outfile: outFile,
34
+ bundle: true,
35
+ format: "esm",
36
+ platform: "node",
37
+ target: "node18",
38
+ logLevel: "silent",
39
+ packages: "external",
40
+ plugins: [
41
+ {
42
+ name: "relative-js-to-ts",
43
+ setup(buildCtx) {
44
+ buildCtx.onResolve({ filter: /^\.\/.*\.js$/ }, (args) => {
45
+ const resolved = resolve(args.resolveDir, args.path);
46
+ if (existsSync(resolved)) {
47
+ return { path: resolved };
48
+ }
49
+ const tsPath = resolved.replace(/\.js$/, ".ts");
50
+ if (existsSync(tsPath)) {
51
+ return { path: tsPath };
52
+ }
53
+ const tsxPath = resolved.replace(/\.js$/, ".tsx");
54
+ if (existsSync(tsxPath)) {
55
+ return { path: tsxPath };
56
+ }
57
+ return null;
58
+ });
59
+ }
60
+ },
61
+ {
62
+ name: "tsconfig-paths",
63
+ setup(buildCtx) {
64
+ buildCtx.onResolve({ filter: /^@\// }, (args) => {
65
+ const withoutPrefix = args.path.replace(/^@\//, "");
66
+ const resolved = resolve(cwd, withoutPrefix);
67
+ if (existsSync(resolved)) {
68
+ return { path: resolved };
69
+ }
70
+ const tsPath = resolved + ".ts";
71
+ if (existsSync(tsPath)) {
72
+ return { path: tsPath };
73
+ }
74
+ const tsxPath = resolved + ".tsx";
75
+ if (existsSync(tsxPath)) {
76
+ return { path: tsxPath };
77
+ }
78
+ const indexTsPath = join(resolved, "index.ts");
79
+ if (existsSync(indexTsPath)) {
80
+ return { path: indexTsPath };
81
+ }
82
+ return null;
83
+ });
84
+ }
85
+ }
86
+ ]
87
+ });
88
+ const loaded = await import(`${pathToFileURL(outFile).href}?t=${Date.now()}`);
89
+ const bundledCode = await readFile(outFile, "utf-8");
90
+ const codeHash = await getHash(bundledCode);
91
+ return {
92
+ agent: loaded.default,
93
+ entry: basename(outFile),
94
+ tempDir,
95
+ codeHash
96
+ };
97
+ }
98
+ async function cleanupTempDir(tempDir) {
99
+ await rm(tempDir, { recursive: true, force: true });
100
+ }
101
+
102
+ // src/utils/ir/hashIR.ts
103
+ import { createHash } from "crypto";
104
+ function getIRHash(ir) {
105
+ return createHash("sha256").update(JSON.stringify(ir)).digest("hex");
106
+ }
107
+
108
+ // src/utils/manifest/index.ts
109
+ async function readAgentManifest(params) {
110
+ const { cwd, agentName } = params;
111
+ const agentPath = join2(cwd, "agents", agentName, "index.ts");
112
+ await access(agentPath);
113
+ let tempDir;
114
+ try {
115
+ const loaded = await loadAgentModule(agentPath, cwd);
116
+ tempDir = loaded.tempDir;
117
+ const ir = await compileAgent(loaded.agent);
118
+ return {
119
+ format: "kalp-agent-manifest",
120
+ schemaVersion: 2,
121
+ codeHash: loaded.codeHash,
122
+ ir,
123
+ bundle: {
124
+ entry: loaded.entry,
125
+ hash: loaded.codeHash
126
+ },
127
+ metadata: {
128
+ generatedAt: (/* @__PURE__ */ new Date()).toISOString()
129
+ }
130
+ };
131
+ } finally {
132
+ if (tempDir) {
133
+ await cleanupTempDir(tempDir);
134
+ }
135
+ }
136
+ }
137
+
138
+ // src/commands/push.ts
139
+ var LOGO = "\u{1F98B}";
140
+ var CLOUD_API = process.env.KALP_CLOUD_URL || "http://localhost:3000";
141
+ var push_default = defineCommand({
142
+ meta: { name: "push", description: "Push agent to Kalp cloud" },
143
+ args: {
144
+ agent: {
145
+ type: "string",
146
+ alias: "a",
147
+ description: "Agent name to push",
148
+ required: false
149
+ }
150
+ },
151
+ async run({ args }) {
152
+ const cwd = process.cwd();
153
+ const agentName = args.agent;
154
+ p.intro(`${LOGO} ${pc.bold("kalp push")}`);
155
+ if (!agentName) {
156
+ p.log.error(`Missing required flag ${pc.cyan("-a <agent-name>")}`);
157
+ process.exit(1);
158
+ }
159
+ try {
160
+ await ensureConfig(cwd);
161
+ } catch {
162
+ p.log.error(`${pc.cyan("kalp.config.ts")} not found`);
163
+ process.exit(1);
164
+ }
165
+ const agentPath = join3(cwd, "agents", agentName, "index.ts");
166
+ try {
167
+ await access2(agentPath);
168
+ } catch {
169
+ p.log.error(`Agent ${pc.cyan(agentName)} not found`);
170
+ process.exit(1);
171
+ }
172
+ const s = p.spinner();
173
+ s.start(`Compiling ${pc.cyan(agentName)}`);
174
+ const manifest = await readAgentManifest({ cwd, agentName });
175
+ const hash = getIRHash(manifest.ir);
176
+ s.stop(`Compiled ${pc.cyan(agentName)}`);
177
+ s.start(`Pushing to cloud`);
178
+ const response = await fetch(`${CLOUD_API}/api/agents/push`, {
179
+ method: "POST",
180
+ headers: { "Content-Type": "application/json" },
181
+ body: JSON.stringify({
182
+ agentName,
183
+ ir: manifest.ir,
184
+ hash
185
+ })
186
+ });
187
+ if (!response.ok) {
188
+ s.stop(pc.red("Push failed"));
189
+ p.log.error(`Cloud error: ${response.status}`);
190
+ process.exit(1);
191
+ }
192
+ s.stop(pc.green("Pushed successfully"));
193
+ console.log("\n" + pc.dim("\u2500".repeat(50)));
194
+ console.log(pc.cyan("\u2714 deployed"));
195
+ console.log("");
196
+ console.log(`${pc.bold("agent:")} ${agentName}`);
197
+ console.log(`${pc.bold("hash:")} ${hash}`);
198
+ console.log(pc.dim("\u2500".repeat(50)) + "\n");
199
+ p.outro(`${LOGO} ${pc.green("Agent pushed to cloud")}`);
200
+ }
201
+ });
202
+ export {
203
+ push_default as default
204
+ };
205
+ //# sourceMappingURL=push-RBTBXCP7.js.map