Skip to content

Commit d4e707b

Browse files
prosdevclaude
andcommitted
docs: add v0.10.0 release notes and update homepage callout
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 622628f commit d4e707b

File tree

25 files changed

+311
-669
lines changed

25 files changed

+311
-669
lines changed

.changeset/cli-ux-overhaul.md

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,25 +13,42 @@
1313
**Index (`dev index`)**
1414
- 7x faster: removed `buildCodeMetadata` (32s of N+1 git calls → 0s)
1515
- Auto-starts Antfly if not running — no more "fetch failed" errors
16-
- Ora spinners with file count during scanning, elapsed timer during embedding
16+
- Ora spinners with file count during scanning
1717
- Pre-flight model check: auto-pulls embedding model if missing
1818
- Resilient error messages with actionable guidance (OOM, port conflict, model missing)
1919
- Normalized `dev index .``dev index` (path defaults to cwd)
2020
- Improved next steps: MCP install, try-it-out commands, `dev --help`
21-
- Removed dead "Git history" line from indexing plan
21+
22+
**Search (`dev search`)**
23+
- Removed misleading percentage scores (RRF scores are not similarity percentages)
24+
- Default threshold changed from 0.7 to 0 (RRF scores are much lower than cosine similarity)
25+
- Config no longer required — defaults to current directory
26+
27+
**Map (`dev map`)**
28+
- Clean output: no markdown headers, no emojis, relative paths, proper tree connectors
29+
- Fixed `--focus` nesting bug (was showing redundant parent directories)
30+
- Next steps with usage examples
31+
- N+1 git fix: `calculateChangeFrequency` now uses single `git log` call with pure testable parser
2232

2333
**Reset (`dev reset`)**
2434
- New command to tear down Antfly and clean all indexed data
2535
- Supports both Docker and native cleanup
26-
- Directs users to `dev setup` to start fresh
2736

2837
**MCP Server**
2938
- Auto-starts Antfly on MCP server startup (no manual `dev setup` needed after reboot)
3039
- Auto-recovery: if Antfly crashes mid-session, MCP retries tool calls after restarting the server
3140
- Human-readable errors when Antfly is unreachable
3241

33-
**Antfly Resilience**
42+
**Removed**
43+
- `dev init` — config is now optional, all commands default to current directory
44+
- `dev stats` and `dev dashboard` — metrics collection removed
45+
- Dead GitHub output functions (~200 lines)
46+
47+
**Internal**
3448
- Native-first priority in `ensureAntfly` (better performance, no VM overhead)
3549
- Port conflict detection with `lsof` guidance
36-
- `linearMerge` now reports per-page progress via `onProgress` callback
50+
- `linearMerge` per-page progress via `onProgress` callback
51+
- `vectors.lance``vectors` (clean Antfly table names)
52+
- Extended scanner exclusions: `.env*`, `*.min.js`, `*.d.ts`, `generated/`, `.terraform/`, `.claude/`
53+
- Pure testable functions: `parseGitLogOutput`, `buildFrequencyMap`, `stripFocusPrefix`
3754
- Upgraded ora to 9.x

CLAUDE.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,9 @@ dev setup # One-time: start Antfly search backend
8282
- **Changesets target published packages only.** Only `@prosdevlab/dev-agent`
8383
and `@prosdevlab/kero` are published to npm. All other packages are private
8484
and bundled into dev-agent via tsup. Never add private packages to changesets.
85+
- **Changesets include doc site updates.** When adding a changeset, also:
86+
1. Add a release entry to `website/content/updates/index.mdx`
87+
2. Update `website/content/latest-version.ts` to match the new version
8588

8689
---
8790

packages/cli/README.md

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,6 @@ npm install -g @prosdevlab/dev-agent-cli
1010

1111
## Usage
1212

13-
### Initialize
14-
15-
Initialize dev-agent in your repository:
16-
17-
```bash
18-
dev init
19-
```
20-
21-
This creates a `.dev-agent.json` configuration file.
22-
2313
### Index Repository
2414

2515
Index your repository for semantic search:
@@ -141,13 +131,12 @@ The `.dev-agent.json` file configures the indexer:
141131
### Basic Workflow
142132

143133
```bash
144-
# Initialize and index
145-
dev init
134+
# Setup and index
135+
dev setup
146136
dev index
147137

148138
# View statistics
149139
dev stats
150-
# 📊 Files Indexed: 54, Vectors Stored: 566
151140
```
152141

153142
### Semantic Search Examples

packages/cli/src/cli.ts

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,13 @@ import chalk from 'chalk';
44
import { Command } from 'commander';
55
import { cleanCommand } from './commands/clean.js';
66
import { compactCommand } from './commands/compact.js';
7-
import { dashboardCommand } from './commands/dashboard.js';
87
import { exploreCommand } from './commands/explore.js';
98
import { indexCommand } from './commands/index.js';
10-
import { initCommand } from './commands/init.js';
119
import { mapCommand } from './commands/map.js';
1210
import { mcpCommand } from './commands/mcp.js';
1311
import { resetCommand } from './commands/reset.js';
1412
import { searchCommand } from './commands/search.js';
1513
import { setupCommand } from './commands/setup.js';
16-
import { statsCommand } from './commands/stats.js';
1714
import { storageCommand } from './commands/storage.js';
1815

1916
// Injected at build time by tsup define
@@ -28,13 +25,10 @@ program
2825
.version(VERSION);
2926

3027
// Register commands
31-
program.addCommand(initCommand);
3228
program.addCommand(indexCommand);
3329
program.addCommand(searchCommand);
3430
program.addCommand(exploreCommand);
3531
program.addCommand(mapCommand);
36-
program.addCommand(statsCommand);
37-
program.addCommand(dashboardCommand);
3832
program.addCommand(compactCommand);
3933
program.addCommand(cleanCommand);
4034
program.addCommand(storageCommand);

packages/cli/src/commands/clean.ts

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,7 @@ export const cleanCommand = new Command('clean')
1919
try {
2020
// Load config
2121
const config = await loadConfig();
22-
if (!config) {
23-
logger.warn('No config found');
24-
logger.log('Nothing to clean.');
25-
return;
26-
}
27-
28-
// Resolve repository path
29-
const repositoryPath = config.repository?.path || config.repositoryPath || process.cwd();
22+
const repositoryPath = config?.repository?.path || config?.repositoryPath || process.cwd();
3023
const resolvedRepoPath = path.resolve(repositoryPath);
3124

3225
// Get centralized storage paths

packages/cli/src/commands/compact.ts

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,7 @@ export const compactCommand = new Command('compact')
2020
try {
2121
// Load config
2222
const config = await loadConfig();
23-
if (!config) {
24-
spinner.fail('No config found');
25-
logger.error('Run "dev init" first to initialize the repository');
26-
process.exit(1);
27-
return;
28-
}
29-
30-
// Resolve repository path
31-
const repositoryPath = config.repository?.path || config.repositoryPath || process.cwd();
23+
const repositoryPath = config?.repository?.path || config?.repositoryPath || process.cwd();
3224
const resolvedRepoPath = path.resolve(repositoryPath);
3325

3426
// Get centralized storage paths
@@ -40,8 +32,8 @@ export const compactCommand = new Command('compact')
4032
const indexer = new RepositoryIndexer({
4133
repositoryPath: resolvedRepoPath,
4234
vectorStorePath: filePaths.vectors,
43-
excludePatterns: config.repository?.excludePatterns || config.excludePatterns,
44-
languages: config.repository?.languages || config.languages,
35+
excludePatterns: config?.repository?.excludePatterns || config?.excludePatterns,
36+
languages: config?.repository?.languages || config?.languages,
4537
});
4638

4739
await indexer.initialize();

packages/cli/src/commands/explore.ts

Lines changed: 6 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,7 @@ explore
2525

2626
try {
2727
const config = await loadConfig();
28-
if (!config) {
29-
spinner.fail('No config found');
30-
logger.error('Run "dev init" first');
31-
process.exit(1);
32-
return;
33-
}
34-
35-
// Resolve repository path
36-
const repositoryPath = config.repository?.path || config.repositoryPath || process.cwd();
28+
const repositoryPath = config?.repository?.path || config?.repositoryPath || process.cwd();
3729
const resolvedRepoPath = path.resolve(repositoryPath);
3830

3931
// Get centralized storage paths
@@ -44,8 +36,8 @@ explore
4436
const indexer = new RepositoryIndexer({
4537
repositoryPath: resolvedRepoPath,
4638
vectorStorePath: filePaths.vectors,
47-
excludePatterns: config.repository?.excludePatterns || config.excludePatterns,
48-
languages: config.repository?.languages || config.languages,
39+
excludePatterns: config?.repository?.excludePatterns || config?.excludePatterns,
40+
languages: config?.repository?.languages || config?.languages,
4941
});
5042

5143
await indexer.initialize();
@@ -99,15 +91,7 @@ explore
9991

10092
try {
10193
const config = await loadConfig();
102-
if (!config) {
103-
spinner.fail('No config found');
104-
logger.error('Run "dev init" first');
105-
process.exit(1);
106-
return;
107-
}
108-
109-
// Resolve repository path
110-
const repositoryPath = config.repository?.path || config.repositoryPath || process.cwd();
94+
const repositoryPath = config?.repository?.path || config?.repositoryPath || process.cwd();
11195
const resolvedRepoPath = path.resolve(repositoryPath);
11296

11397
// Get centralized storage paths
@@ -131,8 +115,8 @@ explore
131115
const indexer = new RepositoryIndexer({
132116
repositoryPath: resolvedRepoPath,
133117
vectorStorePath: filePaths.vectors,
134-
excludePatterns: config.repository?.excludePatterns || config.excludePatterns,
135-
languages: config.repository?.languages || config.languages,
118+
excludePatterns: config?.repository?.excludePatterns || config?.excludePatterns,
119+
languages: config?.repository?.languages || config?.languages,
136120
});
137121

138122
await indexer.initialize();

packages/cli/src/commands/index.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,6 @@ export const indexCommand = new Command('index')
170170
console.log(' Try it out:');
171171
console.log(' dev search "authentication" Semantic code search');
172172
console.log(' dev map Explore codebase structure');
173-
console.log(' dev status Check index health');
174173
console.log(' dev --help See all commands');
175174
console.log('');
176175

packages/cli/src/commands/map.ts

Lines changed: 14 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -57,21 +57,15 @@ Use Case:
5757

5858
// Create logger with debug enabled if --verbose
5959
const mapLogger = createLogger({
60-
level: options.verbose ? 'debug' : 'info',
60+
level: options.verbose ? 'debug' : 'warn',
6161
format: 'pretty',
6262
});
6363

6464
const spinner = ora('Loading configuration...').start();
6565

6666
try {
6767
const config = await loadConfig();
68-
if (!config) {
69-
spinner.fail('No config found');
70-
logger.error('Run "dev init" first to initialize dev-agent');
71-
process.exit(1);
72-
}
73-
74-
const repositoryPath = config.repository?.path || config.repositoryPath || process.cwd();
68+
const repositoryPath = config?.repository?.path || config?.repositoryPath || process.cwd();
7569
const resolvedRepoPath = path.resolve(repositoryPath);
7670

7771
spinner.text = 'Initializing indexer...';
@@ -98,7 +92,7 @@ Use Case:
9892
// Check if repository is indexed
9993
mapLogger.debug('Checking if repository is indexed');
10094
const stats = await indexer.getStats();
101-
if (!stats || stats.filesScanned === 0) {
95+
if (!stats) {
10296
spinner.fail('Repository not indexed');
10397
await indexer.close();
10498
logger.warn('No indexed data found.');
@@ -194,36 +188,25 @@ Use Case:
194188
'Map generation complete'
195189
);
196190

197-
spinner.succeed(
198-
`Map generated in ${t4 - startTime}ms (init: ${t2 - t1}ms, map: ${t4 - t3}ms)`
199-
);
191+
const duration = ((t4 - startTime) / 1000).toFixed(1);
192+
spinner.succeed(`Map generated (${duration}s)`);
200193

201-
// Format and display
202-
mapLogger.debug('Formatting map output');
203-
const t5 = Date.now();
204194
const formatted = formatCodebaseMap(map, {
205195
includeExports: options.exports,
206196
includeChangeFrequency: options.changeFrequency,
197+
repositoryPath: resolvedRepoPath,
207198
});
208-
const t6 = Date.now();
209-
mapLogger.debug({ duration_ms: t6 - t5, outputLength: formatted.length }, 'Map formatted');
210-
211-
output.log('');
212-
output.log(formatted);
213-
output.log('');
214199

215-
// Show summary
216-
output.log(
217-
`📊 Total: ${map.totalComponents.toLocaleString()} components across ${map.totalDirectories.toLocaleString()} directories`
218-
);
219-
if (map.hotPaths.length > 0) {
220-
output.log(`🔥 ${map.hotPaths.length} hot paths identified`);
221-
}
222-
output.log('');
200+
console.log('');
201+
console.log(formatted);
202+
console.log('');
203+
console.log(' Try:');
204+
console.log(' dev search "<query>" Search indexed code');
205+
console.log(' dev map --depth 3 Show deeper structure');
206+
console.log(' dev map --focus packages/core Focus on a directory');
207+
console.log('');
223208

224-
mapLogger.info('Closing indexer');
225209
await indexer.close();
226-
mapLogger.debug('Indexer closed');
227210
} catch (error) {
228211
spinner.fail('Failed to generate map');
229212
logger.error(`Error: ${error instanceof Error ? error.message : String(error)}`);

packages/cli/src/commands/search.ts

Lines changed: 7 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -16,24 +16,16 @@ export const searchCommand = new Command('search')
1616
.description('Search indexed code semantically')
1717
.argument('<query>', 'Search query')
1818
.option('-l, --limit <number>', 'Maximum number of results', '10')
19-
.option('-t, --threshold <number>', 'Minimum similarity score (0-1)', '0.7')
19+
.option('-t, --threshold <number>', 'Minimum similarity score', '0')
2020
.option('--json', 'Output results as JSON', false)
2121
.option('-v, --verbose', 'Show detailed results with signatures and docs', false)
2222
.action(async (query: string, options) => {
2323
const spinner = ora('Searching...').start();
2424

2525
try {
26-
// Load config
26+
// Load config (optional — defaults to cwd)
2727
const config = await loadConfig();
28-
if (!config) {
29-
spinner.fail('No config found');
30-
logger.error('Run "dev init" first to initialize dev-agent');
31-
process.exit(1);
32-
return; // TypeScript needs this
33-
}
34-
35-
// Resolve repository path
36-
const repositoryPath = config.repository?.path || config.repositoryPath || process.cwd();
28+
const repositoryPath = config?.repository?.path || config?.repositoryPath || process.cwd();
3729
const resolvedRepoPath = path.resolve(repositoryPath);
3830

3931
// Get centralized storage paths
@@ -45,8 +37,8 @@ export const searchCommand = new Command('search')
4537
const indexer = new RepositoryIndexer({
4638
repositoryPath: resolvedRepoPath,
4739
vectorStorePath: filePaths.vectors,
48-
excludePatterns: config.repository?.excludePatterns || config.excludePatterns,
49-
languages: config.repository?.languages || config.languages,
40+
excludePatterns: config?.repository?.excludePatterns || config?.excludePatterns,
41+
languages: config?.repository?.languages || config?.languages,
5042
});
5143

5244
await indexer.initialize();
@@ -65,9 +57,9 @@ export const searchCommand = new Command('search')
6557
if (results.length === 0) {
6658
output.log('');
6759
output.warn('No results found. Try:');
68-
output.log(` • Lower threshold: ${chalk.cyan('--threshold 0.5')}`);
60+
output.log(` • Lower threshold: ${chalk.cyan('--threshold 0.3')}`);
6961
output.log(` • Different keywords`);
70-
output.log(` • Refresh index: ${chalk.cyan('dev update')}`);
62+
output.log(` • Re-index: ${chalk.cyan('dev index --force')}`);
7163
output.log('');
7264
return;
7365
}

0 commit comments

Comments
 (0)