@litmers/cursorflow-orchestrator 0.1.2 → 0.1.5
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/CHANGELOG.md +7 -6
- package/dist/cli/clean.d.ts +5 -0
- package/dist/cli/clean.js +57 -0
- package/dist/cli/clean.js.map +1 -0
- package/dist/cli/index.d.ts +6 -0
- package/dist/cli/index.js +120 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/init.d.ts +7 -0
- package/dist/cli/init.js +302 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/monitor.d.ts +8 -0
- package/dist/cli/monitor.js +210 -0
- package/dist/cli/monitor.js.map +1 -0
- package/dist/cli/resume.d.ts +5 -0
- package/dist/cli/resume.js +58 -0
- package/dist/cli/resume.js.map +1 -0
- package/dist/cli/run.d.ts +5 -0
- package/dist/cli/run.js +74 -0
- package/dist/cli/run.js.map +1 -0
- package/dist/cli/setup-commands.d.ts +19 -0
- package/dist/cli/setup-commands.js +218 -0
- package/dist/cli/setup-commands.js.map +1 -0
- package/dist/core/orchestrator.d.ts +47 -0
- package/dist/core/orchestrator.js +192 -0
- package/dist/core/orchestrator.js.map +1 -0
- package/dist/core/reviewer.d.ts +60 -0
- package/dist/core/reviewer.js +239 -0
- package/dist/core/reviewer.js.map +1 -0
- package/dist/core/runner.d.ts +49 -0
- package/dist/core/runner.js +475 -0
- package/dist/core/runner.js.map +1 -0
- package/dist/utils/config.d.ts +31 -0
- package/dist/utils/config.js +198 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/cursor-agent.d.ts +61 -0
- package/dist/utils/cursor-agent.js +263 -0
- package/dist/utils/cursor-agent.js.map +1 -0
- package/dist/utils/git.d.ts +131 -0
- package/dist/utils/git.js +272 -0
- package/dist/utils/git.js.map +1 -0
- package/dist/utils/logger.d.ts +68 -0
- package/dist/utils/logger.js +158 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/state.d.ts +65 -0
- package/dist/utils/state.js +216 -0
- package/dist/utils/state.js.map +1 -0
- package/dist/utils/types.d.ts +117 -0
- package/dist/utils/types.js +6 -0
- package/dist/utils/types.js.map +1 -0
- package/examples/README.md +155 -0
- package/examples/demo-project/README.md +262 -0
- package/examples/demo-project/_cursorflow/tasks/demo-test/01-create-utils.json +18 -0
- package/examples/demo-project/_cursorflow/tasks/demo-test/02-add-tests.json +18 -0
- package/examples/demo-project/_cursorflow/tasks/demo-test/README.md +109 -0
- package/package.json +71 -61
- package/scripts/ai-security-check.js +11 -4
- package/scripts/local-security-gate.sh +76 -0
- package/src/cli/{clean.js → clean.ts} +11 -5
- package/src/cli/{index.js → index.ts} +22 -16
- package/src/cli/{init.js → init.ts} +26 -18
- package/src/cli/{monitor.js → monitor.ts} +57 -44
- package/src/cli/{resume.js → resume.ts} +11 -5
- package/src/cli/run.ts +54 -0
- package/src/cli/{setup-commands.js → setup-commands.ts} +19 -18
- package/src/core/{orchestrator.js → orchestrator.ts} +44 -26
- package/src/core/{reviewer.js → reviewer.ts} +36 -29
- package/src/core/{runner.js → runner.ts} +78 -56
- package/src/utils/{config.js → config.ts} +17 -25
- package/src/utils/{cursor-agent.js → cursor-agent.ts} +38 -47
- package/src/utils/{git.js → git.ts} +70 -56
- package/src/utils/{logger.js → logger.ts} +170 -178
- package/src/utils/{state.js → state.ts} +30 -38
- package/src/utils/types.ts +133 -0
- package/src/cli/run.js +0 -51
package/CHANGELOG.md
CHANGED
|
@@ -8,12 +8,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
10
|
### Added
|
|
11
|
-
-
|
|
12
|
-
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
-
|
|
16
|
-
|
|
11
|
+
- Repository-specific Cursor rules (`.cursorrules`) for best practices, security, and deployment
|
|
12
|
+
- Enhanced `.gitignore` to include Cursor-specific paths and logs
|
|
13
|
+
|
|
14
|
+
### Changed
|
|
15
|
+
- Improved project ignore patterns for worktrees and logs
|
|
16
|
+
|
|
17
|
+
## [0.1.4] - 2025-12-20
|
|
17
18
|
|
|
18
19
|
## [1.0.0] - TBD
|
|
19
20
|
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* CursorFlow clean command (stub)
|
|
4
|
+
*/
|
|
5
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
8
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
9
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
10
|
+
}
|
|
11
|
+
Object.defineProperty(o, k2, desc);
|
|
12
|
+
}) : (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
o[k2] = m[k];
|
|
15
|
+
}));
|
|
16
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
17
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
18
|
+
}) : function(o, v) {
|
|
19
|
+
o["default"] = v;
|
|
20
|
+
});
|
|
21
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
22
|
+
var ownKeys = function(o) {
|
|
23
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
24
|
+
var ar = [];
|
|
25
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
26
|
+
return ar;
|
|
27
|
+
};
|
|
28
|
+
return ownKeys(o);
|
|
29
|
+
};
|
|
30
|
+
return function (mod) {
|
|
31
|
+
if (mod && mod.__esModule) return mod;
|
|
32
|
+
var result = {};
|
|
33
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
34
|
+
__setModuleDefault(result, mod);
|
|
35
|
+
return result;
|
|
36
|
+
};
|
|
37
|
+
})();
|
|
38
|
+
const logger = __importStar(require("../utils/logger"));
|
|
39
|
+
function parseArgs(args) {
|
|
40
|
+
return {
|
|
41
|
+
type: args[0], // branches | worktrees | logs | all
|
|
42
|
+
pattern: null,
|
|
43
|
+
dryRun: args.includes('--dry-run'),
|
|
44
|
+
force: args.includes('--force'),
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
async function clean(args) {
|
|
48
|
+
logger.section('🧹 Cleaning CursorFlow Resources');
|
|
49
|
+
const options = parseArgs(args);
|
|
50
|
+
logger.info('This command will be fully implemented in the next phase');
|
|
51
|
+
logger.info(`Clean type: ${options.type}`);
|
|
52
|
+
logger.info(`Dry run: ${options.dryRun}`);
|
|
53
|
+
logger.warn('\n⚠️ Implementation pending');
|
|
54
|
+
logger.info('This will clean branches, worktrees, and logs');
|
|
55
|
+
}
|
|
56
|
+
module.exports = clean;
|
|
57
|
+
//# sourceMappingURL=clean.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clean.js","sourceRoot":"","sources":["../../src/cli/clean.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,wDAA0C;AAS1C,SAAS,SAAS,CAAC,IAAc;IAC/B,OAAO;QACL,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,oCAAoC;QACnD,OAAO,EAAE,IAAI;QACb,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC;QAClC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;KAChC,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,KAAK,CAAC,IAAc;IACjC,MAAM,CAAC,OAAO,CAAC,kCAAkC,CAAC,CAAC;IAEnD,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAEhC,MAAM,CAAC,IAAI,CAAC,0DAA0D,CAAC,CAAC;IACxE,MAAM,CAAC,IAAI,CAAC,eAAe,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAC3C,MAAM,CAAC,IAAI,CAAC,YAAY,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAE1C,MAAM,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;IAC5C,MAAM,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;AAC/D,CAAC;AAED,iBAAS,KAAK,CAAC"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* CursorFlow CLI - Main entry point
|
|
4
|
+
*/
|
|
5
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
8
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
9
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
10
|
+
}
|
|
11
|
+
Object.defineProperty(o, k2, desc);
|
|
12
|
+
}) : (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
o[k2] = m[k];
|
|
15
|
+
}));
|
|
16
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
17
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
18
|
+
}) : function(o, v) {
|
|
19
|
+
o["default"] = v;
|
|
20
|
+
});
|
|
21
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
22
|
+
var ownKeys = function(o) {
|
|
23
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
24
|
+
var ar = [];
|
|
25
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
26
|
+
return ar;
|
|
27
|
+
};
|
|
28
|
+
return ownKeys(o);
|
|
29
|
+
};
|
|
30
|
+
return function (mod) {
|
|
31
|
+
if (mod && mod.__esModule) return mod;
|
|
32
|
+
var result = {};
|
|
33
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
34
|
+
__setModuleDefault(result, mod);
|
|
35
|
+
return result;
|
|
36
|
+
};
|
|
37
|
+
})();
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.main = main;
|
|
40
|
+
const logger = __importStar(require("../utils/logger"));
|
|
41
|
+
// Lazy load commands to speed up help/version output
|
|
42
|
+
const COMMANDS = {
|
|
43
|
+
init: require('./init'),
|
|
44
|
+
run: require('./run'),
|
|
45
|
+
monitor: require('./monitor'),
|
|
46
|
+
clean: require('./clean'),
|
|
47
|
+
resume: require('./resume'),
|
|
48
|
+
};
|
|
49
|
+
function printHelp() {
|
|
50
|
+
console.log(`
|
|
51
|
+
CursorFlow - Git worktree-based parallel AI agent orchestration
|
|
52
|
+
|
|
53
|
+
Usage: cursorflow <command> [options]
|
|
54
|
+
|
|
55
|
+
Commands:
|
|
56
|
+
init [options] Initialize CursorFlow in project
|
|
57
|
+
run <tasks-dir> [options] Run orchestration
|
|
58
|
+
monitor [run-dir] [options] Monitor lane execution
|
|
59
|
+
clean <type> [options] Clean branches/worktrees/logs
|
|
60
|
+
resume <lane> [options] Resume interrupted lane
|
|
61
|
+
|
|
62
|
+
Global Options:
|
|
63
|
+
--config <path> Config file path
|
|
64
|
+
--help, -h Show help
|
|
65
|
+
--version, -v Show version
|
|
66
|
+
|
|
67
|
+
Examples:
|
|
68
|
+
cursorflow init --example
|
|
69
|
+
cursorflow run _cursorflow/tasks/MyFeature/
|
|
70
|
+
cursorflow monitor --watch
|
|
71
|
+
cursorflow clean branches --all
|
|
72
|
+
|
|
73
|
+
Documentation:
|
|
74
|
+
https://github.com/eungjin-cigro/cursorflow#readme
|
|
75
|
+
`);
|
|
76
|
+
}
|
|
77
|
+
function printVersion() {
|
|
78
|
+
const pkg = require('../../package.json');
|
|
79
|
+
console.log(`CursorFlow v${pkg.version}`);
|
|
80
|
+
}
|
|
81
|
+
async function main() {
|
|
82
|
+
const args = process.argv.slice(2);
|
|
83
|
+
if (args.length === 0 || args.includes('--help') || args.includes('-h')) {
|
|
84
|
+
printHelp();
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
if (args.includes('--version') || args.includes('-v')) {
|
|
88
|
+
printVersion();
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
const commandName = args[0];
|
|
92
|
+
const commandArgs = args.slice(1);
|
|
93
|
+
const command = COMMANDS[commandName];
|
|
94
|
+
if (!command) {
|
|
95
|
+
logger.error(`Unknown command: ${commandName}`);
|
|
96
|
+
console.log('\nRun "cursorflow --help" for usage information.');
|
|
97
|
+
process.exit(1);
|
|
98
|
+
}
|
|
99
|
+
try {
|
|
100
|
+
await command(commandArgs);
|
|
101
|
+
}
|
|
102
|
+
catch (error) {
|
|
103
|
+
logger.error(error.message);
|
|
104
|
+
if (process.env['DEBUG']) {
|
|
105
|
+
console.error(error.stack);
|
|
106
|
+
}
|
|
107
|
+
process.exit(1);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
if (require.main === module) {
|
|
111
|
+
main().catch(error => {
|
|
112
|
+
logger.error(`Fatal error: ${error.message}`);
|
|
113
|
+
if (process.env['DEBUG']) {
|
|
114
|
+
console.error(error.stack);
|
|
115
|
+
}
|
|
116
|
+
process.exit(1);
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
exports.default = main;
|
|
120
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgGM,oBAAI;AA9Fb,wDAA0C;AAK1C,qDAAqD;AACrD,MAAM,QAAQ,GAA8B;IAC1C,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC;IACvB,GAAG,EAAE,OAAO,CAAC,OAAO,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC;IAC7B,KAAK,EAAE,OAAO,CAAC,SAAS,CAAC;IACzB,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC;CAC5B,CAAC;AAEF,SAAS,SAAS;IAChB,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;GAyBX,CAAC,CAAC;AACL,CAAC;AAED,SAAS,YAAY;IACnB,MAAM,GAAG,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAC1C,OAAO,CAAC,GAAG,CAAC,eAAe,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;AAC5C,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAEnC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACxE,SAAS,EAAE,CAAC;QACZ,OAAO;IACT,CAAC;IAED,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACtD,YAAY,EAAE,CAAC;QACf,OAAO;IACT,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;IAC7B,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAElC,MAAM,OAAO,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC;IAEtC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,CAAC,KAAK,CAAC,oBAAoB,WAAW,EAAE,CAAC,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC;QAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,WAAW,CAAC,CAAC;IAC7B,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC5B,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YACzB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC7B,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;IAC5B,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;QACnB,MAAM,CAAC,KAAK,CAAC,gBAAgB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC9C,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YACzB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC7B,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,kBAAe,IAAI,CAAC"}
|
package/dist/cli/init.js
ADDED
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* CursorFlow init command
|
|
4
|
+
*
|
|
5
|
+
* Initialize CursorFlow in a project
|
|
6
|
+
*/
|
|
7
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
8
|
+
if (k2 === undefined) k2 = k;
|
|
9
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
10
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
11
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
12
|
+
}
|
|
13
|
+
Object.defineProperty(o, k2, desc);
|
|
14
|
+
}) : (function(o, m, k, k2) {
|
|
15
|
+
if (k2 === undefined) k2 = k;
|
|
16
|
+
o[k2] = m[k];
|
|
17
|
+
}));
|
|
18
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
19
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
20
|
+
}) : function(o, v) {
|
|
21
|
+
o["default"] = v;
|
|
22
|
+
});
|
|
23
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
24
|
+
var ownKeys = function(o) {
|
|
25
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
26
|
+
var ar = [];
|
|
27
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
28
|
+
return ar;
|
|
29
|
+
};
|
|
30
|
+
return ownKeys(o);
|
|
31
|
+
};
|
|
32
|
+
return function (mod) {
|
|
33
|
+
if (mod && mod.__esModule) return mod;
|
|
34
|
+
var result = {};
|
|
35
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
36
|
+
__setModuleDefault(result, mod);
|
|
37
|
+
return result;
|
|
38
|
+
};
|
|
39
|
+
})();
|
|
40
|
+
const fs = __importStar(require("fs"));
|
|
41
|
+
const path = __importStar(require("path"));
|
|
42
|
+
const logger = __importStar(require("../utils/logger"));
|
|
43
|
+
const config_1 = require("../utils/config");
|
|
44
|
+
const setup_commands_1 = require("./setup-commands");
|
|
45
|
+
function parseArgs(args) {
|
|
46
|
+
const options = {
|
|
47
|
+
example: false,
|
|
48
|
+
withCommands: true,
|
|
49
|
+
configOnly: false,
|
|
50
|
+
force: false,
|
|
51
|
+
gitignore: true,
|
|
52
|
+
};
|
|
53
|
+
for (let i = 0; i < args.length; i++) {
|
|
54
|
+
const arg = args[i];
|
|
55
|
+
switch (arg) {
|
|
56
|
+
case '--example':
|
|
57
|
+
options.example = true;
|
|
58
|
+
break;
|
|
59
|
+
case '--with-commands':
|
|
60
|
+
options.withCommands = true;
|
|
61
|
+
break;
|
|
62
|
+
case '--no-commands':
|
|
63
|
+
options.withCommands = false;
|
|
64
|
+
break;
|
|
65
|
+
case '--config-only':
|
|
66
|
+
options.configOnly = true;
|
|
67
|
+
break;
|
|
68
|
+
case '--force':
|
|
69
|
+
options.force = true;
|
|
70
|
+
break;
|
|
71
|
+
case '--no-gitignore':
|
|
72
|
+
options.gitignore = false;
|
|
73
|
+
break;
|
|
74
|
+
case '--help':
|
|
75
|
+
case '-h':
|
|
76
|
+
printHelp();
|
|
77
|
+
process.exit(0);
|
|
78
|
+
break;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return options;
|
|
82
|
+
}
|
|
83
|
+
function printHelp() {
|
|
84
|
+
console.log(`
|
|
85
|
+
Usage: cursorflow init [options]
|
|
86
|
+
|
|
87
|
+
Initialize CursorFlow in your project
|
|
88
|
+
|
|
89
|
+
Options:
|
|
90
|
+
--example Create example tasks
|
|
91
|
+
--with-commands Install Cursor commands (default: true)
|
|
92
|
+
--no-commands Skip Cursor commands installation
|
|
93
|
+
--no-gitignore Skip adding _cursorflow to .gitignore
|
|
94
|
+
--config-only Only create config file
|
|
95
|
+
--force Overwrite existing files
|
|
96
|
+
--help, -h Show help
|
|
97
|
+
|
|
98
|
+
Examples:
|
|
99
|
+
cursorflow init
|
|
100
|
+
cursorflow init --example
|
|
101
|
+
cursorflow init --config-only
|
|
102
|
+
cursorflow init --no-gitignore
|
|
103
|
+
`);
|
|
104
|
+
}
|
|
105
|
+
function createDirectories(projectRoot, config) {
|
|
106
|
+
const tasksDir = path.join(projectRoot, config.tasksDir);
|
|
107
|
+
const logsDir = path.join(projectRoot, config.logsDir);
|
|
108
|
+
if (!fs.existsSync(tasksDir)) {
|
|
109
|
+
fs.mkdirSync(tasksDir, { recursive: true });
|
|
110
|
+
logger.success(`Created directory: ${config.tasksDir}`);
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
logger.info(`Directory already exists: ${config.tasksDir}`);
|
|
114
|
+
}
|
|
115
|
+
if (!fs.existsSync(logsDir)) {
|
|
116
|
+
fs.mkdirSync(logsDir, { recursive: true });
|
|
117
|
+
logger.success(`Created directory: ${config.logsDir}`);
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
logger.info(`Directory already exists: ${config.logsDir}`);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
function createExampleTasks(projectRoot, config) {
|
|
124
|
+
const exampleDir = path.join(projectRoot, config.tasksDir, 'example');
|
|
125
|
+
if (!fs.existsSync(exampleDir)) {
|
|
126
|
+
fs.mkdirSync(exampleDir, { recursive: true });
|
|
127
|
+
}
|
|
128
|
+
const exampleTask = {
|
|
129
|
+
repository: "https://github.com/your-org/your-repo",
|
|
130
|
+
baseBranch: "main",
|
|
131
|
+
branchPrefix: "cursorflow/example-",
|
|
132
|
+
executor: "cursor-agent",
|
|
133
|
+
autoCreatePr: false,
|
|
134
|
+
pollInterval: 60,
|
|
135
|
+
tasks: [
|
|
136
|
+
{
|
|
137
|
+
name: "hello",
|
|
138
|
+
model: "sonnet-4.5",
|
|
139
|
+
prompt: `# Example Task
|
|
140
|
+
|
|
141
|
+
## Goal
|
|
142
|
+
Create a simple hello.txt file with a greeting message.
|
|
143
|
+
|
|
144
|
+
## Steps
|
|
145
|
+
1. Create a file called hello.txt
|
|
146
|
+
2. Write "Hello from CursorFlow!" in the file
|
|
147
|
+
3. Commit the change with message: "feat: add hello file"
|
|
148
|
+
`
|
|
149
|
+
}
|
|
150
|
+
]
|
|
151
|
+
};
|
|
152
|
+
const taskPath = path.join(exampleDir, '01-hello.json');
|
|
153
|
+
fs.writeFileSync(taskPath, JSON.stringify(exampleTask, null, 2) + '\n', 'utf8');
|
|
154
|
+
logger.success(`Created example task: ${path.relative(projectRoot, taskPath)}`);
|
|
155
|
+
// Create README
|
|
156
|
+
const readmePath = path.join(exampleDir, 'README.md');
|
|
157
|
+
const readme = `# Example Task
|
|
158
|
+
|
|
159
|
+
This is an example CursorFlow task to help you get started.
|
|
160
|
+
|
|
161
|
+
## Running the example
|
|
162
|
+
|
|
163
|
+
\`\`\`bash
|
|
164
|
+
cursorflow run ${config.tasksDir}/example/
|
|
165
|
+
\`\`\`
|
|
166
|
+
|
|
167
|
+
## What it does
|
|
168
|
+
|
|
169
|
+
- Creates a simple hello.txt file
|
|
170
|
+
- Demonstrates basic task structure
|
|
171
|
+
- Shows how to write task prompts
|
|
172
|
+
|
|
173
|
+
## Next steps
|
|
174
|
+
|
|
175
|
+
1. Review the task configuration in \`01-hello.json\`
|
|
176
|
+
2. Run the task to see CursorFlow in action
|
|
177
|
+
3. Create your own tasks based on this example
|
|
178
|
+
`;
|
|
179
|
+
fs.writeFileSync(readmePath, readme, 'utf8');
|
|
180
|
+
logger.success(`Created example README: ${path.relative(projectRoot, readmePath)}`);
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Add _cursorflow to .gitignore
|
|
184
|
+
*/
|
|
185
|
+
function updateGitignore(projectRoot) {
|
|
186
|
+
const gitignorePath = path.join(projectRoot, '.gitignore');
|
|
187
|
+
const entry = '_cursorflow/';
|
|
188
|
+
// Check if .gitignore exists
|
|
189
|
+
if (!fs.existsSync(gitignorePath)) {
|
|
190
|
+
// Create new .gitignore
|
|
191
|
+
fs.writeFileSync(gitignorePath, `# CursorFlow\n${entry}\n`, 'utf8');
|
|
192
|
+
logger.success('Created .gitignore with _cursorflow/');
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
// Read existing .gitignore
|
|
196
|
+
const content = fs.readFileSync(gitignorePath, 'utf8');
|
|
197
|
+
// Check if already included
|
|
198
|
+
const lines = content.split('\n');
|
|
199
|
+
const hasEntry = lines.some(line => {
|
|
200
|
+
const trimmed = line.trim();
|
|
201
|
+
return trimmed === '_cursorflow' ||
|
|
202
|
+
trimmed === '_cursorflow/' ||
|
|
203
|
+
trimmed === '/_cursorflow' ||
|
|
204
|
+
trimmed === '/_cursorflow/';
|
|
205
|
+
});
|
|
206
|
+
if (hasEntry) {
|
|
207
|
+
logger.info('_cursorflow/ already in .gitignore');
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
// Add entry
|
|
211
|
+
let newContent = content;
|
|
212
|
+
// Add newline if file doesn't end with one
|
|
213
|
+
if (!content.endsWith('\n')) {
|
|
214
|
+
newContent += '\n';
|
|
215
|
+
}
|
|
216
|
+
// Add section header and entry
|
|
217
|
+
newContent += `\n# CursorFlow\n${entry}\n`;
|
|
218
|
+
fs.writeFileSync(gitignorePath, newContent, 'utf8');
|
|
219
|
+
logger.success('Added _cursorflow/ to .gitignore');
|
|
220
|
+
}
|
|
221
|
+
async function init(args) {
|
|
222
|
+
logger.section('🚀 Initializing CursorFlow');
|
|
223
|
+
const options = parseArgs(args);
|
|
224
|
+
const projectRoot = (0, config_1.findProjectRoot)();
|
|
225
|
+
logger.info(`Project root: ${projectRoot}`);
|
|
226
|
+
// 1. Create config file
|
|
227
|
+
const configPath = path.join(projectRoot, 'cursorflow.config.js');
|
|
228
|
+
const configExists = fs.existsSync(configPath);
|
|
229
|
+
if (configExists && !options.force) {
|
|
230
|
+
logger.warn(`Config file already exists: ${configPath}`);
|
|
231
|
+
logger.info('Use --force to overwrite');
|
|
232
|
+
}
|
|
233
|
+
else {
|
|
234
|
+
try {
|
|
235
|
+
(0, config_1.createDefaultConfig)(projectRoot, options.force);
|
|
236
|
+
logger.success(`Created config file: cursorflow.config.js`);
|
|
237
|
+
}
|
|
238
|
+
catch (error) {
|
|
239
|
+
if (error.message.includes('already exists') && !options.force) {
|
|
240
|
+
logger.warn(error.message);
|
|
241
|
+
}
|
|
242
|
+
else {
|
|
243
|
+
throw error;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
// We need to require the config file after it might have been created
|
|
248
|
+
const config = require(configPath);
|
|
249
|
+
if (options.configOnly) {
|
|
250
|
+
logger.section('✅ Configuration initialized');
|
|
251
|
+
logger.info('\nNext steps:');
|
|
252
|
+
logger.info(' 1. Review cursorflow.config.js');
|
|
253
|
+
logger.info(' 2. Run: cursorflow init (without --config-only) to set up directories');
|
|
254
|
+
return;
|
|
255
|
+
}
|
|
256
|
+
// 2. Create directories
|
|
257
|
+
logger.info('\n📁 Creating directories...');
|
|
258
|
+
createDirectories(projectRoot, config);
|
|
259
|
+
// 3. Update .gitignore
|
|
260
|
+
if (options.gitignore) {
|
|
261
|
+
logger.info('\n📝 Updating .gitignore...');
|
|
262
|
+
try {
|
|
263
|
+
updateGitignore(projectRoot);
|
|
264
|
+
}
|
|
265
|
+
catch (error) {
|
|
266
|
+
logger.warn(`Failed to update .gitignore: ${error.message}`);
|
|
267
|
+
logger.info('You can manually add "_cursorflow/" to your .gitignore');
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
// 4. Install Cursor commands
|
|
271
|
+
if (options.withCommands) {
|
|
272
|
+
logger.info('\n📋 Installing Cursor commands...');
|
|
273
|
+
try {
|
|
274
|
+
await (0, setup_commands_1.setupCommands)({ force: options.force, silent: false });
|
|
275
|
+
}
|
|
276
|
+
catch (error) {
|
|
277
|
+
logger.warn(`Failed to install Cursor commands: ${error.message}`);
|
|
278
|
+
logger.info('You can install them later with: npx cursorflow-setup');
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
// 5. Create example tasks
|
|
282
|
+
if (options.example) {
|
|
283
|
+
logger.info('\n📝 Creating example tasks...');
|
|
284
|
+
createExampleTasks(projectRoot, config);
|
|
285
|
+
}
|
|
286
|
+
// 6. Summary
|
|
287
|
+
logger.section('✅ CursorFlow initialized successfully!');
|
|
288
|
+
console.log('\n📚 Next steps:\n');
|
|
289
|
+
console.log(' 1. Review cursorflow.config.js');
|
|
290
|
+
console.log(' 2. Type "/" in Cursor IDE to see available commands');
|
|
291
|
+
if (options.example) {
|
|
292
|
+
console.log(` 3. Run: cursorflow run ${config.tasksDir}/example/`);
|
|
293
|
+
}
|
|
294
|
+
else {
|
|
295
|
+
console.log(' 3. Create tasks with: cursorflow prepare MyFeature');
|
|
296
|
+
}
|
|
297
|
+
console.log('\n📖 Documentation:');
|
|
298
|
+
console.log(' https://github.com/eungjin-cigro/cursorflow#readme');
|
|
299
|
+
console.log('');
|
|
300
|
+
}
|
|
301
|
+
module.exports = init;
|
|
302
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,uCAAyB;AACzB,2CAA6B;AAC7B,wDAA0C;AAC1C,4CAAyF;AACzF,qDAAiD;AAUjD,SAAS,SAAS,CAAC,IAAc;IAC/B,MAAM,OAAO,GAAgB;QAC3B,OAAO,EAAE,KAAK;QACd,YAAY,EAAE,IAAI;QAClB,UAAU,EAAE,KAAK;QACjB,KAAK,EAAE,KAAK;QACZ,SAAS,EAAE,IAAI;KAChB,CAAC;IAEF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAEpB,QAAQ,GAAG,EAAE,CAAC;YACZ,KAAK,WAAW;gBACd,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;gBACvB,MAAM;YACR,KAAK,iBAAiB;gBACpB,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;gBAC5B,MAAM;YACR,KAAK,eAAe;gBAClB,OAAO,CAAC,YAAY,GAAG,KAAK,CAAC;gBAC7B,MAAM;YACR,KAAK,eAAe;gBAClB,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;gBAC1B,MAAM;YACR,KAAK,SAAS;gBACZ,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;gBACrB,MAAM;YACR,KAAK,gBAAgB;gBACnB,OAAO,CAAC,SAAS,GAAG,KAAK,CAAC;gBAC1B,MAAM;YACR,KAAK,QAAQ,CAAC;YACd,KAAK,IAAI;gBACP,SAAS,EAAE,CAAC;gBACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAChB,MAAM;QACV,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,SAAS;IAChB,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;GAmBX,CAAC,CAAC;AACL,CAAC;AAED,SAAS,iBAAiB,CAAC,WAAmB,EAAE,MAAwB;IACtE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;IACzD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IAEvD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5C,MAAM,CAAC,OAAO,CAAC,sBAAsB,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC1D,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CAAC,6BAA6B,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3C,MAAM,CAAC,OAAO,CAAC,sBAAsB,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;IACzD,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CAAC,6BAA6B,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;IAC7D,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,WAAmB,EAAE,MAAwB;IACvE,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAEtE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,CAAC;IAED,MAAM,WAAW,GAAG;QAClB,UAAU,EAAE,uCAAuC;QACnD,UAAU,EAAE,MAAM;QAClB,YAAY,EAAE,qBAAqB;QACnC,QAAQ,EAAE,cAAc;QACxB,YAAY,EAAE,KAAK;QACnB,YAAY,EAAE,EAAE;QAChB,KAAK,EAAE;YACL;gBACE,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,YAAY;gBACnB,MAAM,EAAE;;;;;;;;;CASf;aACM;SACF;KACF,CAAC;IAEF,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;IACxD,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;IAEhF,MAAM,CAAC,OAAO,CAAC,yBAAyB,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;IAEhF,gBAAgB;IAChB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;IACtD,MAAM,MAAM,GAAG;;;;;;;iBAOA,MAAM,CAAC,QAAQ;;;;;;;;;;;;;;CAc/B,CAAC;IAEA,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7C,MAAM,CAAC,OAAO,CAAC,2BAA2B,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,UAAU,CAAC,EAAE,CAAC,CAAC;AACtF,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CAAC,WAAmB;IAC1C,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IAC3D,MAAM,KAAK,GAAG,cAAc,CAAC;IAE7B,6BAA6B;IAC7B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAClC,wBAAwB;QACxB,EAAE,CAAC,aAAa,CAAC,aAAa,EAAE,iBAAiB,KAAK,IAAI,EAAE,MAAM,CAAC,CAAC;QACpE,MAAM,CAAC,OAAO,CAAC,sCAAsC,CAAC,CAAC;QACvD,OAAO;IACT,CAAC;IAED,2BAA2B;IAC3B,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;IAEvD,4BAA4B;IAC5B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;QACjC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,OAAO,OAAO,KAAK,aAAa;YACzB,OAAO,KAAK,cAAc;YAC1B,OAAO,KAAK,cAAc;YAC1B,OAAO,KAAK,eAAe,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;QAClD,OAAO;IACT,CAAC;IAED,YAAY;IACZ,IAAI,UAAU,GAAG,OAAO,CAAC;IAEzB,2CAA2C;IAC3C,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5B,UAAU,IAAI,IAAI,CAAC;IACrB,CAAC;IAED,+BAA+B;IAC/B,UAAU,IAAI,mBAAmB,KAAK,IAAI,CAAC;IAE3C,EAAE,CAAC,aAAa,CAAC,aAAa,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;IACpD,MAAM,CAAC,OAAO,CAAC,kCAAkC,CAAC,CAAC;AACrD,CAAC;AAED,KAAK,UAAU,IAAI,CAAC,IAAc;IAChC,MAAM,CAAC,OAAO,CAAC,4BAA4B,CAAC,CAAC;IAE7C,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,WAAW,GAAG,IAAA,wBAAe,GAAE,CAAC;IAEtC,MAAM,CAAC,IAAI,CAAC,iBAAiB,WAAW,EAAE,CAAC,CAAC;IAE5C,wBAAwB;IACxB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,sBAAsB,CAAC,CAAC;IAClE,MAAM,YAAY,GAAG,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IAE/C,IAAI,YAAY,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACnC,MAAM,CAAC,IAAI,CAAC,+BAA+B,UAAU,EAAE,CAAC,CAAC;QACzD,MAAM,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;IAC1C,CAAC;SAAM,CAAC;QACN,IAAI,CAAC;YACH,IAAA,4BAAmB,EAAC,WAAW,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;YAChD,MAAM,CAAC,OAAO,CAAC,2CAA2C,CAAC,CAAC;QAC9D,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;gBAC/D,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC7B,CAAC;iBAAM,CAAC;gBACN,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;IACH,CAAC;IAED,sEAAsE;IACtE,MAAM,MAAM,GAAqB,OAAO,CAAC,UAAU,CAAC,CAAC;IAErD,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QACvB,MAAM,CAAC,OAAO,CAAC,6BAA6B,CAAC,CAAC;QAC9C,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC7B,MAAM,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;QAChD,MAAM,CAAC,IAAI,CAAC,yEAAyE,CAAC,CAAC;QACvF,OAAO;IACT,CAAC;IAED,wBAAwB;IACxB,MAAM,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;IAC5C,iBAAiB,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAEvC,uBAAuB;IACvB,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACtB,MAAM,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;QAC3C,IAAI,CAAC;YACH,eAAe,CAAC,WAAW,CAAC,CAAC;QAC/B,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,MAAM,CAAC,IAAI,CAAC,gCAAgC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YAC7D,MAAM,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAC;QACxE,CAAC;IACH,CAAC;IAED,6BAA6B;IAC7B,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;QACzB,MAAM,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;QAClD,IAAI,CAAC;YACH,MAAM,IAAA,8BAAa,EAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QAC/D,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,MAAM,CAAC,IAAI,CAAC,sCAAsC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YACnE,MAAM,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;IAED,0BAA0B;IAC1B,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;QAC9C,kBAAkB,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAC1C,CAAC;IAED,aAAa;IACb,MAAM,CAAC,OAAO,CAAC,wCAAwC,CAAC,CAAC;IAEzD,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;IAClC,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;IAChD,OAAO,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;IAErE,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,4BAA4B,MAAM,CAAC,QAAQ,WAAW,CAAC,CAAC;IACtE,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC;IACtE,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;IACnC,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC;IACpE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC;AAED,iBAAS,IAAI,CAAC"}
|