warden-code 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/LICENSE +190 -0
  2. package/README.md +82 -0
  3. package/dist/cli/commands/clear.d.ts +3 -0
  4. package/dist/cli/commands/clear.d.ts.map +1 -0
  5. package/dist/cli/commands/clear.js +10 -0
  6. package/dist/cli/commands/clear.js.map +1 -0
  7. package/dist/cli/commands/exit.d.ts +3 -0
  8. package/dist/cli/commands/exit.d.ts.map +1 -0
  9. package/dist/cli/commands/exit.js +12 -0
  10. package/dist/cli/commands/exit.js.map +1 -0
  11. package/dist/cli/commands/help.d.ts +4 -0
  12. package/dist/cli/commands/help.d.ts.map +1 -0
  13. package/dist/cli/commands/help.js +44 -0
  14. package/dist/cli/commands/help.js.map +1 -0
  15. package/dist/cli/commands/index.d.ts +6 -0
  16. package/dist/cli/commands/index.d.ts.map +1 -0
  17. package/dist/cli/commands/index.js +6 -0
  18. package/dist/cli/commands/index.js.map +1 -0
  19. package/dist/cli/commands/new.d.ts +3 -0
  20. package/dist/cli/commands/new.d.ts.map +1 -0
  21. package/dist/cli/commands/new.js +184 -0
  22. package/dist/cli/commands/new.js.map +1 -0
  23. package/dist/cli/commands/registry.d.ts +12 -0
  24. package/dist/cli/commands/registry.d.ts.map +1 -0
  25. package/dist/cli/commands/registry.js +53 -0
  26. package/dist/cli/commands/registry.js.map +1 -0
  27. package/dist/cli/context.d.ts +3 -0
  28. package/dist/cli/context.d.ts.map +1 -0
  29. package/dist/cli/context.js +19 -0
  30. package/dist/cli/context.js.map +1 -0
  31. package/dist/cli/index.d.ts +3 -0
  32. package/dist/cli/index.d.ts.map +1 -0
  33. package/dist/cli/index.js +59 -0
  34. package/dist/cli/index.js.map +1 -0
  35. package/dist/cli/services/project.d.ts +8 -0
  36. package/dist/cli/services/project.d.ts.map +1 -0
  37. package/dist/cli/services/project.js +57 -0
  38. package/dist/cli/services/project.js.map +1 -0
  39. package/dist/cli/services/scaffolder.d.ts +10 -0
  40. package/dist/cli/services/scaffolder.d.ts.map +1 -0
  41. package/dist/cli/services/scaffolder.js +125 -0
  42. package/dist/cli/services/scaffolder.js.map +1 -0
  43. package/dist/cli/types.d.ts +37 -0
  44. package/dist/cli/types.d.ts.map +1 -0
  45. package/dist/cli/types.js +2 -0
  46. package/dist/cli/types.js.map +1 -0
  47. package/dist/cli/ui/format.d.ts +4 -0
  48. package/dist/cli/ui/format.d.ts.map +1 -0
  49. package/dist/cli/ui/format.js +23 -0
  50. package/dist/cli/ui/format.js.map +1 -0
  51. package/dist/templates/blank-multiturn/agent.ts.template +62 -0
  52. package/dist/templates/blank-streaming/agent.ts.template +62 -0
  53. package/dist/templates/openai-multiturn/agent.ts.template +99 -0
  54. package/dist/templates/openai-streaming/agent.ts.template +103 -0
  55. package/package.json +62 -0
@@ -0,0 +1,53 @@
1
+ export class CommandRegistry {
2
+ commands = new Map();
3
+ aliases = new Map();
4
+ register(command) {
5
+ this.commands.set(command.name, command);
6
+ if (command.aliases) {
7
+ for (const alias of command.aliases) {
8
+ this.aliases.set(alias, command.name);
9
+ }
10
+ }
11
+ }
12
+ get(name) {
13
+ const resolvedName = this.aliases.get(name) ?? name;
14
+ return this.commands.get(resolvedName);
15
+ }
16
+ has(name) {
17
+ return this.commands.has(name) || this.aliases.has(name);
18
+ }
19
+ all() {
20
+ return Array.from(this.commands.values()).sort((a, b) => (a.order ?? 100) - (b.order ?? 100));
21
+ }
22
+ async execute(input, context) {
23
+ const parsed = this.parseInput(input);
24
+ if (!parsed) {
25
+ return false;
26
+ }
27
+ const { commandName, args } = parsed;
28
+ const command = this.get(commandName);
29
+ if (!command) {
30
+ context.log.error(`Unknown command: /${commandName}`);
31
+ context.log.dim("Type /help to see available commands");
32
+ return true;
33
+ }
34
+ await command.handler(args, context);
35
+ return true;
36
+ }
37
+ parseInput(input) {
38
+ const trimmed = input.trim();
39
+ if (!trimmed.startsWith("/")) {
40
+ return null;
41
+ }
42
+ const parts = trimmed.slice(1).split(/\s+/);
43
+ const commandName = parts[0]?.toLowerCase();
44
+ if (!commandName) {
45
+ return null;
46
+ }
47
+ return {
48
+ commandName,
49
+ args: parts.slice(1),
50
+ };
51
+ }
52
+ }
53
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/cli/commands/registry.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,eAAe;IAClB,QAAQ,GAA8B,IAAI,GAAG,EAAE,CAAC;IAChD,OAAO,GAAwB,IAAI,GAAG,EAAE,CAAC;IAEjD,QAAQ,CAAC,OAAqB;QAC5B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACzC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpB,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBACpC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;YACxC,CAAC;QACH,CAAC;IACH,CAAC;IAED,GAAG,CAAC,IAAY;QACd,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;QACpD,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IACzC,CAAC;IAED,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC3D,CAAC;IAED,GAAG;QACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAC5C,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,CAAC,CAC9C,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,KAAa,EAAE,OAAmB;QAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QACtC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC;QACrC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAEtC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,qBAAqB,WAAW,EAAE,CAAC,CAAC;YACtD,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;YACxD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACrC,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,UAAU,CAChB,KAAa;QAEb,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;QAC7B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC5C,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC;QAC5C,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO;YACL,WAAW;YACX,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;SACrB,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,3 @@
1
+ import type { CliContext } from "./types.js";
2
+ export declare function createContext(cwd: string): CliContext;
3
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/cli/context.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAU,MAAM,YAAY,CAAC;AAYrD,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAMrD"}
@@ -0,0 +1,19 @@
1
+ import chalk from "chalk";
2
+ import ora from "ora";
3
+ function createLogger() {
4
+ return {
5
+ info: (msg) => console.log(chalk.blue("ℹ"), msg),
6
+ success: (msg) => console.log(chalk.green("✓"), msg),
7
+ error: (msg) => console.log(chalk.red("✗"), msg),
8
+ warn: (msg) => console.log(chalk.yellow("⚠"), msg),
9
+ dim: (msg) => console.log(chalk.dim(msg)),
10
+ };
11
+ }
12
+ export function createContext(cwd) {
13
+ return {
14
+ cwd,
15
+ log: createLogger(),
16
+ spinner: (msg) => ora(msg),
17
+ };
18
+ }
19
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/cli/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AAGtB,SAAS,YAAY;IACnB,OAAO;QACL,IAAI,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC;QACxD,OAAO,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC;QAC5D,KAAK,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC;QACxD,IAAI,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC;QAC1D,GAAG,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;KAClD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,OAAO;QACL,GAAG;QACH,GAAG,EAAE,YAAY,EAAE;QACnB,OAAO,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC;KACnC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,59 @@
1
+ #!/usr/bin/env node
2
+ import * as readline from "node:readline";
3
+ import { createContext } from "./context.js";
4
+ import { CommandRegistry, createHelpCommand, clearCommand, exitCommand, newCommand, } from "./commands/index.js";
5
+ import { banner, prompt } from "./ui/format.js";
6
+ async function main() {
7
+ const context = createContext(process.cwd());
8
+ const registry = new CommandRegistry();
9
+ // Register commands
10
+ registry.register(createHelpCommand(registry));
11
+ registry.register(clearCommand);
12
+ registry.register(exitCommand);
13
+ registry.register(newCommand);
14
+ // Display welcome banner and available commands
15
+ console.log(banner());
16
+ await registry.execute("/help", context);
17
+ const createRl = () => readline.createInterface({
18
+ input: process.stdin,
19
+ output: process.stdout,
20
+ });
21
+ let rl = createRl();
22
+ let pausedForCommand = false;
23
+ const handleClose = () => {
24
+ if (pausedForCommand)
25
+ return;
26
+ console.log("\nGoodbye!");
27
+ process.exit(0);
28
+ };
29
+ rl.on("close", handleClose);
30
+ const promptUser = () => {
31
+ rl.question(prompt(), async (input) => {
32
+ const trimmed = input.trim();
33
+ if (!trimmed) {
34
+ promptUser();
35
+ return;
36
+ }
37
+ if (trimmed.startsWith("/")) {
38
+ // Close readline before running command (Inquirer needs stdin)
39
+ pausedForCommand = true;
40
+ rl.close();
41
+ await registry.execute(trimmed, context);
42
+ // Recreate readline after command completes
43
+ rl = createRl();
44
+ pausedForCommand = false;
45
+ rl.on("close", handleClose);
46
+ }
47
+ else {
48
+ context.log.dim("Commands start with /. Type /help for available commands.");
49
+ }
50
+ promptUser();
51
+ });
52
+ };
53
+ promptUser();
54
+ }
55
+ main().catch((err) => {
56
+ console.error("Fatal error:", err);
57
+ process.exit(1);
58
+ });
59
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAEA,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,YAAY,EACZ,WAAW,EACX,UAAU,GACX,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAEhD,KAAK,UAAU,IAAI;IACjB,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAC7C,MAAM,QAAQ,GAAG,IAAI,eAAe,EAAE,CAAC;IAEvC,oBAAoB;IACpB,QAAQ,CAAC,QAAQ,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC/C,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;IAChC,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC/B,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAE9B,gDAAgD;IAChD,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;IACtB,MAAM,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAEzC,MAAM,QAAQ,GAAG,GAAG,EAAE,CACpB,QAAQ,CAAC,eAAe,CAAC;QACvB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IAEL,IAAI,EAAE,GAAG,QAAQ,EAAE,CAAC;IACpB,IAAI,gBAAgB,GAAG,KAAK,CAAC;IAE7B,MAAM,WAAW,GAAG,GAAG,EAAE;QACvB,IAAI,gBAAgB;YAAE,OAAO;QAC7B,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAC1B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IAEF,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAE5B,MAAM,UAAU,GAAG,GAAG,EAAE;QACtB,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;YACpC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;YAE7B,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,UAAU,EAAE,CAAC;gBACb,OAAO;YACT,CAAC;YAED,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC5B,+DAA+D;gBAC/D,gBAAgB,GAAG,IAAI,CAAC;gBACxB,EAAE,CAAC,KAAK,EAAE,CAAC;gBACX,MAAM,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBACzC,4CAA4C;gBAC5C,EAAE,GAAG,QAAQ,EAAE,CAAC;gBAChB,gBAAgB,GAAG,KAAK,CAAC;gBACzB,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;YAC9B,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,GAAG,CACb,2DAA2D,CAC5D,CAAC;YACJ,CAAC;YAED,UAAU,EAAE,CAAC;QACf,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,UAAU,EAAE,CAAC;AACf,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;IACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ export declare function isDirectoryEmpty(dirPath: string): Promise<boolean>;
2
+ export declare function directoryExists(dirPath: string): Promise<boolean>;
3
+ export declare function fileExists(filePath: string): Promise<boolean>;
4
+ export declare function createDirectory(dirPath: string): Promise<void>;
5
+ export declare function writeFile(filePath: string, content: string): Promise<void>;
6
+ export declare function readFile(filePath: string): Promise<string>;
7
+ export declare function copyDirectory(src: string, dest: string): Promise<void>;
8
+ //# sourceMappingURL=project.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../../src/cli/services/project.ts"],"names":[],"mappings":"AAGA,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CASxE;AAED,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOvE;AAED,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOnE;AAED,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEpE;AAED,wBAAsB,SAAS,CAC7B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAIf;AAED,wBAAsB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAEhE;AAED,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAc5E"}
@@ -0,0 +1,57 @@
1
+ import * as fs from "node:fs/promises";
2
+ import * as path from "node:path";
3
+ export async function isDirectoryEmpty(dirPath) {
4
+ try {
5
+ const entries = await fs.readdir(dirPath);
6
+ // Ignore hidden files like .git, .claude, etc.
7
+ const visibleEntries = entries.filter((e) => !e.startsWith("."));
8
+ return visibleEntries.length === 0;
9
+ }
10
+ catch {
11
+ return true;
12
+ }
13
+ }
14
+ export async function directoryExists(dirPath) {
15
+ try {
16
+ const stat = await fs.stat(dirPath);
17
+ return stat.isDirectory();
18
+ }
19
+ catch {
20
+ return false;
21
+ }
22
+ }
23
+ export async function fileExists(filePath) {
24
+ try {
25
+ const stat = await fs.stat(filePath);
26
+ return stat.isFile();
27
+ }
28
+ catch {
29
+ return false;
30
+ }
31
+ }
32
+ export async function createDirectory(dirPath) {
33
+ await fs.mkdir(dirPath, { recursive: true });
34
+ }
35
+ export async function writeFile(filePath, content) {
36
+ const dir = path.dirname(filePath);
37
+ await createDirectory(dir);
38
+ await fs.writeFile(filePath, content, "utf-8");
39
+ }
40
+ export async function readFile(filePath) {
41
+ return fs.readFile(filePath, "utf-8");
42
+ }
43
+ export async function copyDirectory(src, dest) {
44
+ await createDirectory(dest);
45
+ const entries = await fs.readdir(src, { withFileTypes: true });
46
+ for (const entry of entries) {
47
+ const srcPath = path.join(src, entry.name);
48
+ const destPath = path.join(dest, entry.name);
49
+ if (entry.isDirectory()) {
50
+ await copyDirectory(srcPath, destPath);
51
+ }
52
+ else {
53
+ await fs.copyFile(srcPath, destPath);
54
+ }
55
+ }
56
+ }
57
+ //# sourceMappingURL=project.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.js","sourceRoot":"","sources":["../../../src/cli/services/project.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,OAAe;IACpD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC1C,+CAA+C;QAC/C,MAAM,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;QACjE,OAAO,cAAc,CAAC,MAAM,KAAK,CAAC,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAAe;IACnD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACpC,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,QAAgB;IAC/C,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACrC,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;IACvB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAAe;IACnD,MAAM,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,QAAgB,EAChB,OAAe;IAEf,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACnC,MAAM,eAAe,CAAC,GAAG,CAAC,CAAC;IAC3B,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,QAAgB;IAC7C,OAAO,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,GAAW,EAAE,IAAY;IAC3D,MAAM,eAAe,CAAC,IAAI,CAAC,CAAC;IAC5B,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAE/D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAE7C,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,MAAM,aAAa,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACzC,CAAC;aAAM,CAAC;YACN,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { AgentConfig } from "../types.js";
2
+ export declare function getTemplateDir(template: string): Promise<string>;
3
+ export declare function readTemplate(template: string, filename: string): Promise<string>;
4
+ export declare function processTemplate(content: string, config: AgentConfig): string;
5
+ export declare function scaffoldAgent(targetDir: string, config: AgentConfig): Promise<void>;
6
+ /**
7
+ * Check if a template exists.
8
+ */
9
+ export declare function templateExists(template: string): Promise<boolean>;
10
+ //# sourceMappingURL=scaffolder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffolder.d.ts","sourceRoot":"","sources":["../../../src/cli/services/scaffolder.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAK/C,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAGtE;AAED,wBAAsB,YAAY,CAChC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,CAAC,CAIjB;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,MAAM,CAY5E;AAiFD,wBAAsB,aAAa,CACjC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,IAAI,CAAC,CA8Bf;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAQvE"}
@@ -0,0 +1,125 @@
1
+ import * as fs from "node:fs/promises";
2
+ import * as path from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ import { writeFile } from "./project.js";
5
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
6
+ export async function getTemplateDir(template) {
7
+ // Navigate from dist/cli/services to dist/templates
8
+ return path.resolve(__dirname, "../../templates", template);
9
+ }
10
+ export async function readTemplate(template, filename) {
11
+ const templateDir = await getTemplateDir(template);
12
+ const filePath = path.join(templateDir, filename);
13
+ return fs.readFile(filePath, "utf-8");
14
+ }
15
+ export function processTemplate(content, config) {
16
+ const skillsStr = config.skills
17
+ .map((s) => `{\n id: "${s.id}",\n name: "${s.name}",\n description: "${s.description}",\n tags: [],\n }`)
18
+ .join(",\n ");
19
+ return content
20
+ .replace(/\{\{name\}\}/g, config.name)
21
+ .replace(/\{\{description\}\}/g, config.description)
22
+ .replace(/\{\{skills\}\}/g, skillsStr);
23
+ }
24
+ /**
25
+ * Get the template directory name based on base template and capability.
26
+ */
27
+ function getTemplateDirName(config) {
28
+ const capability = config.capabilities.streaming ? "streaming" : "multiturn";
29
+ return `${config.template}-${capability}`;
30
+ }
31
+ function generatePackageJson(config) {
32
+ const pkg = {
33
+ name: config.name,
34
+ version: "0.1.0",
35
+ type: "module",
36
+ main: "dist/agent.js",
37
+ scripts: {
38
+ build: "tsc",
39
+ dev: "tsc --watch",
40
+ agent: "node dist/agent.js",
41
+ },
42
+ dependencies: {
43
+ "@wardenprotocol/agent-kit": "^0.2.0",
44
+ dotenv: "^16.4.0",
45
+ },
46
+ devDependencies: {
47
+ "@types/node": "^22.8.1",
48
+ typescript: "^5.6.3",
49
+ },
50
+ };
51
+ // Add OpenAI dependency if using OpenAI template
52
+ if (config.template === "openai") {
53
+ pkg.dependencies["openai"] = "^4.69.0";
54
+ }
55
+ return JSON.stringify(pkg, null, 2);
56
+ }
57
+ function generateTsConfig() {
58
+ const tsconfig = {
59
+ compilerOptions: {
60
+ target: "ES2022",
61
+ module: "NodeNext",
62
+ moduleResolution: "NodeNext",
63
+ lib: ["ES2022"],
64
+ outDir: "./dist",
65
+ rootDir: "./src",
66
+ strict: true,
67
+ esModuleInterop: true,
68
+ skipLibCheck: true,
69
+ forceConsistentCasingInFileNames: true,
70
+ declaration: true,
71
+ sourceMap: true,
72
+ },
73
+ include: ["src/**/*"],
74
+ exclude: ["node_modules", "dist"],
75
+ };
76
+ return JSON.stringify(tsconfig, null, 2);
77
+ }
78
+ const GITIGNORE = `node_modules/
79
+ dist/
80
+ coverage/
81
+ *.log
82
+ .DS_Store
83
+ .env
84
+ .env.local
85
+ `;
86
+ const ENV_EXAMPLE_BLANK = `HOST=localhost
87
+ PORT=3000
88
+ `;
89
+ const ENV_EXAMPLE_OPENAI = `HOST=localhost
90
+ PORT=3000
91
+ OPENAI_API_KEY=your-api-key-here
92
+ OPENAI_MODEL=gpt-4o-mini
93
+ `;
94
+ export async function scaffoldAgent(targetDir, config) {
95
+ // Get the appropriate template directory based on template + capability
96
+ const templateDirName = getTemplateDirName(config);
97
+ // Read and process the agent template
98
+ const templateContent = await readTemplate(templateDirName, "agent.ts.template");
99
+ const processedContent = processTemplate(templateContent, config);
100
+ // Write the agent file
101
+ await writeFile(path.join(targetDir, "src", "agent.ts"), processedContent);
102
+ // Write package.json
103
+ await writeFile(path.join(targetDir, "package.json"), generatePackageJson(config));
104
+ // Write tsconfig.json
105
+ await writeFile(path.join(targetDir, "tsconfig.json"), generateTsConfig());
106
+ // Write .gitignore
107
+ await writeFile(path.join(targetDir, ".gitignore"), GITIGNORE);
108
+ // Write .env.example
109
+ const envExample = config.template === "openai" ? ENV_EXAMPLE_OPENAI : ENV_EXAMPLE_BLANK;
110
+ await writeFile(path.join(targetDir, ".env.example"), envExample);
111
+ }
112
+ /**
113
+ * Check if a template exists.
114
+ */
115
+ export async function templateExists(template) {
116
+ try {
117
+ const dir = await getTemplateDir(template);
118
+ await fs.access(dir);
119
+ return true;
120
+ }
121
+ catch {
122
+ return false;
123
+ }
124
+ }
125
+ //# sourceMappingURL=scaffolder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffolder.js","sourceRoot":"","sources":["../../../src/cli/services/scaffolder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import type { Ora } from "ora";
2
+ export interface SlashCommand {
3
+ name: string;
4
+ description: string;
5
+ aliases?: string[];
6
+ usage?: string;
7
+ order?: number;
8
+ handler: (args: string[], context: CliContext) => Promise<void>;
9
+ }
10
+ export interface Logger {
11
+ info: (msg: string) => void;
12
+ success: (msg: string) => void;
13
+ error: (msg: string) => void;
14
+ warn: (msg: string) => void;
15
+ dim: (msg: string) => void;
16
+ }
17
+ export interface CliContext {
18
+ cwd: string;
19
+ log: Logger;
20
+ spinner: (msg: string) => Ora;
21
+ }
22
+ export interface AgentConfig {
23
+ name: string;
24
+ description: string;
25
+ template: "blank" | "openai";
26
+ capabilities: {
27
+ streaming: boolean;
28
+ multiTurn: boolean;
29
+ };
30
+ skills: AgentSkill[];
31
+ }
32
+ export interface AgentSkill {
33
+ id: string;
34
+ name: string;
35
+ description: string;
36
+ }
37
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/cli/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE/B,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACjE;AAED,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5B,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5B,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAC5B;AAED,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,GAAG,CAAC;CAC/B;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,GAAG,QAAQ,CAAC;IAC7B,YAAY,EAAE;QACZ,SAAS,EAAE,OAAO,CAAC;QACnB,SAAS,EAAE,OAAO,CAAC;KACpB,CAAC;IACF,MAAM,EAAE,UAAU,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/cli/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,4 @@
1
+ export declare function banner(): string;
2
+ export declare function prompt(): string;
3
+ export declare function commandHelp(name: string, description: string, usage?: string): string;
4
+ //# sourceMappingURL=format.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../../src/cli/ui/format.ts"],"names":[],"mappings":"AAEA,wBAAgB,MAAM,IAAI,MAAM,CAS/B;AAED,wBAAgB,MAAM,IAAI,MAAM,CAE/B;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAOrF"}
@@ -0,0 +1,23 @@
1
+ import chalk from "chalk";
2
+ export function banner() {
3
+ return chalk.cyan(`
4
+ __ __ _
5
+ \\ \\ / /_ _ _ __ __| | ___ _ __
6
+ \\ \\ /\\ / / _\` | '__/ _\` |/ _ \\ '_ \\
7
+ \\ V V / (_| | | | (_| | __/ | | |
8
+ \\_/\\_/ \\__,_|_| \\__,_|\\___|_| |_|
9
+
10
+ `) + chalk.dim(" Agent Development CLI\n");
11
+ }
12
+ export function prompt() {
13
+ return chalk.green("warden") + chalk.dim("> ");
14
+ }
15
+ export function commandHelp(name, description, usage) {
16
+ let output = ` ${chalk.cyan("/" + name)}`;
17
+ output += chalk.dim(` - ${description}`);
18
+ if (usage) {
19
+ output += `\n ${chalk.dim("Usage:")} ${usage}`;
20
+ }
21
+ return output;
22
+ }
23
+ //# sourceMappingURL=format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../../../src/cli/ui/format.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,UAAU,MAAM;IACpB,OAAO,KAAK,CAAC,IAAI,CAAC;;;;;;;CAOnB,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,MAAM;IACpB,OAAO,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,WAAmB,EAAE,KAAc;IAC3E,IAAI,MAAM,GAAG,KAAK,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC;IAC3C,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,MAAM,WAAW,EAAE,CAAC,CAAC;IACzC,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,IAAI,SAAS,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,KAAK,EAAE,CAAC;IACpD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,62 @@
1
+ import "dotenv/config";
2
+ import { AgentServer } from "@wardenprotocol/agent-kit";
3
+ import type { TaskContext, TaskYieldUpdate } from "@wardenprotocol/agent-kit";
4
+
5
+ const PORT = Number(process.env.PORT) || 3000;
6
+ const HOST = process.env.HOST || "localhost";
7
+ const BASE_URL = `http://${HOST}:${PORT}`;
8
+
9
+ const server = new AgentServer({
10
+ agentCard: {
11
+ name: "{{name}}",
12
+ description: "{{description}}",
13
+ url: BASE_URL,
14
+ version: "0.1.0",
15
+ capabilities: {
16
+ streaming: false,
17
+ multiTurn: true,
18
+ },
19
+ skills: [{{skills}}],
20
+ },
21
+ handler: async function* (context: TaskContext): AsyncGenerator<TaskYieldUpdate> {
22
+ const userMessage = context.message.parts
23
+ ?.filter((p) => p.type === "text")
24
+ .map((p) => p.text)
25
+ .join("\n");
26
+
27
+ if (!userMessage) {
28
+ yield {
29
+ state: "completed",
30
+ message: {
31
+ role: "agent",
32
+ parts: [{ type: "text", text: "No message provided." }],
33
+ },
34
+ };
35
+ return;
36
+ }
37
+
38
+ // TODO: Implement your agent logic here
39
+ yield {
40
+ state: "completed",
41
+ message: {
42
+ role: "agent",
43
+ parts: [{ type: "text", text: `Echo: ${userMessage}` }],
44
+ },
45
+ };
46
+ },
47
+ });
48
+
49
+ server.listen(PORT).then(() => {
50
+ console.log(`{{name}} (Dual Protocol)`);
51
+ console.log(`Server: ${BASE_URL}`);
52
+ console.log();
53
+ console.log("A2A Protocol:");
54
+ console.log(` Agent Card: ${BASE_URL}/.well-known/agent-card.json`);
55
+ console.log(` JSON-RPC: POST ${BASE_URL}/`);
56
+ console.log();
57
+ console.log("LangGraph Protocol:");
58
+ console.log(` Info: ${BASE_URL}/info`);
59
+ console.log(` Assistants: ${BASE_URL}/assistants`);
60
+ console.log(` Threads: ${BASE_URL}/threads`);
61
+ console.log(` Runs: ${BASE_URL}/runs`);
62
+ });
@@ -0,0 +1,62 @@
1
+ import "dotenv/config";
2
+ import { AgentServer } from "@wardenprotocol/agent-kit";
3
+ import type { TaskContext, TaskYieldUpdate } from "@wardenprotocol/agent-kit";
4
+
5
+ const PORT = Number(process.env.PORT) || 3000;
6
+ const HOST = process.env.HOST || "localhost";
7
+ const BASE_URL = `http://${HOST}:${PORT}`;
8
+
9
+ const server = new AgentServer({
10
+ agentCard: {
11
+ name: "{{name}}",
12
+ description: "{{description}}",
13
+ url: BASE_URL,
14
+ version: "0.1.0",
15
+ capabilities: {
16
+ streaming: true,
17
+ multiTurn: false,
18
+ },
19
+ skills: [{{skills}}],
20
+ },
21
+ handler: async function* (context: TaskContext): AsyncGenerator<TaskYieldUpdate> {
22
+ const userMessage = context.message.parts
23
+ ?.filter((p) => p.type === "text")
24
+ .map((p) => p.text)
25
+ .join("\n");
26
+
27
+ if (!userMessage) {
28
+ yield {
29
+ state: "completed",
30
+ message: {
31
+ role: "agent",
32
+ parts: [{ type: "text", text: "No message provided." }],
33
+ },
34
+ };
35
+ return;
36
+ }
37
+
38
+ // TODO: Implement your agent logic here
39
+ yield {
40
+ state: "completed",
41
+ message: {
42
+ role: "agent",
43
+ parts: [{ type: "text", text: `Echo: ${userMessage}` }],
44
+ },
45
+ };
46
+ },
47
+ });
48
+
49
+ server.listen(PORT).then(() => {
50
+ console.log(`{{name}} (Dual Protocol)`);
51
+ console.log(`Server: ${BASE_URL}`);
52
+ console.log();
53
+ console.log("A2A Protocol:");
54
+ console.log(` Agent Card: ${BASE_URL}/.well-known/agent-card.json`);
55
+ console.log(` JSON-RPC: POST ${BASE_URL}/`);
56
+ console.log();
57
+ console.log("LangGraph Protocol:");
58
+ console.log(` Info: ${BASE_URL}/info`);
59
+ console.log(` Assistants: ${BASE_URL}/assistants`);
60
+ console.log(` Threads: ${BASE_URL}/threads`);
61
+ console.log(` Runs: ${BASE_URL}/runs`);
62
+ });