wardo 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 (76) hide show
  1. package/README.md +82 -0
  2. package/dist/agents/claude.d.ts +25 -0
  3. package/dist/agents/claude.d.ts.map +1 -0
  4. package/dist/agents/claude.js +83 -0
  5. package/dist/agents/claude.js.map +1 -0
  6. package/dist/agents/codex.d.ts +26 -0
  7. package/dist/agents/codex.d.ts.map +1 -0
  8. package/dist/agents/codex.js +81 -0
  9. package/dist/agents/codex.js.map +1 -0
  10. package/dist/agents/index.d.ts +3 -0
  11. package/dist/agents/index.d.ts.map +1 -0
  12. package/dist/agents/index.js +3 -0
  13. package/dist/agents/index.js.map +1 -0
  14. package/dist/cli.d.ts +3 -0
  15. package/dist/cli.d.ts.map +1 -0
  16. package/dist/cli.js +80 -0
  17. package/dist/cli.js.map +1 -0
  18. package/dist/config.d.ts +11 -0
  19. package/dist/config.d.ts.map +1 -0
  20. package/dist/config.js +128 -0
  21. package/dist/config.js.map +1 -0
  22. package/dist/environment.d.ts +10 -0
  23. package/dist/environment.d.ts.map +1 -0
  24. package/dist/environment.js +80 -0
  25. package/dist/environment.js.map +1 -0
  26. package/dist/events.d.ts +16 -0
  27. package/dist/events.d.ts.map +1 -0
  28. package/dist/events.js +41 -0
  29. package/dist/events.js.map +1 -0
  30. package/dist/index.d.ts +15 -0
  31. package/dist/index.d.ts.map +1 -0
  32. package/dist/index.js +15 -0
  33. package/dist/index.js.map +1 -0
  34. package/dist/llm.d.ts +42 -0
  35. package/dist/llm.d.ts.map +1 -0
  36. package/dist/llm.js +95 -0
  37. package/dist/llm.js.map +1 -0
  38. package/dist/planner.d.ts +19 -0
  39. package/dist/planner.d.ts.map +1 -0
  40. package/dist/planner.js +39 -0
  41. package/dist/planner.js.map +1 -0
  42. package/dist/renderer.d.ts +8 -0
  43. package/dist/renderer.d.ts.map +1 -0
  44. package/dist/renderer.js +22 -0
  45. package/dist/renderer.js.map +1 -0
  46. package/dist/retry.d.ts +12 -0
  47. package/dist/retry.d.ts.map +1 -0
  48. package/dist/retry.js +35 -0
  49. package/dist/retry.js.map +1 -0
  50. package/dist/review.d.ts +21 -0
  51. package/dist/review.d.ts.map +1 -0
  52. package/dist/review.js +47 -0
  53. package/dist/review.js.map +1 -0
  54. package/dist/skill-install.d.ts +7 -0
  55. package/dist/skill-install.d.ts.map +1 -0
  56. package/dist/skill-install.js +25 -0
  57. package/dist/skill-install.js.map +1 -0
  58. package/dist/store.d.ts +14 -0
  59. package/dist/store.d.ts.map +1 -0
  60. package/dist/store.js +65 -0
  61. package/dist/store.js.map +1 -0
  62. package/dist/task-agent.d.ts +22 -0
  63. package/dist/task-agent.d.ts.map +1 -0
  64. package/dist/task-agent.js +160 -0
  65. package/dist/task-agent.js.map +1 -0
  66. package/dist/types.d.ts +115 -0
  67. package/dist/types.d.ts.map +1 -0
  68. package/dist/types.js +2 -0
  69. package/dist/types.js.map +1 -0
  70. package/dist/workflow.d.ts +33 -0
  71. package/dist/workflow.d.ts.map +1 -0
  72. package/dist/workflow.js +212 -0
  73. package/dist/workflow.js.map +1 -0
  74. package/package.json +40 -0
  75. package/skill/SKILL.md +65 -0
  76. package/templates/workflow.ts +9 -0
package/README.md ADDED
@@ -0,0 +1,82 @@
1
+ # wardo
2
+
3
+ `wardo` turns a complex prompt into a durable TypeScript workflow that can run Codex and Claude Code agents. It stores the plan, task state, events, attempt results and judge decisions in the workspace `.wardo` directory.
4
+
5
+ ## Install and build
6
+
7
+ ```bash
8
+ npm install
9
+ npm run check
10
+ npm run build
11
+ ```
12
+
13
+ Node.js 20 or newer is required. No Python runtime is used.
14
+
15
+ Install the skill into the detected host with:
16
+
17
+ ```bash
18
+ npm run build
19
+ node dist/cli.js install-skill
20
+ # or choose one explicitly:
21
+ node dist/cli.js install-skill --agent codex
22
+ node dist/cli.js install-skill --agent claude
23
+ ```
24
+
25
+ At runtime Wardo records the installed agents, detected active host, versions and detection source in `.wardo/workflow.json`. Automatic tasks use that active host first. Set `WARDO_ACTIVE_AGENT=codex` or `WARDO_ACTIVE_AGENT=claude` when the parent environment does not expose a host marker.
26
+
27
+ ## Configure providers
28
+
29
+ Create `~/.wardo/config.yml`:
30
+
31
+ ```yaml
32
+ maxConcurrency: 3
33
+ modelPreferences:
34
+ - anthropic:claude-haiku-4-5
35
+ - openai:gpt-5-mini
36
+ providers:
37
+ openai:
38
+ type: openai
39
+ apiKey: ${OPENAI_API_KEY}
40
+ baseUrl: ${OPENAI_BASE_URL}
41
+ models: [gpt-5-mini]
42
+ anthropic:
43
+ type: anthropic
44
+ apiKey: ${ANTHROPIC_API_KEY}
45
+ baseUrl: ${ANTHROPIC_BASE_URL}
46
+ models: [claude-haiku-4-5]
47
+ local:
48
+ type: openai-compatible
49
+ apiKey: ${LOCAL_LLM_API_KEY}
50
+ baseUrl: ${LOCAL_LLM_BASE_URL}
51
+ models: [local-fast]
52
+ retry:
53
+ delaysMs: [60000, 180000, 480000, 1200000]
54
+ maxAttempts: 5
55
+ ```
56
+
57
+ Environment variables override file values. Supported overrides include `WARDO_MAX_CONCURRENCY`, `WARDO_MODEL_PREFERENCES`, `WARDO_PROVIDER_<NAME>_API_KEY`, `WARDO_PROVIDER_<NAME>_BASE_URL`, `WARDO_PROVIDER_<NAME>_MODELS`, `OPENAI_API_KEY`, `OPENAI_BASE_URL`, `ANTHROPIC_API_KEY`, and `ANTHROPIC_BASE_URL`.
58
+
59
+ ## Run a workflow
60
+
61
+ ```ts
62
+ import { execute } from "wardo";
63
+
64
+ await execute({
65
+ prompt: "检查项目中的认证错误,修复并运行测试",
66
+ workspace: process.cwd(),
67
+ maxConcurrency: 3,
68
+ resume: true,
69
+ });
70
+ ```
71
+
72
+ 需要让 planner 自动拆分任务时加入 `plan: "auto"`:
73
+
74
+ ```ts
75
+ await execute({ prompt: "完成一个需要分析、实现和测试的复杂改造", plan: "auto", resume: true });
76
+ ```
77
+
78
+ For a stable multi-step plan, use `defineWorkflow`, `defineTask`, and `runWorkflow` from the package. Use `reviewScript` at a checkpoint when the workflow script needs an agent review and update.
79
+
80
+ The CLI supports `wardo run`, `wardo run --plan auto`, `wardo resume`, `wardo status`, `wardo env`, and `wardo fork <destination>`. Pressing `Ctrl-C` persists the current task as paused; `wardo resume` continues from the saved `.wardo` state.
81
+
82
+ The current implementation includes planner-driven decomposition, a durable scheduler, provider adapters, judge requests, retry classification, event storage, resume loading, configuration loading and the `reviewScript` checkpoint helper. Interactive pause commands and automatic review triggers are the next implementation slice.
@@ -0,0 +1,25 @@
1
+ import type { AgentAdapter, AgentEvent, AgentInput, AgentSession } from "../types.js";
2
+ export interface ClaudeAdapterOptions {
3
+ model?: string;
4
+ fallbackModel?: string;
5
+ permissionMode?: string;
6
+ additionalDirectories?: string[];
7
+ maxTurns?: number;
8
+ maxBudgetUsd?: number;
9
+ allowDangerouslySkipPermissions?: boolean;
10
+ env?: Record<string, string | undefined>;
11
+ }
12
+ export declare class ClaudeAdapter implements AgentAdapter {
13
+ private readonly options;
14
+ readonly provider: "claude";
15
+ private readonly queries;
16
+ constructor(options?: ClaudeAdapterOptions);
17
+ start(input: AgentInput & {
18
+ cwd: string;
19
+ additionalDirectories?: string[];
20
+ }): Promise<AgentSession>;
21
+ resume(session: AgentSession, _input: AgentInput): Promise<AgentSession>;
22
+ stream(session: AgentSession, input: AgentInput): AsyncIterable<AgentEvent>;
23
+ cancel(session: AgentSession, reason?: string): Promise<void>;
24
+ }
25
+ //# sourceMappingURL=claude.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../../src/agents/claude.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAMtF,MAAM,WAAW,oBAAoB;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,qBAAqB,CAAC,EAAE,MAAM,EAAE,CAAC;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,+BAA+B,CAAC,EAAE,OAAO,CAAC;IAC1C,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;CAC1C;AAID,qBAAa,aAAc,YAAW,YAAY;IAIpC,OAAO,CAAC,QAAQ,CAAC,OAAO;IAHpC,QAAQ,CAAC,QAAQ,EAAG,QAAQ,CAAU;IACtC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkC;gBAE7B,OAAO,GAAE,oBAAyB;IAEzD,KAAK,CAAC,KAAK,EAAE,UAAU,GAAG;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,qBAAqB,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,OAAO,CAAC,YAAY,CAAC;IAInG,MAAM,CAAC,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC;IAIvE,MAAM,CAAC,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,UAAU,GAAG,aAAa,CAAC,UAAU,CAAC;IAkD5E,MAAM,CAAC,OAAO,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAOpE"}
@@ -0,0 +1,83 @@
1
+ import { query } from "@anthropic-ai/claude-agent-sdk";
2
+ function id() {
3
+ return `claude-${crypto.randomUUID()}`;
4
+ }
5
+ export class ClaudeAdapter {
6
+ options;
7
+ provider = "claude";
8
+ queries = new Map();
9
+ constructor(options = {}) {
10
+ this.options = options;
11
+ }
12
+ async start(input) {
13
+ return { provider: "claude", sessionId: id(), cwd: input.cwd, ...(input.model ? { model: input.model } : {}) };
14
+ }
15
+ async resume(session, _input) {
16
+ return session;
17
+ }
18
+ async *stream(session, input) {
19
+ const abortController = new AbortController();
20
+ const abort = () => abortController.abort(input.signal?.reason);
21
+ input.signal?.addEventListener("abort", abort, { once: true });
22
+ const options = {
23
+ cwd: session.cwd,
24
+ additionalDirectories: this.options.additionalDirectories,
25
+ model: input.model ?? session.model ?? this.options.model,
26
+ fallbackModel: this.options.fallbackModel,
27
+ permissionMode: this.options.permissionMode,
28
+ maxTurns: this.options.maxTurns,
29
+ maxBudgetUsd: this.options.maxBudgetUsd,
30
+ allowDangerouslySkipPermissions: this.options.allowDangerouslySkipPermissions,
31
+ env: this.options.env,
32
+ abortController,
33
+ includePartialMessages: true,
34
+ ...(session.sessionId.startsWith("claude-") ? {} : { resume: session.sessionId }),
35
+ ...(input.outputSchema ? { outputFormat: { type: "json_schema", schema: input.outputSchema } } : {}),
36
+ };
37
+ const active = query({ prompt: input.prompt, options: options });
38
+ this.queries.set(session.sessionId, active);
39
+ try {
40
+ for await (const message of active) {
41
+ const rawType = String(message.type ?? message.subtype ?? "status");
42
+ const subtype = typeof message.subtype === "string" ? message.subtype : "";
43
+ const content = message.message && typeof message.message === "object" ? message.message.content : undefined;
44
+ const text = typeof message.text === "string"
45
+ ? message.text
46
+ : Array.isArray(content)
47
+ ? content.filter((part) => !!part && typeof part === "object").map((part) => typeof part.text === "string" ? part.text : "").join("") || undefined
48
+ : typeof message.result === "string" ? message.result : undefined;
49
+ if (rawType === "system" && subtype === "init" && typeof message.session_id === "string")
50
+ session.sessionId = message.session_id;
51
+ yield {
52
+ provider: "claude",
53
+ rawType,
54
+ type: rawType === "result" || subtype.startsWith("error") ? "turn_completed"
55
+ : rawType === "assistant" || rawType === "stream_event" ? "text_delta"
56
+ : rawType.includes("tool") || rawType.includes("task") ? "tool_call"
57
+ : rawType === "system" && subtype === "init" ? "session_started" : "status",
58
+ ...(text ? { text } : {}),
59
+ payload: message,
60
+ };
61
+ }
62
+ }
63
+ finally {
64
+ input.signal?.removeEventListener("abort", abort);
65
+ this.queries.delete(session.sessionId);
66
+ await active.close?.();
67
+ }
68
+ }
69
+ async cancel(session, reason) {
70
+ const active = this.queries.get(session.sessionId);
71
+ if (active?.interrupt)
72
+ await active.interrupt();
73
+ await active?.close?.();
74
+ if (!active)
75
+ return;
76
+ throwIfCancelled(reason);
77
+ }
78
+ }
79
+ function throwIfCancelled(reason) {
80
+ if (reason)
81
+ return;
82
+ }
83
+ //# sourceMappingURL=claude.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/agents/claude.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { AgentAdapter, AgentEvent, AgentInput, AgentSession } from "../types.js";
2
+ export interface CodexAdapterOptions {
3
+ apiKey?: string;
4
+ baseUrl?: string;
5
+ model?: string;
6
+ sandboxMode?: "read-only" | "workspace-write" | "danger-full-access";
7
+ approvalPolicy?: "never" | "on-request" | "on-failure" | "untrusted";
8
+ additionalDirectories?: string[];
9
+ skipGitRepoCheck?: boolean;
10
+ }
11
+ export declare class CodexAdapter implements AgentAdapter {
12
+ private readonly options;
13
+ readonly provider: "codex";
14
+ private readonly client;
15
+ private readonly threads;
16
+ private readonly controllers;
17
+ constructor(options?: CodexAdapterOptions);
18
+ start(input: AgentInput & {
19
+ cwd: string;
20
+ additionalDirectories?: string[];
21
+ }): Promise<AgentSession>;
22
+ resume(session: AgentSession, input: AgentInput): Promise<AgentSession>;
23
+ stream(session: AgentSession, input: AgentInput): AsyncIterable<AgentEvent>;
24
+ cancel(session: AgentSession, reason?: string): Promise<void>;
25
+ }
26
+ //# sourceMappingURL=codex.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../src/agents/codex.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAMtF,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,WAAW,GAAG,iBAAiB,GAAG,oBAAoB,CAAC;IACrE,cAAc,CAAC,EAAE,OAAO,GAAG,YAAY,GAAG,YAAY,GAAG,WAAW,CAAC;IACrE,qBAAqB,CAAC,EAAE,MAAM,EAAE,CAAC;IACjC,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,qBAAa,YAAa,YAAW,YAAY;IAMnC,OAAO,CAAC,QAAQ,CAAC,OAAO;IALpC,QAAQ,CAAC,QAAQ,EAAG,OAAO,CAAU;IACrC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAQ;IAC/B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA6B;IACrD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAsC;gBAErC,OAAO,GAAE,mBAAwB;IAOxD,KAAK,CAAC,KAAK,EAAE,UAAU,GAAG;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,qBAAqB,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,OAAO,CAAC,YAAY,CAAC;IAcnG,MAAM,CAAC,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC;IAMtE,MAAM,CAAC,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,UAAU,GAAG,aAAa,CAAC,UAAU,CAAC;IAwC5E,MAAM,CAAC,OAAO,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAGpE"}
@@ -0,0 +1,81 @@
1
+ import { Codex } from "@openai/codex-sdk";
2
+ function id() {
3
+ return `codex-${crypto.randomUUID()}`;
4
+ }
5
+ export class CodexAdapter {
6
+ options;
7
+ provider = "codex";
8
+ client;
9
+ threads = new Map();
10
+ controllers = new Map();
11
+ constructor(options = {}) {
12
+ this.options = options;
13
+ this.client = new Codex({
14
+ ...(options.apiKey ? { apiKey: options.apiKey } : {}),
15
+ ...(options.baseUrl ? { baseUrl: options.baseUrl } : {}),
16
+ });
17
+ }
18
+ async start(input) {
19
+ const session = { provider: "codex", sessionId: id(), cwd: input.cwd, ...(input.model ? { model: input.model } : {}) };
20
+ const thread = this.client.startThread({
21
+ ...(input.model ?? this.options.model ? { model: input.model ?? this.options.model } : {}),
22
+ workingDirectory: input.cwd,
23
+ sandboxMode: this.options.sandboxMode ?? "workspace-write",
24
+ approvalPolicy: this.options.approvalPolicy ?? "on-request",
25
+ additionalDirectories: input.additionalDirectories ?? this.options.additionalDirectories,
26
+ skipGitRepoCheck: this.options.skipGitRepoCheck ?? false,
27
+ });
28
+ this.threads.set(session.sessionId, thread);
29
+ return session;
30
+ }
31
+ async resume(session, input) {
32
+ const thread = this.client.resumeThread(session.sessionId);
33
+ this.threads.set(session.sessionId, thread);
34
+ return session;
35
+ }
36
+ async *stream(session, input) {
37
+ const thread = this.threads.get(session.sessionId);
38
+ if (!thread)
39
+ throw new Error(`Unknown Codex session: ${session.sessionId}`);
40
+ const controller = new AbortController();
41
+ const abort = () => controller.abort(input.signal?.reason);
42
+ input.signal?.addEventListener("abort", abort, { once: true });
43
+ this.controllers.set(session.sessionId, controller);
44
+ try {
45
+ const streamed = await thread.runStreamed(input.prompt, { signal: controller.signal, ...(input.outputSchema ? { outputSchema: input.outputSchema } : {}) });
46
+ for await (const event of streamed.events) {
47
+ const raw = event;
48
+ if (raw.type === "thread.started" && typeof raw.thread_id === "string") {
49
+ const old = session.sessionId;
50
+ session.sessionId = raw.thread_id;
51
+ this.threads.set(session.sessionId, thread);
52
+ this.threads.delete(old);
53
+ }
54
+ const type = String(raw.type ?? "status");
55
+ const item = raw.item;
56
+ const text = typeof item?.text === "string" ? item.text : typeof raw.message === "string" ? raw.message : undefined;
57
+ yield {
58
+ provider: "codex",
59
+ rawType: type,
60
+ type: type.includes("error") || type.includes("failed") ? "error"
61
+ : type === "turn.completed" ? "turn_completed"
62
+ : type === "turn.started" ? "turn_started"
63
+ : type.includes("file_change") ? "file_change"
64
+ : item?.type === "reasoning" ? "reasoning"
65
+ : item?.type === "command_execution" || item?.type === "mcp_tool_call" ? "tool_call"
66
+ : text ? "text_delta" : "status",
67
+ ...(text ? { text } : {}),
68
+ payload: event,
69
+ };
70
+ }
71
+ }
72
+ finally {
73
+ input.signal?.removeEventListener("abort", abort);
74
+ this.controllers.delete(session.sessionId);
75
+ }
76
+ }
77
+ async cancel(session, reason) {
78
+ this.controllers.get(session.sessionId)?.abort(new Error(reason ?? "Cancelled"));
79
+ }
80
+ }
81
+ //# sourceMappingURL=codex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../src/agents/codex.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export * from "./codex.js";
2
+ export * from "./claude.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/agents/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from "./codex.js";
2
+ export * from "./claude.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/agents/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,80 @@
1
+ #!/usr/bin/env node
2
+ import { readFile } from "node:fs/promises";
3
+ import { join } from "node:path";
4
+ import { execute, forkWorkflow, runWorkflow } from "./workflow.js";
5
+ import { installSkill } from "./skill-install.js";
6
+ import { detectAgentEnvironment } from "./environment.js";
7
+ const args = process.argv.slice(2);
8
+ const command = args[0];
9
+ if (command === "run") {
10
+ const autoPlan = args.includes("--plan=auto") || args.includes("--plan") && args[args.indexOf("--plan") + 1] === "auto";
11
+ const stream = !args.includes("--no-stream");
12
+ const prompt = args.filter((arg, index) => !arg.startsWith("--") && args[index - 1] !== "--plan").slice(1).join(" ").trim();
13
+ if (!prompt) {
14
+ console.error("Usage: wardo run <prompt>");
15
+ process.exitCode = 2;
16
+ }
17
+ else {
18
+ const controller = new AbortController();
19
+ process.once("SIGINT", () => controller.abort(new Error("Paused by SIGINT")));
20
+ await execute({ prompt, workspace: process.cwd(), resume: true, plan: autoPlan ? "auto" : "single", stream, signal: controller.signal });
21
+ }
22
+ }
23
+ else if (command === "resume") {
24
+ const prompt = await readFile(join(process.cwd(), ".wardo/prompt.md"), "utf8");
25
+ const controller = new AbortController();
26
+ process.once("SIGINT", () => controller.abort(new Error("Paused by SIGINT")));
27
+ let plan;
28
+ try {
29
+ plan = JSON.parse(await readFile(join(process.cwd(), ".wardo/plan.json"), "utf8"));
30
+ }
31
+ catch {
32
+ plan = undefined;
33
+ }
34
+ if (Array.isArray(plan?.tasks)) {
35
+ await runWorkflow({ id: "resumed", objective: plan?.objective ?? prompt, tasks: plan.tasks }, { workspace: process.cwd(), resume: true, signal: controller.signal });
36
+ }
37
+ else {
38
+ await execute({ prompt, workspace: process.cwd(), resume: true, signal: controller.signal });
39
+ }
40
+ }
41
+ else if (command === "status") {
42
+ try {
43
+ console.log(await readFile(join(process.cwd(), ".wardo/state.json"), "utf8"));
44
+ }
45
+ catch {
46
+ console.error("No .wardo run state found");
47
+ process.exitCode = 1;
48
+ }
49
+ }
50
+ else if (command === "fork") {
51
+ const destination = args[1];
52
+ if (!destination) {
53
+ console.error("Usage: wardo fork <destination>");
54
+ process.exitCode = 2;
55
+ }
56
+ else {
57
+ console.log(await forkWorkflow(process.cwd(), destination));
58
+ }
59
+ }
60
+ else if (command === "install-skill") {
61
+ const requested = args[1] === "--agent" ? args[2] : undefined;
62
+ if (requested !== undefined && requested !== "codex" && requested !== "claude") {
63
+ console.error("--agent must be codex or claude");
64
+ process.exitCode = 2;
65
+ }
66
+ else {
67
+ for (const result of await installSkill(requested))
68
+ console.log(`${result.agent}: ${result.target}`);
69
+ }
70
+ }
71
+ else if (command === "env") {
72
+ console.log(JSON.stringify(await detectAgentEnvironment(), null, 2));
73
+ }
74
+ else if (command === "config") {
75
+ console.log("Wardo config: ~/.wardo/config.yml");
76
+ }
77
+ else {
78
+ console.log("Usage: wardo run [--plan auto] <prompt> | wardo resume | wardo status | wardo fork <destination> | wardo env | wardo install-skill");
79
+ }
80
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { WardoConfig } from "./types.js";
2
+ export interface LoadConfigOptions {
3
+ path?: string;
4
+ env?: NodeJS.ProcessEnv;
5
+ workspace?: string;
6
+ }
7
+ export declare function defaultConfig(): WardoConfig;
8
+ export declare function loadConfig(options?: LoadConfigOptions): Promise<WardoConfig>;
9
+ export declare function configFilePath(): string;
10
+ export declare function configDirectory(): string;
11
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAkB,WAAW,EAAE,MAAM,YAAY,CAAC;AAI9D,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAoDD,wBAAgB,aAAa,IAAI,WAAW,CAW3C;AAED,wBAAsB,UAAU,CAAC,OAAO,GAAE,iBAAsB,GAAG,OAAO,CAAC,WAAW,CAAC,CAqDtF;AAED,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED,wBAAgB,eAAe,IAAI,MAAM,CAExC"}
package/dist/config.js ADDED
@@ -0,0 +1,128 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { homedir } from "node:os";
3
+ import { dirname, join, resolve } from "node:path";
4
+ import { parse } from "yaml";
5
+ const defaultRetry = [60_000, 180_000, 480_000, 1_200_000];
6
+ function expand(value, env) {
7
+ if (typeof value === "string") {
8
+ return value.replace(/\$\{([A-Za-z_][A-Za-z0-9_]*)\}/g, (_, key) => env[key] ?? "");
9
+ }
10
+ if (Array.isArray(value))
11
+ return value.map((item) => expand(item, env));
12
+ if (value && typeof value === "object") {
13
+ return Object.fromEntries(Object.entries(value).map(([k, v]) => [k, expand(v, env)]));
14
+ }
15
+ return value;
16
+ }
17
+ function asStringArray(value) {
18
+ if (!Array.isArray(value))
19
+ return [];
20
+ return value.filter((item) => typeof item === "string" && item.length > 0);
21
+ }
22
+ function asNumberArray(value) {
23
+ if (!Array.isArray(value))
24
+ return [];
25
+ return value.map((item) => typeof item === "number" || typeof item === "string" ? Number(item) : NaN).filter(Number.isFinite);
26
+ }
27
+ function normalizeProvider(value) {
28
+ const raw = (value && typeof value === "object" ? value : {});
29
+ const type = raw.type === "anthropic" || raw.type === "openai-compatible" ? raw.type : "openai";
30
+ const headers = raw.headers && typeof raw.headers === "object"
31
+ ? Object.fromEntries(Object.entries(raw.headers).filter((entry) => typeof entry[1] === "string"))
32
+ : undefined;
33
+ return {
34
+ type,
35
+ ...(typeof raw.apiKey === "string" && raw.apiKey ? { apiKey: raw.apiKey } : {}),
36
+ ...(typeof raw.baseUrl === "string" && raw.baseUrl ? { baseUrl: raw.baseUrl } : {}),
37
+ ...(asStringArray(raw.models).length ? { models: asStringArray(raw.models) } : {}),
38
+ ...(headers ? { headers } : {}),
39
+ };
40
+ }
41
+ function envProvider(env, name, type) {
42
+ const upper = name.toUpperCase().replace(/[^A-Z0-9]/g, "_");
43
+ const standard = name === "openai" ? "OPENAI" : name === "anthropic" ? "ANTHROPIC" : undefined;
44
+ const apiKey = env[`WARDO_PROVIDER_${upper}_API_KEY`] ?? (standard ? env[`${standard}_API_KEY`] : undefined);
45
+ const baseUrl = env[`WARDO_PROVIDER_${upper}_BASE_URL`] ?? (standard ? env[`${standard}_BASE_URL`] : undefined);
46
+ const models = (env[`WARDO_PROVIDER_${upper}_MODELS`] ?? "").split(",").map((x) => x.trim()).filter(Boolean);
47
+ return {
48
+ type,
49
+ ...(apiKey ? { apiKey } : {}),
50
+ ...(baseUrl ? { baseUrl } : {}),
51
+ ...(models.length ? { models } : {}),
52
+ };
53
+ }
54
+ export function defaultConfig() {
55
+ return {
56
+ maxConcurrency: 3,
57
+ retry: { delaysMs: [...defaultRetry], maxAttempts: 5 },
58
+ providers: {
59
+ openai: { type: "openai" },
60
+ anthropic: { type: "anthropic" },
61
+ },
62
+ modelPreferences: [],
63
+ agentDefaults: {},
64
+ };
65
+ }
66
+ export async function loadConfig(options = {}) {
67
+ const env = options.env ?? process.env;
68
+ const configPath = options.path
69
+ ? resolve(options.path)
70
+ : env.WARDO_CONFIG
71
+ ? resolve(env.WARDO_CONFIG)
72
+ : join(env.WARDO_HOME ? resolve(env.WARDO_HOME) : join(homedir(), ".wardo"), "config.yml");
73
+ let fileConfig = {};
74
+ try {
75
+ const text = await readFile(configPath, "utf8");
76
+ const parsed = parse(text);
77
+ if (parsed && typeof parsed === "object")
78
+ fileConfig = expand(parsed, env);
79
+ }
80
+ catch (error) {
81
+ const code = error && typeof error === "object" && "code" in error ? error.code : undefined;
82
+ if (code !== "ENOENT")
83
+ throw error;
84
+ }
85
+ const base = defaultConfig();
86
+ const rawProviders = fileConfig.providers && typeof fileConfig.providers === "object"
87
+ ? fileConfig.providers
88
+ : {};
89
+ const providers = {};
90
+ for (const [name, value] of Object.entries(rawProviders))
91
+ providers[name] = normalizeProvider(value);
92
+ for (const [name, type] of [["openai", "openai"], ["anthropic", "anthropic"]]) {
93
+ providers[name] = {
94
+ ...providers[name],
95
+ ...envProvider(env, name, type),
96
+ };
97
+ }
98
+ const retryRaw = fileConfig.retry && typeof fileConfig.retry === "object" ? fileConfig.retry : {};
99
+ const delays = asNumberArray(retryRaw.delaysMs);
100
+ const maxConcurrency = Number(env.WARDO_MAX_CONCURRENCY ?? fileConfig.maxConcurrency ?? base.maxConcurrency);
101
+ const preferences = (env.WARDO_MODEL_PREFERENCES ?? asStringArray(fileConfig.modelPreferences).join(","))
102
+ .split(",").map((x) => x.trim()).filter(Boolean);
103
+ const workspace = options.workspace ? resolve(options.workspace) : typeof fileConfig.workspace === "string" ? resolve(fileConfig.workspace) : undefined;
104
+ return {
105
+ workspace,
106
+ maxConcurrency: Number.isFinite(maxConcurrency) && maxConcurrency > 0 ? Math.floor(maxConcurrency) : 3,
107
+ ...(fileConfig.providerConcurrency && typeof fileConfig.providerConcurrency === "object"
108
+ ? { providerConcurrency: fileConfig.providerConcurrency }
109
+ : {}),
110
+ retry: {
111
+ delaysMs: delays.length ? delays : [...base.retry.delaysMs],
112
+ maxAttempts: Number(retryRaw.maxAttempts ?? base.retry.maxAttempts),
113
+ },
114
+ providers: Object.keys(providers).length ? providers : base.providers,
115
+ modelPreferences: preferences,
116
+ agentDefaults: (fileConfig.agentDefaults && typeof fileConfig.agentDefaults === "object"
117
+ ? fileConfig.agentDefaults
118
+ : {}),
119
+ ...(fileConfig.judge && typeof fileConfig.judge === "object" ? { judge: fileConfig.judge } : {}),
120
+ };
121
+ }
122
+ export function configFilePath() {
123
+ return join(homedir(), ".wardo", "config.yml");
124
+ }
125
+ export function configDirectory() {
126
+ return dirname(configFilePath());
127
+ }
128
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export type AgentName = "codex" | "claude";
2
+ export interface AgentEnvironment {
3
+ active?: AgentName;
4
+ installed: Record<AgentName, boolean>;
5
+ versions: Partial<Record<AgentName, string>>;
6
+ detectedBy: string[];
7
+ skillDirectory?: string;
8
+ }
9
+ export declare function detectAgentEnvironment(env?: NodeJS.ProcessEnv): Promise<AgentEnvironment>;
10
+ //# sourceMappingURL=environment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"environment.d.ts","sourceRoot":"","sources":["../src/environment.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE3C,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IACtC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;IAC7C,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAgCD,wBAAsB,sBAAsB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAqC5G"}