feat(FN-2202): reposition and restyle task card agent badge

- Move the assigned agent badge out of the card header into a dedicated metadata row below task details
- Add a new .card-agent-row container to control spacing and alignment for the badge block
- Update .card-agent-badge styling to use token-aligned pill radius and color-mix backgrounds while removing monospace/fixed-width conventions
- Expand TaskCard agent badge tests to verify new DOM placement and enforced badge style rules
This commit is contained in:
Fusion
2026-04-20 23:32:31 -07:00
committed by gsxdsm
parent 56fb6cbc1f
commit c9b20fd1a0
9 changed files with 252 additions and 55 deletions

View File

@@ -59,28 +59,110 @@ function configurePiPackage(): void {
configurePiPackage();
// Dynamic imports so the pi-coding-agent config module sees PI_PACKAGE_DIR
const { runDashboard } = await import("./commands/dashboard.js");
const { runServe } = await import("./commands/serve.js");
const { runDaemon } = await import("./commands/daemon.js");
const { runDesktop } = await import("./commands/desktop.js");
const { runTaskCreate, runTaskList, runTaskMove, runTaskMerge, runTaskUpdate, runTaskLog, runTaskLogs, runTaskShow, runTaskAttach, runTaskPause, runTaskUnpause, runTaskImportFromGitHub, runTaskDuplicate, runTaskArchive, runTaskUnarchive, runTaskRefine, runTaskPlan, runTaskDelete, runTaskRetry, runTaskComment, runTaskComments, runTaskSteer, runTaskPrCreate } = await import("./commands/task.js");
const { runSettingsShow, runSettingsSet } = await import("./commands/settings.js");
const { runSettingsExport } = await import("./commands/settings-export.js");
const { runSettingsImport } = await import("./commands/settings-import.js");
const { runGitStatus, runGitFetch, runGitPull, runGitPush } = await import("./commands/git.js");
const { runBackupCreate, runBackupList, runBackupRestore, runBackupCleanup } = await import("./commands/backup.js");
const { runMissionCreate, runMissionList, runMissionShow, runMissionDelete, runMissionActivateSlice } = await import("./commands/mission.js");
const { runProjectList, runProjectAdd, runProjectRemove, runProjectShow, runProjectInfo, runProjectSetDefault, runProjectDetect } = await import("./commands/project.js");
const { runNodeList, runNodeConnect, runNodeDisconnect, runNodeShow, runNodeHealth, runMeshStatus } = await import("./commands/node.js");
const { runInit } = await import("./commands/init.js");
const { runAgentStop, runAgentStart } = await import("./commands/agent.js");
const { runAgentImport } = await import("./commands/agent-import.js");
const { runAgentExport } = await import("./commands/agent-export.js");
const { runMessageInbox, runMessageOutbox, runMessageSend, runMessageRead, runMessageDelete, runAgentMailbox } = await import("./commands/message.js");
const { runPluginList, runPluginInstall, runPluginUninstall, runPluginEnable, runPluginDisable } = await import("./commands/plugin.js");
const { runPluginCreate } = await import("./commands/plugin-scaffold.js");
const { runSkillsSearch, runSkillsInstall } = await import("./commands/skills.js");
// Command handlers are loaded lazily so --help can return immediately
// without importing the full command graph.
async function loadCommandHandlers() {
const { runDashboard } = await import("./commands/dashboard.js");
const { runServe } = await import("./commands/serve.js");
const { runDaemon } = await import("./commands/daemon.js");
const { runDesktop } = await import("./commands/desktop.js");
const { runTaskCreate, runTaskList, runTaskMove, runTaskMerge, runTaskUpdate, runTaskLog, runTaskLogs, runTaskShow, runTaskAttach, runTaskPause, runTaskUnpause, runTaskImportFromGitHub, runTaskDuplicate, runTaskArchive, runTaskUnarchive, runTaskRefine, runTaskPlan, runTaskDelete, runTaskRetry, runTaskComment, runTaskComments, runTaskSteer, runTaskPrCreate } = await import("./commands/task.js");
const { runSettingsShow, runSettingsSet } = await import("./commands/settings.js");
const { runSettingsExport } = await import("./commands/settings-export.js");
const { runSettingsImport } = await import("./commands/settings-import.js");
const { runGitStatus, runGitFetch, runGitPull, runGitPush } = await import("./commands/git.js");
const { runBackupCreate, runBackupList, runBackupRestore, runBackupCleanup } = await import("./commands/backup.js");
const { runMissionCreate, runMissionList, runMissionShow, runMissionDelete, runMissionActivateSlice } = await import("./commands/mission.js");
const { runProjectList, runProjectAdd, runProjectRemove, runProjectShow, runProjectInfo, runProjectSetDefault, runProjectDetect } = await import("./commands/project.js");
const { runNodeList, runNodeConnect, runNodeDisconnect, runNodeShow, runNodeHealth, runMeshStatus } = await import("./commands/node.js");
const { runInit } = await import("./commands/init.js");
const { runAgentStop, runAgentStart } = await import("./commands/agent.js");
const { runAgentImport } = await import("./commands/agent-import.js");
const { runAgentExport } = await import("./commands/agent-export.js");
const { runMessageInbox, runMessageOutbox, runMessageSend, runMessageRead, runMessageDelete, runAgentMailbox } = await import("./commands/message.js");
const { runPluginList, runPluginInstall, runPluginUninstall, runPluginEnable, runPluginDisable } = await import("./commands/plugin.js");
const { runPluginCreate } = await import("./commands/plugin-scaffold.js");
const { runSkillsSearch, runSkillsInstall } = await import("./commands/skills.js");
return {
runDashboard,
runServe,
runDaemon,
runDesktop,
runTaskCreate,
runTaskList,
runTaskMove,
runTaskMerge,
runTaskUpdate,
runTaskLog,
runTaskLogs,
runTaskShow,
runTaskAttach,
runTaskPause,
runTaskUnpause,
runTaskImportFromGitHub,
runTaskDuplicate,
runTaskArchive,
runTaskUnarchive,
runTaskRefine,
runTaskPlan,
runTaskDelete,
runTaskRetry,
runTaskComment,
runTaskComments,
runTaskSteer,
runTaskPrCreate,
runSettingsShow,
runSettingsSet,
runSettingsExport,
runSettingsImport,
runGitStatus,
runGitFetch,
runGitPull,
runGitPush,
runBackupCreate,
runBackupList,
runBackupRestore,
runBackupCleanup,
runMissionCreate,
runMissionList,
runMissionShow,
runMissionDelete,
runMissionActivateSlice,
runProjectList,
runProjectAdd,
runProjectRemove,
runProjectShow,
runProjectInfo,
runProjectSetDefault,
runProjectDetect,
runNodeList,
runNodeConnect,
runNodeDisconnect,
runNodeShow,
runNodeHealth,
runMeshStatus,
runInit,
runAgentStop,
runAgentStart,
runAgentImport,
runAgentExport,
runMessageInbox,
runMessageOutbox,
runMessageSend,
runMessageRead,
runMessageDelete,
runAgentMailbox,
runPluginList,
runPluginInstall,
runPluginUninstall,
runPluginEnable,
runPluginDisable,
runPluginCreate,
runSkillsSearch,
runSkillsInstall,
};
}
const HELP = `
fn — AI-orchestrated task board
@@ -315,6 +397,85 @@ async function main() {
await checkAndMigrate();
}
const {
runDashboard,
runServe,
runDaemon,
runDesktop,
runTaskCreate,
runTaskList,
runTaskMove,
runTaskMerge,
runTaskUpdate,
runTaskLog,
runTaskLogs,
runTaskShow,
runTaskAttach,
runTaskPause,
runTaskUnpause,
runTaskImportFromGitHub,
runTaskDuplicate,
runTaskArchive,
runTaskUnarchive,
runTaskRefine,
runTaskPlan,
runTaskDelete,
runTaskRetry,
runTaskComment,
runTaskComments,
runTaskSteer,
runTaskPrCreate,
runSettingsShow,
runSettingsSet,
runSettingsExport,
runSettingsImport,
runGitStatus,
runGitFetch,
runGitPull,
runGitPush,
runBackupCreate,
runBackupList,
runBackupRestore,
runBackupCleanup,
runMissionCreate,
runMissionList,
runMissionShow,
runMissionDelete,
runMissionActivateSlice,
runProjectList,
runProjectAdd,
runProjectRemove,
runProjectShow,
runProjectInfo,
runProjectSetDefault,
runProjectDetect,
runNodeList,
runNodeConnect,
runNodeDisconnect,
runNodeShow,
runNodeHealth,
runMeshStatus,
runInit,
runAgentStop,
runAgentStart,
runAgentImport,
runAgentExport,
runMessageInbox,
runMessageOutbox,
runMessageSend,
runMessageRead,
runMessageDelete,
runAgentMailbox,
runPluginList,
runPluginInstall,
runPluginUninstall,
runPluginEnable,
runPluginDisable,
runPluginCreate,
runSkillsSearch,
runSkillsInstall,
} = await loadCommandHandlers();
try {
switch (command) {
case "init": {