specweave 0.28.68 → 0.29.0
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 +3 -2
- package/README.md +19 -2
- package/dist/src/cli/commands/discrepancies.d.ts +89 -0
- package/dist/src/cli/commands/discrepancies.d.ts.map +1 -0
- package/dist/src/cli/commands/discrepancies.js +385 -0
- package/dist/src/cli/commands/discrepancies.js.map +1 -0
- package/dist/src/cli/commands/notifications.d.ts +70 -0
- package/dist/src/cli/commands/notifications.d.ts.map +1 -0
- package/dist/src/cli/commands/notifications.js +236 -0
- package/dist/src/cli/commands/notifications.js.map +1 -0
- package/dist/src/cli/commands/sync-logs.d.ts +54 -0
- package/dist/src/cli/commands/sync-logs.d.ts.map +1 -0
- package/dist/src/cli/commands/sync-logs.js +240 -0
- package/dist/src/cli/commands/sync-logs.js.map +1 -0
- package/dist/src/cli/commands/sync-monitor.d.ts +42 -0
- package/dist/src/cli/commands/sync-monitor.d.ts.map +1 -0
- package/dist/src/cli/commands/sync-monitor.js +191 -0
- package/dist/src/cli/commands/sync-monitor.js.map +1 -0
- package/dist/src/cli/helpers/init/brownfield-analysis.d.ts +45 -0
- package/dist/src/cli/helpers/init/brownfield-analysis.d.ts.map +1 -0
- package/dist/src/cli/helpers/init/brownfield-analysis.js +431 -0
- package/dist/src/cli/helpers/init/brownfield-analysis.js.map +1 -0
- package/dist/src/cli/helpers/init/index.d.ts +1 -0
- package/dist/src/cli/helpers/init/index.d.ts.map +1 -1
- package/dist/src/cli/helpers/init/index.js +2 -0
- package/dist/src/cli/helpers/init/index.js.map +1 -1
- package/dist/src/cli/workers/brownfield-worker.d.ts +66 -0
- package/dist/src/cli/workers/brownfield-worker.d.ts.map +1 -0
- package/dist/src/cli/workers/brownfield-worker.js +417 -0
- package/dist/src/cli/workers/brownfield-worker.js.map +1 -0
- package/dist/src/core/background/brownfield-launcher.d.ts +86 -0
- package/dist/src/core/background/brownfield-launcher.d.ts.map +1 -0
- package/dist/src/core/background/brownfield-launcher.js +295 -0
- package/dist/src/core/background/brownfield-launcher.js.map +1 -0
- package/dist/src/core/background/index.d.ts +2 -0
- package/dist/src/core/background/index.d.ts.map +1 -1
- package/dist/src/core/background/index.js +2 -0
- package/dist/src/core/background/index.js.map +1 -1
- package/dist/src/core/background/types.d.ts +23 -2
- package/dist/src/core/background/types.d.ts.map +1 -1
- package/dist/src/core/config/index.d.ts +1 -0
- package/dist/src/core/config/index.d.ts.map +1 -1
- package/dist/src/core/config/index.js +1 -0
- package/dist/src/core/config/index.js.map +1 -1
- package/dist/src/core/config/types.d.ts +6 -0
- package/dist/src/core/config/types.d.ts.map +1 -1
- package/dist/src/core/config/types.js.map +1 -1
- package/dist/src/core/dashboard/dashboard-data.d.ts +156 -0
- package/dist/src/core/dashboard/dashboard-data.d.ts.map +1 -0
- package/dist/src/core/dashboard/dashboard-data.js +191 -0
- package/dist/src/core/dashboard/dashboard-data.js.map +1 -0
- package/dist/src/core/dashboard/index.d.ts +9 -0
- package/dist/src/core/dashboard/index.d.ts.map +1 -0
- package/dist/src/core/dashboard/index.js +9 -0
- package/dist/src/core/dashboard/index.js.map +1 -0
- package/dist/src/core/discrepancy/analyzers/api-route-analyzer.d.ts +77 -0
- package/dist/src/core/discrepancy/analyzers/api-route-analyzer.d.ts.map +1 -0
- package/dist/src/core/discrepancy/analyzers/api-route-analyzer.js +286 -0
- package/dist/src/core/discrepancy/analyzers/api-route-analyzer.js.map +1 -0
- package/dist/src/core/discrepancy/analyzers/index.d.ts +8 -0
- package/dist/src/core/discrepancy/analyzers/index.d.ts.map +1 -0
- package/dist/src/core/discrepancy/analyzers/index.js +8 -0
- package/dist/src/core/discrepancy/analyzers/index.js.map +1 -0
- package/dist/src/core/discrepancy/analyzers/typescript-analyzer.d.ts +96 -0
- package/dist/src/core/discrepancy/analyzers/typescript-analyzer.d.ts.map +1 -0
- package/dist/src/core/discrepancy/analyzers/typescript-analyzer.js +247 -0
- package/dist/src/core/discrepancy/analyzers/typescript-analyzer.js.map +1 -0
- package/dist/src/core/discrepancy/brownfield-manager.d.ts +88 -0
- package/dist/src/core/discrepancy/brownfield-manager.d.ts.map +1 -0
- package/dist/src/core/discrepancy/brownfield-manager.js +520 -0
- package/dist/src/core/discrepancy/brownfield-manager.js.map +1 -0
- package/dist/src/core/discrepancy/brownfield-types.d.ts +174 -0
- package/dist/src/core/discrepancy/brownfield-types.d.ts.map +1 -0
- package/dist/src/core/discrepancy/brownfield-types.js +11 -0
- package/dist/src/core/discrepancy/brownfield-types.js.map +1 -0
- package/dist/src/core/discrepancy/detector.d.ts +92 -0
- package/dist/src/core/discrepancy/detector.d.ts.map +1 -0
- package/dist/src/core/discrepancy/detector.js +346 -0
- package/dist/src/core/discrepancy/detector.js.map +1 -0
- package/dist/src/core/discrepancy/increment-generator.d.ts +51 -0
- package/dist/src/core/discrepancy/increment-generator.d.ts.map +1 -0
- package/dist/src/core/discrepancy/increment-generator.js +234 -0
- package/dist/src/core/discrepancy/increment-generator.js.map +1 -0
- package/dist/src/core/discrepancy/index.d.ts +18 -0
- package/dist/src/core/discrepancy/index.d.ts.map +1 -0
- package/dist/src/core/discrepancy/index.js +24 -0
- package/dist/src/core/discrepancy/index.js.map +1 -0
- package/dist/src/core/discrepancy/severity-classifier.d.ts +81 -0
- package/dist/src/core/discrepancy/severity-classifier.d.ts.map +1 -0
- package/dist/src/core/discrepancy/severity-classifier.js +289 -0
- package/dist/src/core/discrepancy/severity-classifier.js.map +1 -0
- package/dist/src/core/discrepancy/spec-parser.d.ts +74 -0
- package/dist/src/core/discrepancy/spec-parser.d.ts.map +1 -0
- package/dist/src/core/discrepancy/spec-parser.js +213 -0
- package/dist/src/core/discrepancy/spec-parser.js.map +1 -0
- package/dist/src/core/discrepancy/update-recommender.d.ts +77 -0
- package/dist/src/core/discrepancy/update-recommender.d.ts.map +1 -0
- package/dist/src/core/discrepancy/update-recommender.js +323 -0
- package/dist/src/core/discrepancy/update-recommender.js.map +1 -0
- package/dist/src/core/living-docs/living-docs-sync.d.ts +13 -16
- package/dist/src/core/living-docs/living-docs-sync.d.ts.map +1 -1
- package/dist/src/core/living-docs/living-docs-sync.js +31 -112
- package/dist/src/core/living-docs/living-docs-sync.js.map +1 -1
- package/dist/src/core/logs/index.d.ts +10 -0
- package/dist/src/core/logs/index.d.ts.map +1 -0
- package/dist/src/core/logs/index.js +10 -0
- package/dist/src/core/logs/index.js.map +1 -0
- package/dist/src/core/logs/log-aggregator.d.ts +130 -0
- package/dist/src/core/logs/log-aggregator.d.ts.map +1 -0
- package/dist/src/core/logs/log-aggregator.js +206 -0
- package/dist/src/core/logs/log-aggregator.js.map +1 -0
- package/dist/src/core/logs/log-exporter.d.ts +81 -0
- package/dist/src/core/logs/log-exporter.d.ts.map +1 -0
- package/dist/src/core/logs/log-exporter.js +141 -0
- package/dist/src/core/logs/log-exporter.js.map +1 -0
- package/dist/src/core/notifications/command-integration.d.ts +82 -0
- package/dist/src/core/notifications/command-integration.d.ts.map +1 -0
- package/dist/src/core/notifications/command-integration.js +80 -0
- package/dist/src/core/notifications/command-integration.js.map +1 -0
- package/dist/src/core/notifications/index.d.ts +12 -0
- package/dist/src/core/notifications/index.d.ts.map +1 -0
- package/dist/src/core/notifications/index.js +12 -0
- package/dist/src/core/notifications/index.js.map +1 -0
- package/dist/src/core/notifications/notification-display.d.ts +70 -0
- package/dist/src/core/notifications/notification-display.d.ts.map +1 -0
- package/dist/src/core/notifications/notification-display.js +177 -0
- package/dist/src/core/notifications/notification-display.js.map +1 -0
- package/dist/src/core/notifications/notification-manager.d.ts +126 -0
- package/dist/src/core/notifications/notification-manager.d.ts.map +1 -0
- package/dist/src/core/notifications/notification-manager.js +287 -0
- package/dist/src/core/notifications/notification-manager.js.map +1 -0
- package/dist/src/core/notifications/notification-types.d.ts +159 -0
- package/dist/src/core/notifications/notification-types.d.ts.map +1 -0
- package/dist/src/core/notifications/notification-types.js +93 -0
- package/dist/src/core/notifications/notification-types.js.map +1 -0
- package/dist/src/core/scheduler/index.d.ts +11 -0
- package/dist/src/core/scheduler/index.d.ts.map +1 -0
- package/dist/src/core/scheduler/index.js +11 -0
- package/dist/src/core/scheduler/index.js.map +1 -0
- package/dist/src/core/scheduler/job-scheduler.d.ts +179 -0
- package/dist/src/core/scheduler/job-scheduler.d.ts.map +1 -0
- package/dist/src/core/scheduler/job-scheduler.js +282 -0
- package/dist/src/core/scheduler/job-scheduler.js.map +1 -0
- package/dist/src/core/scheduler/schedule-persistence.d.ts +83 -0
- package/dist/src/core/scheduler/schedule-persistence.d.ts.map +1 -0
- package/dist/src/core/scheduler/schedule-persistence.js +180 -0
- package/dist/src/core/scheduler/schedule-persistence.js.map +1 -0
- package/dist/src/core/scheduler/scheduled-job.d.ts +188 -0
- package/dist/src/core/scheduler/scheduled-job.d.ts.map +1 -0
- package/dist/src/core/scheduler/scheduled-job.js +182 -0
- package/dist/src/core/scheduler/scheduled-job.js.map +1 -0
- package/dist/src/core/sync/permission-enforcer.d.ts +206 -0
- package/dist/src/core/sync/permission-enforcer.d.ts.map +1 -0
- package/dist/src/core/sync/permission-enforcer.js +268 -0
- package/dist/src/core/sync/permission-enforcer.js.map +1 -0
- package/dist/src/core/sync/sync-audit-logger.d.ts +217 -0
- package/dist/src/core/sync/sync-audit-logger.d.ts.map +1 -0
- package/dist/src/core/sync/sync-audit-logger.js +327 -0
- package/dist/src/core/sync/sync-audit-logger.js.map +1 -0
- package/dist/src/core/sync/sync-interceptor.d.ts +190 -0
- package/dist/src/core/sync/sync-interceptor.d.ts.map +1 -0
- package/dist/src/core/sync/sync-interceptor.js +224 -0
- package/dist/src/core/sync/sync-interceptor.js.map +1 -0
- package/dist/src/core/types/increment-metadata.d.ts +5 -2
- package/dist/src/core/types/increment-metadata.d.ts.map +1 -1
- package/dist/src/core/types/sync-config.d.ts +267 -0
- package/dist/src/core/types/sync-config.d.ts.map +1 -0
- package/dist/src/core/types/sync-config.js +304 -0
- package/dist/src/core/types/sync-config.js.map +1 -0
- package/dist/src/hooks/index.d.ts +11 -0
- package/dist/src/hooks/index.d.ts.map +1 -0
- package/dist/src/hooks/index.js +11 -0
- package/dist/src/hooks/index.js.map +1 -0
- package/dist/src/hooks/platform.d.ts +125 -0
- package/dist/src/hooks/platform.d.ts.map +1 -0
- package/dist/src/hooks/platform.js +325 -0
- package/dist/src/hooks/platform.js.map +1 -0
- package/dist/src/hooks/processor.d.ts +20 -0
- package/dist/src/hooks/processor.d.ts.map +1 -0
- package/dist/src/hooks/processor.js +317 -0
- package/dist/src/hooks/processor.js.map +1 -0
- package/dist/src/hooks/scheduler-startup.d.ts +19 -0
- package/dist/src/hooks/scheduler-startup.d.ts.map +1 -0
- package/dist/src/hooks/scheduler-startup.js +92 -0
- package/dist/src/hooks/scheduler-startup.js.map +1 -0
- package/dist/src/hooks/session-start.d.ts +16 -0
- package/dist/src/hooks/session-start.d.ts.map +1 -0
- package/dist/src/hooks/session-start.js +92 -0
- package/dist/src/hooks/session-start.js.map +1 -0
- package/dist/src/importers/duplicate-detector.d.ts +13 -2
- package/dist/src/importers/duplicate-detector.d.ts.map +1 -1
- package/dist/src/importers/duplicate-detector.js +21 -2
- package/dist/src/importers/duplicate-detector.js.map +1 -1
- package/dist/src/importers/item-converter.d.ts +41 -2
- package/dist/src/importers/item-converter.d.ts.map +1 -1
- package/dist/src/importers/item-converter.js +225 -38
- package/dist/src/importers/item-converter.js.map +1 -1
- package/dist/src/living-docs/fs-id-allocator.d.ts +7 -0
- package/dist/src/living-docs/fs-id-allocator.d.ts.map +1 -1
- package/dist/src/living-docs/fs-id-allocator.js +30 -4
- package/dist/src/living-docs/fs-id-allocator.js.map +1 -1
- package/dist/src/sync/ado-sync-wrapper.d.ts +137 -0
- package/dist/src/sync/ado-sync-wrapper.d.ts.map +1 -0
- package/dist/src/sync/ado-sync-wrapper.js +148 -0
- package/dist/src/sync/ado-sync-wrapper.js.map +1 -0
- package/dist/src/sync/github-sync-wrapper.d.ts +195 -0
- package/dist/src/sync/github-sync-wrapper.d.ts.map +1 -0
- package/dist/src/sync/github-sync-wrapper.js +220 -0
- package/dist/src/sync/github-sync-wrapper.js.map +1 -0
- package/dist/src/sync/jira-sync-wrapper.d.ts +155 -0
- package/dist/src/sync/jira-sync-wrapper.d.ts.map +1 -0
- package/dist/src/sync/jira-sync-wrapper.js +175 -0
- package/dist/src/sync/jira-sync-wrapper.js.map +1 -0
- package/dist/src/utils/feature-id-derivation.d.ts +58 -0
- package/dist/src/utils/feature-id-derivation.d.ts.map +1 -0
- package/dist/src/utils/feature-id-derivation.js +77 -0
- package/dist/src/utils/feature-id-derivation.js.map +1 -0
- package/package.json +1 -1
- package/plugins/specweave/commands/specweave-discrepancies.md +141 -0
- package/plugins/specweave/commands/specweave-discrepancy-to-increment.md +160 -0
- package/plugins/specweave/commands/specweave-jobs.md +45 -2
- package/plugins/specweave/commands/specweave-notifications.md +92 -0
- package/plugins/specweave/commands/specweave-sync-logs.md +131 -0
- package/plugins/specweave/commands/specweave-sync-monitor.md +57 -0
- package/plugins/specweave/hooks/hooks.json +3 -3
- package/plugins/specweave/hooks/lib/scheduler-startup.sh +72 -0
- package/plugins/specweave/hooks/universal/dispatcher.mjs +246 -0
- package/plugins/specweave/hooks/universal/session-start.cmd +16 -0
- package/plugins/specweave/hooks/universal/session-start.ps1 +16 -0
- package/plugins/specweave/hooks/v2/dispatchers/session-start.sh +14 -5
- package/plugins/specweave/lib/vendor/core/types/increment-metadata.d.ts +5 -2
- package/plugins/specweave/skills/discrepancy-viewer.md +154 -0
- package/plugins/specweave-github/hooks/.specweave/logs/hooks-debug.log +34 -0
- package/plugins/specweave-release/hooks/.specweave/logs/dora-tracking.log +51 -0
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Brownfield Discrepancy Types
|
|
3
|
+
*
|
|
4
|
+
* Types for brownfield documentation analysis and persistent discrepancy management.
|
|
5
|
+
* Different from detector.ts which handles real-time code-spec comparison.
|
|
6
|
+
* This module handles persistent storage of documentation gaps for brownfield projects.
|
|
7
|
+
*
|
|
8
|
+
* @module core/discrepancy/brownfield-types
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Type of brownfield discrepancy detected.
|
|
12
|
+
* These represent documentation gaps, not code-spec mismatches.
|
|
13
|
+
*/
|
|
14
|
+
export type BrownfieldDiscrepancyType = 'missing-docs' | 'stale-docs' | 'code-doc-mismatch' | 'knowledge-gap' | 'orphan-doc' | 'missing-adr';
|
|
15
|
+
/**
|
|
16
|
+
* Status of a brownfield discrepancy.
|
|
17
|
+
*/
|
|
18
|
+
export type BrownfieldDiscrepancyStatus = 'pending' | 'in-progress' | 'resolved' | 'ignored';
|
|
19
|
+
/**
|
|
20
|
+
* Priority level for discrepancies.
|
|
21
|
+
*/
|
|
22
|
+
export type BrownfieldDiscrepancyPriority = 'critical' | 'high' | 'medium' | 'low';
|
|
23
|
+
/**
|
|
24
|
+
* How the discrepancy was detected.
|
|
25
|
+
*/
|
|
26
|
+
export type BrownfieldDiscrepancySource = 'brownfield-analyzer' | 'drift-detector' | 'manual';
|
|
27
|
+
/**
|
|
28
|
+
* Type of resolution applied.
|
|
29
|
+
*/
|
|
30
|
+
export type BrownfieldResolutionType = 'doc-updated' | 'code-updated' | 'both-updated' | 'false-positive';
|
|
31
|
+
/**
|
|
32
|
+
* Evidence supporting a discrepancy detection.
|
|
33
|
+
*/
|
|
34
|
+
export interface BrownfieldDiscrepancyEvidence {
|
|
35
|
+
/** Relevant code snippet */
|
|
36
|
+
codeSnippet?: string;
|
|
37
|
+
/** Relevant documentation snippet */
|
|
38
|
+
docSnippet?: string;
|
|
39
|
+
/** Git history information */
|
|
40
|
+
gitHistory?: {
|
|
41
|
+
/** ISO date of last code change */
|
|
42
|
+
lastCodeChange: string;
|
|
43
|
+
/** ISO date of last doc change (if exists) */
|
|
44
|
+
lastDocChange?: string;
|
|
45
|
+
/** Authors who have contributed */
|
|
46
|
+
authors: string[];
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Resolution details for a resolved discrepancy.
|
|
51
|
+
*/
|
|
52
|
+
export interface BrownfieldDiscrepancyResolution {
|
|
53
|
+
/** Type of resolution */
|
|
54
|
+
type: BrownfieldResolutionType;
|
|
55
|
+
/** ISO date when resolved */
|
|
56
|
+
resolvedAt: string;
|
|
57
|
+
/** Who resolved it */
|
|
58
|
+
resolvedBy: string;
|
|
59
|
+
/** Optional notes about the resolution */
|
|
60
|
+
notes?: string;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Represents a brownfield discrepancy (documentation gap).
|
|
64
|
+
*/
|
|
65
|
+
export interface BrownfieldDiscrepancy {
|
|
66
|
+
/** Unique identifier: DISC-0001 format */
|
|
67
|
+
id: string;
|
|
68
|
+
/** Type of discrepancy */
|
|
69
|
+
type: BrownfieldDiscrepancyType;
|
|
70
|
+
/** Module name (e.g., "payment-service") */
|
|
71
|
+
module: string;
|
|
72
|
+
/** Code file location (e.g., "src/payment/processor.ts:42") */
|
|
73
|
+
codeLocation?: string;
|
|
74
|
+
/** Documentation file location (e.g., "docs/modules/payment.md") */
|
|
75
|
+
docLocation?: string;
|
|
76
|
+
/** Brief description */
|
|
77
|
+
summary: string;
|
|
78
|
+
/** Full explanation */
|
|
79
|
+
details: string;
|
|
80
|
+
/** Supporting evidence */
|
|
81
|
+
evidence: BrownfieldDiscrepancyEvidence;
|
|
82
|
+
/** Priority level */
|
|
83
|
+
priority: BrownfieldDiscrepancyPriority;
|
|
84
|
+
/** Confidence score 0-100 */
|
|
85
|
+
confidence: number;
|
|
86
|
+
/** Whether auto-detected or manually created */
|
|
87
|
+
autoDetected: boolean;
|
|
88
|
+
/** Current status */
|
|
89
|
+
status: BrownfieldDiscrepancyStatus;
|
|
90
|
+
/** Linked increment ID (if in-progress) */
|
|
91
|
+
incrementId?: string;
|
|
92
|
+
/** Resolution details (if resolved) */
|
|
93
|
+
resolution?: BrownfieldDiscrepancyResolution;
|
|
94
|
+
/** ISO date when detected */
|
|
95
|
+
detectedAt: string;
|
|
96
|
+
/** How it was detected */
|
|
97
|
+
detectedBy: BrownfieldDiscrepancySource;
|
|
98
|
+
/** ISO date of last check */
|
|
99
|
+
lastChecked: string;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Summary statistics for discrepancies.
|
|
103
|
+
*/
|
|
104
|
+
export interface BrownfieldDiscrepancyStats {
|
|
105
|
+
/** Total discrepancies across all statuses */
|
|
106
|
+
total: number;
|
|
107
|
+
/** Count by status */
|
|
108
|
+
pending: number;
|
|
109
|
+
inProgress: number;
|
|
110
|
+
resolved: number;
|
|
111
|
+
ignored: number;
|
|
112
|
+
/** Count by type */
|
|
113
|
+
byType: Record<BrownfieldDiscrepancyType, number>;
|
|
114
|
+
/** Count by priority */
|
|
115
|
+
byPriority: Record<BrownfieldDiscrepancyPriority, number>;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Index file for discrepancy folder.
|
|
119
|
+
*/
|
|
120
|
+
export interface BrownfieldDiscrepancyIndex {
|
|
121
|
+
/** Schema version */
|
|
122
|
+
version: '1.0.0';
|
|
123
|
+
/** Summary statistics */
|
|
124
|
+
stats: BrownfieldDiscrepancyStats;
|
|
125
|
+
/** ISO date of last update */
|
|
126
|
+
lastUpdated: string;
|
|
127
|
+
/** Last analysis job info */
|
|
128
|
+
lastAnalysis?: {
|
|
129
|
+
/** Job ID */
|
|
130
|
+
jobId: string;
|
|
131
|
+
/** ISO date of completion */
|
|
132
|
+
completedAt: string;
|
|
133
|
+
/** Duration in milliseconds */
|
|
134
|
+
duration: number;
|
|
135
|
+
/** Phases completed */
|
|
136
|
+
phasesCompleted: string[];
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Filter options for querying discrepancies.
|
|
141
|
+
*/
|
|
142
|
+
export interface BrownfieldDiscrepancyFilter {
|
|
143
|
+
/** Filter by module name */
|
|
144
|
+
module?: string;
|
|
145
|
+
/** Filter by type */
|
|
146
|
+
type?: BrownfieldDiscrepancyType;
|
|
147
|
+
/** Filter by types (multiple) */
|
|
148
|
+
types?: BrownfieldDiscrepancyType[];
|
|
149
|
+
/** Filter by status */
|
|
150
|
+
status?: BrownfieldDiscrepancyStatus;
|
|
151
|
+
/** Filter by statuses (multiple) */
|
|
152
|
+
statuses?: BrownfieldDiscrepancyStatus[];
|
|
153
|
+
/** Filter by priority */
|
|
154
|
+
priority?: BrownfieldDiscrepancyPriority;
|
|
155
|
+
/** Filter by priorities (multiple) */
|
|
156
|
+
priorities?: BrownfieldDiscrepancyPriority[];
|
|
157
|
+
/** Filter by minimum confidence */
|
|
158
|
+
minConfidence?: number;
|
|
159
|
+
/** Filter by linked increment */
|
|
160
|
+
incrementId?: string;
|
|
161
|
+
/** Limit results */
|
|
162
|
+
limit?: number;
|
|
163
|
+
/** Offset for pagination */
|
|
164
|
+
offset?: number;
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Data for creating a new discrepancy (id is auto-generated).
|
|
168
|
+
*/
|
|
169
|
+
export type BrownfieldDiscrepancyCreate = Omit<BrownfieldDiscrepancy, 'id'>;
|
|
170
|
+
/**
|
|
171
|
+
* Data for updating a discrepancy.
|
|
172
|
+
*/
|
|
173
|
+
export type BrownfieldDiscrepancyUpdate = Partial<Omit<BrownfieldDiscrepancy, 'id' | 'detectedAt' | 'detectedBy'>>;
|
|
174
|
+
//# sourceMappingURL=brownfield-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brownfield-types.d.ts","sourceRoot":"","sources":["../../../../src/core/discrepancy/brownfield-types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Brownfield Discrepancy Types
|
|
3
|
+
*
|
|
4
|
+
* Types for brownfield documentation analysis and persistent discrepancy management.
|
|
5
|
+
* Different from detector.ts which handles real-time code-spec comparison.
|
|
6
|
+
* This module handles persistent storage of documentation gaps for brownfield projects.
|
|
7
|
+
*
|
|
8
|
+
* @module core/discrepancy/brownfield-types
|
|
9
|
+
*/
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=brownfield-types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brownfield-types.js","sourceRoot":"","sources":["../../../../src/core/discrepancy/brownfield-types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Discrepancy Detector
|
|
3
|
+
*
|
|
4
|
+
* Compares extracted code signatures against parsed specs to identify discrepancies.
|
|
5
|
+
* Core principle: CODE is source of truth. When specs differ from code, specs need updating.
|
|
6
|
+
*
|
|
7
|
+
* @module core/discrepancy/detector
|
|
8
|
+
*/
|
|
9
|
+
import { Logger } from '../../utils/logger.js';
|
|
10
|
+
import { ParsedSpec } from './spec-parser.js';
|
|
11
|
+
import { FunctionSignature, TypeDefinition, ApiRoute } from './analyzers/index.js';
|
|
12
|
+
/**
|
|
13
|
+
* Type of discrepancy detected.
|
|
14
|
+
*/
|
|
15
|
+
export type DiscrepancyType = 'api-route' | 'function-signature' | 'type-definition';
|
|
16
|
+
/**
|
|
17
|
+
* Category of discrepancy (what changed).
|
|
18
|
+
*/
|
|
19
|
+
export type DiscrepancyCategory = 'added' | 'removed' | 'modified';
|
|
20
|
+
/**
|
|
21
|
+
* Severity of the discrepancy.
|
|
22
|
+
*/
|
|
23
|
+
export type DiscrepancySeverity = 'trivial' | 'minor' | 'major' | 'breaking';
|
|
24
|
+
/**
|
|
25
|
+
* Recommended action for the discrepancy.
|
|
26
|
+
*/
|
|
27
|
+
export type DiscrepancyRecommendation = 'auto-update' | 'review-required' | 'notify' | 'alert';
|
|
28
|
+
/**
|
|
29
|
+
* Represents a detected discrepancy between code and spec.
|
|
30
|
+
*/
|
|
31
|
+
export interface Discrepancy {
|
|
32
|
+
id: string;
|
|
33
|
+
type: DiscrepancyType;
|
|
34
|
+
category: DiscrepancyCategory;
|
|
35
|
+
severity: DiscrepancySeverity;
|
|
36
|
+
recommendation: DiscrepancyRecommendation;
|
|
37
|
+
specPath: string;
|
|
38
|
+
specLineNumber: number;
|
|
39
|
+
codePath: string;
|
|
40
|
+
codeLineNumber: number;
|
|
41
|
+
specValue: string;
|
|
42
|
+
codeValue: string;
|
|
43
|
+
description: string;
|
|
44
|
+
detectedAt: string;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Code signatures extracted from the codebase.
|
|
48
|
+
*/
|
|
49
|
+
export interface CodeSignatures {
|
|
50
|
+
functions: FunctionSignature[];
|
|
51
|
+
types: TypeDefinition[];
|
|
52
|
+
routes: ApiRoute[];
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Result of discrepancy detection.
|
|
56
|
+
*/
|
|
57
|
+
export interface DetectionResult {
|
|
58
|
+
discrepancies: Discrepancy[];
|
|
59
|
+
summary: {
|
|
60
|
+
total: number;
|
|
61
|
+
byCategory: Record<DiscrepancyCategory, number>;
|
|
62
|
+
bySeverity: Record<DiscrepancySeverity, number>;
|
|
63
|
+
byType: Record<DiscrepancyType, number>;
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Detects discrepancies between code and specifications.
|
|
68
|
+
*/
|
|
69
|
+
export declare class DiscrepancyDetector {
|
|
70
|
+
private readonly logger;
|
|
71
|
+
private discrepancyCounter;
|
|
72
|
+
constructor(options?: {
|
|
73
|
+
logger?: Logger;
|
|
74
|
+
});
|
|
75
|
+
/**
|
|
76
|
+
* Detect all discrepancies between specs and code.
|
|
77
|
+
*/
|
|
78
|
+
detect(specs: ParsedSpec[], code: CodeSignatures): DetectionResult;
|
|
79
|
+
private compareApiRoutes;
|
|
80
|
+
private compareFunctions;
|
|
81
|
+
private compareTypes;
|
|
82
|
+
private findSimilarRoute;
|
|
83
|
+
private findMovedRoute;
|
|
84
|
+
private normalizePath;
|
|
85
|
+
private compareSignatures;
|
|
86
|
+
private formatFunctionSignature;
|
|
87
|
+
private createDiscrepancy;
|
|
88
|
+
private classifySeverity;
|
|
89
|
+
private recommendAction;
|
|
90
|
+
private calculateSummary;
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detector.d.ts","sourceRoot":"","sources":["../../../../src/core/discrepancy/detector.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,MAAM,EAAiB,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAEnF;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG,WAAW,GAAG,oBAAoB,GAAG,iBAAiB,CAAC;AAErF;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG,OAAO,GAAG,SAAS,GAAG,UAAU,CAAC;AAEnE;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG,SAAS,GAAG,OAAO,GAAG,OAAO,GAAG,UAAU,CAAC;AAE7E;;GAEG;AACH,MAAM,MAAM,yBAAyB,GAAG,aAAa,GAAG,iBAAiB,GAAG,QAAQ,GAAG,OAAO,CAAC;AAE/F;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,eAAe,CAAC;IACtB,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,cAAc,EAAE,yBAAyB,CAAC;IAC1C,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,iBAAiB,EAAE,CAAC;IAC/B,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,MAAM,EAAE,QAAQ,EAAE,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,aAAa,EAAE,WAAW,EAAE,CAAC;IAC7B,OAAO,EAAE;QACP,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,EAAE,MAAM,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAC;QAChD,UAAU,EAAE,MAAM,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAC;QAChD,MAAM,EAAE,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;KACzC,CAAC;CACH;AAED;;GAEG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,kBAAkB,CAAK;gBAEnB,OAAO,GAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAO;IAI7C;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,cAAc,GAAG,eAAe;IAkClE,OAAO,CAAC,gBAAgB;IAgFxB,OAAO,CAAC,gBAAgB;IA0ExB,OAAO,CAAC,YAAY;IAuDpB,OAAO,CAAC,gBAAgB;IAgBxB,OAAO,CAAC,cAAc;IAetB,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,iBAAiB;IAqBzB,OAAO,CAAC,uBAAuB;IAK/B,OAAO,CAAC,iBAAiB;IAmCzB,OAAO,CAAC,gBAAgB;IAmBxB,OAAO,CAAC,eAAe;IAavB,OAAO,CAAC,gBAAgB;CAgBzB"}
|
|
@@ -0,0 +1,346 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Discrepancy Detector
|
|
3
|
+
*
|
|
4
|
+
* Compares extracted code signatures against parsed specs to identify discrepancies.
|
|
5
|
+
* Core principle: CODE is source of truth. When specs differ from code, specs need updating.
|
|
6
|
+
*
|
|
7
|
+
* @module core/discrepancy/detector
|
|
8
|
+
*/
|
|
9
|
+
import { consoleLogger } from '../../utils/logger.js';
|
|
10
|
+
/**
|
|
11
|
+
* Detects discrepancies between code and specifications.
|
|
12
|
+
*/
|
|
13
|
+
export class DiscrepancyDetector {
|
|
14
|
+
constructor(options = {}) {
|
|
15
|
+
this.discrepancyCounter = 0;
|
|
16
|
+
this.logger = options.logger ?? consoleLogger;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Detect all discrepancies between specs and code.
|
|
20
|
+
*/
|
|
21
|
+
detect(specs, code) {
|
|
22
|
+
const discrepancies = [];
|
|
23
|
+
const timestamp = new Date().toISOString();
|
|
24
|
+
// Compare API routes
|
|
25
|
+
const routeDiscrepancies = this.compareApiRoutes(specs.filter(s => s.type === 'api'), code.routes, timestamp);
|
|
26
|
+
discrepancies.push(...routeDiscrepancies);
|
|
27
|
+
// Compare functions
|
|
28
|
+
const funcDiscrepancies = this.compareFunctions(specs.filter(s => s.type === 'function'), code.functions, timestamp);
|
|
29
|
+
discrepancies.push(...funcDiscrepancies);
|
|
30
|
+
// Compare types
|
|
31
|
+
const typeDiscrepancies = this.compareTypes(specs.filter(s => s.type === 'type'), code.types, timestamp);
|
|
32
|
+
discrepancies.push(...typeDiscrepancies);
|
|
33
|
+
return {
|
|
34
|
+
discrepancies,
|
|
35
|
+
summary: this.calculateSummary(discrepancies),
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
compareApiRoutes(specs, routes, timestamp) {
|
|
39
|
+
const discrepancies = [];
|
|
40
|
+
// Create maps for comparison
|
|
41
|
+
const specMap = new Map();
|
|
42
|
+
for (const spec of specs) {
|
|
43
|
+
const key = `${spec.method?.toUpperCase() ?? 'GET'} ${spec.identifier}`;
|
|
44
|
+
specMap.set(key, spec);
|
|
45
|
+
}
|
|
46
|
+
const routeMap = new Map();
|
|
47
|
+
for (const route of routes) {
|
|
48
|
+
const key = `${route.method} ${route.path}`;
|
|
49
|
+
routeMap.set(key, route);
|
|
50
|
+
}
|
|
51
|
+
// Find routes in code but not in spec (added)
|
|
52
|
+
for (const [key, route] of Array.from(routeMap.entries())) {
|
|
53
|
+
if (!specMap.has(key)) {
|
|
54
|
+
// Check if there's a similar route (same method, different path)
|
|
55
|
+
const similarSpec = this.findSimilarRoute(route, specs);
|
|
56
|
+
if (similarSpec) {
|
|
57
|
+
// Modified route
|
|
58
|
+
discrepancies.push(this.createDiscrepancy({
|
|
59
|
+
type: 'api-route',
|
|
60
|
+
category: 'modified',
|
|
61
|
+
specPath: similarSpec.source,
|
|
62
|
+
specLineNumber: similarSpec.lineNumber,
|
|
63
|
+
codePath: route.filePath,
|
|
64
|
+
codeLineNumber: route.lineNumber,
|
|
65
|
+
specValue: `${similarSpec.method} ${similarSpec.identifier}`,
|
|
66
|
+
codeValue: key,
|
|
67
|
+
description: `Route path changed from ${similarSpec.identifier} to ${route.path}`,
|
|
68
|
+
timestamp,
|
|
69
|
+
}));
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
// New route in code
|
|
73
|
+
discrepancies.push(this.createDiscrepancy({
|
|
74
|
+
type: 'api-route',
|
|
75
|
+
category: 'added',
|
|
76
|
+
specPath: '',
|
|
77
|
+
specLineNumber: 0,
|
|
78
|
+
codePath: route.filePath,
|
|
79
|
+
codeLineNumber: route.lineNumber,
|
|
80
|
+
specValue: '',
|
|
81
|
+
codeValue: key,
|
|
82
|
+
description: `New API route ${key} found in code but not documented`,
|
|
83
|
+
timestamp,
|
|
84
|
+
}));
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
// Find routes in spec but not in code (removed)
|
|
89
|
+
for (const [key, spec] of Array.from(specMap.entries())) {
|
|
90
|
+
if (!routeMap.has(key)) {
|
|
91
|
+
// Check if route moved
|
|
92
|
+
const movedRoute = this.findMovedRoute(spec, routes);
|
|
93
|
+
if (!movedRoute) {
|
|
94
|
+
discrepancies.push(this.createDiscrepancy({
|
|
95
|
+
type: 'api-route',
|
|
96
|
+
category: 'removed',
|
|
97
|
+
specPath: spec.source,
|
|
98
|
+
specLineNumber: spec.lineNumber,
|
|
99
|
+
codePath: '',
|
|
100
|
+
codeLineNumber: 0,
|
|
101
|
+
specValue: key,
|
|
102
|
+
codeValue: '',
|
|
103
|
+
description: `API route ${key} documented but not found in code`,
|
|
104
|
+
timestamp,
|
|
105
|
+
}));
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return discrepancies;
|
|
110
|
+
}
|
|
111
|
+
compareFunctions(specs, functions, timestamp) {
|
|
112
|
+
const discrepancies = [];
|
|
113
|
+
// Create maps for comparison
|
|
114
|
+
const specMap = new Map();
|
|
115
|
+
for (const spec of specs) {
|
|
116
|
+
specMap.set(spec.identifier, spec);
|
|
117
|
+
}
|
|
118
|
+
const funcMap = new Map();
|
|
119
|
+
for (const func of functions) {
|
|
120
|
+
// Only compare exported functions
|
|
121
|
+
if (func.exported) {
|
|
122
|
+
funcMap.set(func.name, func);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
// Find functions in code but not in spec (added)
|
|
126
|
+
for (const [name, func] of Array.from(funcMap.entries())) {
|
|
127
|
+
if (!specMap.has(name)) {
|
|
128
|
+
discrepancies.push(this.createDiscrepancy({
|
|
129
|
+
type: 'function-signature',
|
|
130
|
+
category: 'added',
|
|
131
|
+
specPath: '',
|
|
132
|
+
specLineNumber: 0,
|
|
133
|
+
codePath: func.filePath,
|
|
134
|
+
codeLineNumber: func.lineNumber,
|
|
135
|
+
specValue: '',
|
|
136
|
+
codeValue: this.formatFunctionSignature(func),
|
|
137
|
+
description: `New exported function ${name} found in code but not documented`,
|
|
138
|
+
timestamp,
|
|
139
|
+
}));
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
// Find functions in spec but not in code (removed)
|
|
143
|
+
for (const [name, spec] of Array.from(specMap.entries())) {
|
|
144
|
+
if (!funcMap.has(name)) {
|
|
145
|
+
discrepancies.push(this.createDiscrepancy({
|
|
146
|
+
type: 'function-signature',
|
|
147
|
+
category: 'removed',
|
|
148
|
+
specPath: spec.source,
|
|
149
|
+
specLineNumber: spec.lineNumber,
|
|
150
|
+
codePath: '',
|
|
151
|
+
codeLineNumber: 0,
|
|
152
|
+
specValue: `${name}(${spec.params?.join(', ') ?? ''})`,
|
|
153
|
+
codeValue: '',
|
|
154
|
+
description: `Function ${name} documented but not found in code`,
|
|
155
|
+
timestamp,
|
|
156
|
+
}));
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
// Compare signatures
|
|
160
|
+
const func = funcMap.get(name);
|
|
161
|
+
const sigDiff = this.compareSignatures(spec, func);
|
|
162
|
+
if (sigDiff) {
|
|
163
|
+
discrepancies.push(this.createDiscrepancy({
|
|
164
|
+
type: 'function-signature',
|
|
165
|
+
category: 'modified',
|
|
166
|
+
specPath: spec.source,
|
|
167
|
+
specLineNumber: spec.lineNumber,
|
|
168
|
+
codePath: func.filePath,
|
|
169
|
+
codeLineNumber: func.lineNumber,
|
|
170
|
+
specValue: `${name}(${spec.params?.join(', ') ?? ''}): ${spec.returnType ?? 'unknown'}`,
|
|
171
|
+
codeValue: this.formatFunctionSignature(func),
|
|
172
|
+
description: sigDiff,
|
|
173
|
+
timestamp,
|
|
174
|
+
}));
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
return discrepancies;
|
|
179
|
+
}
|
|
180
|
+
compareTypes(specs, types, timestamp) {
|
|
181
|
+
const discrepancies = [];
|
|
182
|
+
// Create maps for comparison
|
|
183
|
+
const specMap = new Map();
|
|
184
|
+
for (const spec of specs) {
|
|
185
|
+
specMap.set(spec.identifier, spec);
|
|
186
|
+
}
|
|
187
|
+
const typeMap = new Map();
|
|
188
|
+
for (const type of types) {
|
|
189
|
+
if (type.exported) {
|
|
190
|
+
typeMap.set(type.name, type);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
// Find types in code but not in spec (added)
|
|
194
|
+
for (const [name, type] of Array.from(typeMap.entries())) {
|
|
195
|
+
if (!specMap.has(name)) {
|
|
196
|
+
discrepancies.push(this.createDiscrepancy({
|
|
197
|
+
type: 'type-definition',
|
|
198
|
+
category: 'added',
|
|
199
|
+
specPath: '',
|
|
200
|
+
specLineNumber: 0,
|
|
201
|
+
codePath: type.filePath,
|
|
202
|
+
codeLineNumber: type.lineNumber,
|
|
203
|
+
specValue: '',
|
|
204
|
+
codeValue: `${type.kind} ${name}`,
|
|
205
|
+
description: `New exported ${type.kind} ${name} found in code but not documented`,
|
|
206
|
+
timestamp,
|
|
207
|
+
}));
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
// Find types in spec but not in code (removed)
|
|
211
|
+
for (const [name, spec] of Array.from(specMap.entries())) {
|
|
212
|
+
if (!typeMap.has(name)) {
|
|
213
|
+
discrepancies.push(this.createDiscrepancy({
|
|
214
|
+
type: 'type-definition',
|
|
215
|
+
category: 'removed',
|
|
216
|
+
specPath: spec.source,
|
|
217
|
+
specLineNumber: spec.lineNumber,
|
|
218
|
+
codePath: '',
|
|
219
|
+
codeLineNumber: 0,
|
|
220
|
+
specValue: `${spec.metadata?.kind ?? 'type'} ${name}`,
|
|
221
|
+
codeValue: '',
|
|
222
|
+
description: `Type ${name} documented but not found in code`,
|
|
223
|
+
timestamp,
|
|
224
|
+
}));
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
return discrepancies;
|
|
228
|
+
}
|
|
229
|
+
findSimilarRoute(route, specs) {
|
|
230
|
+
// Look for same method with similar path (path parameters might differ)
|
|
231
|
+
for (const spec of specs) {
|
|
232
|
+
if (spec.method?.toUpperCase() === route.method) {
|
|
233
|
+
// Normalize paths for comparison
|
|
234
|
+
const specPath = this.normalizePath(spec.identifier);
|
|
235
|
+
const codePath = this.normalizePath(route.path);
|
|
236
|
+
if (specPath === codePath && spec.identifier !== route.path) {
|
|
237
|
+
return spec;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
return undefined;
|
|
242
|
+
}
|
|
243
|
+
findMovedRoute(spec, routes) {
|
|
244
|
+
// Check if the route exists with a different path
|
|
245
|
+
for (const route of routes) {
|
|
246
|
+
if (spec.method?.toUpperCase() === route.method) {
|
|
247
|
+
const specPath = this.normalizePath(spec.identifier);
|
|
248
|
+
const codePath = this.normalizePath(route.path);
|
|
249
|
+
if (specPath === codePath) {
|
|
250
|
+
return route;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
return undefined;
|
|
255
|
+
}
|
|
256
|
+
normalizePath(path) {
|
|
257
|
+
// Replace dynamic params with placeholder
|
|
258
|
+
return path
|
|
259
|
+
.replace(/:[^/]+/g, ':param')
|
|
260
|
+
.replace(/\{[^}]+\}/g, ':param')
|
|
261
|
+
.replace(/\/+$/, ''); // Remove trailing slashes
|
|
262
|
+
}
|
|
263
|
+
compareSignatures(spec, func) {
|
|
264
|
+
const issues = [];
|
|
265
|
+
// Compare param count
|
|
266
|
+
const specParamCount = spec.params?.length ?? 0;
|
|
267
|
+
const codeParamCount = func.params.length;
|
|
268
|
+
if (specParamCount !== codeParamCount) {
|
|
269
|
+
issues.push(`Parameter count: spec has ${specParamCount}, code has ${codeParamCount}`);
|
|
270
|
+
}
|
|
271
|
+
// Compare return type if specified
|
|
272
|
+
if (spec.returnType && func.returnType !== 'unknown') {
|
|
273
|
+
if (spec.returnType !== func.returnType) {
|
|
274
|
+
issues.push(`Return type: spec says ${spec.returnType}, code returns ${func.returnType}`);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
return issues.length > 0 ? issues.join('; ') : null;
|
|
278
|
+
}
|
|
279
|
+
formatFunctionSignature(func) {
|
|
280
|
+
const params = func.params.map(p => `${p.name}: ${p.type}`).join(', ');
|
|
281
|
+
return `${func.name}(${params}): ${func.returnType}`;
|
|
282
|
+
}
|
|
283
|
+
createDiscrepancy(data) {
|
|
284
|
+
this.discrepancyCounter++;
|
|
285
|
+
// Classify severity based on category
|
|
286
|
+
const severity = this.classifySeverity(data.category, data.type);
|
|
287
|
+
const recommendation = this.recommendAction(severity);
|
|
288
|
+
return {
|
|
289
|
+
id: `DISC-${this.discrepancyCounter.toString().padStart(4, '0')}`,
|
|
290
|
+
type: data.type,
|
|
291
|
+
category: data.category,
|
|
292
|
+
severity,
|
|
293
|
+
recommendation,
|
|
294
|
+
specPath: data.specPath,
|
|
295
|
+
specLineNumber: data.specLineNumber,
|
|
296
|
+
codePath: data.codePath,
|
|
297
|
+
codeLineNumber: data.codeLineNumber,
|
|
298
|
+
specValue: data.specValue,
|
|
299
|
+
codeValue: data.codeValue,
|
|
300
|
+
description: data.description,
|
|
301
|
+
detectedAt: data.timestamp,
|
|
302
|
+
};
|
|
303
|
+
}
|
|
304
|
+
classifySeverity(category, type) {
|
|
305
|
+
// Removed items are breaking (might break consumers)
|
|
306
|
+
if (category === 'removed') {
|
|
307
|
+
return 'breaking';
|
|
308
|
+
}
|
|
309
|
+
// Added items are major (new functionality)
|
|
310
|
+
if (category === 'added') {
|
|
311
|
+
return 'major';
|
|
312
|
+
}
|
|
313
|
+
// Modified items depend on what changed
|
|
314
|
+
if (category === 'modified') {
|
|
315
|
+
return 'minor';
|
|
316
|
+
}
|
|
317
|
+
return 'minor';
|
|
318
|
+
}
|
|
319
|
+
recommendAction(severity) {
|
|
320
|
+
switch (severity) {
|
|
321
|
+
case 'trivial':
|
|
322
|
+
return 'auto-update';
|
|
323
|
+
case 'minor':
|
|
324
|
+
return 'review-required';
|
|
325
|
+
case 'major':
|
|
326
|
+
return 'notify';
|
|
327
|
+
case 'breaking':
|
|
328
|
+
return 'alert';
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
calculateSummary(discrepancies) {
|
|
332
|
+
const summary = {
|
|
333
|
+
total: discrepancies.length,
|
|
334
|
+
byCategory: { added: 0, removed: 0, modified: 0 },
|
|
335
|
+
bySeverity: { trivial: 0, minor: 0, major: 0, breaking: 0 },
|
|
336
|
+
byType: { 'api-route': 0, 'function-signature': 0, 'type-definition': 0 },
|
|
337
|
+
};
|
|
338
|
+
for (const d of discrepancies) {
|
|
339
|
+
summary.byCategory[d.category]++;
|
|
340
|
+
summary.bySeverity[d.severity]++;
|
|
341
|
+
summary.byType[d.type]++;
|
|
342
|
+
}
|
|
343
|
+
return summary;
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
//# sourceMappingURL=detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detector.js","sourceRoot":"","sources":["../../../../src/core/discrepancy/detector.ts"],"names":[],"mappings":"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"}
|