mirror of
https://github.com/AutoMaker-Org/automaker.git
synced 2026-02-01 08:13:37 +00:00
- Add graceful shutdown handler that marks running features as 'interrupted' before server exit (SIGTERM/SIGINT) - Add 30-second shutdown timeout to prevent hanging on exit - Add orphan detection to identify features with missing branches - Add isFeatureRunning() for idempotent resume checks - Improve resumeInterruptedFeatures() to handle features without saved context - Add 'interrupted' status to FeatureStatusWithPipeline type - Replace console.log with proper logger in auto-mode-service - Add comprehensive unit tests for all new functionality (15 new tests) Fixes #696 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
67 lines
2.7 KiB
TypeScript
67 lines
2.7 KiB
TypeScript
/**
|
|
* Features routes - HTTP API for feature management
|
|
*/
|
|
|
|
import { Router } from 'express';
|
|
import { FeatureLoader } from '../../services/feature-loader.js';
|
|
import type { SettingsService } from '../../services/settings-service.js';
|
|
import type { AutoModeService } from '../../services/auto-mode-service.js';
|
|
import type { EventEmitter } from '../../lib/events.js';
|
|
import { validatePathParams } from '../../middleware/validate-paths.js';
|
|
import { createListHandler } from './routes/list.js';
|
|
import { createGetHandler } from './routes/get.js';
|
|
import { createCreateHandler } from './routes/create.js';
|
|
import { createUpdateHandler } from './routes/update.js';
|
|
import { createBulkUpdateHandler } from './routes/bulk-update.js';
|
|
import { createBulkDeleteHandler } from './routes/bulk-delete.js';
|
|
import { createDeleteHandler } from './routes/delete.js';
|
|
import { createAgentOutputHandler, createRawOutputHandler } from './routes/agent-output.js';
|
|
import { createGenerateTitleHandler } from './routes/generate-title.js';
|
|
import { createExportHandler } from './routes/export.js';
|
|
import { createImportHandler, createConflictCheckHandler } from './routes/import.js';
|
|
|
|
export function createFeaturesRoutes(
|
|
featureLoader: FeatureLoader,
|
|
settingsService?: SettingsService,
|
|
events?: EventEmitter,
|
|
autoModeService?: AutoModeService
|
|
): Router {
|
|
const router = Router();
|
|
|
|
router.post(
|
|
'/list',
|
|
validatePathParams('projectPath'),
|
|
createListHandler(featureLoader, autoModeService)
|
|
);
|
|
router.post('/get', validatePathParams('projectPath'), createGetHandler(featureLoader));
|
|
router.post(
|
|
'/create',
|
|
validatePathParams('projectPath'),
|
|
createCreateHandler(featureLoader, events)
|
|
);
|
|
router.post('/update', validatePathParams('projectPath'), createUpdateHandler(featureLoader));
|
|
router.post(
|
|
'/bulk-update',
|
|
validatePathParams('projectPath'),
|
|
createBulkUpdateHandler(featureLoader)
|
|
);
|
|
router.post(
|
|
'/bulk-delete',
|
|
validatePathParams('projectPath'),
|
|
createBulkDeleteHandler(featureLoader)
|
|
);
|
|
router.post('/delete', validatePathParams('projectPath'), createDeleteHandler(featureLoader));
|
|
router.post('/agent-output', createAgentOutputHandler(featureLoader));
|
|
router.post('/raw-output', createRawOutputHandler(featureLoader));
|
|
router.post('/generate-title', createGenerateTitleHandler(settingsService));
|
|
router.post('/export', validatePathParams('projectPath'), createExportHandler(featureLoader));
|
|
router.post('/import', validatePathParams('projectPath'), createImportHandler(featureLoader));
|
|
router.post(
|
|
'/check-conflicts',
|
|
validatePathParams('projectPath'),
|
|
createConflictCheckHandler(featureLoader)
|
|
);
|
|
|
|
return router;
|
|
}
|