Draft
Conversation
Create go/cmd/kanban-mcp/ binary with flag-based config loading and KANBAN_* environment variable fallback. Uses flag.NewFlagSet for testability. Builds and prints usage on --help. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- internal/db/models.go: Task GORM model, TaskStatus enum (8 statuses), StatusWorkflow ordered slice, ValidStatus() helper - internal/db/manager.go: Manager with NewManager(cfg), Initialize() AutoMigrate, DB() accessor; mirrors go/internal/database/manager.go pattern - internal/db/db_test.go: table-driven TestValidStatus, TestNewManager_Sqlite, TestNewManager_InvalidType - main.go: wire DB init, log "database initialized" Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Add table-driven tests for TaskService covering all 8 test requirements from the spec: CreateTask defaults, CreateTask with status, GetTask not found (wrapped sentinel), MoveTask valid/invalid, ListTasks filter, DeleteTask simple, and Broadcast called on every mutation. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Add AssignTask (clears on empty string) and CreateSubtask (one-level nesting only, rejects grandchildren) to TaskService. DeleteTask cascade and GetTask subtask preload were already implemented in Step 3. Add 7 table-driven tests: TestAssignTask, TestListTasks_AssigneeFilter, TestCreateSubtask_Valid, TestCreateSubtask_ParentNotFound, TestCreateSubtask_NestedRejection, TestDeleteTask_Cascade, TestGetTask_WithSubtasks (all pass, 15/15 total). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- internal/sse/hub.go: Hub with Subscribe/Unsubscribe/Broadcast/ServeSSE
- Broadcast wraps data in Event{Type:"board_update"} and stores lastJSON snapshot
- ServeSSE sends snapshot to new clients then streams subsequent events
- Non-blocking delivery: slow subscribers are skipped (select default)
- internal/sse/hub_test.go: 4 tests all pass (subscribe/unsubscribe, non-blocking,
50 concurrent subscribers, SSE integration via httptest.NewServer)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Added internal/mcp/tools.go: NewServer() registers all 10 tools
(list_tasks, get_task, create_task, create_subtask, assign_task,
move_task, update_task, set_user_input_needed, delete_task, get_board)
- Added internal/mcp/tools_test.go: 6 tests using InMemoryTransports
(all pass): CreateTask, MoveTask_Invalid, CreateSubtask, AssignTask,
DeleteTask_Cascade, GetBoard
- Updated main.go: wires SSE hub + TaskService, runs stdio transport
via mcpServer.Run(ctx, &StdioTransport{})
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- server.go: NewHTTPServer() wires all 4 surfaces on one mux (MCP Streamable HTTP, SSE /events, REST /api/*, SPA /) - internal/api/handlers.go: 501/404 stubs for REST routes (Step 8) - internal/ui/embed.go + index.html: embedded SPA stub (Step 9) - main.go: HTTP mode calls NewHTTPServer + ListenAndServe - server_test.go: 4 tests (MCP, SSE, NotFound, CORS) all pass Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Implement full REST API replacing 501/404 stubs:
- GET/POST /api/tasks (list with status/assignee filter, create)
- GET/PUT/DELETE /api/tasks/{id}
- GET/POST /api/tasks/{id}/subtasks
- GET /api/board (8-column board grouped by StatusWorkflow)
Error mapping: gorm.ErrRecordNotFound→404, invalid-status/nesting→400, else→500
Board/Column types exported for test use.
9/9 tests pass: CreateTask, GetTask(404), UpdateTask, ListTasks_Filter,
Subtasks_Create, Subtasks_List, DeleteTask_Cascade, Board, SSE_AfterMutation
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Full single-page Kanban board in internal/ui/index.html: - 8-column board layout rendered from /api/board on load - EventSource(/events) for live board_update SSE re-render - renderCard: assignee badge (blue), HITL badge (amber), subtask count - Collapsible subtask details with status pills - Prev/Next nav buttons call PUT /api/tasks/:id for status moves - HITL toggle button calls PUT /api/tasks/:id - Add-task form in Inbox column (POST /api/tasks) - No build step, no npm — vanilla JS + inline CSS Added internal/ui/embed_test.go: TestUI_Embedded + TestUI_Handler. All 8 kanban-mcp packages pass. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add TestPostgres_Integration (skipped unless KANBAN_TEST_POSTGRES_URL set): full CRUD + subtask + assign workflow against real Postgres - Add go/cmd/kanban-mcp/Dockerfile: multi-stage build (golang:1.23-alpine) - Add contrib/tools/kanban-mcp/ Helm chart: Deployment, Service, PVC, _helpers.tpl, Chart.yaml, values.yaml - helm lint passes; helm template produces valid K8s manifests
Signed-off-by: Dmytro Rashko <dmitriy.rashko@amdocs.com>
Add NamespaceProvider context (namespace string + setter), wire into root layout wrapping AgentsProvider, and add unit tests verifying hook behavior inside/outside provider. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Build sidebar navigation with 4 sections (OVERVIEW, AGENTS, RESOURCES, ADMIN) and 12 nav items using existing shadcn sidebar primitives. Active route detection via usePathname. AppSidebar wraps nav with KAgent logo header, placeholder footer, and SidebarRail for collapse. 6 unit tests verify section labels, item count, and active state. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…Footer) Wire AppSidebar into app/layout.tsx with SidebarProvider + SidebarInset, replacing the Header and Footer components. Body className changed from flex-col to flex (sidebar handles horizontal layout). 5 unit tests verify sidebar presence, children rendering, and absence of Header/Footer. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Create NamespaceSelector component wrapping existing NamespaceCombobox logic for sidebar display. Compact trigger button in expanded mode, icon-only with tooltip in collapsed mode. Wired into AppSidebar header with useNamespace() context. 6 unit tests, all 128 tests pass. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Remove inner SidebarProvider from chat layout (global one sufficient). SessionsSidebar moved to side="right", AgentDetailsSidebar converted to Sheet with open/onClose props. ChatLayoutUI gains info trigger button and flex wrapper for proper horizontal layout. - chat/layout.tsx: removed SidebarProvider wrapper and CSS overrides - SessionsSidebar: side="left" → side="right" - AgentDetailsSidebar: Sidebar → Sheet with open/onClose props - ChatLayoutUI: added agentDetailsOpen state, Info trigger button, flex container wrapping content + sessions sidebar - 12 new unit tests (6 AgentDetailsSidebar, 6 ChatLayoutUI) - All 140 tests pass Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add MobileTopBar component (SidebarTrigger + KAgent logo) hidden on lg: breakpoint via Tailwind. Wired into SidebarInset in root layout. 5 new unit tests + 1 layout integration test (146 total pass). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Create StatusIndicator component (green dot + text, collapsed: dot + tooltip) - Wire StatusIndicator + ThemeToggle into AppSidebar footer - Add aria-label="Main navigation" on Sidebar - Add role="group" + aria-labelledby on SidebarGroups - Add aria-current="page" on active SidebarMenuButton - 4 new StatusIndicator tests + 4 new accessibility tests (154 total pass) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Create 7 "Coming Soon" stub pages so all sidebar nav items resolve without 404: /feed, /workflows, /cronjobs, /kanban, /git, /admin/org, /admin/gateways. Each page shows the matching lucide icon, title, and "Coming soon" text. 28 new tests (182 total pass). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: Dmytro Rashko <dmitriy.rashko@amdocs.com>
Signed-off-by: Dmytro Rashko <dmitriy.rashko@amdocs.com>
Signed-off-by: Dmytro Rashko <dmitriy.rashko@amdocs.com>
Add full attachment and label support across all layers of the kanban-mcp server:
- DB: Attachment model (file/link types), Labels field (StringSlice) on Task,
AutoMigrate updated to include Attachment table
- Service: AddAttachment, DeleteAttachment methods with validation
(top-level only, type-specific field requirements), label deduplication,
cascade delete includes attachments, Preload("Attachments") on GetTask/ListTasks
- MCP: 2 new tools (add_attachment, delete_attachment) bringing total to 12,
labels support added to create_task, create_subtask, update_task, list_tasks
- REST: POST /api/tasks/:id/attachments, DELETE /api/attachments/:id routes,
labels support in task CRUD endpoints, label query filter
- Tests: 13 new service tests covering attachment CRUD, validation,
cascade delete with attachments, label filtering, label deduplication
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: Dmytro Rashko <dmitriy.rashko@amdocs.com>
Define AgentCronJob CRD in kagent.dev/v1alpha2 with spec fields (schedule, prompt, agentRef) and status fields (lastRunTime, nextRunTime, lastRunResult, lastRunMessage, lastSessionID). Includes generated deepcopy, CRD YAML, Helm chart template, and example manifest. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Implements the Kubernetes controller for AgentCronJob CRD that: - Parses cron schedules using robfig/cron/v3 (5-field standard format) - Uses RequeueAfter for scheduling (no in-memory scheduler) - Triggers agent runs via HTTP API (session creation + A2A message) - Updates status with lastRunTime, nextRunTime, lastRunResult, lastSessionID - Sets Accepted/Ready conditions for schedule validation feedback - Handles restart recovery without retroactive execution of missed runs Includes unit tests for: invalid schedule, not-yet-due scheduling, agent-not-found, HTTP failure, restart recovery, and cron parsing table-driven tests (10 cases). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add REST API at /api/cronjobs for managing AgentCronJob CRs:
- GET /api/cronjobs (list all)
- GET /api/cronjobs/{namespace}/{name} (get one)
- POST /api/cronjobs (create)
- PUT /api/cronjobs/{namespace}/{name} (update)
- DELETE /api/cronjobs/{namespace}/{name} (delete)
Follows existing agent handler patterns with K8s client proxy,
auth middleware, and StandardResponse format. Includes 13 unit
tests covering all CRUD operations and error cases.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace the cronjobs placeholder page with a full list view following the models page pattern. Includes expandable rows showing schedule, agent ref, prompt, and status details (last/next run times, result, session ID). Server actions provide getCronJobs, getCronJob, createCronJob, updateCronJob, and deleteCronJob with proper error handling. Delete uses a confirmation dialog. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Create /cronjobs/new page with form fields for name, namespace, schedule (cron expression), agent (dropdown from API), and prompt. Supports edit mode via ?edit=true&name=X&namespace=Y query params. Includes field validation and follows existing models/new pattern. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add go/test/e2e/agentcronjob_test.go with 4 test functions covering the full AgentCronJob lifecycle: - TestE2EAgentCronJobCRUD: HTTP API CRUD (create, duplicate conflict, get, list, update, delete, get-after-delete 404) - TestE2EAgentCronJobStatusAccepted: valid schedule → Accepted=True, NextRunTime populated, Ready=True - TestE2EAgentCronJobInvalidSchedule: bad cron → Accepted=False with InvalidSchedule reason - TestE2EAgentCronJobInvalidAgentRef: missing agent → LastRunResult=Failed after cron tick (120s timeout for */1 schedule) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- temporal workflow ui - git repo search - rfx - fix cron jobs - dashboard Signed-off-by: Dmytro Rashko <dmitriy.rashko@amdocs.com>
Signed-off-by: Dmytro Rashko <dmitriy.rashko@amdocs.com>
Signed-off-by: Dmytro Rashko <dmitriy.rashko@amdocs.com>
Contributor
Author
|
Thanks @Charlesthebird - I think this is the direction it goes Implementation Details
Inspired by MCP-APP implementation https://modelcontextprotocol.io/extensions/apps/overview |
Signed-off-by: Dmytro Rashko <dmitriy.rashko@amdocs.com>
Signed-off-by: Dmytro Rashko <dmitriy.rashko@amdocs.com>
Signed-off-by: Dmytro Rashko <dmitriy.rashko@amdocs.com>
Signed-off-by: Dmytro Rashko <dmitriy.rashko@amdocs.com>
Signed-off-by: Dmytro Rashko <dmitriy.rashko@amdocs.com>
Define declarative workflow CRD types in v1alpha2: - WorkflowTemplate: DAG-based workflow definition with steps, params, retry/timeout policies, and retention configuration - WorkflowRun: workflow execution with template snapshot, Temporal workflow ID tracking, and per-step status - Supporting types: StepSpec, StepOutput, StepPolicy, RetryPolicy, TimeoutPolicy, ParamSpec, StepStatus, StepPhase constants Generated deepcopy methods and CRD manifests via controller-gen. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Implements Step 2 of the declarative workflow system: DAGCompiler that validates WorkflowTemplateSpec (duplicate names, dependency resolution, cycle detection via Kahn's algorithm, type checks, step count cap) and compiles it into a JSON-serializable ExecutionPlan for Temporal. Includes table-driven tests for all validation rules and compilation paths. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Implements ${{ params.* }}, ${{ context.* }}, and ${{ workflow.* }}
expression resolution with escape support ($${{ }}), nested JSON field
access, static param validation, and 21 table-driven tests.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…xecution Generic interpreter workflow that reads an ExecutionPlan and executes the DAG at runtime using event-driven parallelism. Each step runs in its own workflow goroutine, awaiting dependencies via workflow.Await. Supports action activities, agent child workflows, expression resolution, fail-fast/continue-on-error modes, output context propagation, and a dag-status query handler for the status syncer. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Implements Step 5 of the declarative workflow system: - ActionRegistry with thread-safe Register/Get for action handlers - DAGActivities struct with ActionActivity that dispatches to registered handlers - Built-in handlers: noop (echo inputs) and http.request (HTTP calls) - ActionHandlerFunc adapter for using functions as handlers - 13 table-driven tests covering dispatch, error handling, HTTP, and noop Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Extract executeAgentStep into dedicated agent_step.go with: - AgentStepRequest/AgentStepResult types compatible with ADK's ExecutionRequest - buildAgentMessage for A2A-compatible prompt+context payloads - mapAgentOutput handling JSON objects, arrays, and plain text responses - Agent status checking (failed/rejected propagation) - 13 new tests: successful agent, failed/rejected status, context flow, empty response, output key mapping to globals, child options, message building, and output mapping Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Implements the WorkflowTemplate controller that validates DAG structure on create/update. Uses the DAGCompiler to check for cycles, duplicate names, invalid references, and missing required fields. Updates status conditions with classified validation reasons. - WorkflowTemplateController with Reconcile and SetupWithManager - classifyValidationError maps compiler errors to condition reasons - Generation-based skip to avoid redundant reconciliation - Registered in controller manager (app.go) - 11 table-driven tests covering valid/invalid templates Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Implements Step 8 of the declarative workflow system:
- WorkflowRunController with 3-phase reconcile: accept, submit, delete
- TemporalWorkflowClient interface for testability
- Template resolution and param validation with snapshot into status
- Temporal workflow submission with wf-{ns}-{template}-{run} ID format
- Finalizer-based cleanup with Temporal workflow cancellation on delete
- Registered in app.go with shared DAGCompiler instance
- 15 tests covering all scenarios (template not found, not validated,
missing params, valid lifecycle, idempotent reconciliation, deletion,
Temporal failure, helper functions)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Background goroutine that periodically polls Temporal for running WorkflowRun status. Syncs per-step statuses via dag-status query handler and updates CRD conditions on workflow completion/failure. - Extended TemporalWorkflowClient with DescribeWorkflow and QueryWorkflow - WorkflowRunStatusSyncer with Start loop, syncAll, syncOne - Handles: running step sync, completed, failed, cancelled, timed out - Graceful degradation: Temporal errors logged but don't crash syncer - stepStatusesEqual avoids unnecessary status updates - NeedLeaderElection ensures single-writer - Registered in app.go via mgr.Add() - 9 tests (7 scenarios + stepStatusesEqual table + leader election) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add REST API for workflow management:
- GET /api/workflow-templates — list templates
- GET /api/workflow-templates/{ns}/{name} — get template detail
- POST /api/workflow-runs — create run (template ref + params)
- GET /api/workflow-runs — list runs (filter by template, status)
- GET /api/workflow-runs/{ns}/{name} — get run with step statuses
- DELETE /api/workflow-runs/{ns}/{name} — delete (triggers cancellation)
Follows existing handler patterns with auth, K8s client, error handling.
14 tests cover all endpoints including error cases.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…L cleanup Implements periodic garbage collection for old WorkflowRuns based on: - RetentionPolicy history limits (successfulRunsHistoryLimit, failedRunsHistoryLimit) from WorkflowTemplate - TTL-based cleanup (ttlSecondsAfterFinished) from WorkflowRun spec Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add Step 12 of the declarative workflow system: - E2E tests for workflow lifecycle (sequential, parallel DAG, agent step, fail-fast, retry, cancellation, retention, cycle detection, missing params, HTTP API endpoints) - Example workflow YAMLs: build-and-test CI pipeline, data pipeline ETL, multi-agent analysis - Helm CRD templates for WorkflowTemplate and WorkflowRun Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Mark all 12 implementation steps as complete in plan.md. Clean up CRD comments to avoid controller-gen expression interpolation issues. Add workflow session behavior addendum to temporal-agent-workflow spec. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: Dmytro Rashko <dmitriy.rashko@amdocs.com>
Signed-off-by: Dmytro Rashko <dmitriy.rashko@amdocs.com>
…ty-feed The ServiceAccount was combined with Service in service.yaml using a YAML document separator (---), which caused helm lint to fail with "invalid Yaml document separator" due to the Go template conditional block after the separator. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: Dmytro Rashko <dmitriy.rashko@amdocs.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
WIP - for reference only