aidp 0.34.0 → 0.39.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (133) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +14 -14
  3. data/lib/aidp/agent_harness_adapter.rb +309 -0
  4. data/lib/aidp/cli/issue_importer.rb +20 -6
  5. data/lib/aidp/cli/jobs_command.rb +1 -1
  6. data/lib/aidp/cli/models_command.rb +9 -16
  7. data/lib/aidp/cli/prompts_command.rb +253 -0
  8. data/lib/aidp/cli/security_command.rb +4 -10
  9. data/lib/aidp/cli/storage_command.rb +277 -0
  10. data/lib/aidp/cli/temporal_command.rb +460 -0
  11. data/lib/aidp/cli.rb +24 -2
  12. data/lib/aidp/config.rb +15 -0
  13. data/lib/aidp/config_paths.rb +12 -2
  14. data/lib/aidp/database/migrations.rb +114 -0
  15. data/lib/aidp/database/repositories/checkpoint_repository.rb +174 -0
  16. data/lib/aidp/database/repositories/deprecated_models_repository.rb +206 -0
  17. data/lib/aidp/database/repositories/evaluation_repository.rb +208 -0
  18. data/lib/aidp/database/repositories/harness_state_repository.rb +140 -0
  19. data/lib/aidp/database/repositories/job_repository.rb +278 -0
  20. data/lib/aidp/database/repositories/model_cache_repository.rb +194 -0
  21. data/lib/aidp/database/repositories/progress_repository.rb +210 -0
  22. data/lib/aidp/database/repositories/prompt_archive_repository.rb +195 -0
  23. data/lib/aidp/database/repositories/prompt_feedback_repository.rb +266 -0
  24. data/lib/aidp/database/repositories/provider_info_cache_repository.rb +208 -0
  25. data/lib/aidp/database/repositories/provider_metrics_repository.rb +245 -0
  26. data/lib/aidp/database/repositories/secrets_repository.rb +187 -0
  27. data/lib/aidp/database/repositories/task_repository.rb +231 -0
  28. data/lib/aidp/database/repositories/template_version_repository.rb +383 -0
  29. data/lib/aidp/database/repositories/watch_state_repository.rb +472 -0
  30. data/lib/aidp/database/repositories/workstream_repository.rb +310 -0
  31. data/lib/aidp/database/repositories/worktree_repository.rb +240 -0
  32. data/lib/aidp/database/repository.rb +166 -0
  33. data/lib/aidp/database/schema.rb +347 -0
  34. data/lib/aidp/database/storage_migrator.rb +693 -0
  35. data/lib/aidp/database.rb +139 -0
  36. data/lib/aidp/debug_mixin.rb +2 -2
  37. data/lib/aidp/execute/checkpoint.rb +26 -0
  38. data/lib/aidp/execute/checkpoint_display.rb +16 -0
  39. data/lib/aidp/execute/prompt_evaluator.rb +30 -57
  40. data/lib/aidp/execute/work_loop_runner.rb +294 -46
  41. data/lib/aidp/firewall/provider_requirements_collector.rb +7 -23
  42. data/lib/aidp/harness/agent_harness_provider_manager.rb +275 -0
  43. data/lib/aidp/harness/ai_decision_engine.rb +78 -296
  44. data/lib/aidp/harness/config_schema.rb +59 -0
  45. data/lib/aidp/harness/configuration.rb +229 -10
  46. data/lib/aidp/harness/deprecation_cache.rb +53 -11
  47. data/lib/aidp/harness/enhanced_runner.rb +1 -1
  48. data/lib/aidp/harness/error_handler.rb +11 -5
  49. data/lib/aidp/harness/provider_config.rb +36 -0
  50. data/lib/aidp/harness/provider_factory.rb +26 -24
  51. data/lib/aidp/harness/provider_info.rb +9 -5
  52. data/lib/aidp/harness/provider_manager.rb +2 -2
  53. data/lib/aidp/harness/provider_metrics.rb +103 -1
  54. data/lib/aidp/harness/rspec_command_optimizer.rb +166 -0
  55. data/lib/aidp/harness/ruby_llm_registry.rb +97 -8
  56. data/lib/aidp/harness/runner.rb +7 -2
  57. data/lib/aidp/harness/state_manager.rb +1 -1
  58. data/lib/aidp/harness/test_runner.rb +167 -11
  59. data/lib/aidp/harness/thinking_depth_manager.rb +564 -5
  60. data/lib/aidp/harness/ui.rb +11 -0
  61. data/lib/aidp/harness/usage_limit.rb +179 -0
  62. data/lib/aidp/harness/usage_limit_enforcer.rb +240 -0
  63. data/lib/aidp/harness/usage_limit_tracker.rb +308 -0
  64. data/lib/aidp/harness/usage_period.rb +234 -0
  65. data/lib/aidp/init/agent_instructions_generator.rb +317 -0
  66. data/lib/aidp/init/runner.rb +25 -4
  67. data/lib/aidp/interfaces/activity_monitor_interface.rb +234 -0
  68. data/lib/aidp/interfaces/binary_checker_interface.rb +232 -0
  69. data/lib/aidp/interfaces/command_executor_interface.rb +216 -0
  70. data/lib/aidp/interfaces/logger_interface.rb +150 -0
  71. data/lib/aidp/interfaces/ui_interface.rb +254 -0
  72. data/lib/aidp/logger.rb +25 -7
  73. data/lib/aidp/orchestration_adapter.rb +279 -0
  74. data/lib/aidp/pr_worktree_manager.rb +4 -15
  75. data/lib/aidp/prompts/feedback_collector.rb +198 -0
  76. data/lib/aidp/prompts/prompt_template_manager.rb +415 -0
  77. data/lib/aidp/prompts/template_evolver.rb +305 -0
  78. data/lib/aidp/prompts/template_version_manager.rb +325 -0
  79. data/lib/aidp/setup/in_memory_config_adapter.rb +257 -0
  80. data/lib/aidp/setup/in_memory_config_manager.rb +262 -0
  81. data/lib/aidp/setup/wizard.rb +616 -176
  82. data/lib/aidp/shell_executor.rb +58 -0
  83. data/lib/aidp/style_guide/selector.rb +56 -1
  84. data/lib/aidp/temporal/activities/analyze_issue_activity.rb +198 -0
  85. data/lib/aidp/temporal/activities/analyze_sub_task_activity.rb +163 -0
  86. data/lib/aidp/temporal/activities/base_activity.rb +78 -0
  87. data/lib/aidp/temporal/activities/create_plan_activity.rb +115 -0
  88. data/lib/aidp/temporal/activities/create_pr_activity.rb +193 -0
  89. data/lib/aidp/temporal/activities/create_prompt_activity.rb +118 -0
  90. data/lib/aidp/temporal/activities/diagnose_failure_activity.rb +228 -0
  91. data/lib/aidp/temporal/activities/prepare_next_iteration_activity.rb +147 -0
  92. data/lib/aidp/temporal/activities/record_checkpoint_activity.rb +81 -0
  93. data/lib/aidp/temporal/activities/run_agent_activity.rb +139 -0
  94. data/lib/aidp/temporal/activities/run_tests_activity.rb +114 -0
  95. data/lib/aidp/temporal/activities/run_work_loop_iteration_activity.rb +249 -0
  96. data/lib/aidp/temporal/configuration.rb +169 -0
  97. data/lib/aidp/temporal/connection.rb +93 -0
  98. data/lib/aidp/temporal/worker.rb +119 -0
  99. data/lib/aidp/temporal/workflow_client.rb +171 -0
  100. data/lib/aidp/temporal/workflows/base_workflow.rb +73 -0
  101. data/lib/aidp/temporal/workflows/issue_to_pr_workflow.rb +278 -0
  102. data/lib/aidp/temporal/workflows/sub_issue_workflow.rb +253 -0
  103. data/lib/aidp/temporal/workflows/work_loop_workflow.rb +321 -0
  104. data/lib/aidp/temporal.rb +120 -0
  105. data/lib/aidp/version.rb +1 -1
  106. data/lib/aidp/watch/base_processor.rb +35 -0
  107. data/lib/aidp/watch/build_processor.rb +132 -0
  108. data/lib/aidp/watch/github_state_extractor.rb +0 -8
  109. data/lib/aidp/watch/rebase_processor.rb +245 -0
  110. data/lib/aidp/watch/round_robin_scheduler.rb +150 -0
  111. data/lib/aidp/watch/runner.rb +366 -285
  112. data/lib/aidp/watch/state_store.rb +80 -0
  113. data/lib/aidp/watch/work_item.rb +96 -0
  114. data/lib/aidp/watch/worktree_cleanup_job.rb +226 -0
  115. data/lib/aidp/watch/worktree_reconciler.rb +643 -0
  116. data/lib/aidp/workflows/guided_agent.rb +1 -1
  117. data/lib/aidp/worktree.rb +62 -0
  118. data/templates/aidp.yml.example +70 -0
  119. metadata +118 -16
  120. data/lib/aidp/analyze/json_file_storage.rb +0 -292
  121. data/lib/aidp/execute/future_work_backlog.rb +0 -411
  122. data/lib/aidp/providers/adapter.rb +0 -239
  123. data/lib/aidp/providers/aider.rb +0 -264
  124. data/lib/aidp/providers/anthropic.rb +0 -614
  125. data/lib/aidp/providers/base.rb +0 -617
  126. data/lib/aidp/providers/capability_registry.rb +0 -204
  127. data/lib/aidp/providers/codex.rb +0 -267
  128. data/lib/aidp/providers/cursor.rb +0 -304
  129. data/lib/aidp/providers/error_taxonomy.rb +0 -195
  130. data/lib/aidp/providers/gemini.rb +0 -110
  131. data/lib/aidp/providers/github_copilot.rb +0 -227
  132. data/lib/aidp/providers/kilocode.rb +0 -157
  133. data/lib/aidp/providers/opencode.rb +0 -139
@@ -0,0 +1,347 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Aidp
4
+ module Database
5
+ # Schema definitions for AIDP SQLite database
6
+ # Each constant represents a migration version with its SQL statements
7
+ module Schema
8
+ # Version 1: Initial schema with all core tables
9
+ V1_INITIAL = <<~SQL
10
+ -- Schema version tracking for migrations
11
+ CREATE TABLE IF NOT EXISTS schema_migrations (
12
+ version INTEGER PRIMARY KEY,
13
+ applied_at TEXT NOT NULL DEFAULT (datetime('now'))
14
+ );
15
+
16
+ -- Checkpoints (replaces checkpoint.yml)
17
+ CREATE TABLE IF NOT EXISTS checkpoints (
18
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
19
+ project_dir TEXT NOT NULL,
20
+ step_name TEXT,
21
+ step_index INTEGER,
22
+ total_steps INTEGER,
23
+ status TEXT,
24
+ started_at TEXT,
25
+ completed_at TEXT,
26
+ run_loop_started_at TEXT,
27
+ metadata TEXT,
28
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
29
+ updated_at TEXT NOT NULL DEFAULT (datetime('now'))
30
+ );
31
+ CREATE INDEX IF NOT EXISTS idx_checkpoints_project ON checkpoints(project_dir);
32
+
33
+ -- Checkpoint history (replaces checkpoint_history.jsonl)
34
+ CREATE TABLE IF NOT EXISTS checkpoint_history (
35
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
36
+ project_dir TEXT NOT NULL,
37
+ step_name TEXT,
38
+ step_index INTEGER,
39
+ status TEXT,
40
+ timestamp TEXT NOT NULL,
41
+ metadata TEXT
42
+ );
43
+ CREATE INDEX IF NOT EXISTS idx_checkpoint_history_project ON checkpoint_history(project_dir);
44
+ CREATE INDEX IF NOT EXISTS idx_checkpoint_history_timestamp ON checkpoint_history(timestamp);
45
+
46
+ -- Tasks (replaces tasklist.jsonl)
47
+ CREATE TABLE IF NOT EXISTS tasks (
48
+ id TEXT PRIMARY KEY,
49
+ project_dir TEXT NOT NULL,
50
+ description TEXT NOT NULL,
51
+ priority TEXT DEFAULT 'medium',
52
+ status TEXT DEFAULT 'pending',
53
+ tags TEXT,
54
+ source TEXT,
55
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
56
+ updated_at TEXT NOT NULL DEFAULT (datetime('now')),
57
+ started_at TEXT,
58
+ completed_at TEXT
59
+ );
60
+ CREATE INDEX IF NOT EXISTS idx_tasks_project ON tasks(project_dir);
61
+ CREATE INDEX IF NOT EXISTS idx_tasks_status ON tasks(status);
62
+
63
+ -- Progress tracking (replaces progress/*.yml)
64
+ CREATE TABLE IF NOT EXISTS progress (
65
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
66
+ project_dir TEXT NOT NULL,
67
+ mode TEXT NOT NULL,
68
+ current_step TEXT,
69
+ current_step_index INTEGER,
70
+ total_steps INTEGER,
71
+ steps_completed TEXT,
72
+ started_at TEXT,
73
+ updated_at TEXT NOT NULL DEFAULT (datetime('now')),
74
+ metadata TEXT
75
+ );
76
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_progress_project_mode ON progress(project_dir, mode);
77
+
78
+ -- Harness state (replaces harness/*_state.json)
79
+ CREATE TABLE IF NOT EXISTS harness_state (
80
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
81
+ project_dir TEXT NOT NULL,
82
+ mode TEXT NOT NULL,
83
+ state TEXT NOT NULL,
84
+ version INTEGER DEFAULT 1,
85
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
86
+ updated_at TEXT NOT NULL DEFAULT (datetime('now'))
87
+ );
88
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_harness_state_project_mode ON harness_state(project_dir, mode);
89
+
90
+ -- Worktrees (replaces worktrees.json and pr_worktrees.json)
91
+ CREATE TABLE IF NOT EXISTS worktrees (
92
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
93
+ project_dir TEXT NOT NULL,
94
+ worktree_type TEXT NOT NULL,
95
+ path TEXT NOT NULL,
96
+ branch TEXT NOT NULL,
97
+ slug TEXT,
98
+ pr_number INTEGER,
99
+ status TEXT DEFAULT 'active',
100
+ metadata TEXT,
101
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
102
+ updated_at TEXT NOT NULL DEFAULT (datetime('now'))
103
+ );
104
+ CREATE INDEX IF NOT EXISTS idx_worktrees_project ON worktrees(project_dir);
105
+ CREATE INDEX IF NOT EXISTS idx_worktrees_type ON worktrees(worktree_type);
106
+
107
+ -- Workstream state (replaces workstreams/*/state.json)
108
+ CREATE TABLE IF NOT EXISTS workstreams (
109
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
110
+ project_dir TEXT NOT NULL,
111
+ slug TEXT NOT NULL,
112
+ status TEXT DEFAULT 'pending',
113
+ iteration INTEGER DEFAULT 0,
114
+ branch TEXT,
115
+ worktree_path TEXT,
116
+ task TEXT,
117
+ metadata TEXT,
118
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
119
+ updated_at TEXT NOT NULL DEFAULT (datetime('now'))
120
+ );
121
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_workstreams_project_slug ON workstreams(project_dir, slug);
122
+
123
+ -- Workstream history (replaces workstreams/*/history.jsonl)
124
+ CREATE TABLE IF NOT EXISTS workstream_events (
125
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
126
+ project_dir TEXT NOT NULL,
127
+ workstream_slug TEXT NOT NULL,
128
+ event_type TEXT NOT NULL,
129
+ event_data TEXT,
130
+ timestamp TEXT NOT NULL DEFAULT (datetime('now'))
131
+ );
132
+ CREATE INDEX IF NOT EXISTS idx_workstream_events_slug ON workstream_events(project_dir, workstream_slug);
133
+
134
+ -- Watch mode state (replaces watch/*.yml)
135
+ CREATE TABLE IF NOT EXISTS watch_state (
136
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
137
+ project_dir TEXT NOT NULL,
138
+ repository TEXT NOT NULL,
139
+ plans TEXT,
140
+ builds TEXT,
141
+ reviews TEXT,
142
+ ci_fixes TEXT,
143
+ change_requests TEXT,
144
+ detection_comments TEXT,
145
+ feedback_comments TEXT,
146
+ processed_reactions TEXT,
147
+ auto_prs TEXT,
148
+ projects TEXT,
149
+ hierarchies TEXT,
150
+ worktree_cleanup TEXT,
151
+ last_poll_at TEXT,
152
+ metadata TEXT,
153
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
154
+ updated_at TEXT NOT NULL DEFAULT (datetime('now'))
155
+ );
156
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_watch_state_repo ON watch_state(project_dir, repository);
157
+
158
+ -- Evaluations (replaces evaluations/*.json)
159
+ CREATE TABLE IF NOT EXISTS evaluations (
160
+ id TEXT PRIMARY KEY,
161
+ project_dir TEXT NOT NULL,
162
+ rating TEXT NOT NULL,
163
+ comment TEXT,
164
+ target_type TEXT,
165
+ target_id TEXT,
166
+ context TEXT,
167
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
168
+ );
169
+ CREATE INDEX IF NOT EXISTS idx_evaluations_project ON evaluations(project_dir);
170
+ CREATE INDEX IF NOT EXISTS idx_evaluations_rating ON evaluations(rating);
171
+
172
+ -- Provider metrics (replaces provider_metrics.yml)
173
+ CREATE TABLE IF NOT EXISTS provider_metrics (
174
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
175
+ project_dir TEXT NOT NULL,
176
+ provider_name TEXT NOT NULL,
177
+ model_name TEXT,
178
+ metrics TEXT NOT NULL,
179
+ recorded_at TEXT NOT NULL DEFAULT (datetime('now'))
180
+ );
181
+ CREATE INDEX IF NOT EXISTS idx_provider_metrics_provider ON provider_metrics(project_dir, provider_name);
182
+
183
+ -- Provider rate limits (replaces provider_rate_limits.yml)
184
+ CREATE TABLE IF NOT EXISTS provider_rate_limits (
185
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
186
+ project_dir TEXT NOT NULL,
187
+ provider_name TEXT NOT NULL,
188
+ model_name TEXT,
189
+ rate_limit_info TEXT NOT NULL,
190
+ updated_at TEXT NOT NULL DEFAULT (datetime('now'))
191
+ );
192
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_rate_limits_provider ON provider_rate_limits(project_dir, provider_name, model_name);
193
+
194
+ -- Security secrets registry (replaces security/secrets_registry.json)
195
+ CREATE TABLE IF NOT EXISTS secrets_registry (
196
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
197
+ project_dir TEXT NOT NULL,
198
+ secret_id TEXT NOT NULL,
199
+ secret_name TEXT NOT NULL,
200
+ env_var TEXT,
201
+ description TEXT,
202
+ scopes TEXT,
203
+ registered_at TEXT NOT NULL DEFAULT (datetime('now')),
204
+ metadata TEXT
205
+ );
206
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_secrets_project_name ON secrets_registry(project_dir, secret_name);
207
+
208
+ -- Prompt archive (replaces prompt_archive/*.md)
209
+ CREATE TABLE IF NOT EXISTS prompt_archive (
210
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
211
+ project_dir TEXT NOT NULL,
212
+ step_name TEXT,
213
+ content TEXT NOT NULL,
214
+ archived_at TEXT NOT NULL DEFAULT (datetime('now'))
215
+ );
216
+ CREATE INDEX IF NOT EXISTS idx_prompt_archive_project ON prompt_archive(project_dir);
217
+
218
+ -- Provider info cache (replaces providers/*_info.yml)
219
+ CREATE TABLE IF NOT EXISTS provider_info_cache (
220
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
221
+ project_dir TEXT NOT NULL,
222
+ provider_name TEXT NOT NULL,
223
+ info TEXT NOT NULL,
224
+ cached_at TEXT NOT NULL DEFAULT (datetime('now')),
225
+ expires_at TEXT
226
+ );
227
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_provider_info_name ON provider_info_cache(project_dir, provider_name);
228
+
229
+ -- Model cache (replaces model_cache/models.json)
230
+ CREATE TABLE IF NOT EXISTS model_cache (
231
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
232
+ project_dir TEXT NOT NULL,
233
+ provider_name TEXT NOT NULL,
234
+ models TEXT NOT NULL,
235
+ cached_at TEXT NOT NULL DEFAULT (datetime('now')),
236
+ expires_at TEXT
237
+ );
238
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_model_cache_provider ON model_cache(project_dir, provider_name);
239
+
240
+ -- Deprecated models cache (replaces deprecated_models.json)
241
+ CREATE TABLE IF NOT EXISTS deprecated_models (
242
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
243
+ project_dir TEXT NOT NULL,
244
+ provider_name TEXT NOT NULL,
245
+ model_name TEXT NOT NULL,
246
+ replacement TEXT,
247
+ reason TEXT,
248
+ detected_at TEXT NOT NULL DEFAULT (datetime('now'))
249
+ );
250
+ CREATE INDEX IF NOT EXISTS idx_deprecated_models_provider ON deprecated_models(project_dir, provider_name);
251
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_deprecated_models_unique ON deprecated_models(project_dir, provider_name, model_name);
252
+
253
+ -- Background jobs (replaces jobs/*)
254
+ CREATE TABLE IF NOT EXISTS background_jobs (
255
+ id TEXT PRIMARY KEY,
256
+ project_dir TEXT NOT NULL,
257
+ job_type TEXT NOT NULL,
258
+ status TEXT DEFAULT 'pending',
259
+ pid INTEGER,
260
+ options TEXT,
261
+ result TEXT,
262
+ error TEXT,
263
+ started_at TEXT,
264
+ completed_at TEXT,
265
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
266
+ );
267
+ CREATE INDEX IF NOT EXISTS idx_jobs_project ON background_jobs(project_dir);
268
+ CREATE INDEX IF NOT EXISTS idx_jobs_status ON background_jobs(status);
269
+
270
+ -- Auto-update checkpoints (replaces checkpoints/*.json)
271
+ CREATE TABLE IF NOT EXISTS auto_update_checkpoints (
272
+ id TEXT PRIMARY KEY,
273
+ project_dir TEXT NOT NULL,
274
+ checkpoint_type TEXT,
275
+ data TEXT NOT NULL,
276
+ checksum TEXT,
277
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
278
+ );
279
+ CREATE INDEX IF NOT EXISTS idx_auto_checkpoints_project ON auto_update_checkpoints(project_dir);
280
+ SQL
281
+
282
+ # Version 2: Add prompt feedback table for AGD pattern
283
+ V2_PROMPT_FEEDBACK = <<~SQL
284
+ -- Prompt feedback (tracks prompt template effectiveness for AGD evolution)
285
+ CREATE TABLE IF NOT EXISTS prompt_feedback (
286
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
287
+ project_dir TEXT NOT NULL,
288
+ template_id TEXT NOT NULL,
289
+ outcome TEXT NOT NULL,
290
+ iterations INTEGER,
291
+ user_reaction TEXT,
292
+ suggestions TEXT,
293
+ context TEXT,
294
+ aidp_version TEXT,
295
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
296
+ );
297
+ CREATE INDEX IF NOT EXISTS idx_prompt_feedback_project ON prompt_feedback(project_dir);
298
+ CREATE INDEX IF NOT EXISTS idx_prompt_feedback_template ON prompt_feedback(template_id);
299
+ CREATE INDEX IF NOT EXISTS idx_prompt_feedback_outcome ON prompt_feedback(outcome);
300
+ SQL
301
+
302
+ # Version 3: Add template_versions table for versioned template management
303
+ V3_TEMPLATE_VERSIONS = <<~SQL
304
+ -- Template versions (tracks template versions with feedback-based selection)
305
+ CREATE TABLE IF NOT EXISTS template_versions (
306
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
307
+ project_dir TEXT NOT NULL,
308
+ template_id TEXT NOT NULL,
309
+ version_number INTEGER NOT NULL,
310
+ content TEXT NOT NULL,
311
+ parent_version_id INTEGER,
312
+ is_active INTEGER DEFAULT 0 CHECK (is_active IN (0, 1)),
313
+ positive_votes INTEGER DEFAULT 0,
314
+ negative_votes INTEGER DEFAULT 0,
315
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
316
+ metadata TEXT -- JSON-encoded hash with evolution context (source, suggestions, changes)
317
+ );
318
+ CREATE INDEX IF NOT EXISTS idx_template_versions_project ON template_versions(project_dir);
319
+ CREATE INDEX IF NOT EXISTS idx_template_versions_template ON template_versions(project_dir, template_id);
320
+ CREATE INDEX IF NOT EXISTS idx_template_versions_active ON template_versions(project_dir, template_id, is_active);
321
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_template_versions_unique ON template_versions(project_dir, template_id, version_number);
322
+ SQL
323
+
324
+ # All migrations in order
325
+ MIGRATIONS = {
326
+ 1 => V1_INITIAL,
327
+ 2 => V2_PROMPT_FEEDBACK,
328
+ 3 => V3_TEMPLATE_VERSIONS
329
+ }.freeze
330
+
331
+ # Get SQL for a specific version
332
+ def self.migration_sql(version)
333
+ MIGRATIONS[version]
334
+ end
335
+
336
+ # Get all migration versions
337
+ def self.versions
338
+ MIGRATIONS.keys.sort
339
+ end
340
+
341
+ # Get latest version
342
+ def self.latest_version
343
+ versions.last || 0
344
+ end
345
+ end
346
+ end
347
+ end