specweave 0.28.67 → 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/helpers/issue-tracker/ado.d.ts.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/ado.js +14 -5
- package/dist/src/cli/helpers/issue-tracker/ado.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 +231 -45
- 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-ado/lib/ado-project-detector.js +11 -5
- package/plugins/specweave-ado/lib/ado-project-detector.ts +16 -5
- 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,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Brownfield Analysis Worker
|
|
3
|
+
*
|
|
4
|
+
* Performs brownfield documentation analysis in phases:
|
|
5
|
+
* 1. Discovery - Find all code/doc files
|
|
6
|
+
* 2. Code Analysis - Extract signatures, APIs
|
|
7
|
+
* 3. Doc Matching - Match code to docs
|
|
8
|
+
* 4. Discrepancy Detection - Find documentation gaps
|
|
9
|
+
* 5. Reporting - Generate summary
|
|
10
|
+
*
|
|
11
|
+
* Supports pause/resume via checkpoints.
|
|
12
|
+
*/
|
|
13
|
+
import { BrownfieldJobConfig } from '../../core/background/index.js';
|
|
14
|
+
import { Logger } from '../../utils/logger.js';
|
|
15
|
+
/**
|
|
16
|
+
* Brownfield Analysis Worker
|
|
17
|
+
*/
|
|
18
|
+
export declare class BrownfieldAnalysisWorker {
|
|
19
|
+
private readonly projectPath;
|
|
20
|
+
private readonly jobId;
|
|
21
|
+
private readonly config;
|
|
22
|
+
private readonly logger;
|
|
23
|
+
private readonly discrepancyManager;
|
|
24
|
+
private context;
|
|
25
|
+
constructor(projectPath: string, jobId: string, config: BrownfieldJobConfig, options?: {
|
|
26
|
+
logger?: Logger;
|
|
27
|
+
});
|
|
28
|
+
/**
|
|
29
|
+
* Run the brownfield analysis
|
|
30
|
+
*/
|
|
31
|
+
run(): Promise<number>;
|
|
32
|
+
/**
|
|
33
|
+
* Phase 1: Discovery - Find all code and documentation files
|
|
34
|
+
*/
|
|
35
|
+
private runDiscoveryPhase;
|
|
36
|
+
/**
|
|
37
|
+
* Phase 2: Code Analysis - Extract exports and signatures
|
|
38
|
+
*/
|
|
39
|
+
private runCodeAnalysisPhase;
|
|
40
|
+
/**
|
|
41
|
+
* Phase 3: Doc Matching - Match docs to code modules
|
|
42
|
+
*/
|
|
43
|
+
private runDocMatchingPhase;
|
|
44
|
+
/**
|
|
45
|
+
* Phase 4: Discrepancy Detection - Find documentation gaps
|
|
46
|
+
*/
|
|
47
|
+
private runDiscrepancyDetectionPhase;
|
|
48
|
+
/**
|
|
49
|
+
* Phase 5: Reporting - Generate summary
|
|
50
|
+
*/
|
|
51
|
+
private runReportingPhase;
|
|
52
|
+
private findFiles;
|
|
53
|
+
private walkDir;
|
|
54
|
+
private analyzeModule;
|
|
55
|
+
private extractExports;
|
|
56
|
+
private parseDocFile;
|
|
57
|
+
private calculatePriority;
|
|
58
|
+
private generateRecommendations;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Run brownfield analysis for a job
|
|
62
|
+
*/
|
|
63
|
+
export declare function runBrownfieldAnalysis(projectPath: string, jobId: string, config: BrownfieldJobConfig, options?: {
|
|
64
|
+
logger?: Logger;
|
|
65
|
+
}): Promise<number>;
|
|
66
|
+
//# sourceMappingURL=brownfield-worker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brownfield-worker.d.ts","sourceRoot":"","sources":["../../../../src/cli/workers/brownfield-worker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,EACL,mBAAmB,EAKpB,MAAM,gCAAgC,CAAC;AAMxC,OAAO,EAAE,MAAM,EAAiB,MAAM,uBAAuB,CAAC;AA8D9D;;GAEG;AACH,qBAAa,wBAAwB;IACnC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsB;IAC7C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAA+B;IAClE,OAAO,CAAC,OAAO,CAAkB;gBAG/B,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,mBAAmB,EAC3B,OAAO,GAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAO;IAoBnC;;OAEG;IACG,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;IAuD5B;;OAEG;YACW,iBAAiB;IAyB/B;;OAEG;YACW,oBAAoB;IAyBlC;;OAEG;YACW,mBAAmB;IAajC;;OAEG;YACW,4BAA4B;IAmE1C;;OAEG;YACW,iBAAiB;IAqC/B,OAAO,CAAC,SAAS;IAWjB,OAAO,CAAC,OAAO;IA6Cf,OAAO,CAAC,aAAa;IAgCrB,OAAO,CAAC,cAAc;IAyDtB,OAAO,CAAC,YAAY;IA4BpB,OAAO,CAAC,iBAAiB;IAYzB,OAAO,CAAC,uBAAuB;CAuBhC;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,mBAAmB,EAC3B,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,GAChC,OAAO,CAAC,MAAM,CAAC,CAGjB"}
|
|
@@ -0,0 +1,417 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Brownfield Analysis Worker
|
|
3
|
+
*
|
|
4
|
+
* Performs brownfield documentation analysis in phases:
|
|
5
|
+
* 1. Discovery - Find all code/doc files
|
|
6
|
+
* 2. Code Analysis - Extract signatures, APIs
|
|
7
|
+
* 3. Doc Matching - Match code to docs
|
|
8
|
+
* 4. Discrepancy Detection - Find documentation gaps
|
|
9
|
+
* 5. Reporting - Generate summary
|
|
10
|
+
*
|
|
11
|
+
* Supports pause/resume via checkpoints.
|
|
12
|
+
*/
|
|
13
|
+
import * as fs from 'node:fs';
|
|
14
|
+
import * as path from 'node:path';
|
|
15
|
+
import { updateBrownfieldProgress, completeBrownfieldJob, failBrownfieldJob, } from '../../core/background/index.js';
|
|
16
|
+
import { BrownfieldDiscrepancyManager, } from '../../core/discrepancy/index.js';
|
|
17
|
+
import { consoleLogger } from '../../utils/logger.js';
|
|
18
|
+
/**
|
|
19
|
+
* Brownfield Analysis Worker
|
|
20
|
+
*/
|
|
21
|
+
export class BrownfieldAnalysisWorker {
|
|
22
|
+
constructor(projectPath, jobId, config, options = {}) {
|
|
23
|
+
this.projectPath = projectPath;
|
|
24
|
+
this.jobId = jobId;
|
|
25
|
+
this.config = config;
|
|
26
|
+
this.logger = options.logger ?? consoleLogger;
|
|
27
|
+
this.discrepancyManager = new BrownfieldDiscrepancyManager(projectPath, {
|
|
28
|
+
logger: this.logger,
|
|
29
|
+
});
|
|
30
|
+
this.context = {
|
|
31
|
+
projectPath,
|
|
32
|
+
sourceDocsPath: config.sourceDocsPath,
|
|
33
|
+
depth: config.analysisDepth,
|
|
34
|
+
codeFiles: [],
|
|
35
|
+
docFiles: [],
|
|
36
|
+
modules: [],
|
|
37
|
+
docs: [],
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Run the brownfield analysis
|
|
42
|
+
*/
|
|
43
|
+
async run() {
|
|
44
|
+
const phases = [
|
|
45
|
+
'discovery',
|
|
46
|
+
'code-analysis',
|
|
47
|
+
'doc-matching',
|
|
48
|
+
'discrepancy-detect',
|
|
49
|
+
'reporting',
|
|
50
|
+
];
|
|
51
|
+
// Resume from checkpoint if exists
|
|
52
|
+
const startPhaseIndex = this.config.checkpoint
|
|
53
|
+
? phases.indexOf(this.config.checkpoint.phase)
|
|
54
|
+
: 0;
|
|
55
|
+
let discrepancyCount = 0;
|
|
56
|
+
try {
|
|
57
|
+
for (let i = startPhaseIndex; i < phases.length; i++) {
|
|
58
|
+
const phase = phases[i];
|
|
59
|
+
this.logger.log(`Starting phase: ${phase}`);
|
|
60
|
+
updateBrownfieldProgress(this.projectPath, this.jobId, phase, 0, 100);
|
|
61
|
+
switch (phase) {
|
|
62
|
+
case 'discovery':
|
|
63
|
+
await this.runDiscoveryPhase();
|
|
64
|
+
break;
|
|
65
|
+
case 'code-analysis':
|
|
66
|
+
await this.runCodeAnalysisPhase();
|
|
67
|
+
break;
|
|
68
|
+
case 'doc-matching':
|
|
69
|
+
await this.runDocMatchingPhase();
|
|
70
|
+
break;
|
|
71
|
+
case 'discrepancy-detect':
|
|
72
|
+
discrepancyCount = await this.runDiscrepancyDetectionPhase();
|
|
73
|
+
break;
|
|
74
|
+
case 'reporting':
|
|
75
|
+
await this.runReportingPhase(discrepancyCount);
|
|
76
|
+
break;
|
|
77
|
+
}
|
|
78
|
+
updateBrownfieldProgress(this.projectPath, this.jobId, phase, 100, 100);
|
|
79
|
+
this.logger.log(`Completed phase: ${phase}`);
|
|
80
|
+
}
|
|
81
|
+
completeBrownfieldJob(this.projectPath, this.jobId, discrepancyCount);
|
|
82
|
+
return discrepancyCount;
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
86
|
+
this.logger.error('Brownfield analysis failed:', error);
|
|
87
|
+
failBrownfieldJob(this.projectPath, this.jobId, errorMsg);
|
|
88
|
+
throw error;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Phase 1: Discovery - Find all code and documentation files
|
|
93
|
+
*/
|
|
94
|
+
async runDiscoveryPhase() {
|
|
95
|
+
this.logger.log('Discovering files...');
|
|
96
|
+
// Find code files
|
|
97
|
+
this.context.codeFiles = this.findFiles(this.projectPath, [
|
|
98
|
+
'.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs',
|
|
99
|
+
], ['code']);
|
|
100
|
+
// Find documentation files
|
|
101
|
+
const docPaths = this.context.sourceDocsPath
|
|
102
|
+
? [path.join(this.projectPath, this.context.sourceDocsPath)]
|
|
103
|
+
: [this.projectPath];
|
|
104
|
+
for (const docPath of docPaths) {
|
|
105
|
+
if (fs.existsSync(docPath)) {
|
|
106
|
+
this.context.docFiles.push(...this.findFiles(docPath, [
|
|
107
|
+
'.md', '.mdx', '.rst', '.txt',
|
|
108
|
+
], ['doc']));
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
this.logger.log(`Found ${this.context.codeFiles.length} code files`);
|
|
112
|
+
this.logger.log(`Found ${this.context.docFiles.length} doc files`);
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Phase 2: Code Analysis - Extract exports and signatures
|
|
116
|
+
*/
|
|
117
|
+
async runCodeAnalysisPhase() {
|
|
118
|
+
this.logger.log('Analyzing code...');
|
|
119
|
+
// Group files by directory to form modules
|
|
120
|
+
const moduleMap = new Map();
|
|
121
|
+
for (const file of this.context.codeFiles) {
|
|
122
|
+
const dir = path.dirname(file.relativePath);
|
|
123
|
+
if (!moduleMap.has(dir)) {
|
|
124
|
+
moduleMap.set(dir, []);
|
|
125
|
+
}
|
|
126
|
+
moduleMap.get(dir).push(file);
|
|
127
|
+
}
|
|
128
|
+
// Analyze each module
|
|
129
|
+
for (const [modulePath, files] of moduleMap.entries()) {
|
|
130
|
+
const module = this.analyzeModule(modulePath, files);
|
|
131
|
+
if (module) {
|
|
132
|
+
this.context.modules.push(module);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
this.logger.log(`Analyzed ${this.context.modules.length} modules`);
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Phase 3: Doc Matching - Match docs to code modules
|
|
139
|
+
*/
|
|
140
|
+
async runDocMatchingPhase() {
|
|
141
|
+
this.logger.log('Matching documentation...');
|
|
142
|
+
for (const docFile of this.context.docFiles) {
|
|
143
|
+
const docInfo = this.parseDocFile(docFile);
|
|
144
|
+
if (docInfo) {
|
|
145
|
+
this.context.docs.push(docInfo);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
this.logger.log(`Parsed ${this.context.docs.length} doc files`);
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Phase 4: Discrepancy Detection - Find documentation gaps
|
|
152
|
+
*/
|
|
153
|
+
async runDiscrepancyDetectionPhase() {
|
|
154
|
+
this.logger.log('Detecting discrepancies...');
|
|
155
|
+
await this.discrepancyManager.ensureFolderStructure();
|
|
156
|
+
const discrepancies = [];
|
|
157
|
+
// Detect undocumented exports
|
|
158
|
+
for (const module of this.context.modules) {
|
|
159
|
+
const undocumented = module.exports.filter(e => !e.hasDocComment);
|
|
160
|
+
if (undocumented.length > 0) {
|
|
161
|
+
discrepancies.push({
|
|
162
|
+
type: 'missing-docs',
|
|
163
|
+
module: module.name,
|
|
164
|
+
codeLocation: `${module.path}`,
|
|
165
|
+
summary: `${undocumented.length} undocumented exports in ${module.name}`,
|
|
166
|
+
details: `The following exports lack documentation:\n${undocumented.map(e => `- ${e.name} (${e.type})`).join('\n')}`,
|
|
167
|
+
evidence: {
|
|
168
|
+
codeSnippet: undocumented.slice(0, 5).map(e => e.signature || e.name).join('\n'),
|
|
169
|
+
},
|
|
170
|
+
priority: this.calculatePriority(undocumented.length, module.exports.length),
|
|
171
|
+
confidence: 90,
|
|
172
|
+
autoDetected: true,
|
|
173
|
+
status: 'pending',
|
|
174
|
+
detectedAt: new Date().toISOString(),
|
|
175
|
+
detectedBy: 'brownfield-analyzer',
|
|
176
|
+
lastChecked: new Date().toISOString(),
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
// Detect modules without any docs
|
|
181
|
+
const modulesWithoutDocs = this.context.modules.filter(m => {
|
|
182
|
+
const moduleName = m.name.toLowerCase();
|
|
183
|
+
return !this.context.docs.some(d => d.relativePath.toLowerCase().includes(moduleName) ||
|
|
184
|
+
d.topics.some(t => t.toLowerCase().includes(moduleName)));
|
|
185
|
+
});
|
|
186
|
+
for (const module of modulesWithoutDocs) {
|
|
187
|
+
discrepancies.push({
|
|
188
|
+
type: 'missing-docs',
|
|
189
|
+
module: module.name,
|
|
190
|
+
codeLocation: module.path,
|
|
191
|
+
summary: `No documentation found for module: ${module.name}`,
|
|
192
|
+
details: `Module ${module.name} has ${module.exports.length} exports but no matching documentation file.`,
|
|
193
|
+
evidence: {},
|
|
194
|
+
priority: 'medium',
|
|
195
|
+
confidence: 75,
|
|
196
|
+
autoDetected: true,
|
|
197
|
+
status: 'pending',
|
|
198
|
+
detectedAt: new Date().toISOString(),
|
|
199
|
+
detectedBy: 'brownfield-analyzer',
|
|
200
|
+
lastChecked: new Date().toISOString(),
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
// Create discrepancies in batch
|
|
204
|
+
if (discrepancies.length > 0) {
|
|
205
|
+
await this.discrepancyManager.createBatch(discrepancies);
|
|
206
|
+
}
|
|
207
|
+
this.logger.log(`Detected ${discrepancies.length} discrepancies`);
|
|
208
|
+
return discrepancies.length;
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Phase 5: Reporting - Generate summary
|
|
212
|
+
*/
|
|
213
|
+
async runReportingPhase(discrepancyCount) {
|
|
214
|
+
this.logger.log('Generating report...');
|
|
215
|
+
const stats = await this.discrepancyManager.getStats();
|
|
216
|
+
const report = {
|
|
217
|
+
generatedAt: new Date().toISOString(),
|
|
218
|
+
analysisDepth: this.context.depth,
|
|
219
|
+
codebase: {
|
|
220
|
+
codeFiles: this.context.codeFiles.length,
|
|
221
|
+
docFiles: this.context.docFiles.length,
|
|
222
|
+
modules: this.context.modules.length,
|
|
223
|
+
},
|
|
224
|
+
discrepancies: {
|
|
225
|
+
total: discrepancyCount,
|
|
226
|
+
byType: stats.byType,
|
|
227
|
+
byPriority: stats.byPriority,
|
|
228
|
+
},
|
|
229
|
+
recommendations: this.generateRecommendations(stats),
|
|
230
|
+
};
|
|
231
|
+
// Save report
|
|
232
|
+
const reportPath = path.join(this.projectPath, '.specweave', 'discrepancies', 'latest-report.json');
|
|
233
|
+
fs.writeFileSync(reportPath, JSON.stringify(report, null, 2));
|
|
234
|
+
this.logger.log(`Report saved to ${reportPath}`);
|
|
235
|
+
}
|
|
236
|
+
// ─────────────────────────────────────────────────────────────
|
|
237
|
+
// Helper methods
|
|
238
|
+
// ─────────────────────────────────────────────────────────────
|
|
239
|
+
findFiles(dir, extensions, types, maxDepth = 10) {
|
|
240
|
+
const files = [];
|
|
241
|
+
this.walkDir(dir, extensions, files, '', maxDepth, types[0]);
|
|
242
|
+
return files;
|
|
243
|
+
}
|
|
244
|
+
walkDir(dir, extensions, files, relativePath, depth, type) {
|
|
245
|
+
if (depth <= 0)
|
|
246
|
+
return;
|
|
247
|
+
if (!fs.existsSync(dir))
|
|
248
|
+
return;
|
|
249
|
+
// Skip common non-code directories
|
|
250
|
+
const skipDirs = ['node_modules', '.git', '.specweave', 'dist', 'build', 'coverage'];
|
|
251
|
+
const dirName = path.basename(dir);
|
|
252
|
+
if (skipDirs.includes(dirName))
|
|
253
|
+
return;
|
|
254
|
+
try {
|
|
255
|
+
const entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
256
|
+
for (const entry of entries) {
|
|
257
|
+
const fullPath = path.join(dir, entry.name);
|
|
258
|
+
const relPath = path.join(relativePath, entry.name);
|
|
259
|
+
if (entry.isDirectory()) {
|
|
260
|
+
this.walkDir(fullPath, extensions, files, relPath, depth - 1, type);
|
|
261
|
+
}
|
|
262
|
+
else if (entry.isFile()) {
|
|
263
|
+
const ext = path.extname(entry.name).toLowerCase();
|
|
264
|
+
if (extensions.includes(ext)) {
|
|
265
|
+
const stats = fs.statSync(fullPath);
|
|
266
|
+
files.push({
|
|
267
|
+
path: fullPath,
|
|
268
|
+
relativePath: relPath,
|
|
269
|
+
type,
|
|
270
|
+
extension: ext,
|
|
271
|
+
size: stats.size,
|
|
272
|
+
lastModified: stats.mtime,
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
catch {
|
|
279
|
+
// Ignore permission errors
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
analyzeModule(modulePath, files) {
|
|
283
|
+
const exports = [];
|
|
284
|
+
let lastModified = new Date(0);
|
|
285
|
+
for (const file of files) {
|
|
286
|
+
if (file.lastModified > lastModified) {
|
|
287
|
+
lastModified = file.lastModified;
|
|
288
|
+
}
|
|
289
|
+
// Quick analysis: look for export statements
|
|
290
|
+
try {
|
|
291
|
+
const content = fs.readFileSync(file.path, 'utf-8');
|
|
292
|
+
const fileExports = this.extractExports(content, file);
|
|
293
|
+
exports.push(...fileExports);
|
|
294
|
+
}
|
|
295
|
+
catch {
|
|
296
|
+
// Skip files that can't be read
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
if (exports.length === 0 && this.context.depth === 'quick') {
|
|
300
|
+
return null;
|
|
301
|
+
}
|
|
302
|
+
return {
|
|
303
|
+
name: modulePath || 'root',
|
|
304
|
+
path: modulePath,
|
|
305
|
+
exports,
|
|
306
|
+
hasTests: files.some(f => f.relativePath.includes('.test.') || f.relativePath.includes('.spec.')),
|
|
307
|
+
lastModified,
|
|
308
|
+
};
|
|
309
|
+
}
|
|
310
|
+
extractExports(content, file) {
|
|
311
|
+
const exports = [];
|
|
312
|
+
const lines = content.split('\n');
|
|
313
|
+
// Simple regex patterns for exports
|
|
314
|
+
const exportPatterns = [
|
|
315
|
+
{ regex: /export\s+(?:async\s+)?function\s+(\w+)/g, type: 'function' },
|
|
316
|
+
{ regex: /export\s+class\s+(\w+)/g, type: 'class' },
|
|
317
|
+
{ regex: /export\s+(?:type|interface)\s+(\w+)/g, type: 'type' },
|
|
318
|
+
{ regex: /export\s+const\s+(\w+)/g, type: 'const' },
|
|
319
|
+
{ regex: /export\s+\{\s*([^}]+)\s*\}/g, type: 'variable' },
|
|
320
|
+
];
|
|
321
|
+
for (let i = 0; i < lines.length; i++) {
|
|
322
|
+
const line = lines[i];
|
|
323
|
+
for (const pattern of exportPatterns) {
|
|
324
|
+
const matches = line.matchAll(pattern.regex);
|
|
325
|
+
for (const match of matches) {
|
|
326
|
+
const name = match[1].trim();
|
|
327
|
+
// Check if previous line has doc comment
|
|
328
|
+
const hasDocComment = i > 0 && (lines[i - 1].trim().startsWith('*/') ||
|
|
329
|
+
lines[i - 1].trim().startsWith('* ') ||
|
|
330
|
+
lines[i - 1].trim().startsWith('//'));
|
|
331
|
+
if (pattern.type === 'variable') {
|
|
332
|
+
// Handle export { a, b, c }
|
|
333
|
+
const names = name.split(',').map(n => n.trim().split(' ')[0]);
|
|
334
|
+
for (const n of names) {
|
|
335
|
+
if (n && !n.includes('type')) {
|
|
336
|
+
exports.push({
|
|
337
|
+
name: n,
|
|
338
|
+
type: 'variable',
|
|
339
|
+
line: i + 1,
|
|
340
|
+
hasDocComment: false, // Can't easily detect for re-exports
|
|
341
|
+
});
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
else {
|
|
346
|
+
exports.push({
|
|
347
|
+
name,
|
|
348
|
+
type: pattern.type,
|
|
349
|
+
line: i + 1,
|
|
350
|
+
hasDocComment,
|
|
351
|
+
signature: line.trim().slice(0, 100),
|
|
352
|
+
});
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
return exports;
|
|
358
|
+
}
|
|
359
|
+
parseDocFile(file) {
|
|
360
|
+
try {
|
|
361
|
+
const content = fs.readFileSync(file.path, 'utf-8');
|
|
362
|
+
// Extract title (first heading)
|
|
363
|
+
const titleMatch = content.match(/^#\s+(.+)$/m);
|
|
364
|
+
const title = titleMatch?.[1];
|
|
365
|
+
// Extract topics (other headings)
|
|
366
|
+
const headingMatches = content.matchAll(/^#{2,}\s+(.+)$/gm);
|
|
367
|
+
const topics = Array.from(headingMatches).map(m => m[1]);
|
|
368
|
+
// Word count
|
|
369
|
+
const wordCount = content.split(/\s+/).length;
|
|
370
|
+
return {
|
|
371
|
+
path: file.path,
|
|
372
|
+
relativePath: file.relativePath,
|
|
373
|
+
title,
|
|
374
|
+
topics,
|
|
375
|
+
lastModified: file.lastModified,
|
|
376
|
+
wordCount,
|
|
377
|
+
};
|
|
378
|
+
}
|
|
379
|
+
catch {
|
|
380
|
+
return null;
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
calculatePriority(undocumentedCount, totalCount) {
|
|
384
|
+
const ratio = undocumentedCount / totalCount;
|
|
385
|
+
if (ratio > 0.8 && undocumentedCount > 5)
|
|
386
|
+
return 'critical';
|
|
387
|
+
if (ratio > 0.5 && undocumentedCount > 3)
|
|
388
|
+
return 'high';
|
|
389
|
+
if (ratio > 0.3)
|
|
390
|
+
return 'medium';
|
|
391
|
+
return 'low';
|
|
392
|
+
}
|
|
393
|
+
generateRecommendations(stats) {
|
|
394
|
+
const recommendations = [];
|
|
395
|
+
if (stats.byType['missing-docs'] > 10) {
|
|
396
|
+
recommendations.push('Consider creating a documentation sprint to address missing docs');
|
|
397
|
+
}
|
|
398
|
+
if (stats.byType['stale-docs'] > 5) {
|
|
399
|
+
recommendations.push('Review and update stale documentation');
|
|
400
|
+
}
|
|
401
|
+
if (stats.byPriority.critical > 0) {
|
|
402
|
+
recommendations.push('Address critical discrepancies first - they may impact onboarding');
|
|
403
|
+
}
|
|
404
|
+
if (stats.total > 50) {
|
|
405
|
+
recommendations.push('Consider using /specweave:discrepancy-to-increment to batch discrepancies');
|
|
406
|
+
}
|
|
407
|
+
return recommendations;
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
/**
|
|
411
|
+
* Run brownfield analysis for a job
|
|
412
|
+
*/
|
|
413
|
+
export async function runBrownfieldAnalysis(projectPath, jobId, config, options = {}) {
|
|
414
|
+
const worker = new BrownfieldAnalysisWorker(projectPath, jobId, config, options);
|
|
415
|
+
return worker.run();
|
|
416
|
+
}
|
|
417
|
+
//# sourceMappingURL=brownfield-worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brownfield-worker.js","sourceRoot":"","sources":["../../../../src/cli/workers/brownfield-worker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Brownfield Analysis Job Launcher
|
|
3
|
+
*
|
|
4
|
+
* Launches brownfield documentation analysis as a background job.
|
|
5
|
+
* Supports long-running analysis of large codebases (1000+ files).
|
|
6
|
+
*/
|
|
7
|
+
import { BackgroundJob, BrownfieldPhase } from './types.js';
|
|
8
|
+
import { Logger } from '../../utils/logger.js';
|
|
9
|
+
/**
|
|
10
|
+
* Options for launching brownfield analysis
|
|
11
|
+
*/
|
|
12
|
+
export interface BrownfieldLaunchOptions {
|
|
13
|
+
projectPath: string;
|
|
14
|
+
sourceDocsPath?: string;
|
|
15
|
+
analysisDepth: 'quick' | 'standard' | 'deep';
|
|
16
|
+
logger?: Logger;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Result of launching a brownfield job
|
|
20
|
+
*/
|
|
21
|
+
export interface BrownfieldLaunchResult {
|
|
22
|
+
success: boolean;
|
|
23
|
+
jobId: string;
|
|
24
|
+
message: string;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Load job state from filesystem
|
|
28
|
+
*/
|
|
29
|
+
export declare function loadJobState(projectPath: string, jobId: string): BackgroundJob | null;
|
|
30
|
+
/**
|
|
31
|
+
* List all brownfield jobs for a project
|
|
32
|
+
*/
|
|
33
|
+
export declare function listBrownfieldJobs(projectPath: string): BackgroundJob[];
|
|
34
|
+
/**
|
|
35
|
+
* Get the most recent active brownfield job
|
|
36
|
+
*/
|
|
37
|
+
export declare function getActiveBrownfieldJob(projectPath: string): BackgroundJob | null;
|
|
38
|
+
/**
|
|
39
|
+
* Update job progress
|
|
40
|
+
*/
|
|
41
|
+
export declare function updateJobProgress(projectPath: string, jobId: string, phase: BrownfieldPhase, current: number, total: number, currentItem?: string): void;
|
|
42
|
+
/**
|
|
43
|
+
* Brownfield completion statistics
|
|
44
|
+
*/
|
|
45
|
+
export interface BrownfieldCompletionStats {
|
|
46
|
+
discrepancyCount: number;
|
|
47
|
+
filesAnalyzed: number;
|
|
48
|
+
modulesDetected: number;
|
|
49
|
+
byType: Record<string, number>;
|
|
50
|
+
byPriority: Record<string, number>;
|
|
51
|
+
durationMs: number;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Mark job as completed with full statistics
|
|
55
|
+
*/
|
|
56
|
+
export declare function completeJob(projectPath: string, jobId: string, discrepancyCount: number, stats?: BrownfieldCompletionStats): void;
|
|
57
|
+
/**
|
|
58
|
+
* Format completion notification for display
|
|
59
|
+
*/
|
|
60
|
+
export declare function formatCompletionNotification(jobId: string, stats: BrownfieldCompletionStats): string;
|
|
61
|
+
/**
|
|
62
|
+
* Mark job as failed
|
|
63
|
+
*/
|
|
64
|
+
export declare function failJob(projectPath: string, jobId: string, error: string): void;
|
|
65
|
+
/**
|
|
66
|
+
* Pause a running job
|
|
67
|
+
*/
|
|
68
|
+
export declare function pauseJob(projectPath: string, jobId: string): boolean;
|
|
69
|
+
/**
|
|
70
|
+
* Launch brownfield analysis as a background job
|
|
71
|
+
*
|
|
72
|
+
* Note: In the current implementation, this creates the job state
|
|
73
|
+
* but the actual analysis is performed by the brownfield-worker
|
|
74
|
+
* which is invoked separately. For now, this sets up the job
|
|
75
|
+
* for future integration with a proper background process system.
|
|
76
|
+
*/
|
|
77
|
+
export declare function launchBrownfieldAnalysisJob(options: BrownfieldLaunchOptions): Promise<BrownfieldLaunchResult>;
|
|
78
|
+
/**
|
|
79
|
+
* Resume a paused job
|
|
80
|
+
*/
|
|
81
|
+
export declare function resumeJob(projectPath: string, jobId: string): boolean;
|
|
82
|
+
/**
|
|
83
|
+
* Delete a job and its state
|
|
84
|
+
*/
|
|
85
|
+
export declare function deleteJob(projectPath: string, jobId: string): boolean;
|
|
86
|
+
//# sourceMappingURL=brownfield-launcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brownfield-launcher.d.ts","sourceRoot":"","sources":["../../../../src/core/background/brownfield-launcher.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,EACL,aAAa,EAEb,eAAe,EAEhB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,MAAM,EAAiB,MAAM,uBAAuB,CAAC;AAE9D;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,OAAO,GAAG,UAAU,GAAG,MAAM,CAAC;IAC7C,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAqDD;;GAEG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAWrF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,aAAa,EAAE,CAqBvE;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAGhF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,eAAe,EACtB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,WAAW,CAAC,EAAE,MAAM,GACnB,IAAI,CAgCN;AAED;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EACb,gBAAgB,EAAE,MAAM,EACxB,KAAK,CAAC,EAAE,yBAAyB,GAChC,IAAI,CA4BN;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,yBAAyB,GAC/B,MAAM,CAiDR;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAS/E;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CASpE;AAED;;;;;;;GAOG;AACH,wBAAsB,2BAA2B,CAC/C,OAAO,EAAE,uBAAuB,GAC/B,OAAO,CAAC,sBAAsB,CAAC,CA8BjC;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CASrE;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAUrE"}
|