dino-spec 14.0.1 → 14.1.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.
Files changed (34) hide show
  1. package/README.md +37 -1
  2. package/dist/core/agents/ambiguity-resolver.d.ts +118 -0
  3. package/dist/core/agents/ambiguity-resolver.d.ts.map +1 -0
  4. package/dist/core/agents/ambiguity-resolver.js +327 -0
  5. package/dist/core/agents/ambiguity-resolver.js.map +1 -0
  6. package/dist/core/agents/confidence-gate.d.ts +99 -0
  7. package/dist/core/agents/confidence-gate.d.ts.map +1 -0
  8. package/dist/core/agents/confidence-gate.js +295 -0
  9. package/dist/core/agents/confidence-gate.js.map +1 -0
  10. package/dist/core/agents/feedback-collector.d.ts +108 -0
  11. package/dist/core/agents/feedback-collector.d.ts.map +1 -0
  12. package/dist/core/agents/feedback-collector.js +313 -0
  13. package/dist/core/agents/feedback-collector.js.map +1 -0
  14. package/dist/core/agents/parallel-reviewer.d.ts +88 -0
  15. package/dist/core/agents/parallel-reviewer.d.ts.map +1 -0
  16. package/dist/core/agents/parallel-reviewer.js +459 -0
  17. package/dist/core/agents/parallel-reviewer.js.map +1 -0
  18. package/dist/core/agents/reviewer-loop.d.ts +102 -0
  19. package/dist/core/agents/reviewer-loop.d.ts.map +1 -0
  20. package/dist/core/agents/reviewer-loop.js +373 -0
  21. package/dist/core/agents/reviewer-loop.js.map +1 -0
  22. package/dist/core/agents/skill-auditor.d.ts +82 -0
  23. package/dist/core/agents/skill-auditor.d.ts.map +1 -0
  24. package/dist/core/agents/skill-auditor.js +278 -0
  25. package/dist/core/agents/skill-auditor.js.map +1 -0
  26. package/dist/mcp/registry.d.ts +1 -1
  27. package/dist/mcp/registry.d.ts.map +1 -1
  28. package/dist/mcp/registry.js +1 -0
  29. package/dist/mcp/registry.js.map +1 -1
  30. package/dist/mcp/tools/feedback.d.ts +63 -0
  31. package/dist/mcp/tools/feedback.d.ts.map +1 -0
  32. package/dist/mcp/tools/feedback.js +255 -0
  33. package/dist/mcp/tools/feedback.js.map +1 -0
  34. package/package.json +1 -1
@@ -0,0 +1,295 @@
1
+ /**
2
+ * Confidence Gate - v14.1.0
3
+ *
4
+ * Gates tasks based on confidence level, requiring research or clarification
5
+ * before allowing implementation to proceed.
6
+ *
7
+ * @see .claude/rules/dino/confidence-handling.md
8
+ */
9
+ import { analyzePrompt, isRalphEligible } from '../spec-analyzer/index.js';
10
+ import { resolveAmbiguity } from './ambiguity-resolver.js';
11
+ // =============================================================================
12
+ // Constants
13
+ // =============================================================================
14
+ const DEFAULT_CONFIG = {
15
+ threshold: Number(process.env.DINO_CONFIDENCE_THRESHOLD) || 0.8,
16
+ ralphThreshold: 0.9,
17
+ maxResearchRounds: 2,
18
+ maxClarificationRounds: 5,
19
+ enableAutoResearch: true,
20
+ };
21
+ // =============================================================================
22
+ // Core Functions
23
+ // =============================================================================
24
+ /**
25
+ * Check if task can proceed based on confidence level
26
+ *
27
+ * This is the main entry point for confidence gating.
28
+ * Returns decision on whether to proceed, research, or clarify.
29
+ */
30
+ export async function checkConfidence(prompt, config = DEFAULT_CONFIG) {
31
+ // Analyze the prompt
32
+ const analysis = analyzePrompt(prompt);
33
+ const currentConfidence = analysis.confidenceEstimate / 100;
34
+ // Determine required confidence based on Ralph eligibility
35
+ const ralphEligibility = isRalphEligible(analysis);
36
+ const requiredConfidence = ralphEligibility.eligible
37
+ ? config.ralphThreshold
38
+ : config.threshold;
39
+ // Check if we can proceed
40
+ if (currentConfidence >= requiredConfidence) {
41
+ return {
42
+ proceed: true,
43
+ confidence: currentConfidence,
44
+ requiredConfidence,
45
+ action: 'proceed',
46
+ reason: `Confidence ${Math.round(currentConfidence * 100)}% meets threshold ${Math.round(requiredConfidence * 100)}%`,
47
+ analysis,
48
+ };
49
+ }
50
+ // Determine action based on gap and signals
51
+ const confidenceGap = requiredConfidence - currentConfidence;
52
+ const action = determineAction(analysis, confidenceGap, config);
53
+ // If research is needed and enabled, execute it
54
+ if (action === 'research' && config.enableAutoResearch) {
55
+ const research = await resolveAmbiguity(prompt, {
56
+ threshold: 20, // Lower threshold to trigger research
57
+ maxResearchTokens: 5000,
58
+ cacheDirectory: '.dino/research/',
59
+ enableWebSearch: true,
60
+ enableCodebaseSearch: true,
61
+ });
62
+ // Update confidence based on research
63
+ const newConfidence = Math.min(1, currentConfidence + (research.research?.confidence || 0) * 0.3);
64
+ if (newConfidence >= requiredConfidence) {
65
+ return {
66
+ proceed: true,
67
+ confidence: newConfidence,
68
+ requiredConfidence,
69
+ action: 'proceed',
70
+ reason: `Research improved confidence to ${Math.round(newConfidence * 100)}%`,
71
+ analysis,
72
+ research: research.research,
73
+ };
74
+ }
75
+ // Still need clarification after research
76
+ return {
77
+ proceed: false,
78
+ confidence: newConfidence,
79
+ requiredConfidence,
80
+ action: 'clarify',
81
+ reason: `Research improved confidence to ${Math.round(newConfidence * 100)}%, but still below ${Math.round(requiredConfidence * 100)}% threshold`,
82
+ analysis,
83
+ research: research.research,
84
+ questions: generateClarificationQuestions(analysis),
85
+ };
86
+ }
87
+ // Generate clarification questions
88
+ const questions = generateClarificationQuestions(analysis);
89
+ return {
90
+ proceed: false,
91
+ confidence: currentConfidence,
92
+ requiredConfidence,
93
+ action,
94
+ reason: `Confidence ${Math.round(currentConfidence * 100)}% below required ${Math.round(requiredConfidence * 100)}%`,
95
+ analysis,
96
+ questions,
97
+ };
98
+ }
99
+ /**
100
+ * Determine what action to take based on analysis
101
+ */
102
+ function determineAction(analysis, confidenceGap, _config) {
103
+ // Prefer research for exploratory requests (vague verbs)
104
+ if (analysis.signals.vagueVerbs.length >= 2) {
105
+ return 'research';
106
+ }
107
+ // Prefer research when missing target but not unclear success
108
+ if (analysis.signals.missingTarget && !analysis.signals.unclearSuccess) {
109
+ return 'research';
110
+ }
111
+ // Large gap suggests research first
112
+ if (confidenceGap > 0.3) {
113
+ return 'research';
114
+ }
115
+ // Default to clarification for specific gaps
116
+ return 'clarify';
117
+ }
118
+ /**
119
+ * Generate clarification questions based on analysis signals
120
+ */
121
+ export function generateClarificationQuestions(analysis) {
122
+ const questions = [];
123
+ // Missing target
124
+ if (analysis.signals.missingTarget) {
125
+ questions.push({
126
+ id: 'q-target',
127
+ question: 'Which specific file, component, or feature should this change apply to?',
128
+ priority: 'blocking',
129
+ type: 'scope',
130
+ });
131
+ }
132
+ // Vague verbs
133
+ for (const verb of analysis.signals.vagueVerbs.slice(0, 2)) {
134
+ questions.push({
135
+ id: `q-verb-${verb}`,
136
+ question: `What specifically should be "${verb}ed"? Please provide concrete details.`,
137
+ priority: 'blocking',
138
+ type: 'scope',
139
+ });
140
+ }
141
+ // Unclear success
142
+ if (analysis.signals.unclearSuccess) {
143
+ questions.push({
144
+ id: 'q-success',
145
+ question: 'How will we know when this is working correctly? What should we test?',
146
+ priority: 'important',
147
+ type: 'success',
148
+ });
149
+ }
150
+ // Security related
151
+ if (analysis.signals.securityRelated) {
152
+ questions.push({
153
+ id: 'q-security',
154
+ question: 'What security requirements or constraints should this follow?',
155
+ priority: 'blocking',
156
+ type: 'risk',
157
+ });
158
+ }
159
+ // Data related
160
+ if (analysis.signals.dataRelated) {
161
+ questions.push({
162
+ id: 'q-data',
163
+ question: 'What data migration, backup, or rollback requirements exist?',
164
+ priority: 'important',
165
+ type: 'risk',
166
+ });
167
+ }
168
+ // Breaking change
169
+ if (analysis.signals.breakingChange) {
170
+ questions.push({
171
+ id: 'q-breaking',
172
+ question: 'What backwards compatibility requirements should be maintained?',
173
+ priority: 'blocking',
174
+ type: 'risk',
175
+ });
176
+ }
177
+ return questions;
178
+ }
179
+ /**
180
+ * Update confidence based on user answers
181
+ */
182
+ export function updateConfidenceFromAnswers(currentConfidence, questions, answeredCount) {
183
+ if (questions.length === 0)
184
+ return currentConfidence;
185
+ // Each answered question improves confidence
186
+ const blockingAnswered = questions
187
+ .filter((q) => q.priority === 'blocking')
188
+ .slice(0, answeredCount).length;
189
+ const importantAnswered = questions
190
+ .filter((q) => q.priority === 'important')
191
+ .slice(0, Math.max(0, answeredCount - blockingAnswered)).length;
192
+ // Blocking questions worth more
193
+ const improvement = blockingAnswered * 0.15 + importantAnswered * 0.1;
194
+ return Math.min(1, currentConfidence + improvement);
195
+ }
196
+ // =============================================================================
197
+ // Session Tracking
198
+ // =============================================================================
199
+ /**
200
+ * Create new confidence tracking for a session
201
+ */
202
+ export function createConfidenceTracking(prompt, config = DEFAULT_CONFIG) {
203
+ const analysis = analyzePrompt(prompt);
204
+ const ralphEligibility = isRalphEligible(analysis);
205
+ return {
206
+ currentConfidence: analysis.confidenceEstimate / 100,
207
+ targetConfidence: ralphEligibility.eligible
208
+ ? config.ralphThreshold
209
+ : config.threshold,
210
+ rounds: [],
211
+ status: 'pending',
212
+ };
213
+ }
214
+ /**
215
+ * Record a confidence improvement round
216
+ */
217
+ export function recordConfidenceRound(tracking, action, confidenceAfter, details) {
218
+ const round = {
219
+ roundNumber: tracking.rounds.length + 1,
220
+ action,
221
+ confidenceBefore: tracking.currentConfidence,
222
+ confidenceAfter,
223
+ details,
224
+ timestamp: new Date(),
225
+ };
226
+ const newStatus = confidenceAfter >= tracking.targetConfidence
227
+ ? 'ready'
228
+ : action === 'research'
229
+ ? 'researching'
230
+ : 'clarifying';
231
+ return {
232
+ ...tracking,
233
+ currentConfidence: confidenceAfter,
234
+ rounds: [...tracking.rounds, round],
235
+ status: newStatus,
236
+ };
237
+ }
238
+ /**
239
+ * Check if tracking has exceeded max rounds
240
+ */
241
+ export function hasExceededMaxRounds(tracking, config = DEFAULT_CONFIG) {
242
+ const researchRounds = tracking.rounds.filter((r) => r.action === 'research').length;
243
+ const clarificationRounds = tracking.rounds.filter((r) => r.action === 'clarification' || r.action === 'user-input').length;
244
+ return (researchRounds >= config.maxResearchRounds ||
245
+ clarificationRounds >= config.maxClarificationRounds);
246
+ }
247
+ // =============================================================================
248
+ // Session.md Formatting
249
+ // =============================================================================
250
+ /**
251
+ * Format confidence tracking for session.md
252
+ */
253
+ export function formatConfidenceForSession(tracking) {
254
+ const lines = [];
255
+ lines.push('## Confidence');
256
+ lines.push('');
257
+ lines.push(`**Current:** ${Math.round(tracking.currentConfidence * 100)}% | **Target:** ${Math.round(tracking.targetConfidence * 100)}%`);
258
+ lines.push(`**Status:** ${tracking.status}`);
259
+ lines.push('');
260
+ if (tracking.rounds.length > 0) {
261
+ lines.push('### History');
262
+ for (const round of tracking.rounds) {
263
+ const change = round.confidenceAfter - round.confidenceBefore;
264
+ const sign = change >= 0 ? '+' : '';
265
+ lines.push(`- Round ${round.roundNumber} (${round.action}): ${Math.round(round.confidenceBefore * 100)}% → ${Math.round(round.confidenceAfter * 100)}% (${sign}${Math.round(change * 100)}%)`);
266
+ }
267
+ lines.push('');
268
+ }
269
+ return lines.join('\n');
270
+ }
271
+ /**
272
+ * Format gate result for display
273
+ */
274
+ export function formatGateResult(result) {
275
+ const lines = [];
276
+ lines.push('## Confidence Gate');
277
+ lines.push('');
278
+ const status = result.proceed ? 'PASSED' : 'BLOCKED';
279
+ const emoji = result.proceed ? '✅' : '🚫';
280
+ lines.push(`**Status:** ${emoji} ${status}`);
281
+ lines.push(`**Confidence:** ${Math.round(result.confidence * 100)}% / ${Math.round(result.requiredConfidence * 100)}% required`);
282
+ lines.push(`**Action:** ${result.action}`);
283
+ lines.push(`**Reason:** ${result.reason}`);
284
+ lines.push('');
285
+ if (result.questions && result.questions.length > 0) {
286
+ lines.push('### Clarification Questions');
287
+ for (const q of result.questions) {
288
+ const priorityEmoji = q.priority === 'blocking' ? '🔴' : q.priority === 'important' ? '🟡' : '🟢';
289
+ lines.push(`${priorityEmoji} **[${q.priority}]** ${q.question}`);
290
+ }
291
+ lines.push('');
292
+ }
293
+ return lines.join('\n');
294
+ }
295
+ //# sourceMappingURL=confidence-gate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"confidence-gate.js","sourceRoot":"","sources":["../../../src/core/agents/confidence-gate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,108 @@
1
+ /**
2
+ * Feedback Collector - v14.1.0
3
+ *
4
+ * Structured feedback collection from reviewer findings.
5
+ * Tracks quality trends across iterations and triggers early stopping.
6
+ *
7
+ * @see Continuous feedback loop for iterative improvement
8
+ */
9
+ import type { ReviewResult } from './reviewer-loop.js';
10
+ /**
11
+ * Structured feedback entry
12
+ */
13
+ export interface FeedbackEntry {
14
+ id: string;
15
+ type: 'issue' | 'suggestion' | 'positive';
16
+ severity: 'critical' | 'major' | 'minor' | 'info';
17
+ category: 'security' | 'quality' | 'style' | 'performance' | 'test' | 'other';
18
+ file: string;
19
+ line?: number;
20
+ message: string;
21
+ suggestion?: string;
22
+ iteration: number;
23
+ timestamp: Date;
24
+ resolved: boolean;
25
+ }
26
+ /**
27
+ * Quality history entry for tracking trends
28
+ */
29
+ export interface QualityHistoryEntry {
30
+ iteration: number;
31
+ score: number;
32
+ issueCount: number;
33
+ criticalCount: number;
34
+ majorCount: number;
35
+ minorCount: number;
36
+ timestamp: Date;
37
+ }
38
+ /**
39
+ * Feedback collector state
40
+ */
41
+ export interface FeedbackCollectorState {
42
+ entries: FeedbackEntry[];
43
+ history: QualityHistoryEntry[];
44
+ currentIteration: number;
45
+ qualityScore: number;
46
+ status: 'improving' | 'plateau' | 'degrading';
47
+ }
48
+ /**
49
+ * Feedback collector configuration
50
+ */
51
+ export interface FeedbackCollectorConfig {
52
+ plateauThreshold: number;
53
+ minIterationsForPlateau: number;
54
+ maxIterations: number;
55
+ qualityWeights: {
56
+ critical: number;
57
+ major: number;
58
+ minor: number;
59
+ info: number;
60
+ };
61
+ }
62
+ /**
63
+ * Early stopping recommendation
64
+ */
65
+ export interface EarlyStoppingResult {
66
+ shouldStop: boolean;
67
+ reason: string;
68
+ qualityScore: number;
69
+ trend: 'improving' | 'plateau' | 'degrading';
70
+ recommendation: string;
71
+ }
72
+ /**
73
+ * Create a new feedback collector state
74
+ */
75
+ export declare function createFeedbackCollector(): FeedbackCollectorState;
76
+ /**
77
+ * Collect feedback from review result
78
+ */
79
+ export declare function collectFeedback(state: FeedbackCollectorState, review: ReviewResult, iteration: number): FeedbackCollectorState;
80
+ /**
81
+ * Calculate quality score (0-100)
82
+ */
83
+ export declare function calculateQualityScore(entries: FeedbackEntry[], iteration: number, config?: FeedbackCollectorConfig): number;
84
+ /**
85
+ * Check if early stopping should be triggered
86
+ */
87
+ export declare function checkEarlyStopping(state: FeedbackCollectorState, config?: FeedbackCollectorConfig): EarlyStoppingResult;
88
+ /**
89
+ * Extract learnings from feedback for next iteration
90
+ */
91
+ export declare function extractLearnings(state: FeedbackCollectorState): string[];
92
+ /**
93
+ * Mark feedback as resolved
94
+ */
95
+ export declare function resolveFeedback(state: FeedbackCollectorState, feedbackId: string): FeedbackCollectorState;
96
+ /**
97
+ * Mark all feedback in iteration as resolved
98
+ */
99
+ export declare function resolveIteration(state: FeedbackCollectorState, iteration: number): FeedbackCollectorState;
100
+ /**
101
+ * Format feedback collector state for display
102
+ */
103
+ export declare function formatFeedbackState(state: FeedbackCollectorState): string;
104
+ /**
105
+ * Format early stopping result
106
+ */
107
+ export declare function formatEarlyStoppingResult(result: EarlyStoppingResult): string;
108
+ //# sourceMappingURL=feedback-collector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feedback-collector.d.ts","sourceRoot":"","sources":["../../../src/core/agents/feedback-collector.ts"],"names":[],"mappings":"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"}