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.
- package/README.md +37 -1
- package/dist/core/agents/ambiguity-resolver.d.ts +118 -0
- package/dist/core/agents/ambiguity-resolver.d.ts.map +1 -0
- package/dist/core/agents/ambiguity-resolver.js +327 -0
- package/dist/core/agents/ambiguity-resolver.js.map +1 -0
- package/dist/core/agents/confidence-gate.d.ts +99 -0
- package/dist/core/agents/confidence-gate.d.ts.map +1 -0
- package/dist/core/agents/confidence-gate.js +295 -0
- package/dist/core/agents/confidence-gate.js.map +1 -0
- package/dist/core/agents/feedback-collector.d.ts +108 -0
- package/dist/core/agents/feedback-collector.d.ts.map +1 -0
- package/dist/core/agents/feedback-collector.js +313 -0
- package/dist/core/agents/feedback-collector.js.map +1 -0
- package/dist/core/agents/parallel-reviewer.d.ts +88 -0
- package/dist/core/agents/parallel-reviewer.d.ts.map +1 -0
- package/dist/core/agents/parallel-reviewer.js +459 -0
- package/dist/core/agents/parallel-reviewer.js.map +1 -0
- package/dist/core/agents/reviewer-loop.d.ts +102 -0
- package/dist/core/agents/reviewer-loop.d.ts.map +1 -0
- package/dist/core/agents/reviewer-loop.js +373 -0
- package/dist/core/agents/reviewer-loop.js.map +1 -0
- package/dist/core/agents/skill-auditor.d.ts +82 -0
- package/dist/core/agents/skill-auditor.d.ts.map +1 -0
- package/dist/core/agents/skill-auditor.js +278 -0
- package/dist/core/agents/skill-auditor.js.map +1 -0
- package/dist/mcp/registry.d.ts +1 -1
- package/dist/mcp/registry.d.ts.map +1 -1
- package/dist/mcp/registry.js +1 -0
- package/dist/mcp/registry.js.map +1 -1
- package/dist/mcp/tools/feedback.d.ts +63 -0
- package/dist/mcp/tools/feedback.d.ts.map +1 -0
- package/dist/mcp/tools/feedback.js +255 -0
- package/dist/mcp/tools/feedback.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -12,10 +12,46 @@
|
|
|
12
12
|
|
|
13
13
|
**dino-spec** brings structured, context-aware development to [Claude Code](https://claude.ai/code). It automatically maintains session state, provides 71 MCP tools, and enables intelligent context retrieval with real-time statusline display.
|
|
14
14
|
|
|
15
|
-
> **
|
|
15
|
+
> **v14.1.0**: Subagent-First Operations - See [CHANGELOG.md](CHANGELOG.md) for details
|
|
16
16
|
|
|
17
17
|
## Features
|
|
18
18
|
|
|
19
|
+
### v14.1.0 - Subagent-First Operations
|
|
20
|
+
|
|
21
|
+
- **Comprehensive Subagent Architecture** - Autonomous code review, research, and quality assurance
|
|
22
|
+
- **Ambiguity Resolver** - Auto-research when ambiguity > 40
|
|
23
|
+
- Spawns research subagents with specialized context
|
|
24
|
+
- Caches findings in `.dino/research/`
|
|
25
|
+
- Environment variable: `DINO_AMBIGUITY_THRESHOLD` (default: 40)
|
|
26
|
+
- **Confidence Gate** - Quality threshold enforcement
|
|
27
|
+
- Gates at 80% (standard) or 90% (Ralph-eligible)
|
|
28
|
+
- Triggers research or clarification automatically
|
|
29
|
+
- Max 2 research rounds, 5 clarification rounds
|
|
30
|
+
- Environment variables: `DINO_CONFIDENCE_THRESHOLD`, `DINO_RALPH_CONFIDENCE_THRESHOLD`
|
|
31
|
+
- **Reviewer Loop** - Mandatory code review for Edit/Write
|
|
32
|
+
- Security: hardcoded secrets, eval, innerHTML, SQL injection
|
|
33
|
+
- Quality: style, performance, test coverage
|
|
34
|
+
- Blocks on critical findings with `DINO_MANDATORY_REVIEW=true`
|
|
35
|
+
- **Feedback Collector** - Structured quality tracking
|
|
36
|
+
- Quality scoring (0-100) with trend analysis
|
|
37
|
+
- Plateau detection (<2% improvement over 3 iterations)
|
|
38
|
+
- Early stopping on max iterations (default: 10)
|
|
39
|
+
- 5 MCP tools: `dino_feedback_collect`, `_status`, `_learnings`, `_resolve`, `_reset`
|
|
40
|
+
- **Skill Auditor** - Pre-validation for planning/implementation
|
|
41
|
+
- Audits `/dino.nest`, `/dino.hunt`, `/dino.ralph` before execution
|
|
42
|
+
- PRD quality: stories, acceptance criteria, test commands, files
|
|
43
|
+
- Ralph requires 90 score vs 80 for standard
|
|
44
|
+
- **Parallel Reviewer** - Concurrent aspect reviews
|
|
45
|
+
- Runs style/security/tests in parallel
|
|
46
|
+
- Budget: 40% style, 30% security, 30% tests
|
|
47
|
+
- Merges into unified review summary
|
|
48
|
+
- Environment variable: `DINO_PARALLEL_REVIEW` (default: false)
|
|
49
|
+
- **Research Agent** - Read-only exploration agent
|
|
50
|
+
- Structured JSON output with findings/confidence
|
|
51
|
+
- Disallows Edit/Write/Bash for safety
|
|
52
|
+
- **128 New Tests** - Comprehensive coverage across 6 agent modules
|
|
53
|
+
- **Auditor Pre-Checks** - `/dino.nest` and `/dino.hunt` now validate before execution
|
|
54
|
+
|
|
19
55
|
### v13.6.0 - RLM-Style Context REPL Environment
|
|
20
56
|
|
|
21
57
|
- **Context REPL** - Programmatic context access inspired by [Recursive Language Models](https://arxiv.org/abs/2512.24601v1)
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ambiguity Resolver - v14.1.0
|
|
3
|
+
*
|
|
4
|
+
* Auto-triggers research subagent when ambiguity score exceeds threshold.
|
|
5
|
+
* Research findings are cached and injected into context before planning.
|
|
6
|
+
*
|
|
7
|
+
* @see .claude/rules/dino/confidence-handling.md
|
|
8
|
+
*/
|
|
9
|
+
import { type SpecAnalysis } from '../spec-analyzer/index.js';
|
|
10
|
+
/**
|
|
11
|
+
* Research result from subagent exploration
|
|
12
|
+
*/
|
|
13
|
+
export interface ResearchResult {
|
|
14
|
+
confidence: number;
|
|
15
|
+
findings: ResearchFinding[];
|
|
16
|
+
cacheKey: string;
|
|
17
|
+
timestamp: Date;
|
|
18
|
+
tokensUsed: number;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Individual research finding
|
|
22
|
+
*/
|
|
23
|
+
export interface ResearchFinding {
|
|
24
|
+
type: 'pattern' | 'file' | 'documentation' | 'external' | 'decision';
|
|
25
|
+
source: string;
|
|
26
|
+
summary: string;
|
|
27
|
+
relevance: number;
|
|
28
|
+
content?: string;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Research subagent spawn parameters
|
|
32
|
+
*/
|
|
33
|
+
export interface ResearchAgentParams {
|
|
34
|
+
prompt: string;
|
|
35
|
+
focusArea?: string;
|
|
36
|
+
ambiguityScore: number;
|
|
37
|
+
signals: ResearchSignals;
|
|
38
|
+
maxTokens?: number;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Signals that triggered research
|
|
42
|
+
*/
|
|
43
|
+
export interface ResearchSignals {
|
|
44
|
+
vagueVerbs: string[];
|
|
45
|
+
missingTarget: boolean;
|
|
46
|
+
unclearSuccess: boolean;
|
|
47
|
+
securityRelated: boolean;
|
|
48
|
+
dataRelated: boolean;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Ambiguity resolution configuration
|
|
52
|
+
*/
|
|
53
|
+
export interface AmbiguityResolverConfig {
|
|
54
|
+
threshold: number;
|
|
55
|
+
maxResearchTokens: number;
|
|
56
|
+
cacheDirectory: string;
|
|
57
|
+
enableWebSearch: boolean;
|
|
58
|
+
enableCodebaseSearch: boolean;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Resolution result with action recommendation
|
|
62
|
+
*/
|
|
63
|
+
export interface AmbiguityResolution {
|
|
64
|
+
needsResearch: boolean;
|
|
65
|
+
ambiguityScore: number;
|
|
66
|
+
analysis: SpecAnalysis;
|
|
67
|
+
research?: ResearchResult;
|
|
68
|
+
action: 'proceed' | 'research' | 'clarify';
|
|
69
|
+
context?: string;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Check if a prompt needs research based on ambiguity score
|
|
73
|
+
*/
|
|
74
|
+
export declare function needsResearch(prompt: string, config?: AmbiguityResolverConfig): boolean;
|
|
75
|
+
/**
|
|
76
|
+
* Analyze ambiguity and determine if research is needed
|
|
77
|
+
*/
|
|
78
|
+
export declare function analyzeAmbiguity(prompt: string, config?: AmbiguityResolverConfig): {
|
|
79
|
+
needsResearch: boolean;
|
|
80
|
+
score: number;
|
|
81
|
+
signals: ResearchSignals;
|
|
82
|
+
};
|
|
83
|
+
/**
|
|
84
|
+
* Resolve ambiguity by triggering research if needed
|
|
85
|
+
*
|
|
86
|
+
* This is the main entry point for ambiguity resolution.
|
|
87
|
+
* Returns enhanced context with research findings if research was needed.
|
|
88
|
+
*/
|
|
89
|
+
export declare function resolveAmbiguity(prompt: string, config?: AmbiguityResolverConfig): Promise<AmbiguityResolution>;
|
|
90
|
+
/**
|
|
91
|
+
* Execute research by spawning research subagent
|
|
92
|
+
*
|
|
93
|
+
* This function builds the research prompt and spawns a subagent.
|
|
94
|
+
* In practice, this returns spawn parameters for the Task tool.
|
|
95
|
+
*/
|
|
96
|
+
export declare function executeResearch(params: ResearchAgentParams, config?: AmbiguityResolverConfig): Promise<ResearchResult>;
|
|
97
|
+
/**
|
|
98
|
+
* Build research prompt for subagent
|
|
99
|
+
*/
|
|
100
|
+
export declare function buildResearchPrompt(params: ResearchAgentParams, config?: AmbiguityResolverConfig): string;
|
|
101
|
+
/**
|
|
102
|
+
* Build Task tool spawn parameters for research subagent
|
|
103
|
+
*/
|
|
104
|
+
export declare function buildTaskSpawnParams(params: ResearchAgentParams, config?: AmbiguityResolverConfig): {
|
|
105
|
+
description: string;
|
|
106
|
+
prompt: string;
|
|
107
|
+
subagent_type: string;
|
|
108
|
+
model: string;
|
|
109
|
+
};
|
|
110
|
+
/**
|
|
111
|
+
* Format for caching to .dino/research/
|
|
112
|
+
*/
|
|
113
|
+
export declare function formatResearchForCache(result: ResearchResult): string;
|
|
114
|
+
/**
|
|
115
|
+
* Get cache path for research result
|
|
116
|
+
*/
|
|
117
|
+
export declare function getResearchCachePath(cacheKey: string, cacheDirectory?: string): string;
|
|
118
|
+
//# sourceMappingURL=ambiguity-resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ambiguity-resolver.d.ts","sourceRoot":"","sources":["../../../src/core/agents/ambiguity-resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ambiguity Resolver - v14.1.0
|
|
3
|
+
*
|
|
4
|
+
* Auto-triggers research subagent when ambiguity score exceeds threshold.
|
|
5
|
+
* Research findings are cached and injected into context before planning.
|
|
6
|
+
*
|
|
7
|
+
* @see .claude/rules/dino/confidence-handling.md
|
|
8
|
+
*/
|
|
9
|
+
import { analyzePrompt } from '../spec-analyzer/index.js';
|
|
10
|
+
// =============================================================================
|
|
11
|
+
// Constants
|
|
12
|
+
// =============================================================================
|
|
13
|
+
const DEFAULT_CONFIG = {
|
|
14
|
+
threshold: 40,
|
|
15
|
+
maxResearchTokens: 5000,
|
|
16
|
+
cacheDirectory: '.dino/research/',
|
|
17
|
+
enableWebSearch: true,
|
|
18
|
+
enableCodebaseSearch: true,
|
|
19
|
+
};
|
|
20
|
+
const AMBIGUITY_THRESHOLD = Number(process.env.DINO_AMBIGUITY_THRESHOLD) || 40;
|
|
21
|
+
// =============================================================================
|
|
22
|
+
// Core Functions
|
|
23
|
+
// =============================================================================
|
|
24
|
+
/**
|
|
25
|
+
* Check if a prompt needs research based on ambiguity score
|
|
26
|
+
*/
|
|
27
|
+
export function needsResearch(prompt, config = DEFAULT_CONFIG) {
|
|
28
|
+
const analysis = analyzePrompt(prompt);
|
|
29
|
+
return analysis.ambiguityScore > (config.threshold || AMBIGUITY_THRESHOLD);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Analyze ambiguity and determine if research is needed
|
|
33
|
+
*/
|
|
34
|
+
export function analyzeAmbiguity(prompt, config = DEFAULT_CONFIG) {
|
|
35
|
+
const analysis = analyzePrompt(prompt);
|
|
36
|
+
const signals = {
|
|
37
|
+
vagueVerbs: analysis.signals.vagueVerbs,
|
|
38
|
+
missingTarget: analysis.signals.missingTarget,
|
|
39
|
+
unclearSuccess: analysis.signals.unclearSuccess,
|
|
40
|
+
securityRelated: analysis.signals.securityRelated,
|
|
41
|
+
dataRelated: analysis.signals.dataRelated,
|
|
42
|
+
};
|
|
43
|
+
return {
|
|
44
|
+
needsResearch: analysis.ambiguityScore > (config.threshold || AMBIGUITY_THRESHOLD),
|
|
45
|
+
score: analysis.ambiguityScore,
|
|
46
|
+
signals,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Resolve ambiguity by triggering research if needed
|
|
51
|
+
*
|
|
52
|
+
* This is the main entry point for ambiguity resolution.
|
|
53
|
+
* Returns enhanced context with research findings if research was needed.
|
|
54
|
+
*/
|
|
55
|
+
export async function resolveAmbiguity(prompt, config = DEFAULT_CONFIG) {
|
|
56
|
+
const analysis = analyzePrompt(prompt);
|
|
57
|
+
const { ambiguityScore, signals } = analysis;
|
|
58
|
+
// Determine if research is needed
|
|
59
|
+
const threshold = config.threshold || AMBIGUITY_THRESHOLD;
|
|
60
|
+
if (ambiguityScore <= threshold) {
|
|
61
|
+
return {
|
|
62
|
+
needsResearch: false,
|
|
63
|
+
ambiguityScore,
|
|
64
|
+
analysis,
|
|
65
|
+
action: 'proceed',
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
// Build research parameters
|
|
69
|
+
const researchParams = {
|
|
70
|
+
prompt,
|
|
71
|
+
ambiguityScore,
|
|
72
|
+
signals: {
|
|
73
|
+
vagueVerbs: signals.vagueVerbs,
|
|
74
|
+
missingTarget: signals.missingTarget,
|
|
75
|
+
unclearSuccess: signals.unclearSuccess,
|
|
76
|
+
securityRelated: signals.securityRelated,
|
|
77
|
+
dataRelated: signals.dataRelated,
|
|
78
|
+
},
|
|
79
|
+
maxTokens: config.maxResearchTokens,
|
|
80
|
+
};
|
|
81
|
+
// Execute research
|
|
82
|
+
const research = await executeResearch(researchParams, config);
|
|
83
|
+
// Determine action based on research results
|
|
84
|
+
const action = research.confidence >= 0.8 ? 'proceed' : 'clarify';
|
|
85
|
+
// Build enhanced context from findings
|
|
86
|
+
const context = buildEnhancedContext(research.findings);
|
|
87
|
+
return {
|
|
88
|
+
needsResearch: true,
|
|
89
|
+
ambiguityScore,
|
|
90
|
+
analysis,
|
|
91
|
+
research,
|
|
92
|
+
action,
|
|
93
|
+
context,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Execute research by spawning research subagent
|
|
98
|
+
*
|
|
99
|
+
* This function builds the research prompt and spawns a subagent.
|
|
100
|
+
* In practice, this returns spawn parameters for the Task tool.
|
|
101
|
+
*/
|
|
102
|
+
export async function executeResearch(params, config = DEFAULT_CONFIG) {
|
|
103
|
+
const cacheKey = generateCacheKey(params.prompt);
|
|
104
|
+
const startTime = Date.now();
|
|
105
|
+
// Build research prompt
|
|
106
|
+
const researchPrompt = buildResearchPrompt(params, config);
|
|
107
|
+
// This would spawn the subagent via Task tool
|
|
108
|
+
// For now, return stub that will be filled by actual subagent execution
|
|
109
|
+
const findings = await gatherFindings(params, config);
|
|
110
|
+
// Calculate confidence based on findings
|
|
111
|
+
const confidence = calculateResearchConfidence(findings);
|
|
112
|
+
return {
|
|
113
|
+
confidence,
|
|
114
|
+
findings,
|
|
115
|
+
cacheKey,
|
|
116
|
+
timestamp: new Date(),
|
|
117
|
+
tokensUsed: estimateTokens(researchPrompt),
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Build research prompt for subagent
|
|
122
|
+
*/
|
|
123
|
+
export function buildResearchPrompt(params, config = DEFAULT_CONFIG) {
|
|
124
|
+
const sections = [];
|
|
125
|
+
sections.push('# Research Task');
|
|
126
|
+
sections.push('');
|
|
127
|
+
sections.push('## Objective');
|
|
128
|
+
sections.push(`Gather context and resolve ambiguities for: "${params.prompt}"`);
|
|
129
|
+
sections.push('');
|
|
130
|
+
// Ambiguity signals to address
|
|
131
|
+
sections.push('## Ambiguities to Resolve');
|
|
132
|
+
sections.push(`Ambiguity Score: ${params.ambiguityScore}/25`);
|
|
133
|
+
sections.push('');
|
|
134
|
+
if (params.signals.vagueVerbs.length > 0) {
|
|
135
|
+
sections.push(`### Vague Verbs: ${params.signals.vagueVerbs.join(', ')}`);
|
|
136
|
+
sections.push('- Find examples of similar work in codebase');
|
|
137
|
+
sections.push('- Identify specific patterns to follow');
|
|
138
|
+
sections.push('');
|
|
139
|
+
}
|
|
140
|
+
if (params.signals.missingTarget) {
|
|
141
|
+
sections.push('### Missing Target');
|
|
142
|
+
sections.push('- Identify which files/components are affected');
|
|
143
|
+
sections.push('- Find related code locations');
|
|
144
|
+
sections.push('');
|
|
145
|
+
}
|
|
146
|
+
if (params.signals.unclearSuccess) {
|
|
147
|
+
sections.push('### Unclear Success Criteria');
|
|
148
|
+
sections.push('- Find existing test patterns');
|
|
149
|
+
sections.push('- Identify acceptance criteria from similar features');
|
|
150
|
+
sections.push('');
|
|
151
|
+
}
|
|
152
|
+
if (params.signals.securityRelated) {
|
|
153
|
+
sections.push('### Security Concerns');
|
|
154
|
+
sections.push('- Find existing security patterns');
|
|
155
|
+
sections.push('- Review authentication/authorization approaches');
|
|
156
|
+
sections.push('');
|
|
157
|
+
}
|
|
158
|
+
if (params.signals.dataRelated) {
|
|
159
|
+
sections.push('### Data Handling');
|
|
160
|
+
sections.push('- Find existing data patterns');
|
|
161
|
+
sections.push('- Review migration/backup approaches');
|
|
162
|
+
sections.push('');
|
|
163
|
+
}
|
|
164
|
+
// Research instructions
|
|
165
|
+
sections.push('## Research Instructions');
|
|
166
|
+
sections.push('');
|
|
167
|
+
if (config.enableCodebaseSearch) {
|
|
168
|
+
sections.push('### Codebase Search');
|
|
169
|
+
sections.push('1. Use Grep to find relevant patterns');
|
|
170
|
+
sections.push('2. Use Glob to find related files');
|
|
171
|
+
sections.push('3. Read key files to understand patterns');
|
|
172
|
+
sections.push('');
|
|
173
|
+
}
|
|
174
|
+
if (config.enableWebSearch) {
|
|
175
|
+
sections.push('### External Research');
|
|
176
|
+
sections.push('1. Use WebSearch for best practices');
|
|
177
|
+
sections.push('2. Use WebFetch for documentation');
|
|
178
|
+
sections.push('');
|
|
179
|
+
}
|
|
180
|
+
sections.push('## Output Format');
|
|
181
|
+
sections.push('Return findings in JSON format:');
|
|
182
|
+
sections.push('```json');
|
|
183
|
+
sections.push('{');
|
|
184
|
+
sections.push(' "findings": [');
|
|
185
|
+
sections.push(' {');
|
|
186
|
+
sections.push(' "type": "pattern|file|documentation|external|decision",');
|
|
187
|
+
sections.push(' "source": "path or URL",');
|
|
188
|
+
sections.push(' "summary": "brief description",');
|
|
189
|
+
sections.push(' "relevance": 0.0-1.0,');
|
|
190
|
+
sections.push(' "content": "optional detailed content"');
|
|
191
|
+
sections.push(' }');
|
|
192
|
+
sections.push(' ],');
|
|
193
|
+
sections.push(' "confidence": 0.0-1.0,');
|
|
194
|
+
sections.push(' "recommendations": ["list of suggestions"]');
|
|
195
|
+
sections.push('}');
|
|
196
|
+
sections.push('```');
|
|
197
|
+
return sections.join('\n');
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Build Task tool spawn parameters for research subagent
|
|
201
|
+
*/
|
|
202
|
+
export function buildTaskSpawnParams(params, config = DEFAULT_CONFIG) {
|
|
203
|
+
return {
|
|
204
|
+
description: 'Research: resolve ambiguity',
|
|
205
|
+
prompt: buildResearchPrompt(params, config),
|
|
206
|
+
subagent_type: 'Explore',
|
|
207
|
+
model: 'sonnet',
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
// =============================================================================
|
|
211
|
+
// Helper Functions
|
|
212
|
+
// =============================================================================
|
|
213
|
+
/**
|
|
214
|
+
* Generate cache key from prompt
|
|
215
|
+
*/
|
|
216
|
+
function generateCacheKey(prompt) {
|
|
217
|
+
// Simple hash for cache key
|
|
218
|
+
const slug = prompt
|
|
219
|
+
.toLowerCase()
|
|
220
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
221
|
+
.slice(0, 50);
|
|
222
|
+
const timestamp = Date.now();
|
|
223
|
+
return `research-${slug}-${timestamp}`;
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Gather findings from codebase and external sources
|
|
227
|
+
* This is a stub - actual implementation uses Task tool subagent
|
|
228
|
+
*/
|
|
229
|
+
async function gatherFindings(params, _config) {
|
|
230
|
+
// This would be populated by actual subagent execution
|
|
231
|
+
// Return empty array - subagent will fill this
|
|
232
|
+
return [];
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Calculate confidence from research findings
|
|
236
|
+
*/
|
|
237
|
+
function calculateResearchConfidence(findings) {
|
|
238
|
+
if (findings.length === 0)
|
|
239
|
+
return 0;
|
|
240
|
+
// Weight by relevance
|
|
241
|
+
const totalRelevance = findings.reduce((sum, f) => sum + f.relevance, 0);
|
|
242
|
+
const avgRelevance = totalRelevance / findings.length;
|
|
243
|
+
// Bonus for having multiple types of findings
|
|
244
|
+
const types = new Set(findings.map((f) => f.type));
|
|
245
|
+
const typeBonus = Math.min(0.2, types.size * 0.05);
|
|
246
|
+
return Math.min(1, avgRelevance + typeBonus);
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Build enhanced context from research findings
|
|
250
|
+
*/
|
|
251
|
+
function buildEnhancedContext(findings) {
|
|
252
|
+
if (findings.length === 0)
|
|
253
|
+
return '';
|
|
254
|
+
const sections = [];
|
|
255
|
+
sections.push('## Research Findings');
|
|
256
|
+
sections.push('');
|
|
257
|
+
// Group by type
|
|
258
|
+
const byType = new Map();
|
|
259
|
+
for (const finding of findings) {
|
|
260
|
+
const existing = byType.get(finding.type) || [];
|
|
261
|
+
existing.push(finding);
|
|
262
|
+
byType.set(finding.type, existing);
|
|
263
|
+
}
|
|
264
|
+
// Format each type
|
|
265
|
+
for (const [type, typeFindings] of byType) {
|
|
266
|
+
sections.push(`### ${capitalizeFirst(type)} Findings`);
|
|
267
|
+
for (const finding of typeFindings) {
|
|
268
|
+
sections.push(`- **${finding.source}**: ${finding.summary}`);
|
|
269
|
+
if (finding.content) {
|
|
270
|
+
sections.push(` ${finding.content.slice(0, 200)}...`);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
sections.push('');
|
|
274
|
+
}
|
|
275
|
+
return sections.join('\n');
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Estimate tokens from text
|
|
279
|
+
*/
|
|
280
|
+
function estimateTokens(text) {
|
|
281
|
+
return Math.ceil(text.length / 4);
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* Capitalize first letter
|
|
285
|
+
*/
|
|
286
|
+
function capitalizeFirst(str) {
|
|
287
|
+
return str.charAt(0).toUpperCase() + str.slice(1);
|
|
288
|
+
}
|
|
289
|
+
// =============================================================================
|
|
290
|
+
// Cache Functions
|
|
291
|
+
// =============================================================================
|
|
292
|
+
/**
|
|
293
|
+
* Format for caching to .dino/research/
|
|
294
|
+
*/
|
|
295
|
+
export function formatResearchForCache(result) {
|
|
296
|
+
const lines = [];
|
|
297
|
+
lines.push(`# Research: ${result.cacheKey}`);
|
|
298
|
+
lines.push('');
|
|
299
|
+
lines.push(`**Date:** ${result.timestamp.toISOString()}`);
|
|
300
|
+
lines.push(`**Confidence:** ${Math.round(result.confidence * 100)}%`);
|
|
301
|
+
lines.push(`**Tokens Used:** ${result.tokensUsed}`);
|
|
302
|
+
lines.push('');
|
|
303
|
+
lines.push('## Findings');
|
|
304
|
+
lines.push('');
|
|
305
|
+
for (const finding of result.findings) {
|
|
306
|
+
lines.push(`### ${capitalizeFirst(finding.type)}: ${finding.source}`);
|
|
307
|
+
lines.push(`**Relevance:** ${Math.round(finding.relevance * 100)}%`);
|
|
308
|
+
lines.push('');
|
|
309
|
+
lines.push(finding.summary);
|
|
310
|
+
if (finding.content) {
|
|
311
|
+
lines.push('');
|
|
312
|
+
lines.push('```');
|
|
313
|
+
lines.push(finding.content);
|
|
314
|
+
lines.push('```');
|
|
315
|
+
}
|
|
316
|
+
lines.push('');
|
|
317
|
+
}
|
|
318
|
+
return lines.join('\n');
|
|
319
|
+
}
|
|
320
|
+
/**
|
|
321
|
+
* Get cache path for research result
|
|
322
|
+
*/
|
|
323
|
+
export function getResearchCachePath(cacheKey, cacheDirectory = '.dino/research/') {
|
|
324
|
+
const safeName = cacheKey.replace(/[^a-z0-9-]/g, '-');
|
|
325
|
+
return `${cacheDirectory}${safeName}.md`;
|
|
326
|
+
}
|
|
327
|
+
//# sourceMappingURL=ambiguity-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ambiguity-resolver.js","sourceRoot":"","sources":["../../../src/core/agents/ambiguity-resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,99 @@
|
|
|
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 { type SpecAnalysis } from '../spec-analyzer/index.js';
|
|
10
|
+
import { type ResearchResult } from './ambiguity-resolver.js';
|
|
11
|
+
/**
|
|
12
|
+
* Gate decision result
|
|
13
|
+
*/
|
|
14
|
+
export interface GateResult {
|
|
15
|
+
proceed: boolean;
|
|
16
|
+
confidence: number;
|
|
17
|
+
requiredConfidence: number;
|
|
18
|
+
action: 'proceed' | 'research' | 'clarify';
|
|
19
|
+
reason: string;
|
|
20
|
+
analysis?: SpecAnalysis;
|
|
21
|
+
research?: ResearchResult;
|
|
22
|
+
questions?: ClarificationQuestion[];
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Clarification question for user
|
|
26
|
+
*/
|
|
27
|
+
export interface ClarificationQuestion {
|
|
28
|
+
id: string;
|
|
29
|
+
question: string;
|
|
30
|
+
priority: 'blocking' | 'important' | 'nice-to-know';
|
|
31
|
+
type: 'scope' | 'success' | 'pattern' | 'risk';
|
|
32
|
+
options?: string[];
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Confidence gate configuration
|
|
36
|
+
*/
|
|
37
|
+
export interface ConfidenceGateConfig {
|
|
38
|
+
threshold: number;
|
|
39
|
+
ralphThreshold: number;
|
|
40
|
+
maxResearchRounds: number;
|
|
41
|
+
maxClarificationRounds: number;
|
|
42
|
+
enableAutoResearch: boolean;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Session confidence tracking
|
|
46
|
+
*/
|
|
47
|
+
export interface ConfidenceTracking {
|
|
48
|
+
currentConfidence: number;
|
|
49
|
+
targetConfidence: number;
|
|
50
|
+
rounds: ConfidenceRound[];
|
|
51
|
+
status: 'pending' | 'researching' | 'clarifying' | 'ready' | 'blocked';
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* A round of confidence improvement
|
|
55
|
+
*/
|
|
56
|
+
export interface ConfidenceRound {
|
|
57
|
+
roundNumber: number;
|
|
58
|
+
action: 'research' | 'clarification' | 'user-input';
|
|
59
|
+
confidenceBefore: number;
|
|
60
|
+
confidenceAfter: number;
|
|
61
|
+
details: string;
|
|
62
|
+
timestamp: Date;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Check if task can proceed based on confidence level
|
|
66
|
+
*
|
|
67
|
+
* This is the main entry point for confidence gating.
|
|
68
|
+
* Returns decision on whether to proceed, research, or clarify.
|
|
69
|
+
*/
|
|
70
|
+
export declare function checkConfidence(prompt: string, config?: ConfidenceGateConfig): Promise<GateResult>;
|
|
71
|
+
/**
|
|
72
|
+
* Generate clarification questions based on analysis signals
|
|
73
|
+
*/
|
|
74
|
+
export declare function generateClarificationQuestions(analysis: SpecAnalysis): ClarificationQuestion[];
|
|
75
|
+
/**
|
|
76
|
+
* Update confidence based on user answers
|
|
77
|
+
*/
|
|
78
|
+
export declare function updateConfidenceFromAnswers(currentConfidence: number, questions: ClarificationQuestion[], answeredCount: number): number;
|
|
79
|
+
/**
|
|
80
|
+
* Create new confidence tracking for a session
|
|
81
|
+
*/
|
|
82
|
+
export declare function createConfidenceTracking(prompt: string, config?: ConfidenceGateConfig): ConfidenceTracking;
|
|
83
|
+
/**
|
|
84
|
+
* Record a confidence improvement round
|
|
85
|
+
*/
|
|
86
|
+
export declare function recordConfidenceRound(tracking: ConfidenceTracking, action: 'research' | 'clarification' | 'user-input', confidenceAfter: number, details: string): ConfidenceTracking;
|
|
87
|
+
/**
|
|
88
|
+
* Check if tracking has exceeded max rounds
|
|
89
|
+
*/
|
|
90
|
+
export declare function hasExceededMaxRounds(tracking: ConfidenceTracking, config?: ConfidenceGateConfig): boolean;
|
|
91
|
+
/**
|
|
92
|
+
* Format confidence tracking for session.md
|
|
93
|
+
*/
|
|
94
|
+
export declare function formatConfidenceForSession(tracking: ConfidenceTracking): string;
|
|
95
|
+
/**
|
|
96
|
+
* Format gate result for display
|
|
97
|
+
*/
|
|
98
|
+
export declare function formatGateResult(result: GateResult): string;
|
|
99
|
+
//# sourceMappingURL=confidence-gate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"confidence-gate.d.ts","sourceRoot":"","sources":["../../../src/core/agents/confidence-gate.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAkC,KAAK,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC9F,OAAO,EAAoB,KAAK,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAMhF;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,SAAS,CAAC;IAC3C,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,SAAS,CAAC,EAAE,qBAAqB,EAAE,CAAC;CACrC;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,UAAU,GAAG,WAAW,GAAG,cAAc,CAAC;IACpD,IAAI,EAAE,OAAO,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC;IAC/C,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,sBAAsB,EAAE,MAAM,CAAC;IAC/B,kBAAkB,EAAE,OAAO,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,MAAM,EAAE,SAAS,GAAG,aAAa,GAAG,YAAY,GAAG,OAAO,GAAG,SAAS,CAAC;CACxE;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,UAAU,GAAG,eAAe,GAAG,YAAY,CAAC;IACpD,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;CACjB;AAkBD;;;;;GAKG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,MAAM,EACd,MAAM,uBAAiB,GACtB,OAAO,CAAC,UAAU,CAAC,CAgFrB;AA6BD;;GAEG;AACH,wBAAgB,8BAA8B,CAC5C,QAAQ,EAAE,YAAY,GACrB,qBAAqB,EAAE,CAgEzB;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CACzC,iBAAiB,EAAE,MAAM,EACzB,SAAS,EAAE,qBAAqB,EAAE,EAClC,aAAa,EAAE,MAAM,GACpB,MAAM,CAeR;AAMD;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,MAAM,EACd,MAAM,uBAAiB,GACtB,kBAAkB,CAYpB;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,kBAAkB,EAC5B,MAAM,EAAE,UAAU,GAAG,eAAe,GAAG,YAAY,EACnD,eAAe,EAAE,MAAM,EACvB,OAAO,EAAE,MAAM,GACd,kBAAkB,CAuBpB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,kBAAkB,EAC5B,MAAM,uBAAiB,GACtB,OAAO,CAUT;AAMD;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,kBAAkB,GAAG,MAAM,CAwB/E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CA4B3D"}
|