@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.
- package/.env.aidev.example +6 -1
- package/README.md +35 -1
- package/dist/ai/aider.d.ts +7 -0
- package/dist/ai/aider.d.ts.map +1 -0
- package/dist/ai/aider.js +39 -0
- package/dist/ai/aider.js.map +1 -0
- package/dist/ai/index.d.ts.map +1 -1
- package/dist/ai/index.js +2 -0
- package/dist/ai/index.js.map +1 -1
- package/dist/commands/run.d.ts +1 -0
- package/dist/commands/run.d.ts.map +1 -1
- package/dist/commands/run.js +71 -21
- package/dist/commands/run.js.map +1 -1
- package/dist/config.js +1 -1
- package/dist/config.js.map +1 -1
- package/dist/providers/base.d.ts +5 -0
- package/dist/providers/base.d.ts.map +1 -1
- package/dist/providers/clickup.d.ts +4 -1
- package/dist/providers/clickup.d.ts.map +1 -1
- package/dist/providers/clickup.js +19 -1
- package/dist/providers/clickup.js.map +1 -1
- package/dist/types.d.ts +2 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/ui/.output/nitro.json +1 -1
- package/ui/.output/server/chunks/build/styles.mjs +7 -7
- package/ui/.output/server/chunks/build/styles.mjs.map +1 -1
- package/ui/.output/server/chunks/nitro/nitro.mjs +115 -115
package/.env.aidev.example
CHANGED
|
@@ -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,
|
|
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 @@
|
|
|
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"}
|
package/dist/ai/aider.js
ADDED
|
@@ -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"}
|
package/dist/ai/index.d.ts.map
CHANGED
|
@@ -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;
|
|
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(),
|
package/dist/ai/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ai/index.ts"],"names":[],"mappings":";;
|
|
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"}
|
package/dist/commands/run.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAIjC,OAAO,EAIL,YAAY,EACb,MAAM,WAAW,CAAC;AAInB,OAAO,EACL,UAAU,EAAE,MAAM,EAGnB,MAAM,UAAU,CAAC;AAelB,eAAO,MAAM,oBAAoB,mBAAmB,CAAC;AAErD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAOvD;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAMpD;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAOxD;AAED,qEAAqE;AACrE,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,CAAC;AAE9D,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAC;IAClD,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,yFAAyF;IACzF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,OAAO,EAAE,CAAC;CACrB;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,EAAE,UAAU,GAAE,MAAe,GAAG,MAAM,GAAG,IAAI,CA8BrI;AAED,wBAAsB,sBAAsB,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAkBvG;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAIlE;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAIlE;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAIjC,OAAO,EAIL,YAAY,EACb,MAAM,WAAW,CAAC;AAInB,OAAO,EACL,UAAU,EAAE,MAAM,EAGnB,MAAM,UAAU,CAAC;AAelB,eAAO,MAAM,oBAAoB,mBAAmB,CAAC;AAErD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAOvD;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAMpD;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAOxD;AAED,qEAAqE;AACrE,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,CAAC;AAE9D,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAC;IAClD,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,yFAAyF;IACzF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,OAAO,EAAE,CAAC;CACrB;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,EAAE,UAAU,GAAE,MAAe,GAAG,MAAM,GAAG,IAAI,CA8BrI;AAED,wBAAsB,sBAAsB,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAkBvG;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAIlE;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAIlE;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,wBAAwB;IACvC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,oBAAoB,EAAE,CAAC;CAClC;AAED,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CA8C/E;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,wBAAwB,GAAG,IAAI,CAqDrF;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,CAIzD;AAaD,2GAA2G;AAC3G,eAAO,MAAM,4BAA4B,QAA2B,CAAC;AAQrE;;;GAGG;AACH,wBAAgB,6BAA6B,CAAC,GAAG,GAAE,MAAsB,EAAE,KAAK,GAAE,MAAmB,GAAG,IAAI,CA2B3G;AAQD,wBAAgB,aAAa,CAAC,IAAI,EAAE,gBAAgB,GAAG,IAAI,CAE1D;AAQD,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAmBpE;AAED,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAI3D;AAED,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAGxD;AAED,sGAAsG;AACtG,eAAO,MAAM,+CAA+C,OAAO,CAAC;AAEpE,gFAAgF;AAChF,eAAO,MAAM,uCAAuC,OAAO,CAAC;AAE5D,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAG7E;AAED,MAAM,WAAW,4BAA4B;IAC3C,kHAAkH;IAClH,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,IAAI,EACV,IAAI,EAAE,gBAAgB,EACtB,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,MAAM,GAAG,SAAS,EACjC,aAAa,EAAE,MAAM,GAAG,SAAS,EACjC,OAAO,EAAE,4BAA4B,GACpC,MAAM,CAkDR;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,gBAAgB,GAAG,MAAM,CAUhE;AAED,wBAAsB,UAAU,CAC9B,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,YAAY,EACtB,OAAO,EAAE,QAAQ,EAAE,EACnB,eAAe,CAAC,EAAE,YAAY,EAC9B,KAAK,GAAE,UAAe,EACtB,EAAE,CAAC,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAsGf;AA0FD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,GAAE,MAAkB,GAAG,OAAO,CAEvF;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,aAAa,GAAE,MAAkB,GAAG,OAAO,CAsB7F;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAMhF;AAoCD,wBAAsB,uBAAuB,CAC3C,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,YAAY,EACtB,OAAO,EAAE,QAAQ,EAAE,GAClB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAiDxB;AAED,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CA0B1G;AAmVD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAUxE;AA4FD,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,IAAI,EAChB,IAAI,EAAE,gBAAgB,EACtB,aAAa,EAAE,OAAO,EACtB,OAAO,EAAE,QAAQ,EAAE,GAClB,OAAO,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAiG3B;AA8VD,wBAAsB,qBAAqB,CACzC,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,YAAY,EACtB,OAAO,EAAE,QAAQ,EAAE,EACnB,KAAK,GAAE,UAAe,EACtB,EAAE,CAAC,EAAE,MAAM,GACV,OAAO,CAAC,IAAI,CAAC,CAwKf;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAG9C;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,MAAM,CAY9E;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAIjE;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAa5F;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CA6BtE;AAED,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,CAiC5F;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,aAAa,GAAE,MAAkB,GAAG,OAAO,CAE/F;AAED,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,aAAa,GAAE,MAAkB,GAAG,OAAO,EAAE,CAEzG;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,aAAa,GAAE,MAAkB,GAAG,OAAO,CAE/F;AAiND,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CA0B9E;AAED,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,IAAI,EACV,IAAI,EAAE,gBAAgB,EACtB,eAAe,EAAE,oBAAoB,EAAE,EACvC,aAAa,EAAE,MAAM,GAAG,SAAS,GAChC,MAAM,CA4BR;AAED,wBAAgB,qCAAqC,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAQ5E;AA8QD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAO9F;AA6KD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,MAAM,CAuC7E;AAED,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAWhH"}
|
package/dist/commands/run.js
CHANGED
|
@@ -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
|
-
|
|
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
|
}
|