@kalphq/cli 0.0.2 → 0.2.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 (76) hide show
  1. package/dist/add-KRHLYYTO.js +138 -0
  2. package/dist/add-KRHLYYTO.js.map +1 -0
  3. package/dist/chunk-6LLXGS2P.js +25 -0
  4. package/dist/chunk-6LLXGS2P.js.map +1 -0
  5. package/dist/chunk-INB3LG6O.js +25 -0
  6. package/dist/chunk-INB3LG6O.js.map +1 -0
  7. package/dist/chunk-MMS3GWBG.js +50 -0
  8. package/dist/chunk-MMS3GWBG.js.map +1 -0
  9. package/dist/create-7J5R6OVF.js +82 -0
  10. package/dist/create-7J5R6OVF.js.map +1 -0
  11. package/dist/delete-47ZP6XRB.js +144 -0
  12. package/dist/delete-47ZP6XRB.js.map +1 -0
  13. package/dist/index.js +54 -4
  14. package/dist/index.js.map +1 -1
  15. package/dist/link-WZQSR2TM.js +36 -0
  16. package/dist/link-WZQSR2TM.js.map +1 -0
  17. package/dist/list-3ZQIFUOT.js +119 -0
  18. package/dist/list-3ZQIFUOT.js.map +1 -0
  19. package/dist/login-JYPWGL6P.js +38 -0
  20. package/dist/login-JYPWGL6P.js.map +1 -0
  21. package/dist/logout-V67DZZXO.js +31 -0
  22. package/dist/logout-V67DZZXO.js.map +1 -0
  23. package/dist/push-RBTBXCP7.js +205 -0
  24. package/dist/push-RBTBXCP7.js.map +1 -0
  25. package/dist/secrets-KFMVBKJQ.js +49 -0
  26. package/dist/secrets-KFMVBKJQ.js.map +1 -0
  27. package/dist/sync-YFM5P3IS.js +120 -0
  28. package/dist/sync-YFM5P3IS.js.map +1 -0
  29. package/package.json +11 -11
  30. package/dist/agents/b2b-sales/signals/.gitkeep +0 -0
  31. package/dist/agents/b2b-sales/webhooks/.gitkeep +0 -0
  32. package/dist/agents/customer-support/signals/.gitkeep +0 -0
  33. package/dist/agents/customer-support/webhooks/.gitkeep +0 -0
  34. package/dist/agents/financial-agent/signals/.gitkeep +0 -0
  35. package/dist/agents/financial-agent/webhooks/.gitkeep +0 -0
  36. package/dist/agents/minimal/signals/.gitkeep +0 -0
  37. package/dist/agents/minimal/webhooks/.gitkeep +0 -0
  38. package/dist/build-ZMN2247N.js +0 -121
  39. package/dist/build-ZMN2247N.js.map +0 -1
  40. package/dist/chunk-BO2MEQKM.js +0 -121
  41. package/dist/chunk-BO2MEQKM.js.map +0 -1
  42. package/dist/create-ZNKKOQLH.js +0 -118
  43. package/dist/create-ZNKKOQLH.js.map +0 -1
  44. package/dist/init-7FSWWKI5.js +0 -66
  45. package/dist/init-7FSWWKI5.js.map +0 -1
  46. package/dist/templates/agents/b2b-sales/signals/.gitkeep +0 -0
  47. package/dist/templates/agents/b2b-sales/webhooks/.gitkeep +0 -0
  48. package/dist/templates/agents/customer-support/signals/.gitkeep +0 -0
  49. package/dist/templates/agents/customer-support/webhooks/.gitkeep +0 -0
  50. package/dist/templates/agents/financial-agent/signals/.gitkeep +0 -0
  51. package/dist/templates/agents/financial-agent/webhooks/.gitkeep +0 -0
  52. package/dist/templates/agents/minimal/signals/.gitkeep +0 -0
  53. package/dist/templates/agents/minimal/webhooks/.gitkeep +0 -0
  54. package/templates/agents/b2b-sales/index.ts +0 -28
  55. package/templates/agents/b2b-sales/signals/.gitkeep +0 -0
  56. package/templates/agents/b2b-sales/steps/score-lead.ts +0 -24
  57. package/templates/agents/b2b-sales/tools/enrich-company.ts +0 -17
  58. package/templates/agents/b2b-sales/webhooks/.gitkeep +0 -0
  59. package/templates/agents/customer-support/index.ts +0 -28
  60. package/templates/agents/customer-support/signals/.gitkeep +0 -0
  61. package/templates/agents/customer-support/steps/classify-ticket.ts +0 -22
  62. package/templates/agents/customer-support/tools/search-kb.ts +0 -13
  63. package/templates/agents/customer-support/webhooks/.gitkeep +0 -0
  64. package/templates/agents/financial-agent/index.ts +0 -28
  65. package/templates/agents/financial-agent/signals/.gitkeep +0 -0
  66. package/templates/agents/financial-agent/steps/analyze-signal.ts +0 -26
  67. package/templates/agents/financial-agent/tools/fetch-market-data.ts +0 -13
  68. package/templates/agents/financial-agent/webhooks/.gitkeep +0 -0
  69. package/templates/agents/minimal/index.ts +0 -16
  70. package/templates/agents/minimal/signals/.gitkeep +0 -0
  71. package/templates/agents/minimal/steps/example-step.ts +0 -13
  72. package/templates/agents/minimal/tools/example-tool.ts +0 -13
  73. package/templates/agents/minimal/webhooks/.gitkeep +0 -0
  74. package/templates/project/meta/deployed.json +0 -1
  75. package/templates/project/package.json +0 -13
  76. package/templates/project/tsconfig.json +0 -14
@@ -0,0 +1,138 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ generateTypes
4
+ } from "./chunk-MMS3GWBG.js";
5
+ import {
6
+ getAuthToken
7
+ } from "./chunk-6LLXGS2P.js";
8
+
9
+ // src/commands/secrets/add.ts
10
+ import { defineCommand } from "citty";
11
+ import * as p from "@clack/prompts";
12
+ import pc from "picocolors";
13
+ import { readFile, writeFile } from "fs/promises";
14
+ import { join } from "path";
15
+ var LOGO = "\u{1F98B}";
16
+ async function addSecretToCloud(key, value) {
17
+ console.log(pc.dim(`[Simulated] Adding secret ${key} to Kalp Cloud...`));
18
+ }
19
+ async function addSecretToLocalConfig(cwd, key) {
20
+ const configPath = join(cwd, "kalp.config.ts");
21
+ let content;
22
+ try {
23
+ content = await readFile(configPath, "utf-8");
24
+ } catch {
25
+ throw new Error(
26
+ "kalp.config.ts not found. Run `npx create-kalp@latest` first."
27
+ );
28
+ }
29
+ const regex = new RegExp(`["']${key}["']`);
30
+ if (regex.test(content)) {
31
+ throw new Error(`Secret ${key} already exists in kalp.config.ts`);
32
+ }
33
+ const match = content.match(/secrets:\s*\[([^\]]*)\]/);
34
+ if (!match) {
35
+ throw new Error("Could not find secrets array in kalp.config.ts");
36
+ }
37
+ const currentArray = match[1]?.trim() ?? "";
38
+ const newSecret = currentArray.length > 0 ? `, "${key}"` : `"${key}"`;
39
+ const newArray = `secrets: [${currentArray}${newSecret}]`;
40
+ content = content.replace(/secrets:\s*\[([^\]]*)\]/, newArray);
41
+ await writeFile(configPath, content, "utf-8");
42
+ }
43
+ async function regenerateTypes(cwd) {
44
+ await generateTypes(cwd);
45
+ }
46
+ var add_default = defineCommand({
47
+ meta: {
48
+ name: "add",
49
+ description: "Add a secret to Kalp Cloud and local config"
50
+ },
51
+ args: {
52
+ key: {
53
+ type: "string",
54
+ alias: "k",
55
+ description: "Secret key name (e.g., STRIPE_SECRET_KEY)"
56
+ },
57
+ value: {
58
+ type: "string",
59
+ alias: "v",
60
+ description: "Secret value"
61
+ },
62
+ help: {
63
+ type: "boolean",
64
+ alias: "h",
65
+ description: "Show help",
66
+ default: false
67
+ }
68
+ },
69
+ async run({ args }) {
70
+ const cwd = process.cwd();
71
+ if (args.help) {
72
+ p.log.info(`${pc.bold("Usage")}: kalp secrets add -k <key> -v <value>`);
73
+ p.log.info(
74
+ pc.dim("Example: kalp secrets add -k STRIPE_SECRET_KEY -v sk_test_...")
75
+ );
76
+ return;
77
+ }
78
+ p.intro(`${LOGO} ${pc.bold("kalp secrets add")}`);
79
+ const token = await getAuthToken();
80
+ if (!token) {
81
+ p.log.warn(pc.yellow("Not logged in. Run `kalp login` first."));
82
+ p.outro("Authentication required");
83
+ return;
84
+ }
85
+ let key = args.key;
86
+ let value = args.value;
87
+ if (!key) {
88
+ const input = await p.text({
89
+ message: "Secret key name",
90
+ placeholder: "STRIPE_SECRET_KEY",
91
+ validate: (v) => {
92
+ if (!v) return "Key is required";
93
+ if (!/^[A-Z_][A-Z0-9_]*$/.test(v)) {
94
+ return "Key must be UPPER_SNAKE_CASE";
95
+ }
96
+ }
97
+ });
98
+ if (p.isCancel(input)) {
99
+ p.outro("Cancelled");
100
+ return;
101
+ }
102
+ key = input;
103
+ }
104
+ if (!value) {
105
+ const input = await p.password({
106
+ message: `Enter value for ${key}`,
107
+ mask: "*"
108
+ });
109
+ if (p.isCancel(input)) {
110
+ p.outro("Cancelled");
111
+ return;
112
+ }
113
+ value = input;
114
+ }
115
+ const s = p.spinner();
116
+ s.start(`Adding ${pc.cyan(key)}...`);
117
+ try {
118
+ await addSecretToCloud(key, value);
119
+ await addSecretToLocalConfig(cwd, key);
120
+ await regenerateTypes(cwd);
121
+ s.stop(`Secret ${pc.cyan(key)} added successfully`);
122
+ p.outro("Done");
123
+ } catch (error) {
124
+ s.stop("Failed to add secret");
125
+ p.log.error(
126
+ pc.red(
127
+ `Error: ${error instanceof Error ? error.message : String(error)}`
128
+ )
129
+ );
130
+ p.outro("Failed");
131
+ process.exit(1);
132
+ }
133
+ }
134
+ });
135
+ export {
136
+ add_default as default
137
+ };
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/auth.ts
4
+ import { readFile } from "fs/promises";
5
+ import { homedir } from "os";
6
+ import { join } from "path";
7
+ var KALP_DIR = join(homedir(), ".kalp");
8
+ var AUTH_FILE = join(KALP_DIR, "auth.json");
9
+ async function getAuthToken() {
10
+ try {
11
+ const content = await readFile(AUTH_FILE, "utf-8");
12
+ const auth = JSON.parse(content);
13
+ if (new Date(auth.expiresAt) < /* @__PURE__ */ new Date()) {
14
+ return null;
15
+ }
16
+ return auth.token;
17
+ } catch {
18
+ return null;
19
+ }
20
+ }
21
+
22
+ export {
23
+ getAuthToken
24
+ };
25
+ //# sourceMappingURL=chunk-6LLXGS2P.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/auth.ts"],"sourcesContent":["import { readFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nconst KALP_DIR = join(homedir(), \".kalp\");\nconst AUTH_FILE = join(KALP_DIR, \"auth.json\");\n\ninterface AuthData {\n token: string;\n email: string;\n expiresAt: string;\n}\n\nexport async function getAuthToken(): Promise<string | null> {\n try {\n const content = await readFile(AUTH_FILE, \"utf-8\");\n const auth = JSON.parse(content) as AuthData;\n\n // Check if token is expired\n if (new Date(auth.expiresAt) < new Date()) {\n return null;\n }\n\n return auth.token;\n } catch {\n return null;\n }\n}\n\nexport async function isAuthenticated(): Promise<boolean> {\n const token = await getAuthToken();\n return token !== null;\n}\n"],"mappings":";;;AAAA,SAAS,gBAAgB;AACzB,SAAS,eAAe;AACxB,SAAS,YAAY;AAErB,IAAM,WAAW,KAAK,QAAQ,GAAG,OAAO;AACxC,IAAM,YAAY,KAAK,UAAU,WAAW;AAQ5C,eAAsB,eAAuC;AAC3D,MAAI;AACF,UAAM,UAAU,MAAM,SAAS,WAAW,OAAO;AACjD,UAAM,OAAO,KAAK,MAAM,OAAO;AAG/B,QAAI,IAAI,KAAK,KAAK,SAAS,IAAI,oBAAI,KAAK,GAAG;AACzC,aAAO;AAAA,IACT;AAEA,WAAO,KAAK;AAAA,EACd,QAAQ;AACN,WAAO;AAAA,EACT;AACF;","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":[]}
@@ -0,0 +1,50 @@
1
+ #!/usr/bin/env node
2
+
3
+ // src/utils/codegen.ts
4
+ import { readFile, writeFile, mkdir } from "fs/promises";
5
+ import { join } from "path";
6
+ import { access } from "fs/promises";
7
+ var GENERATED_HEADER = `// \u{1F98B} Kalp Generated Types
8
+ // This file is auto-generated. Do not edit manually.
9
+ `;
10
+ function parseSecretsFromConfig(configContent) {
11
+ const secretsMatch = configContent.match(/secrets:\s*\[([^\]]*)\]/);
12
+ if (!secretsMatch) return null;
13
+ const secretsArray = secretsMatch[1] ?? "";
14
+ if (!secretsArray.trim()) return [];
15
+ const secretMatches = secretsArray.match(/"([^"]+)"/g);
16
+ if (!secretMatches) return [];
17
+ return secretMatches.map((match) => match.replace(/"/g, ""));
18
+ }
19
+ async function generateTypes(cwd) {
20
+ const configPath = join(cwd, "kalp.config.ts");
21
+ const kalpDir = join(cwd, ".kalp");
22
+ const typesPath = join(kalpDir, "types.d.ts");
23
+ let secrets = [];
24
+ try {
25
+ const configContent = await readFile(configPath, "utf-8");
26
+ const parsed = parseSecretsFromConfig(configContent);
27
+ if (parsed !== null) {
28
+ secrets = parsed;
29
+ }
30
+ } catch {
31
+ secrets = [];
32
+ }
33
+ try {
34
+ await mkdir(kalpDir, { recursive: true });
35
+ } catch {
36
+ }
37
+ const secretsTuple = secrets.length > 0 ? `[${secrets.map((s) => `"${s}"`).join(", ")}]` : "[]";
38
+ const typesContent = `${GENERATED_HEADER}/**
39
+ * Registered secrets from kalp.config.ts
40
+ * @generated
41
+ */
42
+ export type RegisteredSecretKeys = ${secretsTuple};
43
+ `;
44
+ await writeFile(typesPath, typesContent, "utf-8");
45
+ }
46
+
47
+ export {
48
+ generateTypes
49
+ };
50
+ //# sourceMappingURL=chunk-MMS3GWBG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/codegen.ts"],"sourcesContent":["import { readFile, writeFile, mkdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { access } from \"node:fs/promises\";\n\nconst GENERATED_HEADER = `// 🦋 Kalp Generated Types\n// This file is auto-generated. Do not edit manually.\n`;\n\n/**\n * Parse secrets from kalp.config.ts content using regex\n * Looks for: secrets: [\"KEY1\", \"KEY2\"] or secrets: []\n */\nfunction parseSecretsFromConfig(configContent: string): string[] | null {\n // Match secrets: [...] array\n const secretsMatch = configContent.match(/secrets:\\s*\\[([^\\]]*)\\]/);\n if (!secretsMatch) return null;\n\n const secretsArray = secretsMatch[1] ?? \"\";\n if (!secretsArray.trim()) return [];\n\n // Extract quoted strings from the array\n const secretMatches = secretsArray.match(/\"([^\"]+)\"/g);\n if (!secretMatches) return [];\n\n return secretMatches.map((match) => match.replace(/\"/g, \"\"));\n}\n\n/**\n * Generate types file based on secrets from kalp.config.ts\n */\nexport async function generateTypes(cwd: string): Promise<void> {\n const configPath = join(cwd, \"kalp.config.ts\");\n const kalpDir = join(cwd, \".kalp\");\n const typesPath = join(kalpDir, \"types.d.ts\");\n\n let secrets: string[] = [];\n\n try {\n const configContent = await readFile(configPath, \"utf-8\");\n const parsed = parseSecretsFromConfig(configContent);\n if (parsed !== null) {\n secrets = parsed;\n }\n } catch {\n // Config doesn't exist yet, use empty array\n secrets = [];\n }\n\n // Ensure .kalp directory exists\n try {\n await mkdir(kalpDir, { recursive: true });\n } catch {\n // Directory might already exist\n }\n\n // Generate the types content\n const secretsTuple =\n secrets.length > 0 ? `[${secrets.map((s) => `\"${s}\"`).join(\", \")}]` : \"[]\";\n\n const typesContent = `${GENERATED_HEADER}/**\n * Registered secrets from kalp.config.ts\n * @generated\n */\nexport type RegisteredSecretKeys = ${secretsTuple};\n`;\n\n await writeFile(typesPath, typesContent, \"utf-8\");\n}\n\n/**\n * Update kalp.d.ts to import and use generated types\n */\nexport async function updateKalpDts(cwd: string): Promise<void> {\n const kalpDtsPath = join(cwd, \"kalp.d.ts\");\n\n // Check if kalp.d.ts exists\n try {\n await access(kalpDtsPath);\n } catch {\n // Create new kalp.d.ts if it doesn't exist\n const content = `import \"@kalphq/sdk\";\n\nimport type { RegisteredSecretKeys } from \"./.kalp/types\";\n\ndeclare module \"@kalphq/sdk\" {\n interface SecretsRegistry {\n keys: RegisteredSecretKeys;\n }\n}\n`;\n await writeFile(kalpDtsPath, content, \"utf-8\");\n return;\n }\n\n // Read existing content\n const existingContent = await readFile(kalpDtsPath, \"utf-8\");\n\n // Check if it already imports from .kalp/types\n if (existingContent.includes(\"./.kalp/types\")) {\n // Already using generated types, no need to update\n return;\n }\n\n // Update to use generated types\n const updatedContent = `import \"@kalphq/sdk\";\nimport type { RegisteredSecretKeys } from \"./.kalp/types\";\n\ndeclare module \"@kalphq/sdk\" {\n interface SecretsRegistry {\n keys: RegisteredSecretKeys;\n }\n}\n`;\n\n await writeFile(kalpDtsPath, updatedContent, \"utf-8\");\n}\n\n/**\n * Ensure tsconfig.json includes .kalp/types.d.ts\n */\nexport async function updateTsconfig(cwd: string): Promise<void> {\n const tsconfigPath = join(cwd, \"tsconfig.json\");\n\n try {\n const content = await readFile(tsconfigPath, \"utf-8\");\n const config = JSON.parse(content);\n\n if (!config.include) {\n config.include = [];\n }\n\n const typesPath = \".kalp/types.d.ts\";\n if (!config.include.includes(typesPath)) {\n config.include.unshift(typesPath);\n await writeFile(tsconfigPath, JSON.stringify(config, null, 2), \"utf-8\");\n }\n } catch {}\n}\n"],"mappings":";;;AAAA,SAAS,UAAU,WAAW,aAAa;AAC3C,SAAS,YAAY;AACrB,SAAS,cAAc;AAEvB,IAAM,mBAAmB;AAAA;AAAA;AAQzB,SAAS,uBAAuB,eAAwC;AAEtE,QAAM,eAAe,cAAc,MAAM,yBAAyB;AAClE,MAAI,CAAC,aAAc,QAAO;AAE1B,QAAM,eAAe,aAAa,CAAC,KAAK;AACxC,MAAI,CAAC,aAAa,KAAK,EAAG,QAAO,CAAC;AAGlC,QAAM,gBAAgB,aAAa,MAAM,YAAY;AACrD,MAAI,CAAC,cAAe,QAAO,CAAC;AAE5B,SAAO,cAAc,IAAI,CAAC,UAAU,MAAM,QAAQ,MAAM,EAAE,CAAC;AAC7D;AAKA,eAAsB,cAAc,KAA4B;AAC9D,QAAM,aAAa,KAAK,KAAK,gBAAgB;AAC7C,QAAM,UAAU,KAAK,KAAK,OAAO;AACjC,QAAM,YAAY,KAAK,SAAS,YAAY;AAE5C,MAAI,UAAoB,CAAC;AAEzB,MAAI;AACF,UAAM,gBAAgB,MAAM,SAAS,YAAY,OAAO;AACxD,UAAM,SAAS,uBAAuB,aAAa;AACnD,QAAI,WAAW,MAAM;AACnB,gBAAU;AAAA,IACZ;AAAA,EACF,QAAQ;AAEN,cAAU,CAAC;AAAA,EACb;AAGA,MAAI;AACF,UAAM,MAAM,SAAS,EAAE,WAAW,KAAK,CAAC;AAAA,EAC1C,QAAQ;AAAA,EAER;AAGA,QAAM,eACJ,QAAQ,SAAS,IAAI,IAAI,QAAQ,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG,EAAE,KAAK,IAAI,CAAC,MAAM;AAExE,QAAM,eAAe,GAAG,gBAAgB;AAAA;AAAA;AAAA;AAAA,qCAIL,YAAY;AAAA;AAG/C,QAAM,UAAU,WAAW,cAAc,OAAO;AAClD;","names":[]}
@@ -0,0 +1,82 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ isProjectInitialized
4
+ } from "./chunk-INB3LG6O.js";
5
+
6
+ // src/commands/create.ts
7
+ import { defineCommand } from "citty";
8
+ import * as p2 from "@clack/prompts";
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
41
+ var LOGO = "\u{1F98B}";
42
+ var create_default = defineCommand({
43
+ meta: { name: "create", description: "Add a new agent to the project" },
44
+ async run() {
45
+ const cwd = process.cwd();
46
+ p2.intro(`${LOGO} ${pc.bold("kalp create")}`);
47
+ const needsInit = !await isProjectInitialized(cwd);
48
+ if (needsInit) {
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);
55
+ }
56
+ const agentAnswers = await promptAgentDetails();
57
+ const s = p2.spinner();
58
+ s.start(`Scaffolding agent ${pc.cyan(agentAnswers.name)}`);
59
+ await scaffoldAgent({
60
+ agentName: agentAnswers.name,
61
+ cwd
62
+ });
63
+ s.stop("Agent created");
64
+ p2.note(
65
+ [
66
+ `${pc.dim("\u2022")} ${pc.cyan(`agents/${agentAnswers.name}/index.ts`)}`,
67
+ `${pc.dim("\u2022")} ${pc.cyan(`agents/${agentAnswers.name}/steps/`)}`,
68
+ `${pc.dim("\u2022")} ${pc.cyan(`agents/${agentAnswers.name}/tools/`)}`,
69
+ `${pc.dim("\u2022")} ${pc.cyan(`agents/${agentAnswers.name}/routes/`)}`,
70
+ `${pc.dim("\u2022")} ${pc.cyan(`agents/${agentAnswers.name}/flows/`)}`
71
+ ].join("\n"),
72
+ "Created"
73
+ );
74
+ p2.outro(
75
+ `${LOGO} ${pc.green(`Agent ${pc.bold(agentAnswers.name)} is ready.`)}`
76
+ );
77
+ }
78
+ });
79
+ export {
80
+ create_default as default
81
+ };
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"]}
@@ -0,0 +1,144 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ generateTypes
4
+ } from "./chunk-MMS3GWBG.js";
5
+ import {
6
+ getAuthToken
7
+ } from "./chunk-6LLXGS2P.js";
8
+
9
+ // src/commands/secrets/delete.ts
10
+ import { defineCommand } from "citty";
11
+ import * as p from "@clack/prompts";
12
+ import pc from "picocolors";
13
+ import { readFile, writeFile } from "fs/promises";
14
+ import { join } from "path";
15
+ var LOGO = "\u{1F98B}";
16
+ async function fetchSecretsFromCloud() {
17
+ return [{ key: "STRIPE_SECRET_KEY" }, { key: "OPENAI_API_KEY" }];
18
+ }
19
+ async function deleteSecretFromCloud(key) {
20
+ console.log(pc.dim(`[Simulated] Deleting secret ${key} from Kalp Cloud...`));
21
+ }
22
+ async function removeSecretFromLocalConfig(cwd, key) {
23
+ const configPath = join(cwd, "kalp.config.ts");
24
+ let content;
25
+ try {
26
+ content = await readFile(configPath, "utf-8");
27
+ } catch {
28
+ throw new Error(
29
+ "kalp.config.ts not found. Run `npx create-kalp@latest` first."
30
+ );
31
+ }
32
+ const regex = new RegExp(`["']${key}["']`);
33
+ if (!regex.test(content)) {
34
+ throw new Error(`Secret ${key} not found in local config`);
35
+ }
36
+ const match = content.match(/secrets:\s*\[([^\]]*)\]/);
37
+ if (!match) {
38
+ throw new Error("Could not find secrets array in kalp.config.ts");
39
+ }
40
+ const currentArray = match[1];
41
+ if (!currentArray) {
42
+ throw new Error("Secrets array is empty in kalp.config.ts");
43
+ }
44
+ let newArray = currentArray.replace(new RegExp(`["']${key}["']\\s*,?\\s*`), "").trim();
45
+ newArray = newArray.replace(/,\s*$/, "");
46
+ content = content.replace(
47
+ /secrets:\s*\[([^\]]*)\]/,
48
+ `secrets: [${newArray}]`
49
+ );
50
+ await writeFile(configPath, content, "utf-8");
51
+ }
52
+ async function regenerateTypes(cwd) {
53
+ await generateTypes(cwd);
54
+ }
55
+ var delete_default = defineCommand({
56
+ meta: {
57
+ name: "delete",
58
+ description: "Delete a secret from Kalp Cloud and local config"
59
+ },
60
+ args: {
61
+ key: {
62
+ type: "string",
63
+ alias: "k",
64
+ description: "Secret key name to delete"
65
+ },
66
+ help: {
67
+ type: "boolean",
68
+ alias: "h",
69
+ description: "Show help",
70
+ default: false
71
+ },
72
+ yes: {
73
+ type: "boolean",
74
+ alias: "y",
75
+ description: "Skip confirmation",
76
+ default: false
77
+ }
78
+ },
79
+ async run({ args }) {
80
+ const cwd = process.cwd();
81
+ if (args.help) {
82
+ p.log.info(`${pc.bold("Usage")}: kalp secrets delete -k <key>`);
83
+ p.log.info(pc.dim("Example: kalp secrets delete -k STRIPE_SECRET_KEY"));
84
+ return;
85
+ }
86
+ p.intro(`${LOGO} ${pc.bold("kalp secrets delete")}`);
87
+ const token = await getAuthToken();
88
+ if (!token) {
89
+ p.log.warn(pc.yellow("Not logged in. Run `kalp login` first."));
90
+ p.outro("Authentication required");
91
+ return;
92
+ }
93
+ let key = args.key;
94
+ if (!key) {
95
+ const secrets = await fetchSecretsFromCloud();
96
+ if (secrets.length === 0) {
97
+ p.log.info(pc.dim("No secrets found in Kalp Cloud."));
98
+ p.outro("Nothing to delete");
99
+ return;
100
+ }
101
+ const selected = await p.select({
102
+ message: "Select a secret to delete",
103
+ options: secrets.map((s2) => ({ value: s2.key, label: s2.key }))
104
+ });
105
+ if (p.isCancel(selected)) {
106
+ p.outro("Cancelled");
107
+ return;
108
+ }
109
+ key = selected;
110
+ }
111
+ if (!args.yes) {
112
+ const confirm2 = await p.confirm({
113
+ message: `Are you sure you want to delete ${pc.cyan(key)}? This action cannot be undone.`,
114
+ initialValue: false
115
+ });
116
+ if (p.isCancel(confirm2) || !confirm2) {
117
+ p.outro("Cancelled");
118
+ return;
119
+ }
120
+ }
121
+ const s = p.spinner();
122
+ s.start(`Deleting ${pc.cyan(key)}...`);
123
+ try {
124
+ await deleteSecretFromCloud(key);
125
+ await removeSecretFromLocalConfig(cwd, key);
126
+ await regenerateTypes(cwd);
127
+ s.stop(`Secret ${pc.cyan(key)} deleted successfully`);
128
+ p.outro("Done");
129
+ } catch (error) {
130
+ s.stop("Failed to delete secret");
131
+ p.log.error(
132
+ pc.red(
133
+ `Error: ${error instanceof Error ? error.message : String(error)}`
134
+ )
135
+ );
136
+ p.outro("Failed");
137
+ process.exit(1);
138
+ }
139
+ }
140
+ });
141
+ export {
142
+ delete_default as default
143
+ };
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":"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","names":["s","confirm"]}
package/dist/index.js CHANGED
@@ -2,16 +2,66 @@
2
2
 
3
3
  // src/index.ts
4
4
  import { defineCommand, runMain } from "citty";
5
+ import * as p from "@clack/prompts";
6
+ import pc from "picocolors";
7
+ import { createRequire } from "module";
8
+ var require2 = createRequire(import.meta.url);
9
+ var pkg = require2("../package.json");
10
+ var LOGO = "\u{1F98B}";
11
+ var COMMANDS = [
12
+ ["create", "Add a new agent"],
13
+ ["push", "Push agent to Kalp"],
14
+ ["link", "Link project to Kalp cloud"],
15
+ ["secrets", "Manage secrets"],
16
+ ["login", "Authenticate with Kalp"],
17
+ ["logout", "Sign out from Kalp"]
18
+ ];
19
+ function printHelp() {
20
+ p.log.info(`${pc.bold("Usage")}: kalp <command> [options]`);
21
+ console.log("");
22
+ p.log.info(pc.bold("Commands"));
23
+ for (const [name, desc] of COMMANDS) {
24
+ console.log(` ${pc.cyan(name.padEnd(10))}${desc}`);
25
+ }
26
+ console.log("");
27
+ p.log.info(`Run ${pc.cyan("kalp <command> --help")} for more info.`);
28
+ }
5
29
  var main = defineCommand({
6
30
  meta: {
7
31
  name: "kalp",
8
- version: "0.0.1",
32
+ version: pkg.version,
9
33
  description: "\u{1F98B} Zero-config agent infrastructure"
10
34
  },
35
+ args: {
36
+ help: {
37
+ type: "boolean",
38
+ alias: "h",
39
+ description: "Show help",
40
+ default: false
41
+ }
42
+ },
11
43
  subCommands: {
12
- init: () => import("./init-7FSWWKI5.js").then((r) => r.default),
13
- create: () => import("./create-ZNKKOQLH.js").then((r) => r.default),
14
- build: () => import("./build-ZMN2247N.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)
50
+ },
51
+ run({ args }) {
52
+ const firstArg = process.argv[2];
53
+ if (args.help) {
54
+ p.intro(`${LOGO} ${pc.bold("kalp")}`);
55
+ printHelp();
56
+ p.outro("Happy coding \u{1F98B}");
57
+ return;
58
+ }
59
+ if (firstArg) {
60
+ return;
61
+ }
62
+ p.intro(`${LOGO} ${pc.bold("kalp")}`);
63
+ printHelp();
64
+ p.outro("Happy coding \u{1F98B}");
15
65
  }
16
66
  });
17
67
  runMain(main);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { defineCommand, runMain } from \"citty\";\n\nconst main = defineCommand({\n meta: {\n name: \"kalp\",\n version: \"0.0.1\",\n description: \"🦋 Zero-config agent infrastructure\",\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 },\n});\n\nrunMain(main);\n"],"mappings":";;;AAAA,SAAS,eAAe,eAAe;AAEvC,IAAM,OAAO,cAAc;AAAA,EACzB,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,SAAS;AAAA,IACT,aAAa;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,EAClE;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\";\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"]}