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
@@ -0,0 +1,212 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { cp, mkdir, readFile, writeFile } from "node:fs/promises";
3
+ import { join, resolve } from "node:path";
4
+ import { loadConfig } from "./config.js";
5
+ import { EventBus } from "./events.js";
6
+ import { LlmRegistry } from "./llm.js";
7
+ import { WardoStore } from "./store.js";
8
+ import { ClaudeAdapter } from "./agents/claude.js";
9
+ import { CodexAdapter } from "./agents/codex.js";
10
+ import { TaskAgent } from "./task-agent.js";
11
+ import { planWorkflow } from "./planner.js";
12
+ import { consoleRenderer } from "./renderer.js";
13
+ import { detectAgentEnvironment } from "./environment.js";
14
+ export function defineTask(task) {
15
+ return { ...task, dependsOn: task.dependsOn ? [...task.dependsOn] : [] };
16
+ }
17
+ export function defineWorkflow(workflow) {
18
+ return { ...workflow, tasks: workflow.tasks.map(defineTask) };
19
+ }
20
+ export async function forkWorkflow(sourceWorkspace, destinationWorkspace) {
21
+ const source = resolve(sourceWorkspace);
22
+ const destination = resolve(destinationWorkspace);
23
+ await mkdir(destination, { recursive: true });
24
+ await cp(join(source, ".wardo"), join(destination, ".wardo"), { recursive: true, force: true });
25
+ const workflowPath = join(destination, ".wardo/workflow.json");
26
+ const existing = JSON.parse(await readFile(workflowPath, "utf8"));
27
+ const runId = randomUUID();
28
+ await writeFile(workflowPath, `${JSON.stringify({ ...existing, runId, parentRunId: existing.runId }, null, 2)}\n`, "utf8");
29
+ return runId;
30
+ }
31
+ function flatten(tasks, parentId) {
32
+ return tasks.flatMap((task) => {
33
+ const current = { ...task, ...(parentId ? { parentId } : {}) };
34
+ return task.children?.length ? [current, ...flatten(task.children, task.id)] : [current];
35
+ });
36
+ }
37
+ function validate(tasks) {
38
+ const ids = new Set();
39
+ for (const task of tasks) {
40
+ if (ids.has(task.id))
41
+ throw new Error(`Duplicate task id: ${task.id}`);
42
+ ids.add(task.id);
43
+ }
44
+ for (const task of tasks)
45
+ for (const dep of task.dependsOn ?? [])
46
+ if (!ids.has(dep))
47
+ throw new Error(`Unknown dependency ${dep} for ${task.id}`);
48
+ const visiting = new Set();
49
+ const visited = new Set();
50
+ const byId = new Map(tasks.map((task) => [task.id, task]));
51
+ const visit = (id) => {
52
+ if (visiting.has(id))
53
+ throw new Error(`Task dependency cycle includes ${id}`);
54
+ if (visited.has(id))
55
+ return;
56
+ visiting.add(id);
57
+ for (const dep of byId.get(id)?.dependsOn ?? [])
58
+ visit(dep);
59
+ visiting.delete(id);
60
+ visited.add(id);
61
+ };
62
+ for (const task of tasks)
63
+ visit(task.id);
64
+ }
65
+ export class WorkflowRunner {
66
+ workflow;
67
+ agent;
68
+ store;
69
+ config;
70
+ environment;
71
+ tasks;
72
+ statuses = new Map();
73
+ constructor(workflow, agent, store, config, environment) {
74
+ this.workflow = workflow;
75
+ this.agent = agent;
76
+ this.store = store;
77
+ this.config = config;
78
+ this.environment = environment;
79
+ this.tasks = flatten(workflow.tasks);
80
+ validate(this.tasks);
81
+ }
82
+ async run(options = {}) {
83
+ const release = await this.store.lock();
84
+ try {
85
+ return await this.runLocked(options);
86
+ }
87
+ finally {
88
+ await release();
89
+ }
90
+ }
91
+ async runLocked(options = {}) {
92
+ const existing = options.resume ? await this.store.readJson("workflow.json") : undefined;
93
+ const savedState = options.resume ? await this.store.readJson("state.json") : undefined;
94
+ const runId = options.runId ?? existing?.runId ?? randomUUID();
95
+ if (savedState)
96
+ for (const [id, result] of Object.entries(savedState))
97
+ this.statuses.set(id, result);
98
+ await this.store.init(this.workflow.objective);
99
+ await this.store.atomicWrite("workflow.json", { runId, workflow: this.workflow, environment: this.environment, config: { maxConcurrency: options.maxConcurrency ?? this.workflow.maxConcurrency ?? this.config.maxConcurrency } });
100
+ await this.store.atomicWrite("plan.json", { schemaVersion: 1, objective: this.workflow.objective, tasks: this.tasks });
101
+ const max = options.maxConcurrency ?? this.workflow.maxConcurrency ?? this.config.maxConcurrency;
102
+ const active = new Map();
103
+ const done = (id) => this.statuses.get(id)?.status === "succeeded";
104
+ const blocked = (id) => {
105
+ const task = this.tasks.find((item) => item.id === id);
106
+ return (task?.dependsOn ?? []).some((dep) => ["failed", "partial", "blocked", "cancelled", "unknown"].includes(this.statuses.get(dep)?.status ?? ""));
107
+ };
108
+ while (this.statuses.size < this.tasks.length || active.size) {
109
+ for (const task of this.tasks) {
110
+ if (this.statuses.has(task.id) || active.has(task.id))
111
+ continue;
112
+ if (blocked(task.id)) {
113
+ const result = { status: "blocked", text: "A dependency failed", attempt: 0 };
114
+ this.statuses.set(task.id, result);
115
+ await this.store.saveTaskState(task.id, result);
116
+ await this.store.atomicWrite("state.json", Object.fromEntries(this.statuses));
117
+ continue;
118
+ }
119
+ if (!(task.dependsOn ?? []).every(done))
120
+ continue;
121
+ if (active.size >= max)
122
+ break;
123
+ const providerLimit = task.provider && task.provider !== "auto" ? this.config.providerConcurrency?.[task.provider] : undefined;
124
+ if (providerLimit !== undefined) {
125
+ const activeForProvider = [...active.keys()].map((id) => this.tasks.find((item) => item.id === id)).filter((item) => item?.provider === task.provider).length;
126
+ if (activeForProvider >= providerLimit)
127
+ continue;
128
+ }
129
+ const context = (task.dependsOn ?? []).map((dep) => `${dep}: ${this.statuses.get(dep)?.text ?? ""}`).join("\n\n");
130
+ const promise = this.agent.execute(task, runId, context, options.signal).then((result) => ({ id: task.id, result }));
131
+ active.set(task.id, promise);
132
+ }
133
+ if (!active.size) {
134
+ const unresolved = this.tasks.filter((task) => !this.statuses.has(task.id));
135
+ if (unresolved.length)
136
+ throw new Error(`Scheduler stalled; unresolved tasks: ${unresolved.map((task) => task.id).join(", ")}`);
137
+ break;
138
+ }
139
+ const completed = await Promise.race(active.values());
140
+ active.delete(completed.id);
141
+ this.statuses.set(completed.id, completed.result);
142
+ await this.store.saveTaskState(completed.id, completed.result);
143
+ await this.store.atomicWrite("state.json", Object.fromEntries(this.statuses));
144
+ if (completed.result.status === "paused" || options.signal?.aborted) {
145
+ const pending = await Promise.all(active.values());
146
+ for (const item of pending) {
147
+ active.delete(item.id);
148
+ this.statuses.set(item.id, item.result);
149
+ await this.store.saveTaskState(item.id, item.result);
150
+ }
151
+ await this.store.atomicWrite("state.json", Object.fromEntries(this.statuses));
152
+ break;
153
+ }
154
+ if (completed.result.status === "failed" && this.workflow.failFast) {
155
+ for (const task of this.tasks)
156
+ if (!this.statuses.has(task.id))
157
+ this.statuses.set(task.id, { status: "cancelled", text: "failFast", attempt: 0 });
158
+ await this.store.atomicWrite("state.json", Object.fromEntries(this.statuses));
159
+ }
160
+ }
161
+ await this.store.atomicWrite("state.json", Object.fromEntries(this.statuses));
162
+ return this.statuses;
163
+ }
164
+ }
165
+ export async function runWorkflow(workflow, options = {}) {
166
+ const workspace = resolve(options.workspace ?? process.cwd());
167
+ const config = options.config ?? await loadConfig({ workspace });
168
+ const environment = await detectAgentEnvironment();
169
+ const store = new WardoStore(workspace);
170
+ const events = new EventBus(store);
171
+ events.subscribe(consoleRenderer({ enabled: options.stream !== false }));
172
+ const openai = config.providers.openai;
173
+ const anthropic = config.providers.anthropic;
174
+ const claudeEnv = Object.fromEntries(Object.entries({
175
+ ...process.env,
176
+ ...(anthropic?.apiKey ? { ANTHROPIC_API_KEY: anthropic.apiKey } : {}),
177
+ ...(anthropic?.baseUrl ? { ANTHROPIC_BASE_URL: anthropic.baseUrl } : {}),
178
+ }).filter((entry) => typeof entry[1] === "string"));
179
+ const adapters = {
180
+ codex: new CodexAdapter({
181
+ apiKey: openai?.apiKey,
182
+ baseUrl: openai?.baseUrl,
183
+ model: config.agentDefaults.codex?.model,
184
+ sandboxMode: config.agentDefaults.codex?.sandboxMode,
185
+ approvalPolicy: config.agentDefaults.codex?.approvalPolicy,
186
+ }),
187
+ claude: new ClaudeAdapter({
188
+ model: config.agentDefaults.claude?.model,
189
+ fallbackModel: config.agentDefaults.claude?.fallbackModel,
190
+ permissionMode: config.agentDefaults.claude?.permissionMode,
191
+ env: claudeEnv,
192
+ }),
193
+ };
194
+ const registry = new LlmRegistry(config);
195
+ const agent = new TaskAgent({ adapters, registry, config, store, events, workspace, activeProvider: environment.active });
196
+ return new WorkflowRunner(workflow, agent, store, config, environment).run(options);
197
+ }
198
+ export async function execute(options) {
199
+ const workspace = resolve(options.workspace ?? process.cwd());
200
+ const config = options.config ?? await loadConfig({ workspace });
201
+ const registry = new LlmRegistry(config);
202
+ const workflow = options.workflow ?? (options.plan === "auto"
203
+ ? await planWorkflow(options.prompt, registry, options.signal)
204
+ : defineWorkflow({
205
+ id: "main",
206
+ objective: options.prompt,
207
+ ...(options.maxConcurrency !== undefined ? { maxConcurrency: options.maxConcurrency } : {}),
208
+ tasks: [defineTask({ id: "main", goal: options.prompt, acceptance: "完成目标并提供验证结果", provider: "auto" })],
209
+ }));
210
+ return runWorkflow(workflow, { ...options, config });
211
+ }
212
+ //# sourceMappingURL=workflow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow.js","sourceRoot":"","sources":["../src/workflow.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,sBAAsB,EAAyB,MAAM,kBAAkB,CAAC;AAEjF,MAAM,UAAU,UAAU,CAAC,IAAc;IACvC,OAAO,EAAE,GAAG,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;AAC3E,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,QAAsB;IACnD,OAAO,EAAE,GAAG,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;AAChE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,eAAuB,EAAE,oBAA4B;IACtF,MAAM,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IACxC,MAAM,WAAW,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAClD,MAAM,KAAK,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,MAAM,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAChG,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,EAAE,sBAAsB,CAAC,CAAC;IAC/D,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,CAA6C,CAAC;IAC9G,MAAM,KAAK,GAAG,UAAU,EAAE,CAAC;IAC3B,MAAM,SAAS,CAAC,YAAY,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC3H,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,OAAO,CAAC,KAAiB,EAAE,QAAiB;IACnD,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;QAC5B,MAAM,OAAO,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;QAC/D,OAAO,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAC3F,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,QAAQ,CAAC,KAAiB;IACjC,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;IAC9B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QACvE,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACnB,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,KAAK;QAAE,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,SAAS,IAAI,EAAE;YAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,GAAG,QAAQ,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IACjJ,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IACnC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IAC3D,MAAM,KAAK,GAAG,CAAC,EAAU,EAAE,EAAE;QAC3B,IAAI,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,EAAE,EAAE,CAAC,CAAC;QAC9E,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,OAAO;QAC5B,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACjB,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,SAAS,IAAI,EAAE;YAAE,KAAK,CAAC,GAAG,CAAC,CAAC;QAC5D,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC,CAAC;IACF,KAAK,MAAM,IAAI,IAAI,KAAK;QAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,OAAO,cAAc;IAII;IAAyC;IAAmC;IAAoC;IAAsC;IAHlK,KAAK,CAAa;IAClB,QAAQ,GAAG,IAAI,GAAG,EAAsB,CAAC;IAE1D,YAA6B,QAAsB,EAAmB,KAAgB,EAAmB,KAAiB,EAAmB,MAAmB,EAAmB,WAA8B;QAApL,aAAQ,GAAR,QAAQ,CAAc;QAAmB,UAAK,GAAL,KAAK,CAAW;QAAmB,UAAK,GAAL,KAAK,CAAY;QAAmB,WAAM,GAAN,MAAM,CAAa;QAAmB,gBAAW,GAAX,WAAW,CAAmB;QAC/M,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACrC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,UAAsB,EAAE;QAChC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QACxC,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACvC,CAAC;gBAAS,CAAC;YACT,MAAM,OAAO,EAAE,CAAC;QAClB,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,SAAS,CAAC,UAAsB,EAAE;QAC9C,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAqB,eAAe,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC7G,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAA6B,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACpH,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,QAAQ,EAAE,KAAK,IAAI,UAAU,EAAE,CAAC;QAC/D,IAAI,UAAU;YAAE,KAAK,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC;gBAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QACrG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QAC/C,MAAM,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,eAAe,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,cAAc,EAAE,OAAO,CAAC,cAAc,IAAI,IAAI,CAAC,QAAQ,CAAC,cAAc,IAAI,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;QACnO,MAAM,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,WAAW,EAAE,EAAE,aAAa,EAAE,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QACvH,MAAM,GAAG,GAAG,OAAO,CAAC,cAAc,IAAI,IAAI,CAAC,QAAQ,CAAC,cAAc,IAAI,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC;QACjG,MAAM,MAAM,GAAG,IAAI,GAAG,EAAuD,CAAC;QAC9E,MAAM,IAAI,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,MAAM,KAAK,WAAW,CAAC;QAC3E,MAAM,OAAO,GAAG,CAAC,EAAU,EAAE,EAAE;YAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;YACvD,OAAO,CAAC,IAAI,EAAE,SAAS,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC;QACxJ,CAAC,CAAC;QACF,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;YAC7D,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBAC9B,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;oBAAE,SAAS;gBAChE,IAAI,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;oBACrB,MAAM,MAAM,GAAe,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,qBAAqB,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;oBAC1F,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;oBACnC,MAAM,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;oBAChD,MAAM,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,YAAY,EAAE,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;oBAC9E,SAAS;gBACX,CAAC;gBACD,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;oBAAE,SAAS;gBAClD,IAAI,MAAM,CAAC,IAAI,IAAI,GAAG;oBAAE,MAAM;gBAC9B,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;gBAC/H,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;oBAChC,MAAM,iBAAiB,GAAG,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC;oBAC9J,IAAI,iBAAiB,IAAI,aAAa;wBAAE,SAAS;gBACnD,CAAC;gBACD,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAClH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;gBACrH,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;YAC/B,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;gBACjB,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC5E,IAAI,UAAU,CAAC,MAAM;oBAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAC/H,MAAM;YACR,CAAC;YACD,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;YACtD,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YAC5B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;YAClD,MAAM,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,SAAS,CAAC,EAAE,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;YAC/D,MAAM,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,YAAY,EAAE,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC9E,IAAI,SAAS,CAAC,MAAM,CAAC,MAAM,KAAK,QAAQ,IAAI,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;gBACpE,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;gBACnD,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;oBAC3B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBACvB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;oBACxC,MAAM,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;gBACvD,CAAC;gBACD,MAAM,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,YAAY,EAAE,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAC9E,MAAM;YACR,CAAC;YACD,IAAI,SAAS,CAAC,MAAM,CAAC,MAAM,KAAK,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;gBACnE,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK;oBAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;wBAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;gBAClJ,MAAM,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,YAAY,EAAE,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;YAChF,CAAC;QACH,CAAC;QACD,MAAM,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,YAAY,EAAE,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC9E,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;CACF;AAeD,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,QAAsB,EAAE,UAA8B,EAAE;IACxF,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAC9D,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,MAAM,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;IACjE,MAAM,WAAW,GAAG,MAAM,sBAAsB,EAAE,CAAC;IACnD,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,SAAS,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC;IACnC,MAAM,CAAC,SAAS,CAAC,eAAe,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC;IACzE,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC;IACvC,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC;IAC7C,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC;QAClD,GAAG,OAAO,CAAC,GAAG;QACd,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrE,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,kBAAkB,EAAE,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACzE,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAA6B,EAAE,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC;IAC/E,MAAM,QAAQ,GAAG;QACf,KAAK,EAAE,IAAI,YAAY,CAAC;YACtB,MAAM,EAAE,MAAM,EAAE,MAAM;YACtB,OAAO,EAAE,MAAM,EAAE,OAAO;YACxB,KAAK,EAAE,MAAM,CAAC,aAAa,CAAC,KAAK,EAAE,KAAK;YACxC,WAAW,EAAE,MAAM,CAAC,aAAa,CAAC,KAAK,EAAE,WAAiF;YAC1H,cAAc,EAAE,MAAM,CAAC,aAAa,CAAC,KAAK,EAAE,cAAiF;SAC9H,CAAC;QACF,MAAM,EAAE,IAAI,aAAa,CAAC;YACxB,KAAK,EAAE,MAAM,CAAC,aAAa,CAAC,MAAM,EAAE,KAAK;YACzC,aAAa,EAAE,MAAM,CAAC,aAAa,CAAC,MAAM,EAAE,aAAa;YACzD,cAAc,EAAE,MAAM,CAAC,aAAa,CAAC,MAAM,EAAE,cAAc;YAC3D,GAAG,EAAE,SAAS;SACf,CAAC;KACH,CAAC;IACF,MAAM,QAAQ,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC;IACzC,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1H,OAAO,IAAI,cAAc,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AACtF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,OAAuB;IACnD,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAC9D,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,MAAM,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;IACjE,MAAM,QAAQ,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC;IACzC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,CAAC,OAAO,CAAC,IAAI,KAAK,MAAM;QAC3D,CAAC,CAAC,MAAM,YAAY,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC;QAC9D,CAAC,CAAC,cAAc,CAAC;YACf,EAAE,EAAE,MAAM;YACV,SAAS,EAAE,OAAO,CAAC,MAAM;YACzB,GAAG,CAAC,OAAO,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3F,KAAK,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;SACvG,CAAC,CAAC,CAAC;IACN,OAAO,WAAW,CAAC,QAAQ,EAAE,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;AACvD,CAAC"}
package/package.json ADDED
@@ -0,0 +1,40 @@
1
+ {
2
+ "name": "wardo",
3
+ "version": "0.1.0",
4
+ "description": "Durable TypeScript orchestration for Codex and Claude Code agents",
5
+ "type": "module",
6
+ "engines": { "node": ">=20" },
7
+ "bin": { "wardo": "dist/cli.js" },
8
+ "exports": {
9
+ ".": "./dist/index.js",
10
+ "./config": "./dist/config.js",
11
+ "./agents": "./dist/agents/index.js"
12
+ },
13
+ "files": ["dist", "skill", "templates"],
14
+ "scripts": {
15
+ "build": "tsc -p tsconfig.json",
16
+ "prepare": "npm run build",
17
+ "typecheck": "tsc -p tsconfig.json --noEmit",
18
+ "test": "tsx --test test/**/*.test.ts",
19
+ "check": "npm run typecheck && npm test"
20
+ },
21
+ "dependencies": {
22
+ "@ai-sdk/anthropic": "2.0.105",
23
+ "@ai-sdk/openai": "2.0.130",
24
+ "@anthropic-ai/claude-agent-sdk": "0.3.282",
25
+ "@openai/codex-sdk": "0.157.0",
26
+ "ai": "6.0.291",
27
+ "yaml": "2.9.1",
28
+ "zod": "4.6.5"
29
+ },
30
+ "overrides": {
31
+ "@ai-sdk/provider-utils": {
32
+ "undici": "6.28.1"
33
+ }
34
+ },
35
+ "devDependencies": {
36
+ "@types/node": "22.18.6",
37
+ "tsx": "4.20.6",
38
+ "typescript": "5.9.3"
39
+ }
40
+ }
package/skill/SKILL.md ADDED
@@ -0,0 +1,65 @@
1
+ ---
2
+ name: wardo
3
+ description: Transform complex user requests into TypeScript workflows that orchestrate Codex and Claude Code agents with durable .wardo state.
4
+ ---
5
+
6
+ # wardo skill
7
+
8
+ Generate a TypeScript script using the `wardo` package. Do not generate Python.
9
+
10
+ Use one `execute({ prompt, workspace })` call for a simple task. For a complex task, use `defineWorkflow` and `defineTask` with explicit goals, acceptance criteria, dependencies, and a provider hint. Keep independent tasks independent so the scheduler can run up to the configured concurrency. Every task result is checked by a separate lightweight judge request and is persisted under `.wardo`.
11
+
12
+ The script must:
13
+
14
+ - preserve the original user request and task acceptance criteria;
15
+ - pass dependency results through summaries and artifact references;
16
+ - use `resume: true` for long-running work;
17
+ - avoid putting API keys in the script or `.wardo` files;
18
+ - leave simple file discovery and deterministic data processing to TypeScript code;
19
+ - request a Codex or Claude review when the workflow itself needs to change.
20
+
21
+ Provider keys and URLs are configured in `~/.wardo/config.yml` or environment variables. The generated script should not hard-code a provider secret.
22
+
23
+ ## Runtime bootstrap
24
+
25
+ The skill can be installed in either `~/.codex/skills/wardo` or `~/.claude/skills/wardo`. Before generating or running a script, identify the active host:
26
+
27
+ - `WARDO_ACTIVE_AGENT=codex` means Codex is the current host;
28
+ - `WARDO_ACTIVE_AGENT=claude` means Claude Code is the current host;
29
+ - if the variable is absent, the runtime checks `CODEX_*` and `CLAUDE_CODE*` environment variables and the installed binaries.
30
+
31
+ Pass the detected value to the generated script so automatic provider selection starts with the current host. An explicit task provider still takes precedence.
32
+
33
+ The generated script must bootstrap the package before importing it. This supports a freshly created project and local development where the package has not been installed yet:
34
+
35
+ ```ts
36
+ import { createRequire } from "node:module";
37
+ import { execFileSync } from "node:child_process";
38
+ import { existsSync } from "node:fs";
39
+ import { resolve } from "node:path";
40
+
41
+ const packageName = "wardo";
42
+ const requireFromScript = createRequire(import.meta.url);
43
+ try {
44
+ requireFromScript.resolve(packageName);
45
+ } catch {
46
+ const source = process.env.WARDO_LOCAL_PATH ?? process.env.WARDO_PACKAGE ?? packageName;
47
+ if (source.startsWith("/") && !existsSync(resolve(source, "dist/index.js"))) {
48
+ execFileSync("npm", ["run", "build", "--prefix", source], { stdio: "inherit", env: process.env });
49
+ }
50
+ execFileSync("npm", ["install", "--no-save", source], {
51
+ cwd: process.cwd(),
52
+ stdio: "inherit",
53
+ env: process.env,
54
+ });
55
+ }
56
+
57
+ const { execute } = await import(packageName);
58
+ await execute({
59
+ prompt: "用户目标",
60
+ workspace: process.cwd(),
61
+ resume: true,
62
+ });
63
+ ```
64
+
65
+ For local testing, set `WARDO_LOCAL_PATH=/data/wardo` (or the absolute path of this checkout). The bootstrap must use an absolute local path when the npm package has not been published. The `wardo install-skill` command installs this skill into every detected agent, or into a selected target with `--agent codex` or `--agent claude`.
@@ -0,0 +1,9 @@
1
+ import { execute } from "wardo";
2
+
3
+ await execute({
4
+ prompt: "把用户目标写在这里",
5
+ workspace: process.cwd(),
6
+ maxConcurrency: 3,
7
+ resume: true,
8
+ });
9
+