@developerz.ai/aitm 0.0.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/LICENSE +21 -0
- package/README.md +30 -0
- package/dist/agent-config/agent-config-detector.d.ts +15 -0
- package/dist/agent-config/agent-config-detector.js +56 -0
- package/dist/agent-config/agent-config-detector.js.map +1 -0
- package/dist/cli/args.d.ts +37 -0
- package/dist/cli/args.js +238 -0
- package/dist/cli/args.js.map +1 -0
- package/dist/cli/cli.d.ts +15 -0
- package/dist/cli/cli.js +113 -0
- package/dist/cli/cli.js.map +1 -0
- package/dist/cli/commands.d.ts +83 -0
- package/dist/cli/commands.js +521 -0
- package/dist/cli/commands.js.map +1 -0
- package/dist/compaction/compactor.d.ts +20 -0
- package/dist/compaction/compactor.js +75 -0
- package/dist/compaction/compactor.js.map +1 -0
- package/dist/config/config-loader.d.ts +25 -0
- package/dist/config/config-loader.js +275 -0
- package/dist/config/config-loader.js.map +1 -0
- package/dist/config/config-writer.d.ts +14 -0
- package/dist/config/config-writer.js +178 -0
- package/dist/config/config-writer.js.map +1 -0
- package/dist/config/schema.d.ts +85 -0
- package/dist/config/schema.js +38 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/credentials/credentials.d.ts +15 -0
- package/dist/credentials/credentials.js +58 -0
- package/dist/credentials/credentials.js.map +1 -0
- package/dist/credentials/defaults.d.ts +2 -0
- package/dist/credentials/defaults.js +21 -0
- package/dist/credentials/defaults.js.map +1 -0
- package/dist/fs/atomic-write.d.ts +1 -0
- package/dist/fs/atomic-write.js +27 -0
- package/dist/fs/atomic-write.js.map +1 -0
- package/dist/github/errors.d.ts +18 -0
- package/dist/github/errors.js +20 -0
- package/dist/github/errors.js.map +1 -0
- package/dist/github/github-client.d.ts +47 -0
- package/dist/github/github-client.js +417 -0
- package/dist/github/github-client.js.map +1 -0
- package/dist/github/schema.d.ts +44 -0
- package/dist/github/schema.js +23 -0
- package/dist/github/schema.js.map +1 -0
- package/dist/index.d.ts +26 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -0
- package/dist/logger/logger.d.ts +36 -0
- package/dist/logger/logger.js +123 -0
- package/dist/logger/logger.js.map +1 -0
- package/dist/loop/run-loop-adapter.d.ts +46 -0
- package/dist/loop/run-loop-adapter.js +270 -0
- package/dist/loop/run-loop-adapter.js.map +1 -0
- package/dist/loop/take-over-flow.d.ts +57 -0
- package/dist/loop/take-over-flow.js +183 -0
- package/dist/loop/take-over-flow.js.map +1 -0
- package/dist/loop/work-loop.d.ts +95 -0
- package/dist/loop/work-loop.js +211 -0
- package/dist/loop/work-loop.js.map +1 -0
- package/dist/mcp/mcp-client.d.ts +27 -0
- package/dist/mcp/mcp-client.js +123 -0
- package/dist/mcp/mcp-client.js.map +1 -0
- package/dist/mcp/schema.d.ts +53 -0
- package/dist/mcp/schema.js +39 -0
- package/dist/mcp/schema.js.map +1 -0
- package/dist/openrouter/client.d.ts +28 -0
- package/dist/openrouter/client.js +40 -0
- package/dist/openrouter/client.js.map +1 -0
- package/dist/openrouter/model-limits.d.ts +21 -0
- package/dist/openrouter/model-limits.js +39 -0
- package/dist/openrouter/model-limits.js.map +1 -0
- package/dist/openrouter/server-tools.d.ts +35 -0
- package/dist/openrouter/server-tools.js +25 -0
- package/dist/openrouter/server-tools.js.map +1 -0
- package/dist/orchestrator/orchestrator.d.ts +60 -0
- package/dist/orchestrator/orchestrator.js +180 -0
- package/dist/orchestrator/orchestrator.js.map +1 -0
- package/dist/orchestrator/subagent-tools.d.ts +44 -0
- package/dist/orchestrator/subagent-tools.js +133 -0
- package/dist/orchestrator/subagent-tools.js.map +1 -0
- package/dist/orchestrator/system-prompts.d.ts +4 -0
- package/dist/orchestrator/system-prompts.js +78 -0
- package/dist/orchestrator/system-prompts.js.map +1 -0
- package/dist/plan/plan-graph.d.ts +11 -0
- package/dist/plan/plan-graph.js +69 -0
- package/dist/plan/plan-graph.js.map +1 -0
- package/dist/plan/schema.d.ts +30 -0
- package/dist/plan/schema.js +24 -0
- package/dist/plan/schema.js.map +1 -0
- package/dist/state/schema.d.ts +88 -0
- package/dist/state/schema.js +53 -0
- package/dist/state/schema.js.map +1 -0
- package/dist/state/state-store.d.ts +16 -0
- package/dist/state/state-store.js +129 -0
- package/dist/state/state-store.js.map +1 -0
- package/dist/subagents/factory.d.ts +8 -0
- package/dist/subagents/factory.js +10 -0
- package/dist/subagents/factory.js.map +1 -0
- package/dist/subagents/planner.d.ts +31 -0
- package/dist/subagents/planner.js +83 -0
- package/dist/subagents/planner.js.map +1 -0
- package/dist/subagents/reviewer.d.ts +60 -0
- package/dist/subagents/reviewer.js +159 -0
- package/dist/subagents/reviewer.js.map +1 -0
- package/dist/subagents/worker.d.ts +71 -0
- package/dist/subagents/worker.js +180 -0
- package/dist/subagents/worker.js.map +1 -0
- package/dist/testing/temp-repo.d.ts +7 -0
- package/dist/testing/temp-repo.js +21 -0
- package/dist/testing/temp-repo.js.map +1 -0
- package/dist/tools/datetime.d.ts +12 -0
- package/dist/tools/datetime.js +42 -0
- package/dist/tools/datetime.js.map +1 -0
- package/dist/tools/fetch-html.d.ts +32 -0
- package/dist/tools/fetch-html.js +139 -0
- package/dist/tools/fetch-html.js.map +1 -0
- package/dist/tools/github-thread-tool.d.ts +10 -0
- package/dist/tools/github-thread-tool.js +36 -0
- package/dist/tools/github-thread-tool.js.map +1 -0
- package/dist/tools/web-fetch.d.ts +31 -0
- package/dist/tools/web-fetch.js +223 -0
- package/dist/tools/web-fetch.js.map +1 -0
- package/dist/workspace/worktree-pool.d.ts +21 -0
- package/dist/workspace/worktree-pool.js +104 -0
- package/dist/workspace/worktree-pool.js.map +1 -0
- package/package.json +50 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 developerz-ai
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# @developerz.ai/aitm
|
|
2
|
+
|
|
3
|
+
Autonomous task orchestrator. Goal in, merged PRs out.
|
|
4
|
+
|
|
5
|
+
`aitm` drives a plan → work → review loop over a real git repo: an Orchestrator
|
|
6
|
+
agent decomposes a goal into PR-sized groups, a Worker opens PRs, and a Reviewer
|
|
7
|
+
turns review comments into follow-up commits. Inference runs through OpenRouter.
|
|
8
|
+
|
|
9
|
+
## Install
|
|
10
|
+
|
|
11
|
+
```sh
|
|
12
|
+
npm install -g @developerz.ai/aitm
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
This installs the `aitm` command.
|
|
16
|
+
|
|
17
|
+
## Usage
|
|
18
|
+
|
|
19
|
+
```sh
|
|
20
|
+
export OPENROUTER_API_KEY=... # required
|
|
21
|
+
aitm start # plan + work the current repo toward a goal
|
|
22
|
+
aitm merge-pr # merge the current task's PR
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
See the [project README](https://github.com/developerz-ai/ai-task-master#readme)
|
|
26
|
+
for configuration (`mcpServers`, per-role models) and the full workflow.
|
|
27
|
+
|
|
28
|
+
## License
|
|
29
|
+
|
|
30
|
+
MIT
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export type AgentConfigFlavor = 'claude' | 'agents' | 'custom';
|
|
2
|
+
export type AgentConfig = {
|
|
3
|
+
flavor: AgentConfigFlavor;
|
|
4
|
+
path: string;
|
|
5
|
+
contents: string;
|
|
6
|
+
};
|
|
7
|
+
export type DetectOptions = {
|
|
8
|
+
stylePath?: string | null;
|
|
9
|
+
prefer?: 'claude' | 'agents';
|
|
10
|
+
};
|
|
11
|
+
export declare class AgentConfigDetector {
|
|
12
|
+
private readonly repoRoot;
|
|
13
|
+
constructor(repoRoot: string);
|
|
14
|
+
detect(options: DetectOptions): Promise<AgentConfig | null>;
|
|
15
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
// docs/agent-config-detection.md, docs/coding-style.md
|
|
2
|
+
// Style signal only — never selects a provider. Prefer CLAUDE.md over AGENTS.md when both exist.
|
|
3
|
+
import { readFile } from 'node:fs/promises';
|
|
4
|
+
import { isAbsolute, join, relative, resolve } from 'node:path';
|
|
5
|
+
export class AgentConfigDetector {
|
|
6
|
+
repoRoot;
|
|
7
|
+
constructor(repoRoot) {
|
|
8
|
+
this.repoRoot = repoRoot;
|
|
9
|
+
}
|
|
10
|
+
async detect(options) {
|
|
11
|
+
if (options.stylePath) {
|
|
12
|
+
const path = isAbsolute(options.stylePath)
|
|
13
|
+
? options.stylePath
|
|
14
|
+
: resolve(this.repoRoot, options.stylePath);
|
|
15
|
+
if (!isAbsolute(options.stylePath)) {
|
|
16
|
+
const rel = relative(this.repoRoot, path);
|
|
17
|
+
if (rel.startsWith('..') || isAbsolute(rel)) {
|
|
18
|
+
throw new Error(`stylePath must remain within repoRoot: ${options.stylePath}`);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
const contents = await readFile(path, 'utf8');
|
|
22
|
+
return { flavor: 'custom', path, contents };
|
|
23
|
+
}
|
|
24
|
+
const claudePath = join(this.repoRoot, 'CLAUDE.md');
|
|
25
|
+
const agentsPath = join(this.repoRoot, 'AGENTS.md');
|
|
26
|
+
const claude = await readIfExists(claudePath);
|
|
27
|
+
const agents = await readIfExists(agentsPath);
|
|
28
|
+
if (claude !== null && agents !== null) {
|
|
29
|
+
return options.prefer === 'agents'
|
|
30
|
+
? { flavor: 'agents', path: agentsPath, contents: agents }
|
|
31
|
+
: { flavor: 'claude', path: claudePath, contents: claude };
|
|
32
|
+
}
|
|
33
|
+
if (claude !== null)
|
|
34
|
+
return { flavor: 'claude', path: claudePath, contents: claude };
|
|
35
|
+
if (agents !== null)
|
|
36
|
+
return { flavor: 'agents', path: agentsPath, contents: agents };
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
async function readIfExists(path) {
|
|
41
|
+
try {
|
|
42
|
+
return await readFile(path, 'utf8');
|
|
43
|
+
}
|
|
44
|
+
catch (err) {
|
|
45
|
+
if (isNotFound(err))
|
|
46
|
+
return null;
|
|
47
|
+
throw err;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
function isNotFound(err) {
|
|
51
|
+
return (typeof err === 'object' &&
|
|
52
|
+
err !== null &&
|
|
53
|
+
'code' in err &&
|
|
54
|
+
err.code === 'ENOENT');
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=agent-config-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-config-detector.js","sourceRoot":"","sources":["../../src/agent-config/agent-config-detector.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,iGAAiG;AAEjG,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAehE,MAAM,OAAO,mBAAmB;IACD;IAA7B,YAA6B,QAAgB;QAAhB,aAAQ,GAAR,QAAQ,CAAQ;IAAG,CAAC;IAEjD,KAAK,CAAC,MAAM,CAAC,OAAsB;QACjC,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;YACtB,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC;gBACxC,CAAC,CAAC,OAAO,CAAC,SAAS;gBACnB,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;YAC9C,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;gBACnC,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;gBAC1C,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;oBAC5C,MAAM,IAAI,KAAK,CAAC,0CAA0C,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;gBACjF,CAAC;YACH,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YAC9C,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QAC9C,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QACpD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QACpD,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,UAAU,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,UAAU,CAAC,CAAC;QAE9C,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YACvC,OAAO,OAAO,CAAC,MAAM,KAAK,QAAQ;gBAChC,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE;gBAC1D,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;QAC/D,CAAC;QACD,IAAI,MAAM,KAAK,IAAI;YAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;QACrF,IAAI,MAAM,KAAK,IAAI;YAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;QACrF,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAED,KAAK,UAAU,YAAY,CAAC,IAAY;IACtC,IAAI,CAAC;QACH,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACtC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,UAAU,CAAC,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QACjC,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,GAAY;IAC9B,OAAO,CACL,OAAO,GAAG,KAAK,QAAQ;QACvB,GAAG,KAAK,IAAI;QACZ,MAAM,IAAI,GAAG;QACZ,GAAyB,CAAC,IAAI,KAAK,QAAQ,CAC7C,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export type StartArgs = {
|
|
2
|
+
kind: 'start';
|
|
3
|
+
goal: string;
|
|
4
|
+
criteria?: string;
|
|
5
|
+
maxPrs?: number;
|
|
6
|
+
maxSessions?: number | null;
|
|
7
|
+
autoMerge?: boolean;
|
|
8
|
+
stylePath?: string | null;
|
|
9
|
+
model?: string;
|
|
10
|
+
concurrency?: number;
|
|
11
|
+
};
|
|
12
|
+
export type MergePrArgs = {
|
|
13
|
+
kind: 'merge-pr';
|
|
14
|
+
pr?: number;
|
|
15
|
+
resume: boolean;
|
|
16
|
+
};
|
|
17
|
+
export type ConfigArgs = {
|
|
18
|
+
kind: 'config-set';
|
|
19
|
+
scope: 'global' | 'project';
|
|
20
|
+
key: string;
|
|
21
|
+
value: string;
|
|
22
|
+
} | {
|
|
23
|
+
kind: 'config-unset';
|
|
24
|
+
scope: 'global' | 'project';
|
|
25
|
+
key: string;
|
|
26
|
+
} | {
|
|
27
|
+
kind: 'config-get';
|
|
28
|
+
scope: 'global' | 'project';
|
|
29
|
+
key: string;
|
|
30
|
+
} | {
|
|
31
|
+
kind: 'config-list';
|
|
32
|
+
scope: 'global' | 'project';
|
|
33
|
+
};
|
|
34
|
+
export type ParsedArgs = StartArgs | MergePrArgs | ConfigArgs | {
|
|
35
|
+
kind: 'help';
|
|
36
|
+
};
|
|
37
|
+
export declare function parseArgs(argv: ReadonlyArray<string>): ParsedArgs;
|
package/dist/cli/args.js
ADDED
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
// docs/commands/start.md §Signature, docs/commands/merge-pr.md §Signature, docs/commands/config.md
|
|
2
|
+
// Tiny dependency-free argv parser. Pure function — easy to unit-test.
|
|
3
|
+
const HELP = { kind: 'help' };
|
|
4
|
+
export function parseArgs(argv) {
|
|
5
|
+
const [command, ...rest] = argv;
|
|
6
|
+
if (command === undefined)
|
|
7
|
+
return HELP;
|
|
8
|
+
if (command === 'help' || command === '--help' || command === '-h')
|
|
9
|
+
return HELP;
|
|
10
|
+
switch (command) {
|
|
11
|
+
case 'start':
|
|
12
|
+
return parseStart(rest);
|
|
13
|
+
case 'merge-pr':
|
|
14
|
+
return parseMergePr(rest);
|
|
15
|
+
case 'config':
|
|
16
|
+
return parseConfig(rest);
|
|
17
|
+
default:
|
|
18
|
+
return HELP;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
function parseStart(args) {
|
|
22
|
+
const positionals = [];
|
|
23
|
+
let criteria;
|
|
24
|
+
let maxPrs;
|
|
25
|
+
let maxSessions;
|
|
26
|
+
let autoMerge;
|
|
27
|
+
let stylePath;
|
|
28
|
+
let model;
|
|
29
|
+
let concurrency;
|
|
30
|
+
let i = 0;
|
|
31
|
+
while (i < args.length) {
|
|
32
|
+
const raw = args[i];
|
|
33
|
+
if (raw === undefined)
|
|
34
|
+
break;
|
|
35
|
+
const { flag, inlineValue, consumed } = splitFlag(raw);
|
|
36
|
+
if (flag === '--criteria') {
|
|
37
|
+
const v = takeValue(args, i, inlineValue);
|
|
38
|
+
if (v === null)
|
|
39
|
+
return HELP;
|
|
40
|
+
criteria = v;
|
|
41
|
+
i += consumed(inlineValue !== null);
|
|
42
|
+
}
|
|
43
|
+
else if (flag === '--max-prs') {
|
|
44
|
+
const v = takeValue(args, i, inlineValue);
|
|
45
|
+
const n = parseNonNegativeInt(v);
|
|
46
|
+
if (n === null)
|
|
47
|
+
return HELP;
|
|
48
|
+
maxPrs = n;
|
|
49
|
+
i += consumed(inlineValue !== null);
|
|
50
|
+
}
|
|
51
|
+
else if (flag === '--max-sessions') {
|
|
52
|
+
const v = takeValue(args, i, inlineValue);
|
|
53
|
+
const n = parseNonNegativeInt(v);
|
|
54
|
+
if (n === null)
|
|
55
|
+
return HELP;
|
|
56
|
+
maxSessions = n;
|
|
57
|
+
i += consumed(inlineValue !== null);
|
|
58
|
+
}
|
|
59
|
+
else if (flag === '--concurrency') {
|
|
60
|
+
const v = takeValue(args, i, inlineValue);
|
|
61
|
+
const n = parsePositiveInt(v);
|
|
62
|
+
if (n === null)
|
|
63
|
+
return HELP;
|
|
64
|
+
concurrency = n;
|
|
65
|
+
i += consumed(inlineValue !== null);
|
|
66
|
+
}
|
|
67
|
+
else if (flag === '--no-automerge') {
|
|
68
|
+
// Boolean flag rejects any inline value: `--no-automerge=true` is a usage error,
|
|
69
|
+
// not silently treated as the boolean.
|
|
70
|
+
if (inlineValue !== null)
|
|
71
|
+
return HELP;
|
|
72
|
+
autoMerge = false;
|
|
73
|
+
i += 1;
|
|
74
|
+
}
|
|
75
|
+
else if (flag === '--style') {
|
|
76
|
+
const v = takeValue(args, i, inlineValue);
|
|
77
|
+
if (v === null)
|
|
78
|
+
return HELP;
|
|
79
|
+
stylePath = v;
|
|
80
|
+
i += consumed(inlineValue !== null);
|
|
81
|
+
}
|
|
82
|
+
else if (flag === '--model') {
|
|
83
|
+
const v = takeValue(args, i, inlineValue);
|
|
84
|
+
if (v === null)
|
|
85
|
+
return HELP;
|
|
86
|
+
model = v;
|
|
87
|
+
i += consumed(inlineValue !== null);
|
|
88
|
+
}
|
|
89
|
+
else if (raw.startsWith('--')) {
|
|
90
|
+
return HELP;
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
positionals.push(raw);
|
|
94
|
+
i += 1;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
const goal = positionals[0];
|
|
98
|
+
if (goal === undefined || positionals.length > 1)
|
|
99
|
+
return HELP;
|
|
100
|
+
const out = { kind: 'start', goal };
|
|
101
|
+
if (criteria !== undefined)
|
|
102
|
+
out.criteria = criteria;
|
|
103
|
+
if (maxPrs !== undefined)
|
|
104
|
+
out.maxPrs = maxPrs;
|
|
105
|
+
if (maxSessions !== undefined)
|
|
106
|
+
out.maxSessions = maxSessions;
|
|
107
|
+
if (autoMerge !== undefined)
|
|
108
|
+
out.autoMerge = autoMerge;
|
|
109
|
+
if (stylePath !== undefined)
|
|
110
|
+
out.stylePath = stylePath;
|
|
111
|
+
if (model !== undefined)
|
|
112
|
+
out.model = model;
|
|
113
|
+
if (concurrency !== undefined)
|
|
114
|
+
out.concurrency = concurrency;
|
|
115
|
+
return out;
|
|
116
|
+
}
|
|
117
|
+
function parseMergePr(args) {
|
|
118
|
+
let pr;
|
|
119
|
+
let resume = true;
|
|
120
|
+
let i = 0;
|
|
121
|
+
while (i < args.length) {
|
|
122
|
+
const raw = args[i];
|
|
123
|
+
if (raw === undefined)
|
|
124
|
+
break;
|
|
125
|
+
const { flag, inlineValue, consumed } = splitFlag(raw);
|
|
126
|
+
if (flag === '--pr') {
|
|
127
|
+
const v = takeValue(args, i, inlineValue);
|
|
128
|
+
const n = parsePositiveInt(v);
|
|
129
|
+
if (n === null)
|
|
130
|
+
return HELP;
|
|
131
|
+
pr = n;
|
|
132
|
+
i += consumed(inlineValue !== null);
|
|
133
|
+
}
|
|
134
|
+
else if (flag === '--no-resume') {
|
|
135
|
+
if (inlineValue !== null)
|
|
136
|
+
return HELP;
|
|
137
|
+
resume = false;
|
|
138
|
+
i += 1;
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
return HELP;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
const out = { kind: 'merge-pr', resume };
|
|
145
|
+
if (pr !== undefined)
|
|
146
|
+
out.pr = pr;
|
|
147
|
+
return out;
|
|
148
|
+
}
|
|
149
|
+
function parseConfig(args) {
|
|
150
|
+
const sub = args[0];
|
|
151
|
+
if (sub === undefined)
|
|
152
|
+
return HELP;
|
|
153
|
+
const tail = args.slice(1);
|
|
154
|
+
const positionals = [];
|
|
155
|
+
let scope = 'global';
|
|
156
|
+
for (const arg of tail) {
|
|
157
|
+
if (arg === '--project') {
|
|
158
|
+
scope = 'project';
|
|
159
|
+
}
|
|
160
|
+
else if (arg.startsWith('--')) {
|
|
161
|
+
// `--project=anything` is a usage error: --project is a boolean flag.
|
|
162
|
+
return HELP;
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
positionals.push(arg);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
switch (sub) {
|
|
169
|
+
case 'set': {
|
|
170
|
+
if (positionals.length !== 2)
|
|
171
|
+
return HELP;
|
|
172
|
+
const [key, value] = positionals;
|
|
173
|
+
if (key === undefined || value === undefined)
|
|
174
|
+
return HELP;
|
|
175
|
+
return { kind: 'config-set', scope, key, value };
|
|
176
|
+
}
|
|
177
|
+
case 'unset': {
|
|
178
|
+
if (positionals.length !== 1)
|
|
179
|
+
return HELP;
|
|
180
|
+
const [key] = positionals;
|
|
181
|
+
if (key === undefined)
|
|
182
|
+
return HELP;
|
|
183
|
+
return { kind: 'config-unset', scope, key };
|
|
184
|
+
}
|
|
185
|
+
case 'get': {
|
|
186
|
+
if (positionals.length !== 1)
|
|
187
|
+
return HELP;
|
|
188
|
+
const [key] = positionals;
|
|
189
|
+
if (key === undefined)
|
|
190
|
+
return HELP;
|
|
191
|
+
return { kind: 'config-get', scope, key };
|
|
192
|
+
}
|
|
193
|
+
case 'list': {
|
|
194
|
+
if (positionals.length !== 0)
|
|
195
|
+
return HELP;
|
|
196
|
+
return { kind: 'config-list', scope };
|
|
197
|
+
}
|
|
198
|
+
default:
|
|
199
|
+
return HELP;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
function parseNonNegativeInt(s) {
|
|
203
|
+
if (s === undefined || s === null)
|
|
204
|
+
return null;
|
|
205
|
+
if (!/^\d+$/.test(s))
|
|
206
|
+
return null;
|
|
207
|
+
const n = Number(s);
|
|
208
|
+
return Number.isSafeInteger(n) ? n : null;
|
|
209
|
+
}
|
|
210
|
+
function parsePositiveInt(s) {
|
|
211
|
+
const n = parseNonNegativeInt(s);
|
|
212
|
+
return n !== null && n > 0 ? n : null;
|
|
213
|
+
}
|
|
214
|
+
// Split `--key=value` into flag + inline value. For `--key` alone, inlineValue is null
|
|
215
|
+
// and the caller must read args[i+1] for the value (two-token form).
|
|
216
|
+
function splitFlag(raw) {
|
|
217
|
+
if (!raw.startsWith('--')) {
|
|
218
|
+
return { flag: raw, inlineValue: null, consumed: () => 1 };
|
|
219
|
+
}
|
|
220
|
+
const eq = raw.indexOf('=');
|
|
221
|
+
if (eq === -1) {
|
|
222
|
+
return { flag: raw, inlineValue: null, consumed: (inline) => (inline ? 1 : 2) };
|
|
223
|
+
}
|
|
224
|
+
return {
|
|
225
|
+
flag: raw.slice(0, eq),
|
|
226
|
+
inlineValue: raw.slice(eq + 1),
|
|
227
|
+
consumed: (inline) => (inline ? 1 : 2),
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
// Resolve the value for a flag: prefer the inline form (--key=value); fall back to the
|
|
231
|
+
// next argv token (--key value). Returns null when neither is present.
|
|
232
|
+
function takeValue(args, i, inlineValue) {
|
|
233
|
+
if (inlineValue !== null)
|
|
234
|
+
return inlineValue;
|
|
235
|
+
const next = args[i + 1];
|
|
236
|
+
return next ?? null;
|
|
237
|
+
}
|
|
238
|
+
//# sourceMappingURL=args.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"args.js","sourceRoot":"","sources":["../../src/cli/args.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import type { MergePrCtx, StartCtx } from './commands.ts';
|
|
3
|
+
export type MainCtx = {
|
|
4
|
+
cwd?: string;
|
|
5
|
+
homeDir?: string;
|
|
6
|
+
env?: Record<string, string | undefined>;
|
|
7
|
+
stdout?: (chunk: string) => void;
|
|
8
|
+
stderr?: (chunk: string) => void;
|
|
9
|
+
authStatus?: StartCtx['authStatus'];
|
|
10
|
+
runPlanner?: StartCtx['runPlanner'];
|
|
11
|
+
runLoop?: StartCtx['runLoop'];
|
|
12
|
+
runMergeFlow?: MergePrCtx['runMergeFlow'];
|
|
13
|
+
};
|
|
14
|
+
export declare function main(argv: ReadonlyArray<string>, ctx?: MainCtx): Promise<number>;
|
|
15
|
+
export declare function isEntrypoint(metaUrl: string, argv1: string | undefined): boolean;
|
package/dist/cli/cli.js
ADDED
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// docs/commands/start.md, docs/commands/merge-pr.md, docs/commands/config.md
|
|
3
|
+
// Single entry. Parses argv, dispatches, exits with the right code.
|
|
4
|
+
import { realpathSync } from 'node:fs';
|
|
5
|
+
import { pathToFileURL } from 'node:url';
|
|
6
|
+
import { parseArgs } from "./args.js";
|
|
7
|
+
import { runConfig, runMergePr, runStart } from "./commands.js";
|
|
8
|
+
export async function main(argv, ctx = {}) {
|
|
9
|
+
const stdout = ctx.stdout ?? ((chunk) => process.stdout.write(chunk));
|
|
10
|
+
const stderr = ctx.stderr ?? ((chunk) => process.stderr.write(chunk));
|
|
11
|
+
const parsed = parseArgs(argv);
|
|
12
|
+
switch (parsed.kind) {
|
|
13
|
+
case 'start':
|
|
14
|
+
return emit(await runStart(parsed, buildStartCtx(ctx)), stderr);
|
|
15
|
+
case 'merge-pr':
|
|
16
|
+
return emit(await runMergePr(parsed, buildMergePrCtx(ctx)), stderr);
|
|
17
|
+
case 'config-set':
|
|
18
|
+
case 'config-unset':
|
|
19
|
+
case 'config-get':
|
|
20
|
+
case 'config-list':
|
|
21
|
+
return emit(await runConfig(parsed, buildConfigCtx(ctx, stdout)), stderr);
|
|
22
|
+
case 'help':
|
|
23
|
+
stdout(`${HELP_TEXT}\n`);
|
|
24
|
+
return 0;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
function buildStartCtx(ctx) {
|
|
28
|
+
const out = {};
|
|
29
|
+
if (ctx.cwd !== undefined)
|
|
30
|
+
out.cwd = ctx.cwd;
|
|
31
|
+
if (ctx.homeDir !== undefined)
|
|
32
|
+
out.homeDir = ctx.homeDir;
|
|
33
|
+
if (ctx.env !== undefined)
|
|
34
|
+
out.env = ctx.env;
|
|
35
|
+
if (ctx.authStatus !== undefined)
|
|
36
|
+
out.authStatus = ctx.authStatus;
|
|
37
|
+
if (ctx.runPlanner !== undefined)
|
|
38
|
+
out.runPlanner = ctx.runPlanner;
|
|
39
|
+
if (ctx.runLoop !== undefined)
|
|
40
|
+
out.runLoop = ctx.runLoop;
|
|
41
|
+
return out;
|
|
42
|
+
}
|
|
43
|
+
function buildMergePrCtx(ctx) {
|
|
44
|
+
const out = {};
|
|
45
|
+
if (ctx.cwd !== undefined)
|
|
46
|
+
out.cwd = ctx.cwd;
|
|
47
|
+
if (ctx.homeDir !== undefined)
|
|
48
|
+
out.homeDir = ctx.homeDir;
|
|
49
|
+
if (ctx.env !== undefined)
|
|
50
|
+
out.env = ctx.env;
|
|
51
|
+
if (ctx.authStatus !== undefined)
|
|
52
|
+
out.authStatus = ctx.authStatus;
|
|
53
|
+
if (ctx.runMergeFlow !== undefined)
|
|
54
|
+
out.runMergeFlow = ctx.runMergeFlow;
|
|
55
|
+
return out;
|
|
56
|
+
}
|
|
57
|
+
function buildConfigCtx(ctx, stdout) {
|
|
58
|
+
const out = { stdout };
|
|
59
|
+
if (ctx.cwd !== undefined)
|
|
60
|
+
out.cwd = ctx.cwd;
|
|
61
|
+
if (ctx.homeDir !== undefined)
|
|
62
|
+
out.homeDir = ctx.homeDir;
|
|
63
|
+
return out;
|
|
64
|
+
}
|
|
65
|
+
function emit(exit, stderr) {
|
|
66
|
+
if (exit.message !== undefined && exit.message !== '')
|
|
67
|
+
stderr(`${exit.message}\n`);
|
|
68
|
+
return exit.code;
|
|
69
|
+
}
|
|
70
|
+
const HELP_TEXT = `aitm — autonomous task orchestrator
|
|
71
|
+
|
|
72
|
+
Usage:
|
|
73
|
+
aitm start "<goal>" [--criteria "..."] [--max-prs N] [--max-sessions N]
|
|
74
|
+
[--no-automerge] [--style <path>] [--model <id>]
|
|
75
|
+
[--concurrency N]
|
|
76
|
+
aitm merge-pr [--pr N] [--no-resume]
|
|
77
|
+
aitm config set <key> <value> [--project]
|
|
78
|
+
aitm config unset <key> [--project]
|
|
79
|
+
aitm config get <key> [--project]
|
|
80
|
+
aitm config list [--project]
|
|
81
|
+
aitm help | --help | -h
|
|
82
|
+
|
|
83
|
+
Exit codes:
|
|
84
|
+
0 success
|
|
85
|
+
1 precondition failure or run blocked
|
|
86
|
+
2 cancelled
|
|
87
|
+
|
|
88
|
+
Docs: docs/commands/start.md, docs/commands/merge-pr.md, docs/commands/config.md`;
|
|
89
|
+
// Entry-point: when invoked as a script (via the `aitm` bin), parse process.argv
|
|
90
|
+
// and propagate the exit code. When imported (e.g. from tests), this is skipped.
|
|
91
|
+
if (isEntrypoint(import.meta.url, process.argv[1])) {
|
|
92
|
+
main(process.argv.slice(2)).then((code) => {
|
|
93
|
+
process.exit(code);
|
|
94
|
+
}, (err) => {
|
|
95
|
+
process.stderr.write(`${err instanceof Error ? err.message : String(err)}\n`);
|
|
96
|
+
process.exit(1);
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
// Exported for unit-test coverage of the symlink case (global installs put a symlink at
|
|
100
|
+
// e.g. ~/.bun/bin/aitm pointing at dist/cli/cli.js — argv[1] and import.meta.url differ
|
|
101
|
+
// until argv[1] is resolved via realpath).
|
|
102
|
+
export function isEntrypoint(metaUrl, argv1) {
|
|
103
|
+
if (argv1 === undefined)
|
|
104
|
+
return false;
|
|
105
|
+
try {
|
|
106
|
+
const real = realpathSync(argv1);
|
|
107
|
+
return metaUrl === pathToFileURL(real).href;
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
return false;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { type AgentConfig } from '../agent-config/agent-config-detector.ts';
|
|
2
|
+
import type { ResolvedConfig } from '../config/schema.ts';
|
|
3
|
+
import { Credentials } from '../credentials/credentials.ts';
|
|
4
|
+
import { GitHubClient } from '../github/github-client.ts';
|
|
5
|
+
import type { WorkLoopResult } from '../loop/work-loop.ts';
|
|
6
|
+
import type { PrGroup, RunState } from '../state/schema.ts';
|
|
7
|
+
import { StateStore } from '../state/state-store.ts';
|
|
8
|
+
import type { ParsedArgs } from './args.ts';
|
|
9
|
+
export type CommandExit = {
|
|
10
|
+
code: 0 | 1 | 2;
|
|
11
|
+
message?: string;
|
|
12
|
+
};
|
|
13
|
+
export type AuthStatusFn = (cwd: string) => Promise<{
|
|
14
|
+
ok: boolean;
|
|
15
|
+
scopes: string[];
|
|
16
|
+
}>;
|
|
17
|
+
export type RunLoopInput = {
|
|
18
|
+
cwd: string;
|
|
19
|
+
resolved: ResolvedConfig;
|
|
20
|
+
credentials: Credentials;
|
|
21
|
+
agentConfig: AgentConfig;
|
|
22
|
+
state: StateStore;
|
|
23
|
+
github: GitHubClient;
|
|
24
|
+
goal: string;
|
|
25
|
+
criteria: string | undefined;
|
|
26
|
+
};
|
|
27
|
+
export type RunMergeFlowInput = {
|
|
28
|
+
cwd: string;
|
|
29
|
+
pr: number;
|
|
30
|
+
resume: boolean;
|
|
31
|
+
resolved: ResolvedConfig;
|
|
32
|
+
credentials: Credentials;
|
|
33
|
+
agentConfig: AgentConfig;
|
|
34
|
+
state: StateStore;
|
|
35
|
+
runState: RunState;
|
|
36
|
+
github: GitHubClient;
|
|
37
|
+
};
|
|
38
|
+
export type RunPlannerInput = {
|
|
39
|
+
cwd: string;
|
|
40
|
+
resolved: ResolvedConfig;
|
|
41
|
+
credentials: Credentials;
|
|
42
|
+
agentConfig: AgentConfig;
|
|
43
|
+
goal: string;
|
|
44
|
+
criteria: string | undefined;
|
|
45
|
+
};
|
|
46
|
+
export type RunPlannerOutcome = {
|
|
47
|
+
kind: 'ok';
|
|
48
|
+
groups: PrGroup[];
|
|
49
|
+
} | {
|
|
50
|
+
kind: 'blocked';
|
|
51
|
+
reason: string;
|
|
52
|
+
};
|
|
53
|
+
export type StartCtx = {
|
|
54
|
+
cwd?: string;
|
|
55
|
+
homeDir?: string;
|
|
56
|
+
env?: Record<string, string | undefined>;
|
|
57
|
+
authStatus?: AuthStatusFn;
|
|
58
|
+
runPlanner?: (input: RunPlannerInput) => Promise<RunPlannerOutcome>;
|
|
59
|
+
runLoop?: (input: RunLoopInput) => Promise<WorkLoopResult>;
|
|
60
|
+
};
|
|
61
|
+
export type MergePrGithub = Pick<GitHubClient, 'currentBranch' | 'getPrForBranch'>;
|
|
62
|
+
export type MergePrCtx = {
|
|
63
|
+
cwd?: string;
|
|
64
|
+
homeDir?: string;
|
|
65
|
+
env?: Record<string, string | undefined>;
|
|
66
|
+
authStatus?: AuthStatusFn;
|
|
67
|
+
runMergeFlow?: (input: RunMergeFlowInput) => Promise<WorkLoopResult>;
|
|
68
|
+
github?: GitHubClient;
|
|
69
|
+
};
|
|
70
|
+
export type ConfigCtx = {
|
|
71
|
+
cwd?: string;
|
|
72
|
+
homeDir?: string;
|
|
73
|
+
stdout?: (chunk: string) => void;
|
|
74
|
+
};
|
|
75
|
+
export declare function runStart(args: Extract<ParsedArgs, {
|
|
76
|
+
kind: 'start';
|
|
77
|
+
}>, ctx?: StartCtx): Promise<CommandExit>;
|
|
78
|
+
export declare function runMergePr(args: Extract<ParsedArgs, {
|
|
79
|
+
kind: 'merge-pr';
|
|
80
|
+
}>, ctx?: MergePrCtx): Promise<CommandExit>;
|
|
81
|
+
export declare function runConfig(args: Extract<ParsedArgs, {
|
|
82
|
+
kind: `config-${string}`;
|
|
83
|
+
}>, ctx?: ConfigCtx): Promise<CommandExit>;
|