Class: McpServer::CompletedWorkTool

Inherits:
MCP::Tool
  • Object
show all
Defined in:
lib/jirametrics/mcp_server.rb

Class Method Summary collapse

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

Returns:

  • (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

Returns:

  • (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