@qelos/aidev 1.3.1 → 1.4.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.
@@ -77,9 +77,14 @@ GIT_REMOTE=origin
77
77
  GITHUB_BASE_BRANCH=main
78
78
  GITHUB_REPO=
79
79
 
80
- # Agents to use, in fallback order (comma-separated: antigravity, anthropic-sdk, claude, codex, cursor, devin)
80
+ # Agents to use, in fallback order (comma-separated: aider, antigravity, anthropic-sdk, claude, codex, cursor, devin)
81
81
  AGENTS=claude,cursor
82
82
 
83
+ # ── Aider (when AGENTS includes aider) ────────────────────────
84
+ # Extra CLI flags passed to aider (space-separated). Aider inherits
85
+ # ANTHROPIC_API_KEY and OPENAI_API_KEY from the environment automatically.
86
+ # AIDER_ARGS=--model gpt-4o --no-auto-commits
87
+
83
88
  # ── Claude CLI (when AGENTS includes claude) ──────────────────
84
89
  # Model passed to `claude --model`. Default `opusplan` routes plan→opus and
85
90
  # code→sonnet, saving tokens vs. running opus end-to-end.
package/README.md CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
  **aidev** turns your tasks into merged code — automatically.
8
8
 
9
- It polls your task manager (ClickUp, Jira, Linear, Monday.com, Notion, Trello, or local markdown files), checks whether tasks are clear, runs Claude, Cursor, or Devin to implement them, pushes a branch, and moves the task to review. All without touching your keyboard.
9
+ It polls your task manager (ClickUp, Jira, Linear, Monday.com, Notion, Trello, or local markdown files), checks whether tasks are clear, runs your configured AI agent (aider, Claude, Cursor, Devin, and more) to implement them, pushes a branch, and moves the task to review. All without touching your keyboard.
10
10
 
11
11
  ```
12
12
  Task → AI implements → git push → "in review" → AI resolves code review comments
@@ -319,11 +319,39 @@ aidev supports multiple AI agents with automatic fallback. The first available a
319
319
 
320
320
  | Agent | Requires |
321
321
  |---|---|
322
+ | `aider` | [aider](https://aider.chat) installed (`pip install aider-install && aider-install`) with an LLM API key set |
322
323
  | `antigravity` | Google **Antigravity** CLI (`agy` or `antigravity`) in PATH — see [Antigravity](https://antigravity.google/download) |
324
+ | `anthropic-sdk` | `ANTHROPIC_API_KEY` set; drives Claude in-process via the Anthropic Agent SDK |
323
325
  | `claude` | [Claude CLI](https://github.com/anthropics/claude-code) installed and authenticated |
326
+ | `codex` | [OpenAI Codex CLI](https://github.com/openai/codex) installed and authenticated |
324
327
  | `cursor` | Cursor **Agent CLI** (`agent`) in PATH — see [Windows](#windows-cursor-agent-cli) below |
325
328
  | `devin` | [Devin CLI](https://docs.devin.ai/cli) installed and authenticated |
326
329
 
330
+ ### Aider
331
+
332
+ [aider](https://aider.chat) is an open-source AI pair programming tool that connects to many LLMs (OpenAI, Anthropic, Gemini, Ollama, and more). Install it and set an API key for your preferred model:
333
+
334
+ ```bash
335
+ pip install aider-install
336
+ aider-install
337
+ # Then set the key for your chosen model, e.g.:
338
+ export ANTHROPIC_API_KEY=sk-ant-...
339
+ # or
340
+ export OPENAI_API_KEY=sk-...
341
+ ```
342
+
343
+ Pass extra CLI flags to aider via `AIDER_ARGS` in `.env.aidev`:
344
+
345
+ ```bash
346
+ # Use GPT-4o and disable auto-commits (aidev manages commits itself)
347
+ AIDER_ARGS=--model gpt-4o --no-auto-commits
348
+
349
+ # Use Claude Sonnet via aider
350
+ AIDER_ARGS=--model claude-sonnet-4-6 --no-auto-commits
351
+ ```
352
+
353
+ Aider inherits `ANTHROPIC_API_KEY`, `OPENAI_API_KEY`, and other LLM keys from the environment automatically.
354
+
327
355
  ### Windows: Cursor Agent CLI
328
356
 
329
357
  On Windows, the Cursor IDE (`cursor.exe`) is separate from the headless Agent CLI. The runner uses the `agent` binary. Install it in PowerShell:
@@ -352,6 +380,12 @@ AGENTS=claude,devin,cursor
352
380
  # Antigravity first, then Claude
353
381
  AGENTS=antigravity,claude
354
382
 
383
+ # Aider only (uses whatever LLM key is in the environment)
384
+ AGENTS=aider
385
+
386
+ # Aider first, fall back to Claude CLI
387
+ AGENTS=aider,claude
388
+
355
389
  # Devin only
356
390
  AGENTS=devin
357
391
  ```
@@ -0,0 +1,7 @@
1
+ import { AIRunner, AIRunResult } from './base';
2
+ export declare class AiderRunner implements AIRunner {
3
+ readonly name = "aider";
4
+ isAvailable(): boolean;
5
+ run(prompt: string, notes?: string): Promise<AIRunResult>;
6
+ }
7
+ //# sourceMappingURL=aider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aider.d.ts","sourceRoot":"","sources":["../../src/ai/aider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAI/C,qBAAa,WAAY,YAAW,QAAQ;IAC1C,QAAQ,CAAC,IAAI,WAAW;IAExB,WAAW,IAAI,OAAO;IAIhB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;CA4BhE"}
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AiderRunner = void 0;
4
+ const logger_1 = require("../logger");
5
+ const platform_1 = require("../platform");
6
+ class AiderRunner {
7
+ constructor() {
8
+ this.name = 'aider';
9
+ }
10
+ isAvailable() {
11
+ return (0, platform_1.commandExists)('aider');
12
+ }
13
+ async run(prompt, notes) {
14
+ const fullPrompt = notes ? `${prompt}\n\nAdditional context:\n${notes}` : prompt;
15
+ logger_1.logger.info('Running aider...');
16
+ logger_1.logger.debug(`Prompt: ${fullPrompt.slice(0, 200)}...`);
17
+ const extraArgs = (process.env.AIDER_ARGS || '').split(/\s+/).filter(Boolean);
18
+ const args = ['--message', fullPrompt, '--yes-always', ...extraArgs];
19
+ const result = (0, platform_1.spawnCommand)('aider', args, {
20
+ encoding: 'utf8',
21
+ timeout: 15 * 60 * 1000,
22
+ cwd: process.cwd(),
23
+ env: (0, platform_1.getUserShellEnv)(),
24
+ });
25
+ const success = result.status === 0;
26
+ const output = result.stdout || '';
27
+ const error = result.stderr || '';
28
+ if (!success) {
29
+ logger_1.logger.warn(`aider exited with status ${result.status}`);
30
+ if (error)
31
+ logger_1.logger.warn(`aider stderr: ${error.slice(0, 500)}`);
32
+ if (result.error)
33
+ logger_1.logger.warn(`aider spawn error: ${result.error.message}`);
34
+ }
35
+ return { success, output, error };
36
+ }
37
+ }
38
+ exports.AiderRunner = AiderRunner;
39
+ //# sourceMappingURL=aider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aider.js","sourceRoot":"","sources":["../../src/ai/aider.ts"],"names":[],"mappings":";;;AACA,sCAAmC;AACnC,0CAA2E;AAE3E,MAAa,WAAW;IAAxB;QACW,SAAI,GAAG,OAAO,CAAC;IAkC1B,CAAC;IAhCC,WAAW;QACT,OAAO,IAAA,wBAAa,EAAC,OAAO,CAAC,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,MAAc,EAAE,KAAc;QACtC,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,MAAM,4BAA4B,KAAK,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;QAEjF,eAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAChC,eAAM,CAAC,KAAK,CAAC,WAAW,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;QAEvD,MAAM,SAAS,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC9E,MAAM,IAAI,GAAG,CAAC,WAAW,EAAE,UAAU,EAAE,cAAc,EAAE,GAAG,SAAS,CAAC,CAAC;QAErE,MAAM,MAAM,GAAG,IAAA,uBAAY,EAAC,OAAO,EAAE,IAAI,EAAE;YACzC,QAAQ,EAAE,MAAM;YAChB,OAAO,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI;YACvB,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;YAClB,GAAG,EAAE,IAAA,0BAAe,GAAE;SACvB,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC;QACpC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;QACnC,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;QAElC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,eAAM,CAAC,IAAI,CAAC,4BAA4B,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;YACzD,IAAI,KAAK;gBAAE,eAAM,CAAC,IAAI,CAAC,iBAAiB,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;YAC/D,IAAI,MAAM,CAAC,KAAK;gBAAE,eAAM,CAAC,IAAI,CAAC,sBAAsB,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC9E,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IACpC,CAAC;CACF;AAnCD,kCAmCC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ai/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAkBlC,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,EAAE,CAcxD;AAED,OAAO,EAAE,QAAQ,EAAE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ai/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAoBlC,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,EAAE,CAcxD;AAED,OAAO,EAAE,QAAQ,EAAE,CAAC"}
package/dist/ai/index.js CHANGED
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.createRunners = createRunners;
4
+ const aider_1 = require("./aider");
4
5
  const antigravity_1 = require("./antigravity");
5
6
  const anthropicSdk_1 = require("./anthropicSdk");
6
7
  const claude_1 = require("./claude");
@@ -9,6 +10,7 @@ const cursor_1 = require("./cursor");
9
10
  const devin_1 = require("./devin");
10
11
  const logger_1 = require("../logger");
11
12
  const registry = {
13
+ aider: new aider_1.AiderRunner(),
12
14
  antigravity: new antigravity_1.AntigravityRunner(),
13
15
  'anthropic-sdk': new anthropicSdk_1.AnthropicSdkRunner(),
14
16
  claude: new claude_1.ClaudeRunner(),
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ai/index.ts"],"names":[],"mappings":";;AAmBA,sCAcC;AA/BD,+CAAkD;AAClD,iDAAoD;AACpD,qCAAwC;AACxC,mCAAsC;AACtC,qCAAwC;AACxC,mCAAsC;AACtC,sCAAmC;AAEnC,MAAM,QAAQ,GAA6B;IACzC,WAAW,EAAE,IAAI,+BAAiB,EAAE;IACpC,eAAe,EAAE,IAAI,iCAAkB,EAAE;IACzC,MAAM,EAAE,IAAI,qBAAY,EAAE;IAC1B,KAAK,EAAE,IAAI,mBAAW,EAAE;IACxB,MAAM,EAAE,IAAI,qBAAY,EAAE;IAC1B,KAAK,EAAE,IAAI,mBAAW,EAAE;CACzB,CAAC;AAEF,SAAgB,aAAa,CAAC,MAAc;IAC1C,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5D,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAC5E,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAE/E,eAAM,CAAC,IAAI,CAAC,kCAAkC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACvF,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,eAAM,CAAC,IAAI,CAAC,qCAAqC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;IACpG,CAAC;IACD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,eAAM,CAAC,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACrE,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ai/index.ts"],"names":[],"mappings":";;AAqBA,sCAcC;AAjCD,mCAAsC;AACtC,+CAAkD;AAClD,iDAAoD;AACpD,qCAAwC;AACxC,mCAAsC;AACtC,qCAAwC;AACxC,mCAAsC;AACtC,sCAAmC;AAEnC,MAAM,QAAQ,GAA6B;IACzC,KAAK,EAAE,IAAI,mBAAW,EAAE;IACxB,WAAW,EAAE,IAAI,+BAAiB,EAAE;IACpC,eAAe,EAAE,IAAI,iCAAkB,EAAE;IACzC,MAAM,EAAE,IAAI,qBAAY,EAAE;IAC1B,KAAK,EAAE,IAAI,mBAAW,EAAE;IACxB,MAAM,EAAE,IAAI,qBAAY,EAAE;IAC1B,KAAK,EAAE,IAAI,mBAAW,EAAE;CACzB,CAAC;AAEF,SAAgB,aAAa,CAAC,MAAc;IAC1C,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5D,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAC5E,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAE/E,eAAM,CAAC,IAAI,CAAC,kCAAkC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACvF,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,eAAM,CAAC,IAAI,CAAC,qCAAqC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;IACpG,CAAC;IACD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,eAAM,CAAC,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACrE,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -33,6 +33,7 @@ export interface PlanningSubtaskDraft {
33
33
  title: string;
34
34
  description: string;
35
35
  priority?: number;
36
+ blockedBy?: number[];
36
37
  }
37
38
  export interface PlanningAnalysisResponse {
38
39
  clarification?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"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"}
@@ -221,6 +221,12 @@ CRITICAL — each sub-task description MUST be fully isolated:
221
221
 
222
222
  Sub-task priority is optional and uses an integer 1–4 (1 = urgent, 4 = low). Omit the field if you have no opinion.
223
223
 
224
+ Sub-task blockers: each sub-task may include an optional "blockedBy" array of 0-based indices into the "subtasks" array, listing sub-tasks that must complete before this one starts. Rules:
225
+ - Only set it when there is a genuine sequential dependency (e.g. a migration must run before the code that uses it).
226
+ - Most sub-tasks should have no blockers — omit the field entirely when not needed.
227
+ - Do not reference a sub-task's own index (no self-blocking).
228
+ - Do not create circular dependencies (if A blocks B, B must not block A).
229
+
224
230
  Respond with valid JSON only — no markdown fences, no extra text:
225
231
  {
226
232
  "clarification": "question text, or null if no clarification is needed",
@@ -228,7 +234,8 @@ Respond with valid JSON only — no markdown fences, no extra text:
228
234
  {
229
235
  "title": "Short, specific title",
230
236
  "description": "Fully self-contained ticket body (markdown ok). Include all paths, references, and reasoning needed to do this work without seeing the parent ticket.",
231
- "priority": 2
237
+ "priority": 2,
238
+ "blockedBy": [0]
232
239
  }
233
240
  ]
234
241
  }
@@ -270,6 +277,17 @@ function parsePlanningResponse(output) {
270
277
  if (typeof entry.priority === 'number' && Number.isFinite(entry.priority)) {
271
278
  draft.priority = entry.priority;
272
279
  }
280
+ const idx = subtasks.length;
281
+ if (Array.isArray(entry.blockedBy)) {
282
+ const cleaned = (entry.blockedBy)
283
+ .filter((n) => typeof n === 'number' &&
284
+ Number.isInteger(n) &&
285
+ n >= 0 &&
286
+ n < rawSubtasks.length &&
287
+ n !== idx);
288
+ if (cleaned.length > 0)
289
+ draft.blockedBy = cleaned;
290
+ }
273
291
  subtasks.push(draft);
274
292
  }
275
293
  if (!clarification && subtasks.length === 0)
@@ -473,26 +491,7 @@ async function runCommand(filter, config, provider, runners, nonCodeProvider, ho
473
491
  }
474
492
  let processed = 0;
475
493
  let skipped = 0;
476
- for (const task of tasks) {
477
- const result = await processTask(task, filter, config, provider, runners, screenAvailable, hooks, vm);
478
- if (result === 'processed')
479
- processed++;
480
- else
481
- skipped++;
482
- }
483
- if (nonCodeProvider && !taskId) {
484
- logger_1.logger.info(`Fetching non-code tasks (filter: ${filter})...`);
485
- const nonCodeTasks = sortTasksByPriority(await nonCodeProvider.fetchTasks());
486
- logger_1.logger.info(`Found ${nonCodeTasks.length} non-code task(s)`);
487
- for (const task of nonCodeTasks) {
488
- const result = await processNonCodeTask(task, filter, config, nonCodeProvider, runners, screenAvailable, hooks, vm);
489
- if (result === 'processed')
490
- processed++;
491
- else
492
- skipped++;
493
- }
494
- }
495
- // Review task phase: check tasks in review status for unresolved code review comments
494
+ // Review task phase (first): check tasks in review status for unresolved code review comments
496
495
  if (!taskId && (0, github_1.isGitHubRemote)(config.gitRemote) && (0, github_1.isGhInstalled)() && (0, github_1.isGhAuthenticated)() && config.githubRepo) {
497
496
  const reviewStatus = getInReviewStatus(config);
498
497
  logger_1.logger.info(`Fetching tasks in "${reviewStatus}" status for code review checks...`);
@@ -526,6 +525,25 @@ async function runCommand(filter, config, provider, runners, nonCodeProvider, ho
526
525
  logger_1.logger.debug('gh CLI not available — skipping review task checks');
527
526
  }
528
527
  }
528
+ for (const task of tasks) {
529
+ const result = await processTask(task, filter, config, provider, runners, screenAvailable, hooks, vm);
530
+ if (result === 'processed')
531
+ processed++;
532
+ else
533
+ skipped++;
534
+ }
535
+ if (nonCodeProvider && !taskId) {
536
+ logger_1.logger.info(`Fetching non-code tasks (filter: ${filter})...`);
537
+ const nonCodeTasks = sortTasksByPriority(await nonCodeProvider.fetchTasks());
538
+ logger_1.logger.info(`Found ${nonCodeTasks.length} non-code task(s)`);
539
+ for (const task of nonCodeTasks) {
540
+ const result = await processNonCodeTask(task, filter, config, nonCodeProvider, runners, screenAvailable, hooks, vm);
541
+ if (result === 'processed')
542
+ processed++;
543
+ else
544
+ skipped++;
545
+ }
546
+ }
529
547
  // afterRun hook
530
548
  if (vm) {
531
549
  const afterCtx = {
@@ -1509,6 +1527,7 @@ async function implementPlanningTask(task, config, provider, runners, hooks = {}
1509
1527
  const ticketTags = task.tags.filter((t) => t.toLowerCase() !== planningTagLower);
1510
1528
  const created = [];
1511
1529
  const failures = [];
1530
+ const createdIdByIndex = [];
1512
1531
  for (const draft of parsed.subtasks) {
1513
1532
  try {
1514
1533
  const result = await provider.createTask({
@@ -1519,12 +1538,37 @@ async function implementPlanningTask(task, config, provider, runners, hooks = {}
1519
1538
  listId: task.sourceListId,
1520
1539
  });
1521
1540
  created.push({ title: draft.title, url: result.url, id: result.id });
1541
+ createdIdByIndex.push(result.id);
1522
1542
  logger_1.logger.success(` Created sub-ticket "${draft.title}" — ${result.url}`);
1523
1543
  }
1524
1544
  catch (err) {
1525
1545
  const message = err instanceof Error ? err.message : String(err);
1526
1546
  logger_1.logger.warn(` Failed to create sub-ticket "${draft.title}": ${message}`);
1527
1547
  failures.push({ title: draft.title, error: message });
1548
+ createdIdByIndex.push(null);
1549
+ }
1550
+ }
1551
+ const blockerFailures = [];
1552
+ if (provider.setBlockedBy) {
1553
+ for (let i = 0; i < parsed.subtasks.length; i++) {
1554
+ const draft = parsed.subtasks[i];
1555
+ const taskId = createdIdByIndex[i];
1556
+ if (!taskId || !draft.blockedBy || draft.blockedBy.length === 0)
1557
+ continue;
1558
+ const resolvedIds = draft.blockedBy
1559
+ .map((idx) => createdIdByIndex[idx])
1560
+ .filter((id) => id !== null);
1561
+ if (resolvedIds.length === 0)
1562
+ continue;
1563
+ try {
1564
+ await provider.setBlockedBy(taskId, resolvedIds);
1565
+ logger_1.logger.info(` Set blockers for "${draft.title}"`);
1566
+ }
1567
+ catch (err) {
1568
+ const message = err instanceof Error ? err.message : String(err);
1569
+ logger_1.logger.warn(` Failed to set blockers for "${draft.title}": ${message}`);
1570
+ blockerFailures.push({ title: draft.title, error: message });
1571
+ }
1528
1572
  }
1529
1573
  }
1530
1574
  const summaryLines = [
@@ -1544,6 +1588,12 @@ async function implementPlanningTask(task, config, provider, runners, hooks = {}
1544
1588
  summaryLines.push(`- ${f.title} — ${f.error}`);
1545
1589
  }
1546
1590
  }
1591
+ if (blockerFailures.length > 0) {
1592
+ summaryLines.push('', 'Failed to set blockers:');
1593
+ for (const f of blockerFailures) {
1594
+ summaryLines.push(`- ${f.title} — ${f.error}`);
1595
+ }
1596
+ }
1547
1597
  try {
1548
1598
  await (0, hooks_1.postCommentWithHooks)(task, summaryLines.join('\n'), config, provider, hooks, vm);
1549
1599
  }