Class: McpServer::CompletedWorkTool
- Inherits:
-
MCP::Tool
- Object
- MCP::Tool
- McpServer::CompletedWorkTool
- Defined in:
- lib/jirametrics/mcp_server.rb
Class Method Summary collapse
- .build_row(issue:, project_name:, project_data:, days_back:, completed_status:, completed_resolution:, filter:) ⇒ Object
- .call(server_context:, days_back: nil, project: nil, project_name: nil, completed_status: nil, completed_resolution: nil, **history_args) ⇒ Object
- .format_line(row) ⇒ Object
- .matches_completion?(status_at_done, resolution_at_done, completed_status, completed_resolution) ⇒ Boolean
- .past_cutoff?(completed_date, today, days_back) ⇒ Boolean
Class Method Details
.build_row(issue:, project_name:, project_data:, days_back:, completed_status:, completed_resolution:, filter:) ⇒ Object
349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 |
# File 'lib/jirametrics/mcp_server.rb', line 349 def self.build_row( issue:, project_name:, project_data:, days_back:, completed_status:, completed_resolution:, filter: ) started, stopped = issue.started_stopped_times return nil unless stopped completed_date = stopped.to_date return nil if past_cutoff?(completed_date, project_data[:today], days_back) status_at_done, resolution_at_done = issue.status_resolution_at_done return nil unless matches_completion?(status_at_done, resolution_at_done, completed_status, completed_resolution) return nil unless McpServer.matches_history?(issue, project_data[:end_time], filter) { key: issue.key, summary: issue.summary, type: issue.type, completed_date: completed_date, cycle_time_days: started ? (completed_date - started.to_date).to_i + 1 : nil, flow_efficiency: McpServer.flow_efficiency_percent(issue, stopped), status_at_done: status_at_done&.name, resolution_at_done: resolution_at_done, project: project_name } end |
.call(server_context:, days_back: nil, project: nil, project_name: nil, completed_status: nil, completed_resolution: nil, **history_args) ⇒ Object
333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 |
# File 'lib/jirametrics/mcp_server.rb', line 333 def self.call(server_context:, days_back: nil, project: nil, project_name: nil, completed_status: nil, completed_resolution: nil, **history_args) project ||= project_name filter = McpServer::HistoryFilter.from(**history_args) rows = McpServer.collect_rows(server_context, project) do |issue, name, project_data| build_row( issue: issue, project_name: name, project_data: project_data, days_back: days_back, completed_status: completed_status, completed_resolution: completed_resolution, filter: filter ) end rows.sort_by! { |r| -r[:completed_date].to_time.to_i } McpServer.render_rows(rows, empty: 'No completed work found.') { |r| format_line(r) } end |
.format_line(row) ⇒ Object
389 390 391 392 393 394 395 |
# File 'lib/jirametrics/mcp_server.rb', line 389 def self.format_line row ct = row[:cycle_time_days] ? "#{row[:cycle_time_days]}d" : 'unknown' fe = row[:flow_efficiency] ? " | FE: #{row[:flow_efficiency]}%" : '' completion = [row[:status_at_done], row[:resolution_at_done]].compact.join(' / ') "#{row[:key]} | #{row[:project]} | #{row[:type]} | #{row[:completed_date]} | " \ "Cycle time: #{ct}#{fe} | #{completion} | #{row[:summary]}" end |
.matches_completion?(status_at_done, resolution_at_done, completed_status, completed_resolution) ⇒ Boolean
382 383 384 385 386 387 |
# File 'lib/jirametrics/mcp_server.rb', line 382 def self.matches_completion? status_at_done, resolution_at_done, completed_status, completed_resolution return false if completed_status && status_at_done&.name != completed_status return false if completed_resolution && completed_resolution != resolution_at_done true end |
.past_cutoff?(completed_date, today, days_back) ⇒ Boolean
376 377 378 379 380 |
# File 'lib/jirametrics/mcp_server.rb', line 376 def self.past_cutoff? completed_date, today, days_back return false unless days_back completed_date < today - days_back end |