refactor: enhance add-task fuzzy search and fix duplicate banner display
- **Remove hardcoded category system** in add-task that always matched 'Task management' - **Eliminate arbitrary limits** in fuzzy search results (5→25 high relevance, 3→10 medium relevance, 8→20 detailed tasks) - **Improve semantic weighting** in Fuse.js search (details=3, description=2, title=1.5) for better relevance - **Fix duplicate banner issue** by removing console.clear() and redundant displayBanner() calls from UI functions - **Enhance context generation** to rely on semantic similarity rather than rigid pattern matching - **Preserve terminal history** to address GitHub issue #553 about eating terminal lines - **Remove displayBanner() calls** from: displayHelp, displayNextTask, displayTaskById, displayComplexityReport, set-task-status, clear-subtasks, dependency-manager functions The add-task system now provides truly relevant task context based on semantic similarity rather than arbitrary categories and limits, while maintaining a cleaner terminal experience. Changes span: add-task.js, ui.js, set-task-status.js, clear-subtasks.js, list-tasks.js, dependency-manager.js Closes #553
This commit is contained in:
@@ -40,7 +40,7 @@ const warmGradient = gradient(["#fb8b24", "#e36414", "#9a031e"]);
|
||||
function displayBanner() {
|
||||
if (isSilentMode()) return;
|
||||
|
||||
console.clear();
|
||||
// console.clear(); // Removing this to avoid clearing the terminal per command
|
||||
const bannerText = figlet.textSync("Task Master", {
|
||||
font: "Standard",
|
||||
horizontalLayout: "default",
|
||||
@@ -78,6 +78,8 @@ function displayBanner() {
|
||||
* @returns {Object} Spinner object
|
||||
*/
|
||||
function startLoadingIndicator(message) {
|
||||
if (isSilentMode()) return null;
|
||||
|
||||
const spinner = ora({
|
||||
text: message,
|
||||
color: "cyan",
|
||||
@@ -87,15 +89,75 @@ function startLoadingIndicator(message) {
|
||||
}
|
||||
|
||||
/**
|
||||
* Stop a loading indicator
|
||||
* Stop a loading indicator (basic stop, no success/fail indicator)
|
||||
* @param {Object} spinner - Spinner object to stop
|
||||
*/
|
||||
function stopLoadingIndicator(spinner) {
|
||||
if (spinner && spinner.stop) {
|
||||
if (spinner && typeof spinner.stop === "function") {
|
||||
spinner.stop();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Complete a loading indicator with success (shows checkmark)
|
||||
* @param {Object} spinner - Spinner object to complete
|
||||
* @param {string} message - Optional success message (defaults to current text)
|
||||
*/
|
||||
function succeedLoadingIndicator(spinner, message = null) {
|
||||
if (spinner && typeof spinner.succeed === "function") {
|
||||
if (message) {
|
||||
spinner.succeed(message);
|
||||
} else {
|
||||
spinner.succeed();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Complete a loading indicator with failure (shows X)
|
||||
* @param {Object} spinner - Spinner object to fail
|
||||
* @param {string} message - Optional failure message (defaults to current text)
|
||||
*/
|
||||
function failLoadingIndicator(spinner, message = null) {
|
||||
if (spinner && typeof spinner.fail === "function") {
|
||||
if (message) {
|
||||
spinner.fail(message);
|
||||
} else {
|
||||
spinner.fail();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Complete a loading indicator with warning (shows warning symbol)
|
||||
* @param {Object} spinner - Spinner object to warn
|
||||
* @param {string} message - Optional warning message (defaults to current text)
|
||||
*/
|
||||
function warnLoadingIndicator(spinner, message = null) {
|
||||
if (spinner && typeof spinner.warn === "function") {
|
||||
if (message) {
|
||||
spinner.warn(message);
|
||||
} else {
|
||||
spinner.warn();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Complete a loading indicator with info (shows info symbol)
|
||||
* @param {Object} spinner - Spinner object to complete with info
|
||||
* @param {string} message - Optional info message (defaults to current text)
|
||||
*/
|
||||
function infoLoadingIndicator(spinner, message = null) {
|
||||
if (spinner && typeof spinner.info === "function") {
|
||||
if (message) {
|
||||
spinner.info(message);
|
||||
} else {
|
||||
spinner.info();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a colored progress bar
|
||||
* @param {number} percent - The completion percentage
|
||||
@@ -232,14 +294,14 @@ function getStatusWithColor(status, forTable = false) {
|
||||
}
|
||||
|
||||
const statusConfig = {
|
||||
done: { color: chalk.green, icon: "✅", tableIcon: "✓" },
|
||||
completed: { color: chalk.green, icon: "✅", tableIcon: "✓" },
|
||||
pending: { color: chalk.yellow, icon: "⏱️", tableIcon: "⏱" },
|
||||
done: { color: chalk.green, icon: "✓", tableIcon: "✓" },
|
||||
completed: { color: chalk.green, icon: "✓", tableIcon: "✓" },
|
||||
pending: { color: chalk.yellow, icon: "○", tableIcon: "⏱" },
|
||||
"in-progress": { color: chalk.hex("#FFA500"), icon: "🔄", tableIcon: "►" },
|
||||
deferred: { color: chalk.gray, icon: "⏱️", tableIcon: "⏱" },
|
||||
blocked: { color: chalk.red, icon: "❌", tableIcon: "✗" },
|
||||
review: { color: chalk.magenta, icon: "👀", tableIcon: "👁" },
|
||||
cancelled: { color: chalk.gray, icon: "❌", tableIcon: "✗" },
|
||||
deferred: { color: chalk.gray, icon: "x", tableIcon: "⏱" },
|
||||
blocked: { color: chalk.red, icon: "!", tableIcon: "✗" },
|
||||
review: { color: chalk.magenta, icon: "?", tableIcon: "?" },
|
||||
cancelled: { color: chalk.gray, icon: "❌", tableIcon: "x" },
|
||||
};
|
||||
|
||||
const config = statusConfig[status.toLowerCase()] || {
|
||||
@@ -383,8 +445,6 @@ function formatDependenciesWithStatus(
|
||||
* Display a comprehensive help guide
|
||||
*/
|
||||
function displayHelp() {
|
||||
displayBanner();
|
||||
|
||||
// Get terminal width - moved to top of function to make it available throughout
|
||||
const terminalWidth = process.stdout.columns || 100; // Default to 100 if can't detect
|
||||
|
||||
@@ -767,8 +827,6 @@ function truncateString(str, maxLength) {
|
||||
* @param {string} tasksPath - Path to the tasks.json file
|
||||
*/
|
||||
async function displayNextTask(tasksPath, complexityReportPath = null) {
|
||||
displayBanner();
|
||||
|
||||
// Read the tasks file
|
||||
const data = readJSON(tasksPath);
|
||||
if (!data || !data.tasks) {
|
||||
@@ -1039,8 +1097,6 @@ async function displayTaskById(
|
||||
complexityReportPath = null,
|
||||
statusFilter = null
|
||||
) {
|
||||
displayBanner();
|
||||
|
||||
// Read the tasks file
|
||||
const data = readJSON(tasksPath);
|
||||
if (!data || !data.tasks) {
|
||||
@@ -1495,8 +1551,6 @@ async function displayTaskById(
|
||||
* @param {string} reportPath - Path to the complexity report file
|
||||
*/
|
||||
async function displayComplexityReport(reportPath) {
|
||||
displayBanner();
|
||||
|
||||
// Check if the report exists
|
||||
if (!fs.existsSync(reportPath)) {
|
||||
console.log(
|
||||
@@ -2094,4 +2148,8 @@ export {
|
||||
displayModelConfiguration,
|
||||
displayAvailableModels,
|
||||
displayAiUsageSummary,
|
||||
succeedLoadingIndicator,
|
||||
failLoadingIndicator,
|
||||
warnLoadingIndicator,
|
||||
infoLoadingIndicator,
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user