@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.
Files changed (126) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +30 -0
  3. package/dist/agent-config/agent-config-detector.d.ts +15 -0
  4. package/dist/agent-config/agent-config-detector.js +56 -0
  5. package/dist/agent-config/agent-config-detector.js.map +1 -0
  6. package/dist/cli/args.d.ts +37 -0
  7. package/dist/cli/args.js +238 -0
  8. package/dist/cli/args.js.map +1 -0
  9. package/dist/cli/cli.d.ts +15 -0
  10. package/dist/cli/cli.js +113 -0
  11. package/dist/cli/cli.js.map +1 -0
  12. package/dist/cli/commands.d.ts +83 -0
  13. package/dist/cli/commands.js +521 -0
  14. package/dist/cli/commands.js.map +1 -0
  15. package/dist/compaction/compactor.d.ts +20 -0
  16. package/dist/compaction/compactor.js +75 -0
  17. package/dist/compaction/compactor.js.map +1 -0
  18. package/dist/config/config-loader.d.ts +25 -0
  19. package/dist/config/config-loader.js +275 -0
  20. package/dist/config/config-loader.js.map +1 -0
  21. package/dist/config/config-writer.d.ts +14 -0
  22. package/dist/config/config-writer.js +178 -0
  23. package/dist/config/config-writer.js.map +1 -0
  24. package/dist/config/schema.d.ts +85 -0
  25. package/dist/config/schema.js +38 -0
  26. package/dist/config/schema.js.map +1 -0
  27. package/dist/credentials/credentials.d.ts +15 -0
  28. package/dist/credentials/credentials.js +58 -0
  29. package/dist/credentials/credentials.js.map +1 -0
  30. package/dist/credentials/defaults.d.ts +2 -0
  31. package/dist/credentials/defaults.js +21 -0
  32. package/dist/credentials/defaults.js.map +1 -0
  33. package/dist/fs/atomic-write.d.ts +1 -0
  34. package/dist/fs/atomic-write.js +27 -0
  35. package/dist/fs/atomic-write.js.map +1 -0
  36. package/dist/github/errors.d.ts +18 -0
  37. package/dist/github/errors.js +20 -0
  38. package/dist/github/errors.js.map +1 -0
  39. package/dist/github/github-client.d.ts +47 -0
  40. package/dist/github/github-client.js +417 -0
  41. package/dist/github/github-client.js.map +1 -0
  42. package/dist/github/schema.d.ts +44 -0
  43. package/dist/github/schema.js +23 -0
  44. package/dist/github/schema.js.map +1 -0
  45. package/dist/index.d.ts +26 -0
  46. package/dist/index.js +22 -0
  47. package/dist/index.js.map +1 -0
  48. package/dist/logger/logger.d.ts +36 -0
  49. package/dist/logger/logger.js +123 -0
  50. package/dist/logger/logger.js.map +1 -0
  51. package/dist/loop/run-loop-adapter.d.ts +46 -0
  52. package/dist/loop/run-loop-adapter.js +270 -0
  53. package/dist/loop/run-loop-adapter.js.map +1 -0
  54. package/dist/loop/take-over-flow.d.ts +57 -0
  55. package/dist/loop/take-over-flow.js +183 -0
  56. package/dist/loop/take-over-flow.js.map +1 -0
  57. package/dist/loop/work-loop.d.ts +95 -0
  58. package/dist/loop/work-loop.js +211 -0
  59. package/dist/loop/work-loop.js.map +1 -0
  60. package/dist/mcp/mcp-client.d.ts +27 -0
  61. package/dist/mcp/mcp-client.js +123 -0
  62. package/dist/mcp/mcp-client.js.map +1 -0
  63. package/dist/mcp/schema.d.ts +53 -0
  64. package/dist/mcp/schema.js +39 -0
  65. package/dist/mcp/schema.js.map +1 -0
  66. package/dist/openrouter/client.d.ts +28 -0
  67. package/dist/openrouter/client.js +40 -0
  68. package/dist/openrouter/client.js.map +1 -0
  69. package/dist/openrouter/model-limits.d.ts +21 -0
  70. package/dist/openrouter/model-limits.js +39 -0
  71. package/dist/openrouter/model-limits.js.map +1 -0
  72. package/dist/openrouter/server-tools.d.ts +35 -0
  73. package/dist/openrouter/server-tools.js +25 -0
  74. package/dist/openrouter/server-tools.js.map +1 -0
  75. package/dist/orchestrator/orchestrator.d.ts +60 -0
  76. package/dist/orchestrator/orchestrator.js +180 -0
  77. package/dist/orchestrator/orchestrator.js.map +1 -0
  78. package/dist/orchestrator/subagent-tools.d.ts +44 -0
  79. package/dist/orchestrator/subagent-tools.js +133 -0
  80. package/dist/orchestrator/subagent-tools.js.map +1 -0
  81. package/dist/orchestrator/system-prompts.d.ts +4 -0
  82. package/dist/orchestrator/system-prompts.js +78 -0
  83. package/dist/orchestrator/system-prompts.js.map +1 -0
  84. package/dist/plan/plan-graph.d.ts +11 -0
  85. package/dist/plan/plan-graph.js +69 -0
  86. package/dist/plan/plan-graph.js.map +1 -0
  87. package/dist/plan/schema.d.ts +30 -0
  88. package/dist/plan/schema.js +24 -0
  89. package/dist/plan/schema.js.map +1 -0
  90. package/dist/state/schema.d.ts +88 -0
  91. package/dist/state/schema.js +53 -0
  92. package/dist/state/schema.js.map +1 -0
  93. package/dist/state/state-store.d.ts +16 -0
  94. package/dist/state/state-store.js +129 -0
  95. package/dist/state/state-store.js.map +1 -0
  96. package/dist/subagents/factory.d.ts +8 -0
  97. package/dist/subagents/factory.js +10 -0
  98. package/dist/subagents/factory.js.map +1 -0
  99. package/dist/subagents/planner.d.ts +31 -0
  100. package/dist/subagents/planner.js +83 -0
  101. package/dist/subagents/planner.js.map +1 -0
  102. package/dist/subagents/reviewer.d.ts +60 -0
  103. package/dist/subagents/reviewer.js +159 -0
  104. package/dist/subagents/reviewer.js.map +1 -0
  105. package/dist/subagents/worker.d.ts +71 -0
  106. package/dist/subagents/worker.js +180 -0
  107. package/dist/subagents/worker.js.map +1 -0
  108. package/dist/testing/temp-repo.d.ts +7 -0
  109. package/dist/testing/temp-repo.js +21 -0
  110. package/dist/testing/temp-repo.js.map +1 -0
  111. package/dist/tools/datetime.d.ts +12 -0
  112. package/dist/tools/datetime.js +42 -0
  113. package/dist/tools/datetime.js.map +1 -0
  114. package/dist/tools/fetch-html.d.ts +32 -0
  115. package/dist/tools/fetch-html.js +139 -0
  116. package/dist/tools/fetch-html.js.map +1 -0
  117. package/dist/tools/github-thread-tool.d.ts +10 -0
  118. package/dist/tools/github-thread-tool.js +36 -0
  119. package/dist/tools/github-thread-tool.js.map +1 -0
  120. package/dist/tools/web-fetch.d.ts +31 -0
  121. package/dist/tools/web-fetch.js +223 -0
  122. package/dist/tools/web-fetch.js.map +1 -0
  123. package/dist/workspace/worktree-pool.d.ts +21 -0
  124. package/dist/workspace/worktree-pool.js +104 -0
  125. package/dist/workspace/worktree-pool.js.map +1 -0
  126. package/package.json +50 -0
@@ -0,0 +1,25 @@
1
+ import { type McpServers } from '../mcp/schema.ts';
2
+ import { type CliOverrides, type ConfigFile, type ResolvedConfig } from './schema.ts';
3
+ type WarnFn = (msg: string) => void;
4
+ export type ConfigLoaderOptions = {
5
+ warn?: WarnFn;
6
+ };
7
+ export declare class ConfigLoader {
8
+ private readonly cwd;
9
+ private readonly homeDir;
10
+ private readonly env;
11
+ private readonly warn;
12
+ constructor(cwd: string, homeDir: string, env: Record<string, string | undefined>, options?: ConfigLoaderOptions);
13
+ resolve(cliOverrides: CliOverrides): Promise<ResolvedConfig>;
14
+ readGlobal(): Promise<ConfigFile | null>;
15
+ readProject(): Promise<ConfigFile | null>;
16
+ readClaudeProjectMcp(): Promise<McpServers | null>;
17
+ readClaudeUserMcp(): Promise<McpServers | null>;
18
+ writeSnapshot(resolved: ResolvedConfig, stateDir: string): Promise<void>;
19
+ private readMcpEnvelope;
20
+ private resolveMcpServers;
21
+ private readConfigFile;
22
+ private resolveApiKey;
23
+ private resolveModels;
24
+ }
25
+ export {};
@@ -0,0 +1,275 @@
1
+ // docs/config.md §"Resolution order", docs/auth.md §"LLM provider"
2
+ // Only module allowed to read ~/.aitm.json and .ai-task-master/config.json.
3
+ // Merge order: defaults < global < project < env < CLI flags. Frozen snapshot written by writeSnapshot().
4
+ import { readFile } from 'node:fs/promises';
5
+ import { join } from 'node:path';
6
+ import { ZodError, z } from 'zod';
7
+ import { DEFAULT_MODELS } from "../credentials/defaults.js";
8
+ import { atomicWrite } from "../fs/atomic-write.js";
9
+ import { McpServersSchema } from "../mcp/schema.js";
10
+ import { ConfigFileSchema, } from "./schema.js";
11
+ const GLOBAL_FILE = '.aitm.json';
12
+ const PROJECT_DIR = '.ai-task-master';
13
+ const PROJECT_FILE = 'config.json';
14
+ const SNAPSHOT_FILE = 'config.snapshot.json';
15
+ // Claude Code's standard MCP config files. Discovering these lets users plug aitm into
16
+ // the same MCP servers their Claude Code session already uses, without re-declaring them.
17
+ // Refs: https://code.claude.com/docs/en/mcp ("Project scope" = .mcp.json in project root;
18
+ // "User scope" = ~/.claude.json with an mcpServers key).
19
+ const CLAUDE_PROJECT_MCP_FILE = '.mcp.json';
20
+ const CLAUDE_USER_FILE = '.claude.json';
21
+ const KNOWN_KEYS = new Set([
22
+ 'openrouterApiKey',
23
+ 'models',
24
+ 'maxPrs',
25
+ 'maxSessions',
26
+ 'autoMerge',
27
+ 'mergeMethod',
28
+ 'stylePath',
29
+ 'logLevel',
30
+ 'concurrency',
31
+ 'mcpServers',
32
+ ]);
33
+ const DEFAULTS = {
34
+ maxPrs: 5,
35
+ maxSessions: null,
36
+ autoMerge: true,
37
+ mergeMethod: 'squash',
38
+ stylePath: null,
39
+ logLevel: 'info',
40
+ concurrency: 1,
41
+ };
42
+ export class ConfigLoader {
43
+ cwd;
44
+ homeDir;
45
+ env;
46
+ warn;
47
+ constructor(cwd, homeDir, env, options) {
48
+ this.cwd = cwd;
49
+ this.homeDir = homeDir;
50
+ this.env = env;
51
+ this.warn = options?.warn ?? ((msg) => process.stderr.write(`${msg}\n`));
52
+ }
53
+ async resolve(cliOverrides) {
54
+ const global = await this.readGlobal();
55
+ const project = await this.readProject();
56
+ const claudeUser = await this.readClaudeUserMcp();
57
+ const claudeProject = await this.readClaudeProjectMcp();
58
+ const { apiKey, apiKeySource } = this.resolveApiKey(global, project);
59
+ if (apiKey === undefined || apiKeySource === undefined) {
60
+ throw new Error('No OpenRouter API key found. Set OPENROUTER_API_KEY env, or add ' +
61
+ '"openrouterApiKey" to ~/.aitm.json or ./.ai-task-master/config.json.');
62
+ }
63
+ const { mcpServers, mcpServerSources } = this.resolveMcpServers({
64
+ aitmGlobal: global?.mcpServers,
65
+ aitmProject: project?.mcpServers,
66
+ claudeUser,
67
+ claudeProject,
68
+ });
69
+ return {
70
+ openrouterApiKey: apiKey,
71
+ apiKeySource,
72
+ models: this.resolveModels(global, project, cliOverrides),
73
+ maxPrs: pick(cliOverrides.maxPrs, project?.maxPrs, global?.maxPrs, DEFAULTS.maxPrs),
74
+ maxSessions: pickNullable(cliOverrides.maxSessions, project?.maxSessions, global?.maxSessions, DEFAULTS.maxSessions),
75
+ autoMerge: pick(cliOverrides.autoMerge, project?.autoMerge, global?.autoMerge, DEFAULTS.autoMerge),
76
+ mergeMethod: pick(cliOverrides.mergeMethod, project?.mergeMethod, global?.mergeMethod, DEFAULTS.mergeMethod),
77
+ stylePath: pickNullable(cliOverrides.stylePath, project?.stylePath, global?.stylePath, DEFAULTS.stylePath),
78
+ // logLevel is not exposed via CliOverrides — project/global only.
79
+ logLevel: pick(undefined, project?.logLevel, global?.logLevel, DEFAULTS.logLevel),
80
+ concurrency: pick(cliOverrides.concurrency, project?.concurrency, global?.concurrency, DEFAULTS.concurrency),
81
+ mcpServers,
82
+ mcpServerSources,
83
+ };
84
+ }
85
+ async readGlobal() {
86
+ return this.readConfigFile(join(this.homeDir, GLOBAL_FILE));
87
+ }
88
+ async readProject() {
89
+ return this.readConfigFile(join(this.cwd, PROJECT_DIR, PROJECT_FILE));
90
+ }
91
+ // Read Claude Code's project-scoped MCP file (./.mcp.json). Schema is permissive:
92
+ // we only extract `mcpServers`, ignore any other keys Claude Code may add.
93
+ async readClaudeProjectMcp() {
94
+ return this.readMcpEnvelope(join(this.cwd, CLAUDE_PROJECT_MCP_FILE));
95
+ }
96
+ // Read Claude Code's user-scoped config (~/.claude.json) and extract the `mcpServers`
97
+ // block, if any. ~/.claude.json holds many unrelated keys (auth tokens, history); we
98
+ // intentionally read it but only consume `mcpServers`.
99
+ async readClaudeUserMcp() {
100
+ return this.readMcpEnvelope(join(this.homeDir, CLAUDE_USER_FILE));
101
+ }
102
+ // Frozen run snapshot. API key value is replaced by its source label so the
103
+ // file is safe to inspect; only the resolution source is recorded.
104
+ async writeSnapshot(resolved, stateDir) {
105
+ const redacted = {
106
+ ...resolved,
107
+ openrouterApiKey: `<from ${resolved.apiKeySource}>`,
108
+ };
109
+ const path = join(stateDir, SNAPSHOT_FILE);
110
+ await atomicWrite(path, `${JSON.stringify(redacted, null, 2)}\n`);
111
+ }
112
+ // Reads any JSON file whose only field we care about is `mcpServers` (Claude Code's
113
+ // .mcp.json or the much larger ~/.claude.json). Missing file → null. Malformed JSON
114
+ // is a hard error — we don't want to silently ignore a corrupted user file.
115
+ async readMcpEnvelope(path) {
116
+ let raw;
117
+ try {
118
+ raw = await readFile(path, 'utf8');
119
+ }
120
+ catch (err) {
121
+ if (isNotFound(err))
122
+ return null;
123
+ throw err;
124
+ }
125
+ let parsed;
126
+ try {
127
+ parsed = JSON.parse(raw);
128
+ }
129
+ catch (err) {
130
+ const msg = err instanceof Error ? err.message : String(err);
131
+ throw new Error(`${path}: invalid JSON — ${msg}`);
132
+ }
133
+ const envelope = McpEnvelopeSchema.safeParse(parsed);
134
+ if (!envelope.success) {
135
+ throw new Error(`${path}: ${formatZodError(envelope.error)}`);
136
+ }
137
+ return envelope.data.mcpServers ?? null;
138
+ }
139
+ resolveMcpServers(sources) {
140
+ // Precedence, lowest → highest:
141
+ // 1. ~/.claude.json (user-scoped Claude Code config)
142
+ // 2. ~/.aitm.json (user-scoped aitm config)
143
+ // 3. ./.mcp.json (project-scoped Claude Code config, checked into git)
144
+ // 4. ./.ai-task-master/config.json (project-scoped aitm config — final word)
145
+ // Same name in two places: higher precedence wins; the lower is shadowed with a warn.
146
+ const layers = [
147
+ ['claude-user', sources.claudeUser],
148
+ ['aitm-global', sources.aitmGlobal],
149
+ ['claude-mcp-project', sources.claudeProject],
150
+ ['aitm-project', sources.aitmProject],
151
+ ];
152
+ const merged = {};
153
+ const sourceMap = {};
154
+ for (const [label, servers] of layers) {
155
+ if (!servers)
156
+ continue;
157
+ for (const [name, server] of Object.entries(servers)) {
158
+ if (name in merged) {
159
+ this.warn(`mcp server "${name}" from ${label} shadows entry from ${sourceMap[name]}`);
160
+ }
161
+ merged[name] = server;
162
+ sourceMap[name] = label;
163
+ }
164
+ }
165
+ return { mcpServers: merged, mcpServerSources: sourceMap };
166
+ }
167
+ async readConfigFile(path) {
168
+ let raw;
169
+ try {
170
+ raw = await readFile(path, 'utf8');
171
+ }
172
+ catch (err) {
173
+ if (isNotFound(err))
174
+ return null;
175
+ throw err;
176
+ }
177
+ let parsed;
178
+ try {
179
+ parsed = JSON.parse(raw);
180
+ }
181
+ catch (err) {
182
+ const msg = err instanceof Error ? err.message : String(err);
183
+ throw new Error(`${path}: invalid JSON — ${msg}`);
184
+ }
185
+ let validated;
186
+ try {
187
+ validated = ConfigFileSchema.parse(parsed);
188
+ }
189
+ catch (err) {
190
+ if (err instanceof ZodError) {
191
+ throw new Error(`${path}: ${formatZodError(err)}`);
192
+ }
193
+ throw err;
194
+ }
195
+ for (const k of Object.keys(validated)) {
196
+ if (!KNOWN_KEYS.has(k)) {
197
+ this.warn(`${path}: unknown config key "${k}" — ignored`);
198
+ }
199
+ }
200
+ return validated;
201
+ }
202
+ resolveApiKey(global, project) {
203
+ if (project?.openrouterApiKey) {
204
+ return { apiKey: project.openrouterApiKey, apiKeySource: 'project' };
205
+ }
206
+ if (global?.openrouterApiKey) {
207
+ return { apiKey: global.openrouterApiKey, apiKeySource: 'global' };
208
+ }
209
+ const envKey = this.env.OPENROUTER_API_KEY;
210
+ if (envKey) {
211
+ return { apiKey: envKey, apiKeySource: 'env' };
212
+ }
213
+ return { apiKey: undefined, apiKeySource: undefined };
214
+ }
215
+ resolveModels(global, project, cliOverrides) {
216
+ const merged = {
217
+ generic: DEFAULT_MODELS.generic,
218
+ smart: DEFAULT_MODELS.smart,
219
+ coding: DEFAULT_MODELS.coding,
220
+ fast: DEFAULT_MODELS.fast,
221
+ };
222
+ for (const src of [global?.models, project?.models]) {
223
+ if (!src)
224
+ continue;
225
+ if (src.generic)
226
+ merged.generic = src.generic;
227
+ if (src.smart)
228
+ merged.smart = src.smart;
229
+ if (src.coding)
230
+ merged.coding = src.coding;
231
+ if (src.fast)
232
+ merged.fast = src.fast;
233
+ }
234
+ // --model pins the `generic` tier — the fallback every other capability
235
+ // inherits when not explicitly set. See docs/config.md §"Per-role models".
236
+ if (cliOverrides.model)
237
+ merged.generic = cliOverrides.model;
238
+ return merged;
239
+ }
240
+ }
241
+ function pick(cli, project, global, fallback) {
242
+ if (cli !== undefined)
243
+ return cli;
244
+ if (project !== undefined)
245
+ return project;
246
+ if (global !== undefined)
247
+ return global;
248
+ return fallback;
249
+ }
250
+ function pickNullable(cli, project, global, fallback) {
251
+ if (cli !== undefined)
252
+ return cli;
253
+ if (project !== undefined)
254
+ return project;
255
+ if (global !== undefined)
256
+ return global;
257
+ return fallback;
258
+ }
259
+ function isNotFound(err) {
260
+ return (typeof err === 'object' &&
261
+ err !== null &&
262
+ 'code' in err &&
263
+ err.code === 'ENOENT');
264
+ }
265
+ function formatZodError(err) {
266
+ return err.issues.map((i) => `${i.path.join('.') || '<root>'}: ${i.message}`).join('; ');
267
+ }
268
+ // Permissive envelope for Claude Code config files: we only extract `mcpServers` and
269
+ // ignore every other key (~/.claude.json especially has many auth/history fields).
270
+ const McpEnvelopeSchema = z
271
+ .object({
272
+ mcpServers: McpServersSchema.optional(),
273
+ })
274
+ .passthrough();
275
+ //# sourceMappingURL=config-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-loader.js","sourceRoot":"","sources":["../../src/config/config-loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { type ConfigFile } from './schema.ts';
2
+ export type ConfigScope = 'global' | 'project';
3
+ export declare class ConfigWriter {
4
+ private readonly cwd;
5
+ private readonly homeDir;
6
+ constructor(cwd: string, homeDir: string);
7
+ set(scope: ConfigScope, key: string, value: unknown): Promise<ConfigFile>;
8
+ unset(scope: ConfigScope, key: string): Promise<ConfigFile>;
9
+ get(scope: ConfigScope, key: string): Promise<unknown>;
10
+ list(scope: ConfigScope): Promise<ConfigFile>;
11
+ private filePath;
12
+ private readRaw;
13
+ private validateAndPersist;
14
+ }
@@ -0,0 +1,178 @@
1
+ // docs/commands/config.md, docs/config.md
2
+ // Mutates ~/.aitm.json (or, with --project, ./.ai-task-master/config.json) for `aitm config set/unset`.
3
+ // Atomic write: temp file + rename. Refuses to write unknown top-level keys.
4
+ import { mkdir, readFile } from 'node:fs/promises';
5
+ import { dirname, join } from 'node:path';
6
+ import { ZodError } from 'zod';
7
+ import { atomicWrite } from "../fs/atomic-write.js";
8
+ import { ConfigFileSchema } from "./schema.js";
9
+ const GLOBAL_FILE = '.aitm.json';
10
+ const PROJECT_DIR = '.ai-task-master';
11
+ const PROJECT_FILE = 'config.json';
12
+ const KNOWN_KEYS = new Set([
13
+ 'openrouterApiKey',
14
+ 'models',
15
+ 'maxPrs',
16
+ 'maxSessions',
17
+ 'autoMerge',
18
+ 'mergeMethod',
19
+ 'stylePath',
20
+ 'logLevel',
21
+ 'concurrency',
22
+ 'mcpServers',
23
+ ]);
24
+ export class ConfigWriter {
25
+ cwd;
26
+ homeDir;
27
+ constructor(cwd, homeDir) {
28
+ this.cwd = cwd;
29
+ this.homeDir = homeDir;
30
+ }
31
+ async set(scope, key, value) {
32
+ const parts = splitKey(key);
33
+ const top = parts[0];
34
+ if (!KNOWN_KEYS.has(top)) {
35
+ throw new Error(unknownKeyMessage(top));
36
+ }
37
+ const file = await this.readRaw(scope);
38
+ setDottedKey(file, parts, parseValue(value));
39
+ return this.validateAndPersist(scope, file);
40
+ }
41
+ async unset(scope, key) {
42
+ const parts = splitKey(key);
43
+ const file = await this.readRaw(scope);
44
+ unsetDottedKey(file, parts);
45
+ return this.validateAndPersist(scope, file);
46
+ }
47
+ async get(scope, key) {
48
+ const parts = splitKey(key);
49
+ const file = await this.readRaw(scope);
50
+ return getDottedKey(file, parts);
51
+ }
52
+ async list(scope) {
53
+ const file = await this.readRaw(scope);
54
+ return validateSchema(file, this.filePath(scope));
55
+ }
56
+ filePath(scope) {
57
+ return scope === 'global'
58
+ ? join(this.homeDir, GLOBAL_FILE)
59
+ : join(this.cwd, PROJECT_DIR, PROJECT_FILE);
60
+ }
61
+ async readRaw(scope) {
62
+ const path = this.filePath(scope);
63
+ let raw;
64
+ try {
65
+ raw = await readFile(path, 'utf8');
66
+ }
67
+ catch (err) {
68
+ if (isNotFound(err))
69
+ return {};
70
+ throw err;
71
+ }
72
+ let parsed;
73
+ try {
74
+ parsed = JSON.parse(raw);
75
+ }
76
+ catch (err) {
77
+ const msg = err instanceof Error ? err.message : String(err);
78
+ throw new Error(`${path}: invalid JSON — ${msg}`);
79
+ }
80
+ if (parsed === null || typeof parsed !== 'object' || Array.isArray(parsed)) {
81
+ throw new Error(`${path}: expected a JSON object at the top level`);
82
+ }
83
+ return parsed;
84
+ }
85
+ async validateAndPersist(scope, file) {
86
+ const path = this.filePath(scope);
87
+ const validated = validateSchema(file, path);
88
+ if (scope === 'project') {
89
+ await mkdir(dirname(path), { recursive: true });
90
+ }
91
+ await atomicWrite(path, `${JSON.stringify(validated, null, 2)}\n`);
92
+ return validated;
93
+ }
94
+ }
95
+ function validateSchema(file, path) {
96
+ try {
97
+ return ConfigFileSchema.parse(file);
98
+ }
99
+ catch (err) {
100
+ if (err instanceof ZodError) {
101
+ throw new Error(`${path}: ${formatZodError(err)}`);
102
+ }
103
+ throw err;
104
+ }
105
+ }
106
+ function parseValue(v) {
107
+ if (typeof v !== 'string')
108
+ return v;
109
+ try {
110
+ return JSON.parse(v);
111
+ }
112
+ catch {
113
+ // Bare strings ("squash", "sk-or-...") aren't valid JSON; treat them as literal strings.
114
+ return v;
115
+ }
116
+ }
117
+ function splitKey(key) {
118
+ const parts = key.split('.');
119
+ if (parts.length === 0 || parts.some((p) => p === '')) {
120
+ throw new Error(`Invalid config key: "${key}"`);
121
+ }
122
+ const [first, ...rest] = parts;
123
+ if (first === undefined) {
124
+ throw new Error(`Invalid config key: "${key}"`);
125
+ }
126
+ return [first, ...rest];
127
+ }
128
+ function setDottedKey(obj, parts, value) {
129
+ const [first, ...rest] = parts;
130
+ if (first === undefined)
131
+ return;
132
+ if (rest.length === 0) {
133
+ obj[first] = value;
134
+ return;
135
+ }
136
+ const existing = obj[first];
137
+ const sub = existing !== null && typeof existing === 'object' && !Array.isArray(existing)
138
+ ? existing
139
+ : {};
140
+ obj[first] = sub;
141
+ setDottedKey(sub, rest, value);
142
+ }
143
+ function unsetDottedKey(obj, parts) {
144
+ const [first, ...rest] = parts;
145
+ if (first === undefined)
146
+ return;
147
+ if (rest.length === 0) {
148
+ delete obj[first];
149
+ return;
150
+ }
151
+ const next = obj[first];
152
+ if (next === null || typeof next !== 'object' || Array.isArray(next))
153
+ return;
154
+ unsetDottedKey(next, rest);
155
+ }
156
+ function getDottedKey(obj, parts) {
157
+ let cur = obj;
158
+ for (const p of parts) {
159
+ if (cur === null || typeof cur !== 'object' || Array.isArray(cur))
160
+ return undefined;
161
+ cur = cur[p];
162
+ }
163
+ return cur;
164
+ }
165
+ function unknownKeyMessage(top) {
166
+ const allowed = [...KNOWN_KEYS].sort().join(', ');
167
+ return `Unknown config key "${top}". Allowed top-level keys: ${allowed}`;
168
+ }
169
+ function isNotFound(err) {
170
+ return (typeof err === 'object' &&
171
+ err !== null &&
172
+ 'code' in err &&
173
+ err.code === 'ENOENT');
174
+ }
175
+ function formatZodError(err) {
176
+ return err.issues.map((i) => `${i.path.join('.') || '<root>'}: ${i.message}`).join('; ');
177
+ }
178
+ //# sourceMappingURL=config-writer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-writer.js","sourceRoot":"","sources":["../../src/config/config-writer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,85 @@
1
+ import { z } from 'zod';
2
+ export declare const CapabilityModelsSchema: z.ZodObject<{
3
+ generic: z.ZodOptional<z.ZodString>;
4
+ smart: z.ZodOptional<z.ZodString>;
5
+ coding: z.ZodOptional<z.ZodString>;
6
+ fast: z.ZodOptional<z.ZodString>;
7
+ }, z.core.$loose>;
8
+ export type CapabilityModels = z.infer<typeof CapabilityModelsSchema>;
9
+ export type Capability = 'generic' | 'smart' | 'coding' | 'fast';
10
+ export declare const LogLevelSchema: z.ZodEnum<{
11
+ debug: "debug";
12
+ info: "info";
13
+ warn: "warn";
14
+ error: "error";
15
+ }>;
16
+ export declare const MergeMethodSchema: z.ZodEnum<{
17
+ squash: "squash";
18
+ merge: "merge";
19
+ rebase: "rebase";
20
+ }>;
21
+ export declare const ConfigFileSchema: z.ZodObject<{
22
+ openrouterApiKey: z.ZodOptional<z.ZodString>;
23
+ models: z.ZodOptional<z.ZodObject<{
24
+ generic: z.ZodOptional<z.ZodString>;
25
+ smart: z.ZodOptional<z.ZodString>;
26
+ coding: z.ZodOptional<z.ZodString>;
27
+ fast: z.ZodOptional<z.ZodString>;
28
+ }, z.core.$loose>>;
29
+ maxPrs: z.ZodOptional<z.ZodNumber>;
30
+ maxSessions: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
31
+ autoMerge: z.ZodOptional<z.ZodBoolean>;
32
+ mergeMethod: z.ZodOptional<z.ZodEnum<{
33
+ squash: "squash";
34
+ merge: "merge";
35
+ rebase: "rebase";
36
+ }>>;
37
+ stylePath: z.ZodOptional<z.ZodNullable<z.ZodString>>;
38
+ logLevel: z.ZodOptional<z.ZodEnum<{
39
+ debug: "debug";
40
+ info: "info";
41
+ warn: "warn";
42
+ error: "error";
43
+ }>>;
44
+ concurrency: z.ZodOptional<z.ZodNumber>;
45
+ mcpServers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodObject<{
46
+ type: z.ZodOptional<z.ZodLiteral<"stdio">>;
47
+ command: z.ZodString;
48
+ args: z.ZodOptional<z.ZodArray<z.ZodString>>;
49
+ env: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
50
+ cwd: z.ZodOptional<z.ZodString>;
51
+ }, z.core.$strip>, z.ZodObject<{
52
+ type: z.ZodLiteral<"sse">;
53
+ url: z.ZodString;
54
+ headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
55
+ }, z.core.$strip>, z.ZodObject<{
56
+ type: z.ZodLiteral<"http">;
57
+ url: z.ZodString;
58
+ headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
59
+ }, z.core.$strip>]>>>;
60
+ }, z.core.$loose>;
61
+ export type ConfigFile = z.infer<typeof ConfigFileSchema>;
62
+ export type CliOverrides = {
63
+ maxPrs?: number;
64
+ maxSessions?: number | null;
65
+ autoMerge?: boolean;
66
+ mergeMethod?: 'squash' | 'merge' | 'rebase';
67
+ stylePath?: string | null;
68
+ model?: string;
69
+ concurrency?: number;
70
+ };
71
+ export type ResolvedConfig = {
72
+ openrouterApiKey: string;
73
+ apiKeySource: 'project' | 'global' | 'env';
74
+ models: Required<Pick<CapabilityModels, 'generic' | 'smart' | 'coding' | 'fast'>>;
75
+ maxPrs: number;
76
+ maxSessions: number | null;
77
+ autoMerge: boolean;
78
+ mergeMethod: 'squash' | 'merge' | 'rebase';
79
+ stylePath: string | null;
80
+ logLevel: 'debug' | 'info' | 'warn' | 'error';
81
+ concurrency: number;
82
+ mcpServers: import('../mcp/schema.ts').McpServers;
83
+ mcpServerSources: Record<string, McpServerSource>;
84
+ };
85
+ export type McpServerSource = 'aitm-global' | 'aitm-project' | 'claude-mcp-project' | 'claude-user';
@@ -0,0 +1,38 @@
1
+ // docs/config.md §Schema, docs/auth.md §LLM provider
2
+ // Models are configured by *capability tier*, not by subagent role. The mapping
3
+ // role → tier lives in src/credentials/credentials.ts.
4
+ // generic — fallback for anything not otherwise specified
5
+ // smart — best reasoning (Planner, Reviewer)
6
+ // coding — code generation / edits (Worker)
7
+ // fast — cheap routing / summarization (Orchestrator, toModelOutput compaction)
8
+ import { z } from 'zod';
9
+ import { McpServersSchema } from "../mcp/schema.js";
10
+ export const CapabilityModelsSchema = z
11
+ .object({
12
+ generic: z.string().optional(),
13
+ smart: z.string().optional(),
14
+ coding: z.string().optional(),
15
+ fast: z.string().optional(),
16
+ })
17
+ .passthrough();
18
+ export const LogLevelSchema = z.enum(['debug', 'info', 'warn', 'error']);
19
+ export const MergeMethodSchema = z.enum(['squash', 'merge', 'rebase']);
20
+ export const ConfigFileSchema = z
21
+ .object({
22
+ openrouterApiKey: z.string().optional(),
23
+ models: CapabilityModelsSchema.optional(),
24
+ maxPrs: z.number().int().positive().optional(),
25
+ maxSessions: z.number().int().positive().nullable().optional(),
26
+ autoMerge: z.boolean().optional(),
27
+ mergeMethod: MergeMethodSchema.optional(),
28
+ stylePath: z.string().nullable().optional(),
29
+ logLevel: LogLevelSchema.optional(),
30
+ // How many PR groups may have a Worker running at the same time. Default 1 = sequential.
31
+ // See src/loop/work-loop.ts and src/workspace/worktree-pool.ts.
32
+ concurrency: z.number().int().positive().optional(),
33
+ // External MCP servers to mount into subagent tool surfaces (client only — aitm is never
34
+ // exposed as an MCP server). See docs/mcp.md and src/mcp/schema.ts.
35
+ mcpServers: McpServersSchema.optional(),
36
+ })
37
+ .passthrough();
38
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAAA,qDAAqD;AACrD,gFAAgF;AAChF,uDAAuD;AACvD,4DAA4D;AAC5D,iDAAiD;AACjD,+CAA+C;AAC/C,qFAAqF;AAErF,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC;KACpC,MAAM,CAAC;IACN,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC5B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC7B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC5B,CAAC;KACD,WAAW,EAAE,CAAC;AAKjB,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AACzE,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;AAEvE,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC;KAC9B,MAAM,CAAC;IACN,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACvC,MAAM,EAAE,sBAAsB,CAAC,QAAQ,EAAE;IACzC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAC9C,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAC9D,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IACjC,WAAW,EAAE,iBAAiB,CAAC,QAAQ,EAAE;IACzC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAC3C,QAAQ,EAAE,cAAc,CAAC,QAAQ,EAAE;IACnC,yFAAyF;IACzF,gEAAgE;IAChE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IACnD,yFAAyF;IACzF,oEAAoE;IACpE,UAAU,EAAE,gBAAgB,CAAC,QAAQ,EAAE;CACxC,CAAC;KACD,WAAW,EAAE,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { LanguageModel } from 'ai';
2
+ import type { Capability, ResolvedConfig } from '../config/schema.ts';
3
+ export type Role = 'planner' | 'worker' | 'reviewer' | 'orchestrator';
4
+ export declare const ROLE_CAPABILITY: Readonly<Record<Role, Capability>>;
5
+ export type ModelHandles = Record<Role, LanguageModel>;
6
+ export declare class Credentials {
7
+ private readonly resolved;
8
+ private providerInstance;
9
+ constructor(resolved: ResolvedConfig);
10
+ handles(): ModelHandles;
11
+ modelFor(role: Role): LanguageModel;
12
+ modelForCapability(capability: Capability): LanguageModel;
13
+ static assertApiKeyPresent(resolved: ResolvedConfig): void;
14
+ private provider;
15
+ }