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.
Files changed (72) hide show
  1. package/.claude/commands/linear/define.md +22 -0
  2. package/.claude/commands/linear/execute.md +22 -0
  3. package/.claude/commands/linear/refine.md +22 -0
  4. package/.claude/commands/linear/verify.md +22 -0
  5. package/.claude/skills/define-linear-issue/SKILL.md +386 -0
  6. package/.claude/skills/execute-linear-issue/SKILL.md +629 -0
  7. package/.claude/skills/refine-linear-issue/SKILL.md +379 -0
  8. package/.claude/skills/verify-linear-issue/SKILL.md +663 -0
  9. package/AGENTS.md +70 -0
  10. package/LICENSE +21 -0
  11. package/README.md +457 -0
  12. package/dist/bin/mobius.d.ts +3 -0
  13. package/dist/bin/mobius.d.ts.map +1 -0
  14. package/dist/bin/mobius.js +75 -0
  15. package/dist/bin/mobius.js.map +1 -0
  16. package/dist/commands/config.d.ts +6 -0
  17. package/dist/commands/config.d.ts.map +1 -0
  18. package/dist/commands/config.js +88 -0
  19. package/dist/commands/config.js.map +1 -0
  20. package/dist/commands/doctor.d.ts +2 -0
  21. package/dist/commands/doctor.d.ts.map +1 -0
  22. package/dist/commands/doctor.js +86 -0
  23. package/dist/commands/doctor.js.map +1 -0
  24. package/dist/commands/run.d.ts +10 -0
  25. package/dist/commands/run.d.ts.map +1 -0
  26. package/dist/commands/run.js +62 -0
  27. package/dist/commands/run.js.map +1 -0
  28. package/dist/commands/setup.d.ts +2 -0
  29. package/dist/commands/setup.d.ts.map +1 -0
  30. package/dist/commands/setup.js +131 -0
  31. package/dist/commands/setup.js.map +1 -0
  32. package/dist/lib/checks/cclean.d.ts +3 -0
  33. package/dist/lib/checks/cclean.d.ts.map +1 -0
  34. package/dist/lib/checks/cclean.js +23 -0
  35. package/dist/lib/checks/cclean.js.map +1 -0
  36. package/dist/lib/checks/claude.d.ts +3 -0
  37. package/dist/lib/checks/claude.d.ts.map +1 -0
  38. package/dist/lib/checks/claude.js +38 -0
  39. package/dist/lib/checks/claude.js.map +1 -0
  40. package/dist/lib/checks/config.d.ts +4 -0
  41. package/dist/lib/checks/config.d.ts.map +1 -0
  42. package/dist/lib/checks/config.js +45 -0
  43. package/dist/lib/checks/config.js.map +1 -0
  44. package/dist/lib/checks/docker.d.ts +3 -0
  45. package/dist/lib/checks/docker.d.ts.map +1 -0
  46. package/dist/lib/checks/docker.js +46 -0
  47. package/dist/lib/checks/docker.js.map +1 -0
  48. package/dist/lib/checks/linear-mcp.d.ts +3 -0
  49. package/dist/lib/checks/linear-mcp.d.ts.map +1 -0
  50. package/dist/lib/checks/linear-mcp.js +46 -0
  51. package/dist/lib/checks/linear-mcp.js.map +1 -0
  52. package/dist/lib/checks/path.d.ts +5 -0
  53. package/dist/lib/checks/path.d.ts.map +1 -0
  54. package/dist/lib/checks/path.js +49 -0
  55. package/dist/lib/checks/path.js.map +1 -0
  56. package/dist/lib/config.d.ts +37 -0
  57. package/dist/lib/config.d.ts.map +1 -0
  58. package/dist/lib/config.js +145 -0
  59. package/dist/lib/config.js.map +1 -0
  60. package/dist/lib/paths.d.ts +39 -0
  61. package/dist/lib/paths.d.ts.map +1 -0
  62. package/dist/lib/paths.js +117 -0
  63. package/dist/lib/paths.js.map +1 -0
  64. package/dist/types.d.ts +39 -0
  65. package/dist/types.d.ts.map +1 -0
  66. package/dist/types.js +19 -0
  67. package/dist/types.js.map +1 -0
  68. package/mobius.config.yaml +38 -0
  69. package/package.json +56 -0
  70. package/scripts/mobius.sh +394 -0
  71. package/scripts/render-diagrams.sh +38 -0
  72. 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":"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;AAM9C,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAAsB;IACrD,MAAM,KAAK,GAAG,YAAY,EAAE,CAAC;IAE7B,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,MAAM,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACnC,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC,CAAC;IAEpD,uBAAuB;IACvB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC;IAC5C,IAAI,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,UAAU,KAAK,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC;IAC3E,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,UAAU,cAAc,CAAC,CAAC;QACnE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC,CAAC;QAC7E,OAAO;IACT,CAAC;IAED,uBAAuB;IACvB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC;IAC9C,IAAI,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC;IAC3D,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,UAAU,cAAc,CAAC,CAAC;IACrE,CAAC;IAED,0BAA0B;IAC1B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAE5C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC;QAC/C,OAAO,CAAC,GAAG,CAAC,sBAAsB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAChE,OAAO,CAAC,GAAG,CAAC,sBAAsB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACxE,OAAO,CAAC,GAAG,CAAC,sBAAsB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QAChF,OAAO,CAAC,GAAG,CAAC,sBAAsB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;QACjF,OAAO,CAAC,GAAG,CAAC,sBAAsB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC1E,OAAO,CAAC,GAAG,CAAC,sBAAsB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;QAEjF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC,CAAC;QACpD,MAAM,OAAO,GAAG;YACd,gBAAgB;YAChB,sBAAsB;YACtB,uBAAuB;YACvB,cAAc;YACd,wBAAwB;YACxB,kBAAkB;SACnB,CAAC;QAEF,IAAI,YAAY,GAAG,KAAK,CAAC;QACzB,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;gBACxB,OAAO,CAAC,GAAG,CAAC,KAAK,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;gBAChE,YAAY,GAAG,IAAI,CAAC;YACtB,CAAC;QACH,CAAC;QACD,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QACtC,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC,CAAC;QACpD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC;QACpF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,UAAkB;IAC1C,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,uBAAuB,UAAU,EAAE,CAAC,CAAC,CAAC;QAC9D,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC,CAAC;QACzE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,mBAAmB;IACnB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,IAAI,CAAC;IAEhE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,UAAU,OAAO,MAAM,OAAO,CAAC,CAAC,CAAC;IAEnE,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,EAAE;YAChC,KAAK,EAAE,SAAS;SACjB,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,0BAA0B,MAAM,EAAE,CAAC,CAAC,CAAC;QAC7D,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,qEAAqE,CAAC,CAAC,CAAC;QACjG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function doctor(): Promise<void>;
2
+ //# sourceMappingURL=doctor.d.ts.map
@@ -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":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function setup(): Promise<void>;
2
+ //# sourceMappingURL=setup.d.ts.map
@@ -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,3 @@
1
+ import type { CheckResult } from '../../types.js';
2
+ export declare function checkCclean(): Promise<CheckResult>;
3
+ //# sourceMappingURL=cclean.d.ts.map
@@ -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,3 @@
1
+ import type { CheckResult } from '../../types.js';
2
+ export declare function checkClaude(): Promise<CheckResult>;
3
+ //# sourceMappingURL=claude.d.ts.map
@@ -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,4 @@
1
+ import type { CheckResult } from '../../types.js';
2
+ import type { PathConfig } from '../../types.js';
3
+ export declare function checkConfig(paths: PathConfig): Promise<CheckResult>;
4
+ //# sourceMappingURL=config.d.ts.map
@@ -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,3 @@
1
+ import type { CheckResult } from '../../types.js';
2
+ export declare function checkDocker(sandboxEnabled: boolean): Promise<CheckResult>;
3
+ //# sourceMappingURL=docker.d.ts.map
@@ -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"}