Skip to content

Commit eeaff7d

Browse files
Merge branch 'main' into pe/required-tool-tests
2 parents 30e4593 + 8d71186 commit eeaff7d

File tree

97 files changed

+6650
-828
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

97 files changed

+6650
-828
lines changed

.continue/rules/dev-data-guide.md

Lines changed: 200 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,200 @@
1+
---
2+
alwaysApply: false
3+
---
4+
5+
# Continue Development Data (Dev Data) Guide
6+
7+
## Overview
8+
9+
Development data (dev data) captures detailed information about how developers interact with LLM-aided development tools. Unlike basic telemetry, dev data includes lots of details into the complete software development workflow, including code context, user interactions, and development patterns.
10+
11+
## Core Architecture
12+
13+
### Primary Implementation Files
14+
15+
- **`/core/data/log.ts`**: Main `DataLogger` class - singleton for event logging and remote transmission
16+
- **`/packages/config-yaml/src/schemas/data/`**: Schema definitions for all event types
17+
18+
### Storage Locations
19+
20+
- **Default storage**: `~/.continue/dev_data/`
21+
- **Event files**: `~/.continue/dev_data/{version}/{eventName}.jsonl`
22+
23+
## Event Types and Schemas
24+
25+
### Core Event Types
26+
27+
1. **`tokensGenerated`**: LLM token usage tracking
28+
2. **`autocomplete`**: Code completion interactions
29+
3. **`chatInteraction`**: Chat-based development assistance
30+
4. **`editInteraction`**: Code editing sessions
31+
5. **`editOutcome`**: Results of edit operations
32+
6. **`nextEditOutcome`**: Next Edit feature outcomes
33+
7. **`chatFeedback`**: User feedback on AI responses
34+
8. **`toolUsage`**: Tool interaction statistics
35+
9. **`quickEdit`**: Quick edit functionality usage
36+
37+
### Schema Versioning
38+
39+
- **Version 0.1.0**: Initial schema implementation
40+
- **Version 0.2.0**: Current schema with expanded fields and metadata
41+
- **Schema files**: Located in `/packages/config-yaml/src/schemas/data/`
42+
43+
### Base Schema Structure
44+
45+
All events inherit from a base schema (`/packages/config-yaml/src/schemas/data/base.ts`):
46+
47+
```typescript
48+
{
49+
eventName: string,
50+
schema: string,
51+
timestamp: string,
52+
userId: string,
53+
userAgent: string,
54+
selectedProfileId: string
55+
}
56+
```
57+
58+
## Key Integration Points
59+
60+
### Autocomplete System
61+
62+
- **File**: `/core/autocomplete/util/AutocompleteLoggingService.ts`
63+
- **Purpose**: Tracks code completion acceptance/rejection, timing, and cache hits
64+
- **Integration**: Called from autocomplete engine when completions are shown/accepted
65+
66+
### Chat Interface
67+
68+
- **Integration**: Chat interactions logged through `DataLogger.logDevData()`
69+
- **Data**: Includes prompts, responses, context, and user feedback
70+
- **Privacy**: Can be configured to exclude code content
71+
72+
### Edit Features
73+
74+
- **Files**: `/extensions/vscode/src/extension/EditOutcomeTracker.ts`, `/core/nextEdit/NextEditLoggingService.ts`
75+
- **Purpose**: Track edit suggestions, acceptance rates, and outcomes
76+
- **Integration**: Embedded in edit workflow to capture user decisions
77+
78+
### LLM Token Tracking
79+
80+
- **File**: `/core/llm/index.ts`
81+
- **Purpose**: Track token usage across all LLM providers
82+
- **Storage**: SQLite database for efficient querying and reporting
83+
84+
## Configuration and Customization
85+
86+
### Configuration Structure
87+
88+
Dev data is configured through `data` blocks in your Continue config:
89+
90+
```yaml
91+
data:
92+
- name: "Local Development Data"
93+
destination: "file:///Users/developer/.continue/dev_data"
94+
schema: "0.2.0"
95+
level: "all"
96+
events: ["autocomplete", "chatInteraction", "editOutcome"]
97+
98+
- name: "Team Analytics"
99+
destination: "https://analytics.yourcompany.com/api/events"
100+
schema: "0.2.0"
101+
level: "noCode"
102+
apiKey: "your-api-key-here"
103+
events: ["tokensGenerated", "toolUsage"]
104+
```
105+
106+
### Configuration Options
107+
108+
- **`destination`**: Where to send data (`file://` for local, `http://`/`https://` for remote)
109+
- **`schema`**: Schema version to use (`"0.1.0"` or `"0.2.0"`)
110+
- **`level`**: Data detail level (`"all"` includes code, `"noCode"` excludes code content)
111+
- **`events`**: Array of event types to collect
112+
- **`apiKey`**: Authentication for remote endpoints
113+
114+
### Privacy Controls
115+
116+
- **`"all"` level**: Includes code content (prefixes, suffixes, completions)
117+
- **`"noCode"` level**: Excludes code content, only metadata and metrics
118+
- **Local-first**: Data is always stored locally, remote transmission is optional
119+
120+
## Making Changes to Dev Data
121+
122+
### Adding New Event Types
123+
124+
1. **Create schema**: Add new event schema in `/packages/config-yaml/src/schemas/data/`
125+
2. **Update index**: Add to schema aggregator in `/packages/config-yaml/src/schemas/data/index.ts`
126+
3. **Implement logging**: Add logging calls in relevant service files
127+
4. **Update version**: Consider schema version bump if breaking changes
128+
129+
### Modifying Existing Events
130+
131+
1. **Schema changes**: Update schema files in `/packages/config-yaml/src/schemas/data/`
132+
2. **Backward compatibility**: Ensure changes don't break existing data consumers
133+
3. **Version management**: Increment schema version for breaking changes
134+
4. **Test thoroughly**: Validate schema changes with existing data
135+
136+
### Adding New Logging Points
137+
138+
1. **Import DataLogger**: `import { DataLogger } from "core/data/log"`
139+
2. **Log events**: Call `DataLogger.getInstance().logDevData(eventName, data)`
140+
3. **Follow patterns**: Use existing logging services as examples
141+
4. **Validate data**: Ensure logged data matches schema requirements
142+
143+
### Debugging Dev Data Issues
144+
145+
1. **Check local storage**: Verify files are being created in `~/.continue/dev_data/`
146+
2. **Validate schemas**: Ensure event data matches expected schema format
147+
3. **Review configuration**: Check `data` blocks in Continue config
148+
4. **Test endpoints**: Verify remote endpoints are reachable and accepting data
149+
150+
## Best Practices
151+
152+
### When Adding New Events
153+
154+
- Follow existing naming conventions for event types
155+
- Include sufficient context for analysis without oversharing sensitive data
156+
- Consider privacy implications and respect user configuration levels
157+
- Add appropriate error handling and logging
158+
159+
### When Modifying Schemas
160+
161+
- Maintain backward compatibility when possible
162+
- Document schema changes thoroughly
163+
- Consider impact on existing data consumers
164+
- Test with real development data
165+
166+
### When Integrating Logging
167+
168+
- Use the singleton pattern: `DataLogger.getInstance()`
169+
- Log events at appropriate points in user workflow
170+
- Respect user privacy settings and configuration
171+
- Handle errors gracefully without disrupting user experience
172+
173+
## Common Patterns
174+
175+
### Service-Based Logging
176+
177+
Most dev data logging follows a service pattern:
178+
179+
```typescript
180+
export class FeatureLoggingService {
181+
private dataLogger = DataLogger.getInstance();
182+
183+
logFeatureUsage(data: FeatureUsageData) {
184+
this.dataLogger.logDevData("featureUsage", data);
185+
}
186+
}
187+
```
188+
189+
### Event-Driven Logging
190+
191+
Events are typically logged at key interaction points:
192+
193+
```typescript
194+
// When user accepts autocomplete
195+
onAutocompleteAccepted(completion: CompletionData) {
196+
AutocompleteLoggingService.getInstance().logAutocompleteAccepted(completion);
197+
}
198+
```
199+
200+
This guide provides the foundation for understanding and working with Continue's dev data system. Always prioritize user privacy and follow established patterns when making changes.

.github/workflows/compliance.yaml

Lines changed: 197 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,197 @@
1+
name: PR Compliance Checks
2+
3+
on:
4+
pull_request:
5+
types: [opened, synchronize, reopened, ready_for_review]
6+
branches: [main]
7+
workflow_dispatch:
8+
9+
concurrency:
10+
group: ${{ github.workflow }}-${{ github.ref }}
11+
cancel-in-progress: true
12+
13+
jobs:
14+
conventional-commits:
15+
name: Validate Conventional Commits (Warning Only)
16+
runs-on: ubuntu-latest
17+
if: ${{ !github.event.pull_request.draft }}
18+
continue-on-error: true
19+
permissions:
20+
pull-requests: write
21+
issues: write
22+
contents: read
23+
steps:
24+
- name: Checkout code
25+
uses: actions/checkout@v4
26+
with:
27+
fetch-depth: 0
28+
29+
- name: Validate conventional commits
30+
id: commitlint
31+
uses: wagoid/commitlint-github-action@v6
32+
with:
33+
configFile: .commitlintrc.warning.json
34+
continue-on-error: true
35+
36+
- name: Add commit message guidance comment
37+
if: steps.commitlint.outcome == 'failure'
38+
uses: actions/github-script@v7
39+
with:
40+
script: |
41+
const { data: comments } = await github.rest.issues.listComments({
42+
owner: context.repo.owner,
43+
repo: context.repo.repo,
44+
issue_number: context.issue.number,
45+
});
46+
47+
const botComment = comments.find(comment =>
48+
comment.user.type === 'Bot' &&
49+
comment.body.includes('Conventional Commit Format')
50+
);
51+
52+
if (!botComment) {
53+
await github.rest.issues.createComment({
54+
owner: context.repo.owner,
55+
repo: context.repo.repo,
56+
issue_number: context.issue.number,
57+
body: [
58+
"## ⚠️ Conventional Commit Format",
59+
"",
60+
"Your commit messages don't follow the conventional commit format, but **this won't block your PR from being merged**. We recommend downloading [this extension](https://marketplace.visualstudio.com/items?itemName=vivaxy.vscode-conventional-commits) if you are using VS Code.",
61+
"",
62+
"### Expected Format:",
63+
"```",
64+
"<type>[optional scope]: <description>",
65+
"",
66+
"[optional body]",
67+
"",
68+
"[optional footer(s)]",
69+
"```",
70+
"",
71+
"### Examples:",
72+
"- `feat: add changelog generation support`",
73+
"- `fix: resolve login redirect issue`",
74+
"- `docs: update README with new instructions`",
75+
"- `chore: update dependencies`",
76+
"",
77+
"### Valid Types:",
78+
"`feat`, `fix`, `docs`, `style`, `refactor`, `perf`, `test`, `build`, `ci`, `chore`, `revert`",
79+
"",
80+
"This helps with:",
81+
"- 📝 Automatic changelog generation",
82+
"- 🚀 Automated semantic versioning",
83+
"- 📊 Better project history tracking",
84+
"",
85+
"*This is a non-blocking warning - your PR can still be merged without fixing this.*"
86+
].join('\n')
87+
});
88+
}
89+
90+
security-audit:
91+
name: Security Audit
92+
runs-on: ubuntu-latest
93+
if: ${{ !github.event.pull_request.draft }}
94+
permissions:
95+
security-events: write
96+
contents: read
97+
steps:
98+
- name: Checkout code
99+
uses: actions/checkout@v4
100+
101+
- name: Setup Node.js
102+
uses: actions/setup-node@v4
103+
with:
104+
node-version-file: ".nvmrc"
105+
cache: "npm"
106+
107+
- name: Install dependencies
108+
run: npm ci
109+
110+
- name: Fix vulnerabilities
111+
run: npm audit fix
112+
113+
- name: Run npm audit
114+
run: npm audit --audit-level=moderate
115+
116+
- name: Initialize CodeQL
117+
uses: github/codeql-action/init@v3
118+
with:
119+
languages: javascript
120+
121+
- name: Perform CodeQL Analysis
122+
uses: github/codeql-action/analyze@v3
123+
124+
# Use this for any files that we want to be certain exist
125+
# Basically creates a forcing function to discuss were anyone to want to remove them
126+
file-validation:
127+
name: Required Files Check
128+
runs-on: ubuntu-latest
129+
if: ${{ !github.event.pull_request.draft }}
130+
steps:
131+
- name: Checkout code
132+
uses: actions/checkout@v4
133+
134+
- name: Check required files
135+
run: |
136+
required_files=(
137+
"package.json"
138+
"package-lock.json"
139+
"README.md"
140+
"LICENSE"
141+
".gitignore"
142+
"tsconfig.json"
143+
"SECURITY.md"
144+
"CONTRIBUTING.md"
145+
".nvmrc"
146+
".prettierrc"
147+
".prettierignore"
148+
)
149+
150+
missing_files=()
151+
for file in "${required_files[@]}"; do
152+
if [[ ! -f "$file" ]]; then
153+
missing_files+=("$file")
154+
fi
155+
done
156+
157+
if [[ ${#missing_files[@]} -gt 0 ]]; then
158+
echo "❌ Missing required files:"
159+
printf '%s\n' "${missing_files[@]}"
160+
exit 1
161+
else
162+
echo "✅ All required files present"
163+
fi
164+
165+
compliance-summary:
166+
name: Compliance Summary
167+
runs-on: ubuntu-latest
168+
needs: [conventional-commits, security-audit, file-validation]
169+
if: always() && !github.event.pull_request.draft
170+
steps:
171+
- name: Check compliance status
172+
run: |
173+
echo "## 🔍 Compliance Check Results" >> $GITHUB_STEP_SUMMARY
174+
echo "" >> $GITHUB_STEP_SUMMARY
175+
176+
if [[ "${{ needs.conventional-commits.result }}" == "success" ]]; then
177+
echo "✅ Conventional Commits: PASSED" >> $GITHUB_STEP_SUMMARY
178+
elif [[ "${{ needs.conventional-commits.result }}" == "failure" ]]; then
179+
echo "⚠️ Conventional Commits: WARNING (non-blocking)" >> $GITHUB_STEP_SUMMARY
180+
else
181+
echo "❌ Conventional Commits: SKIPPED" >> $GITHUB_STEP_SUMMARY
182+
fi
183+
184+
if [[ "${{ needs.security-audit.result }}" == "success" ]]; then
185+
echo "✅ Security Audit: PASSED" >> $GITHUB_STEP_SUMMARY
186+
else
187+
echo "❌ Security Audit: FAILED" >> $GITHUB_STEP_SUMMARY
188+
fi
189+
190+
if [[ "${{ needs.file-validation.result }}" == "success" ]]; then
191+
echo "✅ File Validation: PASSED" >> $GITHUB_STEP_SUMMARY
192+
else
193+
echo "❌ File Validation: FAILED" >> $GITHUB_STEP_SUMMARY
194+
fi
195+
196+
echo "" >> $GITHUB_STEP_SUMMARY
197+
echo "📊 **Overall Status**: ${{ job.status }}" >> $GITHUB_STEP_SUMMARY

0 commit comments

Comments
 (0)