@litmers/cursorflow-orchestrator 0.1.3 → 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.
Files changed (74) hide show
  1. package/CHANGELOG.md +7 -6
  2. package/dist/cli/clean.d.ts +5 -0
  3. package/dist/cli/clean.js +57 -0
  4. package/dist/cli/clean.js.map +1 -0
  5. package/dist/cli/index.d.ts +6 -0
  6. package/dist/cli/index.js +120 -0
  7. package/dist/cli/index.js.map +1 -0
  8. package/dist/cli/init.d.ts +7 -0
  9. package/dist/cli/init.js +302 -0
  10. package/dist/cli/init.js.map +1 -0
  11. package/dist/cli/monitor.d.ts +8 -0
  12. package/dist/cli/monitor.js +210 -0
  13. package/dist/cli/monitor.js.map +1 -0
  14. package/dist/cli/resume.d.ts +5 -0
  15. package/dist/cli/resume.js +58 -0
  16. package/dist/cli/resume.js.map +1 -0
  17. package/dist/cli/run.d.ts +5 -0
  18. package/dist/cli/run.js +74 -0
  19. package/dist/cli/run.js.map +1 -0
  20. package/dist/cli/setup-commands.d.ts +19 -0
  21. package/dist/cli/setup-commands.js +218 -0
  22. package/dist/cli/setup-commands.js.map +1 -0
  23. package/dist/core/orchestrator.d.ts +47 -0
  24. package/dist/core/orchestrator.js +192 -0
  25. package/dist/core/orchestrator.js.map +1 -0
  26. package/dist/core/reviewer.d.ts +60 -0
  27. package/dist/core/reviewer.js +239 -0
  28. package/dist/core/reviewer.js.map +1 -0
  29. package/dist/core/runner.d.ts +49 -0
  30. package/dist/core/runner.js +475 -0
  31. package/dist/core/runner.js.map +1 -0
  32. package/dist/utils/config.d.ts +31 -0
  33. package/dist/utils/config.js +198 -0
  34. package/dist/utils/config.js.map +1 -0
  35. package/dist/utils/cursor-agent.d.ts +61 -0
  36. package/dist/utils/cursor-agent.js +263 -0
  37. package/dist/utils/cursor-agent.js.map +1 -0
  38. package/dist/utils/git.d.ts +131 -0
  39. package/dist/utils/git.js +272 -0
  40. package/dist/utils/git.js.map +1 -0
  41. package/dist/utils/logger.d.ts +68 -0
  42. package/dist/utils/logger.js +158 -0
  43. package/dist/utils/logger.js.map +1 -0
  44. package/dist/utils/state.d.ts +65 -0
  45. package/dist/utils/state.js +216 -0
  46. package/dist/utils/state.js.map +1 -0
  47. package/dist/utils/types.d.ts +117 -0
  48. package/dist/utils/types.js +6 -0
  49. package/dist/utils/types.js.map +1 -0
  50. package/examples/README.md +155 -0
  51. package/examples/demo-project/README.md +262 -0
  52. package/examples/demo-project/_cursorflow/tasks/demo-test/01-create-utils.json +18 -0
  53. package/examples/demo-project/_cursorflow/tasks/demo-test/02-add-tests.json +18 -0
  54. package/examples/demo-project/_cursorflow/tasks/demo-test/README.md +109 -0
  55. package/package.json +71 -61
  56. package/scripts/ai-security-check.js +11 -4
  57. package/scripts/local-security-gate.sh +76 -0
  58. package/src/cli/{clean.js → clean.ts} +11 -5
  59. package/src/cli/{index.js → index.ts} +22 -16
  60. package/src/cli/{init.js → init.ts} +26 -18
  61. package/src/cli/{monitor.js → monitor.ts} +57 -44
  62. package/src/cli/{resume.js → resume.ts} +11 -5
  63. package/src/cli/run.ts +54 -0
  64. package/src/cli/{setup-commands.js → setup-commands.ts} +19 -18
  65. package/src/core/{orchestrator.js → orchestrator.ts} +44 -26
  66. package/src/core/{reviewer.js → reviewer.ts} +36 -29
  67. package/src/core/{runner.js → runner.ts} +78 -56
  68. package/src/utils/{config.js → config.ts} +17 -25
  69. package/src/utils/{cursor-agent.js → cursor-agent.ts} +38 -47
  70. package/src/utils/{git.js → git.ts} +70 -56
  71. package/src/utils/{logger.js → logger.ts} +170 -178
  72. package/src/utils/{state.js → state.ts} +30 -38
  73. package/src/utils/types.ts +133 -0
  74. 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
- - Initial package structure
12
- - Core utilities (config, logger, git, cursor-agent, state)
13
- - CLI commands (init, run, monitor, clean, resume)
14
- - Cursor IDE commands (7 commands)
15
- - Configuration system
16
- - Documentation
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,5 @@
1
+ /**
2
+ * CursorFlow clean command (stub)
3
+ */
4
+ declare function clean(args: string[]): Promise<void>;
5
+ export = clean;
@@ -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,6 @@
1
+ /**
2
+ * CursorFlow CLI - Main entry point
3
+ */
4
+ declare function main(): Promise<void>;
5
+ export default main;
6
+ export { main };
@@ -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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * CursorFlow init command
3
+ *
4
+ * Initialize CursorFlow in a project
5
+ */
6
+ declare function init(args: string[]): Promise<void>;
7
+ export = init;
@@ -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":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * CursorFlow monitor command
3
+ */
4
+ /**
5
+ * Monitor lanes
6
+ */
7
+ declare function monitor(args: string[]): Promise<void>;
8
+ export = monitor;