specweave 0.32.10 → 0.33.2
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/CLAUDE.md +106 -1
- package/dist/src/cli/add-child-pid.d.ts +11 -0
- package/dist/src/cli/add-child-pid.d.ts.map +1 -0
- package/dist/src/cli/add-child-pid.js +42 -0
- package/dist/src/cli/add-child-pid.js.map +1 -0
- package/dist/src/cli/add-child-process.d.ts +15 -0
- package/dist/src/cli/add-child-process.d.ts.map +1 -0
- package/dist/src/cli/add-child-process.js +40 -0
- package/dist/src/cli/add-child-process.js.map +1 -0
- package/dist/src/cli/check-watchdog.d.ts +15 -0
- package/dist/src/cli/check-watchdog.d.ts.map +1 -0
- package/dist/src/cli/check-watchdog.js +47 -0
- package/dist/src/cli/check-watchdog.js.map +1 -0
- package/dist/src/cli/cleanup-zombies.d.ts +14 -0
- package/dist/src/cli/cleanup-zombies.d.ts.map +1 -0
- package/dist/src/cli/cleanup-zombies.js +268 -0
- package/dist/src/cli/cleanup-zombies.js.map +1 -0
- package/dist/src/cli/find-session-by-pid.d.ts +14 -0
- package/dist/src/cli/find-session-by-pid.d.ts.map +1 -0
- package/dist/src/cli/find-session-by-pid.js +45 -0
- package/dist/src/cli/find-session-by-pid.js.map +1 -0
- package/dist/src/cli/get-stale-sessions.d.ts +17 -0
- package/dist/src/cli/get-stale-sessions.d.ts.map +1 -0
- package/dist/src/cli/get-stale-sessions.js +36 -0
- package/dist/src/cli/get-stale-sessions.js.map +1 -0
- package/dist/src/cli/register-session.d.ts +16 -0
- package/dist/src/cli/register-session.d.ts.map +1 -0
- package/dist/src/cli/register-session.js +48 -0
- package/dist/src/cli/register-session.js.map +1 -0
- package/dist/src/cli/remove-session.d.ts +11 -0
- package/dist/src/cli/remove-session.d.ts.map +1 -0
- package/dist/src/cli/remove-session.js +36 -0
- package/dist/src/cli/remove-session.js.map +1 -0
- package/dist/src/cli/update-heartbeat.d.ts +11 -0
- package/dist/src/cli/update-heartbeat.d.ts.map +1 -0
- package/dist/src/cli/update-heartbeat.js +36 -0
- package/dist/src/cli/update-heartbeat.js.map +1 -0
- package/dist/src/config/types.d.ts +1208 -203
- package/dist/src/config/types.d.ts.map +1 -1
- package/dist/src/core/background/job-manager.d.ts +16 -0
- package/dist/src/core/background/job-manager.d.ts.map +1 -1
- package/dist/src/core/background/job-manager.js +110 -15
- package/dist/src/core/background/job-manager.js.map +1 -1
- package/dist/src/core/increment/increment-utils.d.ts +26 -1
- package/dist/src/core/increment/increment-utils.d.ts.map +1 -1
- package/dist/src/core/increment/increment-utils.js +66 -4
- package/dist/src/core/increment/increment-utils.js.map +1 -1
- package/dist/src/core/increment/status-change-sync-trigger.d.ts +3 -1
- package/dist/src/core/increment/status-change-sync-trigger.d.ts.map +1 -1
- package/dist/src/core/increment/status-change-sync-trigger.js +5 -2
- package/dist/src/core/increment/status-change-sync-trigger.js.map +1 -1
- package/dist/src/core/living-docs/intelligent-analyzer/architecture-generator.d.ts.map +1 -1
- package/dist/src/core/living-docs/intelligent-analyzer/architecture-generator.js +48 -12
- package/dist/src/core/living-docs/intelligent-analyzer/architecture-generator.js.map +1 -1
- package/dist/src/core/living-docs/intelligent-analyzer/cache-manager.d.ts +70 -0
- package/dist/src/core/living-docs/intelligent-analyzer/cache-manager.d.ts.map +1 -0
- package/dist/src/core/living-docs/intelligent-analyzer/cache-manager.js +188 -0
- package/dist/src/core/living-docs/intelligent-analyzer/cache-manager.js.map +1 -0
- package/dist/src/core/living-docs/intelligent-analyzer/dashboard-generator.d.ts +33 -0
- package/dist/src/core/living-docs/intelligent-analyzer/dashboard-generator.d.ts.map +1 -0
- package/dist/src/core/living-docs/intelligent-analyzer/dashboard-generator.js +290 -0
- package/dist/src/core/living-docs/intelligent-analyzer/dashboard-generator.js.map +1 -0
- package/dist/src/core/living-docs/intelligent-analyzer/deep-repo-analyzer.d.ts.map +1 -1
- package/dist/src/core/living-docs/intelligent-analyzer/deep-repo-analyzer.js +114 -11
- package/dist/src/core/living-docs/intelligent-analyzer/deep-repo-analyzer.js.map +1 -1
- package/dist/src/core/living-docs/intelligent-analyzer/graph-visualizer.d.ts +23 -0
- package/dist/src/core/living-docs/intelligent-analyzer/graph-visualizer.d.ts.map +1 -0
- package/dist/src/core/living-docs/intelligent-analyzer/graph-visualizer.js +283 -0
- package/dist/src/core/living-docs/intelligent-analyzer/graph-visualizer.js.map +1 -0
- package/dist/src/core/living-docs/intelligent-analyzer/mermaid-generator.d.ts +44 -0
- package/dist/src/core/living-docs/intelligent-analyzer/mermaid-generator.d.ts.map +1 -0
- package/dist/src/core/living-docs/intelligent-analyzer/mermaid-generator.js +61 -0
- package/dist/src/core/living-docs/intelligent-analyzer/mermaid-generator.js.map +1 -0
- package/dist/src/core/living-docs/intelligent-analyzer/orchestrator.d.ts +126 -0
- package/dist/src/core/living-docs/intelligent-analyzer/orchestrator.d.ts.map +1 -0
- package/dist/src/core/living-docs/intelligent-analyzer/orchestrator.js +378 -0
- package/dist/src/core/living-docs/intelligent-analyzer/orchestrator.js.map +1 -0
- package/dist/src/core/living-docs/intelligent-analyzer/organization-synthesizer.d.ts.map +1 -1
- package/dist/src/core/living-docs/intelligent-analyzer/organization-synthesizer.js +57 -0
- package/dist/src/core/living-docs/intelligent-analyzer/organization-synthesizer.js.map +1 -1
- package/dist/src/core/living-docs/intelligent-analyzer/pattern-analyzer.d.ts +82 -0
- package/dist/src/core/living-docs/intelligent-analyzer/pattern-analyzer.d.ts.map +1 -0
- package/dist/src/core/living-docs/intelligent-analyzer/pattern-analyzer.js +430 -0
- package/dist/src/core/living-docs/intelligent-analyzer/pattern-analyzer.js.map +1 -0
- package/dist/src/core/living-docs/intelligent-analyzer/repo-scanner.d.ts +84 -0
- package/dist/src/core/living-docs/intelligent-analyzer/repo-scanner.d.ts.map +1 -0
- package/dist/src/core/living-docs/intelligent-analyzer/repo-scanner.js +387 -0
- package/dist/src/core/living-docs/intelligent-analyzer/repo-scanner.js.map +1 -0
- package/dist/src/core/living-docs/intelligent-analyzer/report-writer.d.ts +61 -0
- package/dist/src/core/living-docs/intelligent-analyzer/report-writer.d.ts.map +1 -0
- package/dist/src/core/living-docs/intelligent-analyzer/report-writer.js +174 -0
- package/dist/src/core/living-docs/intelligent-analyzer/report-writer.js.map +1 -0
- package/dist/src/core/living-docs/intelligent-analyzer/types.d.ts +1 -1
- package/dist/src/core/living-docs/intelligent-analyzer/types.d.ts.map +1 -1
- package/dist/src/core/living-docs/module-analyzer.d.ts +3 -0
- package/dist/src/core/living-docs/module-analyzer.d.ts.map +1 -1
- package/dist/src/core/living-docs/module-analyzer.js +40 -1
- package/dist/src/core/living-docs/module-analyzer.js.map +1 -1
- package/dist/src/core/qa/qa-runner.js +1 -1
- package/dist/src/core/qa/qa-runner.js.map +1 -1
- package/dist/src/core/scheduler/session-sync-executor.js +1 -1
- package/dist/src/core/scheduler/session-sync-executor.js.map +1 -1
- package/dist/src/core/status-line/status-line-updater.d.ts +1 -1
- package/dist/src/core/status-line/status-line-updater.d.ts.map +1 -1
- package/dist/src/core/status-line/status-line-updater.js +4 -3
- package/dist/src/core/status-line/status-line-updater.js.map +1 -1
- package/dist/src/importers/jira-importer.d.ts.map +1 -1
- package/dist/src/importers/jira-importer.js +18 -9
- package/dist/src/importers/jira-importer.js.map +1 -1
- package/dist/src/init/architecture/types.d.ts +140 -33
- package/dist/src/init/architecture/types.d.ts.map +1 -1
- package/dist/src/init/compliance/types.d.ts +27 -30
- package/dist/src/init/compliance/types.d.ts.map +1 -1
- package/dist/src/init/repo/types.d.ts +34 -11
- package/dist/src/init/repo/types.d.ts.map +1 -1
- package/dist/src/init/research/src/config/types.d.ts +82 -15
- package/dist/src/init/research/src/config/types.d.ts.map +1 -1
- package/dist/src/init/research/types.d.ts +93 -38
- package/dist/src/init/research/types.d.ts.map +1 -1
- package/dist/src/init/team/types.d.ts +42 -4
- package/dist/src/init/team/types.d.ts.map +1 -1
- package/dist/src/sync/ado-reconciler.js +1 -1
- package/dist/src/sync/ado-reconciler.js.map +1 -1
- package/dist/src/sync/github-reconciler.js +1 -1
- package/dist/src/sync/github-reconciler.js.map +1 -1
- package/dist/src/sync/jira-reconciler.js +1 -1
- package/dist/src/sync/jira-reconciler.js.map +1 -1
- package/dist/src/types/session.d.ts +65 -0
- package/dist/src/types/session.d.ts.map +1 -0
- package/dist/src/types/session.js +8 -0
- package/dist/src/types/session.js.map +1 -0
- package/dist/src/utils/lock-manager.d.ts +48 -0
- package/dist/src/utils/lock-manager.d.ts.map +1 -0
- package/dist/src/utils/lock-manager.js +195 -0
- package/dist/src/utils/lock-manager.js.map +1 -0
- package/dist/src/utils/notification-manager.d.ts +45 -0
- package/dist/src/utils/notification-manager.d.ts.map +1 -0
- package/dist/src/utils/notification-manager.js +130 -0
- package/dist/src/utils/notification-manager.js.map +1 -0
- package/dist/src/utils/platform-utils.d.ts +136 -0
- package/dist/src/utils/platform-utils.d.ts.map +1 -0
- package/dist/src/utils/platform-utils.js +366 -0
- package/dist/src/utils/platform-utils.js.map +1 -0
- package/dist/src/utils/session-registry.d.ts +142 -0
- package/dist/src/utils/session-registry.d.ts.map +1 -0
- package/dist/src/utils/session-registry.js +480 -0
- package/dist/src/utils/session-registry.js.map +1 -0
- package/package.json +5 -2
- package/plugins/specweave/commands/specweave-living-docs.md +42 -0
- package/plugins/specweave/hooks/hooks.json +10 -0
- package/plugins/specweave/hooks/lib/update-active-increment.sh +2 -2
- package/plugins/specweave/hooks/lib/update-status-line.sh +1 -1
- package/plugins/specweave/hooks/post-increment-status-change.sh +3 -3
- package/plugins/specweave/hooks/post-metadata-change.sh +1 -1
- package/plugins/specweave/hooks/universal/hook-wrapper.cmd +26 -26
- package/plugins/specweave/hooks/universal/session-start.cmd +16 -16
- package/plugins/specweave/hooks/universal/session-start.ps1 +16 -16
- package/plugins/specweave/hooks/user-prompt-submit.sh +2 -2
- package/plugins/specweave/hooks/v2/guards/increment-root-guard.sh +61 -0
- package/plugins/specweave/hooks/v2/session-end.sh +69 -0
- package/plugins/specweave/hooks/v2/session-start.sh +81 -0
- package/plugins/specweave/lib/vendor/sync/github-reconciler.js +1 -1
- package/plugins/specweave/lib/vendor/sync/github-reconciler.js.map +1 -1
- package/plugins/specweave/scripts/heartbeat.sh +110 -0
- package/plugins/specweave/scripts/progress.js +34 -4
- package/plugins/specweave/scripts/read-jobs.sh +1 -1
- package/plugins/specweave/scripts/read-progress.sh +50 -5
- package/plugins/specweave/scripts/read-workflow.sh +1 -1
- package/plugins/specweave/scripts/session-watchdog.sh +65 -0
- package/plugins/specweave/scripts/status.js +28 -11
- package/plugins/specweave-github/hooks/.specweave/logs/hooks-debug.log +738 -0
- package/plugins/specweave-release/hooks/.specweave/logs/dora-tracking.log +1107 -0
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Living Docs Orchestrator
|
|
3
|
+
*
|
|
4
|
+
* Main coordinator that manages the entire analysis pipeline with caching and change detection.
|
|
5
|
+
*
|
|
6
|
+
* Architecture:
|
|
7
|
+
* Phase 1: Discovery (repo scanning)
|
|
8
|
+
* Phase 2: Analysis (patterns, modules, tech debt)
|
|
9
|
+
* Phase 3: Synthesis (ADR generation with LLM)
|
|
10
|
+
*/
|
|
11
|
+
import { Logger } from '../../../utils/logger.js';
|
|
12
|
+
import type { RepoAnalysis, LLMProvider } from './types.js';
|
|
13
|
+
export interface OrchestratorOptions {
|
|
14
|
+
projectRoot: string;
|
|
15
|
+
logger?: Logger;
|
|
16
|
+
llmProvider?: LLMProvider;
|
|
17
|
+
}
|
|
18
|
+
export interface UpdateOptions {
|
|
19
|
+
incremental?: boolean;
|
|
20
|
+
full?: boolean;
|
|
21
|
+
adrOnly?: boolean;
|
|
22
|
+
techDebtOnly?: boolean;
|
|
23
|
+
modulesOnly?: boolean;
|
|
24
|
+
dryRun?: boolean;
|
|
25
|
+
}
|
|
26
|
+
export interface DiscoveryResult {
|
|
27
|
+
repos: Array<{
|
|
28
|
+
name: string;
|
|
29
|
+
path: string;
|
|
30
|
+
}>;
|
|
31
|
+
totalFiles: number;
|
|
32
|
+
duration: number;
|
|
33
|
+
}
|
|
34
|
+
export interface AnalysisResult {
|
|
35
|
+
repoAnalyses: Map<string, RepoAnalysis>;
|
|
36
|
+
duration: number;
|
|
37
|
+
filesCreated?: string[];
|
|
38
|
+
}
|
|
39
|
+
export interface SynthesisResult {
|
|
40
|
+
adrsGenerated: number;
|
|
41
|
+
teamsClustered: number;
|
|
42
|
+
duration: number;
|
|
43
|
+
filesCreated?: string[];
|
|
44
|
+
}
|
|
45
|
+
export interface PhaseResult {
|
|
46
|
+
success: boolean;
|
|
47
|
+
duration: number;
|
|
48
|
+
message: string;
|
|
49
|
+
}
|
|
50
|
+
export interface UpdateResult {
|
|
51
|
+
success: boolean;
|
|
52
|
+
duration: number;
|
|
53
|
+
phases: {
|
|
54
|
+
discovery: PhaseResult;
|
|
55
|
+
analysis: PhaseResult;
|
|
56
|
+
synthesis: PhaseResult;
|
|
57
|
+
};
|
|
58
|
+
filesCreated: string[];
|
|
59
|
+
filesUpdated: string[];
|
|
60
|
+
errors: string[];
|
|
61
|
+
}
|
|
62
|
+
export interface ChangedFiles {
|
|
63
|
+
path: string;
|
|
64
|
+
status: 'added' | 'modified' | 'deleted';
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Main orchestrator for living docs intelligent analysis.
|
|
68
|
+
*
|
|
69
|
+
* Coordinates all analysis phases with caching and Git-based change detection.
|
|
70
|
+
*/
|
|
71
|
+
export declare class LivingDocsOrchestrator {
|
|
72
|
+
private projectRoot;
|
|
73
|
+
private logger;
|
|
74
|
+
private llmProvider?;
|
|
75
|
+
private cacheDir;
|
|
76
|
+
constructor(options: OrchestratorOptions);
|
|
77
|
+
/**
|
|
78
|
+
* Main entry point - orchestrates full update or incremental update.
|
|
79
|
+
*/
|
|
80
|
+
update(options?: UpdateOptions): Promise<UpdateResult>;
|
|
81
|
+
/**
|
|
82
|
+
* Phase 1: Discovery
|
|
83
|
+
* Scans all repos (umbrella or single) and creates file inventory.
|
|
84
|
+
*/
|
|
85
|
+
private executePhase1Discovery;
|
|
86
|
+
/**
|
|
87
|
+
* Phase 2: Analysis
|
|
88
|
+
* Pattern detection, module graph, tech debt detection.
|
|
89
|
+
*/
|
|
90
|
+
private executePhase2Analysis;
|
|
91
|
+
/**
|
|
92
|
+
* Phase 3: Synthesis
|
|
93
|
+
* LLM-powered ADR synthesis, team clustering, architecture docs.
|
|
94
|
+
*/
|
|
95
|
+
private executePhase3Synthesis;
|
|
96
|
+
/**
|
|
97
|
+
* Detect changes since last update using Git diff.
|
|
98
|
+
*/
|
|
99
|
+
detectChanges(): Promise<ChangedFiles[]>;
|
|
100
|
+
/**
|
|
101
|
+
* Load data from cache.
|
|
102
|
+
*/
|
|
103
|
+
loadFromCache<T>(key: string): Promise<T | null>;
|
|
104
|
+
/**
|
|
105
|
+
* Save data to cache.
|
|
106
|
+
*/
|
|
107
|
+
saveToCache(key: string, data: any): Promise<void>;
|
|
108
|
+
/**
|
|
109
|
+
* Clear all cache and checkpoint data.
|
|
110
|
+
* Used when --full flag is set to force complete rebuild.
|
|
111
|
+
*/
|
|
112
|
+
clearCache(): Promise<void>;
|
|
113
|
+
/**
|
|
114
|
+
* Discover all repos (umbrella or single).
|
|
115
|
+
*/
|
|
116
|
+
private discoverRepos;
|
|
117
|
+
/**
|
|
118
|
+
* Get current Git commit hash.
|
|
119
|
+
*/
|
|
120
|
+
private getCurrentCommit;
|
|
121
|
+
/**
|
|
122
|
+
* Count files in a directory (excluding node_modules, .git, etc.).
|
|
123
|
+
*/
|
|
124
|
+
private countFiles;
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=orchestrator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../../../../src/core/living-docs/intelligent-analyzer/orchestrator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,378 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Living Docs Orchestrator
|
|
3
|
+
*
|
|
4
|
+
* Main coordinator that manages the entire analysis pipeline with caching and change detection.
|
|
5
|
+
*
|
|
6
|
+
* Architecture:
|
|
7
|
+
* Phase 1: Discovery (repo scanning)
|
|
8
|
+
* Phase 2: Analysis (patterns, modules, tech debt)
|
|
9
|
+
* Phase 3: Synthesis (ADR generation with LLM)
|
|
10
|
+
*/
|
|
11
|
+
import * as fs from 'fs';
|
|
12
|
+
import * as path from 'path';
|
|
13
|
+
import { execSync } from 'child_process';
|
|
14
|
+
import { consoleLogger } from '../../../utils/logger.js';
|
|
15
|
+
import { runIntelligentAnalysis } from './index.js';
|
|
16
|
+
/**
|
|
17
|
+
* Main orchestrator for living docs intelligent analysis.
|
|
18
|
+
*
|
|
19
|
+
* Coordinates all analysis phases with caching and Git-based change detection.
|
|
20
|
+
*/
|
|
21
|
+
export class LivingDocsOrchestrator {
|
|
22
|
+
constructor(options) {
|
|
23
|
+
this.projectRoot = options.projectRoot;
|
|
24
|
+
this.logger = options.logger ?? consoleLogger;
|
|
25
|
+
this.llmProvider = options.llmProvider;
|
|
26
|
+
this.cacheDir = path.join(this.projectRoot, '.specweave/cache/analysis');
|
|
27
|
+
// Ensure cache directory exists
|
|
28
|
+
fs.mkdirSync(this.cacheDir, { recursive: true });
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Main entry point - orchestrates full update or incremental update.
|
|
32
|
+
*/
|
|
33
|
+
async update(options = {}) {
|
|
34
|
+
const startTime = Date.now();
|
|
35
|
+
const result = {
|
|
36
|
+
success: false,
|
|
37
|
+
duration: 0,
|
|
38
|
+
phases: {
|
|
39
|
+
discovery: { success: false, duration: 0, message: '' },
|
|
40
|
+
analysis: { success: false, duration: 0, message: '' },
|
|
41
|
+
synthesis: { success: false, duration: 0, message: '' },
|
|
42
|
+
},
|
|
43
|
+
filesCreated: [],
|
|
44
|
+
filesUpdated: [],
|
|
45
|
+
errors: [],
|
|
46
|
+
};
|
|
47
|
+
try {
|
|
48
|
+
this.logger.info('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
|
|
49
|
+
this.logger.info('LIVING DOCS INTELLIGENT ANALYSIS');
|
|
50
|
+
this.logger.info(`Mode: ${options.full ? 'FULL' : 'INCREMENTAL'}`);
|
|
51
|
+
this.logger.info('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
|
|
52
|
+
this.logger.info('');
|
|
53
|
+
// Clear cache if full rebuild requested (AC-US6-04)
|
|
54
|
+
if (options.full) {
|
|
55
|
+
this.logger.info('🔄 FULL MODE - Clearing cache and checkpoints...');
|
|
56
|
+
await this.clearCache();
|
|
57
|
+
this.logger.info('');
|
|
58
|
+
}
|
|
59
|
+
// Dry run - show what would be updated
|
|
60
|
+
if (options.dryRun) {
|
|
61
|
+
this.logger.info('DRY RUN MODE - No changes will be made');
|
|
62
|
+
const changedFiles = await this.detectChanges();
|
|
63
|
+
this.logger.info(`Would analyze ${changedFiles.length} changed files`);
|
|
64
|
+
result.success = true;
|
|
65
|
+
result.duration = Date.now() - startTime;
|
|
66
|
+
return result;
|
|
67
|
+
}
|
|
68
|
+
// Phase 1: Discovery
|
|
69
|
+
const discoveryResult = await this.executePhase1Discovery();
|
|
70
|
+
result.phases.discovery = {
|
|
71
|
+
success: true,
|
|
72
|
+
duration: discoveryResult.duration,
|
|
73
|
+
message: `Discovered ${discoveryResult.repos.length} repos (${discoveryResult.totalFiles} files)`,
|
|
74
|
+
};
|
|
75
|
+
// Phase 2: Analysis (if not adrOnly/techDebtOnly)
|
|
76
|
+
if (!options.adrOnly && !options.techDebtOnly) {
|
|
77
|
+
const analysisResult = await this.executePhase2Analysis(discoveryResult.repos);
|
|
78
|
+
result.phases.analysis = {
|
|
79
|
+
success: true,
|
|
80
|
+
duration: analysisResult.duration,
|
|
81
|
+
message: `Analyzed ${analysisResult.repoAnalyses.size} repos`,
|
|
82
|
+
};
|
|
83
|
+
// Track files created during analysis
|
|
84
|
+
if (analysisResult.filesCreated) {
|
|
85
|
+
result.filesCreated.push(...analysisResult.filesCreated);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
// Phase 3: Synthesis (ADRs, teams, architecture)
|
|
89
|
+
const synthesisResult = await this.executePhase3Synthesis(discoveryResult.repos);
|
|
90
|
+
result.phases.synthesis = {
|
|
91
|
+
success: true,
|
|
92
|
+
duration: synthesisResult.duration,
|
|
93
|
+
message: `Generated ${synthesisResult.adrsGenerated} ADRs, ${synthesisResult.teamsClustered} teams`,
|
|
94
|
+
};
|
|
95
|
+
// Track files created during synthesis
|
|
96
|
+
if (synthesisResult.filesCreated) {
|
|
97
|
+
result.filesCreated.push(...synthesisResult.filesCreated);
|
|
98
|
+
}
|
|
99
|
+
result.success = true;
|
|
100
|
+
result.duration = Date.now() - startTime;
|
|
101
|
+
// Enhanced update logging (AC-US6-06)
|
|
102
|
+
this.logger.info('');
|
|
103
|
+
this.logger.info('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
|
|
104
|
+
this.logger.info(`✅ LIVING DOCS UPDATE COMPLETE`);
|
|
105
|
+
this.logger.info('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
|
|
106
|
+
this.logger.info('');
|
|
107
|
+
// Show what was updated
|
|
108
|
+
this.logger.info('📊 SUMMARY:');
|
|
109
|
+
this.logger.info('');
|
|
110
|
+
if (result.phases.discovery.success) {
|
|
111
|
+
this.logger.info(` Discovery: ${result.phases.discovery.message}`);
|
|
112
|
+
this.logger.info(` Duration: ${Math.round(result.phases.discovery.duration / 1000)}s`);
|
|
113
|
+
}
|
|
114
|
+
if (result.phases.analysis.success) {
|
|
115
|
+
this.logger.info(` Analysis: ${result.phases.analysis.message}`);
|
|
116
|
+
this.logger.info(` Duration: ${Math.round(result.phases.analysis.duration / 1000)}s`);
|
|
117
|
+
}
|
|
118
|
+
if (result.phases.synthesis.success) {
|
|
119
|
+
this.logger.info(` Synthesis: ${result.phases.synthesis.message}`);
|
|
120
|
+
this.logger.info(` Duration: ${Math.round(result.phases.synthesis.duration / 1000)}s`);
|
|
121
|
+
}
|
|
122
|
+
this.logger.info('');
|
|
123
|
+
if (result.filesCreated.length > 0) {
|
|
124
|
+
this.logger.info(` Files Created: ${result.filesCreated.length}`);
|
|
125
|
+
result.filesCreated.slice(0, 5).forEach(file => this.logger.info(` • ${file}`));
|
|
126
|
+
if (result.filesCreated.length > 5) {
|
|
127
|
+
this.logger.info(` ... and ${result.filesCreated.length - 5} more`);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
if (result.filesUpdated.length > 0) {
|
|
131
|
+
this.logger.info(` Files Updated: ${result.filesUpdated.length}`);
|
|
132
|
+
result.filesUpdated.slice(0, 5).forEach(file => this.logger.info(` • ${file}`));
|
|
133
|
+
if (result.filesUpdated.length > 5) {
|
|
134
|
+
this.logger.info(` ... and ${result.filesUpdated.length - 5} more`);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
this.logger.info('');
|
|
138
|
+
this.logger.info(` Total Duration: ${Math.round(result.duration / 1000)}s`);
|
|
139
|
+
this.logger.info(` Mode: ${options.full ? 'FULL (cache bypassed)' : 'INCREMENTAL (cache used)'}`);
|
|
140
|
+
this.logger.info('');
|
|
141
|
+
this.logger.info('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
|
|
142
|
+
// Save last update info to cache
|
|
143
|
+
await this.saveToCache('last-update.json', {
|
|
144
|
+
timestamp: new Date().toISOString(),
|
|
145
|
+
commit: this.getCurrentCommit(),
|
|
146
|
+
duration: result.duration,
|
|
147
|
+
mode: options.full ? 'full' : 'incremental',
|
|
148
|
+
filesCreated: result.filesCreated.length,
|
|
149
|
+
filesUpdated: result.filesUpdated.length,
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
catch (error) {
|
|
153
|
+
result.errors.push(error instanceof Error ? error.message : String(error));
|
|
154
|
+
this.logger.error(`Analysis failed: ${error}`);
|
|
155
|
+
}
|
|
156
|
+
return result;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Phase 1: Discovery
|
|
160
|
+
* Scans all repos (umbrella or single) and creates file inventory.
|
|
161
|
+
*/
|
|
162
|
+
async executePhase1Discovery() {
|
|
163
|
+
const startTime = Date.now();
|
|
164
|
+
this.logger.info('📂 Phase 1: Discovery');
|
|
165
|
+
this.logger.info('');
|
|
166
|
+
// Detect repos (umbrella or single)
|
|
167
|
+
const repos = await this.discoverRepos();
|
|
168
|
+
let totalFiles = 0;
|
|
169
|
+
for (const repo of repos) {
|
|
170
|
+
const fileCount = this.countFiles(repo.path);
|
|
171
|
+
totalFiles += fileCount;
|
|
172
|
+
this.logger.info(` ✓ ${repo.name} (${fileCount} files)`);
|
|
173
|
+
}
|
|
174
|
+
const duration = Date.now() - startTime;
|
|
175
|
+
this.logger.info('');
|
|
176
|
+
this.logger.info(`✅ Discovery complete (${Math.round(duration / 1000)}s)`);
|
|
177
|
+
this.logger.info('');
|
|
178
|
+
return { repos, totalFiles, duration };
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Phase 2: Analysis
|
|
182
|
+
* Pattern detection, module graph, tech debt detection.
|
|
183
|
+
*/
|
|
184
|
+
async executePhase2Analysis(repos) {
|
|
185
|
+
const startTime = Date.now();
|
|
186
|
+
this.logger.info('🔍 Phase 2: Analysis');
|
|
187
|
+
this.logger.info('');
|
|
188
|
+
// Use existing intelligent analysis (refactored in future tasks)
|
|
189
|
+
const analysisOptions = {
|
|
190
|
+
projectPath: this.projectRoot,
|
|
191
|
+
repos,
|
|
192
|
+
llmProvider: this.llmProvider,
|
|
193
|
+
onProgress: (phase, current, total, message) => {
|
|
194
|
+
this.logger.info(` [${phase}] ${current}/${total} - ${message}`);
|
|
195
|
+
},
|
|
196
|
+
log: (msg) => this.logger.info(` ${msg}`),
|
|
197
|
+
};
|
|
198
|
+
const { repoAnalyses, savedFiles } = await runIntelligentAnalysis(analysisOptions);
|
|
199
|
+
const duration = Date.now() - startTime;
|
|
200
|
+
this.logger.info('');
|
|
201
|
+
this.logger.info(`✅ Analysis complete (${Math.round(duration / 1000)}s)`);
|
|
202
|
+
this.logger.info('');
|
|
203
|
+
return { repoAnalyses, duration, filesCreated: savedFiles };
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Phase 3: Synthesis
|
|
207
|
+
* LLM-powered ADR synthesis, team clustering, architecture docs.
|
|
208
|
+
*/
|
|
209
|
+
async executePhase3Synthesis(repos) {
|
|
210
|
+
const startTime = Date.now();
|
|
211
|
+
this.logger.info('💎 Phase 3: Synthesis (LLM-powered)');
|
|
212
|
+
this.logger.info('');
|
|
213
|
+
// This will be expanded in future tasks (T-013 to T-016)
|
|
214
|
+
// For now, we leverage the existing intelligent analysis synthesis phases
|
|
215
|
+
const adrsGenerated = 0; // TODO: Count from architecture-generator.ts
|
|
216
|
+
const teamsClustered = 0; // TODO: Count from organization-synthesizer.ts
|
|
217
|
+
const duration = Date.now() - startTime;
|
|
218
|
+
this.logger.info('');
|
|
219
|
+
this.logger.info(`✅ Synthesis complete (${Math.round(duration / 1000)}s)`);
|
|
220
|
+
this.logger.info('');
|
|
221
|
+
return { adrsGenerated, teamsClustered, duration };
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Detect changes since last update using Git diff.
|
|
225
|
+
*/
|
|
226
|
+
async detectChanges() {
|
|
227
|
+
try {
|
|
228
|
+
const lastUpdate = await this.loadFromCache('last-update.json');
|
|
229
|
+
if (!lastUpdate || !lastUpdate.commit) {
|
|
230
|
+
// No previous update, consider all files changed
|
|
231
|
+
return [];
|
|
232
|
+
}
|
|
233
|
+
const currentCommit = this.getCurrentCommit();
|
|
234
|
+
if (lastUpdate.commit === currentCommit) {
|
|
235
|
+
// No changes since last update
|
|
236
|
+
return [];
|
|
237
|
+
}
|
|
238
|
+
// Run git diff to get changed files
|
|
239
|
+
const diffOutput = execSync(`git diff --name-status ${lastUpdate.commit} ${currentCommit}`, { cwd: this.projectRoot, encoding: 'utf-8' });
|
|
240
|
+
const changedFiles = [];
|
|
241
|
+
for (const line of diffOutput.split('\n')) {
|
|
242
|
+
if (!line.trim())
|
|
243
|
+
continue;
|
|
244
|
+
const [status, filePath] = line.split('\t');
|
|
245
|
+
if (!filePath)
|
|
246
|
+
continue;
|
|
247
|
+
changedFiles.push({
|
|
248
|
+
path: filePath,
|
|
249
|
+
status: status.startsWith('A') ? 'added' :
|
|
250
|
+
status.startsWith('M') ? 'modified' :
|
|
251
|
+
status.startsWith('D') ? 'deleted' : 'modified',
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
return changedFiles;
|
|
255
|
+
}
|
|
256
|
+
catch (error) {
|
|
257
|
+
this.logger.warn(`Git diff failed: ${error}`);
|
|
258
|
+
return [];
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Load data from cache.
|
|
263
|
+
*/
|
|
264
|
+
async loadFromCache(key) {
|
|
265
|
+
const cachePath = path.join(this.cacheDir, key);
|
|
266
|
+
if (!fs.existsSync(cachePath)) {
|
|
267
|
+
return null;
|
|
268
|
+
}
|
|
269
|
+
try {
|
|
270
|
+
const content = fs.readFileSync(cachePath, 'utf-8');
|
|
271
|
+
return JSON.parse(content);
|
|
272
|
+
}
|
|
273
|
+
catch (error) {
|
|
274
|
+
this.logger.warn(`Failed to load cache ${key}: ${error}`);
|
|
275
|
+
return null;
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Save data to cache.
|
|
280
|
+
*/
|
|
281
|
+
async saveToCache(key, data) {
|
|
282
|
+
const cachePath = path.join(this.cacheDir, key);
|
|
283
|
+
fs.writeFileSync(cachePath, JSON.stringify(data, null, 2));
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* Clear all cache and checkpoint data.
|
|
287
|
+
* Used when --full flag is set to force complete rebuild.
|
|
288
|
+
*/
|
|
289
|
+
async clearCache() {
|
|
290
|
+
try {
|
|
291
|
+
// Clear cache directory
|
|
292
|
+
if (fs.existsSync(this.cacheDir)) {
|
|
293
|
+
const files = fs.readdirSync(this.cacheDir);
|
|
294
|
+
for (const file of files) {
|
|
295
|
+
fs.unlinkSync(path.join(this.cacheDir, file));
|
|
296
|
+
}
|
|
297
|
+
this.logger.info(` ✓ Cleared ${files.length} cache files`);
|
|
298
|
+
}
|
|
299
|
+
// Clear intelligent analysis checkpoint
|
|
300
|
+
const checkpointPath = path.join(this.projectRoot, '.specweave/docs/internal/temp/intelligent-analysis-checkpoint.json');
|
|
301
|
+
if (fs.existsSync(checkpointPath)) {
|
|
302
|
+
fs.unlinkSync(checkpointPath);
|
|
303
|
+
this.logger.info(' ✓ Cleared intelligent analysis checkpoint');
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
catch (error) {
|
|
307
|
+
this.logger.warn(`Failed to clear cache: ${error}`);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* Discover all repos (umbrella or single).
|
|
312
|
+
*/
|
|
313
|
+
async discoverRepos() {
|
|
314
|
+
const configPath = path.join(this.projectRoot, '.specweave/config.json');
|
|
315
|
+
if (!fs.existsSync(configPath)) {
|
|
316
|
+
// Single repo mode
|
|
317
|
+
return [{ name: 'main', path: this.projectRoot }];
|
|
318
|
+
}
|
|
319
|
+
try {
|
|
320
|
+
const config = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
|
|
321
|
+
if (config.umbrella && config.umbrella.childRepos) {
|
|
322
|
+
// Multi-repo umbrella mode
|
|
323
|
+
return config.umbrella.childRepos.map((repo) => ({
|
|
324
|
+
name: repo.name,
|
|
325
|
+
path: path.join(this.projectRoot, repo.path),
|
|
326
|
+
}));
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
catch (error) {
|
|
330
|
+
this.logger.warn(`Failed to load config: ${error}`);
|
|
331
|
+
}
|
|
332
|
+
// Fallback to single repo
|
|
333
|
+
return [{ name: 'main', path: this.projectRoot }];
|
|
334
|
+
}
|
|
335
|
+
/**
|
|
336
|
+
* Get current Git commit hash.
|
|
337
|
+
*/
|
|
338
|
+
getCurrentCommit() {
|
|
339
|
+
try {
|
|
340
|
+
return execSync('git rev-parse HEAD', {
|
|
341
|
+
cwd: this.projectRoot,
|
|
342
|
+
encoding: 'utf-8',
|
|
343
|
+
}).trim();
|
|
344
|
+
}
|
|
345
|
+
catch {
|
|
346
|
+
return 'unknown';
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
/**
|
|
350
|
+
* Count files in a directory (excluding node_modules, .git, etc.).
|
|
351
|
+
*/
|
|
352
|
+
countFiles(dirPath) {
|
|
353
|
+
let count = 0;
|
|
354
|
+
const excludeDirs = ['node_modules', '.git', 'dist', 'build', '.specweave'];
|
|
355
|
+
const walk = (dir) => {
|
|
356
|
+
try {
|
|
357
|
+
const entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
358
|
+
for (const entry of entries) {
|
|
359
|
+
if (excludeDirs.includes(entry.name))
|
|
360
|
+
continue;
|
|
361
|
+
const fullPath = path.join(dir, entry.name);
|
|
362
|
+
if (entry.isDirectory()) {
|
|
363
|
+
walk(fullPath);
|
|
364
|
+
}
|
|
365
|
+
else {
|
|
366
|
+
count++;
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
catch {
|
|
371
|
+
// Ignore permission errors
|
|
372
|
+
}
|
|
373
|
+
};
|
|
374
|
+
walk(dirPath);
|
|
375
|
+
return count;
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
//# sourceMappingURL=orchestrator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../../../../src/core/living-docs/intelligent-analyzer/orchestrator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"organization-synthesizer.d.ts","sourceRoot":"","sources":["../../../../../src/core/living-docs/intelligent-analyzer/organization-synthesizer.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAOH,OAAO,KAAK,EAAE,YAAY,EAAE,mBAAmB,EAAE,YAAY,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAcjH,MAAM,WAAW,2BAA2B;IAC1C,KAAK,EAAE,mBAAmB,EAAE,CAAC;IAC7B,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,aAAa,EAAE,mBAAmB,EAAE,CAAC;IACrC,OAAO,EAAE,mBAAmB,EAAE,CAAC;IAC/B,YAAY,EAAE,mBAAmB,EAAE,CAAC;IACpC,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;CACvC;AAED,wBAAsB,sBAAsB,CAC1C,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,EACvC,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,WAAW,GAAG,IAAI,EAC/B,UAAU,EAAE,gBAAgB,EAC5B,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,GACzB,OAAO,CAAC,2BAA2B,CAAC,
|
|
1
|
+
{"version":3,"file":"organization-synthesizer.d.ts","sourceRoot":"","sources":["../../../../../src/core/living-docs/intelligent-analyzer/organization-synthesizer.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAOH,OAAO,KAAK,EAAE,YAAY,EAAE,mBAAmB,EAAE,YAAY,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAcjH,MAAM,WAAW,2BAA2B;IAC1C,KAAK,EAAE,mBAAmB,EAAE,CAAC;IAC7B,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,aAAa,EAAE,mBAAmB,EAAE,CAAC;IACrC,OAAO,EAAE,mBAAmB,EAAE,CAAC;IAC/B,YAAY,EAAE,mBAAmB,EAAE,CAAC;IACpC,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;CACvC;AAED,wBAAsB,sBAAsB,CAC1C,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,EACvC,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,WAAW,GAAG,IAAI,EAC/B,UAAU,EAAE,gBAAgB,EAC5B,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,GACzB,OAAO,CAAC,2BAA2B,CAAC,CAqGtC;AAufD,wBAAsB,yBAAyB,CAC7C,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,2BAA2B,EACnC,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,GACtC,OAAO,CAAC,MAAM,EAAE,CAAC,CAuEnB"}
|
|
@@ -32,6 +32,14 @@ export async function synthesizeOrganization(repoAnalyses, projectPath, llmProvi
|
|
|
32
32
|
// Build summaries for LLM
|
|
33
33
|
const repoSummaries = buildRepoSummaries(repoAnalyses);
|
|
34
34
|
log(` Built summaries for ${repoAnalyses.size} repos`);
|
|
35
|
+
// If we have external teams WITH LLM, enrich them first
|
|
36
|
+
if (llmProvider && externalTeams.length > 0) {
|
|
37
|
+
log(' Enriching external teams with LLM analysis...');
|
|
38
|
+
const enrichedExternalTeams = await enrichExternalTeamsWithLLM(externalEnhancedTeams, repoAnalyses, llmProvider, log);
|
|
39
|
+
// Update the external teams array with enriched versions
|
|
40
|
+
externalEnhancedTeams.splice(0, externalEnhancedTeams.length, ...enrichedExternalTeams);
|
|
41
|
+
log(` Enriched ${enrichedExternalTeams.length} external teams with AI-powered analysis`);
|
|
42
|
+
}
|
|
35
43
|
// If we have external teams and no LLM, use external teams directly
|
|
36
44
|
if (!llmProvider && externalTeams.length > 0) {
|
|
37
45
|
log(' No LLM provider, using external teams');
|
|
@@ -105,6 +113,55 @@ function createExternalTeamsOnlyResult(enhancedTeams) {
|
|
|
105
113
|
confidence: 'medium'
|
|
106
114
|
};
|
|
107
115
|
}
|
|
116
|
+
/**
|
|
117
|
+
* Enrich external teams (from ADO/JIRA) with LLM-powered analysis
|
|
118
|
+
* This provides rich responsibilities, domain expertise, and tech stack based on repo analysis
|
|
119
|
+
*/
|
|
120
|
+
async function enrichExternalTeamsWithLLM(externalTeams, repoAnalyses, llmProvider, log) {
|
|
121
|
+
const enrichedTeams = [];
|
|
122
|
+
// Build a comprehensive repo context for LLM
|
|
123
|
+
const repoContext = Array.from(repoAnalyses.entries())
|
|
124
|
+
.map(([name, analysis]) => {
|
|
125
|
+
const patterns = analysis.patternsUsed.map(p => p.pattern).join(', ');
|
|
126
|
+
const concepts = analysis.keyConcepts.join(', ');
|
|
127
|
+
return `- ${name}: ${analysis.purpose} | Patterns: ${patterns || 'none'} | Concepts: ${concepts || 'none'}`;
|
|
128
|
+
})
|
|
129
|
+
.join('\n');
|
|
130
|
+
for (const team of externalTeams) {
|
|
131
|
+
try {
|
|
132
|
+
const schema = {
|
|
133
|
+
responsibilities: '["responsibility1", "responsibility2", ...]',
|
|
134
|
+
domainExpertise: '["expertise1", "expertise2", ...]',
|
|
135
|
+
techStack: '["tech1", "tech2", ...]',
|
|
136
|
+
description: 'string (2-3 sentences about what this team does)',
|
|
137
|
+
integrationBoundaries: 'string (description of upstream/downstream dependencies)',
|
|
138
|
+
};
|
|
139
|
+
const prompt = buildJsonPrompt(`Team: ${team.name}\nOriginal description: ${team.description}\n\nAvailable repositories:\n${repoContext}\n\nAnalyze this team and provide:\n- responsibilities: 3-5 specific bullet points of what this team owns\n- domainExpertise: 3-5 technical competencies (e.g., "Azure Functions", "React development", "Medical device integration")\n- techStack: Primary technologies used (infer from repos)\n- description: Rich 2-3 sentence summary\n- integrationBoundaries: How this team integrates with others`, schema, `Provide detailed team analysis for ${team.name}`);
|
|
140
|
+
const result = await llmProvider.analyze(prompt);
|
|
141
|
+
if (result?.content) {
|
|
142
|
+
const extraction = extractJson(result.content, { requiredFields: [] });
|
|
143
|
+
if (extraction.success && extraction.data) {
|
|
144
|
+
enrichedTeams.push({
|
|
145
|
+
...team,
|
|
146
|
+
description: extraction.data.description || team.description,
|
|
147
|
+
responsibilities: extraction.data.responsibilities || team.responsibilities,
|
|
148
|
+
domainExpertise: extraction.data.domainExpertise || team.domainExpertise,
|
|
149
|
+
techStack: extraction.data.techStack || team.techStack,
|
|
150
|
+
integrationBoundaries: extraction.data.integrationBoundaries || team.integrationBoundaries,
|
|
151
|
+
});
|
|
152
|
+
log(` Enriched team: ${team.name}`);
|
|
153
|
+
continue;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
catch (err) {
|
|
158
|
+
log(` Failed to enrich team ${team.name}: ${err.message}`);
|
|
159
|
+
}
|
|
160
|
+
// Fallback: keep original if enrichment fails
|
|
161
|
+
enrichedTeams.push(team);
|
|
162
|
+
}
|
|
163
|
+
return enrichedTeams;
|
|
164
|
+
}
|
|
108
165
|
async function loadExternalSpecs(projectPath) {
|
|
109
166
|
const specsPath = path.join(projectPath, '.specweave/docs/internal/specs');
|
|
110
167
|
if (!fs.existsSync(specsPath))
|