feat(mcp): delete tasks, create task lists and lists, agent badge; export/import settings category
MindSift CI & Docker Release / Build, Test in Container & Push (push) Successful in 2m21s
MindSift CI & Docker Release / Build, Test in Container & Push (push) Successful in 2m21s
New MCP tools delete_task (tasks:write), create_task_list (tasks:write) and create_list (lists:write); list_task_lists now returns the board columns so agents know the valid kanbanStatus values. Task deletion is a shared helper (deleteTask) for REST and MCP. Tasks and list items get agent_mark (migration 12): "created" when an agent adds them via MCP, "edited" when an agent changes them; a change by the user clears it. The new AgentBadge shows "KI" / "KI geändert" in task rows, Kanban cards, the task detail, the inbox and lists. Settings: export and import move out of "Webhooks, KI-Agenten & Export" into their own category "Export & Import". Docs, help, README and changelog updated; v0.29.0. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
8faed7a160
commit
ac068248d7
28 files changed
+441
-65
No files matched your search
@@ -0,0 +1,33 @@
|
||||
import React from 'react';
|
||||
import { Bot } from 'lucide-react';
|
||||
import { AgentMark } from '../lib/types';
|
||||
|
||||
interface AgentBadgeProps {
|
||||
mark: AgentMark | undefined;
|
||||
// sm: task rows and the task detail; xs: Kanban cards and list items
|
||||
size?: 'sm' | 'xs';
|
||||
}
|
||||
|
||||
const TITLES: Record<AgentMark, string> = {
|
||||
created: 'Von einem KI-Agenten per MCP angelegt. Das Zeichen verschwindet, sobald du den Eintrag selbst änderst.',
|
||||
edited: 'Zuletzt von einem KI-Agenten per MCP geändert. Das Zeichen verschwindet, sobald du den Eintrag selbst änderst.',
|
||||
};
|
||||
|
||||
// Marks entries an AI agent created or changed via MCP that the user has not touched since
|
||||
// (Doku/ui-patterns.md)
|
||||
export const AgentBadge: React.FC<AgentBadgeProps> = ({ mark, size = 'sm' }) => {
|
||||
if (mark !== 'created' && mark !== 'edited') return null;
|
||||
const label = mark === 'created' ? 'KI' : 'KI geändert';
|
||||
return (
|
||||
<span
|
||||
className={`px-1.5 border border-accent/40 bg-accent/10 text-accent rounded-btn font-medium inline-flex items-center gap-1 flex-shrink-0 ${
|
||||
size === 'xs' ? 'py-0.2 text-[9px]' : 'py-0.5 text-[10px]'
|
||||
}`}
|
||||
title={TITLES[mark]}
|
||||
aria-label={TITLES[mark]}
|
||||
>
|
||||
<Bot className="w-2.5 h-2.5" />
|
||||
<span>{label}</span>
|
||||
</span>
|
||||
);
|
||||
};
|
||||
@@ -0,0 +1,18 @@
|
||||
import { describe, it, expect } from 'vitest';
|
||||
import { render } from '@testing-library/react';
|
||||
import { AgentBadge } from '../AgentBadge';
|
||||
|
||||
describe('AgentBadge', () => {
|
||||
it('shows nothing for entries of the user', () => {
|
||||
expect(render(<AgentBadge mark={undefined} />).container.firstChild).toBeNull();
|
||||
});
|
||||
|
||||
it('tells created and edited entries apart', () => {
|
||||
const created = render(<AgentBadge mark="created" />).container.firstChild as HTMLElement;
|
||||
expect(created.textContent).toBe('KI');
|
||||
expect(created.getAttribute('title')).toContain('angelegt');
|
||||
const edited = render(<AgentBadge mark="edited" />).container.firstChild as HTMLElement;
|
||||
expect(edited.textContent).toBe('KI geändert');
|
||||
expect(edited.getAttribute('title')).toContain('geändert');
|
||||
});
|
||||
});
|
||||
Reference in new issue
Block a user