Class: Aidp::Watch::StateStore

Inherits:
Object
  • Object
show all
Defined in:
lib/aidp/watch/state_store.rb

Overview

Persists watch mode progress for each repository/issue pair. Used to avoid re-processing plan/build triggers and to retain generated plan context between runs.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(project_dir:, repository:) ⇒ StateStore

Returns a new instance of StateStore.



15
16
17
18
19
20
# File 'lib/aidp/watch/state_store.rb', line 15

def initialize(project_dir:, repository:)
  @project_dir = project_dir
  @repository = repository
  @path = File.join(project_dir, ".aidp", "watch", "#{sanitize_repository(repository)}.yml")
  ensure_directory
end

Instance Attribute Details

#pathObject (readonly)

Returns the value of attribute path.



13
14
15
# File 'lib/aidp/watch/state_store.rb', line 13

def path
  @path
end

Instance Method Details

#build_status(issue_number) ⇒ Object



56
57
58
# File 'lib/aidp/watch/state_store.rb', line 56

def build_status(issue_number)
  builds[issue_number.to_s] || {}
end

#change_request_data(pr_number) ⇒ Object



116
117
118
# File 'lib/aidp/watch/state_store.rb', line 116

def change_request_data(pr_number)
  change_requests[pr_number.to_s]
end

#change_request_processed?(pr_number) ⇒ Boolean

Change request tracking methods

Returns:

  • (Boolean)


112
113
114
# File 'lib/aidp/watch/state_store.rb', line 112

def change_request_processed?(pr_number)
  change_requests.key?(pr_number.to_s)
end

#ci_fix_completed?(pr_number) ⇒ Boolean

CI fix tracking methods

Returns:

  • (Boolean)


89
90
91
92
# File 'lib/aidp/watch/state_store.rb', line 89

def ci_fix_completed?(pr_number)
  fix_data = ci_fixes[pr_number.to_s]
  fix_data && fix_data["status"] == "completed"
end

#ci_fix_data(pr_number) ⇒ Object



94
95
96
# File 'lib/aidp/watch/state_store.rb', line 94

def ci_fix_data(pr_number)
  ci_fixes[pr_number.to_s]
end

#plan_data(issue_number) ⇒ Object



26
27
28
# File 'lib/aidp/watch/state_store.rb', line 26

def plan_data(issue_number)
  plans[issue_number.to_s]
end

#plan_iteration_count(issue_number) ⇒ Object



30
31
32
33
34
# File 'lib/aidp/watch/state_store.rb', line 30

def plan_iteration_count(issue_number)
  plan = plans[issue_number.to_s]
  return 0 unless plan
  plan["iteration"] || 1
end

#plan_processed?(issue_number) ⇒ Boolean

Returns:

  • (Boolean)


22
23
24
# File 'lib/aidp/watch/state_store.rb', line 22

def plan_processed?(issue_number)
  plans.key?(issue_number.to_s)
end

#record_build_status(issue_number, status:, details: {}) ⇒ Object



60
61
62
63
64
65
66
# File 'lib/aidp/watch/state_store.rb', line 60

def record_build_status(issue_number, status:, details: {})
  builds[issue_number.to_s] = {
    "status" => status,
    "updated_at" => Time.now.utc.iso8601
  }.merge(stringify_keys(details))
  save!
end

#record_change_request(pr_number, data) ⇒ Object



120
121
122
123
124
125
126
127
128
129
130
131
132
# File 'lib/aidp/watch/state_store.rb', line 120

def record_change_request(pr_number, data)
  payload = {
    "status" => data[:status],
    "timestamp" => data[:timestamp] || Time.now.utc.iso8601,
    "changes_applied" => data[:changes_applied],
    "commits" => data[:commits],
    "reason" => data[:reason],
    "clarification_count" => data[:clarification_count]
  }.compact

  change_requests[pr_number.to_s] = payload
  save!
end

#record_ci_fix(pr_number, data) ⇒ Object



98
99
100
101
102
103
104
105
106
107
108
109
# File 'lib/aidp/watch/state_store.rb', line 98

def record_ci_fix(pr_number, data)
  payload = {
    "status" => data[:status],
    "timestamp" => data[:timestamp] || Time.now.utc.iso8601,
    "reason" => data[:reason],
    "root_causes" => data[:root_causes],
    "fixes_count" => data[:fixes_count]
  }.compact

  ci_fixes[pr_number.to_s] = payload
  save!
end

#record_plan(issue_number, data) ⇒ Object



36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/aidp/watch/state_store.rb', line 36

def record_plan(issue_number, data)
  existing_plan = plans[issue_number.to_s]
  iteration = existing_plan ? (existing_plan["iteration"] || 1) + 1 : 1

  payload = {
    "summary" => data[:summary],
    "tasks" => data[:tasks],
    "questions" => data[:questions],
    "comment_body" => data[:comment_body],
    "comment_hint" => data[:comment_hint],
    "comment_id" => data[:comment_id],
    "posted_at" => data[:posted_at] || Time.now.utc.iso8601,
    "iteration" => iteration,
    "previous_iteration_at" => existing_plan ? existing_plan["posted_at"] : nil
  }.compact

  plans[issue_number.to_s] = payload
  save!
end

#record_review(pr_number, data) ⇒ Object



77
78
79
80
81
82
83
84
85
86
# File 'lib/aidp/watch/state_store.rb', line 77

def record_review(pr_number, data)
  payload = {
    "timestamp" => data[:timestamp] || Time.now.utc.iso8601,
    "reviewers" => data[:reviewers],
    "total_findings" => data[:total_findings]
  }.compact

  reviews[pr_number.to_s] = payload
  save!
end

#reset_change_request_state(pr_number) ⇒ Object



134
135
136
137
# File 'lib/aidp/watch/state_store.rb', line 134

def reset_change_request_state(pr_number)
  change_requests.delete(pr_number.to_s)
  save!
end

#review_data(pr_number) ⇒ Object



73
74
75
# File 'lib/aidp/watch/state_store.rb', line 73

def review_data(pr_number)
  reviews[pr_number.to_s]
end

#review_processed?(pr_number) ⇒ Boolean

Review tracking methods

Returns:

  • (Boolean)


69
70
71
# File 'lib/aidp/watch/state_store.rb', line 69

def review_processed?(pr_number)
  reviews.key?(pr_number.to_s)
end