cortask 0.2.19 → 0.2.20
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/index.js +23 -0
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/dist/index.js
CHANGED
|
@@ -720,5 +720,28 @@ cr.command("remove").argument("<id>", "Job ID").action(async (id) => {
|
|
|
720
720
|
console.log(`${theme.success("\u2713")} Deleted cron job ${theme.muted(id)}`);
|
|
721
721
|
cronService.stop();
|
|
722
722
|
});
|
|
723
|
+
program.command("update").description("Check for updates and optionally install them").option("--check", "Only check, do not install").action(async (opts) => {
|
|
724
|
+
try {
|
|
725
|
+
const res = await fetch("https://registry.npmjs.org/cortask/latest");
|
|
726
|
+
if (!res.ok) throw new Error("Failed to fetch from npm registry");
|
|
727
|
+
const data = await res.json();
|
|
728
|
+
const latest = data.version;
|
|
729
|
+
if (latest === VERSION) {
|
|
730
|
+
console.log(`${theme.success("\u2713")} You're on the latest version ${theme.info(VERSION)}`);
|
|
731
|
+
return;
|
|
732
|
+
}
|
|
733
|
+
console.log(`${theme.info("Update available:")} ${theme.muted(VERSION)} \u2192 ${theme.success(latest)}`);
|
|
734
|
+
if (opts.check) return;
|
|
735
|
+
console.log(`
|
|
736
|
+
Run the following command to update:
|
|
737
|
+
`);
|
|
738
|
+
console.log(` ${theme.info("npm update -g cortask")}
|
|
739
|
+
`);
|
|
740
|
+
} catch (err) {
|
|
741
|
+
console.error(
|
|
742
|
+
`${theme.error("\u2717")} Failed to check for updates: ${err instanceof Error ? err.message : String(err)}`
|
|
743
|
+
);
|
|
744
|
+
}
|
|
745
|
+
});
|
|
723
746
|
program.parse();
|
|
724
747
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/terminal/theme.ts","../src/terminal/banner.ts","../src/terminal/help.ts","../src/commands/setup.ts","../src/commands/status.ts","../src/commands/dashboard.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport {\n loadConfig,\n getDataDir,\n WorkspaceManager,\n SessionStore,\n EncryptedCredentialStore,\n getOrCreateSecret,\n createProvider,\n AgentRunner,\n builtinTools,\n createCronTool,\n createArtifactTool,\n loadSkills,\n getEligibleSkills,\n buildSkillTools,\n CronService,\n ArtifactStore,\n installSkillFromGit,\n removeSkill,\n type ProviderId,\n type ToolHandler,\n} from \"@cortask/core\";\nimport path from \"node:path\";\nimport readline from \"node:readline\";\nimport { theme } from \"./terminal/theme.js\";\nimport { emitBanner } from \"./terminal/banner.js\";\nimport { configureHelp } from \"./terminal/help.js\";\nimport { setupCommand } from \"./commands/setup.js\";\nimport { statusCommand } from \"./commands/status.js\";\nimport { dashboardCommand } from \"./commands/dashboard.js\";\nimport { createRequire } from \"node:module\";\n\nconst require = createRequire(import.meta.url);\nconst VERSION: string = require(\"../package.json\").version;\n\nconst program = new Command();\n\nprogram\n .name(\"cortask\")\n .description(\"Cortask — Local AI agent with skills, workspaces, and cron\")\n .version(VERSION);\n\n// Configure themed help and banner\nconfigureHelp(program, VERSION);\n\n// ── serve ──────────────────────────────────────────────────\n\nprogram\n .command(\"serve\")\n .description(\"Start the gateway server\")\n .option(\"-p, --port <port>\", \"Port to listen on\", \"3777\")\n .option(\"--host <host>\", \"Host to bind to\", \"127.0.0.1\")\n .action(async (opts) => {\n emitBanner(VERSION);\n const { startServer } = await import(\"@cortask/gateway\");\n console.log(\n `${theme.muted(\"Starting gateway on\")} ${theme.info(`http://${opts.host}:${opts.port}`)}`,\n );\n await startServer(parseInt(opts.port, 10), opts.host);\n });\n\n// ── chat ───────────────────────────────────────────────────\n\nprogram\n .command(\"chat\")\n .description(\"Interactive chat REPL\")\n .option(\"-w, --workspace <path>\", \"Workspace directory path\", \".\")\n .action(async (opts) => {\n emitBanner(VERSION);\n const dataDir = getDataDir();\n const configPath = path.join(dataDir, \"config.yaml\");\n const config = await loadConfig(configPath);\n const dbPath = path.join(dataDir, \"cortask.db\");\n const workspaceManager = new WorkspaceManager(dbPath);\n const secret = await getOrCreateSecret(dataDir);\n const credentialStore = new EncryptedCredentialStore(\n path.join(dataDir, \"credentials.enc.json\"),\n secret,\n );\n const cronService = new CronService(dbPath);\n const artifactStore = new ArtifactStore();\n\n // Resolve workspace\n const workspacePath = path.resolve(opts.workspace);\n const workspaces = await workspaceManager.list();\n let workspace = workspaces.find((w) => w.rootPath === workspacePath);\n if (!workspace) {\n workspace = await workspaceManager.create(\n path.basename(workspacePath),\n workspacePath,\n );\n console.log(\n `${theme.success(\"✓\")} Registered workspace: ${theme.command(workspace.name)}`,\n );\n }\n\n const sessionStore = new SessionStore(\n workspaceManager.getSessionDbPath(workspacePath),\n );\n\n // Load skills\n const bundledSkillsDir = path.resolve(\"skills\");\n const userSkillsDir = path.join(dataDir, \"skills\");\n const allSkills = await loadSkills(\n bundledSkillsDir,\n userSkillsDir,\n config.skills.dirs,\n credentialStore,\n );\n const eligible = getEligibleSkills(allSkills);\n const skillRegistry = await buildSkillTools(eligible, credentialStore);\n const skillToolHandlers: ToolHandler[] = skillRegistry.toolDefs.map((def) => ({\n definition: def,\n execute: async (args: Record<string, unknown>, context: Parameters<ToolHandler[\"execute\"]>[1]) => {\n const handler = skillRegistry.handlers.get(def.name);\n if (!handler) return { toolCallId: \"\", content: \"Tool not found\", isError: true };\n return handler(args, context.workspacePath);\n },\n }));\n const skillPrompts = eligible\n .map((s) => s.content)\n .filter(Boolean);\n\n // Build provider\n const providerId = (config.providers.default || \"anthropic\") as ProviderId;\n const providerConfig = config.providers[providerId];\n const apiKey = await credentialStore.get(`provider.${providerId}.apiKey`);\n if (!apiKey) {\n console.error(theme.error(`\\n✗ No API key for provider \"${providerId}\"`));\n console.error(theme.muted(\" Set it with:\"));\n console.error(\n theme.command(\n ` cortask credentials set provider.${providerId}.apiKey YOUR_KEY`,\n ),\n );\n console.log();\n process.exit(1);\n }\n const provider = createProvider(providerId, apiKey);\n const model =\n ((providerConfig as Record<string, unknown>)?.model as string) ??\n \"claude-sonnet-4-5-20250929\";\n\n const sessionId = `cli_${Date.now()}`;\n\n const runner = new AgentRunner({\n config: {\n provider,\n model,\n maxTurns: config.agent.maxTurns,\n temperature: config.agent.temperature,\n maxTokens: config.agent.maxTokens,\n },\n tools: [\n ...builtinTools,\n createCronTool(cronService),\n createArtifactTool(artifactStore),\n ...skillToolHandlers,\n ],\n getWorkspacePath: () => workspacePath,\n getDataDir: () => dataDir,\n getMemoryContent: () => workspaceManager.readMemory(workspacePath),\n getGlobalMemoryContent: () => workspaceManager.readGlobalMemory(dataDir),\n getSkillPrompts: () => skillPrompts,\n getSessionMessages: async (sid) => sessionStore.getMessages(sid),\n saveSessionMessages: async (sid, msgs) =>\n sessionStore.saveMessages(sid, msgs),\n });\n\n console.log(\n `${theme.muted(\"Workspace:\")} ${theme.info(workspacePath)}`,\n );\n console.log(\n `${theme.muted(\"Provider:\")} ${theme.command(providerId)} ${theme.muted(`(${model})`)}`,\n );\n console.log(\n theme.muted(\"Type a message, /help for commands, /quit to exit.\\n\"),\n );\n\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n prompt: `${theme.accent(\"you>\")} `,\n });\n\n rl.prompt();\n\n rl.on(\"line\", async (line) => {\n const input = line.trim();\n if (!input) {\n rl.prompt();\n return;\n }\n\n // Slash commands\n if (input.startsWith(\"/\")) {\n const cmd = input.toLowerCase();\n if (cmd === \"/quit\" || cmd === \"/exit\") {\n rl.close();\n return;\n }\n if (cmd === \"/help\") {\n console.log(theme.heading(\"\\nCommands:\"));\n console.log(` ${theme.command(\"/help\")} ${theme.muted(\"Show this help\")}`);\n console.log(` ${theme.command(\"/quit\")} ${theme.muted(\"Exit the REPL\")}`);\n console.log();\n rl.prompt();\n return;\n }\n console.log(theme.warn(`Unknown command: ${input}. Type /help for commands.`));\n rl.prompt();\n return;\n }\n\n process.stdout.write(`\\n${theme.accentBright(\"cortask>\")} `);\n try {\n for await (const event of runner.runStream({\n prompt: input,\n sessionId,\n })) {\n if (event.type === \"text_delta\" && event.text) {\n process.stdout.write(event.text);\n } else if (event.type === \"tool_call_start\") {\n process.stdout.write(\n `\\n${theme.muted(\"[\")}${theme.warn(\"tool\")}${theme.muted(\":\")} ${theme.command(event.toolName)}${theme.muted(\"]\")} `,\n );\n } else if (event.type === \"tool_result\") {\n const preview = event.toolResult?.content?.slice(0, 200) ?? \"\";\n process.stdout.write(`${theme.muted(\"→\")} ${theme.muted(preview)}\\n`);\n }\n }\n } catch (err) {\n console.error(\n theme.error(\n `\\n✗ ${err instanceof Error ? err.message : String(err)}`,\n ),\n );\n }\n process.stdout.write(\"\\n\\n\");\n rl.prompt();\n });\n\n rl.on(\"close\", () => {\n console.log(theme.muted(\"\\nGoodbye.\"));\n workspaceManager.close();\n process.exit(0);\n });\n });\n\n// ── run ────────────────────────────────────────────────────\n\nprogram\n .command(\"run\")\n .description(\"Run a one-shot prompt\")\n .argument(\"<prompt>\", \"The prompt to execute\")\n .option(\"-w, --workspace <path>\", \"Workspace directory path\", \".\")\n .action(async (prompt, opts) => {\n const dataDir = getDataDir();\n const configPath = path.join(dataDir, \"config.yaml\");\n const config = await loadConfig(configPath);\n const dbPath = path.join(dataDir, \"cortask.db\");\n const workspaceManager = new WorkspaceManager(dbPath);\n const secret = await getOrCreateSecret(dataDir);\n const credentialStore = new EncryptedCredentialStore(\n path.join(dataDir, \"credentials.enc.json\"),\n secret,\n );\n const cronService = new CronService(dbPath);\n const artifactStore = new ArtifactStore();\n\n const workspacePath = path.resolve(opts.workspace);\n const workspaces = await workspaceManager.list();\n let workspace = workspaces.find((w) => w.rootPath === workspacePath);\n if (!workspace) {\n workspace = await workspaceManager.create(\n path.basename(workspacePath),\n workspacePath,\n );\n }\n\n const sessionStore = new SessionStore(\n workspaceManager.getSessionDbPath(workspacePath),\n );\n\n const providerId = (config.providers.default || \"anthropic\") as ProviderId;\n const apiKey = await credentialStore.get(`provider.${providerId}.apiKey`);\n if (!apiKey) {\n console.error(theme.error(`\\n✗ No API key for provider \"${providerId}\".`));\n console.error(theme.muted(\" Set it with:\"));\n console.error(\n theme.command(\n ` cortask credentials set provider.${providerId}.apiKey YOUR_KEY`,\n ),\n );\n process.exit(1);\n }\n const provider = createProvider(providerId, apiKey);\n const providerConfig = config.providers[providerId];\n const model =\n ((providerConfig as Record<string, unknown>)?.model as string) ??\n \"claude-sonnet-4-5-20250929\";\n\n const runner = new AgentRunner({\n config: {\n provider,\n model,\n maxTurns: config.agent.maxTurns,\n temperature: config.agent.temperature,\n maxTokens: config.agent.maxTokens,\n },\n tools: [\n ...builtinTools,\n createCronTool(cronService),\n createArtifactTool(artifactStore),\n ],\n getWorkspacePath: () => workspacePath,\n getDataDir: () => dataDir,\n getMemoryContent: () => workspaceManager.readMemory(workspacePath),\n getGlobalMemoryContent: () => workspaceManager.readGlobalMemory(dataDir),\n getSkillPrompts: () => [],\n getSessionMessages: async (sid) => sessionStore.getMessages(sid),\n saveSessionMessages: async (sid, msgs) =>\n sessionStore.saveMessages(sid, msgs),\n });\n\n const result = await runner.run({ prompt });\n console.log(result.response);\n\n workspaceManager.close();\n });\n\n// ── setup, status, dashboard ──────────────────────────────\n\nprogram.addCommand(setupCommand);\nprogram.addCommand(statusCommand);\nprogram.addCommand(dashboardCommand);\n\n// ── workspaces ─────────────────────────────────────────────\n\nconst ws = program.command(\"workspaces\").description(\"Manage workspaces\");\n\nws.command(\"list\").action(async () => {\n const dataDir = getDataDir();\n const dbPath = path.join(dataDir, \"cortask.db\");\n const wm = new WorkspaceManager(dbPath);\n const list = await wm.list();\n if (list.length === 0) {\n console.log(theme.muted(\"No workspaces registered.\"));\n } else {\n for (const w of list) {\n console.log(\n ` ${theme.success(\"✓\")} ${theme.command(w.name)} ${theme.muted(\"→\")} ${theme.info(w.rootPath)} ${theme.muted(`(${w.id})`)}`,\n );\n }\n }\n wm.close();\n});\n\nws.command(\"add\")\n .argument(\"<name>\", \"Workspace name\")\n .argument(\"<path>\", \"Workspace directory path\")\n .action(async (name, dirPath) => {\n const dataDir = getDataDir();\n const dbPath = path.join(dataDir, \"cortask.db\");\n const wm = new WorkspaceManager(dbPath);\n const workspace = await wm.create(name, dirPath);\n console.log(\n `${theme.success(\"✓\")} Created workspace ${theme.command(workspace.name)} ${theme.muted(`(${workspace.id})`)}`,\n );\n console.log(` ${theme.muted(\"Path:\")} ${theme.info(workspace.rootPath)}`);\n wm.close();\n });\n\nws.command(\"remove\")\n .argument(\"<id>\", \"Workspace ID\")\n .action(async (id) => {\n const dataDir = getDataDir();\n const dbPath = path.join(dataDir, \"cortask.db\");\n const wm = new WorkspaceManager(dbPath);\n await wm.delete(id);\n console.log(`${theme.success(\"✓\")} Removed workspace ${theme.muted(id)}`);\n wm.close();\n });\n\n// ── credentials ────────────────────────────────────────────\n\nconst creds = program\n .command(\"credentials\")\n .description(\"Manage credentials\");\n\ncreds.command(\"list\").action(async () => {\n const dataDir = getDataDir();\n const secret = await getOrCreateSecret(dataDir);\n const store = new EncryptedCredentialStore(\n path.join(dataDir, \"credentials.enc.json\"),\n secret,\n );\n const keys = await store.list();\n if (keys.length === 0) {\n console.log(theme.muted(\"No credentials stored.\"));\n } else {\n for (const key of keys) {\n console.log(` ${theme.muted(\"•\")} ${theme.command(key)}`);\n }\n }\n});\n\ncreds\n .command(\"set\")\n .argument(\"<key>\", \"Credential key (e.g. provider.anthropic.apiKey)\")\n .argument(\"<value>\", \"Credential value\")\n .action(async (key, value) => {\n const dataDir = getDataDir();\n const secret = await getOrCreateSecret(dataDir);\n const store = new EncryptedCredentialStore(\n path.join(dataDir, \"credentials.enc.json\"),\n secret,\n );\n await store.set(key, value);\n console.log(`${theme.success(\"✓\")} Credential ${theme.command(key)} saved.`);\n });\n\ncreds\n .command(\"remove\")\n .argument(\"<key>\", \"Credential key\")\n .action(async (key) => {\n const dataDir = getDataDir();\n const secret = await getOrCreateSecret(dataDir);\n const store = new EncryptedCredentialStore(\n path.join(dataDir, \"credentials.enc.json\"),\n secret,\n );\n await store.delete(key);\n console.log(`${theme.success(\"✓\")} Credential ${theme.command(key)} removed.`);\n });\n\n// ── skills ─────────────────────────────────────────────────\n\nconst sk = program.command(\"skills\").description(\"Manage skills\");\n\nsk.command(\"list\").action(async () => {\n const dataDir = getDataDir();\n const secret = await getOrCreateSecret(dataDir);\n const credentialStore = new EncryptedCredentialStore(\n path.join(dataDir, \"credentials.enc.json\"),\n secret,\n );\n const bundledSkillsDir = path.resolve(\"skills\");\n const userSkillsDir = path.join(dataDir, \"skills\");\n const configPath = path.join(dataDir, \"config.yaml\");\n const config = await loadConfig(configPath);\n const allSkills = await loadSkills(\n bundledSkillsDir,\n userSkillsDir,\n config.skills.dirs,\n credentialStore,\n );\n if (allSkills.length === 0) {\n console.log(theme.muted(\"No skills found.\"));\n } else {\n for (const skill of allSkills) {\n const icon = skill.eligible ? theme.success(\"✓\") : theme.muted(\"○\");\n const name = theme.command(skill.manifest.name);\n const desc = theme.muted(skill.manifest.description ?? \"\");\n console.log(` ${icon} ${name} ${desc}`);\n }\n }\n});\n\nsk.command(\"install\")\n .argument(\"<git-url>\", \"Git URL of the skill repository\")\n .action(async (gitUrl) => {\n const dataDir = getDataDir();\n const userSkillsDir = path.join(dataDir, \"skills\");\n const result = await installSkillFromGit(gitUrl, userSkillsDir);\n console.log(\n `${theme.success(\"✓\")} Installed skill ${theme.command(result.name)}`,\n );\n });\n\nsk.command(\"remove\")\n .argument(\"<name>\", \"Skill name\")\n .action(async (name) => {\n const dataDir = getDataDir();\n const userSkillsDir = path.join(dataDir, \"skills\");\n await removeSkill(name, userSkillsDir);\n console.log(`${theme.success(\"✓\")} Removed skill ${theme.command(name)}`);\n });\n\n// ── cron ───────────────────────────────────────────────────\n\nconst cr = program.command(\"cron\").description(\"Manage cron jobs\");\n\ncr.command(\"list\").action(async () => {\n const dataDir = getDataDir();\n const dbPath = path.join(dataDir, \"cortask.db\");\n const cronService = new CronService(dbPath);\n const jobs = cronService.list();\n if (jobs.length === 0) {\n console.log(theme.muted(\"No cron jobs.\"));\n } else {\n for (const job of jobs) {\n const icon = job.enabled ? theme.success(\"✓\") : theme.muted(\"○\");\n console.log(` ${icon} ${theme.command(job.name)} ${theme.muted(`(${job.id})`)}`);\n console.log(` ${theme.muted(\"Schedule:\")} ${theme.info(JSON.stringify(job.schedule))}`);\n console.log(` ${theme.muted(\"Prompt:\")} ${job.prompt.slice(0, 80)}...`);\n }\n }\n cronService.stop();\n});\n\ncr.command(\"add\")\n .requiredOption(\"-n, --name <name>\", \"Job name\")\n .requiredOption(\"-s, --schedule <cron>\", \"Cron expression\")\n .requiredOption(\"-p, --prompt <prompt>\", \"Prompt to execute\")\n .option(\"-w, --workspace <id>\", \"Workspace ID\")\n .action(async (opts) => {\n const dataDir = getDataDir();\n const dbPath = path.join(dataDir, \"cortask.db\");\n const cronService = new CronService(dbPath);\n const job = cronService.add({\n name: opts.name,\n schedule: { type: \"cron\", expression: opts.schedule },\n prompt: opts.prompt,\n delivery: {},\n workspaceId: opts.workspace,\n });\n console.log(\n `${theme.success(\"✓\")} Created cron job ${theme.command(job.name)} ${theme.muted(`(${job.id})`)}`,\n );\n cronService.stop();\n });\n\ncr.command(\"remove\")\n .argument(\"<id>\", \"Job ID\")\n .action(async (id) => {\n const dataDir = getDataDir();\n const dbPath = path.join(dataDir, \"cortask.db\");\n const cronService = new CronService(dbPath);\n cronService.remove(id);\n console.log(`${theme.success(\"✓\")} Deleted cron job ${theme.muted(id)}`);\n cronService.stop();\n });\n\nprogram.parse();\n","import chalk, { Chalk } from \"chalk\";\n\nconst PALETTE = {\n accent: \"#6366f1\",\n accentBright: \"#818cf8\",\n accentDim: \"#a5b4fc\",\n info: \"#38bdf8\",\n success: \"#22c55e\",\n warn: \"#f59e0b\",\n error: \"#ef4444\",\n muted: \"#9ca3af\",\n};\n\nconst hasForceColor =\n typeof process.env.FORCE_COLOR === \"string\" &&\n process.env.FORCE_COLOR.trim().length > 0 &&\n process.env.FORCE_COLOR.trim() !== \"0\";\n\nconst baseChalk =\n process.env.NO_COLOR && !hasForceColor\n ? new Chalk({ level: 0 })\n : chalk;\n\nconst hex = (value: string) => baseChalk.hex(value);\n\nexport const theme = {\n accent: hex(PALETTE.accent),\n accentBright: hex(PALETTE.accentBright),\n accentDim: hex(PALETTE.accentDim),\n info: hex(PALETTE.info),\n success: hex(PALETTE.success),\n warn: hex(PALETTE.warn),\n error: hex(PALETTE.error),\n muted: hex(PALETTE.muted),\n heading: baseChalk.bold.hex(PALETTE.accent),\n command: hex(PALETTE.accentBright),\n option: hex(PALETTE.warn),\n} as const;\n\nexport const isRich = () => Boolean(baseChalk.level > 0);\n","import { isRich, theme } from \"./theme.js\";\n\nlet bannerEmitted = false;\n\nconst hasFlag = (argv: string[], ...flags: string[]) =>\n argv.some((arg) => flags.includes(arg));\n\nexport function emitBanner(version: string, argv?: string[]) {\n if (bannerEmitted) return;\n const args = argv ?? process.argv;\n if (!process.stdout.isTTY) return;\n if (hasFlag(args, \"--json\", \"--version\", \"-V\")) return;\n\n const title = \"⚡ Cortask\";\n const tagline = \"Local AI agent platform\";\n\n if (isRich()) {\n process.stdout.write(\n `\\n${theme.heading(title)} ${theme.info(version)} ${theme.muted(\"—\")} ${theme.accentDim(tagline)}\\n\\n`,\n );\n } else {\n process.stdout.write(`\\n${title} ${version} — ${tagline}\\n\\n`);\n }\n\n bannerEmitted = true;\n}\n\nexport function hasBannerEmitted(): boolean {\n return bannerEmitted;\n}\n","import type { Command } from \"commander\";\nimport { emitBanner, hasBannerEmitted } from \"./banner.js\";\nimport { theme } from \"./theme.js\";\n\nconst EXAMPLES = [\n [\"cortask serve\", \"Start the gateway server\"],\n [\"cortask chat\", \"Start interactive chat session\"],\n [\"cortask run \\\"hello\\\"\", \"Run a one-shot prompt\"],\n [\"cortask status\", \"Show system status\"],\n [\"cortask dashboard\", \"Open the web UI\"],\n [\"cortask setup\", \"Initialize configuration\"],\n [\"cortask workspaces list\", \"List registered workspaces\"],\n [\"cortask credentials set provider.anthropic.apiKey KEY\", \"Set API key\"],\n] as const;\n\nexport function configureHelp(program: Command, version: string) {\n program.helpOption(\"-h, --help\", \"Display help for command\");\n program.helpCommand(\"help [command]\", \"Display help for command\");\n\n program.configureHelp({\n sortSubcommands: true,\n sortOptions: true,\n optionTerm: (option) => theme.option(option.flags),\n subcommandTerm: (cmd) => theme.command(cmd.name()),\n });\n\n const formatHelp = (str: string) =>\n str\n .replace(/^Usage:/gm, theme.heading(\"Usage:\"))\n .replace(/^Options:/gm, theme.heading(\"Options:\"))\n .replace(/^Commands:/gm, theme.heading(\"Commands:\"))\n .replace(/^Arguments:/gm, theme.heading(\"Arguments:\"));\n\n program.configureOutput({\n writeOut: (str) => process.stdout.write(formatHelp(str)),\n writeErr: (str) => process.stderr.write(formatHelp(str)),\n outputError: (str, write) => write(theme.error(str)),\n });\n\n program.addHelpText(\"beforeAll\", () => {\n if (hasBannerEmitted()) return \"\";\n emitBanner(version);\n return \"\";\n });\n\n const fmtExamples = EXAMPLES.map(\n ([cmd, desc]) => ` ${theme.command(cmd)}\\n ${theme.muted(desc)}`,\n ).join(\"\\n\");\n\n program.addHelpText(\"afterAll\", ({ command }) => {\n if (command !== program) return \"\";\n return `\\n${theme.heading(\"Examples:\")}\\n${fmtExamples}\\n`;\n });\n}\n","import { Command } from \"commander\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { getDataDir } from \"@cortask/core\";\nimport { theme } from \"../terminal/theme.js\";\n\nconst DEFAULT_CONFIG = `# Cortask Configuration\nonboarded: true\n\nproviders:\n default: anthropic\n\nagent:\n maxTurns: 25\n temperature: 0.7\n\nserver:\n port: 3777\n host: 127.0.0.1\n\nskills:\n dirs: []\n`;\n\nfunction ensureDir(dir: string) {\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n}\n\nexport const setupCommand = new Command(\"setup\")\n .description(\"Initialize configuration and data directory\")\n .option(\"--force\", \"Overwrite existing configuration\")\n .action(async (opts: { force?: boolean }) => {\n const dataDir = getDataDir();\n const configPath = path.join(dataDir, \"config.yaml\");\n\n console.log(theme.heading(\"\\n⚡ Cortask Setup\\n\"));\n\n if (fs.existsSync(configPath) && !opts.force) {\n console.log(theme.warn(\"⚠ Configuration already exists:\"));\n console.log(theme.info(` ${configPath}`));\n console.log(theme.muted(\"\\n Use --force to overwrite\"));\n console.log();\n process.exit(1);\n }\n\n try {\n ensureDir(dataDir);\n console.log(`${theme.success(\"✓\")} Data directory: ${theme.info(dataDir)}`);\n\n fs.writeFileSync(configPath, DEFAULT_CONFIG, \"utf-8\");\n console.log(`${theme.success(\"✓\")} Config: ${theme.info(configPath)}`);\n\n const skillsDir = path.join(dataDir, \"skills\");\n ensureDir(skillsDir);\n console.log(`${theme.success(\"✓\")} Skills: ${theme.info(skillsDir)}`);\n\n console.log(theme.heading(\"\\n✓ Setup complete!\\n\"));\n\n console.log(theme.muted(\"Next steps:\"));\n console.log(theme.command(\" 1. Set your API key:\"));\n console.log(theme.info(` cortask credentials set provider.anthropic.apiKey YOUR_KEY`));\n console.log(theme.command(\"\\n 2. Add a workspace:\"));\n console.log(theme.info(\" cortask workspaces add my-project /path/to/project\"));\n console.log(theme.command(\"\\n 3. Start chatting:\"));\n console.log(theme.info(\" cortask chat -w /path/to/project\"));\n console.log();\n } catch (err) {\n console.error(theme.error(\"\\n✗ Setup failed\"));\n console.error(theme.muted(` ${(err as Error).message}`));\n process.exit(1);\n }\n });\n","import { Command } from \"commander\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { getDataDir, loadConfig, WorkspaceManager } from \"@cortask/core\";\nimport { theme } from \"../terminal/theme.js\";\n\nasync function fetchHealth(host: string, port: number) {\n try {\n const res = await fetch(`http://${host}:${port}/api/health`);\n if (!res.ok) return null;\n return res.json();\n } catch {\n return null;\n }\n}\n\nexport const statusCommand = new Command(\"status\")\n .description(\"Show system status and configuration\")\n .action(async () => {\n const dataDir = getDataDir();\n const configPath = path.join(dataDir, \"config.yaml\");\n\n if (!fs.existsSync(configPath)) {\n console.error(theme.error(\"\\n✗ No configuration found\"));\n console.error(theme.muted(\" Run this command to set up:\"));\n console.error(theme.command(\" cortask setup\"));\n console.log();\n process.exit(1);\n }\n\n try {\n const config = await loadConfig(configPath);\n const host = config.server.host;\n const port = config.server.port;\n\n console.log(theme.heading(\"\\n Configuration\"));\n console.log(` File: ${theme.info(configPath)}`);\n console.log(` Data: ${theme.info(dataDir)}`);\n\n // Gateway status\n console.log(theme.heading(\"\\n Gateway\"));\n const health = await fetchHealth(host, port);\n if (health) {\n console.log(` Status: ${theme.success(\"online\")}`);\n console.log(` URL: ${theme.info(`http://${host}:${port}`)}`);\n } else {\n console.log(` Status: ${theme.error(\"offline\")}`);\n console.log(` Expected: ${theme.muted(`http://${host}:${port}`)}`);\n }\n\n // Provider\n console.log(theme.heading(\"\\n Provider\"));\n console.log(` Default: ${theme.command(config.providers.default)}`);\n\n // Workspaces\n console.log(theme.heading(\"\\n Workspaces\"));\n const dbPath = path.join(dataDir, \"cortask.db\");\n if (fs.existsSync(dbPath)) {\n const wm = new WorkspaceManager(dbPath);\n const workspaces = await wm.list();\n if (workspaces.length === 0) {\n console.log(` ${theme.muted(\"No workspaces registered\")}`);\n } else {\n for (const w of workspaces) {\n console.log(` ${theme.success(\"✓\")} ${theme.command(w.name)} ${theme.muted(`→ ${w.rootPath}`)}`);\n }\n }\n wm.close();\n } else {\n console.log(` ${theme.muted(\"Database not initialized\")}`);\n }\n\n // Skills\n console.log(theme.heading(\"\\n Skills\"));\n const skillsDir = path.join(dataDir, \"skills\");\n if (fs.existsSync(skillsDir)) {\n const entries = fs.readdirSync(skillsDir).filter((e) =>\n fs.statSync(path.join(skillsDir, e)).isDirectory(),\n );\n console.log(` Installed: ${theme.info(entries.length.toString())} skill(s)`);\n } else {\n console.log(` ${theme.muted(\"No skills directory\")}`);\n }\n\n console.log();\n } catch (err) {\n console.error(theme.error(\"\\n✗ Failed to load status\"));\n console.error(theme.muted(` ${(err as Error).message}`));\n process.exit(1);\n }\n });\n","import { Command } from \"commander\";\nimport { exec } from \"node:child_process\";\nimport path from \"node:path\";\nimport { getDataDir, loadConfig } from \"@cortask/core\";\nimport { theme } from \"../terminal/theme.js\";\n\nfunction openBrowser(url: string): Promise<void> {\n const cmd =\n process.platform === \"win32\"\n ? `start ${url}`\n : process.platform === \"darwin\"\n ? `open ${url}`\n : `xdg-open ${url}`;\n\n return new Promise((resolve, reject) => {\n exec(cmd, (err) => (err ? reject(err) : resolve()));\n });\n}\n\nasync function isGatewayOnline(host: string, port: number): Promise<boolean> {\n try {\n const res = await fetch(`http://${host}:${port}/api/health`);\n return res.ok;\n } catch {\n return false;\n }\n}\n\nexport const dashboardCommand = new Command(\"dashboard\")\n .description(\"Open the web UI in your browser\")\n .option(\"--no-open\", \"Print URL without opening browser\")\n .action(async (opts: { open: boolean }) => {\n const dataDir = getDataDir();\n const configPath = path.join(dataDir, \"config.yaml\");\n const config = await loadConfig(configPath);\n const url = `http://${config.server.host}:${config.server.port}`;\n\n const online = await isGatewayOnline(config.server.host, config.server.port);\n if (!online) {\n console.log(theme.warn(\"\\n⚠ Gateway appears to be offline\"));\n console.log(theme.muted(\" Start it with:\"));\n console.log(theme.command(\" cortask serve\"));\n console.log();\n }\n\n if (opts.open) {\n console.log(theme.info(`\\nOpening dashboard: ${url}`));\n try {\n await openBrowser(url);\n console.log(theme.success(\"✓ Browser opened\"));\n } catch {\n console.log(theme.warn(\"\\n⚠ Could not open browser automatically\"));\n console.log(theme.info(` Open this URL manually: ${url}`));\n }\n } else {\n console.log(theme.info(`\\nDashboard URL: ${url}`));\n }\n console.log();\n });\n"],"mappings":"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","names":["Command","loadConfig","getDataDir","WorkspaceManager","path","program","Command","fs","path","getDataDir","Command","getDataDir","path","fs","Command","path","getDataDir","loadConfig","Command","getDataDir","path","loadConfig","require","Command","getDataDir","path","loadConfig","WorkspaceManager"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/terminal/theme.ts","../src/terminal/banner.ts","../src/terminal/help.ts","../src/commands/setup.ts","../src/commands/status.ts","../src/commands/dashboard.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport {\n loadConfig,\n getDataDir,\n WorkspaceManager,\n SessionStore,\n EncryptedCredentialStore,\n getOrCreateSecret,\n createProvider,\n AgentRunner,\n builtinTools,\n createCronTool,\n createArtifactTool,\n loadSkills,\n getEligibleSkills,\n buildSkillTools,\n CronService,\n ArtifactStore,\n installSkillFromGit,\n removeSkill,\n type ProviderId,\n type ToolHandler,\n} from \"@cortask/core\";\nimport path from \"node:path\";\nimport readline from \"node:readline\";\nimport { theme } from \"./terminal/theme.js\";\nimport { emitBanner } from \"./terminal/banner.js\";\nimport { configureHelp } from \"./terminal/help.js\";\nimport { setupCommand } from \"./commands/setup.js\";\nimport { statusCommand } from \"./commands/status.js\";\nimport { dashboardCommand } from \"./commands/dashboard.js\";\nimport { createRequire } from \"node:module\";\n\nconst require = createRequire(import.meta.url);\nconst VERSION: string = require(\"../package.json\").version;\n\nconst program = new Command();\n\nprogram\n .name(\"cortask\")\n .description(\"Cortask — Local AI agent with skills, workspaces, and cron\")\n .version(VERSION);\n\n// Configure themed help and banner\nconfigureHelp(program, VERSION);\n\n// ── serve ──────────────────────────────────────────────────\n\nprogram\n .command(\"serve\")\n .description(\"Start the gateway server\")\n .option(\"-p, --port <port>\", \"Port to listen on\", \"3777\")\n .option(\"--host <host>\", \"Host to bind to\", \"127.0.0.1\")\n .action(async (opts) => {\n emitBanner(VERSION);\n const { startServer } = await import(\"@cortask/gateway\");\n console.log(\n `${theme.muted(\"Starting gateway on\")} ${theme.info(`http://${opts.host}:${opts.port}`)}`,\n );\n await startServer(parseInt(opts.port, 10), opts.host);\n });\n\n// ── chat ───────────────────────────────────────────────────\n\nprogram\n .command(\"chat\")\n .description(\"Interactive chat REPL\")\n .option(\"-w, --workspace <path>\", \"Workspace directory path\", \".\")\n .action(async (opts) => {\n emitBanner(VERSION);\n const dataDir = getDataDir();\n const configPath = path.join(dataDir, \"config.yaml\");\n const config = await loadConfig(configPath);\n const dbPath = path.join(dataDir, \"cortask.db\");\n const workspaceManager = new WorkspaceManager(dbPath);\n const secret = await getOrCreateSecret(dataDir);\n const credentialStore = new EncryptedCredentialStore(\n path.join(dataDir, \"credentials.enc.json\"),\n secret,\n );\n const cronService = new CronService(dbPath);\n const artifactStore = new ArtifactStore();\n\n // Resolve workspace\n const workspacePath = path.resolve(opts.workspace);\n const workspaces = await workspaceManager.list();\n let workspace = workspaces.find((w) => w.rootPath === workspacePath);\n if (!workspace) {\n workspace = await workspaceManager.create(\n path.basename(workspacePath),\n workspacePath,\n );\n console.log(\n `${theme.success(\"✓\")} Registered workspace: ${theme.command(workspace.name)}`,\n );\n }\n\n const sessionStore = new SessionStore(\n workspaceManager.getSessionDbPath(workspacePath),\n );\n\n // Load skills\n const bundledSkillsDir = path.resolve(\"skills\");\n const userSkillsDir = path.join(dataDir, \"skills\");\n const allSkills = await loadSkills(\n bundledSkillsDir,\n userSkillsDir,\n config.skills.dirs,\n credentialStore,\n );\n const eligible = getEligibleSkills(allSkills);\n const skillRegistry = await buildSkillTools(eligible, credentialStore);\n const skillToolHandlers: ToolHandler[] = skillRegistry.toolDefs.map((def) => ({\n definition: def,\n execute: async (args: Record<string, unknown>, context: Parameters<ToolHandler[\"execute\"]>[1]) => {\n const handler = skillRegistry.handlers.get(def.name);\n if (!handler) return { toolCallId: \"\", content: \"Tool not found\", isError: true };\n return handler(args, context.workspacePath);\n },\n }));\n const skillPrompts = eligible\n .map((s) => s.content)\n .filter(Boolean);\n\n // Build provider\n const providerId = (config.providers.default || \"anthropic\") as ProviderId;\n const providerConfig = config.providers[providerId];\n const apiKey = await credentialStore.get(`provider.${providerId}.apiKey`);\n if (!apiKey) {\n console.error(theme.error(`\\n✗ No API key for provider \"${providerId}\"`));\n console.error(theme.muted(\" Set it with:\"));\n console.error(\n theme.command(\n ` cortask credentials set provider.${providerId}.apiKey YOUR_KEY`,\n ),\n );\n console.log();\n process.exit(1);\n }\n const provider = createProvider(providerId, apiKey);\n const model =\n ((providerConfig as Record<string, unknown>)?.model as string) ??\n \"claude-sonnet-4-5-20250929\";\n\n const sessionId = `cli_${Date.now()}`;\n\n const runner = new AgentRunner({\n config: {\n provider,\n model,\n maxTurns: config.agent.maxTurns,\n temperature: config.agent.temperature,\n maxTokens: config.agent.maxTokens,\n },\n tools: [\n ...builtinTools,\n createCronTool(cronService),\n createArtifactTool(artifactStore),\n ...skillToolHandlers,\n ],\n getWorkspacePath: () => workspacePath,\n getDataDir: () => dataDir,\n getMemoryContent: () => workspaceManager.readMemory(workspacePath),\n getGlobalMemoryContent: () => workspaceManager.readGlobalMemory(dataDir),\n getSkillPrompts: () => skillPrompts,\n getSessionMessages: async (sid) => sessionStore.getMessages(sid),\n saveSessionMessages: async (sid, msgs) =>\n sessionStore.saveMessages(sid, msgs),\n });\n\n console.log(\n `${theme.muted(\"Workspace:\")} ${theme.info(workspacePath)}`,\n );\n console.log(\n `${theme.muted(\"Provider:\")} ${theme.command(providerId)} ${theme.muted(`(${model})`)}`,\n );\n console.log(\n theme.muted(\"Type a message, /help for commands, /quit to exit.\\n\"),\n );\n\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n prompt: `${theme.accent(\"you>\")} `,\n });\n\n rl.prompt();\n\n rl.on(\"line\", async (line) => {\n const input = line.trim();\n if (!input) {\n rl.prompt();\n return;\n }\n\n // Slash commands\n if (input.startsWith(\"/\")) {\n const cmd = input.toLowerCase();\n if (cmd === \"/quit\" || cmd === \"/exit\") {\n rl.close();\n return;\n }\n if (cmd === \"/help\") {\n console.log(theme.heading(\"\\nCommands:\"));\n console.log(` ${theme.command(\"/help\")} ${theme.muted(\"Show this help\")}`);\n console.log(` ${theme.command(\"/quit\")} ${theme.muted(\"Exit the REPL\")}`);\n console.log();\n rl.prompt();\n return;\n }\n console.log(theme.warn(`Unknown command: ${input}. Type /help for commands.`));\n rl.prompt();\n return;\n }\n\n process.stdout.write(`\\n${theme.accentBright(\"cortask>\")} `);\n try {\n for await (const event of runner.runStream({\n prompt: input,\n sessionId,\n })) {\n if (event.type === \"text_delta\" && event.text) {\n process.stdout.write(event.text);\n } else if (event.type === \"tool_call_start\") {\n process.stdout.write(\n `\\n${theme.muted(\"[\")}${theme.warn(\"tool\")}${theme.muted(\":\")} ${theme.command(event.toolName)}${theme.muted(\"]\")} `,\n );\n } else if (event.type === \"tool_result\") {\n const preview = event.toolResult?.content?.slice(0, 200) ?? \"\";\n process.stdout.write(`${theme.muted(\"→\")} ${theme.muted(preview)}\\n`);\n }\n }\n } catch (err) {\n console.error(\n theme.error(\n `\\n✗ ${err instanceof Error ? err.message : String(err)}`,\n ),\n );\n }\n process.stdout.write(\"\\n\\n\");\n rl.prompt();\n });\n\n rl.on(\"close\", () => {\n console.log(theme.muted(\"\\nGoodbye.\"));\n workspaceManager.close();\n process.exit(0);\n });\n });\n\n// ── run ────────────────────────────────────────────────────\n\nprogram\n .command(\"run\")\n .description(\"Run a one-shot prompt\")\n .argument(\"<prompt>\", \"The prompt to execute\")\n .option(\"-w, --workspace <path>\", \"Workspace directory path\", \".\")\n .action(async (prompt, opts) => {\n const dataDir = getDataDir();\n const configPath = path.join(dataDir, \"config.yaml\");\n const config = await loadConfig(configPath);\n const dbPath = path.join(dataDir, \"cortask.db\");\n const workspaceManager = new WorkspaceManager(dbPath);\n const secret = await getOrCreateSecret(dataDir);\n const credentialStore = new EncryptedCredentialStore(\n path.join(dataDir, \"credentials.enc.json\"),\n secret,\n );\n const cronService = new CronService(dbPath);\n const artifactStore = new ArtifactStore();\n\n const workspacePath = path.resolve(opts.workspace);\n const workspaces = await workspaceManager.list();\n let workspace = workspaces.find((w) => w.rootPath === workspacePath);\n if (!workspace) {\n workspace = await workspaceManager.create(\n path.basename(workspacePath),\n workspacePath,\n );\n }\n\n const sessionStore = new SessionStore(\n workspaceManager.getSessionDbPath(workspacePath),\n );\n\n const providerId = (config.providers.default || \"anthropic\") as ProviderId;\n const apiKey = await credentialStore.get(`provider.${providerId}.apiKey`);\n if (!apiKey) {\n console.error(theme.error(`\\n✗ No API key for provider \"${providerId}\".`));\n console.error(theme.muted(\" Set it with:\"));\n console.error(\n theme.command(\n ` cortask credentials set provider.${providerId}.apiKey YOUR_KEY`,\n ),\n );\n process.exit(1);\n }\n const provider = createProvider(providerId, apiKey);\n const providerConfig = config.providers[providerId];\n const model =\n ((providerConfig as Record<string, unknown>)?.model as string) ??\n \"claude-sonnet-4-5-20250929\";\n\n const runner = new AgentRunner({\n config: {\n provider,\n model,\n maxTurns: config.agent.maxTurns,\n temperature: config.agent.temperature,\n maxTokens: config.agent.maxTokens,\n },\n tools: [\n ...builtinTools,\n createCronTool(cronService),\n createArtifactTool(artifactStore),\n ],\n getWorkspacePath: () => workspacePath,\n getDataDir: () => dataDir,\n getMemoryContent: () => workspaceManager.readMemory(workspacePath),\n getGlobalMemoryContent: () => workspaceManager.readGlobalMemory(dataDir),\n getSkillPrompts: () => [],\n getSessionMessages: async (sid) => sessionStore.getMessages(sid),\n saveSessionMessages: async (sid, msgs) =>\n sessionStore.saveMessages(sid, msgs),\n });\n\n const result = await runner.run({ prompt });\n console.log(result.response);\n\n workspaceManager.close();\n });\n\n// ── setup, status, dashboard ──────────────────────────────\n\nprogram.addCommand(setupCommand);\nprogram.addCommand(statusCommand);\nprogram.addCommand(dashboardCommand);\n\n// ── workspaces ─────────────────────────────────────────────\n\nconst ws = program.command(\"workspaces\").description(\"Manage workspaces\");\n\nws.command(\"list\").action(async () => {\n const dataDir = getDataDir();\n const dbPath = path.join(dataDir, \"cortask.db\");\n const wm = new WorkspaceManager(dbPath);\n const list = await wm.list();\n if (list.length === 0) {\n console.log(theme.muted(\"No workspaces registered.\"));\n } else {\n for (const w of list) {\n console.log(\n ` ${theme.success(\"✓\")} ${theme.command(w.name)} ${theme.muted(\"→\")} ${theme.info(w.rootPath)} ${theme.muted(`(${w.id})`)}`,\n );\n }\n }\n wm.close();\n});\n\nws.command(\"add\")\n .argument(\"<name>\", \"Workspace name\")\n .argument(\"<path>\", \"Workspace directory path\")\n .action(async (name, dirPath) => {\n const dataDir = getDataDir();\n const dbPath = path.join(dataDir, \"cortask.db\");\n const wm = new WorkspaceManager(dbPath);\n const workspace = await wm.create(name, dirPath);\n console.log(\n `${theme.success(\"✓\")} Created workspace ${theme.command(workspace.name)} ${theme.muted(`(${workspace.id})`)}`,\n );\n console.log(` ${theme.muted(\"Path:\")} ${theme.info(workspace.rootPath)}`);\n wm.close();\n });\n\nws.command(\"remove\")\n .argument(\"<id>\", \"Workspace ID\")\n .action(async (id) => {\n const dataDir = getDataDir();\n const dbPath = path.join(dataDir, \"cortask.db\");\n const wm = new WorkspaceManager(dbPath);\n await wm.delete(id);\n console.log(`${theme.success(\"✓\")} Removed workspace ${theme.muted(id)}`);\n wm.close();\n });\n\n// ── credentials ────────────────────────────────────────────\n\nconst creds = program\n .command(\"credentials\")\n .description(\"Manage credentials\");\n\ncreds.command(\"list\").action(async () => {\n const dataDir = getDataDir();\n const secret = await getOrCreateSecret(dataDir);\n const store = new EncryptedCredentialStore(\n path.join(dataDir, \"credentials.enc.json\"),\n secret,\n );\n const keys = await store.list();\n if (keys.length === 0) {\n console.log(theme.muted(\"No credentials stored.\"));\n } else {\n for (const key of keys) {\n console.log(` ${theme.muted(\"•\")} ${theme.command(key)}`);\n }\n }\n});\n\ncreds\n .command(\"set\")\n .argument(\"<key>\", \"Credential key (e.g. provider.anthropic.apiKey)\")\n .argument(\"<value>\", \"Credential value\")\n .action(async (key, value) => {\n const dataDir = getDataDir();\n const secret = await getOrCreateSecret(dataDir);\n const store = new EncryptedCredentialStore(\n path.join(dataDir, \"credentials.enc.json\"),\n secret,\n );\n await store.set(key, value);\n console.log(`${theme.success(\"✓\")} Credential ${theme.command(key)} saved.`);\n });\n\ncreds\n .command(\"remove\")\n .argument(\"<key>\", \"Credential key\")\n .action(async (key) => {\n const dataDir = getDataDir();\n const secret = await getOrCreateSecret(dataDir);\n const store = new EncryptedCredentialStore(\n path.join(dataDir, \"credentials.enc.json\"),\n secret,\n );\n await store.delete(key);\n console.log(`${theme.success(\"✓\")} Credential ${theme.command(key)} removed.`);\n });\n\n// ── skills ─────────────────────────────────────────────────\n\nconst sk = program.command(\"skills\").description(\"Manage skills\");\n\nsk.command(\"list\").action(async () => {\n const dataDir = getDataDir();\n const secret = await getOrCreateSecret(dataDir);\n const credentialStore = new EncryptedCredentialStore(\n path.join(dataDir, \"credentials.enc.json\"),\n secret,\n );\n const bundledSkillsDir = path.resolve(\"skills\");\n const userSkillsDir = path.join(dataDir, \"skills\");\n const configPath = path.join(dataDir, \"config.yaml\");\n const config = await loadConfig(configPath);\n const allSkills = await loadSkills(\n bundledSkillsDir,\n userSkillsDir,\n config.skills.dirs,\n credentialStore,\n );\n if (allSkills.length === 0) {\n console.log(theme.muted(\"No skills found.\"));\n } else {\n for (const skill of allSkills) {\n const icon = skill.eligible ? theme.success(\"✓\") : theme.muted(\"○\");\n const name = theme.command(skill.manifest.name);\n const desc = theme.muted(skill.manifest.description ?? \"\");\n console.log(` ${icon} ${name} ${desc}`);\n }\n }\n});\n\nsk.command(\"install\")\n .argument(\"<git-url>\", \"Git URL of the skill repository\")\n .action(async (gitUrl) => {\n const dataDir = getDataDir();\n const userSkillsDir = path.join(dataDir, \"skills\");\n const result = await installSkillFromGit(gitUrl, userSkillsDir);\n console.log(\n `${theme.success(\"✓\")} Installed skill ${theme.command(result.name)}`,\n );\n });\n\nsk.command(\"remove\")\n .argument(\"<name>\", \"Skill name\")\n .action(async (name) => {\n const dataDir = getDataDir();\n const userSkillsDir = path.join(dataDir, \"skills\");\n await removeSkill(name, userSkillsDir);\n console.log(`${theme.success(\"✓\")} Removed skill ${theme.command(name)}`);\n });\n\n// ── cron ───────────────────────────────────────────────────\n\nconst cr = program.command(\"cron\").description(\"Manage cron jobs\");\n\ncr.command(\"list\").action(async () => {\n const dataDir = getDataDir();\n const dbPath = path.join(dataDir, \"cortask.db\");\n const cronService = new CronService(dbPath);\n const jobs = cronService.list();\n if (jobs.length === 0) {\n console.log(theme.muted(\"No cron jobs.\"));\n } else {\n for (const job of jobs) {\n const icon = job.enabled ? theme.success(\"✓\") : theme.muted(\"○\");\n console.log(` ${icon} ${theme.command(job.name)} ${theme.muted(`(${job.id})`)}`);\n console.log(` ${theme.muted(\"Schedule:\")} ${theme.info(JSON.stringify(job.schedule))}`);\n console.log(` ${theme.muted(\"Prompt:\")} ${job.prompt.slice(0, 80)}...`);\n }\n }\n cronService.stop();\n});\n\ncr.command(\"add\")\n .requiredOption(\"-n, --name <name>\", \"Job name\")\n .requiredOption(\"-s, --schedule <cron>\", \"Cron expression\")\n .requiredOption(\"-p, --prompt <prompt>\", \"Prompt to execute\")\n .option(\"-w, --workspace <id>\", \"Workspace ID\")\n .action(async (opts) => {\n const dataDir = getDataDir();\n const dbPath = path.join(dataDir, \"cortask.db\");\n const cronService = new CronService(dbPath);\n const job = cronService.add({\n name: opts.name,\n schedule: { type: \"cron\", expression: opts.schedule },\n prompt: opts.prompt,\n delivery: {},\n workspaceId: opts.workspace,\n });\n console.log(\n `${theme.success(\"✓\")} Created cron job ${theme.command(job.name)} ${theme.muted(`(${job.id})`)}`,\n );\n cronService.stop();\n });\n\ncr.command(\"remove\")\n .argument(\"<id>\", \"Job ID\")\n .action(async (id) => {\n const dataDir = getDataDir();\n const dbPath = path.join(dataDir, \"cortask.db\");\n const cronService = new CronService(dbPath);\n cronService.remove(id);\n console.log(`${theme.success(\"✓\")} Deleted cron job ${theme.muted(id)}`);\n cronService.stop();\n });\n\n// ── update ─────────────────────────────────────────────────\n\nprogram\n .command(\"update\")\n .description(\"Check for updates and optionally install them\")\n .option(\"--check\", \"Only check, do not install\")\n .action(async (opts) => {\n try {\n const res = await fetch(\"https://registry.npmjs.org/cortask/latest\");\n if (!res.ok) throw new Error(\"Failed to fetch from npm registry\");\n const data = (await res.json()) as { version: string };\n const latest = data.version;\n\n if (latest === VERSION) {\n console.log(`${theme.success(\"✓\")} You're on the latest version ${theme.info(VERSION)}`);\n return;\n }\n\n console.log(`${theme.info(\"Update available:\")} ${theme.muted(VERSION)} → ${theme.success(latest)}`);\n\n if (opts.check) return;\n\n console.log(`\\nRun the following command to update:\\n`);\n console.log(` ${theme.info(\"npm update -g cortask\")}\\n`);\n } catch (err) {\n console.error(\n `${theme.error(\"✗\")} Failed to check for updates: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n });\n\nprogram.parse();\n","import chalk, { Chalk } from \"chalk\";\n\nconst PALETTE = {\n accent: \"#6366f1\",\n accentBright: \"#818cf8\",\n accentDim: \"#a5b4fc\",\n info: \"#38bdf8\",\n success: \"#22c55e\",\n warn: \"#f59e0b\",\n error: \"#ef4444\",\n muted: \"#9ca3af\",\n};\n\nconst hasForceColor =\n typeof process.env.FORCE_COLOR === \"string\" &&\n process.env.FORCE_COLOR.trim().length > 0 &&\n process.env.FORCE_COLOR.trim() !== \"0\";\n\nconst baseChalk =\n process.env.NO_COLOR && !hasForceColor\n ? new Chalk({ level: 0 })\n : chalk;\n\nconst hex = (value: string) => baseChalk.hex(value);\n\nexport const theme = {\n accent: hex(PALETTE.accent),\n accentBright: hex(PALETTE.accentBright),\n accentDim: hex(PALETTE.accentDim),\n info: hex(PALETTE.info),\n success: hex(PALETTE.success),\n warn: hex(PALETTE.warn),\n error: hex(PALETTE.error),\n muted: hex(PALETTE.muted),\n heading: baseChalk.bold.hex(PALETTE.accent),\n command: hex(PALETTE.accentBright),\n option: hex(PALETTE.warn),\n} as const;\n\nexport const isRich = () => Boolean(baseChalk.level > 0);\n","import { isRich, theme } from \"./theme.js\";\n\nlet bannerEmitted = false;\n\nconst hasFlag = (argv: string[], ...flags: string[]) =>\n argv.some((arg) => flags.includes(arg));\n\nexport function emitBanner(version: string, argv?: string[]) {\n if (bannerEmitted) return;\n const args = argv ?? process.argv;\n if (!process.stdout.isTTY) return;\n if (hasFlag(args, \"--json\", \"--version\", \"-V\")) return;\n\n const title = \"⚡ Cortask\";\n const tagline = \"Local AI agent platform\";\n\n if (isRich()) {\n process.stdout.write(\n `\\n${theme.heading(title)} ${theme.info(version)} ${theme.muted(\"—\")} ${theme.accentDim(tagline)}\\n\\n`,\n );\n } else {\n process.stdout.write(`\\n${title} ${version} — ${tagline}\\n\\n`);\n }\n\n bannerEmitted = true;\n}\n\nexport function hasBannerEmitted(): boolean {\n return bannerEmitted;\n}\n","import type { Command } from \"commander\";\nimport { emitBanner, hasBannerEmitted } from \"./banner.js\";\nimport { theme } from \"./theme.js\";\n\nconst EXAMPLES = [\n [\"cortask serve\", \"Start the gateway server\"],\n [\"cortask chat\", \"Start interactive chat session\"],\n [\"cortask run \\\"hello\\\"\", \"Run a one-shot prompt\"],\n [\"cortask status\", \"Show system status\"],\n [\"cortask dashboard\", \"Open the web UI\"],\n [\"cortask setup\", \"Initialize configuration\"],\n [\"cortask workspaces list\", \"List registered workspaces\"],\n [\"cortask credentials set provider.anthropic.apiKey KEY\", \"Set API key\"],\n] as const;\n\nexport function configureHelp(program: Command, version: string) {\n program.helpOption(\"-h, --help\", \"Display help for command\");\n program.helpCommand(\"help [command]\", \"Display help for command\");\n\n program.configureHelp({\n sortSubcommands: true,\n sortOptions: true,\n optionTerm: (option) => theme.option(option.flags),\n subcommandTerm: (cmd) => theme.command(cmd.name()),\n });\n\n const formatHelp = (str: string) =>\n str\n .replace(/^Usage:/gm, theme.heading(\"Usage:\"))\n .replace(/^Options:/gm, theme.heading(\"Options:\"))\n .replace(/^Commands:/gm, theme.heading(\"Commands:\"))\n .replace(/^Arguments:/gm, theme.heading(\"Arguments:\"));\n\n program.configureOutput({\n writeOut: (str) => process.stdout.write(formatHelp(str)),\n writeErr: (str) => process.stderr.write(formatHelp(str)),\n outputError: (str, write) => write(theme.error(str)),\n });\n\n program.addHelpText(\"beforeAll\", () => {\n if (hasBannerEmitted()) return \"\";\n emitBanner(version);\n return \"\";\n });\n\n const fmtExamples = EXAMPLES.map(\n ([cmd, desc]) => ` ${theme.command(cmd)}\\n ${theme.muted(desc)}`,\n ).join(\"\\n\");\n\n program.addHelpText(\"afterAll\", ({ command }) => {\n if (command !== program) return \"\";\n return `\\n${theme.heading(\"Examples:\")}\\n${fmtExamples}\\n`;\n });\n}\n","import { Command } from \"commander\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { getDataDir } from \"@cortask/core\";\nimport { theme } from \"../terminal/theme.js\";\n\nconst DEFAULT_CONFIG = `# Cortask Configuration\nonboarded: true\n\nproviders:\n default: anthropic\n\nagent:\n maxTurns: 25\n temperature: 0.7\n\nserver:\n port: 3777\n host: 127.0.0.1\n\nskills:\n dirs: []\n`;\n\nfunction ensureDir(dir: string) {\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n}\n\nexport const setupCommand = new Command(\"setup\")\n .description(\"Initialize configuration and data directory\")\n .option(\"--force\", \"Overwrite existing configuration\")\n .action(async (opts: { force?: boolean }) => {\n const dataDir = getDataDir();\n const configPath = path.join(dataDir, \"config.yaml\");\n\n console.log(theme.heading(\"\\n⚡ Cortask Setup\\n\"));\n\n if (fs.existsSync(configPath) && !opts.force) {\n console.log(theme.warn(\"⚠ Configuration already exists:\"));\n console.log(theme.info(` ${configPath}`));\n console.log(theme.muted(\"\\n Use --force to overwrite\"));\n console.log();\n process.exit(1);\n }\n\n try {\n ensureDir(dataDir);\n console.log(`${theme.success(\"✓\")} Data directory: ${theme.info(dataDir)}`);\n\n fs.writeFileSync(configPath, DEFAULT_CONFIG, \"utf-8\");\n console.log(`${theme.success(\"✓\")} Config: ${theme.info(configPath)}`);\n\n const skillsDir = path.join(dataDir, \"skills\");\n ensureDir(skillsDir);\n console.log(`${theme.success(\"✓\")} Skills: ${theme.info(skillsDir)}`);\n\n console.log(theme.heading(\"\\n✓ Setup complete!\\n\"));\n\n console.log(theme.muted(\"Next steps:\"));\n console.log(theme.command(\" 1. Set your API key:\"));\n console.log(theme.info(` cortask credentials set provider.anthropic.apiKey YOUR_KEY`));\n console.log(theme.command(\"\\n 2. Add a workspace:\"));\n console.log(theme.info(\" cortask workspaces add my-project /path/to/project\"));\n console.log(theme.command(\"\\n 3. Start chatting:\"));\n console.log(theme.info(\" cortask chat -w /path/to/project\"));\n console.log();\n } catch (err) {\n console.error(theme.error(\"\\n✗ Setup failed\"));\n console.error(theme.muted(` ${(err as Error).message}`));\n process.exit(1);\n }\n });\n","import { Command } from \"commander\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { getDataDir, loadConfig, WorkspaceManager } from \"@cortask/core\";\nimport { theme } from \"../terminal/theme.js\";\n\nasync function fetchHealth(host: string, port: number) {\n try {\n const res = await fetch(`http://${host}:${port}/api/health`);\n if (!res.ok) return null;\n return res.json();\n } catch {\n return null;\n }\n}\n\nexport const statusCommand = new Command(\"status\")\n .description(\"Show system status and configuration\")\n .action(async () => {\n const dataDir = getDataDir();\n const configPath = path.join(dataDir, \"config.yaml\");\n\n if (!fs.existsSync(configPath)) {\n console.error(theme.error(\"\\n✗ No configuration found\"));\n console.error(theme.muted(\" Run this command to set up:\"));\n console.error(theme.command(\" cortask setup\"));\n console.log();\n process.exit(1);\n }\n\n try {\n const config = await loadConfig(configPath);\n const host = config.server.host;\n const port = config.server.port;\n\n console.log(theme.heading(\"\\n Configuration\"));\n console.log(` File: ${theme.info(configPath)}`);\n console.log(` Data: ${theme.info(dataDir)}`);\n\n // Gateway status\n console.log(theme.heading(\"\\n Gateway\"));\n const health = await fetchHealth(host, port);\n if (health) {\n console.log(` Status: ${theme.success(\"online\")}`);\n console.log(` URL: ${theme.info(`http://${host}:${port}`)}`);\n } else {\n console.log(` Status: ${theme.error(\"offline\")}`);\n console.log(` Expected: ${theme.muted(`http://${host}:${port}`)}`);\n }\n\n // Provider\n console.log(theme.heading(\"\\n Provider\"));\n console.log(` Default: ${theme.command(config.providers.default)}`);\n\n // Workspaces\n console.log(theme.heading(\"\\n Workspaces\"));\n const dbPath = path.join(dataDir, \"cortask.db\");\n if (fs.existsSync(dbPath)) {\n const wm = new WorkspaceManager(dbPath);\n const workspaces = await wm.list();\n if (workspaces.length === 0) {\n console.log(` ${theme.muted(\"No workspaces registered\")}`);\n } else {\n for (const w of workspaces) {\n console.log(` ${theme.success(\"✓\")} ${theme.command(w.name)} ${theme.muted(`→ ${w.rootPath}`)}`);\n }\n }\n wm.close();\n } else {\n console.log(` ${theme.muted(\"Database not initialized\")}`);\n }\n\n // Skills\n console.log(theme.heading(\"\\n Skills\"));\n const skillsDir = path.join(dataDir, \"skills\");\n if (fs.existsSync(skillsDir)) {\n const entries = fs.readdirSync(skillsDir).filter((e) =>\n fs.statSync(path.join(skillsDir, e)).isDirectory(),\n );\n console.log(` Installed: ${theme.info(entries.length.toString())} skill(s)`);\n } else {\n console.log(` ${theme.muted(\"No skills directory\")}`);\n }\n\n console.log();\n } catch (err) {\n console.error(theme.error(\"\\n✗ Failed to load status\"));\n console.error(theme.muted(` ${(err as Error).message}`));\n process.exit(1);\n }\n });\n","import { Command } from \"commander\";\nimport { exec } from \"node:child_process\";\nimport path from \"node:path\";\nimport { getDataDir, loadConfig } from \"@cortask/core\";\nimport { theme } from \"../terminal/theme.js\";\n\nfunction openBrowser(url: string): Promise<void> {\n const cmd =\n process.platform === \"win32\"\n ? `start ${url}`\n : process.platform === \"darwin\"\n ? `open ${url}`\n : `xdg-open ${url}`;\n\n return new Promise((resolve, reject) => {\n exec(cmd, (err) => (err ? reject(err) : resolve()));\n });\n}\n\nasync function isGatewayOnline(host: string, port: number): Promise<boolean> {\n try {\n const res = await fetch(`http://${host}:${port}/api/health`);\n return res.ok;\n } catch {\n return false;\n }\n}\n\nexport const dashboardCommand = new Command(\"dashboard\")\n .description(\"Open the web UI in your browser\")\n .option(\"--no-open\", \"Print URL without opening browser\")\n .action(async (opts: { open: boolean }) => {\n const dataDir = getDataDir();\n const configPath = path.join(dataDir, \"config.yaml\");\n const config = await loadConfig(configPath);\n const url = `http://${config.server.host}:${config.server.port}`;\n\n const online = await isGatewayOnline(config.server.host, config.server.port);\n if (!online) {\n console.log(theme.warn(\"\\n⚠ Gateway appears to be offline\"));\n console.log(theme.muted(\" Start it with:\"));\n console.log(theme.command(\" cortask serve\"));\n console.log();\n }\n\n if (opts.open) {\n console.log(theme.info(`\\nOpening dashboard: ${url}`));\n try {\n await openBrowser(url);\n console.log(theme.success(\"✓ Browser opened\"));\n } catch {\n console.log(theme.warn(\"\\n⚠ Could not open browser automatically\"));\n console.log(theme.info(` Open this URL manually: ${url}`));\n }\n } else {\n console.log(theme.info(`\\nDashboard URL: ${url}`));\n }\n console.log();\n });\n"],"mappings":"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","names":["Command","loadConfig","getDataDir","WorkspaceManager","path","program","Command","fs","path","getDataDir","Command","getDataDir","path","fs","Command","path","getDataDir","loadConfig","Command","getDataDir","path","loadConfig","require","Command","getDataDir","path","loadConfig","WorkspaceManager"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cortask",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.20",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"description": "Local AI agent with skills, workspaces, and cron",
|
|
@@ -18,8 +18,8 @@
|
|
|
18
18
|
"dependencies": {
|
|
19
19
|
"chalk": "^5.6.2",
|
|
20
20
|
"commander": "^12.1.0",
|
|
21
|
-
"@cortask/core": "0.2.
|
|
22
|
-
"@cortask/gateway": "0.2.
|
|
21
|
+
"@cortask/core": "0.2.20",
|
|
22
|
+
"@cortask/gateway": "0.2.20"
|
|
23
23
|
},
|
|
24
24
|
"devDependencies": {
|
|
25
25
|
"@types/node": "^22.0.0",
|