diff --git a/_data/tasks.js b/_data/tasks.js index c93ac33..78d1e97 100644 --- a/_data/tasks.js +++ b/_data/tasks.js @@ -91,11 +91,27 @@ module.exports = async function() { // Extract title from first H1 const titleMatch = content.match(/^#\s+(.+)$/m); - const title = titleMatch ? titleMatch[1] : dir.name; + let title = titleMatch ? titleMatch[1] : dir.name; + + // Extract task number from title (e.g., "Task #87:" or "# Task #87") + let taskNumber = null; + const taskNumMatch = title.match(/#(\d+)/); + if (taskNumMatch) { + taskNumber = taskNumMatch[1]; + } else { + // Try to find task number in content + const contentNumMatch = content.match(/\*\*Task ID:\*\*\s*#?(\d+)/i) || + content.match(/Task #(\d+)/i) || + content.match(/\*\*Task ID:\*\*\s*FFG-TASK-(\d+)/i); + if (contentNumMatch) { + taskNumber = contentNumMatch[1]; + } + } tasks.push({ slug: dir.name, title: title, + taskNumber: taskNumber, status: frontmatter.status || 'open', priority: frontmatter.priority || 'P3', owner: frontmatter.owner || 'Michael', @@ -109,11 +125,18 @@ module.exports = async function() { } } - // Sort by priority (P1 first) then by title + // Sort by priority (P1 first) then by task number (if available) then by title tasks.sort((a, b) => { if (a.priority !== b.priority) { return a.priority.localeCompare(b.priority); } + // Sort by task number if both have one + if (a.taskNumber && b.taskNumber) { + return parseInt(a.taskNumber) - parseInt(b.taskNumber); + } + // Tasks with numbers come before those without + if (a.taskNumber && !b.taskNumber) return -1; + if (!a.taskNumber && b.taskNumber) return 1; return a.title.localeCompare(b.title); }); @@ -122,7 +145,6 @@ module.exports = async function() { } catch (err) { console.error('[11ty] Error fetching tasks:', err.message); - // Return empty array - page will still build, just with no tasks return []; } }; diff --git a/node_modules/.package-lock.json b/node_modules/.package-lock.json index 2981b55..c0985bb 100644 --- a/node_modules/.package-lock.json +++ b/node_modules/.package-lock.json @@ -1195,6 +1195,26 @@ "dev": true, "license": "MIT" }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, "node_modules/node-retrieve-globals": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/node-retrieve-globals/-/node-retrieve-globals-6.0.1.tgz", @@ -1580,6 +1600,12 @@ "node": ">=0.6" } }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" + }, "node_modules/uc.micro": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", @@ -1604,6 +1630,22 @@ "dev": true, "license": "MIT" }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/ws": { "version": "8.20.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.20.0.tgz", diff --git a/tasks-index.njk b/tasks-index.njk index 783ed21..c14d1df 100644 --- a/tasks-index.njk +++ b/tasks-index.njk @@ -136,11 +136,18 @@ permalink: /tasks-index.html text-decoration: underline; } + .task-number { + color: var(--gold); + font-weight: 700; + margin-right: 6px; + } + .priority-badge { font-size: 0.75rem; padding: 2px 8px; border-radius: 4px; font-weight: 600; + white-space: nowrap; } .priority-badge.P1 { background: var(--fire); } @@ -208,7 +215,7 @@ permalink: /tasks-index.html