@rajat-rastogi/maestro 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (175) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +254 -0
  3. package/defaults/agents/documentation.txt +18 -0
  4. package/defaults/agents/implementation.txt +16 -0
  5. package/defaults/agents/quality.txt +19 -0
  6. package/defaults/agents/simplification.txt +19 -0
  7. package/defaults/agents/testing.txt +16 -0
  8. package/defaults/config +46 -0
  9. package/defaults/plan-tips.md +50 -0
  10. package/defaults/prompts/finalize.txt +14 -0
  11. package/defaults/prompts/hint_analysis.txt +38 -0
  12. package/defaults/prompts/plan_create.txt +36 -0
  13. package/defaults/prompts/review_first.txt +37 -0
  14. package/defaults/prompts/review_second.txt +36 -0
  15. package/defaults/prompts/task.txt +23 -0
  16. package/dist/backend/backend.d.ts +29 -0
  17. package/dist/backend/backend.d.ts.map +1 -0
  18. package/dist/backend/backend.js +9 -0
  19. package/dist/backend/backend.js.map +1 -0
  20. package/dist/backend/claude.d.ts +12 -0
  21. package/dist/backend/claude.d.ts.map +1 -0
  22. package/dist/backend/claude.js +155 -0
  23. package/dist/backend/claude.js.map +1 -0
  24. package/dist/backend/copilot.d.ts +11 -0
  25. package/dist/backend/copilot.d.ts.map +1 -0
  26. package/dist/backend/copilot.js +110 -0
  27. package/dist/backend/copilot.js.map +1 -0
  28. package/dist/backend/factory.d.ts +4 -0
  29. package/dist/backend/factory.d.ts.map +1 -0
  30. package/dist/backend/factory.js +13 -0
  31. package/dist/backend/factory.js.map +1 -0
  32. package/dist/config/configserver.d.ts +9 -0
  33. package/dist/config/configserver.d.ts.map +1 -0
  34. package/dist/config/configserver.js +141 -0
  35. package/dist/config/configserver.js.map +1 -0
  36. package/dist/config/dump.d.ts +2 -0
  37. package/dist/config/dump.d.ts.map +1 -0
  38. package/dist/config/dump.js +24 -0
  39. package/dist/config/dump.js.map +1 -0
  40. package/dist/config/loader.d.ts +11 -0
  41. package/dist/config/loader.d.ts.map +1 -0
  42. package/dist/config/loader.js +119 -0
  43. package/dist/config/loader.js.map +1 -0
  44. package/dist/config/prompts.d.ts +19 -0
  45. package/dist/config/prompts.d.ts.map +1 -0
  46. package/dist/config/prompts.js +128 -0
  47. package/dist/config/prompts.js.map +1 -0
  48. package/dist/config/reset.d.ts +3 -0
  49. package/dist/config/reset.d.ts.map +1 -0
  50. package/dist/config/reset.js +23 -0
  51. package/dist/config/reset.js.map +1 -0
  52. package/dist/config/template.d.ts +5 -0
  53. package/dist/config/template.d.ts.map +1 -0
  54. package/dist/config/template.js +11 -0
  55. package/dist/config/template.js.map +1 -0
  56. package/dist/config/types.d.ts +35 -0
  57. package/dist/config/types.d.ts.map +1 -0
  58. package/dist/config/types.js +42 -0
  59. package/dist/config/types.js.map +1 -0
  60. package/dist/config/write.d.ts +5 -0
  61. package/dist/config/write.d.ts.map +1 -0
  62. package/dist/config/write.js +59 -0
  63. package/dist/config/write.js.map +1 -0
  64. package/dist/dashboard/assets/config.html +1012 -0
  65. package/dist/dashboard/assets/dashboard.html +871 -0
  66. package/dist/dashboard/assets/help.html +657 -0
  67. package/dist/dashboard/assets.d.ts +2 -0
  68. package/dist/dashboard/assets.d.ts.map +1 -0
  69. package/dist/dashboard/assets.js +5 -0
  70. package/dist/dashboard/assets.js.map +1 -0
  71. package/dist/dashboard/event-bus.d.ts +11 -0
  72. package/dist/dashboard/event-bus.d.ts.map +1 -0
  73. package/dist/dashboard/event-bus.js +4 -0
  74. package/dist/dashboard/event-bus.js.map +1 -0
  75. package/dist/dashboard/replay-parser.d.ts +6 -0
  76. package/dist/dashboard/replay-parser.d.ts.map +1 -0
  77. package/dist/dashboard/replay-parser.js +56 -0
  78. package/dist/dashboard/replay-parser.js.map +1 -0
  79. package/dist/dashboard/server.d.ts +14 -0
  80. package/dist/dashboard/server.d.ts.map +1 -0
  81. package/dist/dashboard/server.js +178 -0
  82. package/dist/dashboard/server.js.map +1 -0
  83. package/dist/dashboard/watcher.d.ts +17 -0
  84. package/dist/dashboard/watcher.d.ts.map +1 -0
  85. package/dist/dashboard/watcher.js +73 -0
  86. package/dist/dashboard/watcher.js.map +1 -0
  87. package/dist/executor/hints.d.ts +21 -0
  88. package/dist/executor/hints.d.ts.map +1 -0
  89. package/dist/executor/hints.js +102 -0
  90. package/dist/executor/hints.js.map +1 -0
  91. package/dist/executor/task.d.ts +19 -0
  92. package/dist/executor/task.d.ts.map +1 -0
  93. package/dist/executor/task.js +119 -0
  94. package/dist/executor/task.js.map +1 -0
  95. package/dist/executor/validation.d.ts +18 -0
  96. package/dist/executor/validation.d.ts.map +1 -0
  97. package/dist/executor/validation.js +73 -0
  98. package/dist/executor/validation.js.map +1 -0
  99. package/dist/git/branch.d.ts +23 -0
  100. package/dist/git/branch.d.ts.map +1 -0
  101. package/dist/git/branch.js +64 -0
  102. package/dist/git/branch.js.map +1 -0
  103. package/dist/git/commit.d.ts +21 -0
  104. package/dist/git/commit.d.ts.map +1 -0
  105. package/dist/git/commit.js +37 -0
  106. package/dist/git/commit.js.map +1 -0
  107. package/dist/git/diff.d.ts +15 -0
  108. package/dist/git/diff.d.ts.map +1 -0
  109. package/dist/git/diff.js +26 -0
  110. package/dist/git/diff.js.map +1 -0
  111. package/dist/git/git.d.ts +9 -0
  112. package/dist/git/git.d.ts.map +1 -0
  113. package/dist/git/git.js +20 -0
  114. package/dist/git/git.js.map +1 -0
  115. package/dist/git/gitignore.d.ts +2 -0
  116. package/dist/git/gitignore.d.ts.map +1 -0
  117. package/dist/git/gitignore.js +66 -0
  118. package/dist/git/gitignore.js.map +1 -0
  119. package/dist/git/worktree.d.ts +3 -0
  120. package/dist/git/worktree.d.ts.map +1 -0
  121. package/dist/git/worktree.js +17 -0
  122. package/dist/git/worktree.js.map +1 -0
  123. package/dist/main.d.ts +3 -0
  124. package/dist/main.d.ts.map +1 -0
  125. package/dist/main.js +212 -0
  126. package/dist/main.js.map +1 -0
  127. package/dist/orchestrator/orchestrator.d.ts +21 -0
  128. package/dist/orchestrator/orchestrator.d.ts.map +1 -0
  129. package/dist/orchestrator/orchestrator.js +218 -0
  130. package/dist/orchestrator/orchestrator.js.map +1 -0
  131. package/dist/plan/creator.d.ts +27 -0
  132. package/dist/plan/creator.d.ts.map +1 -0
  133. package/dist/plan/creator.js +251 -0
  134. package/dist/plan/creator.js.map +1 -0
  135. package/dist/plan/parser.d.ts +11 -0
  136. package/dist/plan/parser.d.ts.map +1 -0
  137. package/dist/plan/parser.js +151 -0
  138. package/dist/plan/parser.js.map +1 -0
  139. package/dist/plan/types.d.ts +23 -0
  140. package/dist/plan/types.d.ts.map +1 -0
  141. package/dist/plan/types.js +2 -0
  142. package/dist/plan/types.js.map +1 -0
  143. package/dist/plan/updater.d.ts +16 -0
  144. package/dist/plan/updater.d.ts.map +1 -0
  145. package/dist/plan/updater.js +59 -0
  146. package/dist/plan/updater.js.map +1 -0
  147. package/dist/progress/colors.d.ts +9 -0
  148. package/dist/progress/colors.d.ts.map +1 -0
  149. package/dist/progress/colors.js +39 -0
  150. package/dist/progress/colors.js.map +1 -0
  151. package/dist/progress/logger.d.ts +17 -0
  152. package/dist/progress/logger.d.ts.map +1 -0
  153. package/dist/progress/logger.js +101 -0
  154. package/dist/progress/logger.js.map +1 -0
  155. package/dist/progress/notify.d.ts +2 -0
  156. package/dist/progress/notify.d.ts.map +1 -0
  157. package/dist/progress/notify.js +37 -0
  158. package/dist/progress/notify.js.map +1 -0
  159. package/dist/progress/timestamp.d.ts +5 -0
  160. package/dist/progress/timestamp.d.ts.map +1 -0
  161. package/dist/progress/timestamp.js +13 -0
  162. package/dist/progress/timestamp.js.map +1 -0
  163. package/dist/review/agents.d.ts +18 -0
  164. package/dist/review/agents.d.ts.map +1 -0
  165. package/dist/review/agents.js +43 -0
  166. package/dist/review/agents.js.map +1 -0
  167. package/dist/review/pipeline.d.ts +36 -0
  168. package/dist/review/pipeline.d.ts.map +1 -0
  169. package/dist/review/pipeline.js +210 -0
  170. package/dist/review/pipeline.js.map +1 -0
  171. package/dist/sea.d.ts +19 -0
  172. package/dist/sea.d.ts.map +1 -0
  173. package/dist/sea.js +41 -0
  174. package/dist/sea.js.map +1 -0
  175. package/package.json +57 -0
@@ -0,0 +1,119 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ import * as os from 'os';
4
+ import { parse } from 'ini';
5
+ import { EMBEDDED_DEFAULTS } from './types.js';
6
+ export function loadConfig(options = {}) {
7
+ // Resolve config directory: CLI flag > env var > default
8
+ const configDir = options.configDir
9
+ ?? process.env['MAESTRO_CONFIG_DIR']
10
+ ?? path.join(os.homedir(), '.config', 'maestro');
11
+ // Find project-local config
12
+ const projectConfigPath = path.join(process.cwd(), '.maestro', 'config');
13
+ // Load INI layers
14
+ const globalConfig = loadIniFile(path.join(configDir, 'config'));
15
+ const projectConfig = loadIniFile(projectConfigPath);
16
+ // Merge: embedded defaults < global < project-local < CLI overrides
17
+ const merged = mergeConfigs(EMBEDDED_DEFAULTS, globalConfig, projectConfig, options.cliOverrides ?? {});
18
+ // Apply runtime flags
19
+ if (options.noColor !== undefined)
20
+ merged.no_color = options.noColor;
21
+ if (options.debug !== undefined)
22
+ merged.debug = options.debug;
23
+ if (options.port !== undefined)
24
+ merged.port = options.port;
25
+ merged.config_dir = configDir;
26
+ // Apply env vars (lower priority than explicit options but higher than config files)
27
+ if (process.env['MAESTRO_NO_COLOR'] && options.noColor === undefined) {
28
+ merged.no_color = true;
29
+ }
30
+ if (process.env['MAESTRO_DEBUG'] && options.debug === undefined) {
31
+ merged.debug = true;
32
+ }
33
+ return merged;
34
+ }
35
+ // Exported so ConfigServer can read a single layer without loading all layers
36
+ export function loadConfigLayer(filePath) {
37
+ return loadIniFile(filePath);
38
+ }
39
+ function loadIniFile(filePath) {
40
+ if (!fs.existsSync(filePath))
41
+ return {};
42
+ let raw;
43
+ try {
44
+ raw = fs.readFileSync(filePath, 'utf8');
45
+ }
46
+ catch {
47
+ return {};
48
+ }
49
+ // Strip lines that are pure comments (start with #) before parsing
50
+ // ini library handles comments but this ensures commented-out defaults don't bleed through
51
+ const parsed = parse(raw);
52
+ return iniToConfig(parsed);
53
+ }
54
+ function iniToConfig(parsed) {
55
+ const result = {};
56
+ if (typeof parsed['ai_provider'] === 'string') {
57
+ const v = parsed['ai_provider'];
58
+ if (v === 'claude' || v === 'copilot')
59
+ result.ai_provider = v;
60
+ }
61
+ if (typeof parsed['claude_command'] === 'string')
62
+ result.claude_command = parsed['claude_command'];
63
+ if (typeof parsed['claude_args'] === 'string')
64
+ result.claude_args = parsed['claude_args'];
65
+ if (typeof parsed['claude_error_patterns'] === 'string') {
66
+ result.claude_error_patterns = parsed['claude_error_patterns'].split(',').map(s => s.trim()).filter(Boolean);
67
+ }
68
+ if (typeof parsed['copilot_command'] === 'string')
69
+ result.copilot_command = parsed['copilot_command'];
70
+ if (typeof parsed['copilot_args'] === 'string')
71
+ result.copilot_args = parsed['copilot_args'];
72
+ if (typeof parsed['copilot_error_patterns'] === 'string') {
73
+ result.copilot_error_patterns = parsed['copilot_error_patterns'].split(',').map(s => s.trim()).filter(Boolean);
74
+ }
75
+ if (typeof parsed['max_external_iterations'] === 'string')
76
+ result.max_external_iterations = parseInt(parsed['max_external_iterations']);
77
+ if (typeof parsed['iteration_delay_ms'] === 'string')
78
+ result.iteration_delay_ms = parseInt(parsed['iteration_delay_ms']);
79
+ if (typeof parsed['task_retry_count'] === 'string')
80
+ result.task_retry_count = parseInt(parsed['task_retry_count']);
81
+ if (typeof parsed['validation_timeout_ms'] === 'string')
82
+ result.validation_timeout_ms = parseInt(parsed['validation_timeout_ms']);
83
+ if (typeof parsed['finalize_enabled'] === 'string')
84
+ result.finalize_enabled = parsed['finalize_enabled'] === 'true';
85
+ if (typeof parsed['use_worktree'] === 'string')
86
+ result.use_worktree = parsed['use_worktree'] === 'true';
87
+ if (typeof parsed['plans_dir'] === 'string')
88
+ result.plans_dir = parsed['plans_dir'];
89
+ if (typeof parsed['default_branch'] === 'string')
90
+ result.default_branch = parsed['default_branch'];
91
+ if (typeof parsed['vcs_command'] === 'string')
92
+ result.vcs_command = parsed['vcs_command'];
93
+ if (typeof parsed['push_on_complete'] === 'string')
94
+ result.push_on_complete = parsed['push_on_complete'] === 'true';
95
+ if (typeof parsed['watch_dirs'] === 'string') {
96
+ result.watch_dirs = parsed['watch_dirs'].split(',').map(s => s.trim()).filter(Boolean);
97
+ }
98
+ if (typeof parsed['port'] === 'string')
99
+ result.port = parseInt(parsed['port']);
100
+ // Colors
101
+ for (const key of ['color_task', 'color_review', 'color_claude_eval', 'color_warn',
102
+ 'color_error', 'color_signal', 'color_timestamp', 'color_info']) {
103
+ if (typeof parsed[key] === 'string')
104
+ result[key] = parsed[key];
105
+ }
106
+ return result;
107
+ }
108
+ function mergeConfigs(...layers) {
109
+ const result = { ...EMBEDDED_DEFAULTS };
110
+ for (const layer of layers) {
111
+ for (const [key, value] of Object.entries(layer)) {
112
+ if (value !== undefined && value !== null) {
113
+ result[key] = value;
114
+ }
115
+ }
116
+ }
117
+ return result;
118
+ }
119
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { Config } from './types.js';
2
+ export type PromptName = 'task' | 'review_first' | 'review_second' | 'finalize' | 'plan_create' | 'hint_analysis';
3
+ export type AgentName = string;
4
+ /**
5
+ * Load a prompt template from: project-local > global config > embedded defaults.
6
+ */
7
+ export declare function loadPrompt(name: PromptName, config: Config): string;
8
+ /**
9
+ * Load agent instructions from: project-local > global config > embedded defaults.
10
+ * If .maestro/agents/ has ANY .txt files, only those are used (project-local agents replace all).
11
+ */
12
+ export declare function loadAgentInstructions(name: AgentName, config: Config): string;
13
+ /**
14
+ * Return list of available agent names for the current config.
15
+ * If .maestro/agents/ has txt files, only those; otherwise global config agents + embedded defaults.
16
+ */
17
+ export declare function listAgents(config: Config): string[];
18
+ export declare function loadPlanTips(config: Config): string;
19
+ //# sourceMappingURL=prompts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../src/config/prompts.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAMpC,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,cAAc,GAAG,eAAe,GAAG,UAAU,GAAG,aAAa,GAAG,eAAe,CAAC;AAClH,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC;AAE/B;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAenE;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAsB7E;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CA4BnD;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAWnD"}
@@ -0,0 +1,128 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ import * as url from 'url';
4
+ const __dirname = path.dirname(url.fileURLToPath(import.meta.url));
5
+ // defaults/ is two levels up from src/config/
6
+ const DEFAULTS_DIR = path.resolve(__dirname, '..', '..', 'defaults');
7
+ /**
8
+ * Load a prompt template from: project-local > global config > embedded defaults.
9
+ */
10
+ export function loadPrompt(name, config) {
11
+ const candidates = [
12
+ path.join(process.cwd(), '.maestro', 'prompts', `${name}.txt`),
13
+ path.join(config.config_dir, 'prompts', `${name}.txt`),
14
+ path.join(DEFAULTS_DIR, 'prompts', `${name}.txt`),
15
+ ];
16
+ for (const candidate of candidates) {
17
+ const content = tryReadFile(candidate);
18
+ if (content !== null && !isFullyCommented(content)) {
19
+ return content;
20
+ }
21
+ }
22
+ throw new Error(`No prompt template found for '${name}'. Run maestro --dump-defaults to inspect defaults.`);
23
+ }
24
+ /**
25
+ * Load agent instructions from: project-local > global config > embedded defaults.
26
+ * If .maestro/agents/ has ANY .txt files, only those are used (project-local agents replace all).
27
+ */
28
+ export function loadAgentInstructions(name, config) {
29
+ const projectAgentsDir = path.join(process.cwd(), '.maestro', 'agents');
30
+ const useProjectOnly = fs.existsSync(projectAgentsDir) &&
31
+ fs.readdirSync(projectAgentsDir).some(f => f.endsWith('.txt'));
32
+ const candidates = useProjectOnly
33
+ ? [path.join(projectAgentsDir, `${name}.txt`)]
34
+ : [
35
+ path.join(projectAgentsDir, `${name}.txt`),
36
+ path.join(config.config_dir, 'agents', `${name}.txt`),
37
+ path.join(DEFAULTS_DIR, 'agents', `${name}.txt`),
38
+ ];
39
+ for (const candidate of candidates) {
40
+ const content = tryReadFile(candidate);
41
+ if (content !== null) {
42
+ const stripped = stripMetaComment(content);
43
+ if (!isFullyCommented(stripped))
44
+ return stripped;
45
+ }
46
+ }
47
+ throw new Error(`No agent instructions found for '${name}'.`);
48
+ }
49
+ /**
50
+ * Return list of available agent names for the current config.
51
+ * If .maestro/agents/ has txt files, only those; otherwise global config agents + embedded defaults.
52
+ */
53
+ export function listAgents(config) {
54
+ const projectAgentsDir = path.join(process.cwd(), '.maestro', 'agents');
55
+ const globalAgentsDir = path.join(config.config_dir, 'agents');
56
+ const defaultAgentsDir = path.join(DEFAULTS_DIR, 'agents');
57
+ if (fs.existsSync(projectAgentsDir)) {
58
+ const files = fs.readdirSync(projectAgentsDir).filter(f => f.endsWith('.txt'));
59
+ if (files.length > 0) {
60
+ return files.map(f => path.basename(f, '.txt'));
61
+ }
62
+ }
63
+ const seen = new Set();
64
+ const result = [];
65
+ for (const dir of [globalAgentsDir, defaultAgentsDir]) {
66
+ if (!fs.existsSync(dir))
67
+ continue;
68
+ for (const f of fs.readdirSync(dir)) {
69
+ if (!f.endsWith('.txt'))
70
+ continue;
71
+ const name = path.basename(f, '.txt');
72
+ if (!seen.has(name)) {
73
+ seen.add(name);
74
+ result.push(name);
75
+ }
76
+ }
77
+ }
78
+ return result;
79
+ }
80
+ export function loadPlanTips(config) {
81
+ const candidates = [
82
+ path.join(process.cwd(), '.maestro', 'plan-tips.md'),
83
+ path.join(config.config_dir, 'plan-tips.md'),
84
+ path.join(DEFAULTS_DIR, 'plan-tips.md'),
85
+ ];
86
+ for (const candidate of candidates) {
87
+ const content = tryReadFile(candidate);
88
+ if (content !== null)
89
+ return content;
90
+ }
91
+ return '(No plan-tips.md found. Run maestro --dump-defaults to extract defaults.)';
92
+ }
93
+ function tryReadFile(filePath) {
94
+ try {
95
+ return fs.readFileSync(filePath, 'utf8');
96
+ }
97
+ catch {
98
+ return null;
99
+ }
100
+ }
101
+ /**
102
+ * A file is "fully commented" if every non-empty line starts with #.
103
+ * Such files are treated as unmodified templates and fall back to embedded defaults.
104
+ */
105
+ function isFullyCommented(content) {
106
+ const lines = content.split('\n').filter(l => l.trim().length > 0);
107
+ if (lines.length === 0)
108
+ return true;
109
+ return lines.every(l => l.trimStart().startsWith('#'));
110
+ }
111
+ /**
112
+ * Strip a leading meta-comment block: 2+ contiguous comment lines at the top.
113
+ * A single # Title line at the top is preserved.
114
+ */
115
+ function stripMetaComment(content) {
116
+ const lines = content.split('\n');
117
+ let i = 0;
118
+ let consecutiveComments = 0;
119
+ while (i < lines.length && lines[i].trimStart().startsWith('#')) {
120
+ consecutiveComments++;
121
+ i++;
122
+ }
123
+ if (consecutiveComments >= 2) {
124
+ return lines.slice(i).join('\n');
125
+ }
126
+ return content;
127
+ }
128
+ //# sourceMappingURL=prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/config/prompts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Config } from './types.js';
2
+ export declare function resetConfig(config: Config): Promise<void>;
3
+ //# sourceMappingURL=reset.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reset.d.ts","sourceRoot":"","sources":["../../src/config/reset.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAKpC,wBAAsB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAoB/D"}
@@ -0,0 +1,23 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ import * as readline from 'readline';
4
+ import * as url from 'url';
5
+ const __dirname = path.dirname(url.fileURLToPath(import.meta.url));
6
+ const DEFAULTS_DIR = path.resolve(__dirname, '..', '..', 'defaults');
7
+ export async function resetConfig(config) {
8
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
9
+ const question = (q) => new Promise(resolve => rl.question(q, resolve));
10
+ console.log('Maestro config reset — this will restore default files interactively.\n');
11
+ const configDir = config.config_dir;
12
+ const defaultConfigPath = path.join(DEFAULTS_DIR, 'config');
13
+ const targetConfigPath = path.join(configDir, 'config');
14
+ const answer = await question(`Reset ${targetConfigPath} to default? [y/N] `);
15
+ if (answer.toLowerCase() === 'y') {
16
+ fs.mkdirSync(configDir, { recursive: true });
17
+ fs.copyFileSync(defaultConfigPath, targetConfigPath);
18
+ console.log(` Restored ${targetConfigPath}`);
19
+ }
20
+ rl.close();
21
+ console.log('\nDone. Run `maestro --dump-defaults <dir>` to inspect all defaults without modifying your config.');
22
+ }
23
+ //# sourceMappingURL=reset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reset.js","sourceRoot":"","sources":["../../src/config/reset.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,QAAQ,MAAM,UAAU,CAAC;AACrC,OAAO,KAAK,GAAG,MAAM,KAAK,CAAC;AAG3B,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AACnE,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;AAErE,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAAc;IAC9C,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACtF,MAAM,QAAQ,GAAG,CAAC,CAAS,EAAmB,EAAE,CAC9C,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;IAElD,OAAO,CAAC,GAAG,CAAC,yEAAyE,CAAC,CAAC;IAEvF,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC;IACpC,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;IAC5D,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAExD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,SAAS,gBAAgB,qBAAqB,CAAC,CAAC;IAC9E,IAAI,MAAM,CAAC,WAAW,EAAE,KAAK,GAAG,EAAE,CAAC;QACjC,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7C,EAAE,CAAC,YAAY,CAAC,iBAAiB,EAAE,gBAAgB,CAAC,CAAC;QACrD,OAAO,CAAC,GAAG,CAAC,cAAc,gBAAgB,EAAE,CAAC,CAAC;IAChD,CAAC;IAED,EAAE,CAAC,KAAK,EAAE,CAAC;IACX,OAAO,CAAC,GAAG,CAAC,oGAAoG,CAAC,CAAC;AACpH,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Expand {{VARIABLE}} placeholders in a template string.
3
+ */
4
+ export declare function expandTemplate(template: string, vars: Record<string, string>): string;
5
+ //# sourceMappingURL=template.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template.d.ts","sourceRoot":"","sources":["../../src/config/template.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAKrF"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Expand {{VARIABLE}} placeholders in a template string.
3
+ */
4
+ export function expandTemplate(template, vars) {
5
+ return template.replace(/\{\{([A-Z_]+(?::[a-z_-]+)?)\}\}/g, (match, key) => {
6
+ if (key in vars)
7
+ return vars[key] ?? '';
8
+ return match; // leave unexpanded if no value provided
9
+ });
10
+ }
11
+ //# sourceMappingURL=template.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template.js","sourceRoot":"","sources":["../../src/config/template.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,QAAgB,EAAE,IAA4B;IAC3E,OAAO,QAAQ,CAAC,OAAO,CAAC,kCAAkC,EAAE,CAAC,KAAK,EAAE,GAAW,EAAE,EAAE;QACjF,IAAI,GAAG,IAAI,IAAI;YAAE,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QACxC,OAAO,KAAK,CAAC,CAAC,wCAAwC;IACxD,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,35 @@
1
+ export interface Config {
2
+ ai_provider: 'claude' | 'copilot';
3
+ claude_command: string;
4
+ claude_args: string;
5
+ claude_error_patterns: string[];
6
+ copilot_command: string;
7
+ copilot_args: string;
8
+ copilot_error_patterns: string[];
9
+ max_iterations: number;
10
+ max_external_iterations: number;
11
+ iteration_delay_ms: number;
12
+ task_retry_count: number;
13
+ validation_timeout_ms: number;
14
+ finalize_enabled: boolean;
15
+ use_worktree: boolean;
16
+ plans_dir: string;
17
+ default_branch: string;
18
+ vcs_command: string;
19
+ push_on_complete: boolean;
20
+ watch_dirs: string[];
21
+ port: number;
22
+ color_task: string;
23
+ color_review: string;
24
+ color_claude_eval: string;
25
+ color_warn: string;
26
+ color_error: string;
27
+ color_signal: string;
28
+ color_timestamp: string;
29
+ color_info: string;
30
+ no_color: boolean;
31
+ debug: boolean;
32
+ config_dir: string;
33
+ }
34
+ export declare const EMBEDDED_DEFAULTS: Config;
35
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,MAAM;IAErB,WAAW,EAAE,QAAQ,GAAG,SAAS,CAAC;IAGlC,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,qBAAqB,EAAE,MAAM,EAAE,CAAC;IAGhC,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,sBAAsB,EAAE,MAAM,EAAE,CAAC;IAGjC,cAAc,EAAE,MAAM,CAAC;IACvB,uBAAuB,EAAE,MAAM,CAAC;IAChC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,gBAAgB,EAAE,MAAM,CAAC;IACzB,qBAAqB,EAAE,MAAM,CAAC;IAG9B,gBAAgB,EAAE,OAAO,CAAC;IAG1B,YAAY,EAAE,OAAO,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,OAAO,CAAC;IAG1B,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IAGb,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IAGnB,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,iBAAiB,EAAE,MAgD/B,CAAC"}
@@ -0,0 +1,42 @@
1
+ export const EMBEDDED_DEFAULTS = {
2
+ ai_provider: 'copilot',
3
+ claude_command: 'claude',
4
+ claude_args: '--dangerously-skip-permissions --output-format stream-json --verbose',
5
+ claude_error_patterns: [
6
+ "You've hit your limit",
7
+ 'API Error:',
8
+ 'cannot be launched inside another Claude Code session',
9
+ ],
10
+ copilot_command: 'copilot',
11
+ copilot_args: '--autopilot --allow-all',
12
+ copilot_error_patterns: [
13
+ 'authentication required',
14
+ 'Copilot is not enabled',
15
+ 'rate limit exceeded',
16
+ ],
17
+ max_iterations: 50,
18
+ max_external_iterations: 0,
19
+ iteration_delay_ms: 2000,
20
+ task_retry_count: 1,
21
+ validation_timeout_ms: 60000,
22
+ finalize_enabled: false,
23
+ use_worktree: false,
24
+ plans_dir: 'docs/plans',
25
+ default_branch: '',
26
+ vcs_command: 'git',
27
+ push_on_complete: false,
28
+ watch_dirs: [],
29
+ port: 8080,
30
+ color_task: '#00ff00',
31
+ color_review: '#00ffff',
32
+ color_claude_eval: '#64c8ff',
33
+ color_warn: '#ffff00',
34
+ color_error: '#ff0000',
35
+ color_signal: '#ff6464',
36
+ color_timestamp: '#8a8a8a',
37
+ color_info: '#b4b4b4',
38
+ no_color: false,
39
+ debug: false,
40
+ config_dir: '',
41
+ };
42
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":"AAmDA,MAAM,CAAC,MAAM,iBAAiB,GAAW;IACvC,WAAW,EAAE,SAAS;IAEtB,cAAc,EAAE,QAAQ;IACxB,WAAW,EAAE,sEAAsE;IACnF,qBAAqB,EAAE;QACrB,uBAAuB;QACvB,YAAY;QACZ,uDAAuD;KACxD;IAED,eAAe,EAAE,SAAS;IAC1B,YAAY,EAAE,yBAAyB;IACvC,sBAAsB,EAAE;QACtB,yBAAyB;QACzB,wBAAwB;QACxB,qBAAqB;KACtB;IAED,cAAc,EAAE,EAAE;IAClB,uBAAuB,EAAE,CAAC;IAC1B,kBAAkB,EAAE,IAAI;IACxB,gBAAgB,EAAE,CAAC;IACnB,qBAAqB,EAAE,KAAK;IAE5B,gBAAgB,EAAE,KAAK;IAEvB,YAAY,EAAE,KAAK;IACnB,SAAS,EAAE,YAAY;IACvB,cAAc,EAAE,EAAE;IAClB,WAAW,EAAE,KAAK;IAClB,gBAAgB,EAAE,KAAK;IAEvB,UAAU,EAAE,EAAE;IACd,IAAI,EAAE,IAAI;IAEV,UAAU,EAAE,SAAS;IACrB,YAAY,EAAE,SAAS;IACvB,iBAAiB,EAAE,SAAS;IAC5B,UAAU,EAAE,SAAS;IACrB,WAAW,EAAE,SAAS;IACtB,YAAY,EAAE,SAAS;IACvB,eAAe,EAAE,SAAS;IAC1B,UAAU,EAAE,SAAS;IAErB,QAAQ,EAAE,KAAK;IACf,KAAK,EAAE,KAAK;IACZ,UAAU,EAAE,EAAE;CACf,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { Config } from './types.js';
2
+ export declare function serializeConfigValue(key: keyof Config, value: unknown): string;
3
+ export declare function computeOverrides(config: Partial<Config>): Record<string, string>;
4
+ export declare function writeConfigFile(filePath: string, overrides: Record<string, string>): void;
5
+ //# sourceMappingURL=write.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write.d.ts","sourceRoot":"","sources":["../../src/config/write.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAqB,MAAM,YAAY,CAAC;AAKvD,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,MAAM,CAW9E;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAgBhF;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CA0BzF"}
@@ -0,0 +1,59 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ import { EMBEDDED_DEFAULTS } from './types.js';
4
+ // Runtime-only fields — never written to INI
5
+ const RUNTIME_ONLY = new Set(['no_color', 'debug', 'config_dir']);
6
+ export function serializeConfigValue(key, value) {
7
+ if (Array.isArray(value)) {
8
+ return value.join(', ');
9
+ }
10
+ if (typeof value === 'boolean') {
11
+ return value ? 'true' : 'false';
12
+ }
13
+ if (typeof value === 'number') {
14
+ return String(value);
15
+ }
16
+ return String(value ?? '');
17
+ }
18
+ export function computeOverrides(config) {
19
+ const result = {};
20
+ for (const [key, value] of Object.entries(config)) {
21
+ const k = key;
22
+ if (RUNTIME_ONLY.has(k))
23
+ continue;
24
+ if (value === undefined || value === null)
25
+ continue;
26
+ const defaultValue = EMBEDDED_DEFAULTS[k];
27
+ const serialized = serializeConfigValue(k, value);
28
+ const defaultSerialized = serializeConfigValue(k, defaultValue);
29
+ if (serialized !== defaultSerialized) {
30
+ result[key] = serialized;
31
+ }
32
+ }
33
+ return result;
34
+ }
35
+ export function writeConfigFile(filePath, overrides) {
36
+ if (Object.keys(overrides).length === 0) {
37
+ // Reset to default — delete the file if it exists
38
+ if (fs.existsSync(filePath)) {
39
+ fs.unlinkSync(filePath);
40
+ }
41
+ return;
42
+ }
43
+ // Ensure parent directory exists
44
+ const dir = path.dirname(filePath);
45
+ if (!fs.existsSync(dir)) {
46
+ fs.mkdirSync(dir, { recursive: true });
47
+ }
48
+ const lines = [
49
+ '# Maestro configuration — generated by --config UI',
50
+ '# Only overrides from defaults are stored here.',
51
+ '',
52
+ ];
53
+ for (const [key, value] of Object.entries(overrides)) {
54
+ lines.push(`${key} = ${value}`);
55
+ }
56
+ lines.push('');
57
+ fs.writeFileSync(filePath, lines.join('\n'), 'utf8');
58
+ }
59
+ //# sourceMappingURL=write.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write.js","sourceRoot":"","sources":["../../src/config/write.ts"],"names":[],"mappings":"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"}