Skip to content
Open
Show file tree
Hide file tree
Changes from 9 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -108,3 +108,12 @@ dist

# Browser snapshots
browser-snapshots

# Example output files
extracted-actions.json

# Local LLM files
local-llm/llama.cpp/
local-llm/models/


168 changes: 168 additions & 0 deletions IMPLEMENTATION_SUMMARY.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,168 @@
# LLM Static Analysis Implementation Summary

## Overview
This implementation adds AI-powered static documentation analysis to doc-detective/resolver, enabling automatic extraction of Doc Detective action steps from plain documentation text.

## What Was Implemented

### Core Modules

1. **Document Parser** (`src/analyzer/document-parser.js`)
- Splits documents into analyzable segments (text and code blocks)
- Tracks line numbers for source attribution
- Identifies shell code blocks for command extraction
- Handles markdown code blocks and paragraph boundaries

2. **Prompt Builder** (`src/analyzer/prompt-builder.js`)
- Constructs LLM prompts optimized for high recall
- Implements extraction philosophy with 5 key principles
- Detects relevant action types from content
- Includes relevant schemas in prompts
- Provides examples of action decomposition and conditional logic

3. **LLM Provider** (`src/llm/provider.js`)
- Abstracts interactions with multiple LLM providers
- Supports Anthropic (Claude), Google (Gemini), and OpenAI (GPT-4)
- Uses Vercel AI SDK for unified interface
- Handles JSON response parsing and error cases

4. **Post-Processor** (`src/analyzer/post-processor.js`)
- Adds defensive find actions before click/typeKeys
- Adds wait actions after submit/save operations
- Tags actions with source attribution
- Validates actions against doc-detective-common schemas

5. **Main Analyzer** (`src/analyzer/index.js`)
- Orchestrates the complete analysis workflow
- Processes each segment through the LLM
- Aggregates results and generates summary statistics
- Handles errors gracefully per segment

6. **Public API** (`src/analyzer-api.js`)
- Exports the `analyze()` function
- Loads schemas from doc-detective-common
- Simple interface for consumers

### Testing

- **80 unit tests** covering all modules
- **100% pass rate** for all tests
- Tests for document parsing, prompt building, post-processing
- Integration test suite for manual validation with real APIs
- Example usage script demonstrating the feature

### Documentation

- Updated README with:
- Feature overview
- Installation instructions
- Configuration examples for all providers
- Usage examples
- Response format documentation
- Advanced features explanation
- Limitations and best practices

- Added example script (`examples/analyzer-example.js`)
- Added integration test (`src/analyzer/integration.test.js`)

### Dependencies Added

```json
{
"ai": "^3.0.0",
"@ai-sdk/anthropic": "^0.0.x",
"@ai-sdk/google": "^0.0.x",
"@ai-sdk/openai": "^0.0.x"
}
```

All dependencies verified free of security vulnerabilities.

## Usage

```javascript
const { analyze } = require('doc-detective-resolver');

const result = await analyze(
'Navigate to https://example.com and click Login',
{
provider: 'anthropic',
apiKey: process.env.ANTHROPIC_API_KEY
}
);

console.log(`Extracted ${result.summary.totalActions} actions`);
```

## Key Features

1. **Multi-Provider Support**: Works with Anthropic, Google, and OpenAI
2. **High-Recall Extraction**: Captures all possible actions, including implicit ones
3. **Defensive Actions**: Automatically adds verification and wait steps
4. **Source Attribution**: Tracks where each action came from
5. **Schema Validation**: Ensures extracted actions are valid
6. **Code Block Support**: Extracts shell commands from code blocks
7. **Conditional Logic**: Handles if/then/else patterns

## Security

- ✅ No vulnerabilities in dependencies
- ✅ CodeQL analysis passed (0 alerts)
- ✅ API keys handled via environment variables only
- ✅ No secrets committed to repository

## Testing Results

- Total tests: 80
- Passing: 80
- Failing: 0
- Coverage: All core modules tested

## Files Added

```
src/
├── analyzer-api.js
├── analyzer/
│ ├── document-parser.js
│ ├── document-parser.test.js
│ ├── index.js
│ ├── integration.test.js
│ ├── post-processor.js
│ ├── post-processor.test.js
│ ├── prompt-builder.js
│ └── prompt-builder.test.js
└── llm/
└── provider.js

examples/
└── analyzer-example.js
```

## Files Modified

- `package.json` - Added dependencies, updated test script
- `package-lock.json` - Locked new dependencies
- `src/index.js` - Exported analyze() function
- `README.md` - Added documentation
- `.gitignore` - Added example output files

## Next Steps (Future Enhancements)

Not implemented in this PR (as per requirements):

- Interactive analysis with browser context
- Real-time action execution
- Action validation against live applications
- UI for reviewing/editing generated actions
- Integration with Doc Detective's test runner
- Batch processing API
- Custom action type definitions

## Notes

- Implementation uses JavaScript (not TypeScript) to match existing codebase
- Follows existing code patterns and conventions
- Uses Mocha/Chai for testing (matching current setup)
- Integrates with doc-detective-common for schema validation
- All changes are minimal and focused on the feature requirements
174 changes: 174 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,14 @@ Detect and resolve documentation into Doc Detective tests. This package helps yo

This package is part of the [Doc Detective](https://github.com/doc-detective/doc-detective) ecosystem.

## Features

- **Embedded Test Detection**: Parse documentation files to extract embedded test specifications
- **Test Resolution**: Process and standardize detected tests into executable format
- **OpenAPI/Arazzo Support**: Integration with API specifications
- **Multiple Markup Formats**: Support for Markdown, HTML, JavaScript, and more
- **🆕 AI-Powered Analysis**: Automatically extract test actions from documentation using LLMs

## Install

```bash
Expand Down Expand Up @@ -61,6 +69,172 @@ const detectedTests = await detectTests({ config });
const resolvedTests = await resolveTests({ config, detectedTests });
```

## AI-Powered Static Analysis (New!)

The `analyze()` function uses LLM providers to automatically extract Doc Detective action steps from plain documentation text. This feature is optimized for **high recall** - it extracts all possible actions even at the cost of some false positives.

### `analyze(document, config)`

Analyzes documentation and extracts action steps using AI.

#### Supported Providers

- **Anthropic** (Claude)
- **Google** (Gemini)
- **OpenAI** (GPT-4)
- **Local** (llama.cpp with Qwen2.5-0.5B) - For testing without API keys

#### Configuration

```javascript
const { analyze } = require("doc-detective-resolver");

const config = {
provider: 'anthropic', // or 'google', 'openai', 'local'
apiKey: process.env.ANTHROPIC_API_KEY,
model: 'claude-sonnet-4-20250514', // optional, uses provider default
temperature: 0.3, // optional, default 0.3
maxTokens: 4000 // optional, default 4000
};
```

#### Local Testing (No API Key Required)

For development and testing without paid API keys, you can use a local LLM:

```bash
# One-time setup
cd local-llm
./setup.sh

# Start the server (in a separate terminal)
./start-server.sh
```

Then use `provider: 'local'`:

```javascript
const result = await analyze(documentation, {
provider: 'local',
apiKey: 'local-testing-key' // Any value works
});
```

See [local-llm/README.md](local-llm/README.md) for details.

#### Basic Usage

```javascript
const { analyze } = require("doc-detective-resolver");

const documentation = `
Navigate to https://example.com and log in with your credentials.
Click the Settings button in the top navigation bar.
Enter your new password and click Save.
`;

const result = await analyze(documentation, {
provider: 'anthropic',
apiKey: process.env.ANTHROPIC_API_KEY
});

console.log(`Extracted ${result.summary.totalActions} actions`);
console.log(JSON.stringify(result.actions, null, 2));
```

#### Response Format

```javascript
{
actions: [
{
action: 'goTo',
url: 'https://example.com',
_source: { type: 'text', content: '...', line: 2 },
_generated: false
},
{
action: 'find',
selector: "input[type='email']",
description: 'Verify email field exists',
_generated: true // Added defensively
},
// ... more actions
],
segments: [
{
actions: [...],
segment: { type: 'text', content: '...', lineNumber: 2 },
metadata: { promptTokens: 245, completionTokens: 189, latencyMs: 1234 }
}
],
summary: {
totalActions: 15,
totalSegments: 3,
analyzedSegments: 3,
skippedSegments: 0,
totalTokens: 434,
totalLatencyMs: 1234
}
}
```

#### Environment Variables

```bash
# Set your API key
export ANTHROPIC_API_KEY="sk-ant-..."
# or
export GOOGLE_GENERATIVE_AI_API_KEY="..."
# or
export OPENAI_API_KEY="sk-..."
```

#### Advanced Features

**Defensive Actions**: The analyzer automatically adds verification steps:
- `find` actions before `click` and `typeKeys` to ensure elements exist
- `wait` actions after submit/save operations

**Source Attribution**: Each action is tagged with its source:
```javascript
{
action: 'click',
selector: 'button',
_source: {
type: 'text',
content: 'Click the submit button',
line: 5
}
}
```

**Code Block Analysis**: Shell commands in code blocks are automatically extracted:
````markdown
```bash
npm install
npm run build
```
````

**Conditional Logic**: Handles conditional instructions:
```javascript
// Input: "If you see a popup, close it. Then click Continue."
{
action: 'conditional',
if: [{ action: 'find', selector: '.popup' }],
then: [{ action: 'click', selector: '.popup .close' }]
}
```

#### Limitations

- Requires API keys from supported LLM providers
- Network connectivity required
- Processing time and cost depend on document length
- Best for instructional documentation (not reference docs)
- Generated actions should be reviewed before production use

## Development with Workspaces

This package supports npm workspaces for developing `doc-detective-common` alongside the resolver. This allows you to modify both packages simultaneously and test changes together.
Expand Down
Loading
Loading