@kalphq/cli 0.0.0-dev-20260420003114 → 0.0.0-dev-20260420023057
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-5NOYFTJV.js +133 -0
- package/dist/add-5NOYFTJV.js.map +1 -0
- package/dist/{manifest-LKYALPCB.js → build-SUIPVJO6.js} +18 -20
- package/dist/build-SUIPVJO6.js.map +1 -0
- package/dist/chunk-6LLXGS2P.js +25 -0
- package/dist/chunk-6LLXGS2P.js.map +1 -0
- package/dist/{chunk-INMLAVHJ.js → chunk-CJCIZDCF.js} +105 -24
- package/dist/chunk-CJCIZDCF.js.map +1 -0
- package/dist/{chunk-DOHVZBJO.js → chunk-HD5FT7T6.js} +43 -5
- package/dist/chunk-HD5FT7T6.js.map +1 -0
- package/dist/{create-LCVZRFEF.js → create-RSQEKCI6.js} +5 -8
- package/dist/{create-LCVZRFEF.js.map → create-RSQEKCI6.js.map} +1 -1
- package/dist/delete-ZJB2JGAL.js +136 -0
- package/dist/delete-ZJB2JGAL.js.map +1 -0
- package/dist/index.js +7 -7
- package/dist/index.js.map +1 -1
- package/dist/{init-VMOFA2AV.js → init-CUBJEWPE.js} +3 -5
- package/dist/init-CUBJEWPE.js.map +1 -0
- package/dist/list-BOE33VSI.js +120 -0
- package/dist/list-BOE33VSI.js.map +1 -0
- package/dist/{push-RUUHE6RW.js → push-L3BXB6OC.js} +13 -15
- package/dist/push-L3BXB6OC.js.map +1 -0
- package/dist/secrets-3SKCSAGD.js +33 -0
- package/dist/secrets-3SKCSAGD.js.map +1 -0
- package/package.json +2 -2
- package/dist/chunk-DOHVZBJO.js.map +0 -1
- package/dist/chunk-INMLAVHJ.js.map +0 -1
- package/dist/init-VMOFA2AV.js.map +0 -1
- package/dist/manifest-LKYALPCB.js.map +0 -1
- package/dist/push-RUUHE6RW.js.map +0 -1
- package/dist/skill-IGGMF5GR.js +0 -346
- package/dist/skill-IGGMF5GR.js.map +0 -1
- package/templates/project/agents/.gitkeep +0 -0
- package/templates/project/meta/manifests/.gitkeep +0 -1
- package/templates/project/meta/skills/.gitkeep +0 -1
- package/templates/project/meta/skills/applied.json +0 -4
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/manifest.ts"],"sourcesContent":["import { createHash } from \"node:crypto\";\nimport { existsSync } from \"node:fs\";\nimport { access, mkdtemp, mkdir, readFile, readdir, rm, writeFile } from \"node:fs/promises\";\nimport { join, resolve } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { build } from \"esbuild\";\nimport type { ZodTypeAny } from \"zod\";\nimport { zodToJsonSchema } from \"zod-to-json-schema\";\n\nexport interface AgentManifestV1 {\n format: \"kalp-agent-manifest\";\n schemaVersion: 1;\n generatedAt: string;\n agent: {\n id?: string;\n name: string;\n description: string;\n systemPrompt:\n | { type: \"static\"; value: string }\n | { type: \"dynamic\" }\n | { type: \"none\" };\n lifecycle: {\n onInit: boolean;\n onMessage: boolean;\n onTick: boolean;\n };\n steps: Array<{\n id: string;\n description: string;\n inputSchema: Record<string, unknown> | null;\n outputSchema: Record<string, unknown> | null;\n }>;\n tools: Array<{\n id: string;\n description: string;\n inputSchema: Record<string, unknown> | null;\n }>;\n routes: Array<{\n id: string;\n method: string;\n path: string;\n inputSchema: Record<string, unknown> | null;\n }>;\n flows: Array<{\n id: string;\n description: string;\n steps: string[];\n }>;\n };\n}\n\nexport interface ManifestVersionRecord {\n version: number;\n versionId: string;\n previousVersionId: string | null;\n hash: string;\n generatedAt: string;\n manifest: AgentManifestV1;\n}\n\ninterface LoadedAgentModule {\n agent: unknown;\n tempDir: string;\n}\n\ninterface AgentItemWithInput {\n id?: unknown;\n description?: unknown;\n input?: unknown;\n}\n\ninterface AgentStepItem extends AgentItemWithInput {\n output?: unknown;\n}\n\ninterface AgentRouteItem extends AgentItemWithInput {\n method?: unknown;\n path?: unknown;\n}\n\ninterface AgentFlowItem {\n id?: unknown;\n description?: unknown;\n steps?: unknown;\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> {\n return typeof value === \"object\" && value !== null\n ? (value as Record<string, unknown>)\n : {};\n}\n\nfunction asString(value: unknown): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction asArray(value: unknown): unknown[] {\n return Array.isArray(value) ? value : [];\n}\n\nfunction toJsonSchema(schema: unknown, name: string): Record<string, unknown> | null {\n try {\n return zodToJsonSchema(schema as ZodTypeAny, name) as Record<string, unknown>;\n } catch {\n return null;\n }\n}\n\nfunction serializeSystemPrompt(\n systemPrompt: unknown,\n): AgentManifestV1[\"agent\"][\"systemPrompt\"] {\n if (typeof systemPrompt === \"string\") {\n return { type: \"static\", value: systemPrompt };\n }\n\n if (typeof systemPrompt === \"function\") {\n return { type: \"dynamic\" };\n }\n\n return { type: \"none\" };\n}\n\nfunction serializeSteps(steps: unknown[]): AgentManifestV1[\"agent\"][\"steps\"] {\n return steps.map((step, index) => {\n const item = asRecord(step) as AgentStepItem;\n return {\n id: asString(item.id) ?? `step_${index + 1}`,\n description: asString(item.description) ?? \"\",\n inputSchema: toJsonSchema(item.input, `step_${index + 1}_input`),\n outputSchema: toJsonSchema(item.output, `step_${index + 1}_output`),\n };\n });\n}\n\nfunction serializeTools(tools: unknown[]): AgentManifestV1[\"agent\"][\"tools\"] {\n return tools.map((tool, index) => {\n const item = asRecord(tool) as AgentItemWithInput;\n return {\n id: asString(item.id) ?? `tool_${index + 1}`,\n description: asString(item.description) ?? \"\",\n inputSchema: toJsonSchema(item.input, `tool_${index + 1}_input`),\n };\n });\n}\n\nfunction serializeRoutes(routes: unknown[]): AgentManifestV1[\"agent\"][\"routes\"] {\n return routes.map((route, index) => {\n const item = asRecord(route) as AgentRouteItem;\n return {\n id: asString(item.id) ?? `route_${index + 1}`,\n method: asString(item.method) ?? \"GET\",\n path: asString(item.path) ?? \"/\",\n inputSchema: toJsonSchema(item.input, `route_${index + 1}_input`),\n };\n });\n}\n\nfunction serializeFlows(flows: unknown[]): AgentManifestV1[\"agent\"][\"flows\"] {\n return flows.map((flow, index) => {\n const item = asRecord(flow) as AgentFlowItem;\n const steps = asArray(item.steps).map((s, stepIndex) => {\n const step = asRecord(s);\n return asString(step.id) ?? `step_${stepIndex + 1}`;\n });\n\n return {\n id: asString(item.id) ?? `flow_${index + 1}`,\n description: asString(item.description) ?? \"\",\n steps,\n };\n });\n}\n\nasync function loadAgentModule(\n agentPath: string,\n cwd: string,\n): Promise<LoadedAgentModule> {\n const tempDir = await mkdtemp(join(cwd, \".kalp-manifest-\"));\n const outFile = join(tempDir, \"agent.manifest.mjs\");\n\n await build({\n entryPoints: [agentPath],\n outfile: outFile,\n bundle: true,\n format: \"esm\",\n platform: \"node\",\n target: \"node18\",\n logLevel: \"silent\",\n packages: \"external\",\n plugins: [\n {\n name: \"relative-js-to-ts\",\n setup(buildCtx) {\n buildCtx.onResolve({ filter: /^\\.+\\/.*\\.js$/ }, (args) => {\n const resolved = resolve(args.resolveDir, args.path);\n if (existsSync(resolved)) {\n return { path: resolved };\n }\n\n const tsPath = resolved.replace(/\\.js$/, \".ts\");\n if (existsSync(tsPath)) {\n return { path: tsPath };\n }\n\n const tsxPath = resolved.replace(/\\.js$/, \".tsx\");\n if (existsSync(tsxPath)) {\n return { path: tsxPath };\n }\n\n return null;\n });\n },\n },\n ],\n });\n\n const loaded = (await import(\n `${pathToFileURL(outFile).href}?t=${Date.now()}`\n )) as { default?: unknown };\n\n return {\n agent: loaded.default,\n tempDir,\n };\n}\n\nexport async function readAgentManifest(params: {\n cwd: string;\n agentName: string;\n}): Promise<AgentManifestV1> {\n const { cwd, agentName } = params;\n const agentPath = join(cwd, \"agents\", agentName, \"index.ts\");\n await access(agentPath);\n\n let tempDir: string | undefined;\n\n try {\n const loaded = await loadAgentModule(agentPath, cwd);\n tempDir = loaded.tempDir;\n const agent = asRecord(loaded.agent);\n\n return {\n format: \"kalp-agent-manifest\",\n schemaVersion: 1,\n generatedAt: new Date().toISOString(),\n agent: {\n id: asString(agent.id),\n name: asString(agent.name) ?? agentName,\n description: asString(agent.description) ?? \"\",\n systemPrompt: serializeSystemPrompt(agent.systemPrompt),\n lifecycle: {\n onInit: typeof agent.onInit === \"function\",\n onMessage: typeof agent.onMessage === \"function\",\n onTick: typeof agent.onTick === \"function\",\n },\n steps: serializeSteps(asArray(agent.steps)),\n tools: serializeTools(asArray(agent.tools)),\n routes: serializeRoutes(asArray(agent.routes)),\n flows: serializeFlows(asArray(agent.flows)),\n },\n };\n } finally {\n if (tempDir) {\n await rm(tempDir, { recursive: true, force: true });\n }\n }\n}\n\nfunction getHash(payload: string): string {\n return createHash(\"sha256\").update(payload).digest(\"hex\");\n}\n\nfunction parseVersionFromFileName(fileName: string): number | null {\n const match = /^v(\\d{4})\\.json$/.exec(fileName);\n return match ? Number(match[1]) : null;\n}\n\nexport async function writeVersionedManifest(params: {\n cwd: string;\n agentName: string;\n manifest: AgentManifestV1;\n}): Promise<ManifestVersionRecord & { outputPath: string }> {\n const { cwd, agentName, manifest } = params;\n const agentMetaDir = join(cwd, \"meta\", \"manifests\", agentName);\n await mkdir(agentMetaDir, { recursive: true });\n\n const files = await readdir(agentMetaDir);\n const versions = files\n .map(parseVersionFromFileName)\n .filter((v): v is number => v !== null)\n .sort((a, b) => a - b);\n\n const latestVersion = versions.at(-1) ?? 0;\n const nextVersion = latestVersion + 1;\n const versionId = `v${String(nextVersion).padStart(4, \"0\")}`;\n const previousVersionId =\n latestVersion > 0 ? `v${String(latestVersion).padStart(4, \"0\")}` : null;\n\n const payload = JSON.stringify(manifest);\n const record: ManifestVersionRecord = {\n version: nextVersion,\n versionId,\n previousVersionId,\n hash: getHash(payload),\n generatedAt: new Date().toISOString(),\n manifest,\n };\n\n const versionFile = join(agentMetaDir, `${versionId}.json`);\n await writeFile(versionFile, JSON.stringify(record, null, 2) + \"\\n\", \"utf-8\");\n await writeFile(\n join(agentMetaDir, \"latest.json\"),\n JSON.stringify(record, null, 2) + \"\\n\",\n \"utf-8\",\n );\n\n const registryPath = join(cwd, \"meta\", \"manifest-registry.json\");\n const registry = await readManifestRegistry(registryPath);\n registry[agentName] = {\n latestVersion: record.version,\n latestVersionId: record.versionId,\n updatedAt: record.generatedAt,\n };\n await writeFile(registryPath, JSON.stringify(registry, null, 2) + \"\\n\", \"utf-8\");\n\n return {\n ...record,\n outputPath: versionFile,\n };\n}\n\nasync function readManifestRegistry(\n registryPath: string,\n): Promise<\n Record<\n string,\n {\n latestVersion: number;\n latestVersionId: string;\n updatedAt: string;\n }\n >\n> {\n try {\n const src = await readFile(registryPath, \"utf-8\");\n return JSON.parse(src) as Record<\n string,\n {\n latestVersion: number;\n latestVersionId: string;\n updatedAt: string;\n }\n >;\n } catch {\n return {};\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/init.ts"],"sourcesContent":["import { resolve, basename } from \"node:path\";\nimport { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { scaffoldProject } from \"../scaffold.js\";\nimport { promptProjectName } from \"../utils/ui.js\";\nimport {\n ensureDirectory,\n installDeps,\n isProjectInitialized,\n} from \"../utils/fs.js\";\n\nconst LOGO = \"🦋\";\n\nexport default defineCommand({\n meta: { name: \"init\", description: \"Scaffold a new Kalp project\" },\n async run() {\n const cwd = process.cwd();\n\n p.intro(`${LOGO} ${pc.bold(\"kalp init\")}`);\n\n const projectInputName = await promptProjectName({\n message: \"What is the name of your project?\",\n placeholder: \"my-agent\",\n allowCurrentDir: true,\n });\n\n const isCurrentDir = projectInputName === \".\";\n const targetDir = isCurrentDir ? cwd : resolve(cwd, projectInputName);\n const projectName = isCurrentDir ? basename(cwd) : projectInputName;\n\n // ── Guard: already initialized ───────────────────────────────────────\n if (await isProjectInitialized(targetDir)) {\n p.log.error(\n `${pc.cyan(\"kalp.config.ts\")} already exists in this directory. Run ${pc.cyan(\"kalp create\")} to add an agent.`,\n );\n process.exit(1);\n }\n\n // ── Create target directory if needed ─────────────────────────────────\n if (!isCurrentDir) {\n await ensureDirectory(targetDir);\n }\n\n const s = p.spinner();\n\n s.start(\"Creating project structure\");\n await scaffoldProject({ projectName, targetDir });\n s.stop(\"Project structure created\");\n\n s.start(\"Installing dependencies\");\n try {\n await installDeps(targetDir);\n s.stop(\"Dependencies installed\");\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n s.stop(pc.yellow(\"Install failed\"));\n p.log.warn(\n `Run ${pc.cyan(\"npx --no-install nci\")} (or ${pc.cyan(\"npm install\")}) manually in ${isCurrentDir ? \"this directory\" : projectInputName + \"/\"}`,\n );\n p.log.info(pc.dim(msg.split(\"\\n\")[0] ?? \"Unknown error\"));\n }\n\n p.log.success(\"Project scaffolded\");\n p.log.info(`${pc.cyan(\"kalp.config.ts\")} — project config`);\n p.log.info(`${pc.cyan(\"package.json\")} — dependencies`);\n p.log.info(`${pc.cyan(\"agents/\")} — your agents live here`);\n console.log(\"\");\n p.log.info(pc.bold(\"Next\"));\n if (!isCurrentDir) {\n p.log.info(`1. ${pc.cyan(`cd ${projectInputName}`)}`);\n p.log.info(`2. ${pc.cyan(\"kalp create\")} — add your first agent`);\n } else {\n p.log.info(`1. ${pc.cyan(\"kalp create\")} — add your first agent`);\n }\n\n p.outro(pc.green(\"Kalp initialized successfully.\"));\n },\n});\n"],"mappings":";;;;;;;;;;;;;AAAA,SAAS,SAAS,gBAAgB;AAClC,SAAS,qBAAqB;AAC9B,YAAY,OAAO;AACnB,OAAO,QAAQ;AASf,IAAM,OAAO;AAEb,IAAO,eAAQ,cAAc;AAAA,EAC3B,MAAM,EAAE,MAAM,QAAQ,aAAa,8BAA8B;AAAA,EACjE,MAAM,MAAM;AACV,UAAM,MAAM,QAAQ,IAAI;AAExB,IAAE,QAAM,GAAG,IAAI,IAAI,GAAG,KAAK,WAAW,CAAC,EAAE;AAEzC,UAAM,mBAAmB,MAAM,kBAAkB;AAAA,MAC/C,SAAS;AAAA,MACT,aAAa;AAAA,MACb,iBAAiB;AAAA,IACnB,CAAC;AAED,UAAM,eAAe,qBAAqB;AAC1C,UAAM,YAAY,eAAe,MAAM,QAAQ,KAAK,gBAAgB;AACpE,UAAM,cAAc,eAAe,SAAS,GAAG,IAAI;AAGnD,QAAI,MAAM,qBAAqB,SAAS,GAAG;AACzC,MAAE,MAAI;AAAA,QACJ,GAAG,GAAG,KAAK,gBAAgB,CAAC,0CAA0C,GAAG,KAAK,aAAa,CAAC;AAAA,MAC9F;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAGA,QAAI,CAAC,cAAc;AACjB,YAAM,gBAAgB,SAAS;AAAA,IACjC;AAEA,UAAM,IAAM,UAAQ;AAEpB,MAAE,MAAM,4BAA4B;AACpC,UAAM,gBAAgB,EAAE,aAAa,UAAU,CAAC;AAChD,MAAE,KAAK,2BAA2B;AAElC,MAAE,MAAM,yBAAyB;AACjC,QAAI;AACF,YAAM,YAAY,SAAS;AAC3B,QAAE,KAAK,wBAAwB;AAAA,IACjC,SAAS,KAAK;AACZ,YAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC3D,QAAE,KAAK,GAAG,OAAO,gBAAgB,CAAC;AAClC,MAAE,MAAI;AAAA,QACJ,OAAO,GAAG,KAAK,sBAAsB,CAAC,QAAQ,GAAG,KAAK,aAAa,CAAC,iBAAiB,eAAe,mBAAmB,mBAAmB,GAAG;AAAA,MAC/I;AACA,MAAE,MAAI,KAAK,GAAG,IAAI,IAAI,MAAM,IAAI,EAAE,CAAC,KAAK,eAAe,CAAC;AAAA,IAC1D;AAEA,IAAE,MAAI,QAAQ,oBAAoB;AAClC,IAAE,MAAI,KAAK,GAAG,GAAG,KAAK,gBAAgB,CAAC,wBAAmB;AAC1D,IAAE,MAAI,KAAK,GAAG,GAAG,KAAK,cAAc,CAAC,sBAAiB;AACtD,IAAE,MAAI,KAAK,GAAG,GAAG,KAAK,SAAS,CAAC,+BAA0B;AAC1D,YAAQ,IAAI,EAAE;AACd,IAAE,MAAI,KAAK,GAAG,KAAK,MAAM,CAAC;AAC1B,QAAI,CAAC,cAAc;AACjB,MAAE,MAAI,KAAK,MAAM,GAAG,KAAK,MAAM,gBAAgB,EAAE,CAAC,EAAE;AACpD,MAAE,MAAI,KAAK,MAAM,GAAG,KAAK,aAAa,CAAC,8BAAyB;AAAA,IAClE,OAAO;AACL,MAAE,MAAI,KAAK,MAAM,GAAG,KAAK,aAAa,CAAC,8BAAyB;AAAA,IAClE;AAEA,IAAE,QAAM,GAAG,MAAM,gCAAgC,CAAC;AAAA,EACpD;AACF,CAAC;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/manifest.ts"],"sourcesContent":["import { access } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { ensureConfig } from \"../utils/fs.js\";\nimport { readAgentManifest, writeVersionedManifest } from \"../utils/manifest.js\";\n\nconst LOGO = \"🦋\";\n\nexport default defineCommand({\n meta: {\n name: \"manifest\",\n description: \"Generate a versioned JSON manifest for an agent\",\n },\n args: {\n agent: {\n type: \"string\",\n alias: \"a\",\n description: \"Agent name\",\n required: false,\n },\n },\n async run({ args }) {\n const cwd = process.cwd();\n\n p.intro(`${LOGO} ${pc.bold(\"kalp manifest\")}`);\n\n const agentName = args.agent;\n if (!agentName) {\n p.log.error(`Missing required flag ${pc.cyan(\"-a <agent-name>\")}`);\n p.outro(pc.dim(`Example: ${pc.cyan(\"kalp manifest -a my-agent\")}`));\n process.exit(1);\n }\n\n try {\n await ensureConfig(cwd);\n } catch {\n p.log.error(`${pc.cyan(\"kalp.config.ts\")} not found`);\n p.outro(pc.dim(`Run ${pc.cyan(\"kalp init\")} first.`));\n process.exit(1);\n }\n\n const agentPath = join(cwd, \"agents\", agentName, \"index.ts\");\n try {\n await access(agentPath);\n } catch {\n p.log.error(\n `Agent ${pc.cyan(agentName)} not found at ${pc.cyan(`agents/${agentName}/index.ts`)}`,\n );\n process.exit(1);\n }\n\n const s = p.spinner();\n s.start(`Generating manifest for ${pc.cyan(agentName)}`);\n\n try {\n const manifest = await readAgentManifest({ cwd, agentName });\n const version = await writeVersionedManifest({ cwd, agentName, manifest });\n\n s.stop(`Manifest ${pc.cyan(version.versionId)} generated`);\n\n console.log(\"\\n\" + pc.dim(\"─\".repeat(50)));\n console.log(pc.cyan(\"Agent Manifest (JSON):\"));\n console.log(pc.dim(\"─\".repeat(50)));\n console.log(JSON.stringify(version, null, 2));\n console.log(pc.dim(\"─\".repeat(50)) + \"\\n\");\n p.log.info(`${pc.cyan(\"Saved\")}: ${version.outputPath}`);\n\n p.outro(\n `${LOGO} ${pc.green(\"Manifest ready\")} ${pc.dim(\"— versioned in meta/manifests\")}`,\n );\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n s.stop(pc.red(\"Could not generate agent manifest\"));\n p.log.info(pc.dim(msg.split(\"\\n\")[0] ?? \"Unknown error\"));\n process.exit(1);\n }\n },\n});\n"],"mappings":";;;;;;;;;;;AAAA,SAAS,cAAc;AACvB,SAAS,YAAY;AACrB,SAAS,qBAAqB;AAC9B,YAAY,OAAO;AACnB,OAAO,QAAQ;AAIf,IAAM,OAAO;AAEb,IAAO,mBAAQ,cAAc;AAAA,EAC3B,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA,MAAM;AAAA,IACJ,OAAO;AAAA,MACL,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,EACF;AAAA,EACA,MAAM,IAAI,EAAE,KAAK,GAAG;AAClB,UAAM,MAAM,QAAQ,IAAI;AAExB,IAAE,QAAM,GAAG,IAAI,IAAI,GAAG,KAAK,eAAe,CAAC,EAAE;AAE7C,UAAM,YAAY,KAAK;AACvB,QAAI,CAAC,WAAW;AACd,MAAE,MAAI,MAAM,yBAAyB,GAAG,KAAK,iBAAiB,CAAC,EAAE;AACjE,MAAE,QAAM,GAAG,IAAI,YAAY,GAAG,KAAK,2BAA2B,CAAC,EAAE,CAAC;AAClE,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,QAAI;AACF,YAAM,aAAa,GAAG;AAAA,IACxB,QAAQ;AACN,MAAE,MAAI,MAAM,GAAG,GAAG,KAAK,gBAAgB,CAAC,YAAY;AACpD,MAAE,QAAM,GAAG,IAAI,OAAO,GAAG,KAAK,WAAW,CAAC,SAAS,CAAC;AACpD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,YAAY,KAAK,KAAK,UAAU,WAAW,UAAU;AAC3D,QAAI;AACF,YAAM,OAAO,SAAS;AAAA,IACxB,QAAQ;AACN,MAAE,MAAI;AAAA,QACJ,SAAS,GAAG,KAAK,SAAS,CAAC,iBAAiB,GAAG,KAAK,UAAU,SAAS,WAAW,CAAC;AAAA,MACrF;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,IAAM,UAAQ;AACpB,MAAE,MAAM,2BAA2B,GAAG,KAAK,SAAS,CAAC,EAAE;AAEvD,QAAI;AACF,YAAM,WAAW,MAAM,kBAAkB,EAAE,KAAK,UAAU,CAAC;AAC3D,YAAM,UAAU,MAAM,uBAAuB,EAAE,KAAK,WAAW,SAAS,CAAC;AAEzE,QAAE,KAAK,YAAY,GAAG,KAAK,QAAQ,SAAS,CAAC,YAAY;AAEzD,cAAQ,IAAI,OAAO,GAAG,IAAI,SAAI,OAAO,EAAE,CAAC,CAAC;AACzC,cAAQ,IAAI,GAAG,KAAK,wBAAwB,CAAC;AAC7C,cAAQ,IAAI,GAAG,IAAI,SAAI,OAAO,EAAE,CAAC,CAAC;AAClC,cAAQ,IAAI,KAAK,UAAU,SAAS,MAAM,CAAC,CAAC;AAC5C,cAAQ,IAAI,GAAG,IAAI,SAAI,OAAO,EAAE,CAAC,IAAI,IAAI;AACzC,MAAE,MAAI,KAAK,GAAG,GAAG,KAAK,OAAO,CAAC,KAAK,QAAQ,UAAU,EAAE;AAEvD,MAAE;AAAA,QACA,GAAG,IAAI,IAAI,GAAG,MAAM,gBAAgB,CAAC,IAAI,GAAG,IAAI,oCAA+B,CAAC;AAAA,MAClF;AAAA,IACF,SAAS,KAAK;AACZ,YAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC3D,QAAE,KAAK,GAAG,IAAI,mCAAmC,CAAC;AAClD,MAAE,MAAI,KAAK,GAAG,IAAI,IAAI,MAAM,IAAI,EAAE,CAAC,KAAK,eAAe,CAAC;AACxD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AACF,CAAC;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/push.ts"],"sourcesContent":["import { access } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { ensureConfig } from \"../utils/fs.js\";\nimport {\n readAgentManifest,\n writeVersionedManifest,\n} from \"../utils/manifest.js\";\n\nconst LOGO = \"🦋\";\n\nexport default defineCommand({\n meta: { name: \"push\", description: \"Push an agent to Kalp (preview mode)\" },\n args: {\n agent: {\n type: \"string\",\n alias: \"a\",\n description: \"Agent name to push\",\n required: false,\n },\n },\n async run({ args }) {\n const cwd = process.cwd();\n\n p.intro(`${LOGO} ${pc.bold(\"kalp push\")}`);\n\n // ── Validate agent name ─────────────────────────────────────────────────\n const agentName = args.agent;\n if (!agentName) {\n p.log.error(`Missing required flag ${pc.cyan(\"-a <agent-name>\")}`);\n p.outro(pc.dim(`Example: ${pc.cyan(\"kalp push -a my-agent\")}`));\n process.exit(1);\n }\n\n // ── Validate kalp.config.ts exists ─────────────────────────────────────\n try {\n await ensureConfig(cwd);\n } catch {\n p.log.error(`${pc.cyan(\"kalp.config.ts\")} not found`);\n p.outro(pc.dim(`Run ${pc.cyan(\"kalp init\")} first.`));\n process.exit(1);\n }\n\n // ── Find agent ──────────────────────────────────────────────────────────\n const agentPath = join(cwd, \"agents\", agentName, \"index.ts\");\n try {\n await access(agentPath);\n } catch {\n p.log.error(\n `Agent ${pc.cyan(agentName)} not found at ${pc.cyan(`agents/${agentName}/index.ts`)}`,\n );\n process.exit(1);\n }\n\n const s = p.spinner();\n s.start(`Generating manifest for ${pc.cyan(agentName)}`);\n\n let manifest;\n let version;\n\n try {\n manifest = await readAgentManifest({ cwd, agentName });\n version = await writeVersionedManifest({ cwd, agentName, manifest });\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n s.stop(pc.red(\"Could not generate agent manifest\"));\n p.log.info(pc.dim(msg.split(\"\\n\")[0] ?? \"Unknown error\"));\n process.exit(1);\n }\n\n s.stop(`Manifest ${pc.cyan(version.versionId)} generated`);\n\n // ── Output JSON ─────────────────────────────────────────────────────────\n console.log(\"\\n\" + pc.dim(\"─\".repeat(50)));\n console.log(pc.cyan(\"Agent Manifest (JSON):\"));\n console.log(pc.dim(\"─\".repeat(50)));\n console.log(JSON.stringify(version, null, 2));\n console.log(pc.dim(\"─\".repeat(50)) + \"\\n\");\n p.log.info(`${pc.cyan(\"Saved\")}: ${version.outputPath}`);\n\n p.outro(\n `${LOGO} ${pc.green(\"Manifest ready\")} ${pc.dim(\"— versioned in meta/manifests\")}`,\n );\n },\n});\n"],"mappings":";;;;;;;;;;;AAAA,SAAS,cAAc;AACvB,SAAS,YAAY;AACrB,SAAS,qBAAqB;AAC9B,YAAY,OAAO;AACnB,OAAO,QAAQ;AAOf,IAAM,OAAO;AAEb,IAAO,eAAQ,cAAc;AAAA,EAC3B,MAAM,EAAE,MAAM,QAAQ,aAAa,uCAAuC;AAAA,EAC1E,MAAM;AAAA,IACJ,OAAO;AAAA,MACL,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,EACF;AAAA,EACA,MAAM,IAAI,EAAE,KAAK,GAAG;AAClB,UAAM,MAAM,QAAQ,IAAI;AAExB,IAAE,QAAM,GAAG,IAAI,IAAI,GAAG,KAAK,WAAW,CAAC,EAAE;AAGzC,UAAM,YAAY,KAAK;AACvB,QAAI,CAAC,WAAW;AACd,MAAE,MAAI,MAAM,yBAAyB,GAAG,KAAK,iBAAiB,CAAC,EAAE;AACjE,MAAE,QAAM,GAAG,IAAI,YAAY,GAAG,KAAK,uBAAuB,CAAC,EAAE,CAAC;AAC9D,cAAQ,KAAK,CAAC;AAAA,IAChB;AAGA,QAAI;AACF,YAAM,aAAa,GAAG;AAAA,IACxB,QAAQ;AACN,MAAE,MAAI,MAAM,GAAG,GAAG,KAAK,gBAAgB,CAAC,YAAY;AACpD,MAAE,QAAM,GAAG,IAAI,OAAO,GAAG,KAAK,WAAW,CAAC,SAAS,CAAC;AACpD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAGA,UAAM,YAAY,KAAK,KAAK,UAAU,WAAW,UAAU;AAC3D,QAAI;AACF,YAAM,OAAO,SAAS;AAAA,IACxB,QAAQ;AACN,MAAE,MAAI;AAAA,QACJ,SAAS,GAAG,KAAK,SAAS,CAAC,iBAAiB,GAAG,KAAK,UAAU,SAAS,WAAW,CAAC;AAAA,MACrF;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,IAAM,UAAQ;AACpB,MAAE,MAAM,2BAA2B,GAAG,KAAK,SAAS,CAAC,EAAE;AAEvD,QAAI;AACJ,QAAI;AAEJ,QAAI;AACF,iBAAW,MAAM,kBAAkB,EAAE,KAAK,UAAU,CAAC;AACrD,gBAAU,MAAM,uBAAuB,EAAE,KAAK,WAAW,SAAS,CAAC;AAAA,IACrE,SAAS,KAAK;AACZ,YAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC3D,QAAE,KAAK,GAAG,IAAI,mCAAmC,CAAC;AAClD,MAAE,MAAI,KAAK,GAAG,IAAI,IAAI,MAAM,IAAI,EAAE,CAAC,KAAK,eAAe,CAAC;AACxD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,MAAE,KAAK,YAAY,GAAG,KAAK,QAAQ,SAAS,CAAC,YAAY;AAGzD,YAAQ,IAAI,OAAO,GAAG,IAAI,SAAI,OAAO,EAAE,CAAC,CAAC;AACzC,YAAQ,IAAI,GAAG,KAAK,wBAAwB,CAAC;AAC7C,YAAQ,IAAI,GAAG,IAAI,SAAI,OAAO,EAAE,CAAC,CAAC;AAClC,YAAQ,IAAI,KAAK,UAAU,SAAS,MAAM,CAAC,CAAC;AAC5C,YAAQ,IAAI,GAAG,IAAI,SAAI,OAAO,EAAE,CAAC,IAAI,IAAI;AACzC,IAAE,MAAI,KAAK,GAAG,GAAG,KAAK,OAAO,CAAC,KAAK,QAAQ,UAAU,EAAE;AAEvD,IAAE;AAAA,MACA,GAAG,IAAI,IAAI,GAAG,MAAM,gBAAgB,CAAC,IAAI,GAAG,IAAI,oCAA+B,CAAC;AAAA,IAClF;AAAA,EACF;AACF,CAAC;","names":[]}
|
package/dist/skill-IGGMF5GR.js
DELETED
|
@@ -1,346 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
3
|
-
ensureConfig
|
|
4
|
-
} from "./chunk-Q455HC3P.js";
|
|
5
|
-
import "./chunk-2H7UOFLK.js";
|
|
6
|
-
|
|
7
|
-
// src/commands/skill.ts
|
|
8
|
-
import { defineCommand } from "citty";
|
|
9
|
-
import * as p from "@clack/prompts";
|
|
10
|
-
import pc from "picocolors";
|
|
11
|
-
|
|
12
|
-
// src/skills/index.ts
|
|
13
|
-
var chatCoreStep = [
|
|
14
|
-
'import { createStep } from "@kalphq/sdk";',
|
|
15
|
-
'import { z } from "zod";',
|
|
16
|
-
"",
|
|
17
|
-
"export const draftResponse = createStep({",
|
|
18
|
-
' id: "draft_response",',
|
|
19
|
-
' description: "Generates a high-quality response draft from user input.",',
|
|
20
|
-
" input: z.object({",
|
|
21
|
-
" message: z.string(),",
|
|
22
|
-
' tone: z.string().default("helpful"),',
|
|
23
|
-
" }),",
|
|
24
|
-
" output: z.object({",
|
|
25
|
-
" reply: z.string(),",
|
|
26
|
-
" }),",
|
|
27
|
-
" async run({ message, tone }) {",
|
|
28
|
-
" return {",
|
|
29
|
-
" reply: `[${tone}] ${message}`,",
|
|
30
|
-
" };",
|
|
31
|
-
" },",
|
|
32
|
-
"});",
|
|
33
|
-
""
|
|
34
|
-
].join("\n");
|
|
35
|
-
var autonomousLoopStep = [
|
|
36
|
-
'import { createStep } from "@kalphq/sdk";',
|
|
37
|
-
'import { z } from "zod";',
|
|
38
|
-
"",
|
|
39
|
-
"export const planNextAction = createStep({",
|
|
40
|
-
' id: "plan_next_action",',
|
|
41
|
-
' description: "Builds the next actionable task for autonomous execution.",',
|
|
42
|
-
" input: z.object({",
|
|
43
|
-
" objective: z.string(),",
|
|
44
|
-
" lastResult: z.string().optional(),",
|
|
45
|
-
" }),",
|
|
46
|
-
" output: z.object({",
|
|
47
|
-
" action: z.string(),",
|
|
48
|
-
" reason: z.string(),",
|
|
49
|
-
" }),",
|
|
50
|
-
" async run({ objective, lastResult }) {",
|
|
51
|
-
" return {",
|
|
52
|
-
" action: `Continue objective: ${objective}`,",
|
|
53
|
-
' reason: lastResult ? `Using previous result: ${lastResult}` : "Initial planning",',
|
|
54
|
-
" };",
|
|
55
|
-
" },",
|
|
56
|
-
"});",
|
|
57
|
-
""
|
|
58
|
-
].join("\n");
|
|
59
|
-
var memoryNotesTool = [
|
|
60
|
-
'import { createTool } from "@kalphq/sdk";',
|
|
61
|
-
'import { z } from "zod";',
|
|
62
|
-
"",
|
|
63
|
-
"export const saveNote = createTool({",
|
|
64
|
-
' id: "save_note",',
|
|
65
|
-
' description: "Persists a note in agent key-value storage.",',
|
|
66
|
-
" input: z.object({",
|
|
67
|
-
" key: z.string(),",
|
|
68
|
-
" value: z.string(),",
|
|
69
|
-
" }),",
|
|
70
|
-
" async execute({ key, value }, ctx) {",
|
|
71
|
-
" await ctx.storage.put(key, { value, savedAt: new Date().toISOString() });",
|
|
72
|
-
" return { saved: true, key };",
|
|
73
|
-
" },",
|
|
74
|
-
"});",
|
|
75
|
-
""
|
|
76
|
-
].join("\n");
|
|
77
|
-
var SKILLS = [
|
|
78
|
-
{
|
|
79
|
-
id: "chat-core",
|
|
80
|
-
label: "Chat Core",
|
|
81
|
-
description: "Adds structured message intake and response drafting primitives.",
|
|
82
|
-
files: (agent) => [
|
|
83
|
-
{
|
|
84
|
-
path: `agents/${agent}/skills/chat-core/steps/draft-response.ts`,
|
|
85
|
-
content: chatCoreStep
|
|
86
|
-
},
|
|
87
|
-
{
|
|
88
|
-
path: `agents/${agent}/skills/chat-core/index.ts`,
|
|
89
|
-
content: 'export { draftResponse } from "./steps/draft-response.js";\n'
|
|
90
|
-
}
|
|
91
|
-
]
|
|
92
|
-
},
|
|
93
|
-
{
|
|
94
|
-
id: "autonomous-loop",
|
|
95
|
-
label: "Autonomous Loop",
|
|
96
|
-
description: "Adds periodic planning and checkpointing primitives for autonomous agents.",
|
|
97
|
-
files: (agent) => [
|
|
98
|
-
{
|
|
99
|
-
path: `agents/${agent}/skills/autonomous-loop/steps/plan-next-action.ts`,
|
|
100
|
-
content: autonomousLoopStep
|
|
101
|
-
},
|
|
102
|
-
{
|
|
103
|
-
path: `agents/${agent}/skills/autonomous-loop/index.ts`,
|
|
104
|
-
content: 'export { planNextAction } from "./steps/plan-next-action.js";\n'
|
|
105
|
-
}
|
|
106
|
-
]
|
|
107
|
-
},
|
|
108
|
-
{
|
|
109
|
-
id: "memory-notes",
|
|
110
|
-
label: "Memory Notes",
|
|
111
|
-
description: "Adds helper tool for persisting structured notes in runtime storage.",
|
|
112
|
-
files: (agent) => [
|
|
113
|
-
{
|
|
114
|
-
path: `agents/${agent}/skills/memory-notes/tools/save-note.ts`,
|
|
115
|
-
content: memoryNotesTool
|
|
116
|
-
},
|
|
117
|
-
{
|
|
118
|
-
path: `agents/${agent}/skills/memory-notes/index.ts`,
|
|
119
|
-
content: 'export { saveNote } from "./tools/save-note.js";\n'
|
|
120
|
-
}
|
|
121
|
-
]
|
|
122
|
-
}
|
|
123
|
-
];
|
|
124
|
-
function getSkill(skillId) {
|
|
125
|
-
return SKILLS.find((skill) => skill.id === skillId);
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
// src/utils/skills.ts
|
|
129
|
-
import { createHash } from "crypto";
|
|
130
|
-
import { access, mkdir, readFile, writeFile } from "fs/promises";
|
|
131
|
-
import { dirname, join } from "path";
|
|
132
|
-
var EMPTY_STATE = {
|
|
133
|
-
schemaVersion: 1,
|
|
134
|
-
agents: {}
|
|
135
|
-
};
|
|
136
|
-
function hashPayload(value) {
|
|
137
|
-
return createHash("sha256").update(value).digest("hex");
|
|
138
|
-
}
|
|
139
|
-
function statePath(cwd) {
|
|
140
|
-
return join(cwd, "meta", "skills", "applied.json");
|
|
141
|
-
}
|
|
142
|
-
async function ensureAgentExists(cwd, agentName) {
|
|
143
|
-
await access(join(cwd, "agents", agentName, "index.ts"));
|
|
144
|
-
}
|
|
145
|
-
async function readSkillsState(cwd) {
|
|
146
|
-
const path = statePath(cwd);
|
|
147
|
-
try {
|
|
148
|
-
const src = await readFile(path, "utf-8");
|
|
149
|
-
const parsed = JSON.parse(src);
|
|
150
|
-
if (parsed?.schemaVersion !== 1 || typeof parsed.agents !== "object") {
|
|
151
|
-
return EMPTY_STATE;
|
|
152
|
-
}
|
|
153
|
-
return parsed;
|
|
154
|
-
} catch {
|
|
155
|
-
return EMPTY_STATE;
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
async function writeSkillsState(cwd, state) {
|
|
159
|
-
const dir = join(cwd, "meta", "skills");
|
|
160
|
-
await mkdir(dir, { recursive: true });
|
|
161
|
-
await writeFile(
|
|
162
|
-
statePath(cwd),
|
|
163
|
-
JSON.stringify(state, null, 2) + "\n",
|
|
164
|
-
"utf-8"
|
|
165
|
-
);
|
|
166
|
-
}
|
|
167
|
-
async function applySkillToAgent(params) {
|
|
168
|
-
const { cwd, agentName, skill } = params;
|
|
169
|
-
const files = skill.files(agentName);
|
|
170
|
-
for (const file of files) {
|
|
171
|
-
const absolute = join(cwd, file.path);
|
|
172
|
-
await mkdir(dirname(absolute), { recursive: true });
|
|
173
|
-
await writeFile(absolute, file.content, "utf-8");
|
|
174
|
-
}
|
|
175
|
-
const hash = hashPayload(JSON.stringify(files));
|
|
176
|
-
return {
|
|
177
|
-
skillId: skill.id,
|
|
178
|
-
addedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
179
|
-
hash,
|
|
180
|
-
files: files.map((f) => f.path)
|
|
181
|
-
};
|
|
182
|
-
}
|
|
183
|
-
async function recordAppliedSkill(params) {
|
|
184
|
-
const { cwd, agentName, record } = params;
|
|
185
|
-
const state = await readSkillsState(cwd);
|
|
186
|
-
const current = state.agents[agentName] ?? [];
|
|
187
|
-
state.agents[agentName] = [
|
|
188
|
-
...current.filter((entry) => entry.skillId !== record.skillId),
|
|
189
|
-
record
|
|
190
|
-
];
|
|
191
|
-
await writeSkillsState(cwd, state);
|
|
192
|
-
}
|
|
193
|
-
async function doctorSkills(cwd, agentName) {
|
|
194
|
-
const state = await readSkillsState(cwd);
|
|
195
|
-
const agents = agentName ? [agentName] : Object.keys(state.agents);
|
|
196
|
-
const issues = [];
|
|
197
|
-
for (const agent of agents) {
|
|
198
|
-
const records = state.agents[agent] ?? [];
|
|
199
|
-
for (const record of records) {
|
|
200
|
-
const missing = [];
|
|
201
|
-
for (const file of record.files) {
|
|
202
|
-
try {
|
|
203
|
-
await access(join(cwd, file));
|
|
204
|
-
} catch {
|
|
205
|
-
missing.push(file);
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
if (missing.length > 0) {
|
|
209
|
-
issues.push({ agent, skillId: record.skillId, missingFiles: missing });
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
return issues;
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
// src/commands/skill.ts
|
|
217
|
-
var LOGO = "\u{1F98B}";
|
|
218
|
-
function printUsage() {
|
|
219
|
-
p.log.info(pc.bold("Usage"));
|
|
220
|
-
p.log.info(` ${pc.cyan("kalp skill add -a <agent> -s <skill>")}`);
|
|
221
|
-
p.log.info(` ${pc.cyan("kalp skill list [-a <agent>]")}`);
|
|
222
|
-
p.log.info(` ${pc.cyan("kalp skill doctor [-a <agent>]")}`);
|
|
223
|
-
}
|
|
224
|
-
var skill_default = defineCommand({
|
|
225
|
-
meta: { name: "skill", description: "Manage reusable DSL skills" },
|
|
226
|
-
args: {
|
|
227
|
-
agent: {
|
|
228
|
-
type: "string",
|
|
229
|
-
alias: "a",
|
|
230
|
-
description: "Agent name",
|
|
231
|
-
required: false
|
|
232
|
-
},
|
|
233
|
-
skill: {
|
|
234
|
-
type: "string",
|
|
235
|
-
alias: "s",
|
|
236
|
-
description: "Skill id",
|
|
237
|
-
required: false
|
|
238
|
-
}
|
|
239
|
-
},
|
|
240
|
-
async run({ args }) {
|
|
241
|
-
const cwd = process.cwd();
|
|
242
|
-
const action = (process.argv[3] ?? "").toLowerCase();
|
|
243
|
-
p.intro(`${LOGO} ${pc.bold("kalp skill")}`);
|
|
244
|
-
if (!action || !["add", "list", "doctor"].includes(action)) {
|
|
245
|
-
printUsage();
|
|
246
|
-
p.outro(pc.dim("Available skills: " + SKILLS.map((s) => s.id).join(", ")));
|
|
247
|
-
return;
|
|
248
|
-
}
|
|
249
|
-
try {
|
|
250
|
-
await ensureConfig(cwd);
|
|
251
|
-
} catch {
|
|
252
|
-
p.log.error(`${pc.cyan("kalp.config.ts")} not found`);
|
|
253
|
-
p.outro(pc.dim(`Run ${pc.cyan("kalp init")} first.`));
|
|
254
|
-
process.exit(1);
|
|
255
|
-
}
|
|
256
|
-
if (action === "add") {
|
|
257
|
-
const agentName = args.agent;
|
|
258
|
-
const skillId = args.skill;
|
|
259
|
-
if (!agentName || !skillId) {
|
|
260
|
-
p.log.error(`Missing required flags ${pc.cyan("-a <agent>")} and/or ${pc.cyan("-s <skill>")}`);
|
|
261
|
-
printUsage();
|
|
262
|
-
process.exit(1);
|
|
263
|
-
}
|
|
264
|
-
const skill = getSkill(skillId);
|
|
265
|
-
if (!skill) {
|
|
266
|
-
p.log.error(`Unknown skill ${pc.cyan(skillId)}`);
|
|
267
|
-
p.log.info(pc.dim("Available: " + SKILLS.map((s2) => s2.id).join(", ")));
|
|
268
|
-
process.exit(1);
|
|
269
|
-
}
|
|
270
|
-
try {
|
|
271
|
-
await ensureAgentExists(cwd, agentName);
|
|
272
|
-
} catch {
|
|
273
|
-
p.log.error(
|
|
274
|
-
`Agent ${pc.cyan(agentName)} not found at ${pc.cyan(`agents/${agentName}/index.ts`)}`
|
|
275
|
-
);
|
|
276
|
-
process.exit(1);
|
|
277
|
-
}
|
|
278
|
-
const s = p.spinner();
|
|
279
|
-
s.start(`Applying skill ${pc.cyan(skill.id)} to ${pc.cyan(agentName)}`);
|
|
280
|
-
const record = await applySkillToAgent({
|
|
281
|
-
cwd,
|
|
282
|
-
agentName,
|
|
283
|
-
skill
|
|
284
|
-
});
|
|
285
|
-
await recordAppliedSkill({ cwd, agentName, record });
|
|
286
|
-
s.stop("Skill applied");
|
|
287
|
-
p.log.success(`${pc.bold(skill.label)} installed for ${pc.cyan(agentName)}`);
|
|
288
|
-
for (const file of record.files) {
|
|
289
|
-
p.log.info(`${pc.dim("\u2022")} ${pc.cyan(file)}`);
|
|
290
|
-
}
|
|
291
|
-
p.log.info(pc.bold("Next"));
|
|
292
|
-
p.log.info(
|
|
293
|
-
`Import from ${pc.cyan(`./skills/${skill.id}/index.js`)} in ${pc.cyan(`agents/${agentName}/index.ts`)}`
|
|
294
|
-
);
|
|
295
|
-
p.outro(pc.green("Skill installation complete."));
|
|
296
|
-
return;
|
|
297
|
-
}
|
|
298
|
-
if (action === "list") {
|
|
299
|
-
const state = await readSkillsState(cwd);
|
|
300
|
-
const agentName = args.agent;
|
|
301
|
-
if (agentName) {
|
|
302
|
-
const records = state.agents[agentName] ?? [];
|
|
303
|
-
p.log.info(`${pc.bold(agentName)} skills`);
|
|
304
|
-
if (records.length === 0) {
|
|
305
|
-
p.outro(pc.dim("No skills installed."));
|
|
306
|
-
return;
|
|
307
|
-
}
|
|
308
|
-
for (const record of records) {
|
|
309
|
-
p.log.info(`${pc.dim("\u2022")} ${pc.cyan(record.skillId)} ${pc.dim(`(${record.addedAt})`)}`);
|
|
310
|
-
}
|
|
311
|
-
p.outro(pc.green("Done."));
|
|
312
|
-
return;
|
|
313
|
-
}
|
|
314
|
-
const agentNames = Object.keys(state.agents);
|
|
315
|
-
if (agentNames.length === 0) {
|
|
316
|
-
p.outro(pc.dim("No skills installed yet."));
|
|
317
|
-
return;
|
|
318
|
-
}
|
|
319
|
-
for (const agent of agentNames) {
|
|
320
|
-
p.log.info(pc.bold(agent));
|
|
321
|
-
for (const record of state.agents[agent] ?? []) {
|
|
322
|
-
p.log.info(` ${pc.dim("\u2022")} ${pc.cyan(record.skillId)}`);
|
|
323
|
-
}
|
|
324
|
-
}
|
|
325
|
-
p.outro(pc.green("Done."));
|
|
326
|
-
return;
|
|
327
|
-
}
|
|
328
|
-
const issues = await doctorSkills(cwd, args.agent);
|
|
329
|
-
if (issues.length === 0) {
|
|
330
|
-
p.outro(pc.green("Skill manifest is in sync."));
|
|
331
|
-
return;
|
|
332
|
-
}
|
|
333
|
-
p.log.warn("Detected skill drift between manifest and filesystem:");
|
|
334
|
-
for (const issue of issues) {
|
|
335
|
-
p.log.warn(`${pc.cyan(issue.agent)} / ${pc.cyan(issue.skillId)}`);
|
|
336
|
-
for (const file of issue.missingFiles) {
|
|
337
|
-
p.log.warn(` ${pc.dim("\u2022 missing")} ${pc.cyan(file)}`);
|
|
338
|
-
}
|
|
339
|
-
}
|
|
340
|
-
p.outro(pc.yellow("Run kalp skill add again or repair files manually."));
|
|
341
|
-
}
|
|
342
|
-
});
|
|
343
|
-
export {
|
|
344
|
-
skill_default as default
|
|
345
|
-
};
|
|
346
|
-
//# sourceMappingURL=skill-IGGMF5GR.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/skill.ts","../src/skills/index.ts","../src/utils/skills.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { ensureConfig } from \"../utils/fs.js\";\nimport { SKILLS, getSkill } from \"../skills/index.js\";\nimport {\n applySkillToAgent,\n doctorSkills,\n ensureAgentExists,\n readSkillsState,\n recordAppliedSkill,\n} from \"../utils/skills.js\";\n\nconst LOGO = \"🦋\";\n\nfunction printUsage(): void {\n p.log.info(pc.bold(\"Usage\"));\n p.log.info(` ${pc.cyan(\"kalp skill add -a <agent> -s <skill>\")}`);\n p.log.info(` ${pc.cyan(\"kalp skill list [-a <agent>]\")}`);\n p.log.info(` ${pc.cyan(\"kalp skill doctor [-a <agent>]\")}`);\n}\n\nexport default defineCommand({\n meta: { name: \"skill\", description: \"Manage reusable DSL skills\" },\n args: {\n agent: {\n type: \"string\",\n alias: \"a\",\n description: \"Agent name\",\n required: false,\n },\n skill: {\n type: \"string\",\n alias: \"s\",\n description: \"Skill id\",\n required: false,\n },\n },\n async run({ args }) {\n const cwd = process.cwd();\n const action = (process.argv[3] ?? \"\").toLowerCase();\n\n p.intro(`${LOGO} ${pc.bold(\"kalp skill\")}`);\n\n if (!action || ![\"add\", \"list\", \"doctor\"].includes(action)) {\n printUsage();\n p.outro(pc.dim(\"Available skills: \" + SKILLS.map((s) => s.id).join(\", \")));\n return;\n }\n\n try {\n await ensureConfig(cwd);\n } catch {\n p.log.error(`${pc.cyan(\"kalp.config.ts\")} not found`);\n p.outro(pc.dim(`Run ${pc.cyan(\"kalp init\")} first.`));\n process.exit(1);\n }\n\n if (action === \"add\") {\n const agentName = args.agent;\n const skillId = args.skill;\n\n if (!agentName || !skillId) {\n p.log.error(`Missing required flags ${pc.cyan(\"-a <agent>\")} and/or ${pc.cyan(\"-s <skill>\")}`);\n printUsage();\n process.exit(1);\n }\n\n const skill = getSkill(skillId);\n if (!skill) {\n p.log.error(`Unknown skill ${pc.cyan(skillId)}`);\n p.log.info(pc.dim(\"Available: \" + SKILLS.map((s) => s.id).join(\", \")));\n process.exit(1);\n }\n\n try {\n await ensureAgentExists(cwd, agentName);\n } catch {\n p.log.error(\n `Agent ${pc.cyan(agentName)} not found at ${pc.cyan(`agents/${agentName}/index.ts`)}`,\n );\n process.exit(1);\n }\n\n const s = p.spinner();\n s.start(`Applying skill ${pc.cyan(skill.id)} to ${pc.cyan(agentName)}`);\n\n const record = await applySkillToAgent({\n cwd,\n agentName,\n skill,\n });\n await recordAppliedSkill({ cwd, agentName, record });\n\n s.stop(\"Skill applied\");\n p.log.success(`${pc.bold(skill.label)} installed for ${pc.cyan(agentName)}`);\n for (const file of record.files) {\n p.log.info(`${pc.dim(\"•\")} ${pc.cyan(file)}`);\n }\n p.log.info(pc.bold(\"Next\"));\n p.log.info(\n `Import from ${pc.cyan(`./skills/${skill.id}/index.js`)} in ${pc.cyan(`agents/${agentName}/index.ts`)}`,\n );\n p.outro(pc.green(\"Skill installation complete.\"));\n return;\n }\n\n if (action === \"list\") {\n const state = await readSkillsState(cwd);\n const agentName = args.agent;\n\n if (agentName) {\n const records = state.agents[agentName] ?? [];\n p.log.info(`${pc.bold(agentName)} skills`);\n if (records.length === 0) {\n p.outro(pc.dim(\"No skills installed.\"));\n return;\n }\n for (const record of records) {\n p.log.info(`${pc.dim(\"•\")} ${pc.cyan(record.skillId)} ${pc.dim(`(${record.addedAt})`)}`);\n }\n p.outro(pc.green(\"Done.\"));\n return;\n }\n\n const agentNames = Object.keys(state.agents);\n if (agentNames.length === 0) {\n p.outro(pc.dim(\"No skills installed yet.\"));\n return;\n }\n\n for (const agent of agentNames) {\n p.log.info(pc.bold(agent));\n for (const record of state.agents[agent] ?? []) {\n p.log.info(` ${pc.dim(\"•\")} ${pc.cyan(record.skillId)}`);\n }\n }\n p.outro(pc.green(\"Done.\"));\n return;\n }\n\n const issues = await doctorSkills(cwd, args.agent);\n if (issues.length === 0) {\n p.outro(pc.green(\"Skill manifest is in sync.\"));\n return;\n }\n\n p.log.warn(\"Detected skill drift between manifest and filesystem:\");\n for (const issue of issues) {\n p.log.warn(`${pc.cyan(issue.agent)} / ${pc.cyan(issue.skillId)}`);\n for (const file of issue.missingFiles) {\n p.log.warn(` ${pc.dim(\"• missing\")} ${pc.cyan(file)}`);\n }\n }\n p.outro(pc.yellow(\"Run kalp skill add again or repair files manually.\"));\n },\n});\n","export type SkillId = \"chat-core\" | \"autonomous-loop\" | \"memory-notes\";\n\nexport interface SkillFile {\n path: string;\n content: string;\n}\n\nexport interface SkillDefinition {\n id: SkillId;\n label: string;\n description: string;\n files: (agentName: string) => SkillFile[];\n}\n\nconst chatCoreStep = [\n 'import { createStep } from \"@kalphq/sdk\";',\n 'import { z } from \"zod\";',\n \"\",\n \"export const draftResponse = createStep({\",\n ' id: \"draft_response\",',\n ' description: \"Generates a high-quality response draft from user input.\",',\n \" input: z.object({\",\n \" message: z.string(),\",\n ' tone: z.string().default(\"helpful\"),',\n \" }),\",\n \" output: z.object({\",\n \" reply: z.string(),\",\n \" }),\",\n \" async run({ message, tone }) {\",\n \" return {\",\n \" reply: `[${tone}] ${message}`,\",\n \" };\",\n \" },\",\n \"});\",\n \"\",\n].join(\"\\n\");\n\nconst autonomousLoopStep = [\n 'import { createStep } from \"@kalphq/sdk\";',\n 'import { z } from \"zod\";',\n \"\",\n \"export const planNextAction = createStep({\",\n ' id: \"plan_next_action\",',\n ' description: \"Builds the next actionable task for autonomous execution.\",',\n \" input: z.object({\",\n \" objective: z.string(),\",\n \" lastResult: z.string().optional(),\",\n \" }),\",\n \" output: z.object({\",\n \" action: z.string(),\",\n \" reason: z.string(),\",\n \" }),\",\n \" async run({ objective, lastResult }) {\",\n \" return {\",\n \" action: `Continue objective: ${objective}`,\",\n ' reason: lastResult ? `Using previous result: ${lastResult}` : \"Initial planning\",',\n \" };\",\n \" },\",\n \"});\",\n \"\",\n].join(\"\\n\");\n\nconst memoryNotesTool = [\n 'import { createTool } from \"@kalphq/sdk\";',\n 'import { z } from \"zod\";',\n \"\",\n \"export const saveNote = createTool({\",\n ' id: \"save_note\",',\n ' description: \"Persists a note in agent key-value storage.\",',\n \" input: z.object({\",\n \" key: z.string(),\",\n \" value: z.string(),\",\n \" }),\",\n \" async execute({ key, value }, ctx) {\",\n \" await ctx.storage.put(key, { value, savedAt: new Date().toISOString() });\",\n \" return { saved: true, key };\",\n \" },\",\n \"});\",\n \"\",\n].join(\"\\n\");\n\nexport const SKILLS: SkillDefinition[] = [\n {\n id: \"chat-core\",\n label: \"Chat Core\",\n description:\n \"Adds structured message intake and response drafting primitives.\",\n files: (agent) => [\n {\n path: `agents/${agent}/skills/chat-core/steps/draft-response.ts`,\n content: chatCoreStep,\n },\n {\n path: `agents/${agent}/skills/chat-core/index.ts`,\n content: 'export { draftResponse } from \"./steps/draft-response.js\";\\n',\n },\n ],\n },\n {\n id: \"autonomous-loop\",\n label: \"Autonomous Loop\",\n description:\n \"Adds periodic planning and checkpointing primitives for autonomous agents.\",\n files: (agent) => [\n {\n path: `agents/${agent}/skills/autonomous-loop/steps/plan-next-action.ts`,\n content: autonomousLoopStep,\n },\n {\n path: `agents/${agent}/skills/autonomous-loop/index.ts`,\n content:\n 'export { planNextAction } from \"./steps/plan-next-action.js\";\\n',\n },\n ],\n },\n {\n id: \"memory-notes\",\n label: \"Memory Notes\",\n description:\n \"Adds helper tool for persisting structured notes in runtime storage.\",\n files: (agent) => [\n {\n path: `agents/${agent}/skills/memory-notes/tools/save-note.ts`,\n content: memoryNotesTool,\n },\n {\n path: `agents/${agent}/skills/memory-notes/index.ts`,\n content: 'export { saveNote } from \"./tools/save-note.js\";\\n',\n },\n ],\n },\n];\n\nexport function getSkill(skillId: string): SkillDefinition | undefined {\n return SKILLS.find((skill) => skill.id === skillId);\n}\n","import { createHash } from \"node:crypto\";\nimport { access, mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport type { SkillDefinition } from \"../skills/index.js\";\n\nexport interface AppliedSkillRecord {\n skillId: string;\n addedAt: string;\n hash: string;\n files: string[];\n}\n\nexport interface SkillsState {\n schemaVersion: 1;\n agents: Record<string, AppliedSkillRecord[]>;\n}\n\nconst EMPTY_STATE: SkillsState = {\n schemaVersion: 1,\n agents: {},\n};\n\nfunction hashPayload(value: string): string {\n return createHash(\"sha256\").update(value).digest(\"hex\");\n}\n\nfunction statePath(cwd: string): string {\n return join(cwd, \"meta\", \"skills\", \"applied.json\");\n}\n\nexport async function ensureAgentExists(\n cwd: string,\n agentName: string,\n): Promise<void> {\n await access(join(cwd, \"agents\", agentName, \"index.ts\"));\n}\n\nexport async function readSkillsState(cwd: string): Promise<SkillsState> {\n const path = statePath(cwd);\n try {\n const src = await readFile(path, \"utf-8\");\n const parsed = JSON.parse(src) as SkillsState;\n if (parsed?.schemaVersion !== 1 || typeof parsed.agents !== \"object\") {\n return EMPTY_STATE;\n }\n return parsed;\n } catch {\n return EMPTY_STATE;\n }\n}\n\nexport async function writeSkillsState(\n cwd: string,\n state: SkillsState,\n): Promise<void> {\n const dir = join(cwd, \"meta\", \"skills\");\n await mkdir(dir, { recursive: true });\n await writeFile(\n statePath(cwd),\n JSON.stringify(state, null, 2) + \"\\n\",\n \"utf-8\",\n );\n}\n\nexport async function applySkillToAgent(params: {\n cwd: string;\n agentName: string;\n skill: SkillDefinition;\n}): Promise<AppliedSkillRecord> {\n const { cwd, agentName, skill } = params;\n const files = skill.files(agentName);\n\n for (const file of files) {\n const absolute = join(cwd, file.path);\n await mkdir(dirname(absolute), { recursive: true });\n await writeFile(absolute, file.content, \"utf-8\");\n }\n\n const hash = hashPayload(JSON.stringify(files));\n return {\n skillId: skill.id,\n addedAt: new Date().toISOString(),\n hash,\n files: files.map((f) => f.path),\n };\n}\n\nexport async function recordAppliedSkill(params: {\n cwd: string;\n agentName: string;\n record: AppliedSkillRecord;\n}): Promise<void> {\n const { cwd, agentName, record } = params;\n const state = await readSkillsState(cwd);\n const current = state.agents[agentName] ?? [];\n\n state.agents[agentName] = [\n ...current.filter((entry) => entry.skillId !== record.skillId),\n record,\n ];\n\n await writeSkillsState(cwd, state);\n}\n\nexport async function doctorSkills(\n cwd: string,\n agentName?: string,\n): Promise<Array<{ agent: string; skillId: string; missingFiles: string[] }>> {\n const state = await readSkillsState(cwd);\n const agents = agentName ? [agentName] : Object.keys(state.agents);\n const issues: Array<{\n agent: string;\n skillId: string;\n missingFiles: string[];\n }> = [];\n\n for (const agent of agents) {\n const records = state.agents[agent] ?? [];\n for (const record of records) {\n const missing: string[] = [];\n for (const file of record.files) {\n try {\n await access(join(cwd, file));\n } catch {\n missing.push(file);\n }\n }\n if (missing.length > 0) {\n issues.push({ agent, skillId: record.skillId, missingFiles: missing });\n }\n }\n }\n\n return issues;\n}\n"],"mappings":"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","names":["s"]}
|
|
File without changes
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
|