mobius-loop 1.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/.claude/commands/linear/define.md +22 -0
- package/.claude/commands/linear/execute.md +22 -0
- package/.claude/commands/linear/refine.md +22 -0
- package/.claude/commands/linear/verify.md +22 -0
- package/.claude/skills/define-linear-issue/SKILL.md +386 -0
- package/.claude/skills/execute-linear-issue/SKILL.md +629 -0
- package/.claude/skills/refine-linear-issue/SKILL.md +379 -0
- package/.claude/skills/verify-linear-issue/SKILL.md +663 -0
- package/AGENTS.md +70 -0
- package/LICENSE +21 -0
- package/README.md +457 -0
- package/dist/bin/mobius.d.ts +3 -0
- package/dist/bin/mobius.d.ts.map +1 -0
- package/dist/bin/mobius.js +75 -0
- package/dist/bin/mobius.js.map +1 -0
- package/dist/commands/config.d.ts +6 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +88 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/doctor.d.ts +2 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +86 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/run.d.ts +10 -0
- package/dist/commands/run.d.ts.map +1 -0
- package/dist/commands/run.js +62 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/commands/setup.d.ts +2 -0
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +131 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/lib/checks/cclean.d.ts +3 -0
- package/dist/lib/checks/cclean.d.ts.map +1 -0
- package/dist/lib/checks/cclean.js +23 -0
- package/dist/lib/checks/cclean.js.map +1 -0
- package/dist/lib/checks/claude.d.ts +3 -0
- package/dist/lib/checks/claude.d.ts.map +1 -0
- package/dist/lib/checks/claude.js +38 -0
- package/dist/lib/checks/claude.js.map +1 -0
- package/dist/lib/checks/config.d.ts +4 -0
- package/dist/lib/checks/config.d.ts.map +1 -0
- package/dist/lib/checks/config.js +45 -0
- package/dist/lib/checks/config.js.map +1 -0
- package/dist/lib/checks/docker.d.ts +3 -0
- package/dist/lib/checks/docker.d.ts.map +1 -0
- package/dist/lib/checks/docker.js +46 -0
- package/dist/lib/checks/docker.js.map +1 -0
- package/dist/lib/checks/linear-mcp.d.ts +3 -0
- package/dist/lib/checks/linear-mcp.d.ts.map +1 -0
- package/dist/lib/checks/linear-mcp.js +46 -0
- package/dist/lib/checks/linear-mcp.js.map +1 -0
- package/dist/lib/checks/path.d.ts +5 -0
- package/dist/lib/checks/path.d.ts.map +1 -0
- package/dist/lib/checks/path.js +49 -0
- package/dist/lib/checks/path.js.map +1 -0
- package/dist/lib/config.d.ts +37 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +145 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/paths.d.ts +39 -0
- package/dist/lib/paths.d.ts.map +1 -0
- package/dist/lib/paths.js +117 -0
- package/dist/lib/paths.js.map +1 -0
- package/dist/types.d.ts +39 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +19 -0
- package/dist/types.js.map +1 -0
- package/mobius.config.yaml +38 -0
- package/package.json +56 -0
- package/scripts/mobius.sh +394 -0
- package/scripts/render-diagrams.sh +38 -0
- package/scripts/render-terminal.sh +49 -0
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { execa } from 'execa';
|
|
3
|
+
import chalk from 'chalk';
|
|
4
|
+
import { resolvePaths } from '../lib/paths.js';
|
|
5
|
+
import { readConfig } from '../lib/config.js';
|
|
6
|
+
export async function showConfig(options) {
|
|
7
|
+
const paths = resolvePaths();
|
|
8
|
+
if (options.edit) {
|
|
9
|
+
await editConfig(paths.configPath);
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
console.log(chalk.bold('\nMobius Configuration\n'));
|
|
13
|
+
// Show config location
|
|
14
|
+
console.log(chalk.gray('Config location:'));
|
|
15
|
+
if (existsSync(paths.configPath)) {
|
|
16
|
+
console.log(` ${chalk.green('●')} ${paths.configPath} (${paths.type})`);
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
console.log(` ${chalk.red('○')} ${paths.configPath} (not found)`);
|
|
20
|
+
console.log(chalk.gray("\n Run 'mobius setup' to create configuration.\n"));
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
// Show skills location
|
|
24
|
+
console.log(chalk.gray('\nSkills location:'));
|
|
25
|
+
if (existsSync(paths.skillsPath)) {
|
|
26
|
+
console.log(` ${chalk.green('●')} ${paths.skillsPath}`);
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
console.log(` ${chalk.red('○')} ${paths.skillsPath} (not found)`);
|
|
30
|
+
}
|
|
31
|
+
// Read and display config
|
|
32
|
+
try {
|
|
33
|
+
const config = readConfig(paths.configPath);
|
|
34
|
+
console.log(chalk.gray('\nCurrent settings:'));
|
|
35
|
+
console.log(` backend: ${chalk.cyan(config.backend)}`);
|
|
36
|
+
console.log(` model: ${chalk.cyan(config.execution.model)}`);
|
|
37
|
+
console.log(` delay_seconds: ${chalk.cyan(config.execution.delay_seconds)}`);
|
|
38
|
+
console.log(` max_iterations: ${chalk.cyan(config.execution.max_iterations)}`);
|
|
39
|
+
console.log(` sandbox: ${chalk.cyan(config.execution.sandbox)}`);
|
|
40
|
+
console.log(` container: ${chalk.cyan(config.execution.container_name)}`);
|
|
41
|
+
console.log(chalk.gray('\nEnvironment overrides:'));
|
|
42
|
+
const envVars = [
|
|
43
|
+
'MOBIUS_BACKEND',
|
|
44
|
+
'MOBIUS_DELAY_SECONDS',
|
|
45
|
+
'MOBIUS_MAX_ITERATIONS',
|
|
46
|
+
'MOBIUS_MODEL',
|
|
47
|
+
'MOBIUS_SANDBOX_ENABLED',
|
|
48
|
+
'MOBIUS_CONTAINER',
|
|
49
|
+
];
|
|
50
|
+
let hasOverrides = false;
|
|
51
|
+
for (const envVar of envVars) {
|
|
52
|
+
if (process.env[envVar]) {
|
|
53
|
+
console.log(` ${envVar}=${chalk.yellow(process.env[envVar])}`);
|
|
54
|
+
hasOverrides = true;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
if (!hasOverrides) {
|
|
58
|
+
console.log(chalk.gray(' (none)'));
|
|
59
|
+
}
|
|
60
|
+
console.log('');
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
console.error(chalk.red('\nError reading config:'));
|
|
64
|
+
console.error(chalk.gray(error instanceof Error ? error.message : 'Unknown error'));
|
|
65
|
+
console.log('');
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
async function editConfig(configPath) {
|
|
69
|
+
if (!existsSync(configPath)) {
|
|
70
|
+
console.error(chalk.red(`Config not found at ${configPath}`));
|
|
71
|
+
console.error(chalk.gray("Run 'mobius setup' to create configuration."));
|
|
72
|
+
process.exit(1);
|
|
73
|
+
}
|
|
74
|
+
// Determine editor
|
|
75
|
+
const editor = process.env.VISUAL || process.env.EDITOR || 'vi';
|
|
76
|
+
console.log(chalk.gray(`Opening ${configPath} in ${editor}...\n`));
|
|
77
|
+
try {
|
|
78
|
+
await execa(editor, [configPath], {
|
|
79
|
+
stdio: 'inherit',
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
console.error(chalk.red(`Failed to open editor: ${editor}`));
|
|
84
|
+
console.error(chalk.gray('Set EDITOR or VISUAL environment variable to your preferred editor.'));
|
|
85
|
+
process.exit(1);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAkCA,wBAAsB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAqE5C"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { resolvePaths } from '../lib/paths.js';
|
|
3
|
+
import { readConfig } from '../lib/config.js';
|
|
4
|
+
import { checkClaude } from '../lib/checks/claude.js';
|
|
5
|
+
import { checkDocker } from '../lib/checks/docker.js';
|
|
6
|
+
import { checkCclean } from '../lib/checks/cclean.js';
|
|
7
|
+
import { checkConfig } from '../lib/checks/config.js';
|
|
8
|
+
import { checkPath, checkSkills } from '../lib/checks/path.js';
|
|
9
|
+
import { checkLinearMcp } from '../lib/checks/linear-mcp.js';
|
|
10
|
+
import { DEFAULT_CONFIG } from '../types.js';
|
|
11
|
+
function formatResult(result) {
|
|
12
|
+
const icon = result.status === 'pass'
|
|
13
|
+
? chalk.green('✓')
|
|
14
|
+
: result.status === 'fail'
|
|
15
|
+
? chalk.red('✗')
|
|
16
|
+
: result.status === 'warn'
|
|
17
|
+
? chalk.yellow('!')
|
|
18
|
+
: chalk.gray('○');
|
|
19
|
+
const required = result.required ? '' : chalk.gray(' (optional)');
|
|
20
|
+
const message = result.status === 'fail' ? chalk.red(result.message) : result.message;
|
|
21
|
+
let line = ` ${icon} ${result.name}: ${message}${required}`;
|
|
22
|
+
if (result.details && result.status !== 'pass') {
|
|
23
|
+
line += `\n ${chalk.gray(result.details)}`;
|
|
24
|
+
}
|
|
25
|
+
return line;
|
|
26
|
+
}
|
|
27
|
+
export async function doctor() {
|
|
28
|
+
console.log(chalk.bold('\nLoop Doctor\n'));
|
|
29
|
+
console.log('Checking system requirements...\n');
|
|
30
|
+
const paths = resolvePaths();
|
|
31
|
+
// Try to read config for sandbox setting, use defaults if not available
|
|
32
|
+
let sandboxEnabled = DEFAULT_CONFIG.execution.sandbox;
|
|
33
|
+
let backend = DEFAULT_CONFIG.backend;
|
|
34
|
+
try {
|
|
35
|
+
const config = readConfig(paths.configPath);
|
|
36
|
+
sandboxEnabled = config.execution?.sandbox ?? sandboxEnabled;
|
|
37
|
+
backend = config.backend ?? backend;
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
// Use defaults if config can't be read
|
|
41
|
+
}
|
|
42
|
+
// Run all checks
|
|
43
|
+
const results = [];
|
|
44
|
+
// Required checks
|
|
45
|
+
console.log(chalk.bold('Required:'));
|
|
46
|
+
const claudeResult = await checkClaude();
|
|
47
|
+
results.push(claudeResult);
|
|
48
|
+
console.log(formatResult(claudeResult));
|
|
49
|
+
const configResult = await checkConfig(paths);
|
|
50
|
+
results.push(configResult);
|
|
51
|
+
console.log(formatResult(configResult));
|
|
52
|
+
const pathResult = await checkPath(paths);
|
|
53
|
+
results.push(pathResult);
|
|
54
|
+
console.log(formatResult(pathResult));
|
|
55
|
+
const skillsResult = await checkSkills(paths);
|
|
56
|
+
results.push(skillsResult);
|
|
57
|
+
console.log(formatResult(skillsResult));
|
|
58
|
+
// Optional checks
|
|
59
|
+
console.log(chalk.bold('\nOptional:'));
|
|
60
|
+
const linearResult = await checkLinearMcp(backend);
|
|
61
|
+
results.push(linearResult);
|
|
62
|
+
console.log(formatResult(linearResult));
|
|
63
|
+
const dockerResult = await checkDocker(sandboxEnabled);
|
|
64
|
+
results.push(dockerResult);
|
|
65
|
+
console.log(formatResult(dockerResult));
|
|
66
|
+
const ccleanResult = await checkCclean();
|
|
67
|
+
results.push(ccleanResult);
|
|
68
|
+
console.log(formatResult(ccleanResult));
|
|
69
|
+
// Summary
|
|
70
|
+
console.log('');
|
|
71
|
+
const failed = results.filter((r) => r.status === 'fail' && r.required);
|
|
72
|
+
const warnings = results.filter((r) => r.status === 'warn' || (r.status === 'fail' && !r.required));
|
|
73
|
+
if (failed.length > 0) {
|
|
74
|
+
console.log(chalk.red(`✗ ${failed.length} required check(s) failed`));
|
|
75
|
+
console.log(chalk.gray(" Run 'loop setup' to fix configuration issues\n"));
|
|
76
|
+
process.exit(1);
|
|
77
|
+
}
|
|
78
|
+
else if (warnings.length > 0) {
|
|
79
|
+
console.log(chalk.yellow(`! All required checks passed, ${warnings.length} warning(s)`));
|
|
80
|
+
console.log(chalk.green(' Loop should work, but some features may be limited\n'));
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
console.log(chalk.green('✓ All checks passed! Loop is ready to use.\n'));
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Backend, Model } from '../types.js';
|
|
2
|
+
interface RunOptions {
|
|
3
|
+
local?: boolean;
|
|
4
|
+
backend?: Backend;
|
|
5
|
+
model?: Model;
|
|
6
|
+
delay?: number;
|
|
7
|
+
}
|
|
8
|
+
export declare function run(taskId: string, maxIterations: number | undefined, options: RunOptions): Promise<void>;
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=run.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAElD,UAAU,UAAU;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,GAAG,CACvB,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,MAAM,GAAG,SAAS,EACjC,OAAO,EAAE,UAAU,GAClB,OAAO,CAAC,IAAI,CAAC,CAgEf"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { execa } from 'execa';
|
|
3
|
+
import chalk from 'chalk';
|
|
4
|
+
import { resolvePaths } from '../lib/paths.js';
|
|
5
|
+
import { readConfig } from '../lib/config.js';
|
|
6
|
+
import { BACKEND_ID_PATTERNS } from '../types.js';
|
|
7
|
+
export async function run(taskId, maxIterations, options) {
|
|
8
|
+
const paths = resolvePaths();
|
|
9
|
+
// Verify script exists
|
|
10
|
+
if (!existsSync(paths.scriptPath)) {
|
|
11
|
+
console.error(chalk.red(`Error: Script not found at ${paths.scriptPath}`));
|
|
12
|
+
console.error(chalk.gray("Run 'mobius setup' to install Mobius properly."));
|
|
13
|
+
process.exit(1);
|
|
14
|
+
}
|
|
15
|
+
// Load config
|
|
16
|
+
const config = readConfig(paths.configPath);
|
|
17
|
+
const backend = options.backend ?? config.backend;
|
|
18
|
+
// Validate task ID format
|
|
19
|
+
const pattern = BACKEND_ID_PATTERNS[backend];
|
|
20
|
+
if (!pattern.test(taskId)) {
|
|
21
|
+
console.error(chalk.red(`Error: Invalid task ID format for ${backend}: ${taskId}`));
|
|
22
|
+
console.error(chalk.gray('Expected format: PREFIX-NUMBER (e.g., VER-159)'));
|
|
23
|
+
process.exit(1);
|
|
24
|
+
}
|
|
25
|
+
// Build arguments for bash script
|
|
26
|
+
const args = [taskId];
|
|
27
|
+
if (maxIterations !== undefined) {
|
|
28
|
+
args.push(String(maxIterations));
|
|
29
|
+
}
|
|
30
|
+
if (options.local) {
|
|
31
|
+
args.push('--local');
|
|
32
|
+
}
|
|
33
|
+
if (options.backend) {
|
|
34
|
+
args.push(`--backend=${options.backend}`);
|
|
35
|
+
}
|
|
36
|
+
if (options.model) {
|
|
37
|
+
args.push(`--model=${options.model}`);
|
|
38
|
+
}
|
|
39
|
+
if (options.delay !== undefined) {
|
|
40
|
+
args.push(`--delay=${options.delay}`);
|
|
41
|
+
}
|
|
42
|
+
// Set config path environment variable for the bash script
|
|
43
|
+
const env = {
|
|
44
|
+
...process.env,
|
|
45
|
+
MOBIUS_CONFIG_FILE: paths.configPath,
|
|
46
|
+
};
|
|
47
|
+
// Execute the bash script
|
|
48
|
+
try {
|
|
49
|
+
await execa(paths.scriptPath, args, {
|
|
50
|
+
env,
|
|
51
|
+
stdio: 'inherit',
|
|
52
|
+
reject: false,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
if (error instanceof Error && 'exitCode' in error) {
|
|
57
|
+
process.exit(error.exitCode);
|
|
58
|
+
}
|
|
59
|
+
throw error;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAC9B,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAUlD,MAAM,CAAC,KAAK,UAAU,GAAG,CACvB,MAAc,EACd,aAAiC,EACjC,OAAmB;IAEnB,MAAM,KAAK,GAAG,YAAY,EAAE,CAAC;IAE7B,uBAAuB;IACvB,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;QAClC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,8BAA8B,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;QAC3E,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC,CAAC;QAC5E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,cAAc;IACd,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAC5C,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC;IAElD,0BAA0B;IAC1B,MAAM,OAAO,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC7C,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,qCAAqC,OAAO,KAAK,MAAM,EAAE,CAAC,CAAC,CAAC;QACpF,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC,CAAC;QAC5E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,kCAAkC;IAClC,MAAM,IAAI,GAAa,CAAC,MAAM,CAAC,CAAC;IAEhC,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;QAChC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC;IACnC,CAAC;IAED,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACvB,CAAC;IAED,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,IAAI,CAAC,IAAI,CAAC,aAAa,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,IAAI,CAAC,IAAI,CAAC,WAAW,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;IACxC,CAAC;IAED,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAChC,IAAI,CAAC,IAAI,CAAC,WAAW,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;IACxC,CAAC;IAED,2DAA2D;IAC3D,MAAM,GAAG,GAAG;QACV,GAAG,OAAO,CAAC,GAAG;QACd,kBAAkB,EAAE,KAAK,CAAC,UAAU;KACrC,CAAC;IAEF,0BAA0B;IAC1B,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,KAAK,CAAC,UAAU,EAAE,IAAI,EAAE;YAClC,GAAG;YACH,KAAK,EAAE,SAAS;YAChB,MAAM,EAAE,KAAK;SACd,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,IAAI,UAAU,IAAI,KAAK,EAAE,CAAC;YAClD,OAAO,CAAC,IAAI,CAAE,KAA8B,CAAC,QAAQ,CAAC,CAAC;QACzD,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"AAmBA,wBAAsB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CA8I3C"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { dirname } from 'node:path';
|
|
3
|
+
import chalk from 'chalk';
|
|
4
|
+
import { select, confirm, input } from '@inquirer/prompts';
|
|
5
|
+
import { getPathsForType, getGlobalConfigDir, getBundledSkillsDir, } from '../lib/paths.js';
|
|
6
|
+
import { writeConfig, copySkills, copyCommands, copyAgentsTemplate, configExists, } from '../lib/config.js';
|
|
7
|
+
import { DEFAULT_CONFIG } from '../types.js';
|
|
8
|
+
export async function setup() {
|
|
9
|
+
console.log(chalk.bold('\nMobius Setup Wizard\n'));
|
|
10
|
+
// Check if bundled skills exist
|
|
11
|
+
const bundledSkills = getBundledSkillsDir();
|
|
12
|
+
if (!existsSync(bundledSkills)) {
|
|
13
|
+
console.log(chalk.red('Error: Bundled skills not found.'));
|
|
14
|
+
console.log(chalk.gray('This may indicate a corrupted installation.'));
|
|
15
|
+
process.exit(1);
|
|
16
|
+
}
|
|
17
|
+
// 1. Installation type
|
|
18
|
+
const installType = await select({
|
|
19
|
+
message: 'Installation type:',
|
|
20
|
+
choices: [
|
|
21
|
+
{
|
|
22
|
+
value: 'local',
|
|
23
|
+
name: 'Local (this project)',
|
|
24
|
+
description: 'Config at ./mobius.config.yaml, skills at ./.claude/skills/',
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
value: 'global',
|
|
28
|
+
name: 'Global (user-wide)',
|
|
29
|
+
description: `Config at ${getGlobalConfigDir()}/config.yaml, skills at ~/.claude/skills/`,
|
|
30
|
+
},
|
|
31
|
+
],
|
|
32
|
+
});
|
|
33
|
+
const paths = getPathsForType(installType);
|
|
34
|
+
// Check for existing config
|
|
35
|
+
if (configExists(paths.configPath)) {
|
|
36
|
+
const overwrite = await confirm({
|
|
37
|
+
message: `Config already exists at ${paths.configPath}. Overwrite?`,
|
|
38
|
+
default: false,
|
|
39
|
+
});
|
|
40
|
+
if (!overwrite) {
|
|
41
|
+
console.log(chalk.yellow('\nSetup cancelled. Existing config preserved.'));
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
// 2. Backend
|
|
46
|
+
const backend = await select({
|
|
47
|
+
message: 'Issue tracker backend:',
|
|
48
|
+
choices: [
|
|
49
|
+
{ value: 'linear', name: 'Linear', description: 'Recommended - native MCP integration' },
|
|
50
|
+
{ value: 'jira', name: 'Jira', description: 'Coming soon' },
|
|
51
|
+
],
|
|
52
|
+
});
|
|
53
|
+
// 3. Model
|
|
54
|
+
const model = await select({
|
|
55
|
+
message: 'Claude model:',
|
|
56
|
+
choices: [
|
|
57
|
+
{ value: 'opus', name: 'Opus', description: 'Most capable, best for complex tasks' },
|
|
58
|
+
{ value: 'sonnet', name: 'Sonnet', description: 'Balanced speed and capability' },
|
|
59
|
+
{ value: 'haiku', name: 'Haiku', description: 'Fastest, good for simple tasks' },
|
|
60
|
+
],
|
|
61
|
+
});
|
|
62
|
+
// 4. Delay
|
|
63
|
+
const delayStr = await input({
|
|
64
|
+
message: 'Delay between iterations (seconds):',
|
|
65
|
+
default: String(DEFAULT_CONFIG.execution.delay_seconds),
|
|
66
|
+
validate: (value) => {
|
|
67
|
+
const num = parseInt(value, 10);
|
|
68
|
+
if (isNaN(num) || num < 0) {
|
|
69
|
+
return 'Please enter a non-negative number';
|
|
70
|
+
}
|
|
71
|
+
return true;
|
|
72
|
+
},
|
|
73
|
+
});
|
|
74
|
+
const delaySeconds = parseInt(delayStr, 10);
|
|
75
|
+
// 5. Max iterations
|
|
76
|
+
const maxIterStr = await input({
|
|
77
|
+
message: 'Maximum iterations per run (0 = unlimited):',
|
|
78
|
+
default: String(DEFAULT_CONFIG.execution.max_iterations),
|
|
79
|
+
validate: (value) => {
|
|
80
|
+
const num = parseInt(value, 10);
|
|
81
|
+
if (isNaN(num) || num < 0) {
|
|
82
|
+
return 'Please enter a non-negative number';
|
|
83
|
+
}
|
|
84
|
+
return true;
|
|
85
|
+
},
|
|
86
|
+
});
|
|
87
|
+
const maxIterations = parseInt(maxIterStr, 10);
|
|
88
|
+
// 6. Sandbox
|
|
89
|
+
const sandbox = await confirm({
|
|
90
|
+
message: 'Enable Docker sandbox mode?',
|
|
91
|
+
default: DEFAULT_CONFIG.execution.sandbox,
|
|
92
|
+
});
|
|
93
|
+
// Build config
|
|
94
|
+
const config = {
|
|
95
|
+
backend,
|
|
96
|
+
execution: {
|
|
97
|
+
delay_seconds: delaySeconds,
|
|
98
|
+
max_iterations: maxIterations,
|
|
99
|
+
model,
|
|
100
|
+
sandbox,
|
|
101
|
+
container_name: DEFAULT_CONFIG.execution.container_name,
|
|
102
|
+
},
|
|
103
|
+
};
|
|
104
|
+
// Write config
|
|
105
|
+
console.log(chalk.gray(`\nWriting config to ${paths.configPath}...`));
|
|
106
|
+
writeConfig(paths.configPath, config);
|
|
107
|
+
// Copy skills
|
|
108
|
+
console.log(chalk.gray(`Copying skills to ${paths.skillsPath}...`));
|
|
109
|
+
copySkills(paths.skillsPath);
|
|
110
|
+
// Copy commands
|
|
111
|
+
console.log(chalk.gray('Copying commands...'));
|
|
112
|
+
copyCommands(paths);
|
|
113
|
+
// For local install, also copy AGENTS.md if it doesn't exist
|
|
114
|
+
if (installType === 'local') {
|
|
115
|
+
const projectDir = dirname(paths.configPath);
|
|
116
|
+
console.log(chalk.gray('Checking AGENTS.md template...'));
|
|
117
|
+
copyAgentsTemplate(projectDir);
|
|
118
|
+
}
|
|
119
|
+
console.log(chalk.green('\n✓ Setup complete!\n'));
|
|
120
|
+
console.log(chalk.bold('Next steps:'));
|
|
121
|
+
console.log(` 1. Run ${chalk.cyan('mobius doctor')} to verify installation`);
|
|
122
|
+
console.log(` 2. Run ${chalk.cyan('mobius <TASK-ID>')} to start executing tasks`);
|
|
123
|
+
if (backend === 'linear') {
|
|
124
|
+
console.log(`\n${chalk.gray('Note: Linear MCP should be auto-configured in Claude Code.')}`);
|
|
125
|
+
}
|
|
126
|
+
if (installType === 'local') {
|
|
127
|
+
console.log(`\n${chalk.gray('Tip: Review AGENTS.md and customize for your project.')}`);
|
|
128
|
+
}
|
|
129
|
+
console.log('');
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cclean.d.ts","sourceRoot":"","sources":["../../../src/lib/checks/cclean.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElD,wBAAsB,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC,CAoBxD"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import which from 'which';
|
|
2
|
+
export async function checkCclean() {
|
|
3
|
+
const name = 'cclean utility';
|
|
4
|
+
try {
|
|
5
|
+
await which('cclean');
|
|
6
|
+
return {
|
|
7
|
+
name,
|
|
8
|
+
status: 'pass',
|
|
9
|
+
message: 'Installed',
|
|
10
|
+
required: false,
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
return {
|
|
15
|
+
name,
|
|
16
|
+
status: 'warn',
|
|
17
|
+
message: 'Not found (output formatting will be basic)',
|
|
18
|
+
required: false,
|
|
19
|
+
details: 'Optional: Provides cleaner Claude output formatting',
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=cclean.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cclean.js","sourceRoot":"","sources":["../../../src/lib/checks/cclean.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,MAAM,IAAI,GAAG,gBAAgB,CAAC;IAE9B,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,QAAQ,CAAC,CAAC;QACtB,OAAO;YACL,IAAI;YACJ,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,WAAW;YACpB,QAAQ,EAAE,KAAK;SAChB,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;YACL,IAAI;YACJ,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,6CAA6C;YACtD,QAAQ,EAAE,KAAK;YACf,OAAO,EAAE,qDAAqD;SAC/D,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../../../src/lib/checks/claude.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElD,wBAAsB,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC,CAkCxD"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { execa } from 'execa';
|
|
2
|
+
import which from 'which';
|
|
3
|
+
export async function checkClaude() {
|
|
4
|
+
const name = 'Claude CLI';
|
|
5
|
+
// Check if claude is in PATH
|
|
6
|
+
try {
|
|
7
|
+
await which('claude');
|
|
8
|
+
}
|
|
9
|
+
catch {
|
|
10
|
+
return {
|
|
11
|
+
name,
|
|
12
|
+
status: 'fail',
|
|
13
|
+
message: 'Claude CLI not found in PATH',
|
|
14
|
+
required: true,
|
|
15
|
+
details: 'Install with: npm install -g @anthropic-ai/claude-code',
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
// Check if it's working
|
|
19
|
+
try {
|
|
20
|
+
const { stdout } = await execa('claude', ['--version'], { timeout: 10000 });
|
|
21
|
+
return {
|
|
22
|
+
name,
|
|
23
|
+
status: 'pass',
|
|
24
|
+
message: `Installed (${stdout.trim()})`,
|
|
25
|
+
required: true,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
return {
|
|
30
|
+
name,
|
|
31
|
+
status: 'fail',
|
|
32
|
+
message: 'Claude CLI found but not responding',
|
|
33
|
+
required: true,
|
|
34
|
+
details: error instanceof Error ? error.message : 'Unknown error',
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=claude.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../../../src/lib/checks/claude.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAC9B,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,MAAM,IAAI,GAAG,YAAY,CAAC;IAE1B,6BAA6B;IAC7B,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,QAAQ,CAAC,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;YACL,IAAI;YACJ,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,8BAA8B;YACvC,QAAQ,EAAE,IAAI;YACd,OAAO,EAAE,wDAAwD;SAClE,CAAC;IACJ,CAAC;IAED,wBAAwB;IACxB,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,KAAK,CAAC,QAAQ,EAAE,CAAC,WAAW,CAAC,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QAC5E,OAAO;YACL,IAAI;YACJ,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,cAAc,MAAM,CAAC,IAAI,EAAE,GAAG;YACvC,QAAQ,EAAE,IAAI;SACf,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,IAAI;YACJ,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,qCAAqC;YAC9C,QAAQ,EAAE,IAAI;YACd,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;SAClE,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/lib/checks/config.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAc,MAAM,gBAAgB,CAAC;AAE9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEjD,wBAAsB,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC,CA4CzE"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { readConfig, validateConfig } from '../config.js';
|
|
3
|
+
export async function checkConfig(paths) {
|
|
4
|
+
const name = 'Configuration';
|
|
5
|
+
if (!existsSync(paths.configPath)) {
|
|
6
|
+
return {
|
|
7
|
+
name,
|
|
8
|
+
status: 'fail',
|
|
9
|
+
message: `Config not found at ${paths.configPath}`,
|
|
10
|
+
required: true,
|
|
11
|
+
details: "Run 'loop setup' to create configuration",
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
let config;
|
|
15
|
+
try {
|
|
16
|
+
config = readConfig(paths.configPath);
|
|
17
|
+
}
|
|
18
|
+
catch (error) {
|
|
19
|
+
return {
|
|
20
|
+
name,
|
|
21
|
+
status: 'fail',
|
|
22
|
+
message: 'Failed to parse config file',
|
|
23
|
+
required: true,
|
|
24
|
+
details: error instanceof Error ? error.message : 'Invalid YAML',
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
const { valid, errors } = validateConfig(config);
|
|
28
|
+
if (!valid) {
|
|
29
|
+
return {
|
|
30
|
+
name,
|
|
31
|
+
status: 'fail',
|
|
32
|
+
message: 'Invalid configuration',
|
|
33
|
+
required: true,
|
|
34
|
+
details: errors.join('; '),
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
const location = paths.type === 'local' ? 'local' : 'global';
|
|
38
|
+
return {
|
|
39
|
+
name,
|
|
40
|
+
status: 'pass',
|
|
41
|
+
message: `Valid (${location}: ${paths.configPath})`,
|
|
42
|
+
required: true,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/lib/checks/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAErC,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAG1D,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,KAAiB;IACjD,MAAM,IAAI,GAAG,eAAe,CAAC;IAE7B,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;QAClC,OAAO;YACL,IAAI;YACJ,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,uBAAuB,KAAK,CAAC,UAAU,EAAE;YAClD,QAAQ,EAAE,IAAI;YACd,OAAO,EAAE,0CAA0C;SACpD,CAAC;IACJ,CAAC;IAED,IAAI,MAAkB,CAAC;IACvB,IAAI,CAAC;QACH,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IACxC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,IAAI;YACJ,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,6BAA6B;YACtC,QAAQ,EAAE,IAAI;YACd,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc;SACjE,CAAC;IACJ,CAAC;IAED,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IACjD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO;YACL,IAAI;YACJ,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,uBAAuB;YAChC,QAAQ,EAAE,IAAI;YACd,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;SAC3B,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC;IAC7D,OAAO;QACL,IAAI;QACJ,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,UAAU,QAAQ,KAAK,KAAK,CAAC,UAAU,GAAG;QACnD,QAAQ,EAAE,IAAI;KACf,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docker.d.ts","sourceRoot":"","sources":["../../../src/lib/checks/docker.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElD,wBAAsB,WAAW,CAAC,cAAc,EAAE,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,CA2C/E"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { execa } from 'execa';
|
|
2
|
+
import which from 'which';
|
|
3
|
+
export async function checkDocker(sandboxEnabled) {
|
|
4
|
+
const name = 'Docker';
|
|
5
|
+
if (!sandboxEnabled) {
|
|
6
|
+
return {
|
|
7
|
+
name,
|
|
8
|
+
status: 'skip',
|
|
9
|
+
message: 'Sandbox disabled in config',
|
|
10
|
+
required: false,
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
// Check if docker is in PATH
|
|
14
|
+
try {
|
|
15
|
+
await which('docker');
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
return {
|
|
19
|
+
name,
|
|
20
|
+
status: 'warn',
|
|
21
|
+
message: 'Docker not found (sandbox mode unavailable)',
|
|
22
|
+
required: false,
|
|
23
|
+
details: 'Install Docker for isolated sandbox execution',
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
// Check if daemon is running
|
|
27
|
+
try {
|
|
28
|
+
await execa('docker', ['info'], { timeout: 10000 });
|
|
29
|
+
return {
|
|
30
|
+
name,
|
|
31
|
+
status: 'pass',
|
|
32
|
+
message: 'Running',
|
|
33
|
+
required: false,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return {
|
|
38
|
+
name,
|
|
39
|
+
status: 'warn',
|
|
40
|
+
message: 'Docker installed but daemon not running',
|
|
41
|
+
required: false,
|
|
42
|
+
details: 'Start Docker to enable sandbox mode, or use --local flag',
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=docker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docker.js","sourceRoot":"","sources":["../../../src/lib/checks/docker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAC9B,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,cAAuB;IACvD,MAAM,IAAI,GAAG,QAAQ,CAAC;IAEtB,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,OAAO;YACL,IAAI;YACJ,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,4BAA4B;YACrC,QAAQ,EAAE,KAAK;SAChB,CAAC;IACJ,CAAC;IAED,6BAA6B;IAC7B,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,QAAQ,CAAC,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;YACL,IAAI;YACJ,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,6CAA6C;YACtD,QAAQ,EAAE,KAAK;YACf,OAAO,EAAE,+CAA+C;SACzD,CAAC;IACJ,CAAC;IAED,6BAA6B;IAC7B,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QACpD,OAAO;YACL,IAAI;YACJ,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,SAAS;YAClB,QAAQ,EAAE,KAAK;SAChB,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;YACL,IAAI;YACJ,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,yCAAyC;YAClD,QAAQ,EAAE,KAAK;YACf,OAAO,EAAE,0DAA0D;SACpE,CAAC;IACJ,CAAC;AACH,CAAC"}
|