@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.
- package/CHANGELOG.md +25 -0
- package/README.md +25 -7
- package/commands/cursorflow-clean.md +19 -0
- package/commands/cursorflow-runs.md +59 -0
- package/commands/cursorflow-stop.md +55 -0
- package/dist/cli/clean.js +178 -6
- package/dist/cli/clean.js.map +1 -1
- package/dist/cli/index.js +12 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/init.js +8 -7
- package/dist/cli/init.js.map +1 -1
- package/dist/cli/logs.js +126 -77
- package/dist/cli/logs.js.map +1 -1
- package/dist/cli/monitor.d.ts +7 -0
- package/dist/cli/monitor.js +1021 -202
- package/dist/cli/monitor.js.map +1 -1
- package/dist/cli/prepare.js +39 -21
- package/dist/cli/prepare.js.map +1 -1
- package/dist/cli/resume.js +268 -163
- package/dist/cli/resume.js.map +1 -1
- package/dist/cli/run.js +11 -5
- package/dist/cli/run.js.map +1 -1
- package/dist/cli/runs.d.ts +5 -0
- package/dist/cli/runs.js +214 -0
- package/dist/cli/runs.js.map +1 -0
- package/dist/cli/setup-commands.js +0 -0
- package/dist/cli/signal.js +8 -8
- package/dist/cli/signal.js.map +1 -1
- package/dist/cli/stop.d.ts +5 -0
- package/dist/cli/stop.js +215 -0
- package/dist/cli/stop.js.map +1 -0
- package/dist/cli/tasks.d.ts +10 -0
- package/dist/cli/tasks.js +165 -0
- package/dist/cli/tasks.js.map +1 -0
- package/dist/core/auto-recovery.d.ts +212 -0
- package/dist/core/auto-recovery.js +737 -0
- package/dist/core/auto-recovery.js.map +1 -0
- package/dist/core/failure-policy.d.ts +156 -0
- package/dist/core/failure-policy.js +488 -0
- package/dist/core/failure-policy.js.map +1 -0
- package/dist/core/orchestrator.d.ts +16 -2
- package/dist/core/orchestrator.js +439 -105
- package/dist/core/orchestrator.js.map +1 -1
- package/dist/core/reviewer.d.ts +2 -0
- package/dist/core/reviewer.js +2 -0
- package/dist/core/reviewer.js.map +1 -1
- package/dist/core/runner.d.ts +33 -10
- package/dist/core/runner.js +374 -164
- package/dist/core/runner.js.map +1 -1
- package/dist/services/logging/buffer.d.ts +67 -0
- package/dist/services/logging/buffer.js +309 -0
- package/dist/services/logging/buffer.js.map +1 -0
- package/dist/services/logging/console.d.ts +89 -0
- package/dist/services/logging/console.js +169 -0
- package/dist/services/logging/console.js.map +1 -0
- package/dist/services/logging/file-writer.d.ts +71 -0
- package/dist/services/logging/file-writer.js +516 -0
- package/dist/services/logging/file-writer.js.map +1 -0
- package/dist/services/logging/formatter.d.ts +39 -0
- package/dist/services/logging/formatter.js +227 -0
- package/dist/services/logging/formatter.js.map +1 -0
- package/dist/services/logging/index.d.ts +11 -0
- package/dist/services/logging/index.js +30 -0
- package/dist/services/logging/index.js.map +1 -0
- package/dist/services/logging/parser.d.ts +31 -0
- package/dist/services/logging/parser.js +222 -0
- package/dist/services/logging/parser.js.map +1 -0
- package/dist/services/process/index.d.ts +59 -0
- package/dist/services/process/index.js +257 -0
- package/dist/services/process/index.js.map +1 -0
- package/dist/types/agent.d.ts +20 -0
- package/dist/types/agent.js +6 -0
- package/dist/types/agent.js.map +1 -0
- package/dist/types/config.d.ts +65 -0
- package/dist/types/config.js +6 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/events.d.ts +125 -0
- package/dist/types/events.js +6 -0
- package/dist/types/events.js.map +1 -0
- package/dist/types/index.d.ts +12 -0
- package/dist/types/index.js +37 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/lane.d.ts +43 -0
- package/dist/types/lane.js +6 -0
- package/dist/types/lane.js.map +1 -0
- package/dist/types/logging.d.ts +71 -0
- package/dist/types/logging.js +16 -0
- package/dist/types/logging.js.map +1 -0
- package/dist/types/review.d.ts +17 -0
- package/dist/types/review.js +6 -0
- package/dist/types/review.js.map +1 -0
- package/dist/types/run.d.ts +32 -0
- package/dist/types/run.js +6 -0
- package/dist/types/run.js.map +1 -0
- package/dist/types/task.d.ts +71 -0
- package/dist/types/task.js +6 -0
- package/dist/types/task.js.map +1 -0
- package/dist/ui/components.d.ts +134 -0
- package/dist/ui/components.js +389 -0
- package/dist/ui/components.js.map +1 -0
- package/dist/ui/log-viewer.d.ts +49 -0
- package/dist/ui/log-viewer.js +449 -0
- package/dist/ui/log-viewer.js.map +1 -0
- package/dist/utils/checkpoint.d.ts +87 -0
- package/dist/utils/checkpoint.js +317 -0
- package/dist/utils/checkpoint.js.map +1 -0
- package/dist/utils/config.d.ts +4 -0
- package/dist/utils/config.js +18 -8
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/cursor-agent.js.map +1 -1
- package/dist/utils/dependency.d.ts +74 -0
- package/dist/utils/dependency.js +420 -0
- package/dist/utils/dependency.js.map +1 -0
- package/dist/utils/doctor.js +17 -11
- package/dist/utils/doctor.js.map +1 -1
- package/dist/utils/enhanced-logger.d.ts +10 -33
- package/dist/utils/enhanced-logger.js +108 -20
- package/dist/utils/enhanced-logger.js.map +1 -1
- package/dist/utils/git.d.ts +121 -0
- package/dist/utils/git.js +484 -11
- package/dist/utils/git.js.map +1 -1
- package/dist/utils/health.d.ts +91 -0
- package/dist/utils/health.js +556 -0
- package/dist/utils/health.js.map +1 -0
- package/dist/utils/lock.d.ts +95 -0
- package/dist/utils/lock.js +332 -0
- package/dist/utils/lock.js.map +1 -0
- package/dist/utils/log-buffer.d.ts +17 -0
- package/dist/utils/log-buffer.js +14 -0
- package/dist/utils/log-buffer.js.map +1 -0
- package/dist/utils/log-constants.d.ts +23 -0
- package/dist/utils/log-constants.js +28 -0
- package/dist/utils/log-constants.js.map +1 -0
- package/dist/utils/log-formatter.d.ts +25 -0
- package/dist/utils/log-formatter.js +237 -0
- package/dist/utils/log-formatter.js.map +1 -0
- package/dist/utils/log-service.d.ts +19 -0
- package/dist/utils/log-service.js +47 -0
- package/dist/utils/log-service.js.map +1 -0
- package/dist/utils/logger.d.ts +46 -27
- package/dist/utils/logger.js +82 -60
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/path.d.ts +19 -0
- package/dist/utils/path.js +77 -0
- package/dist/utils/path.js.map +1 -0
- package/dist/utils/process-manager.d.ts +21 -0
- package/dist/utils/process-manager.js +138 -0
- package/dist/utils/process-manager.js.map +1 -0
- package/dist/utils/retry.d.ts +121 -0
- package/dist/utils/retry.js +374 -0
- package/dist/utils/retry.js.map +1 -0
- package/dist/utils/run-service.d.ts +88 -0
- package/dist/utils/run-service.js +412 -0
- package/dist/utils/run-service.js.map +1 -0
- package/dist/utils/state.d.ts +62 -3
- package/dist/utils/state.js +317 -11
- package/dist/utils/state.js.map +1 -1
- package/dist/utils/task-service.d.ts +82 -0
- package/dist/utils/task-service.js +348 -0
- package/dist/utils/task-service.js.map +1 -0
- package/dist/utils/template.d.ts +14 -0
- package/dist/utils/template.js +122 -0
- package/dist/utils/template.js.map +1 -0
- package/dist/utils/types.d.ts +2 -271
- package/dist/utils/types.js +16 -0
- package/dist/utils/types.js.map +1 -1
- package/package.json +38 -23
- package/scripts/ai-security-check.js +0 -1
- package/scripts/local-security-gate.sh +0 -0
- package/scripts/monitor-lanes.sh +94 -0
- package/scripts/patches/test-cursor-agent.js +0 -1
- package/scripts/release.sh +0 -0
- package/scripts/setup-security.sh +0 -0
- package/scripts/stream-logs.sh +72 -0
- package/scripts/verify-and-fix.sh +0 -0
- package/src/cli/clean.ts +187 -6
- package/src/cli/index.ts +12 -1
- package/src/cli/init.ts +8 -7
- package/src/cli/logs.ts +124 -77
- package/src/cli/monitor.ts +1815 -898
- package/src/cli/prepare.ts +41 -21
- package/src/cli/resume.ts +753 -626
- package/src/cli/run.ts +12 -5
- package/src/cli/runs.ts +212 -0
- package/src/cli/setup-commands.ts +0 -0
- package/src/cli/signal.ts +8 -7
- package/src/cli/stop.ts +209 -0
- package/src/cli/tasks.ts +154 -0
- package/src/core/auto-recovery.ts +909 -0
- package/src/core/failure-policy.ts +592 -0
- package/src/core/orchestrator.ts +1131 -704
- package/src/core/reviewer.ts +4 -0
- package/src/core/runner.ts +444 -180
- package/src/services/logging/buffer.ts +326 -0
- package/src/services/logging/console.ts +193 -0
- package/src/services/logging/file-writer.ts +526 -0
- package/src/services/logging/formatter.ts +268 -0
- package/src/services/logging/index.ts +16 -0
- package/src/services/logging/parser.ts +232 -0
- package/src/services/process/index.ts +261 -0
- package/src/types/agent.ts +24 -0
- package/src/types/config.ts +79 -0
- package/src/types/events.ts +156 -0
- package/src/types/index.ts +29 -0
- package/src/types/lane.ts +56 -0
- package/src/types/logging.ts +96 -0
- package/src/types/review.ts +20 -0
- package/src/types/run.ts +37 -0
- package/src/types/task.ts +79 -0
- package/src/ui/components.ts +430 -0
- package/src/ui/log-viewer.ts +485 -0
- package/src/utils/checkpoint.ts +374 -0
- package/src/utils/config.ts +18 -8
- package/src/utils/cursor-agent.ts +1 -1
- package/src/utils/dependency.ts +482 -0
- package/src/utils/doctor.ts +18 -11
- package/src/utils/enhanced-logger.ts +122 -60
- package/src/utils/git.ts +517 -11
- package/src/utils/health.ts +596 -0
- package/src/utils/lock.ts +346 -0
- package/src/utils/log-buffer.ts +28 -0
- package/src/utils/log-constants.ts +26 -0
- package/src/utils/log-formatter.ts +245 -0
- package/src/utils/log-service.ts +49 -0
- package/src/utils/logger.ts +100 -51
- package/src/utils/path.ts +45 -0
- package/src/utils/process-manager.ts +100 -0
- package/src/utils/retry.ts +413 -0
- package/src/utils/run-service.ts +433 -0
- package/src/utils/state.ts +385 -11
- package/src/utils/task-service.ts +370 -0
- package/src/utils/template.ts +92 -0
- package/src/utils/types.ts +2 -314
- package/templates/basic.json +21 -0
package/src/cli/prepare.ts
CHANGED
|
@@ -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>
|
|
117
|
-
--force
|
|
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
|
|
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 =
|
|
627
|
+
const filePath = safeJoin(taskDir, fileName);
|
|
626
628
|
|
|
627
629
|
const hasDependencies = options.dependsOnLanes.length > 0;
|
|
628
630
|
|
|
629
|
-
//
|
|
630
|
-
|
|
631
|
-
|
|
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
|
-
...
|
|
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
|
|
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 =
|
|
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
|
-
|
|
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 =
|
|
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 =
|
|
811
|
+
const readmePath = safeJoin(taskDir, 'README.md');
|
|
792
812
|
const readme = `# Task: ${options.featureName}
|
|
793
813
|
|
|
794
814
|
Prepared at: ${now.toISOString()}
|