@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.
- package/dist/add-KRHLYYTO.js +138 -0
- package/dist/add-KRHLYYTO.js.map +1 -0
- package/dist/chunk-6LLXGS2P.js +25 -0
- package/dist/chunk-6LLXGS2P.js.map +1 -0
- package/dist/chunk-INB3LG6O.js +25 -0
- package/dist/chunk-INB3LG6O.js.map +1 -0
- package/dist/chunk-MMS3GWBG.js +50 -0
- package/dist/chunk-MMS3GWBG.js.map +1 -0
- package/dist/create-7J5R6OVF.js +82 -0
- package/dist/create-7J5R6OVF.js.map +1 -0
- package/dist/delete-47ZP6XRB.js +144 -0
- package/dist/delete-47ZP6XRB.js.map +1 -0
- package/dist/index.js +54 -4
- package/dist/index.js.map +1 -1
- package/dist/link-WZQSR2TM.js +36 -0
- package/dist/link-WZQSR2TM.js.map +1 -0
- package/dist/list-3ZQIFUOT.js +119 -0
- package/dist/list-3ZQIFUOT.js.map +1 -0
- package/dist/login-JYPWGL6P.js +38 -0
- package/dist/login-JYPWGL6P.js.map +1 -0
- package/dist/logout-V67DZZXO.js +31 -0
- package/dist/logout-V67DZZXO.js.map +1 -0
- package/dist/push-RBTBXCP7.js +205 -0
- package/dist/push-RBTBXCP7.js.map +1 -0
- package/dist/secrets-KFMVBKJQ.js +49 -0
- package/dist/secrets-KFMVBKJQ.js.map +1 -0
- package/dist/sync-YFM5P3IS.js +120 -0
- package/dist/sync-YFM5P3IS.js.map +1 -0
- package/package.json +11 -11
- package/dist/agents/b2b-sales/signals/.gitkeep +0 -0
- package/dist/agents/b2b-sales/webhooks/.gitkeep +0 -0
- package/dist/agents/customer-support/signals/.gitkeep +0 -0
- package/dist/agents/customer-support/webhooks/.gitkeep +0 -0
- package/dist/agents/financial-agent/signals/.gitkeep +0 -0
- package/dist/agents/financial-agent/webhooks/.gitkeep +0 -0
- package/dist/agents/minimal/signals/.gitkeep +0 -0
- package/dist/agents/minimal/webhooks/.gitkeep +0 -0
- package/dist/build-ZMN2247N.js +0 -121
- package/dist/build-ZMN2247N.js.map +0 -1
- package/dist/chunk-BO2MEQKM.js +0 -121
- package/dist/chunk-BO2MEQKM.js.map +0 -1
- package/dist/create-ZNKKOQLH.js +0 -118
- package/dist/create-ZNKKOQLH.js.map +0 -1
- package/dist/init-7FSWWKI5.js +0 -66
- package/dist/init-7FSWWKI5.js.map +0 -1
- package/dist/templates/agents/b2b-sales/signals/.gitkeep +0 -0
- package/dist/templates/agents/b2b-sales/webhooks/.gitkeep +0 -0
- package/dist/templates/agents/customer-support/signals/.gitkeep +0 -0
- package/dist/templates/agents/customer-support/webhooks/.gitkeep +0 -0
- package/dist/templates/agents/financial-agent/signals/.gitkeep +0 -0
- package/dist/templates/agents/financial-agent/webhooks/.gitkeep +0 -0
- package/dist/templates/agents/minimal/signals/.gitkeep +0 -0
- package/dist/templates/agents/minimal/webhooks/.gitkeep +0 -0
- package/templates/agents/b2b-sales/index.ts +0 -28
- package/templates/agents/b2b-sales/signals/.gitkeep +0 -0
- package/templates/agents/b2b-sales/steps/score-lead.ts +0 -24
- package/templates/agents/b2b-sales/tools/enrich-company.ts +0 -17
- package/templates/agents/b2b-sales/webhooks/.gitkeep +0 -0
- package/templates/agents/customer-support/index.ts +0 -28
- package/templates/agents/customer-support/signals/.gitkeep +0 -0
- package/templates/agents/customer-support/steps/classify-ticket.ts +0 -22
- package/templates/agents/customer-support/tools/search-kb.ts +0 -13
- package/templates/agents/customer-support/webhooks/.gitkeep +0 -0
- package/templates/agents/financial-agent/index.ts +0 -28
- package/templates/agents/financial-agent/signals/.gitkeep +0 -0
- package/templates/agents/financial-agent/steps/analyze-signal.ts +0 -26
- package/templates/agents/financial-agent/tools/fetch-market-data.ts +0 -13
- package/templates/agents/financial-agent/webhooks/.gitkeep +0 -0
- package/templates/agents/minimal/index.ts +0 -16
- package/templates/agents/minimal/signals/.gitkeep +0 -0
- package/templates/agents/minimal/steps/example-step.ts +0 -13
- package/templates/agents/minimal/tools/example-tool.ts +0 -13
- package/templates/agents/minimal/webhooks/.gitkeep +0 -0
- package/templates/project/meta/deployed.json +0 -1
- package/templates/project/package.json +0 -13
- package/templates/project/tsconfig.json +0 -14
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/secrets/sync.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 SecretFromCloud {\n key: string;\n createdAt: string;\n}\n\nasync function fetchSecretsFromCloud(): Promise<SecretFromCloud[]> {\n // TODO: Implement real API call to Kalp Cloud\n console.log(pc.dim(\"[Simulated] Fetching secrets from Kalp Cloud...\"));\n // Simulated response - in real implementation, this would call the API\n return [\n { key: \"STRIPE_SECRET_KEY\", createdAt: \"2024-01-15T10:30:00Z\" },\n { key: \"OPENAI_API_KEY\", createdAt: \"2024-01-16T14:20:00Z\" },\n ];\n}\n\nasync function replaceSecretsInConfig(\n cwd: string,\n secrets: 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 // Create new config if doesn't exist\n content = `import { defineConfig } from \"@kalphq/sdk\";\n\nexport default defineConfig({\n secrets: [],\n});\n`;\n }\n\n // Replace secrets array with new ones\n const secretsArray =\n secrets.length > 0 ? secrets.map((s) => `\"${s}\"`).join(\", \") : \"\";\n\n const newArray = `secrets: [${secretsArray}]`;\n\n // Check if config has secrets array\n if (content.match(/secrets:\\s*\\[([^\\]]*)\\]/)) {\n content = content.replace(/secrets:\\s*\\[([^\\]]*)\\]/, newArray);\n } else {\n // Add secrets array if not present\n content = content.replace(\n /defineConfig\\({/,\n `defineConfig({\\n secrets: [${secretsArray}],`,\n );\n }\n\n await writeFile(configPath, content, \"utf-8\");\n}\n\nexport default defineCommand({\n meta: {\n name: \"sync\",\n description: \"Sync secrets from Kalp Cloud to local config\",\n },\n async run() {\n const cwd = process.cwd();\n\n p.intro(`${LOGO} ${pc.bold(\"kalp secrets sync\")}`);\n\n // Check authentication\n const token = await getAuthToken();\n if (!token) {\n p.log.error(\"Not authenticated. Run 'kalp login' first.\");\n process.exit(1);\n }\n\n const s = p.spinner();\n\n try {\n s.start(\"Fetching secrets from Kalp Cloud\");\n const cloudSecrets = await fetchSecretsFromCloud();\n s.stop(`Found ${pc.cyan(String(cloudSecrets.length))} secrets in cloud`);\n\n if (cloudSecrets.length === 0) {\n p.log.warn(\"No secrets found in Kalp Cloud\");\n\n const shouldClear = await p.confirm({\n message: \"Clear local secrets config?\",\n initialValue: false,\n });\n\n if (p.isCancel(shouldClear) || !shouldClear) {\n p.outro(\"Cancelled\");\n return;\n }\n\n s.start(\"Clearing local secrets\");\n await replaceSecretsInConfig(cwd, []);\n await generateTypes(cwd);\n s.stop(\"Local secrets cleared\");\n p.outro(\"Done\");\n return;\n }\n\n // Show secrets that will be synced\n p.log.info(pc.bold(\"Secrets to sync:\"));\n for (const secret of cloudSecrets) {\n console.log(` ${pc.dim(\"•\")} ${pc.cyan(secret.key)}`);\n }\n\n const confirm = await p.confirm({\n message: `Replace local secrets with ${cloudSecrets.length} secrets from cloud?`,\n initialValue: true,\n });\n\n if (p.isCancel(confirm) || !confirm) {\n p.outro(\"Cancelled\");\n return;\n }\n\n s.start(\"Updating local config\");\n const secretKeys = cloudSecrets.map((s) => s.key);\n await replaceSecretsInConfig(cwd, secretKeys);\n s.stop(\"Config updated\");\n\n s.start(\"Regenerating types\");\n await generateTypes(cwd);\n s.stop(\"Types regenerated\");\n\n p.log.success(pc.green(`Synced ${cloudSecrets.length} secrets`));\n p.outro(\"Done\");\n } catch (error) {\n s.stop(\"Sync failed\");\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":["confirm","s"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kalphq/cli",
|
|
3
|
-
"version": "0.0
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "Zero-config CLI for deploying Kalp agents",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -10,21 +10,21 @@
|
|
|
10
10
|
},
|
|
11
11
|
"main": "./dist/index.js",
|
|
12
12
|
"files": [
|
|
13
|
-
"dist"
|
|
14
|
-
"templates"
|
|
13
|
+
"dist"
|
|
15
14
|
],
|
|
16
15
|
"publishConfig": {
|
|
17
16
|
"access": "public"
|
|
18
17
|
},
|
|
19
18
|
"dependencies": {
|
|
20
|
-
"@
|
|
21
|
-
"
|
|
22
|
-
"
|
|
23
|
-
"
|
|
24
|
-
"
|
|
25
|
-
"
|
|
26
|
-
"
|
|
27
|
-
"@kalphq/
|
|
19
|
+
"@antfu/ni": "24.4.0",
|
|
20
|
+
"@clack/prompts": "0.9.1",
|
|
21
|
+
"citty": "0.1.6",
|
|
22
|
+
"esbuild": "0.25.0",
|
|
23
|
+
"picocolors": "1.1.1",
|
|
24
|
+
"zod": "3.25.76",
|
|
25
|
+
"@kalphq/project": "0.1.1",
|
|
26
|
+
"@kalphq/compiler": "0.1.0",
|
|
27
|
+
"@kalphq/sdk": "0.3.0"
|
|
28
28
|
},
|
|
29
29
|
"devDependencies": {
|
|
30
30
|
"@types/node": "^22.15.3",
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
package/dist/build-ZMN2247N.js
DELETED
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
// src/commands/build.ts
|
|
4
|
-
import { defineCommand } from "citty";
|
|
5
|
-
import * as p from "@clack/prompts";
|
|
6
|
-
import pc from "picocolors";
|
|
7
|
-
import { readFile } from "fs/promises";
|
|
8
|
-
import { resolve as resolve2, relative } from "path";
|
|
9
|
-
import { z } from "zod";
|
|
10
|
-
import * as esbuild from "esbuild";
|
|
11
|
-
|
|
12
|
-
// src/commands/utils.ts
|
|
13
|
-
import { readdir, stat } from "fs/promises";
|
|
14
|
-
import { resolve, dirname } from "path";
|
|
15
|
-
async function glob(pattern) {
|
|
16
|
-
const dir = dirname(dirname(pattern));
|
|
17
|
-
const filename = pattern.split("/").pop() ?? pattern.split("\\").pop() ?? "";
|
|
18
|
-
const results = [];
|
|
19
|
-
try {
|
|
20
|
-
const entries = await readdir(dir, { withFileTypes: true });
|
|
21
|
-
for (const entry of entries) {
|
|
22
|
-
if (!entry.isDirectory()) continue;
|
|
23
|
-
const candidate = resolve(dir, entry.name, filename);
|
|
24
|
-
try {
|
|
25
|
-
const s = await stat(candidate);
|
|
26
|
-
if (s.isFile()) results.push(candidate);
|
|
27
|
-
} catch {
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
} catch {
|
|
31
|
-
}
|
|
32
|
-
return results;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
// src/commands/build.ts
|
|
36
|
-
var LOGO = "\u{1F98B}";
|
|
37
|
-
var build_default = defineCommand({
|
|
38
|
-
meta: { name: "build", description: "Bundle agents for deployment" },
|
|
39
|
-
async run() {
|
|
40
|
-
await _build();
|
|
41
|
-
}
|
|
42
|
-
});
|
|
43
|
-
var KalpConfigSchema = z.object({
|
|
44
|
-
projectId: z.string().min(1),
|
|
45
|
-
region: z.string().optional(),
|
|
46
|
-
secrets: z.array(z.string()).optional()
|
|
47
|
-
});
|
|
48
|
-
async function _build() {
|
|
49
|
-
p.intro(`${LOGO} ${pc.bold("kalp build")}`);
|
|
50
|
-
const cwd = process.cwd();
|
|
51
|
-
const configPath = resolve2(cwd, "kalp.config.ts");
|
|
52
|
-
const s = p.spinner();
|
|
53
|
-
s.start("Reading kalp.config.ts");
|
|
54
|
-
let configRaw = "";
|
|
55
|
-
try {
|
|
56
|
-
configRaw = await readFile(configPath, "utf-8");
|
|
57
|
-
} catch {
|
|
58
|
-
s.stop(pc.red("kalp.config.ts not found"));
|
|
59
|
-
p.outro(`${pc.dim("Run")} ${pc.cyan("kalp init")} ${pc.dim("first.")}`);
|
|
60
|
-
process.exit(1);
|
|
61
|
-
}
|
|
62
|
-
const match = configRaw.match(/defineConfig\(\s*(\{[\s\S]*?\})\s*\)/);
|
|
63
|
-
if (!match?.[1]) {
|
|
64
|
-
s.stop(pc.red("Could not parse kalp.config.ts"));
|
|
65
|
-
process.exit(1);
|
|
66
|
-
}
|
|
67
|
-
let parsed;
|
|
68
|
-
try {
|
|
69
|
-
const fn = new Function(`return ${match[1]}`);
|
|
70
|
-
parsed = KalpConfigSchema.parse(fn());
|
|
71
|
-
} catch (err) {
|
|
72
|
-
s.stop(pc.red("Invalid kalp.config.ts"));
|
|
73
|
-
if (err instanceof z.ZodError) {
|
|
74
|
-
for (const issue of err.issues) {
|
|
75
|
-
p.log.error(` ${issue.path.join(".")}: ${issue.message}`);
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
process.exit(1);
|
|
79
|
-
}
|
|
80
|
-
s.stop(`Project ${pc.cyan(parsed.projectId)} validated`);
|
|
81
|
-
s.start("Discovering agents");
|
|
82
|
-
const agentEntries = await glob(resolve2(cwd, "kalp/agents/*/index.ts"));
|
|
83
|
-
if (agentEntries.length === 0) {
|
|
84
|
-
s.stop(pc.yellow("No agents found in kalp/agents/"));
|
|
85
|
-
p.outro(pc.dim("Create an agent first."));
|
|
86
|
-
process.exit(0);
|
|
87
|
-
}
|
|
88
|
-
s.stop(`Found ${pc.cyan(String(agentEntries.length))} agent(s)`);
|
|
89
|
-
s.start("Bundling agents");
|
|
90
|
-
const outdir = resolve2(cwd, "kalp/meta/dist");
|
|
91
|
-
try {
|
|
92
|
-
await esbuild.build({
|
|
93
|
-
entryPoints: agentEntries,
|
|
94
|
-
bundle: true,
|
|
95
|
-
platform: "node",
|
|
96
|
-
target: "es2022",
|
|
97
|
-
format: "esm",
|
|
98
|
-
outdir,
|
|
99
|
-
minify: true,
|
|
100
|
-
treeShaking: true,
|
|
101
|
-
external: ["@kalphq/sdk"],
|
|
102
|
-
logLevel: "silent"
|
|
103
|
-
});
|
|
104
|
-
} catch (err) {
|
|
105
|
-
s.stop(pc.red("Build failed"));
|
|
106
|
-
console.error(err);
|
|
107
|
-
process.exit(1);
|
|
108
|
-
}
|
|
109
|
-
s.stop("Bundle ready");
|
|
110
|
-
const lines = agentEntries.map(
|
|
111
|
-
(e) => ` ${pc.dim("\u2022")} ${pc.cyan(relative(cwd, e))}`
|
|
112
|
-
);
|
|
113
|
-
p.note(lines.join("\n"), "Bundled agents");
|
|
114
|
-
p.outro(
|
|
115
|
-
`${LOGO} ${pc.green("Build complete.")} ${pc.dim(`Output \u2192 kalp/meta/dist/`)}`
|
|
116
|
-
);
|
|
117
|
-
}
|
|
118
|
-
export {
|
|
119
|
-
build_default as default
|
|
120
|
-
};
|
|
121
|
-
//# sourceMappingURL=build-ZMN2247N.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/build.ts","../src/commands/utils.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { readFile } from \"node:fs/promises\";\nimport { resolve, relative } from \"node:path\";\nimport { z } from \"zod\";\nimport * as esbuild from \"esbuild\";\nimport { glob } from \"./utils.js\";\n\nconst LOGO = \"🦋\";\n\nexport default defineCommand({\n meta: { name: \"build\", description: \"Bundle agents for deployment\" },\n async run() {\n await _build();\n },\n});\n\nconst KalpConfigSchema = z.object({\n projectId: z.string().min(1),\n region: z.string().optional(),\n secrets: z.array(z.string()).optional(),\n});\n\nasync function _build(): Promise<void> {\n p.intro(`${LOGO} ${pc.bold(\"kalp build\")}`);\n\n const cwd = process.cwd();\n const configPath = resolve(cwd, \"kalp.config.ts\");\n\n // ── Validate kalp.config.ts ────────────────────────────────────────────\n const s = p.spinner();\n s.start(\"Reading kalp.config.ts\");\n\n let configRaw = \"\";\n try {\n configRaw = await readFile(configPath, \"utf-8\");\n } catch {\n s.stop(pc.red(\"kalp.config.ts not found\"));\n p.outro(`${pc.dim(\"Run\")} ${pc.cyan(\"kalp init\")} ${pc.dim(\"first.\")}`);\n process.exit(1);\n }\n\n // Extract the config object from defineConfig({...}) using a lightweight regex\n const match = configRaw.match(/defineConfig\\(\\s*(\\{[\\s\\S]*?\\})\\s*\\)/);\n if (!match?.[1]) {\n s.stop(pc.red(\"Could not parse kalp.config.ts\"));\n process.exit(1);\n }\n\n let parsed: z.infer<typeof KalpConfigSchema>;\n try {\n // Evaluate the config object (safe: it's the user's own config file)\n const fn = new Function(`return ${match[1]}`);\n parsed = KalpConfigSchema.parse(fn());\n } catch (err) {\n s.stop(pc.red(\"Invalid kalp.config.ts\"));\n if (err instanceof z.ZodError) {\n for (const issue of err.issues) {\n p.log.error(` ${issue.path.join(\".\")}: ${issue.message}`);\n }\n }\n process.exit(1);\n }\n\n s.stop(`Project ${pc.cyan(parsed.projectId)} validated`);\n\n // ── Discover agent entry points ────────────────────────────────────────\n s.start(\"Discovering agents\");\n\n const agentEntries = await glob(resolve(cwd, \"kalp/agents/*/index.ts\"));\n if (agentEntries.length === 0) {\n s.stop(pc.yellow(\"No agents found in kalp/agents/\"));\n p.outro(pc.dim(\"Create an agent first.\"));\n process.exit(0);\n }\n\n s.stop(`Found ${pc.cyan(String(agentEntries.length))} agent(s)`);\n\n // ── Bundle with esbuild ────────────────────────────────────────────────\n s.start(\"Bundling agents\");\n\n const outdir = resolve(cwd, \"kalp/meta/dist\");\n try {\n await esbuild.build({\n entryPoints: agentEntries,\n bundle: true,\n platform: \"node\",\n target: \"es2022\",\n format: \"esm\",\n outdir,\n minify: true,\n treeShaking: true,\n external: [\"@kalphq/sdk\"],\n logLevel: \"silent\",\n });\n } catch (err) {\n s.stop(pc.red(\"Build failed\"));\n console.error(err);\n process.exit(1);\n }\n\n s.stop(\"Bundle ready\");\n\n // ── Summary ────────────────────────────────────────────────────────────\n const lines = agentEntries.map(\n (e: string) => ` ${pc.dim(\"•\")} ${pc.cyan(relative(cwd, e))}`,\n );\n p.note(lines.join(\"\\n\"), \"Bundled agents\");\n\n p.outro(\n `${LOGO} ${pc.green(\"Build complete.\")} ${pc.dim(`Output → kalp/meta/dist/`)}`,\n );\n}\n","import { readdir, stat } from \"node:fs/promises\";\nimport { resolve, dirname } from \"node:path\";\n\n/**\n * Minimal glob for patterns like `some/path/* /index.ts`.\n * Matches one directory level then a fixed filename.\n */\nexport async function glob(pattern: string): Promise<string[]> {\n const dir = dirname(dirname(pattern));\n const filename = pattern.split(\"/\").pop() ?? pattern.split(\"\\\\\").pop() ?? \"\";\n\n const results: string[] = [];\n\n try {\n const entries = await readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n const candidate = resolve(dir, entry.name, filename);\n try {\n const s = await stat(candidate);\n if (s.isFile()) results.push(candidate);\n } catch {\n // file doesn't exist in this subdirectory\n }\n }\n } catch {\n // parent directory doesn't exist\n }\n\n return results;\n}\n"],"mappings":";;;AAAA,SAAS,qBAAqB;AAC9B,YAAY,OAAO;AACnB,OAAO,QAAQ;AACf,SAAS,gBAAgB;AACzB,SAAS,WAAAA,UAAS,gBAAgB;AAClC,SAAS,SAAS;AAClB,YAAY,aAAa;;;ACNzB,SAAS,SAAS,YAAY;AAC9B,SAAS,SAAS,eAAe;AAMjC,eAAsB,KAAK,SAAoC;AAC7D,QAAM,MAAM,QAAQ,QAAQ,OAAO,CAAC;AACpC,QAAM,WAAW,QAAQ,MAAM,GAAG,EAAE,IAAI,KAAK,QAAQ,MAAM,IAAI,EAAE,IAAI,KAAK;AAE1E,QAAM,UAAoB,CAAC;AAE3B,MAAI;AACF,UAAM,UAAU,MAAM,QAAQ,KAAK,EAAE,eAAe,KAAK,CAAC;AAC1D,eAAW,SAAS,SAAS;AAC3B,UAAI,CAAC,MAAM,YAAY,EAAG;AAC1B,YAAM,YAAY,QAAQ,KAAK,MAAM,MAAM,QAAQ;AACnD,UAAI;AACF,cAAM,IAAI,MAAM,KAAK,SAAS;AAC9B,YAAI,EAAE,OAAO,EAAG,SAAQ,KAAK,SAAS;AAAA,MACxC,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF,QAAQ;AAAA,EAER;AAEA,SAAO;AACT;;;ADrBA,IAAM,OAAO;AAEb,IAAO,gBAAQ,cAAc;AAAA,EAC3B,MAAM,EAAE,MAAM,SAAS,aAAa,+BAA+B;AAAA,EACnE,MAAM,MAAM;AACV,UAAM,OAAO;AAAA,EACf;AACF,CAAC;AAED,IAAM,mBAAmB,EAAE,OAAO;AAAA,EAChC,WAAW,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC3B,QAAQ,EAAE,OAAO,EAAE,SAAS;AAAA,EAC5B,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AACxC,CAAC;AAED,eAAe,SAAwB;AACrC,EAAE,QAAM,GAAG,IAAI,IAAI,GAAG,KAAK,YAAY,CAAC,EAAE;AAE1C,QAAM,MAAM,QAAQ,IAAI;AACxB,QAAM,aAAaC,SAAQ,KAAK,gBAAgB;AAGhD,QAAM,IAAM,UAAQ;AACpB,IAAE,MAAM,wBAAwB;AAEhC,MAAI,YAAY;AAChB,MAAI;AACF,gBAAY,MAAM,SAAS,YAAY,OAAO;AAAA,EAChD,QAAQ;AACN,MAAE,KAAK,GAAG,IAAI,0BAA0B,CAAC;AACzC,IAAE,QAAM,GAAG,GAAG,IAAI,KAAK,CAAC,IAAI,GAAG,KAAK,WAAW,CAAC,IAAI,GAAG,IAAI,QAAQ,CAAC,EAAE;AACtE,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,QAAM,QAAQ,UAAU,MAAM,sCAAsC;AACpE,MAAI,CAAC,QAAQ,CAAC,GAAG;AACf,MAAE,KAAK,GAAG,IAAI,gCAAgC,CAAC;AAC/C,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI;AACJ,MAAI;AAEF,UAAM,KAAK,IAAI,SAAS,UAAU,MAAM,CAAC,CAAC,EAAE;AAC5C,aAAS,iBAAiB,MAAM,GAAG,CAAC;AAAA,EACtC,SAAS,KAAK;AACZ,MAAE,KAAK,GAAG,IAAI,wBAAwB,CAAC;AACvC,QAAI,eAAe,EAAE,UAAU;AAC7B,iBAAW,SAAS,IAAI,QAAQ;AAC9B,QAAE,MAAI,MAAM,KAAK,MAAM,KAAK,KAAK,GAAG,CAAC,KAAK,MAAM,OAAO,EAAE;AAAA,MAC3D;AAAA,IACF;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,IAAE,KAAK,WAAW,GAAG,KAAK,OAAO,SAAS,CAAC,YAAY;AAGvD,IAAE,MAAM,oBAAoB;AAE5B,QAAM,eAAe,MAAM,KAAKA,SAAQ,KAAK,wBAAwB,CAAC;AACtE,MAAI,aAAa,WAAW,GAAG;AAC7B,MAAE,KAAK,GAAG,OAAO,iCAAiC,CAAC;AACnD,IAAE,QAAM,GAAG,IAAI,wBAAwB,CAAC;AACxC,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,IAAE,KAAK,SAAS,GAAG,KAAK,OAAO,aAAa,MAAM,CAAC,CAAC,WAAW;AAG/D,IAAE,MAAM,iBAAiB;AAEzB,QAAM,SAASA,SAAQ,KAAK,gBAAgB;AAC5C,MAAI;AACF,UAAc,cAAM;AAAA,MAClB,aAAa;AAAA,MACb,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR;AAAA,MACA,QAAQ;AAAA,MACR,aAAa;AAAA,MACb,UAAU,CAAC,aAAa;AAAA,MACxB,UAAU;AAAA,IACZ,CAAC;AAAA,EACH,SAAS,KAAK;AACZ,MAAE,KAAK,GAAG,IAAI,cAAc,CAAC;AAC7B,YAAQ,MAAM,GAAG;AACjB,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,IAAE,KAAK,cAAc;AAGrB,QAAM,QAAQ,aAAa;AAAA,IACzB,CAAC,MAAc,KAAK,GAAG,IAAI,QAAG,CAAC,IAAI,GAAG,KAAK,SAAS,KAAK,CAAC,CAAC,CAAC;AAAA,EAC9D;AACA,EAAE,OAAK,MAAM,KAAK,IAAI,GAAG,gBAAgB;AAEzC,EAAE;AAAA,IACA,GAAG,IAAI,IAAI,GAAG,MAAM,iBAAiB,CAAC,IAAI,GAAG,IAAI,+BAA0B,CAAC;AAAA,EAC9E;AACF;","names":["resolve","resolve"]}
|
package/dist/chunk-BO2MEQKM.js
DELETED
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
// src/templates/index.ts
|
|
4
|
-
var TEMPLATES = [
|
|
5
|
-
{
|
|
6
|
-
id: "customer-support",
|
|
7
|
-
label: "Customer Support",
|
|
8
|
-
hint: "ticket routing, escalation, knowledge base",
|
|
9
|
-
secrets: ["OPENAI_API_KEY"]
|
|
10
|
-
},
|
|
11
|
-
{
|
|
12
|
-
id: "b2b-sales",
|
|
13
|
-
label: "B2B Sales Outreach",
|
|
14
|
-
hint: "CRM enrichment, lead scoring",
|
|
15
|
-
secrets: ["OPENAI_API_KEY", "CRM_API_KEY"]
|
|
16
|
-
},
|
|
17
|
-
{
|
|
18
|
-
id: "financial-agent",
|
|
19
|
-
label: "Financial Agent",
|
|
20
|
-
hint: "market signals, portfolio analysis",
|
|
21
|
-
secrets: ["OPENAI_API_KEY", "MARKET_DATA_API_KEY"]
|
|
22
|
-
},
|
|
23
|
-
{
|
|
24
|
-
id: "minimal",
|
|
25
|
-
label: "Minimal Skeleton",
|
|
26
|
-
hint: "bare structure, start from scratch",
|
|
27
|
-
secrets: []
|
|
28
|
-
}
|
|
29
|
-
];
|
|
30
|
-
function getTemplateMeta(id) {
|
|
31
|
-
return TEMPLATES.find((t) => t.id === id);
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
// src/scaffold.ts
|
|
35
|
-
import { writeFile, readFile, readdir, cp } from "fs/promises";
|
|
36
|
-
import { fileURLToPath } from "url";
|
|
37
|
-
import { join, dirname } from "path";
|
|
38
|
-
var __filename = fileURLToPath(import.meta.url);
|
|
39
|
-
var __dirname = dirname(__filename);
|
|
40
|
-
var TEMPLATES_DIR = join(__dirname, "..", "templates");
|
|
41
|
-
async function replacePlaceholders(dir, map) {
|
|
42
|
-
const entries = await readdir(dir, { withFileTypes: true });
|
|
43
|
-
for (const entry of entries) {
|
|
44
|
-
const fp = join(dir, entry.name);
|
|
45
|
-
if (entry.isDirectory()) {
|
|
46
|
-
await replacePlaceholders(fp, map);
|
|
47
|
-
} else if (entry.isFile() && entry.name !== ".gitkeep") {
|
|
48
|
-
try {
|
|
49
|
-
let src = await readFile(fp, "utf-8");
|
|
50
|
-
let changed = false;
|
|
51
|
-
for (const [from, to] of Object.entries(map)) {
|
|
52
|
-
if (src.includes(from)) {
|
|
53
|
-
src = src.replaceAll(from, to);
|
|
54
|
-
changed = true;
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
if (changed) await writeFile(fp, src, "utf-8");
|
|
58
|
-
} catch {
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
async function scaffoldProject(opts) {
|
|
64
|
-
const { projectName, cwd } = opts;
|
|
65
|
-
const kalpConfig = `import { defineConfig } from "@kalphq/sdk";
|
|
66
|
-
|
|
67
|
-
export default defineConfig({
|
|
68
|
-
projectId: "${projectName}",
|
|
69
|
-
secrets: [],
|
|
70
|
-
});
|
|
71
|
-
`;
|
|
72
|
-
await writeFile(join(cwd, "kalp.config.ts"), kalpConfig, "utf-8");
|
|
73
|
-
const kalpDir = join(cwd, "kalp");
|
|
74
|
-
await cp(join(TEMPLATES_DIR, "project"), kalpDir, {
|
|
75
|
-
recursive: true,
|
|
76
|
-
force: true
|
|
77
|
-
});
|
|
78
|
-
await replacePlaceholders(kalpDir, { __PROJECT_NAME__: projectName });
|
|
79
|
-
const gitignorePath = join(cwd, ".gitignore");
|
|
80
|
-
let existing = "";
|
|
81
|
-
try {
|
|
82
|
-
existing = await readFile(gitignorePath, "utf-8");
|
|
83
|
-
} catch {
|
|
84
|
-
}
|
|
85
|
-
const entries = ["kalp/meta/", ".env", "node_modules/", "dist/"];
|
|
86
|
-
const toAdd = entries.filter((e) => !existing.includes(e));
|
|
87
|
-
if (toAdd.length > 0) {
|
|
88
|
-
const appended = existing ? existing.trimEnd() + "\n" + toAdd.join("\n") + "\n" : toAdd.join("\n") + "\n";
|
|
89
|
-
await writeFile(gitignorePath, appended, "utf-8");
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
async function scaffoldAgent(opts) {
|
|
93
|
-
const { agentName, templateId, cwd } = opts;
|
|
94
|
-
const meta = getTemplateMeta(templateId);
|
|
95
|
-
const agentDir = join(cwd, "kalp", "agents", agentName);
|
|
96
|
-
await cp(join(TEMPLATES_DIR, "agents", templateId), agentDir, {
|
|
97
|
-
recursive: true,
|
|
98
|
-
force: true
|
|
99
|
-
});
|
|
100
|
-
await replacePlaceholders(agentDir, { __AGENT_NAME__: agentName });
|
|
101
|
-
if (meta.secrets.length > 0) {
|
|
102
|
-
const envPath = join(cwd, ".env");
|
|
103
|
-
let envExisting = "";
|
|
104
|
-
try {
|
|
105
|
-
envExisting = await readFile(envPath, "utf-8");
|
|
106
|
-
} catch {
|
|
107
|
-
}
|
|
108
|
-
const toAdd = meta.secrets.filter((s) => !envExisting.includes(s)).map((s) => `${s}=`).join("\n");
|
|
109
|
-
if (toAdd) {
|
|
110
|
-
const content = envExisting ? envExisting.trimEnd() + "\n" + toAdd + "\n" : toAdd + "\n";
|
|
111
|
-
await writeFile(envPath, content, "utf-8");
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
export {
|
|
117
|
-
TEMPLATES,
|
|
118
|
-
scaffoldProject,
|
|
119
|
-
scaffoldAgent
|
|
120
|
-
};
|
|
121
|
-
//# sourceMappingURL=chunk-BO2MEQKM.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/templates/index.ts","../src/scaffold.ts"],"sourcesContent":["export type TemplateId =\n | \"customer-support\"\n | \"b2b-sales\"\n | \"financial-agent\"\n | \"minimal\";\n\nexport interface TemplateMeta {\n id: TemplateId;\n label: string;\n hint: string;\n secrets: string[];\n}\n\nexport const TEMPLATES: TemplateMeta[] = [\n {\n id: \"customer-support\",\n label: \"Customer Support\",\n hint: \"ticket routing, escalation, knowledge base\",\n secrets: [\"OPENAI_API_KEY\"],\n },\n {\n id: \"b2b-sales\",\n label: \"B2B Sales Outreach\",\n hint: \"CRM enrichment, lead scoring\",\n secrets: [\"OPENAI_API_KEY\", \"CRM_API_KEY\"],\n },\n {\n id: \"financial-agent\",\n label: \"Financial Agent\",\n hint: \"market signals, portfolio analysis\",\n secrets: [\"OPENAI_API_KEY\", \"MARKET_DATA_API_KEY\"],\n },\n {\n id: \"minimal\",\n label: \"Minimal Skeleton\",\n hint: \"bare structure, start from scratch\",\n secrets: [],\n },\n];\n\nexport function getTemplateMeta(id: TemplateId): TemplateMeta {\n return TEMPLATES.find((t) => t.id === id)!;\n}\n","import { writeFile, readFile, readdir, cp } from \"node:fs/promises\";\nimport { fileURLToPath } from \"node:url\";\nimport { join, dirname } from \"node:path\";\nimport { getTemplateMeta, type TemplateId } from \"./templates/index.js\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\nexport const TEMPLATES_DIR = join(__dirname, \"..\", \"templates\");\n\nasync function replacePlaceholders(\n dir: string,\n map: Record<string, string>,\n): Promise<void> {\n const entries = await readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n const fp = join(dir, entry.name);\n if (entry.isDirectory()) {\n await replacePlaceholders(fp, map);\n } else if (entry.isFile() && entry.name !== \".gitkeep\") {\n try {\n let src = await readFile(fp, \"utf-8\");\n let changed = false;\n for (const [from, to] of Object.entries(map)) {\n if (src.includes(from)) {\n src = src.replaceAll(from, to);\n changed = true;\n }\n }\n if (changed) await writeFile(fp, src, \"utf-8\");\n } catch {\n // binary file — skip\n }\n }\n }\n}\n\nexport async function scaffoldProject(opts: {\n projectName: string;\n cwd: string;\n}): Promise<void> {\n const { projectName, cwd } = opts;\n\n // ── kalp.config.ts at root ─────────────────────────────────────────────\n const kalpConfig = `import { defineConfig } from \"@kalphq/sdk\";\n\nexport default defineConfig({\n projectId: \"${projectName}\",\n secrets: [],\n});\n`;\n await writeFile(join(cwd, \"kalp.config.ts\"), kalpConfig, \"utf-8\");\n\n // ── kalp/ sub-package via fs.cp ───────────────────────────────────────\n const kalpDir = join(cwd, \"kalp\");\n await cp(join(TEMPLATES_DIR, \"project\"), kalpDir, {\n recursive: true,\n force: true,\n });\n await replacePlaceholders(kalpDir, { __PROJECT_NAME__: projectName });\n\n // ── Root .gitignore ────────────────────────────────────────────────────\n const gitignorePath = join(cwd, \".gitignore\");\n let existing = \"\";\n try {\n existing = await readFile(gitignorePath, \"utf-8\");\n } catch {\n // doesn't exist yet\n }\n const entries = [\"kalp/meta/\", \".env\", \"node_modules/\", \"dist/\"];\n const toAdd = entries.filter((e) => !existing.includes(e));\n if (toAdd.length > 0) {\n const appended = existing\n ? existing.trimEnd() + \"\\n\" + toAdd.join(\"\\n\") + \"\\n\"\n : toAdd.join(\"\\n\") + \"\\n\";\n await writeFile(gitignorePath, appended, \"utf-8\");\n }\n}\n\nexport async function scaffoldAgent(opts: {\n agentName: string;\n templateId: TemplateId;\n cwd: string;\n}): Promise<void> {\n const { agentName, templateId, cwd } = opts;\n const meta = getTemplateMeta(templateId);\n const agentDir = join(cwd, \"kalp\", \"agents\", agentName);\n\n // ── Agent files via fs.cp ─────────────────────────────────────────────\n await cp(join(TEMPLATES_DIR, \"agents\", templateId), agentDir, {\n recursive: true,\n force: true,\n });\n await replacePlaceholders(agentDir, { __AGENT_NAME__: agentName });\n\n // ── .env at root (append missing secrets) ─────────────────────────────\n if (meta.secrets.length > 0) {\n const envPath = join(cwd, \".env\");\n let envExisting = \"\";\n try {\n envExisting = await readFile(envPath, \"utf-8\");\n } catch {\n // doesn't exist yet\n }\n const toAdd = meta.secrets\n .filter((s) => !envExisting.includes(s))\n .map((s) => `${s}=`)\n .join(\"\\n\");\n if (toAdd) {\n const content = envExisting\n ? envExisting.trimEnd() + \"\\n\" + toAdd + \"\\n\"\n : toAdd + \"\\n\";\n await writeFile(envPath, content, \"utf-8\");\n }\n }\n}\n"],"mappings":"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","names":[]}
|
package/dist/create-ZNKKOQLH.js
DELETED
|
@@ -1,118 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
3
|
-
TEMPLATES,
|
|
4
|
-
scaffoldAgent,
|
|
5
|
-
scaffoldProject
|
|
6
|
-
} from "./chunk-BO2MEQKM.js";
|
|
7
|
-
|
|
8
|
-
// src/commands/create.ts
|
|
9
|
-
import { join } from "path";
|
|
10
|
-
import { access } from "fs/promises";
|
|
11
|
-
import { defineCommand } from "citty";
|
|
12
|
-
import * as p from "@clack/prompts";
|
|
13
|
-
import pc from "picocolors";
|
|
14
|
-
import { installDependencies, detectPackageManager } from "nypm";
|
|
15
|
-
var LOGO = "\u{1F98B}";
|
|
16
|
-
var create_default = defineCommand({
|
|
17
|
-
meta: { name: "create", description: "Add a new agent to the project" },
|
|
18
|
-
async run() {
|
|
19
|
-
const cwd = process.cwd();
|
|
20
|
-
p.intro(`${LOGO} ${pc.bold("kalp create")}`);
|
|
21
|
-
let needsInit = false;
|
|
22
|
-
try {
|
|
23
|
-
await access(join(cwd, "kalp.config.ts"));
|
|
24
|
-
} catch {
|
|
25
|
-
needsInit = true;
|
|
26
|
-
}
|
|
27
|
-
let projectName;
|
|
28
|
-
if (needsInit) {
|
|
29
|
-
p.log.warn(
|
|
30
|
-
`No ${pc.cyan("kalp.config.ts")} found \u2014 initializing project first.`
|
|
31
|
-
);
|
|
32
|
-
const initAnswers = await p.group(
|
|
33
|
-
{
|
|
34
|
-
name: () => p.text({
|
|
35
|
-
message: "Project name?",
|
|
36
|
-
placeholder: "my-project",
|
|
37
|
-
validate: (v) => {
|
|
38
|
-
if (!v.trim()) return "Project name is required.";
|
|
39
|
-
if (!/^[a-z0-9-]+$/.test(v))
|
|
40
|
-
return "Use lowercase letters, numbers, and dashes only.";
|
|
41
|
-
}
|
|
42
|
-
})
|
|
43
|
-
},
|
|
44
|
-
{
|
|
45
|
-
onCancel: () => {
|
|
46
|
-
p.cancel("Cancelled.");
|
|
47
|
-
process.exit(0);
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
);
|
|
51
|
-
projectName = initAnswers.name;
|
|
52
|
-
}
|
|
53
|
-
const agentAnswers = await p.group(
|
|
54
|
-
{
|
|
55
|
-
name: () => p.text({
|
|
56
|
-
message: "Agent name?",
|
|
57
|
-
placeholder: "my-agent",
|
|
58
|
-
validate: (v) => {
|
|
59
|
-
if (!v.trim()) return "Agent name is required.";
|
|
60
|
-
if (!/^[a-z0-9-]+$/.test(v))
|
|
61
|
-
return "Use lowercase letters, numbers, and dashes only.";
|
|
62
|
-
}
|
|
63
|
-
}),
|
|
64
|
-
template: () => p.select({
|
|
65
|
-
message: "Choose a template",
|
|
66
|
-
options: TEMPLATES.map((t) => ({
|
|
67
|
-
value: t.id,
|
|
68
|
-
label: t.label,
|
|
69
|
-
hint: pc.dim(t.hint)
|
|
70
|
-
}))
|
|
71
|
-
})
|
|
72
|
-
},
|
|
73
|
-
{
|
|
74
|
-
onCancel: () => {
|
|
75
|
-
p.cancel("Cancelled.");
|
|
76
|
-
process.exit(0);
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
);
|
|
80
|
-
const s = p.spinner();
|
|
81
|
-
if (needsInit && projectName) {
|
|
82
|
-
s.start("Creating project structure");
|
|
83
|
-
await scaffoldProject({ projectName, cwd });
|
|
84
|
-
s.stop("Project structure created");
|
|
85
|
-
const pm = await detectPackageManager(cwd);
|
|
86
|
-
const pmName = pm?.name ?? "npm";
|
|
87
|
-
s.start(`Installing dependencies ${pc.dim(`(${pmName} install)`)}`);
|
|
88
|
-
try {
|
|
89
|
-
await installDependencies({ cwd: join(cwd, "kalp"), silent: true });
|
|
90
|
-
s.stop("Dependencies installed");
|
|
91
|
-
} catch {
|
|
92
|
-
s.stop(pc.yellow("Install skipped \u2014 run manually inside kalp/"));
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
s.start(`Scaffolding agent ${pc.cyan(agentAnswers.name)}`);
|
|
96
|
-
await scaffoldAgent({
|
|
97
|
-
agentName: agentAnswers.name,
|
|
98
|
-
templateId: agentAnswers.template,
|
|
99
|
-
cwd
|
|
100
|
-
});
|
|
101
|
-
s.stop("Agent created");
|
|
102
|
-
p.note(
|
|
103
|
-
[
|
|
104
|
-
`${pc.dim("\u2022")} ${pc.cyan(`kalp/agents/${agentAnswers.name}/index.ts`)}`,
|
|
105
|
-
`${pc.dim("\u2022")} ${pc.cyan(`kalp/agents/${agentAnswers.name}/steps/`)}`,
|
|
106
|
-
`${pc.dim("\u2022")} ${pc.cyan(`kalp/agents/${agentAnswers.name}/tools/`)}`
|
|
107
|
-
].join("\n"),
|
|
108
|
-
"Created"
|
|
109
|
-
);
|
|
110
|
-
p.outro(
|
|
111
|
-
`${LOGO} ${pc.green(`Agent ${pc.bold(agentAnswers.name)} is ready.`)}`
|
|
112
|
-
);
|
|
113
|
-
}
|
|
114
|
-
});
|
|
115
|
-
export {
|
|
116
|
-
create_default as default
|
|
117
|
-
};
|
|
118
|
-
//# sourceMappingURL=create-ZNKKOQLH.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/create.ts"],"sourcesContent":["import { join } from \"node:path\";\nimport { access } from \"node:fs/promises\";\nimport { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { installDependencies, detectPackageManager } from \"nypm\";\nimport { scaffoldProject, scaffoldAgent } from \"../scaffold.js\";\nimport { TEMPLATES, type TemplateId } from \"../templates/index.js\";\n\nconst LOGO = \"🦋\";\n\nexport default defineCommand({\n meta: { name: \"create\", description: \"Add a new agent to the project\" },\n async run() {\n const cwd = process.cwd();\n\n p.intro(`${LOGO} ${pc.bold(\"kalp create\")}`);\n\n // ── Check if project is initialized ─────────────────────────────────\n let needsInit = false;\n try {\n await access(join(cwd, \"kalp.config.ts\"));\n } catch {\n needsInit = true;\n }\n\n // ── Init phase (inline — one unified timeline) ───────────────────────\n let projectName: string | undefined;\n if (needsInit) {\n p.log.warn(\n `No ${pc.cyan(\"kalp.config.ts\")} found — initializing project first.`,\n );\n\n const initAnswers = await p.group(\n {\n name: () =>\n p.text({\n message: \"Project name?\",\n placeholder: \"my-project\",\n validate: (v) => {\n if (!v.trim()) return \"Project name is required.\";\n if (!/^[a-z0-9-]+$/.test(v))\n return \"Use lowercase letters, numbers, and dashes only.\";\n },\n }),\n },\n {\n onCancel: () => {\n p.cancel(\"Cancelled.\");\n process.exit(0);\n },\n },\n );\n\n projectName = initAnswers.name;\n }\n\n // ── Agent prompts ────────────────────────────────────────────────────\n const agentAnswers = await p.group(\n {\n name: () =>\n p.text({\n message: \"Agent name?\",\n placeholder: \"my-agent\",\n validate: (v) => {\n if (!v.trim()) return \"Agent name is required.\";\n if (!/^[a-z0-9-]+$/.test(v))\n return \"Use lowercase letters, numbers, and dashes only.\";\n },\n }),\n template: () =>\n p.select<TemplateId>({\n message: \"Choose a template\",\n options: TEMPLATES.map((t) => ({\n value: t.id,\n label: t.label,\n hint: pc.dim(t.hint),\n })),\n }),\n },\n {\n onCancel: () => {\n p.cancel(\"Cancelled.\");\n process.exit(0);\n },\n },\n );\n\n const s = p.spinner();\n\n // ── Scaffold project if needed ───────────────────────────────────────\n if (needsInit && projectName) {\n s.start(\"Creating project structure\");\n await scaffoldProject({ projectName, cwd });\n s.stop(\"Project structure created\");\n\n const pm = await detectPackageManager(cwd);\n const pmName = pm?.name ?? \"npm\";\n s.start(`Installing dependencies ${pc.dim(`(${pmName} install)`)}`);\n try {\n await installDependencies({ cwd: join(cwd, \"kalp\"), silent: true });\n s.stop(\"Dependencies installed\");\n } catch {\n s.stop(pc.yellow(\"Install skipped — run manually inside kalp/\"));\n }\n }\n\n // ── Scaffold agent ───────────────────────────────────────────────────\n s.start(`Scaffolding agent ${pc.cyan(agentAnswers.name)}`);\n await scaffoldAgent({\n agentName: agentAnswers.name,\n templateId: agentAnswers.template as TemplateId,\n cwd,\n });\n s.stop(\"Agent created\");\n\n p.note(\n [\n `${pc.dim(\"•\")} ${pc.cyan(`kalp/agents/${agentAnswers.name}/index.ts`)}`,\n `${pc.dim(\"•\")} ${pc.cyan(`kalp/agents/${agentAnswers.name}/steps/`)}`,\n `${pc.dim(\"•\")} ${pc.cyan(`kalp/agents/${agentAnswers.name}/tools/`)}`,\n ].join(\"\\n\"),\n \"Created\",\n );\n\n p.outro(\n `${LOGO} ${pc.green(`Agent ${pc.bold(agentAnswers.name)} is ready.`)}`,\n );\n },\n});\n"],"mappings":"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","names":[]}
|
package/dist/init-7FSWWKI5.js
DELETED
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
3
|
-
scaffoldProject
|
|
4
|
-
} from "./chunk-BO2MEQKM.js";
|
|
5
|
-
|
|
6
|
-
// src/commands/init.ts
|
|
7
|
-
import { join } from "path";
|
|
8
|
-
import { access } from "fs/promises";
|
|
9
|
-
import { defineCommand } from "citty";
|
|
10
|
-
import * as p from "@clack/prompts";
|
|
11
|
-
import pc from "picocolors";
|
|
12
|
-
var LOGO = "\u{1F98B}";
|
|
13
|
-
var init_default = defineCommand({
|
|
14
|
-
meta: { name: "init", description: "Scaffold a new Kalp project" },
|
|
15
|
-
async run() {
|
|
16
|
-
const cwd = process.cwd();
|
|
17
|
-
p.intro(`${LOGO} ${pc.bold("kalp init")}`);
|
|
18
|
-
try {
|
|
19
|
-
await access(join(cwd, "kalp.config.ts"));
|
|
20
|
-
p.log.error(
|
|
21
|
-
`${pc.cyan("kalp.config.ts")} already exists. Run ${pc.cyan("kalp create")} to add an agent.`
|
|
22
|
-
);
|
|
23
|
-
process.exit(1);
|
|
24
|
-
} catch {
|
|
25
|
-
}
|
|
26
|
-
const answers = await p.group(
|
|
27
|
-
{
|
|
28
|
-
name: () => p.text({
|
|
29
|
-
message: "What is the name of your project?",
|
|
30
|
-
placeholder: "my-project",
|
|
31
|
-
validate: (v) => {
|
|
32
|
-
if (!v.trim()) return "Project name is required.";
|
|
33
|
-
if (!/^[a-z0-9-]+$/.test(v))
|
|
34
|
-
return "Use lowercase letters, numbers, and dashes only.";
|
|
35
|
-
}
|
|
36
|
-
})
|
|
37
|
-
},
|
|
38
|
-
{
|
|
39
|
-
onCancel: () => {
|
|
40
|
-
p.cancel("Setup cancelled.");
|
|
41
|
-
process.exit(0);
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
);
|
|
45
|
-
const s = p.spinner();
|
|
46
|
-
s.start("Creating project structure");
|
|
47
|
-
await scaffoldProject({ projectName: answers.name, cwd });
|
|
48
|
-
s.stop("Project structure created");
|
|
49
|
-
p.note(
|
|
50
|
-
[
|
|
51
|
-
`${pc.dim("\u2022")} ${pc.cyan("kalp.config.ts")} ${pc.dim("\u2014 project config")}`,
|
|
52
|
-
`${pc.dim("\u2022")} ${pc.cyan("kalp/")} ${pc.dim("\u2014 agents sub-package")}`,
|
|
53
|
-
``,
|
|
54
|
-
`${pc.dim("Next steps:")}`,
|
|
55
|
-
` ${pc.cyan("cd kalp && npm install")}`,
|
|
56
|
-
` ${pc.cyan("kalp create")} ${pc.dim("\u2014 add your first agent")}`
|
|
57
|
-
].join("\n"),
|
|
58
|
-
"Created"
|
|
59
|
-
);
|
|
60
|
-
p.outro(`${LOGO} ${pc.green("Project initialized.")}`);
|
|
61
|
-
}
|
|
62
|
-
});
|
|
63
|
-
export {
|
|
64
|
-
init_default as default
|
|
65
|
-
};
|
|
66
|
-
//# sourceMappingURL=init-7FSWWKI5.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/init.ts"],"sourcesContent":["import { join } from \"node:path\";\nimport { access } from \"node:fs/promises\";\nimport { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { scaffoldProject } from \"../scaffold.js\";\n\nconst LOGO = \"🦋\";\n\nexport default defineCommand({\n meta: { name: \"init\", description: \"Scaffold a new Kalp project\" },\n async run() {\n const cwd = process.cwd();\n\n p.intro(`${LOGO} ${pc.bold(\"kalp init\")}`);\n\n // ── Guard: already initialized ───────────────────────────────────────\n try {\n await access(join(cwd, \"kalp.config.ts\"));\n p.log.error(\n `${pc.cyan(\"kalp.config.ts\")} already exists. Run ${pc.cyan(\"kalp create\")} to add an agent.`,\n );\n process.exit(1);\n } catch {\n // expected: file doesn't exist yet\n }\n\n const answers = await p.group(\n {\n name: () =>\n p.text({\n message: \"What is the name of your project?\",\n placeholder: \"my-project\",\n validate: (v) => {\n if (!v.trim()) return \"Project name is required.\";\n if (!/^[a-z0-9-]+$/.test(v))\n return \"Use lowercase letters, numbers, and dashes only.\";\n },\n }),\n },\n {\n onCancel: () => {\n p.cancel(\"Setup cancelled.\");\n process.exit(0);\n },\n },\n );\n\n const s = p.spinner();\n s.start(\"Creating project structure\");\n await scaffoldProject({ projectName: answers.name, cwd });\n s.stop(\"Project structure created\");\n\n p.note(\n [\n `${pc.dim(\"•\")} ${pc.cyan(\"kalp.config.ts\")} ${pc.dim(\"— project config\")}`,\n `${pc.dim(\"•\")} ${pc.cyan(\"kalp/\")} ${pc.dim(\"— agents sub-package\")}`,\n ``,\n `${pc.dim(\"Next steps:\")}`,\n ` ${pc.cyan(\"cd kalp && npm install\")}`,\n ` ${pc.cyan(\"kalp create\")} ${pc.dim(\"— add your first agent\")}`,\n ].join(\"\\n\"),\n \"Created\",\n );\n\n p.outro(`${LOGO} ${pc.green(\"Project initialized.\")}`);\n },\n});\n"],"mappings":";;;;;;AAAA,SAAS,YAAY;AACrB,SAAS,cAAc;AACvB,SAAS,qBAAqB;AAC9B,YAAY,OAAO;AACnB,OAAO,QAAQ;AAGf,IAAM,OAAO;AAEb,IAAO,eAAQ,cAAc;AAAA,EAC3B,MAAM,EAAE,MAAM,QAAQ,aAAa,8BAA8B;AAAA,EACjE,MAAM,MAAM;AACV,UAAM,MAAM,QAAQ,IAAI;AAExB,IAAE,QAAM,GAAG,IAAI,IAAI,GAAG,KAAK,WAAW,CAAC,EAAE;AAGzC,QAAI;AACF,YAAM,OAAO,KAAK,KAAK,gBAAgB,CAAC;AACxC,MAAE,MAAI;AAAA,QACJ,GAAG,GAAG,KAAK,gBAAgB,CAAC,wBAAwB,GAAG,KAAK,aAAa,CAAC;AAAA,MAC5E;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB,QAAQ;AAAA,IAER;AAEA,UAAM,UAAU,MAAQ;AAAA,MACtB;AAAA,QACE,MAAM,MACF,OAAK;AAAA,UACL,SAAS;AAAA,UACT,aAAa;AAAA,UACb,UAAU,CAAC,MAAM;AACf,gBAAI,CAAC,EAAE,KAAK,EAAG,QAAO;AACtB,gBAAI,CAAC,eAAe,KAAK,CAAC;AACxB,qBAAO;AAAA,UACX;AAAA,QACF,CAAC;AAAA,MACL;AAAA,MACA;AAAA,QACE,UAAU,MAAM;AACd,UAAE,SAAO,kBAAkB;AAC3B,kBAAQ,KAAK,CAAC;AAAA,QAChB;AAAA,MACF;AAAA,IACF;AAEA,UAAM,IAAM,UAAQ;AACpB,MAAE,MAAM,4BAA4B;AACpC,UAAM,gBAAgB,EAAE,aAAa,QAAQ,MAAM,IAAI,CAAC;AACxD,MAAE,KAAK,2BAA2B;AAElC,IAAE;AAAA,MACA;AAAA,QACE,GAAG,GAAG,IAAI,QAAG,CAAC,IAAI,GAAG,KAAK,gBAAgB,CAAC,IAAI,GAAG,IAAI,uBAAkB,CAAC;AAAA,QACzE,GAAG,GAAG,IAAI,QAAG,CAAC,IAAI,GAAG,KAAK,OAAO,CAAC,IAAI,GAAG,IAAI,2BAAsB,CAAC;AAAA,QACpE;AAAA,QACA,GAAG,GAAG,IAAI,aAAa,CAAC;AAAA,QACxB,KAAK,GAAG,KAAK,wBAAwB,CAAC;AAAA,QACtC,KAAK,GAAG,KAAK,aAAa,CAAC,IAAI,GAAG,IAAI,6BAAwB,CAAC;AAAA,MACjE,EAAE,KAAK,IAAI;AAAA,MACX;AAAA,IACF;AAEA,IAAE,QAAM,GAAG,IAAI,IAAI,GAAG,MAAM,sBAAsB,CAAC,EAAE;AAAA,EACvD;AACF,CAAC;","names":[]}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import { asAgentId, defineAgent } from "@kalphq/sdk";
|
|
2
|
-
import { scoreLead } from "./steps/score-lead.js";
|
|
3
|
-
import { enrichCompany } from "./tools/enrich-company.js";
|
|
4
|
-
|
|
5
|
-
export default defineAgent({
|
|
6
|
-
id: asAgentId("__AGENT_NAME__"),
|
|
7
|
-
name: "__AGENT_NAME__",
|
|
8
|
-
description: "Automates B2B outreach with lead scoring and CRM enrichment.",
|
|
9
|
-
steps: [scoreLead],
|
|
10
|
-
tools: [enrichCompany],
|
|
11
|
-
|
|
12
|
-
systemPrompt:
|
|
13
|
-
"You are a B2B sales assistant. Score leads, enrich company data, and draft personalized outreach messages.",
|
|
14
|
-
|
|
15
|
-
async onMessage(message, ctx) {
|
|
16
|
-
const lead = await ctx.runStep(scoreLead, { company: message.text });
|
|
17
|
-
|
|
18
|
-
if (lead.score < 50) {
|
|
19
|
-
return { text: "Lead score too low — skipping outreach." };
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
const enriched = await ctx.callTool(enrichCompany, { domain: lead.domain });
|
|
23
|
-
|
|
24
|
-
return {
|
|
25
|
-
text: `${enriched.companyName} (${lead.score}/100) — Ready for outreach.`,
|
|
26
|
-
};
|
|
27
|
-
},
|
|
28
|
-
});
|
|
File without changes
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import { createStep } from "@kalphq/sdk";
|
|
2
|
-
import { z } from "zod";
|
|
3
|
-
|
|
4
|
-
export const scoreLead = createStep({
|
|
5
|
-
id: "score_lead",
|
|
6
|
-
description: "Scores a B2B lead based on company signals.",
|
|
7
|
-
input: z.object({ company: z.string() }),
|
|
8
|
-
output: z.object({
|
|
9
|
-
score: z.number().min(0).max(100),
|
|
10
|
-
domain: z.string(),
|
|
11
|
-
reason: z.string(),
|
|
12
|
-
}),
|
|
13
|
-
async run({ company }, ctx) {
|
|
14
|
-
const result = await ctx.ai.generateObject({
|
|
15
|
-
prompt: `Score this B2B lead for "${company}". Provide a score 0-100, the company domain, and a brief reason.`,
|
|
16
|
-
schema: z.object({
|
|
17
|
-
score: z.number().min(0).max(100),
|
|
18
|
-
domain: z.string(),
|
|
19
|
-
reason: z.string(),
|
|
20
|
-
}),
|
|
21
|
-
});
|
|
22
|
-
return result;
|
|
23
|
-
},
|
|
24
|
-
});
|