@itz4blitz/agentful 0.3.0 → 0.5.1

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 (94) hide show
  1. package/README.md +139 -10
  2. package/bin/cli.js +1032 -48
  3. package/bin/hooks/README.md +338 -82
  4. package/bin/hooks/analyze-trigger.js +69 -0
  5. package/bin/hooks/block-random-docs.js +77 -0
  6. package/bin/hooks/health-check.js +153 -0
  7. package/bin/hooks/post-agent.js +101 -0
  8. package/bin/hooks/post-feature.js +227 -0
  9. package/bin/hooks/pre-agent.js +118 -0
  10. package/bin/hooks/pre-feature.js +138 -0
  11. package/lib/VALIDATION_README.md +455 -0
  12. package/lib/atomic.js +350 -0
  13. package/lib/ci/claude-action-integration.js +641 -0
  14. package/lib/ci/index.js +10 -0
  15. package/lib/core/CLAUDE_EXECUTOR.md +371 -0
  16. package/lib/core/README.md +321 -0
  17. package/lib/core/analyzer.js +497 -0
  18. package/lib/core/claude-executor.example.js +210 -0
  19. package/lib/core/claude-executor.js +1046 -0
  20. package/lib/core/cli.js +141 -0
  21. package/lib/core/detectors/conventions.js +342 -0
  22. package/lib/core/detectors/framework.js +276 -0
  23. package/lib/core/detectors/index.js +15 -0
  24. package/lib/core/detectors/language.js +199 -0
  25. package/lib/core/detectors/patterns.js +356 -0
  26. package/lib/core/generator.js +626 -0
  27. package/lib/core/index.js +9 -0
  28. package/lib/core/output-parser.example.js +250 -0
  29. package/lib/core/output-parser.js +458 -0
  30. package/lib/core/storage.js +515 -0
  31. package/lib/core/templates.js +556 -0
  32. package/lib/index.js +32 -0
  33. package/lib/init.js +497 -25
  34. package/lib/pipeline/cli.js +423 -0
  35. package/lib/pipeline/engine.js +928 -0
  36. package/lib/pipeline/executor.js +440 -0
  37. package/lib/pipeline/index.js +33 -0
  38. package/lib/pipeline/integrations.js +559 -0
  39. package/lib/pipeline/schemas.js +288 -0
  40. package/lib/presets.js +207 -0
  41. package/lib/remote/client.js +361 -0
  42. package/lib/server/auth.js +286 -0
  43. package/lib/server/client-example.js +190 -0
  44. package/lib/server/executor.js +426 -0
  45. package/lib/server/index.js +469 -0
  46. package/lib/update-helpers.js +505 -0
  47. package/lib/validation.js +460 -0
  48. package/package.json +19 -2
  49. package/template/.claude/agents/architect.md +260 -0
  50. package/template/.claude/agents/backend.md +203 -0
  51. package/template/.claude/agents/fixer.md +244 -0
  52. package/template/.claude/agents/frontend.md +232 -0
  53. package/template/.claude/agents/orchestrator.md +528 -0
  54. package/template/.claude/agents/product-analyzer.md +1130 -0
  55. package/template/.claude/agents/reviewer.md +229 -0
  56. package/template/.claude/agents/tester.md +242 -0
  57. package/{.claude → template/.claude}/commands/agentful-analyze.md +151 -43
  58. package/template/.claude/commands/agentful-decide.md +470 -0
  59. package/{.claude → template/.claude}/commands/agentful-product.md +92 -8
  60. package/template/.claude/commands/agentful-start.md +432 -0
  61. package/{.claude → template/.claude}/commands/agentful-status.md +88 -3
  62. package/template/.claude/commands/agentful-update.md +402 -0
  63. package/template/.claude/commands/agentful-validate.md +369 -0
  64. package/{.claude → template/.claude}/commands/agentful.md +111 -195
  65. package/template/.claude/product/EXAMPLES.md +167 -0
  66. package/{.claude → template/.claude}/settings.json +9 -13
  67. package/{.claude → template/.claude}/skills/conversation/SKILL.md +13 -7
  68. package/template/.claude/skills/deployment/SKILL.md +116 -0
  69. package/template/.claude/skills/product-planning/SKILL.md +463 -0
  70. package/{.claude → template/.claude}/skills/product-tracking/SKILL.md +10 -21
  71. package/template/.claude/skills/testing/SKILL.md +228 -0
  72. package/template/.claude/skills/validation/SKILL.md +650 -0
  73. package/template/CLAUDE.md +84 -16
  74. package/template/bin/hooks/block-random-docs.js +121 -0
  75. package/version.json +1 -1
  76. package/.claude/agents/architect.md +0 -524
  77. package/.claude/agents/backend.md +0 -315
  78. package/.claude/agents/fixer.md +0 -263
  79. package/.claude/agents/frontend.md +0 -274
  80. package/.claude/agents/orchestrator.md +0 -283
  81. package/.claude/agents/product-analyzer.md +0 -799
  82. package/.claude/agents/reviewer.md +0 -332
  83. package/.claude/agents/tester.md +0 -410
  84. package/.claude/commands/agentful-decide.md +0 -214
  85. package/.claude/commands/agentful-start.md +0 -182
  86. package/.claude/commands/agentful-validate.md +0 -127
  87. package/.claude/product/EXAMPLES.md +0 -610
  88. package/.claude/product/README.md +0 -344
  89. package/.claude/skills/validation/SKILL.md +0 -271
  90. package/bin/hooks/analyze-trigger.sh +0 -57
  91. package/bin/hooks/health-check.sh +0 -36
  92. package/template/PRODUCT.md +0 -584
  93. /package/{.claude → template/.claude}/commands/agentful-generate.md +0 -0
  94. /package/{.claude → template/.claude}/product/index.md +0 -0
@@ -0,0 +1,371 @@
1
+ # Claude Code Executor - Streaming Implementation
2
+
3
+ ## Overview
4
+
5
+ The Claude Code Executor provides real-time streaming execution of Claude Code subprocess with event-based progress tracking, question detection, and error handling.
6
+
7
+ ## Architecture
8
+
9
+ ### Components
10
+
11
+ 1. **ClaudeExecutor** - Main executor class (extends EventEmitter)
12
+ 2. **OutputParser** - Parses streaming output for structured events
13
+ 3. **ExecutionState** - Enum for tracking execution lifecycle
14
+
15
+ ### Files Created
16
+
17
+ - `/Users/blitz/Development/agentful/lib/core/claude-executor.js` - Main implementation
18
+ - `/Users/blitz/Development/agentful/lib/core/claude-executor.example.js` - Usage examples
19
+
20
+ ## Features
21
+
22
+ ### 1. Real-Time Streaming
23
+
24
+ Emits events for each chunk of output as it arrives from the Claude Code subprocess:
25
+
26
+ ```javascript
27
+ executor.on('chunk', (event) => {
28
+ console.log(event.text); // Raw stdout chunk
29
+ });
30
+ ```
31
+
32
+ ### 2. Progress Detection
33
+
34
+ Automatically detects progress markers in output:
35
+ - `[PROGRESS: 45%]` format
36
+ - `Progress: 45%` format
37
+ - Task completion markers (`Task completed`, `✓ Complete`)
38
+
39
+ ```javascript
40
+ executor.on('progress', (event) => {
41
+ console.log(`${event.percentage}%`); // 0-100
42
+ });
43
+ ```
44
+
45
+ ### 3. Question Detection
46
+
47
+ Identifies when the agent asks questions:
48
+ - Lines ending with `?`
49
+ - Lines containing "Please provide"
50
+
51
+ ```javascript
52
+ executor.on('question', (event) => {
53
+ console.log(`Question: ${event.text}`);
54
+ });
55
+ ```
56
+
57
+ ### 4. Error Detection
58
+
59
+ Detects errors from both stdout and stderr:
60
+ - Lines starting with "Error:" or "ERROR:"
61
+ - Lines containing "❌"
62
+ - All stderr output
63
+
64
+ ```javascript
65
+ executor.on('error', (event) => {
66
+ console.error(`Error from ${event.source}: ${event.message}`);
67
+ });
68
+ ```
69
+
70
+ ### 5. Execution Lifecycle Events
71
+
72
+ - `start` - Execution began
73
+ - `chunk` - Raw output chunk received
74
+ - `progress` - Progress marker detected
75
+ - `question` - Question detected
76
+ - `error` - Error detected
77
+ - `complete` - Execution finished successfully
78
+
79
+ ## API Reference
80
+
81
+ ### ClaudeExecutor Class
82
+
83
+ #### Constructor
84
+
85
+ ```javascript
86
+ const executor = new ClaudeExecutor({
87
+ claudeCommand: 'claude', // Claude CLI command
88
+ workingDir: process.cwd(), // Working directory
89
+ timeout: 10 * 60 * 1000, // 10 minutes
90
+ maxOutputSize: 1 * 1024 * 1024 // 1MB
91
+ });
92
+ ```
93
+
94
+ #### Methods
95
+
96
+ ##### executeViaSubprocess(agentName, task, options)
97
+
98
+ Execute agent via subprocess with event emission:
99
+
100
+ ```javascript
101
+ const result = await executor.executeViaSubprocess('backend', 'Build API', {
102
+ prompt: 'Custom prompt...', // Optional: override task with custom prompt
103
+ timeout: 5 * 60 * 1000, // Optional: custom timeout
104
+ workingDir: '/path/to/dir' // Optional: custom working directory
105
+ });
106
+
107
+ // Returns:
108
+ // {
109
+ // executionId: 'uuid',
110
+ // state: 'completed',
111
+ // output: 'full output text',
112
+ // duration: 12345,
113
+ // exitCode: 0,
114
+ // truncated: false
115
+ // }
116
+ ```
117
+
118
+ ##### executeWithStreaming(agentName, task, callbacks, options)
119
+
120
+ Execute with callback-based streaming:
121
+
122
+ ```javascript
123
+ const result = await executor.executeWithStreaming(
124
+ 'backend',
125
+ 'Build API',
126
+ {
127
+ onChunk: (text) => console.log(text),
128
+ onProgress: (pct, msg) => console.log(`${pct}%: ${msg}`),
129
+ onQuestion: (text) => console.log(`Question: ${text}`),
130
+ onError: (msg, source) => console.error(`Error from ${source}: ${msg}`)
131
+ },
132
+ {
133
+ timeout: 5 * 60 * 1000
134
+ }
135
+ );
136
+ ```
137
+
138
+ ##### cancel(executionId)
139
+
140
+ Cancel an active execution:
141
+
142
+ ```javascript
143
+ const cancelled = executor.cancel(executionId);
144
+ // Returns true if cancelled, false if not found
145
+ ```
146
+
147
+ ##### getExecutionStatus(executionId)
148
+
149
+ Get status of an execution:
150
+
151
+ ```javascript
152
+ const status = executor.getExecutionStatus(executionId);
153
+ // {
154
+ // id: 'uuid',
155
+ // agent: 'backend',
156
+ // task: 'Build API',
157
+ // state: 'running',
158
+ // startTime: 1234567890,
159
+ // endTime: null,
160
+ // duration: 5000,
161
+ // exitCode: null,
162
+ // outputLength: 1024,
163
+ // errorLength: 0
164
+ // }
165
+ ```
166
+
167
+ ##### listActiveExecutions()
168
+
169
+ List all active executions:
170
+
171
+ ```javascript
172
+ const active = executor.listActiveExecutions();
173
+ // Returns array of execution statuses
174
+ ```
175
+
176
+ ### OutputParser Class
177
+
178
+ Internal class for parsing streaming output. Detects:
179
+ - Progress markers
180
+ - Questions
181
+ - Errors
182
+
183
+ ```javascript
184
+ const parser = new OutputParser();
185
+ const events = parser.parse(chunk);
186
+ // {
187
+ // progress?: { percentage: 45, raw: '[PROGRESS: 45%]' },
188
+ // question?: { text: 'What database?', timestamp: 1234567890 },
189
+ // error?: { message: 'Connection failed', timestamp: 1234567890 }
190
+ // }
191
+ ```
192
+
193
+ ## Usage Examples
194
+
195
+ ### Basic Streaming
196
+
197
+ ```javascript
198
+ import { createClaudeExecutor } from './claude-executor.js';
199
+
200
+ const executor = createClaudeExecutor();
201
+
202
+ await executor.executeWithStreaming('backend', 'Build API', {
203
+ onChunk: (text) => process.stdout.write(text),
204
+ onProgress: (pct) => console.log(`Progress: ${pct}%`),
205
+ onQuestion: (q) => console.log(`Question: ${q}`),
206
+ onError: (err) => console.error(err)
207
+ });
208
+ ```
209
+
210
+ ### Event-Based Approach
211
+
212
+ ```javascript
213
+ const executor = createClaudeExecutor();
214
+
215
+ executor.on('progress', (event) => {
216
+ console.log(`${event.percentage}%`);
217
+ });
218
+
219
+ executor.on('complete', (event) => {
220
+ console.log(`Completed in ${event.duration}ms`);
221
+ });
222
+
223
+ await executor.executeViaSubprocess('backend', 'Build API');
224
+ ```
225
+
226
+ ### Concurrent Executions
227
+
228
+ ```javascript
229
+ const executor = createClaudeExecutor();
230
+
231
+ const results = await Promise.all([
232
+ executor.executeViaSubprocess('backend', 'Build API'),
233
+ executor.executeViaSubprocess('frontend', 'Build UI'),
234
+ executor.executeViaSubprocess('tester', 'Write tests')
235
+ ]);
236
+
237
+ console.log(`All ${results.length} tasks completed!`);
238
+ ```
239
+
240
+ ### With Cancellation
241
+
242
+ ```javascript
243
+ const executor = createClaudeExecutor();
244
+
245
+ let executionId;
246
+
247
+ executor.on('start', (event) => {
248
+ executionId = event.executionId;
249
+
250
+ // Cancel after 10 seconds
251
+ setTimeout(() => {
252
+ executor.cancel(executionId);
253
+ }, 10000);
254
+ });
255
+
256
+ await executor.executeViaSubprocess('backend', 'Long task');
257
+ ```
258
+
259
+ ## Integration with Existing Code
260
+
261
+ This new executor can be integrated into:
262
+
263
+ 1. **lib/server/executor.js** - Replace non-streaming subprocess logic
264
+ 2. **lib/pipeline/executor.js** - Add streaming to pipeline execution
265
+ 3. Future web UI - Real-time progress display
266
+
267
+ ### Migration Path
268
+
269
+ For `lib/server/executor.js`:
270
+
271
+ ```javascript
272
+ // Old (non-streaming):
273
+ const result = await executeAgent(agentName, task, options);
274
+
275
+ // New (with streaming):
276
+ import { createClaudeExecutor } from '../core/claude-executor.js';
277
+ const executor = createClaudeExecutor();
278
+ const result = await executor.executeViaSubprocess(agentName, task, options);
279
+ ```
280
+
281
+ ## Progress Marker Format
282
+
283
+ For agents to emit progress, use these formats in output:
284
+
285
+ ```bash
286
+ # Format 1 (recommended)
287
+ [PROGRESS: 25%]
288
+
289
+ # Format 2
290
+ Progress: 50%
291
+
292
+ # Format 3 (completion)
293
+ Task completed
294
+ ✓ Complete
295
+ ```
296
+
297
+ ## Security Features
298
+
299
+ 1. **Output Size Limiting** - Max 1MB per execution (configurable)
300
+ 2. **Timeout Enforcement** - Default 10 minutes (configurable)
301
+ 3. **Process Cleanup** - Proper SIGTERM → SIGKILL cascade
302
+ 4. **No Shell Injection** - Uses spawn with array args, not shell
303
+
304
+ ## Error Handling
305
+
306
+ The executor handles:
307
+
308
+ 1. **Spawn Errors** - Claude CLI not found or fails to start
309
+ 2. **Timeout Errors** - Execution exceeds timeout
310
+ 3. **Exit Code Errors** - Non-zero exit codes
311
+ 4. **Output Truncation** - Graceful handling of size limits
312
+
313
+ All errors are emitted as events and also throw from async methods.
314
+
315
+ ## Performance Considerations
316
+
317
+ 1. **Memory Usage** - Output buffered in memory (1MB limit)
318
+ 2. **Event Overhead** - EventEmitter overhead for high-frequency chunks
319
+ 3. **Concurrent Executions** - No hard limit, but spawns multiple processes
320
+
321
+ For production use:
322
+ - Consider streaming to disk for large outputs
323
+ - Implement execution queue for rate limiting
324
+ - Add persistent storage for execution history
325
+
326
+ ## Testing
327
+
328
+ See `/Users/blitz/Development/agentful/lib/core/claude-executor.example.js` for runnable examples.
329
+
330
+ To test manually:
331
+
332
+ ```bash
333
+ node -e "
334
+ import('./claude-executor.example.js').then(({ basicStreamingExample }) => {
335
+ basicStreamingExample();
336
+ });
337
+ "
338
+ ```
339
+
340
+ ## Future Enhancements
341
+
342
+ 1. **Disk Streaming** - Stream large outputs to disk instead of memory
343
+ 2. **Structured Output** - Parse JSON or YAML outputs automatically
344
+ 3. **Retry Logic** - Automatic retry on transient failures
345
+ 4. **Rate Limiting** - Queue and throttle concurrent executions
346
+ 5. **Metrics** - Track execution times, success rates, etc.
347
+ 6. **API Execution** - Direct Claude API integration (non-CLI)
348
+
349
+ ## Related Files
350
+
351
+ - `/Users/blitz/Development/agentful/lib/server/executor.js` - Existing server executor (non-streaming)
352
+ - `/Users/blitz/Development/agentful/lib/pipeline/executor.js` - Existing pipeline executor (partial streaming)
353
+ - `/Users/blitz/Development/agentful/lib/ci/claude-action-integration.js` - Agent definition loading
354
+
355
+ ## Version
356
+
357
+ - **Created**: 2026-01-22
358
+ - **Author**: Backend Agent
359
+ - **Status**: Ready for integration
360
+
361
+ ## Summary
362
+
363
+ The Claude Code Executor provides a robust, event-driven streaming execution framework for Claude Code subprocess. It enables real-time progress tracking, question detection, and error handling with a clean, composable API.
364
+
365
+ Key benefits:
366
+ - Real-time output streaming
367
+ - Automatic progress/question/error detection
368
+ - Callback and event-based APIs
369
+ - Concurrent execution support
370
+ - Proper timeout and cancellation handling
371
+ - Memory-safe with output size limits
@@ -0,0 +1,321 @@
1
+ # Codebase Analyzer
2
+
3
+ The codebase analyzer is agentful's detection engine that analyzes project structure, tech stack, and coding conventions to generate specialized AI agents.
4
+
5
+ ## Features
6
+
7
+ - **Language Detection** - Detects programming languages with >90% accuracy
8
+ - **Framework Detection** - Identifies frameworks and libraries from package.json, imports, and file structure
9
+ - **Pattern Extraction** - Discovers architectural patterns (components, API, database, tests, auth)
10
+ - **Convention Detection** - Extracts coding conventions (naming, file structure, code style)
11
+ - **Performance** - Completes analysis in <30 seconds for 1000-file projects
12
+ - **Error Recovery** - Handles new/empty projects gracefully with default configurations
13
+
14
+ ## Usage
15
+
16
+ ### Programmatic API
17
+
18
+ ```javascript
19
+ import { analyzeCodebase, createAnalyzer } from '@itz4blitz/agentful';
20
+
21
+ // Simple analysis
22
+ const analysis = await analyzeCodebase({
23
+ projectRoot: '/path/to/project',
24
+ outputPath: '.agentful/architecture.json'
25
+ });
26
+
27
+ // With progress tracking
28
+ import { CodebaseAnalyzer } from '@itz4blitz/agentful';
29
+
30
+ const analyzer = new CodebaseAnalyzer({
31
+ projectRoot: process.cwd(),
32
+ outputPath: '.agentful/architecture.json'
33
+ });
34
+
35
+ analyzer.on('progress', ({ stage, progress }) => {
36
+ console.log(`${stage}: ${progress}%`);
37
+ });
38
+
39
+ analyzer.on('complete', ({ duration, analysis }) => {
40
+ console.log(`Completed in ${duration}ms`);
41
+ console.log(`Detected: ${analysis.primaryLanguage}`);
42
+ });
43
+
44
+ const result = await analyzer.analyze();
45
+ ```
46
+
47
+ ### CLI
48
+
49
+ ```bash
50
+ # Analyze current directory
51
+ node lib/core/cli.js
52
+
53
+ # Analyze specific project
54
+ node lib/core/cli.js --project /path/to/project
55
+
56
+ # Force re-analysis (skip cache)
57
+ node lib/core/cli.js --force --verbose
58
+
59
+ # Custom output path
60
+ node lib/core/cli.js --output custom/path/arch.json
61
+ ```
62
+
63
+ ## Output Format
64
+
65
+ The analyzer outputs a structured JSON file (`.agentful/architecture.json`) with the following schema:
66
+
67
+ ```json
68
+ {
69
+ "version": "1.0.0",
70
+ "analyzedAt": "2026-01-22T03:21:13.478Z",
71
+ "duration": 15,
72
+ "projectRoot": "/path/to/project",
73
+ "fileCount": 224,
74
+ "isNewProject": false,
75
+ "confidence": 85,
76
+
77
+ "languages": [
78
+ {
79
+ "name": "TypeScript",
80
+ "confidence": 95,
81
+ "files": 120,
82
+ "percentage": 53.6,
83
+ "extensions": [".ts", ".tsx"]
84
+ }
85
+ ],
86
+
87
+ "primaryLanguage": "TypeScript",
88
+
89
+ "frameworks": [
90
+ {
91
+ "name": "Next.js",
92
+ "version": "14.x",
93
+ "type": "framework",
94
+ "category": "web",
95
+ "confidence": 90,
96
+ "source": "package.json"
97
+ }
98
+ ],
99
+
100
+ "patterns": {
101
+ "components": {
102
+ "detected": true,
103
+ "count": 45,
104
+ "examples": ["Button.tsx", "Card.tsx"],
105
+ "style": "functional",
106
+ "usesHooks": true
107
+ },
108
+ "api": {
109
+ "detected": true,
110
+ "pattern": "app/api/",
111
+ "type": "REST"
112
+ },
113
+ "database": {
114
+ "detected": true,
115
+ "orm": "Prisma",
116
+ "type": "SQL",
117
+ "migrations": true
118
+ },
119
+ "tests": {
120
+ "detected": true,
121
+ "framework": "vitest",
122
+ "count": 87,
123
+ "types": { "unit": 70, "integration": 15, "e2e": 2 }
124
+ },
125
+ "auth": {
126
+ "detected": true,
127
+ "methods": ["jwt", "oauth"]
128
+ }
129
+ },
130
+
131
+ "conventions": {
132
+ "naming": "camelCase",
133
+ "namingConfidence": 89,
134
+ "fileStructure": "feature-based",
135
+ "structureConfidence": 75,
136
+ "codeStyle": {
137
+ "indentation": "2 spaces",
138
+ "quotes": "single",
139
+ "semicolons": "required",
140
+ "trailingCommas": "preferred"
141
+ },
142
+ "importStyle": {
143
+ "preference": {
144
+ "importType": "named",
145
+ "pathStyle": "aliased"
146
+ }
147
+ },
148
+ "linting": {
149
+ "eslint": true,
150
+ "prettier": true,
151
+ "styleGuide": "airbnb"
152
+ }
153
+ },
154
+
155
+ "recommendations": [
156
+ {
157
+ "type": "suggestion",
158
+ "priority": "medium",
159
+ "message": "No E2E tests detected",
160
+ "action": "Consider adding Playwright or Cypress"
161
+ }
162
+ ]
163
+ }
164
+ ```
165
+
166
+ ## Architecture
167
+
168
+ The analyzer is built with a modular architecture:
169
+
170
+ ```
171
+ lib/core/
172
+ ├── analyzer.js # Main analyzer class (482 lines)
173
+ ├── cli.js # CLI interface (141 lines)
174
+ └── detectors/
175
+ ├── language.js # Language detection (199 lines)
176
+ ├── framework.js # Framework detection (276 lines)
177
+ ├── patterns.js # Pattern extraction (356 lines)
178
+ ├── conventions.js # Convention detection (342 lines)
179
+ └── index.js # Exports (15 lines)
180
+ ```
181
+
182
+ **Total:** 1,811 lines of clean, modular code
183
+
184
+ ## Detection Algorithms
185
+
186
+ ### Language Detection
187
+
188
+ 1. Scans all files and counts by extension
189
+ 2. Checks for language-specific config files (tsconfig.json, etc.)
190
+ 3. Calculates confidence based on:
191
+ - File percentage (80% weight)
192
+ - Config file presence (+10 bonus)
193
+ - Extension diversity (+5 bonus)
194
+
195
+ ### Framework Detection
196
+
197
+ 1. Reads package.json dependencies
198
+ 2. Scans for framework-specific config files
199
+ 3. Analyzes file structure patterns
200
+ 4. Merges detections from multiple sources
201
+ 5. Boosts confidence when detected from multiple sources
202
+
203
+ ### Pattern Extraction
204
+
205
+ 1. **Components:** Filters for .jsx/.tsx/.vue files, analyzes style (functional vs class)
206
+ 2. **API:** Detects /api/ directories, determines type (REST/GraphQL/RPC)
207
+ 3. **Database:** Finds ORM files, checks for migrations
208
+ 4. **Tests:** Categorizes tests (unit/integration/e2e), detects framework
209
+ 5. **Auth:** Identifies auth patterns (JWT, OAuth, sessions)
210
+
211
+ ### Convention Detection
212
+
213
+ 1. **Naming:** Analyzes file names to determine camelCase, PascalCase, snake_case, or kebab-case
214
+ 2. **File Structure:** Detects organization (feature-based, layer-based, domain-driven, atomic)
215
+ 3. **Code Style:** Samples files to detect indentation, quotes, semicolons
216
+ 4. **Import Style:** Analyzes import statements for preference (named vs default, relative vs aliased)
217
+ 5. **Linting:** Checks for ESLint/Prettier config files
218
+
219
+ ## Confidence Scoring
220
+
221
+ The analyzer calculates an overall confidence score (0-100) based on:
222
+
223
+ - **Language detection:** 40 points max (avg language confidence)
224
+ - **Framework detection:** 30 points max (avg framework confidence)
225
+ - **Pattern detection:** 30 points max (ratio of detected patterns)
226
+
227
+ New projects (<10 files) automatically get 30% confidence with helpful recommendations.
228
+
229
+ ## Error Recovery
230
+
231
+ The analyzer handles edge cases gracefully:
232
+
233
+ - **Empty projects:** Returns default structure with `isNewProject: true`
234
+ - **Unreadable files:** Skips files and emits warnings
235
+ - **Large projects:** Limits to 5000 files max (configurable)
236
+ - **Missing package.json:** Uses file structure and content analysis
237
+ - **Timeout protection:** Analysis completes in <30s even for large projects
238
+
239
+ ## Events
240
+
241
+ The `CodebaseAnalyzer` class extends `EventEmitter` and emits:
242
+
243
+ - `start` - Analysis started
244
+ - `progress` - Stage progress update
245
+ - `warning` - Non-fatal issues (unreadable files, etc.)
246
+ - `written` - Analysis written to file
247
+ - `complete` - Analysis completed successfully
248
+ - `error` - Fatal error occurred
249
+ - `cached` - Using cached analysis (when using `analyzeWithCache()`)
250
+
251
+ ## Caching
252
+
253
+ The analyzer supports intelligent caching:
254
+
255
+ ```javascript
256
+ const analyzer = new CodebaseAnalyzer();
257
+
258
+ // Use cache if fresh (<24h old and file count similar)
259
+ const result = await analyzer.analyzeWithCache();
260
+
261
+ // Force re-analysis
262
+ const result = await analyzer.analyzeWithCache(true);
263
+ ```
264
+
265
+ Cache is considered stale if:
266
+ - Age > 24 hours
267
+ - File count changed >10%
268
+
269
+ ## Integration with agentful
270
+
271
+ The analyzer is automatically invoked by `/agentful-start` to:
272
+
273
+ 1. Detect project tech stack
274
+ 2. Generate specialized agents (backend, frontend, tester, etc.)
275
+ 3. Populate `.agentful/architecture.json`
276
+ 4. Provide recommendations for missing components
277
+
278
+ ## Performance Benchmarks
279
+
280
+ - **Small projects** (<100 files): ~10ms
281
+ - **Medium projects** (100-500 files): ~15ms
282
+ - **Large projects** (500-1000 files): ~25ms
283
+ - **XL projects** (1000+ files): ~30ms (capped at 5000 files)
284
+
285
+ ## Testing
286
+
287
+ Run analyzer tests:
288
+
289
+ ```bash
290
+ npm test lib/core/
291
+ ```
292
+
293
+ Manual testing:
294
+
295
+ ```bash
296
+ # Test on agentful itself
297
+ node lib/core/cli.js --verbose
298
+
299
+ # Test on empty project
300
+ mkdir /tmp/test-project
301
+ cd /tmp/test-project
302
+ node /path/to/agentful/lib/core/cli.js --verbose
303
+ ```
304
+
305
+ ## Design Decisions
306
+
307
+ 1. **Modular detectors:** Each detector is independent and can be used separately
308
+ 2. **Event-driven:** Progress tracking and error handling via events
309
+ 3. **Fail-safe defaults:** New projects get sensible defaults rather than errors
310
+ 4. **Confidence scoring:** Transparent confidence metrics help users understand reliability
311
+ 5. **Performance first:** Fast scanning with early termination for large codebases
312
+ 6. **Schema validation:** Output validated against JSON schema for reliability
313
+
314
+ ## Future Enhancements
315
+
316
+ - Python/Java/Go framework detection
317
+ - More granular pattern detection (state management, routing, etc.)
318
+ - Multi-language monorepo support
319
+ - Machine learning for pattern recognition
320
+ - Incremental analysis (only scan changed files)
321
+ - Plugin system for custom detectors