@litmers/cursorflow-orchestrator 0.1.18 → 0.1.26

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 (234) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/README.md +25 -7
  3. package/commands/cursorflow-clean.md +19 -0
  4. package/commands/cursorflow-runs.md +59 -0
  5. package/commands/cursorflow-stop.md +55 -0
  6. package/dist/cli/clean.js +178 -6
  7. package/dist/cli/clean.js.map +1 -1
  8. package/dist/cli/index.js +12 -1
  9. package/dist/cli/index.js.map +1 -1
  10. package/dist/cli/init.js +8 -7
  11. package/dist/cli/init.js.map +1 -1
  12. package/dist/cli/logs.js +126 -77
  13. package/dist/cli/logs.js.map +1 -1
  14. package/dist/cli/monitor.d.ts +7 -0
  15. package/dist/cli/monitor.js +1021 -202
  16. package/dist/cli/monitor.js.map +1 -1
  17. package/dist/cli/prepare.js +39 -21
  18. package/dist/cli/prepare.js.map +1 -1
  19. package/dist/cli/resume.js +268 -163
  20. package/dist/cli/resume.js.map +1 -1
  21. package/dist/cli/run.js +11 -5
  22. package/dist/cli/run.js.map +1 -1
  23. package/dist/cli/runs.d.ts +5 -0
  24. package/dist/cli/runs.js +214 -0
  25. package/dist/cli/runs.js.map +1 -0
  26. package/dist/cli/setup-commands.js +0 -0
  27. package/dist/cli/signal.js +8 -8
  28. package/dist/cli/signal.js.map +1 -1
  29. package/dist/cli/stop.d.ts +5 -0
  30. package/dist/cli/stop.js +215 -0
  31. package/dist/cli/stop.js.map +1 -0
  32. package/dist/cli/tasks.d.ts +10 -0
  33. package/dist/cli/tasks.js +165 -0
  34. package/dist/cli/tasks.js.map +1 -0
  35. package/dist/core/auto-recovery.d.ts +212 -0
  36. package/dist/core/auto-recovery.js +737 -0
  37. package/dist/core/auto-recovery.js.map +1 -0
  38. package/dist/core/failure-policy.d.ts +156 -0
  39. package/dist/core/failure-policy.js +488 -0
  40. package/dist/core/failure-policy.js.map +1 -0
  41. package/dist/core/orchestrator.d.ts +16 -2
  42. package/dist/core/orchestrator.js +439 -105
  43. package/dist/core/orchestrator.js.map +1 -1
  44. package/dist/core/reviewer.d.ts +2 -0
  45. package/dist/core/reviewer.js +2 -0
  46. package/dist/core/reviewer.js.map +1 -1
  47. package/dist/core/runner.d.ts +33 -10
  48. package/dist/core/runner.js +374 -164
  49. package/dist/core/runner.js.map +1 -1
  50. package/dist/services/logging/buffer.d.ts +67 -0
  51. package/dist/services/logging/buffer.js +309 -0
  52. package/dist/services/logging/buffer.js.map +1 -0
  53. package/dist/services/logging/console.d.ts +89 -0
  54. package/dist/services/logging/console.js +169 -0
  55. package/dist/services/logging/console.js.map +1 -0
  56. package/dist/services/logging/file-writer.d.ts +71 -0
  57. package/dist/services/logging/file-writer.js +516 -0
  58. package/dist/services/logging/file-writer.js.map +1 -0
  59. package/dist/services/logging/formatter.d.ts +39 -0
  60. package/dist/services/logging/formatter.js +227 -0
  61. package/dist/services/logging/formatter.js.map +1 -0
  62. package/dist/services/logging/index.d.ts +11 -0
  63. package/dist/services/logging/index.js +30 -0
  64. package/dist/services/logging/index.js.map +1 -0
  65. package/dist/services/logging/parser.d.ts +31 -0
  66. package/dist/services/logging/parser.js +222 -0
  67. package/dist/services/logging/parser.js.map +1 -0
  68. package/dist/services/process/index.d.ts +59 -0
  69. package/dist/services/process/index.js +257 -0
  70. package/dist/services/process/index.js.map +1 -0
  71. package/dist/types/agent.d.ts +20 -0
  72. package/dist/types/agent.js +6 -0
  73. package/dist/types/agent.js.map +1 -0
  74. package/dist/types/config.d.ts +65 -0
  75. package/dist/types/config.js +6 -0
  76. package/dist/types/config.js.map +1 -0
  77. package/dist/types/events.d.ts +125 -0
  78. package/dist/types/events.js +6 -0
  79. package/dist/types/events.js.map +1 -0
  80. package/dist/types/index.d.ts +12 -0
  81. package/dist/types/index.js +37 -0
  82. package/dist/types/index.js.map +1 -0
  83. package/dist/types/lane.d.ts +43 -0
  84. package/dist/types/lane.js +6 -0
  85. package/dist/types/lane.js.map +1 -0
  86. package/dist/types/logging.d.ts +71 -0
  87. package/dist/types/logging.js +16 -0
  88. package/dist/types/logging.js.map +1 -0
  89. package/dist/types/review.d.ts +17 -0
  90. package/dist/types/review.js +6 -0
  91. package/dist/types/review.js.map +1 -0
  92. package/dist/types/run.d.ts +32 -0
  93. package/dist/types/run.js +6 -0
  94. package/dist/types/run.js.map +1 -0
  95. package/dist/types/task.d.ts +71 -0
  96. package/dist/types/task.js +6 -0
  97. package/dist/types/task.js.map +1 -0
  98. package/dist/ui/components.d.ts +134 -0
  99. package/dist/ui/components.js +389 -0
  100. package/dist/ui/components.js.map +1 -0
  101. package/dist/ui/log-viewer.d.ts +49 -0
  102. package/dist/ui/log-viewer.js +449 -0
  103. package/dist/ui/log-viewer.js.map +1 -0
  104. package/dist/utils/checkpoint.d.ts +87 -0
  105. package/dist/utils/checkpoint.js +317 -0
  106. package/dist/utils/checkpoint.js.map +1 -0
  107. package/dist/utils/config.d.ts +4 -0
  108. package/dist/utils/config.js +18 -8
  109. package/dist/utils/config.js.map +1 -1
  110. package/dist/utils/cursor-agent.js.map +1 -1
  111. package/dist/utils/dependency.d.ts +74 -0
  112. package/dist/utils/dependency.js +420 -0
  113. package/dist/utils/dependency.js.map +1 -0
  114. package/dist/utils/doctor.js +17 -11
  115. package/dist/utils/doctor.js.map +1 -1
  116. package/dist/utils/enhanced-logger.d.ts +10 -33
  117. package/dist/utils/enhanced-logger.js +108 -20
  118. package/dist/utils/enhanced-logger.js.map +1 -1
  119. package/dist/utils/git.d.ts +121 -0
  120. package/dist/utils/git.js +484 -11
  121. package/dist/utils/git.js.map +1 -1
  122. package/dist/utils/health.d.ts +91 -0
  123. package/dist/utils/health.js +556 -0
  124. package/dist/utils/health.js.map +1 -0
  125. package/dist/utils/lock.d.ts +95 -0
  126. package/dist/utils/lock.js +332 -0
  127. package/dist/utils/lock.js.map +1 -0
  128. package/dist/utils/log-buffer.d.ts +17 -0
  129. package/dist/utils/log-buffer.js +14 -0
  130. package/dist/utils/log-buffer.js.map +1 -0
  131. package/dist/utils/log-constants.d.ts +23 -0
  132. package/dist/utils/log-constants.js +28 -0
  133. package/dist/utils/log-constants.js.map +1 -0
  134. package/dist/utils/log-formatter.d.ts +25 -0
  135. package/dist/utils/log-formatter.js +237 -0
  136. package/dist/utils/log-formatter.js.map +1 -0
  137. package/dist/utils/log-service.d.ts +19 -0
  138. package/dist/utils/log-service.js +47 -0
  139. package/dist/utils/log-service.js.map +1 -0
  140. package/dist/utils/logger.d.ts +46 -27
  141. package/dist/utils/logger.js +82 -60
  142. package/dist/utils/logger.js.map +1 -1
  143. package/dist/utils/path.d.ts +19 -0
  144. package/dist/utils/path.js +77 -0
  145. package/dist/utils/path.js.map +1 -0
  146. package/dist/utils/process-manager.d.ts +21 -0
  147. package/dist/utils/process-manager.js +138 -0
  148. package/dist/utils/process-manager.js.map +1 -0
  149. package/dist/utils/retry.d.ts +121 -0
  150. package/dist/utils/retry.js +374 -0
  151. package/dist/utils/retry.js.map +1 -0
  152. package/dist/utils/run-service.d.ts +88 -0
  153. package/dist/utils/run-service.js +412 -0
  154. package/dist/utils/run-service.js.map +1 -0
  155. package/dist/utils/state.d.ts +62 -3
  156. package/dist/utils/state.js +317 -11
  157. package/dist/utils/state.js.map +1 -1
  158. package/dist/utils/task-service.d.ts +82 -0
  159. package/dist/utils/task-service.js +348 -0
  160. package/dist/utils/task-service.js.map +1 -0
  161. package/dist/utils/template.d.ts +14 -0
  162. package/dist/utils/template.js +122 -0
  163. package/dist/utils/template.js.map +1 -0
  164. package/dist/utils/types.d.ts +2 -271
  165. package/dist/utils/types.js +16 -0
  166. package/dist/utils/types.js.map +1 -1
  167. package/package.json +38 -23
  168. package/scripts/ai-security-check.js +0 -1
  169. package/scripts/local-security-gate.sh +0 -0
  170. package/scripts/monitor-lanes.sh +94 -0
  171. package/scripts/patches/test-cursor-agent.js +0 -1
  172. package/scripts/release.sh +0 -0
  173. package/scripts/setup-security.sh +0 -0
  174. package/scripts/stream-logs.sh +72 -0
  175. package/scripts/verify-and-fix.sh +0 -0
  176. package/src/cli/clean.ts +187 -6
  177. package/src/cli/index.ts +12 -1
  178. package/src/cli/init.ts +8 -7
  179. package/src/cli/logs.ts +124 -77
  180. package/src/cli/monitor.ts +1815 -898
  181. package/src/cli/prepare.ts +41 -21
  182. package/src/cli/resume.ts +753 -626
  183. package/src/cli/run.ts +12 -5
  184. package/src/cli/runs.ts +212 -0
  185. package/src/cli/setup-commands.ts +0 -0
  186. package/src/cli/signal.ts +8 -7
  187. package/src/cli/stop.ts +209 -0
  188. package/src/cli/tasks.ts +154 -0
  189. package/src/core/auto-recovery.ts +909 -0
  190. package/src/core/failure-policy.ts +592 -0
  191. package/src/core/orchestrator.ts +1131 -704
  192. package/src/core/reviewer.ts +4 -0
  193. package/src/core/runner.ts +444 -180
  194. package/src/services/logging/buffer.ts +326 -0
  195. package/src/services/logging/console.ts +193 -0
  196. package/src/services/logging/file-writer.ts +526 -0
  197. package/src/services/logging/formatter.ts +268 -0
  198. package/src/services/logging/index.ts +16 -0
  199. package/src/services/logging/parser.ts +232 -0
  200. package/src/services/process/index.ts +261 -0
  201. package/src/types/agent.ts +24 -0
  202. package/src/types/config.ts +79 -0
  203. package/src/types/events.ts +156 -0
  204. package/src/types/index.ts +29 -0
  205. package/src/types/lane.ts +56 -0
  206. package/src/types/logging.ts +96 -0
  207. package/src/types/review.ts +20 -0
  208. package/src/types/run.ts +37 -0
  209. package/src/types/task.ts +79 -0
  210. package/src/ui/components.ts +430 -0
  211. package/src/ui/log-viewer.ts +485 -0
  212. package/src/utils/checkpoint.ts +374 -0
  213. package/src/utils/config.ts +18 -8
  214. package/src/utils/cursor-agent.ts +1 -1
  215. package/src/utils/dependency.ts +482 -0
  216. package/src/utils/doctor.ts +18 -11
  217. package/src/utils/enhanced-logger.ts +122 -60
  218. package/src/utils/git.ts +517 -11
  219. package/src/utils/health.ts +596 -0
  220. package/src/utils/lock.ts +346 -0
  221. package/src/utils/log-buffer.ts +28 -0
  222. package/src/utils/log-constants.ts +26 -0
  223. package/src/utils/log-formatter.ts +245 -0
  224. package/src/utils/log-service.ts +49 -0
  225. package/src/utils/logger.ts +100 -51
  226. package/src/utils/path.ts +45 -0
  227. package/src/utils/process-manager.ts +100 -0
  228. package/src/utils/retry.ts +413 -0
  229. package/src/utils/run-service.ts +433 -0
  230. package/src/utils/state.ts +385 -11
  231. package/src/utils/task-service.ts +370 -0
  232. package/src/utils/template.ts +92 -0
  233. package/src/utils/types.ts +2 -314
  234. package/templates/basic.json +21 -0
@@ -9,6 +9,8 @@ import * as path from 'path';
9
9
  import * as logger from '../utils/logger';
10
10
  import { loadConfig, getTasksDir } from '../utils/config';
11
11
  import { Task, RunnerConfig } from '../utils/types';
12
+ import { safeJoin } from '../utils/path';
13
+ import { resolveTemplate } from '../utils/template';
12
14
 
13
15
  // Preset template types
14
16
  type PresetType = 'complex' | 'simple' | 'merge';
@@ -113,8 +115,8 @@ Prepare task files for a new feature - Terminal-first workflow.
113
115
  --add-task <file> Append task(s) to existing lane JSON file
114
116
 
115
117
  Advanced:
116
- --template <path> Custom template JSON file
117
- --force Overwrite existing files
118
+ --template <path|url|name> External template JSON file, URL, or built-in name
119
+ --force Overwrite existing files
118
120
 
119
121
  ═══════════════════════════════════════════════════════════════════════════════
120
122
 
@@ -523,7 +525,7 @@ function buildTasksFromOptions(
523
525
  function getDefaultConfig(laneNumber: number, featureName: string, tasks: Task[]) {
524
526
  return {
525
527
  // Git Configuration
526
- baseBranch: 'main',
528
+ // baseBranch is auto-detected from current branch at runtime
527
529
  branchPrefix: `${featureName.toLowerCase()}/lane-${laneNumber}-`,
528
530
 
529
531
  // Execution Settings
@@ -612,7 +614,7 @@ function getFeatureNameFromDir(taskDir: string): string {
612
614
  }
613
615
 
614
616
  async function addLaneToDir(options: PrepareOptions): Promise<void> {
615
- const taskDir = path.resolve(process.cwd(), options.addLane!);
617
+ const taskDir = path.resolve(process.cwd(), options.addLane!); // nosemgrep
616
618
 
617
619
  if (!fs.existsSync(taskDir)) {
618
620
  throw new Error(`Task directory not found: ${taskDir}`);
@@ -622,21 +624,42 @@ async function addLaneToDir(options: PrepareOptions): Promise<void> {
622
624
  const laneNumber = getNextLaneNumber(taskDir);
623
625
  const laneName = `lane-${laneNumber}`;
624
626
  const fileName = `${laneNumber.toString().padStart(2, '0')}-${laneName}.json`;
625
- const filePath = path.join(taskDir, fileName);
627
+ const filePath = safeJoin(taskDir, fileName);
626
628
 
627
629
  const hasDependencies = options.dependsOnLanes.length > 0;
628
630
 
629
- // Build tasks from options (auto-detects merge preset if has dependencies)
630
- const tasks = buildTasksFromOptions(options, laneNumber, featureName, hasDependencies);
631
- const config = getDefaultConfig(laneNumber, featureName, tasks);
631
+ // Load template if provided
632
+ let template = null;
633
+ if (options.template) {
634
+ template = await resolveTemplate(options.template);
635
+ }
636
+
637
+ let taskConfig;
638
+
639
+ if (template) {
640
+ taskConfig = { ...template, laneNumber, devPort: 3000 + laneNumber };
641
+ } else {
642
+ // Build tasks from options (auto-detects merge preset if has dependencies)
643
+ const tasks = buildTasksFromOptions(options, laneNumber, featureName, hasDependencies);
644
+ taskConfig = getDefaultConfig(laneNumber, featureName, tasks);
645
+ }
646
+
647
+ // Replace placeholders
648
+ const processedConfig = replacePlaceholders(taskConfig, {
649
+ featureName,
650
+ laneNumber,
651
+ devPort: 3000 + laneNumber,
652
+ });
632
653
 
633
654
  // Add dependencies if specified
634
655
  const finalConfig = {
635
- ...config,
656
+ ...processedConfig,
636
657
  ...(hasDependencies ? { dependsOn: options.dependsOnLanes } : {}),
637
658
  };
638
659
 
639
660
  // Use atomic write with wx flag to avoid TOCTOU race condition (unless force is set)
661
+ // SECURITY NOTE: Writing user-defined task configuration to the file system.
662
+ // The input is from CLI arguments and templates, used to generate CursorFlow lane files.
640
663
  try {
641
664
  const writeFlag = options.force ? 'w' : 'wx';
642
665
  fs.writeFileSync(filePath, JSON.stringify(finalConfig, null, 2) + '\n', { encoding: 'utf8', flag: writeFlag });
@@ -647,9 +670,10 @@ async function addLaneToDir(options: PrepareOptions): Promise<void> {
647
670
  throw err;
648
671
  }
649
672
 
650
- const taskSummary = tasks.map(t => t.name).join(' → ');
673
+ const tasksList = finalConfig.tasks || [];
674
+ const taskSummary = tasksList.map((t: any) => t.name).join(' → ');
651
675
  const depsInfo = hasDependencies ? ` (depends: ${options.dependsOnLanes.join(', ')})` : '';
652
- const presetInfo = options.preset ? ` [${options.preset}]` : (hasDependencies ? ' [merge]' : '');
676
+ const presetInfo = options.preset ? ` [${options.preset}]` : (hasDependencies ? ' [merge]' : (template ? ' [template]' : ''));
653
677
 
654
678
  logger.success(`Added lane: ${fileName} [${taskSummary}]${presetInfo}${depsInfo}`);
655
679
  logger.info(`Directory: ${taskDir}`);
@@ -660,7 +684,7 @@ async function addLaneToDir(options: PrepareOptions): Promise<void> {
660
684
  }
661
685
 
662
686
  async function addTaskToLane(options: PrepareOptions): Promise<void> {
663
- const laneFile = path.resolve(process.cwd(), options.addTask!);
687
+ const laneFile = path.resolve(process.cwd(), options.addTask!); // nosemgrep
664
688
 
665
689
  if (options.taskSpecs.length === 0) {
666
690
  throw new Error('No task specified. Use --task "name|model|prompt|criteria" to define a task.');
@@ -708,7 +732,7 @@ async function createNewFeature(options: PrepareOptions): Promise<void> {
708
732
  const now = new Date();
709
733
  const timestamp = now.toISOString().replace(/[-T:]/g, '').substring(2, 12);
710
734
  const taskDirName = `${timestamp}_${options.featureName}`;
711
- const taskDir = path.join(tasksBaseDir, taskDirName);
735
+ const taskDir = safeJoin(tasksBaseDir, taskDirName);
712
736
 
713
737
  if (fs.existsSync(taskDir) && !options.force) {
714
738
  throw new Error(`Task directory already exists: ${taskDir}. Use --force to overwrite.`);
@@ -723,12 +747,7 @@ async function createNewFeature(options: PrepareOptions): Promise<void> {
723
747
  // Load template if provided (overrides --prompt/--task/--preset)
724
748
  let template = null;
725
749
  if (options.template) {
726
- const templatePath = path.resolve(process.cwd(), options.template);
727
- if (!fs.existsSync(templatePath)) {
728
- throw new Error(`Template file not found: ${templatePath}`);
729
- }
730
- template = JSON.parse(fs.readFileSync(templatePath, 'utf8'));
731
- logger.info(`Using template: ${options.template}`);
750
+ template = await resolveTemplate(options.template);
732
751
  }
733
752
 
734
753
  // Calculate dependencies
@@ -741,7 +760,7 @@ async function createNewFeature(options: PrepareOptions): Promise<void> {
741
760
  for (let i = 1; i <= options.lanes; i++) {
742
761
  const laneName = `lane-${i}`;
743
762
  const fileName = `${i.toString().padStart(2, '0')}-${laneName}.json`;
744
- const filePath = path.join(taskDir, fileName);
763
+ const filePath = safeJoin(taskDir, fileName);
745
764
 
746
765
  const depNums = dependencyMap.get(i) || [];
747
766
  const dependsOn = depNums.map(n => {
@@ -778,6 +797,7 @@ async function createNewFeature(options: PrepareOptions): Promise<void> {
778
797
  ...(dependsOn.length > 0 ? { dependsOn } : {}),
779
798
  };
780
799
 
800
+ // SECURITY NOTE: Writing generated lane configuration (containing user prompts) to file system.
781
801
  fs.writeFileSync(filePath, JSON.stringify(finalConfig, null, 2) + '\n', 'utf8');
782
802
 
783
803
  const taskSummary = finalConfig.tasks?.map((t: any) => t.name).join(' → ') || 'default';
@@ -788,7 +808,7 @@ async function createNewFeature(options: PrepareOptions): Promise<void> {
788
808
  }
789
809
 
790
810
  // Create README
791
- const readmePath = path.join(taskDir, 'README.md');
811
+ const readmePath = safeJoin(taskDir, 'README.md');
792
812
  const readme = `# Task: ${options.featureName}
793
813
 
794
814
  Prepared at: ${now.toISOString()}