Class: Aidp::Database::Repositories::HarnessStateRepository

Inherits:
Aidp::Database::Repository show all
Defined in:
lib/aidp/database/repositories/harness_state_repository.rb

Overview

Repository for harness_state table Replaces harness/*_state.json files

Instance Attribute Summary

Attributes inherited from Aidp::Database::Repository

#project_dir, #table_name

Instance Method Summary collapse

Constructor Details

#initialize(project_dir: Dir.pwd) ⇒ HarnessStateRepository

Returns a new instance of HarnessStateRepository.



11
12
13
# File 'lib/aidp/database/repositories/harness_state_repository.rb', line 11

def initialize(project_dir: Dir.pwd)
  super(project_dir: project_dir, table_name: "harness_state")
end

Instance Method Details

#clear_state(mode) ⇒ Object

Clear state for mode

Parameters:

  • mode (String, Symbol)

    Mode



106
107
108
109
110
111
112
113
# File 'lib/aidp/database/repositories/harness_state_repository.rb', line 106

def clear_state(mode)
  mode_str = mode.to_s
  execute(
    "DELETE FROM harness_state WHERE project_dir = ? AND mode = ?",
    [project_dir, mode_str]
  )
  Aidp.log_debug("harness_state_repository", "cleared", mode: mode_str)
end

#has_state?(mode) ⇒ Boolean

Check if state exists for mode

Parameters:

  • mode (String, Symbol)

    Mode (execute, analyze, etc.)

Returns:

  • (Boolean)


19
20
21
22
23
24
25
26
# File 'lib/aidp/database/repositories/harness_state_repository.rb', line 19

def has_state?(mode)
  mode_str = mode.to_s
  count = query_value(
    "SELECT COUNT(*) FROM harness_state WHERE project_dir = ? AND mode = ?",
    [project_dir, mode_str]
  )
  count.positive?
end

#load_state(mode) ⇒ Hash

Load state for mode

Parameters:

  • mode (String, Symbol)

    Mode

Returns:

  • (Hash)

    State data (empty hash if no state)



32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/aidp/database/repositories/harness_state_repository.rb', line 32

def load_state(mode)
  mode_str = mode.to_s
  row = query_one(
    "SELECT * FROM harness_state WHERE project_dir = ? AND mode = ?",
    [project_dir, mode_str]
  )

  return {} unless row

  state = deserialize_json(row["state"]) || {}
  Aidp.log_debug("harness_state_repository", "loaded",
    mode: mode_str, keys: state.keys.size)
  state
end

#modes_with_stateArray<String>

Get all modes with state

Returns:

  • (Array<String>)

    Mode names



118
119
120
121
122
123
124
# File 'lib/aidp/database/repositories/harness_state_repository.rb', line 118

def modes_with_state
  rows = query(
    "SELECT DISTINCT mode FROM harness_state WHERE project_dir = ?",
    [project_dir]
  )
  rows.map { |r| r["mode"] }
end

#save_state(mode, state_data) ⇒ Object

Save state for mode

Parameters:

  • mode (String, Symbol)

    Mode

  • state_data (Hash)

    State to save



51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
# File 'lib/aidp/database/repositories/harness_state_repository.rb', line 51

def save_state(mode, state_data)
  mode_str = mode.to_s
  now = current_timestamp

  # Add metadata
   = state_data.merge(
    mode: mode_str,
    project_dir: project_dir,
    saved_at: now
  )

  existing = query_one(
    "SELECT id, version FROM harness_state WHERE project_dir = ? AND mode = ?",
    [project_dir, mode_str]
  )

  if existing
    new_version = (existing["version"] || 1) + 1
    execute(
      <<~SQL,
        UPDATE harness_state SET
          state = ?,
          version = ?,
          updated_at = ?
        WHERE project_dir = ? AND mode = ?
      SQL
      [
        serialize_json(),
        new_version,
        now,
        project_dir,
        mode_str
      ]
    )
    Aidp.log_debug("harness_state_repository", "updated",
      mode: mode_str, version: new_version)
  else
    execute(
      insert_sql([:project_dir, :mode, :state, :version, :created_at, :updated_at]),
      [
        project_dir,
        mode_str,
        serialize_json(),
        1,
        now,
        now
      ]
    )
    Aidp.log_debug("harness_state_repository", "created", mode: mode_str)
  end
end

#version(mode) ⇒ Integer

Get state version for mode

Parameters:

  • mode (String, Symbol)

    Mode

Returns:

  • (Integer)

    Version number (0 if no state)



130
131
132
133
134
135
136
# File 'lib/aidp/database/repositories/harness_state_repository.rb', line 130

def version(mode)
  mode_str = mode.to_s
  query_value(
    "SELECT version FROM harness_state WHERE project_dir = ? AND mode = ?",
    [project_dir, mode_str]
  ) || 0
end