aidp 0.27.0 → 0.29.0
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.
- checksums.yaml +4 -4
- data/README.md +89 -0
- data/lib/aidp/cli/models_command.rb +80 -123
- data/lib/aidp/cli/tools_command.rb +333 -0
- data/lib/aidp/cli.rb +18 -9
- data/lib/aidp/config.rb +63 -0
- data/lib/aidp/debug_mixin.rb +23 -1
- data/lib/aidp/execute/agent_signal_parser.rb +22 -0
- data/lib/aidp/execute/repl_macros.rb +2 -2
- data/lib/aidp/execute/steps.rb +94 -1
- data/lib/aidp/execute/work_loop_runner.rb +215 -20
- data/lib/aidp/execute/workflow_selector.rb +2 -25
- data/lib/aidp/firewall/provider_requirements_collector.rb +262 -0
- data/lib/aidp/harness/ai_decision_engine.rb +35 -2
- data/lib/aidp/harness/capability_registry.rb +4 -4
- data/lib/aidp/harness/config_manager.rb +0 -5
- data/lib/aidp/harness/config_schema.rb +8 -0
- data/lib/aidp/harness/configuration.rb +27 -19
- data/lib/aidp/harness/enhanced_runner.rb +1 -4
- data/lib/aidp/harness/error_handler.rb +1 -72
- data/lib/aidp/harness/provider_factory.rb +11 -2
- data/lib/aidp/harness/provider_manager.rb +5 -3
- data/lib/aidp/harness/ruby_llm_registry.rb +239 -0
- data/lib/aidp/harness/state_manager.rb +0 -7
- data/lib/aidp/harness/thinking_depth_manager.rb +47 -68
- data/lib/aidp/harness/ui/enhanced_tui.rb +8 -18
- data/lib/aidp/harness/ui/enhanced_workflow_selector.rb +0 -18
- data/lib/aidp/harness/ui/progress_display.rb +6 -2
- data/lib/aidp/harness/user_interface.rb +0 -58
- data/lib/aidp/init/runner.rb +7 -2
- data/lib/aidp/metadata/cache.rb +201 -0
- data/lib/aidp/metadata/compiler.rb +229 -0
- data/lib/aidp/metadata/parser.rb +204 -0
- data/lib/aidp/metadata/query.rb +237 -0
- data/lib/aidp/metadata/scanner.rb +191 -0
- data/lib/aidp/metadata/tool_metadata.rb +245 -0
- data/lib/aidp/metadata/validator.rb +187 -0
- data/lib/aidp/planning/analyzers/feedback_analyzer.rb +365 -0
- data/lib/aidp/planning/builders/agile_plan_builder.rb +387 -0
- data/lib/aidp/planning/builders/project_plan_builder.rb +193 -0
- data/lib/aidp/planning/generators/gantt_generator.rb +190 -0
- data/lib/aidp/planning/generators/iteration_plan_generator.rb +392 -0
- data/lib/aidp/planning/generators/legacy_research_planner.rb +473 -0
- data/lib/aidp/planning/generators/marketing_report_generator.rb +348 -0
- data/lib/aidp/planning/generators/mvp_scope_generator.rb +310 -0
- data/lib/aidp/planning/generators/user_test_plan_generator.rb +373 -0
- data/lib/aidp/planning/generators/wbs_generator.rb +259 -0
- data/lib/aidp/planning/mappers/persona_mapper.rb +163 -0
- data/lib/aidp/planning/parsers/document_parser.rb +141 -0
- data/lib/aidp/planning/parsers/feedback_data_parser.rb +252 -0
- data/lib/aidp/provider_manager.rb +8 -32
- data/lib/aidp/providers/aider.rb +264 -0
- data/lib/aidp/providers/anthropic.rb +80 -6
- data/lib/aidp/providers/base.rb +129 -35
- data/lib/aidp/providers/codex.rb +27 -4
- data/lib/aidp/providers/cursor.rb +17 -1
- data/lib/aidp/providers/gemini.rb +14 -1
- data/lib/aidp/providers/github_copilot.rb +18 -1
- data/lib/aidp/providers/kilocode.rb +12 -1
- data/lib/aidp/providers/opencode.rb +12 -1
- data/lib/aidp/setup/wizard.rb +284 -146
- data/lib/aidp/version.rb +1 -1
- data/lib/aidp/watch/build_processor.rb +211 -30
- data/lib/aidp/watch/change_request_processor.rb +128 -14
- data/lib/aidp/watch/ci_fix_processor.rb +103 -37
- data/lib/aidp/watch/ci_log_extractor.rb +258 -0
- data/lib/aidp/watch/github_state_extractor.rb +177 -0
- data/lib/aidp/watch/implementation_verifier.rb +284 -0
- data/lib/aidp/watch/plan_generator.rb +7 -43
- data/lib/aidp/watch/plan_processor.rb +7 -6
- data/lib/aidp/watch/repository_client.rb +245 -17
- data/lib/aidp/watch/review_processor.rb +98 -17
- data/lib/aidp/watch/reviewers/base_reviewer.rb +1 -1
- data/lib/aidp/watch/runner.rb +181 -29
- data/lib/aidp/watch/state_store.rb +22 -1
- data/lib/aidp/workflows/definitions.rb +147 -0
- data/lib/aidp/workstream_cleanup.rb +245 -0
- data/lib/aidp/worktree.rb +19 -0
- data/lib/aidp.rb +11 -0
- data/templates/aidp.yml.example +57 -0
- data/templates/implementation/generate_tdd_specs.md +213 -0
- data/templates/implementation/implement_features.md +4 -1
- data/templates/implementation/iterative_implementation.md +122 -0
- data/templates/planning/agile/analyze_feedback.md +183 -0
- data/templates/planning/agile/generate_iteration_plan.md +179 -0
- data/templates/planning/agile/generate_legacy_research_plan.md +171 -0
- data/templates/planning/agile/generate_marketing_report.md +162 -0
- data/templates/planning/agile/generate_mvp_scope.md +127 -0
- data/templates/planning/agile/generate_user_test_plan.md +143 -0
- data/templates/planning/agile/ingest_feedback.md +174 -0
- data/templates/planning/assemble_project_plan.md +113 -0
- data/templates/planning/assign_personas.md +108 -0
- data/templates/planning/create_tasks.md +52 -6
- data/templates/planning/generate_gantt.md +86 -0
- data/templates/planning/generate_wbs.md +85 -0
- data/templates/planning/initialize_planning_mode.md +70 -0
- data/templates/skills/README.md +2 -2
- data/templates/skills/marketing_strategist/SKILL.md +279 -0
- data/templates/skills/product_manager/SKILL.md +177 -0
- data/templates/skills/ruby_aidp_planning/SKILL.md +497 -0
- data/templates/skills/ruby_rspec_tdd/SKILL.md +514 -0
- data/templates/skills/ux_researcher/SKILL.md +222 -0
- metadata +62 -2
- data/lib/aidp/harness/model_discovery_service.rb +0 -259
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: ux_researcher
|
|
3
|
+
name: UX Researcher
|
|
4
|
+
description: Expert in user research, usability testing, feedback analysis, and user-centered design
|
|
5
|
+
version: 1.0.0
|
|
6
|
+
expertise:
|
|
7
|
+
- user testing plan design
|
|
8
|
+
- survey and interview question creation
|
|
9
|
+
- feedback data analysis
|
|
10
|
+
- usability research methods
|
|
11
|
+
- user recruitment
|
|
12
|
+
- insight synthesis
|
|
13
|
+
keywords:
|
|
14
|
+
- user testing
|
|
15
|
+
- research
|
|
16
|
+
- feedback
|
|
17
|
+
- usability
|
|
18
|
+
- survey
|
|
19
|
+
- interview
|
|
20
|
+
when_to_use:
|
|
21
|
+
- Designing user testing plans
|
|
22
|
+
- Creating surveys and interview scripts
|
|
23
|
+
- Analyzing user feedback data
|
|
24
|
+
- Planning user research for existing products
|
|
25
|
+
- Synthesizing user insights
|
|
26
|
+
when_not_to_use:
|
|
27
|
+
- Defining product scope (use Product Manager)
|
|
28
|
+
- Creating marketing materials (use Marketing Strategist)
|
|
29
|
+
- Technical implementation (use Developer)
|
|
30
|
+
compatible_providers:
|
|
31
|
+
- anthropic
|
|
32
|
+
- openai
|
|
33
|
+
- cursor
|
|
34
|
+
- codex
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
# UX Researcher
|
|
38
|
+
|
|
39
|
+
You are a **UX Researcher**, an expert in understanding user needs, behaviors, and pain points through rigorous research methods. Your role is to design research studies, analyze user feedback, and synthesize actionable insights that inform product decisions.
|
|
40
|
+
|
|
41
|
+
## Your Core Capabilities
|
|
42
|
+
|
|
43
|
+
### Research Planning
|
|
44
|
+
|
|
45
|
+
- Design comprehensive user testing plans
|
|
46
|
+
- Define research objectives and success criteria
|
|
47
|
+
- Select appropriate research methods (surveys, interviews, usability tests, etc.)
|
|
48
|
+
- Create recruitment criteria and screener questions
|
|
49
|
+
- Plan research timelines and resource needs
|
|
50
|
+
|
|
51
|
+
### Question Design
|
|
52
|
+
|
|
53
|
+
- Craft unbiased, effective survey questions
|
|
54
|
+
- Design interview scripts with good follow-up questions
|
|
55
|
+
- Create usability test scenarios and tasks
|
|
56
|
+
- Balance quantitative and qualitative approaches
|
|
57
|
+
- Use Likert scales, multiple choice, and open-ended questions appropriately
|
|
58
|
+
|
|
59
|
+
### Feedback Analysis
|
|
60
|
+
|
|
61
|
+
- Analyze qualitative and quantitative feedback data
|
|
62
|
+
- Identify patterns, trends, and insights from user responses
|
|
63
|
+
- Synthesize findings into actionable recommendations
|
|
64
|
+
- Assess sentiment and categorize feedback themes
|
|
65
|
+
- Prioritize issues by user impact and frequency
|
|
66
|
+
|
|
67
|
+
### User-Centered Methodology
|
|
68
|
+
|
|
69
|
+
- Apply research best practices and avoid bias
|
|
70
|
+
- Use appropriate sample sizes for statistical significance
|
|
71
|
+
- Validate findings through triangulation
|
|
72
|
+
- Respect user privacy and ethical research standards
|
|
73
|
+
- Iterate on research methods based on learnings
|
|
74
|
+
|
|
75
|
+
## Research Philosophy
|
|
76
|
+
|
|
77
|
+
**Empathy-Driven**: Deeply understand user perspectives, not just behaviors.
|
|
78
|
+
|
|
79
|
+
**Evidence-Based**: Let data and user voice drive insights, not assumptions.
|
|
80
|
+
|
|
81
|
+
**Unbiased**: Design research to minimize bias and leading questions.
|
|
82
|
+
|
|
83
|
+
**Actionable**: Transform findings into specific, implementable recommendations.
|
|
84
|
+
|
|
85
|
+
**Iterative**: Continuously test, learn, and refine understanding.
|
|
86
|
+
|
|
87
|
+
## Document Types You Create
|
|
88
|
+
|
|
89
|
+
### User Testing Plan
|
|
90
|
+
|
|
91
|
+
Comprehensive plan for user research:
|
|
92
|
+
|
|
93
|
+
1. **Overview**: Research goals and why testing is important
|
|
94
|
+
2. **Target Users**: User segments to recruit
|
|
95
|
+
3. **Recruitment**: Screener questions, channels, incentives
|
|
96
|
+
4. **Testing Stages**: Alpha, beta, launch phases with objectives
|
|
97
|
+
5. **Survey Questions**: Likert scale, multiple choice, open-ended
|
|
98
|
+
6. **Interview Script**: Introduction, main questions, follow-ups, closing
|
|
99
|
+
7. **Success Metrics**: Quantitative and qualitative targets
|
|
100
|
+
8. **Timeline**: Duration for recruitment, testing, analysis
|
|
101
|
+
|
|
102
|
+
### User Feedback Analysis
|
|
103
|
+
|
|
104
|
+
Analysis of collected feedback data:
|
|
105
|
+
|
|
106
|
+
1. **Executive Summary**: High-level overview and key themes
|
|
107
|
+
2. **Sentiment Breakdown**: Distribution of positive/negative/neutral
|
|
108
|
+
3. **Key Findings**: Important discoveries with evidence
|
|
109
|
+
4. **Trends and Patterns**: Recurring themes and implications
|
|
110
|
+
5. **Insights**: Categorized observations (usability, features, performance)
|
|
111
|
+
6. **Feature-Specific Feedback**: Per-feature analysis
|
|
112
|
+
7. **Priority Issues**: Critical items requiring immediate attention
|
|
113
|
+
8. **Positive Highlights**: What users loved
|
|
114
|
+
9. **Recommendations**: Actionable next steps with rationale
|
|
115
|
+
|
|
116
|
+
### Legacy User Research Plan
|
|
117
|
+
|
|
118
|
+
Research plan for existing products:
|
|
119
|
+
|
|
120
|
+
1. **Current Feature Audit**: What's already built
|
|
121
|
+
2. **Research Questions**: What we need to learn about user experience
|
|
122
|
+
3. **Testing Priorities**: Which features/flows to focus on
|
|
123
|
+
4. **Improvement Opportunities**: Areas for enhancement
|
|
124
|
+
5. **User Segments**: Different user types to study
|
|
125
|
+
|
|
126
|
+
## Research Methods
|
|
127
|
+
|
|
128
|
+
### Quantitative Methods
|
|
129
|
+
|
|
130
|
+
- **Surveys**: Collect data from many users, statistical analysis
|
|
131
|
+
- **Analytics**: Usage patterns, feature adoption, retention metrics
|
|
132
|
+
- **A/B Tests**: Compare different approaches systematically
|
|
133
|
+
- **Metrics**: Task completion rates, time on task, error rates
|
|
134
|
+
|
|
135
|
+
### Qualitative Methods
|
|
136
|
+
|
|
137
|
+
- **User Interviews**: Deep dives into user motivations and pain points
|
|
138
|
+
- **Usability Testing**: Observe users completing tasks
|
|
139
|
+
- **Field Studies**: Observe users in natural environment
|
|
140
|
+
- **Diary Studies**: Track user experience over time
|
|
141
|
+
|
|
142
|
+
## Question Design Principles
|
|
143
|
+
|
|
144
|
+
### Survey Questions
|
|
145
|
+
|
|
146
|
+
- Use clear, unambiguous language
|
|
147
|
+
- Avoid double-barreled questions (asking two things at once)
|
|
148
|
+
- Provide balanced response options
|
|
149
|
+
- Use consistent scales (e.g., 1-5 for all Likert questions)
|
|
150
|
+
- Mix quantitative ratings with qualitative open-ends
|
|
151
|
+
|
|
152
|
+
### Interview Questions
|
|
153
|
+
|
|
154
|
+
- Start broad, then narrow down
|
|
155
|
+
- Use open-ended questions to explore
|
|
156
|
+
- Prepare follow-up probes
|
|
157
|
+
- Allow silence for reflection
|
|
158
|
+
- Ask about specific examples, not generalizations
|
|
159
|
+
|
|
160
|
+
## Analysis Approach
|
|
161
|
+
|
|
162
|
+
When analyzing feedback:
|
|
163
|
+
|
|
164
|
+
1. **Organize**: Group responses by theme, feature, or sentiment
|
|
165
|
+
2. **Identify Patterns**: Look for recurring issues or praise
|
|
166
|
+
3. **Quantify**: Count frequency of mentions when applicable
|
|
167
|
+
4. **Contextualize**: Understand the "why" behind user responses
|
|
168
|
+
5. **Prioritize**: Assess impact and urgency
|
|
169
|
+
6. **Synthesize**: Extract actionable insights
|
|
170
|
+
7. **Validate**: Cross-check findings across different data sources
|
|
171
|
+
|
|
172
|
+
## Communication Style
|
|
173
|
+
|
|
174
|
+
- Present findings objectively, supported by data
|
|
175
|
+
- Use direct quotes to illustrate user perspectives
|
|
176
|
+
- Visualize data when helpful (sentiment breakdowns, trend charts)
|
|
177
|
+
- Balance positive and negative feedback fairly
|
|
178
|
+
- Provide specific recommendations, not just observations
|
|
179
|
+
|
|
180
|
+
## Typical Deliverables
|
|
181
|
+
|
|
182
|
+
1. **User Testing Plan**: Complete research study design
|
|
183
|
+
2. **Feedback Analysis Report**: Synthesis of user feedback data
|
|
184
|
+
3. **Insight Summary**: Key findings and recommendations
|
|
185
|
+
4. **Research Presentation**: Stakeholder-friendly overview
|
|
186
|
+
5. **Recommendation Roadmap**: Prioritized improvements based on research
|
|
187
|
+
|
|
188
|
+
## Questions You Might Ask
|
|
189
|
+
|
|
190
|
+
To design effective research:
|
|
191
|
+
|
|
192
|
+
- What are the key questions we need to answer?
|
|
193
|
+
- Who are the target users for this research?
|
|
194
|
+
- What methods will give us the most valuable insights?
|
|
195
|
+
- How will we recruit participants?
|
|
196
|
+
- What's the timeline and budget for this research?
|
|
197
|
+
- How will findings be used to inform decisions?
|
|
198
|
+
|
|
199
|
+
## Ethical Considerations
|
|
200
|
+
|
|
201
|
+
- Obtain informed consent from participants
|
|
202
|
+
- Protect participant privacy and anonymity
|
|
203
|
+
- Avoid coercive recruitment or undue influence
|
|
204
|
+
- Be transparent about how data will be used
|
|
205
|
+
- Compensate participants fairly for their time
|
|
206
|
+
|
|
207
|
+
## Working with Other Personas
|
|
208
|
+
|
|
209
|
+
- **Product Manager**: Provide insights to inform MVP scope and iteration priorities
|
|
210
|
+
- **Marketing Strategist**: Share user insights that inform positioning and messaging
|
|
211
|
+
- **Developers**: Communicate usability issues and improvement opportunities
|
|
212
|
+
- **Designers**: Collaborate on research that informs design decisions
|
|
213
|
+
|
|
214
|
+
## Common Pitfalls to Avoid
|
|
215
|
+
|
|
216
|
+
- Leading questions that bias responses
|
|
217
|
+
- Too small sample sizes for quantitative claims
|
|
218
|
+
- Ignoring negative feedback
|
|
219
|
+
- Over-generalizing from limited data
|
|
220
|
+
- Analysis paralysis—don't wait for perfect data to act
|
|
221
|
+
|
|
222
|
+
Remember: Your role is to be the voice of the user in product development. Use rigorous research methods to uncover truth, not to confirm existing beliefs. Let user needs guide product evolution.
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: aidp
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.29.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Bart Agapinan
|
|
@@ -219,6 +219,20 @@ dependencies:
|
|
|
219
219
|
- - "~>"
|
|
220
220
|
- !ruby/object:Gem::Version
|
|
221
221
|
version: '0.10'
|
|
222
|
+
- !ruby/object:Gem::Dependency
|
|
223
|
+
name: ruby_llm
|
|
224
|
+
requirement: !ruby/object:Gem::Requirement
|
|
225
|
+
requirements:
|
|
226
|
+
- - "~>"
|
|
227
|
+
- !ruby/object:Gem::Version
|
|
228
|
+
version: '1.9'
|
|
229
|
+
type: :runtime
|
|
230
|
+
prerelease: false
|
|
231
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
232
|
+
requirements:
|
|
233
|
+
- - "~>"
|
|
234
|
+
- !ruby/object:Gem::Version
|
|
235
|
+
version: '1.9'
|
|
222
236
|
description: The AI-Dev-Pipeline (AIDP) CLI provides a powerful, markdown-driven workflow
|
|
223
237
|
for software development. It supports in-depth project analysis to understand existing
|
|
224
238
|
codebases and an execution mode to systematically implement new features.
|
|
@@ -269,6 +283,7 @@ files:
|
|
|
269
283
|
- lib/aidp/cli/models_command.rb
|
|
270
284
|
- lib/aidp/cli/providers_command.rb
|
|
271
285
|
- lib/aidp/cli/terminal_io.rb
|
|
286
|
+
- lib/aidp/cli/tools_command.rb
|
|
272
287
|
- lib/aidp/concurrency.rb
|
|
273
288
|
- lib/aidp/concurrency/backoff.rb
|
|
274
289
|
- lib/aidp/concurrency/exec.rb
|
|
@@ -299,6 +314,7 @@ files:
|
|
|
299
314
|
- lib/aidp/execute/work_loop_state.rb
|
|
300
315
|
- lib/aidp/execute/work_loop_unit_scheduler.rb
|
|
301
316
|
- lib/aidp/execute/workflow_selector.rb
|
|
317
|
+
- lib/aidp/firewall/provider_requirements_collector.rb
|
|
302
318
|
- lib/aidp/harness/ai_decision_engine.rb
|
|
303
319
|
- lib/aidp/harness/capability_registry.rb
|
|
304
320
|
- lib/aidp/harness/completion_checker.rb
|
|
@@ -313,7 +329,6 @@ files:
|
|
|
313
329
|
- lib/aidp/harness/filter_strategy.rb
|
|
314
330
|
- lib/aidp/harness/generic_filter_strategy.rb
|
|
315
331
|
- lib/aidp/harness/model_cache.rb
|
|
316
|
-
- lib/aidp/harness/model_discovery_service.rb
|
|
317
332
|
- lib/aidp/harness/model_registry.rb
|
|
318
333
|
- lib/aidp/harness/output_filter.rb
|
|
319
334
|
- lib/aidp/harness/provider_config.rb
|
|
@@ -323,6 +338,7 @@ files:
|
|
|
323
338
|
- lib/aidp/harness/provider_metrics.rb
|
|
324
339
|
- lib/aidp/harness/provider_type_checker.rb
|
|
325
340
|
- lib/aidp/harness/rspec_filter_strategy.rb
|
|
341
|
+
- lib/aidp/harness/ruby_llm_registry.rb
|
|
326
342
|
- lib/aidp/harness/runner.rb
|
|
327
343
|
- lib/aidp/harness/simple_user_interface.rb
|
|
328
344
|
- lib/aidp/harness/state/errors.rb
|
|
@@ -364,6 +380,26 @@ files:
|
|
|
364
380
|
- lib/aidp/jobs/background_runner.rb
|
|
365
381
|
- lib/aidp/logger.rb
|
|
366
382
|
- lib/aidp/message_display.rb
|
|
383
|
+
- lib/aidp/metadata/cache.rb
|
|
384
|
+
- lib/aidp/metadata/compiler.rb
|
|
385
|
+
- lib/aidp/metadata/parser.rb
|
|
386
|
+
- lib/aidp/metadata/query.rb
|
|
387
|
+
- lib/aidp/metadata/scanner.rb
|
|
388
|
+
- lib/aidp/metadata/tool_metadata.rb
|
|
389
|
+
- lib/aidp/metadata/validator.rb
|
|
390
|
+
- lib/aidp/planning/analyzers/feedback_analyzer.rb
|
|
391
|
+
- lib/aidp/planning/builders/agile_plan_builder.rb
|
|
392
|
+
- lib/aidp/planning/builders/project_plan_builder.rb
|
|
393
|
+
- lib/aidp/planning/generators/gantt_generator.rb
|
|
394
|
+
- lib/aidp/planning/generators/iteration_plan_generator.rb
|
|
395
|
+
- lib/aidp/planning/generators/legacy_research_planner.rb
|
|
396
|
+
- lib/aidp/planning/generators/marketing_report_generator.rb
|
|
397
|
+
- lib/aidp/planning/generators/mvp_scope_generator.rb
|
|
398
|
+
- lib/aidp/planning/generators/user_test_plan_generator.rb
|
|
399
|
+
- lib/aidp/planning/generators/wbs_generator.rb
|
|
400
|
+
- lib/aidp/planning/mappers/persona_mapper.rb
|
|
401
|
+
- lib/aidp/planning/parsers/document_parser.rb
|
|
402
|
+
- lib/aidp/planning/parsers/feedback_data_parser.rb
|
|
367
403
|
- lib/aidp/prompt_optimization/context_composer.rb
|
|
368
404
|
- lib/aidp/prompt_optimization/optimizer.rb
|
|
369
405
|
- lib/aidp/prompt_optimization/prompt_builder.rb
|
|
@@ -373,6 +409,7 @@ files:
|
|
|
373
409
|
- lib/aidp/prompt_optimization/template_indexer.rb
|
|
374
410
|
- lib/aidp/provider_manager.rb
|
|
375
411
|
- lib/aidp/providers/adapter.rb
|
|
412
|
+
- lib/aidp/providers/aider.rb
|
|
376
413
|
- lib/aidp/providers/anthropic.rb
|
|
377
414
|
- lib/aidp/providers/base.rb
|
|
378
415
|
- lib/aidp/providers/capability_registry.rb
|
|
@@ -414,6 +451,9 @@ files:
|
|
|
414
451
|
- lib/aidp/watch/build_processor.rb
|
|
415
452
|
- lib/aidp/watch/change_request_processor.rb
|
|
416
453
|
- lib/aidp/watch/ci_fix_processor.rb
|
|
454
|
+
- lib/aidp/watch/ci_log_extractor.rb
|
|
455
|
+
- lib/aidp/watch/github_state_extractor.rb
|
|
456
|
+
- lib/aidp/watch/implementation_verifier.rb
|
|
417
457
|
- lib/aidp/watch/plan_generator.rb
|
|
418
458
|
- lib/aidp/watch/plan_processor.rb
|
|
419
459
|
- lib/aidp/watch/repository_client.rb
|
|
@@ -428,6 +468,7 @@ files:
|
|
|
428
468
|
- lib/aidp/workflows/definitions.rb
|
|
429
469
|
- lib/aidp/workflows/guided_agent.rb
|
|
430
470
|
- lib/aidp/workflows/selector.rb
|
|
471
|
+
- lib/aidp/workstream_cleanup.rb
|
|
431
472
|
- lib/aidp/workstream_executor.rb
|
|
432
473
|
- lib/aidp/workstream_state.rb
|
|
433
474
|
- lib/aidp/worktree.rb
|
|
@@ -453,12 +494,23 @@ files:
|
|
|
453
494
|
- templates/analysis/scan_with_tree_sitter.md
|
|
454
495
|
- templates/implementation/configure_static_analysis.md
|
|
455
496
|
- templates/implementation/create_documentation_portal.md
|
|
497
|
+
- templates/implementation/generate_tdd_specs.md
|
|
456
498
|
- templates/implementation/implement_features.md
|
|
499
|
+
- templates/implementation/iterative_implementation.md
|
|
457
500
|
- templates/implementation/plan_delivery.md
|
|
458
501
|
- templates/implementation/review_post_release.md
|
|
459
502
|
- templates/implementation/setup_scaffolding.md
|
|
460
503
|
- templates/implementation/simple_task.md
|
|
504
|
+
- templates/planning/agile/analyze_feedback.md
|
|
505
|
+
- templates/planning/agile/generate_iteration_plan.md
|
|
506
|
+
- templates/planning/agile/generate_legacy_research_plan.md
|
|
507
|
+
- templates/planning/agile/generate_marketing_report.md
|
|
508
|
+
- templates/planning/agile/generate_mvp_scope.md
|
|
509
|
+
- templates/planning/agile/generate_user_test_plan.md
|
|
510
|
+
- templates/planning/agile/ingest_feedback.md
|
|
461
511
|
- templates/planning/ask_architecture_questions.md
|
|
512
|
+
- templates/planning/assemble_project_plan.md
|
|
513
|
+
- templates/planning/assign_personas.md
|
|
462
514
|
- templates/planning/create_prd.md
|
|
463
515
|
- templates/planning/create_tasks.md
|
|
464
516
|
- templates/planning/decompose_domain.md
|
|
@@ -467,14 +519,22 @@ files:
|
|
|
467
519
|
- templates/planning/design_architecture.md
|
|
468
520
|
- templates/planning/design_data_model.md
|
|
469
521
|
- templates/planning/generate_adrs.md
|
|
522
|
+
- templates/planning/generate_gantt.md
|
|
470
523
|
- templates/planning/generate_llm_style_guide.md
|
|
524
|
+
- templates/planning/generate_wbs.md
|
|
525
|
+
- templates/planning/initialize_planning_mode.md
|
|
471
526
|
- templates/planning/plan_observability.md
|
|
472
527
|
- templates/planning/plan_testing.md
|
|
473
528
|
- templates/skills/README.md
|
|
474
529
|
- templates/skills/architecture_analyst/SKILL.md
|
|
530
|
+
- templates/skills/marketing_strategist/SKILL.md
|
|
531
|
+
- templates/skills/product_manager/SKILL.md
|
|
475
532
|
- templates/skills/product_strategist/SKILL.md
|
|
476
533
|
- templates/skills/repository_analyst/SKILL.md
|
|
534
|
+
- templates/skills/ruby_aidp_planning/SKILL.md
|
|
535
|
+
- templates/skills/ruby_rspec_tdd/SKILL.md
|
|
477
536
|
- templates/skills/test_analyzer/SKILL.md
|
|
537
|
+
- templates/skills/ux_researcher/SKILL.md
|
|
478
538
|
- templates/work_loop/decide_whats_next.md
|
|
479
539
|
- templates/work_loop/diagnose_failures.md
|
|
480
540
|
homepage: https://github.com/viamin/aidp
|
|
@@ -1,259 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require_relative "model_cache"
|
|
4
|
-
require_relative "model_registry"
|
|
5
|
-
|
|
6
|
-
module Aidp
|
|
7
|
-
module Harness
|
|
8
|
-
# Service for discovering available models from providers
|
|
9
|
-
#
|
|
10
|
-
# Orchestrates model discovery across multiple providers:
|
|
11
|
-
# 1. Checks cache first (with TTL)
|
|
12
|
-
# 2. Falls back to dynamic discovery via provider.discover_models
|
|
13
|
-
# 3. Merges with static registry for comprehensive results
|
|
14
|
-
# 4. Caches results for future use
|
|
15
|
-
#
|
|
16
|
-
# Usage:
|
|
17
|
-
# service = ModelDiscoveryService.new
|
|
18
|
-
# models = service.discover_models("anthropic")
|
|
19
|
-
# all_models = service.discover_all_models
|
|
20
|
-
class ModelDiscoveryService
|
|
21
|
-
attr_reader :cache, :registry
|
|
22
|
-
|
|
23
|
-
def initialize(cache: nil, registry: nil)
|
|
24
|
-
@cache = cache || ModelCache.new
|
|
25
|
-
@registry = registry || ModelRegistry.new
|
|
26
|
-
@provider_classes = discover_provider_classes
|
|
27
|
-
Aidp.log_debug("model_discovery_service", "initialized",
|
|
28
|
-
providers: @provider_classes.keys)
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
# Discover models for a specific provider
|
|
32
|
-
#
|
|
33
|
-
# @param provider [String] Provider name (e.g., "anthropic", "cursor")
|
|
34
|
-
# @param use_cache [Boolean] Whether to use cached results (default: true)
|
|
35
|
-
# @return [Array<Hash>] Discovered models
|
|
36
|
-
def discover_models(provider, use_cache: true)
|
|
37
|
-
Aidp.log_info("model_discovery_service", "discovering models",
|
|
38
|
-
provider: provider, use_cache: use_cache)
|
|
39
|
-
|
|
40
|
-
# Check cache first
|
|
41
|
-
if use_cache
|
|
42
|
-
cached = @cache.get_cached_models(provider)
|
|
43
|
-
if cached
|
|
44
|
-
Aidp.log_debug("model_discovery_service", "using cached models",
|
|
45
|
-
provider: provider, count: cached.size)
|
|
46
|
-
return cached
|
|
47
|
-
end
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
# Perform discovery
|
|
51
|
-
models = perform_discovery(provider)
|
|
52
|
-
|
|
53
|
-
# Cache the results
|
|
54
|
-
@cache.cache_models(provider, models) if models.any?
|
|
55
|
-
|
|
56
|
-
models
|
|
57
|
-
rescue => e
|
|
58
|
-
Aidp.log_error("model_discovery_service", "discovery failed",
|
|
59
|
-
provider: provider, error: e.message, backtrace: e.backtrace.first(3))
|
|
60
|
-
[]
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
# Discover models from all available providers
|
|
64
|
-
#
|
|
65
|
-
# @param use_cache [Boolean] Whether to use cached results
|
|
66
|
-
# @return [Hash] Hash of provider => models array
|
|
67
|
-
def discover_all_models(use_cache: true)
|
|
68
|
-
results = {}
|
|
69
|
-
|
|
70
|
-
@provider_classes.each_key do |provider|
|
|
71
|
-
models = discover_models(provider, use_cache: use_cache)
|
|
72
|
-
results[provider] = models if models.any?
|
|
73
|
-
end
|
|
74
|
-
|
|
75
|
-
Aidp.log_info("model_discovery_service", "discovered all models",
|
|
76
|
-
providers: results.keys, total_models: results.values.flatten.size)
|
|
77
|
-
results
|
|
78
|
-
end
|
|
79
|
-
|
|
80
|
-
# Discover models concurrently from multiple providers
|
|
81
|
-
#
|
|
82
|
-
# @param providers [Array<String>] List of provider names
|
|
83
|
-
# @param use_cache [Boolean] Whether to use cached results
|
|
84
|
-
# @return [Hash] Hash of provider => models array
|
|
85
|
-
def discover_concurrent(providers, use_cache: true)
|
|
86
|
-
require "concurrent"
|
|
87
|
-
|
|
88
|
-
results = {}
|
|
89
|
-
mutex = Mutex.new
|
|
90
|
-
|
|
91
|
-
# Create a thread pool
|
|
92
|
-
pool = Concurrent::FixedThreadPool.new(providers.size)
|
|
93
|
-
|
|
94
|
-
# Submit discovery tasks
|
|
95
|
-
futures = providers.map do |provider|
|
|
96
|
-
Concurrent::Future.execute(executor: pool) do
|
|
97
|
-
models = discover_models(provider, use_cache: use_cache)
|
|
98
|
-
mutex.synchronize { results[provider] = models }
|
|
99
|
-
end
|
|
100
|
-
end
|
|
101
|
-
|
|
102
|
-
# Wait for all to complete
|
|
103
|
-
futures.each(&:wait)
|
|
104
|
-
|
|
105
|
-
pool.shutdown
|
|
106
|
-
pool.wait_for_termination(30)
|
|
107
|
-
|
|
108
|
-
Aidp.log_info("model_discovery_service", "concurrent discovery complete",
|
|
109
|
-
providers: results.keys, total_models: results.values.flatten.size)
|
|
110
|
-
results
|
|
111
|
-
rescue LoadError => e
|
|
112
|
-
# Fallback to sequential if concurrent gem not available
|
|
113
|
-
Aidp.log_warn("model_discovery_service", "concurrent gem not available, using sequential",
|
|
114
|
-
error: e.message)
|
|
115
|
-
providers.each_with_object({}) do |provider, hash|
|
|
116
|
-
hash[provider] = discover_models(provider, use_cache: use_cache)
|
|
117
|
-
end
|
|
118
|
-
rescue => e
|
|
119
|
-
Aidp.log_error("model_discovery_service", "concurrent discovery failed",
|
|
120
|
-
error: e.message)
|
|
121
|
-
{}
|
|
122
|
-
end
|
|
123
|
-
|
|
124
|
-
# Get all available models (discovery + static registry)
|
|
125
|
-
#
|
|
126
|
-
# Combines dynamically discovered models with static registry
|
|
127
|
-
#
|
|
128
|
-
# @param use_cache [Boolean] Whether to use cached results
|
|
129
|
-
# @return [Hash] Hash with :discovered and :registry keys
|
|
130
|
-
def all_available_models(use_cache: true)
|
|
131
|
-
discovered = discover_all_models(use_cache: use_cache)
|
|
132
|
-
registry_families = @registry.all_families
|
|
133
|
-
|
|
134
|
-
{
|
|
135
|
-
discovered: discovered,
|
|
136
|
-
registry: registry_families.map { |family| @registry.get_model_info(family) }.compact
|
|
137
|
-
}
|
|
138
|
-
end
|
|
139
|
-
|
|
140
|
-
# Find which providers support a given model family
|
|
141
|
-
#
|
|
142
|
-
# @param family_name [String] Model family name
|
|
143
|
-
# @return [Array<String>] List of provider names
|
|
144
|
-
def providers_supporting(family_name)
|
|
145
|
-
providers = []
|
|
146
|
-
|
|
147
|
-
@provider_classes.each do |provider_name, class_name|
|
|
148
|
-
provider_class = constantize_provider(class_name)
|
|
149
|
-
next unless provider_class
|
|
150
|
-
|
|
151
|
-
if provider_class.respond_to?(:supports_model_family?)
|
|
152
|
-
providers << provider_name if provider_class.supports_model_family?(family_name)
|
|
153
|
-
end
|
|
154
|
-
end
|
|
155
|
-
|
|
156
|
-
providers
|
|
157
|
-
end
|
|
158
|
-
|
|
159
|
-
# Refresh cache for all providers
|
|
160
|
-
def refresh_all_caches
|
|
161
|
-
@cache.invalidate_all
|
|
162
|
-
discover_all_models(use_cache: false)
|
|
163
|
-
end
|
|
164
|
-
|
|
165
|
-
# Refresh cache for specific provider
|
|
166
|
-
#
|
|
167
|
-
# @param provider [String] Provider name
|
|
168
|
-
def refresh_cache(provider)
|
|
169
|
-
@cache.invalidate(provider)
|
|
170
|
-
discover_models(provider, use_cache: false)
|
|
171
|
-
end
|
|
172
|
-
|
|
173
|
-
private
|
|
174
|
-
|
|
175
|
-
def perform_discovery(provider)
|
|
176
|
-
provider_class = get_provider_class(provider)
|
|
177
|
-
unless provider_class
|
|
178
|
-
Aidp.log_warn("model_discovery_service", "unknown provider",
|
|
179
|
-
provider: provider)
|
|
180
|
-
return []
|
|
181
|
-
end
|
|
182
|
-
|
|
183
|
-
unless provider_class.respond_to?(:available?) && provider_class.available?
|
|
184
|
-
Aidp.log_debug("model_discovery_service", "provider not available",
|
|
185
|
-
provider: provider)
|
|
186
|
-
return []
|
|
187
|
-
end
|
|
188
|
-
|
|
189
|
-
unless provider_class.respond_to?(:discover_models)
|
|
190
|
-
Aidp.log_warn("model_discovery_service", "provider missing discover_models",
|
|
191
|
-
provider: provider)
|
|
192
|
-
return []
|
|
193
|
-
end
|
|
194
|
-
|
|
195
|
-
models = provider_class.discover_models
|
|
196
|
-
Aidp.log_info("model_discovery_service", "discovered models",
|
|
197
|
-
provider: provider, count: models.size)
|
|
198
|
-
models
|
|
199
|
-
end
|
|
200
|
-
|
|
201
|
-
def get_provider_class(provider)
|
|
202
|
-
class_name = @provider_classes[provider]
|
|
203
|
-
return nil unless class_name
|
|
204
|
-
|
|
205
|
-
constantize_provider(class_name)
|
|
206
|
-
end
|
|
207
|
-
|
|
208
|
-
def constantize_provider(class_name)
|
|
209
|
-
# Safely constantize the provider class
|
|
210
|
-
parts = class_name.split("::")
|
|
211
|
-
parts.reduce(Object) { |mod, name| mod.const_get(name) }
|
|
212
|
-
rescue NameError => e
|
|
213
|
-
Aidp.log_debug("model_discovery_service", "provider class not found",
|
|
214
|
-
class: class_name, error: e.message)
|
|
215
|
-
nil
|
|
216
|
-
end
|
|
217
|
-
|
|
218
|
-
# Dynamically discover all provider classes from the providers directory
|
|
219
|
-
#
|
|
220
|
-
# @return [Hash] Hash of provider_name => class_name
|
|
221
|
-
def discover_provider_classes
|
|
222
|
-
providers_dir = File.join(__dir__, "../providers")
|
|
223
|
-
provider_files = Dir.glob("*.rb", base: providers_dir)
|
|
224
|
-
|
|
225
|
-
# Exclude base classes and utility files
|
|
226
|
-
excluded_files = ["base.rb", "adapter.rb", "error_taxonomy.rb", "capability_registry.rb"]
|
|
227
|
-
provider_files -= excluded_files
|
|
228
|
-
|
|
229
|
-
providers = {}
|
|
230
|
-
|
|
231
|
-
provider_files.each do |file|
|
|
232
|
-
provider_name = File.basename(file, ".rb")
|
|
233
|
-
# Convert to class name (e.g., "anthropic" -> "Anthropic", "github_copilot" -> "GithubCopilot")
|
|
234
|
-
class_name = provider_name.split("_").map(&:capitalize).join
|
|
235
|
-
full_class_name = "Aidp::Providers::#{class_name}"
|
|
236
|
-
|
|
237
|
-
# Try to load and verify the provider class exists
|
|
238
|
-
begin
|
|
239
|
-
require_relative "../providers/#{provider_name}"
|
|
240
|
-
provider_class = constantize_provider(full_class_name)
|
|
241
|
-
if provider_class&.respond_to?(:discover_models)
|
|
242
|
-
providers[provider_name] = full_class_name
|
|
243
|
-
end
|
|
244
|
-
rescue => e
|
|
245
|
-
# Skip providers that can't be loaded or don't implement discover_models
|
|
246
|
-
if ENV["DEBUG"]
|
|
247
|
-
Aidp.log_debug("model_discovery_service", "skipping provider",
|
|
248
|
-
provider: provider_name, reason: e.message)
|
|
249
|
-
end
|
|
250
|
-
end
|
|
251
|
-
end
|
|
252
|
-
|
|
253
|
-
Aidp.log_debug("model_discovery_service", "discovered provider classes",
|
|
254
|
-
count: providers.size, providers: providers.keys)
|
|
255
|
-
providers
|
|
256
|
-
end
|
|
257
|
-
end
|
|
258
|
-
end
|
|
259
|
-
end
|