specweave 0.17.7 → 0.17.9
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 +365 -9
- package/dist/locales/de/.gitkeep +0 -0
- package/dist/locales/de/cli.json +108 -0
- package/dist/locales/en/cli.json +287 -0
- package/dist/locales/en/errors.json +7 -0
- package/dist/locales/en/templates.json +6 -0
- package/dist/locales/es/.gitkeep +0 -0
- package/dist/locales/es/cli.json +41 -0
- package/dist/locales/fr/.gitkeep +0 -0
- package/dist/locales/fr/cli.json +108 -0
- package/dist/locales/ja/.gitkeep +0 -0
- package/dist/locales/ja/cli.json +108 -0
- package/dist/locales/ko/.gitkeep +0 -0
- package/dist/locales/ko/cli.json +108 -0
- package/dist/locales/pt/.gitkeep +0 -0
- package/dist/locales/pt/cli.json +108 -0
- package/dist/locales/ru/.gitkeep +0 -0
- package/dist/locales/ru/cli.json +269 -0
- package/dist/locales/zh/.gitkeep +0 -0
- package/dist/locales/zh/cli.json +108 -0
- package/dist/plugins/specweave/lib/hooks/sync-living-docs.d.ts +9 -4
- package/dist/plugins/specweave/lib/hooks/sync-living-docs.d.ts.map +1 -1
- package/dist/plugins/specweave/lib/hooks/sync-living-docs.js +82 -12
- package/dist/plugins/specweave/lib/hooks/sync-living-docs.js.map +1 -1
- package/dist/plugins/specweave-github/lib/github-spec-content-sync.d.ts +2 -2
- package/dist/plugins/specweave-github/lib/github-spec-content-sync.d.ts.map +1 -1
- package/dist/plugins/specweave-github/lib/github-spec-content-sync.js +69 -10
- package/dist/plugins/specweave-github/lib/github-spec-content-sync.js.map +1 -1
- package/dist/src/cli/commands/detect-project.d.ts +9 -0
- package/dist/src/cli/commands/detect-project.d.ts.map +1 -0
- package/dist/src/cli/commands/detect-project.js +85 -0
- package/dist/src/cli/commands/detect-project.js.map +1 -0
- package/dist/src/cli/commands/detect-specs.d.ts +9 -0
- package/dist/src/cli/commands/detect-specs.d.ts.map +1 -0
- package/dist/src/cli/commands/detect-specs.js +73 -0
- package/dist/src/cli/commands/detect-specs.js.map +1 -0
- package/dist/src/cli/commands/init.d.ts.map +1 -1
- package/dist/src/cli/commands/init.js +8 -15
- package/dist/src/cli/commands/init.js.map +1 -1
- package/dist/src/core/living-docs/content-classifier.d.ts +83 -0
- package/dist/src/core/living-docs/content-classifier.d.ts.map +1 -0
- package/dist/src/core/living-docs/content-classifier.js +393 -0
- package/dist/src/core/living-docs/content-classifier.js.map +1 -0
- package/dist/src/core/living-docs/content-distributor.d.ts +126 -0
- package/dist/src/core/living-docs/content-distributor.d.ts.map +1 -0
- package/dist/src/core/living-docs/content-distributor.js +339 -0
- package/dist/src/core/living-docs/content-distributor.js.map +1 -0
- package/dist/src/core/living-docs/content-parser.d.ts +140 -0
- package/dist/src/core/living-docs/content-parser.d.ts.map +1 -0
- package/dist/src/core/living-docs/content-parser.js +316 -0
- package/dist/src/core/living-docs/content-parser.js.map +1 -0
- package/dist/src/core/living-docs/cross-linker.d.ts +126 -0
- package/dist/src/core/living-docs/cross-linker.d.ts.map +1 -0
- package/dist/src/core/living-docs/cross-linker.js +374 -0
- package/dist/src/core/living-docs/cross-linker.js.map +1 -0
- package/dist/src/core/living-docs/index.d.ts +89 -0
- package/dist/src/core/living-docs/index.d.ts.map +1 -0
- package/dist/src/core/living-docs/index.js +169 -0
- package/dist/src/core/living-docs/index.js.map +1 -0
- package/dist/src/core/living-docs/project-detector.d.ts +103 -0
- package/dist/src/core/living-docs/project-detector.d.ts.map +1 -0
- package/dist/src/core/living-docs/project-detector.js +314 -0
- package/dist/src/core/living-docs/project-detector.js.map +1 -0
- package/dist/src/core/repo-structure/prompt-consolidator.d.ts +1 -1
- package/dist/src/core/repo-structure/prompt-consolidator.d.ts.map +1 -1
- package/dist/src/core/repo-structure/prompt-consolidator.js +51 -22
- package/dist/src/core/repo-structure/prompt-consolidator.js.map +1 -1
- package/dist/src/core/repo-structure/repo-structure-manager.d.ts +2 -0
- package/dist/src/core/repo-structure/repo-structure-manager.d.ts.map +1 -1
- package/dist/src/core/repo-structure/repo-structure-manager.js +126 -62
- package/dist/src/core/repo-structure/repo-structure-manager.js.map +1 -1
- package/dist/src/core/spec-content-sync.d.ts +6 -0
- package/dist/src/core/spec-content-sync.d.ts.map +1 -1
- package/dist/src/core/spec-content-sync.js +25 -7
- package/dist/src/core/spec-content-sync.js.map +1 -1
- package/dist/src/core/spec-detector.d.ts +54 -0
- package/dist/src/core/spec-detector.d.ts.map +1 -0
- package/dist/src/core/spec-detector.js +197 -0
- package/dist/src/core/spec-detector.js.map +1 -0
- package/dist/src/core/spec-identifier-detector.d.ts +49 -0
- package/dist/src/core/spec-identifier-detector.d.ts.map +1 -0
- package/dist/src/core/spec-identifier-detector.js +198 -0
- package/dist/src/core/spec-identifier-detector.js.map +1 -0
- package/dist/src/core/types/spec-identifier.d.ts +67 -0
- package/dist/src/core/types/spec-identifier.d.ts.map +1 -0
- package/dist/src/core/types/spec-identifier.js +23 -0
- package/dist/src/core/types/spec-identifier.js.map +1 -0
- package/dist/src/utils/docs-preview/config-generator.d.ts.map +1 -1
- package/dist/src/utils/docs-preview/config-generator.js +11 -0
- package/dist/src/utils/docs-preview/config-generator.js.map +1 -1
- package/package.json +1 -1
- package/plugins/specweave/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave/lib/hooks/sync-living-docs.js +61 -5
- package/plugins/specweave/lib/hooks/sync-living-docs.ts +102 -13
- package/plugins/specweave-ado/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-docs-preview/commands/preview.md +11 -11
- package/plugins/specweave-github/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-github/hooks/post-task-completion.sh +59 -30
- package/plugins/specweave-github/lib/github-spec-content-sync.js +55 -6
- package/plugins/specweave-github/lib/github-spec-content-sync.ts +84 -12
- package/plugins/specweave-jira/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-mobile/.claude-plugin/plugin.json +1 -4
- package/plugins/specweave-release/.claude-plugin/plugin.json +3 -15
- package/src/templates/AGENTS.md.template +297 -0
- package/plugins/specweave/plugin.json +0 -22
- package/plugins/specweave-ado/plugin.json +0 -20
- package/plugins/specweave-github/plugin.json +0 -19
- package/plugins/specweave-jira/plugin.json +0 -20
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Project Detector for Intelligent Living Docs Sync
|
|
3
|
+
*
|
|
4
|
+
* Detects which project an increment belongs to using keyword matching and metadata.
|
|
5
|
+
*
|
|
6
|
+
* @module living-docs/project-detector
|
|
7
|
+
*/
|
|
8
|
+
import { ParsedSpec } from './content-parser.js';
|
|
9
|
+
/**
|
|
10
|
+
* Project context with confidence score
|
|
11
|
+
*/
|
|
12
|
+
export interface ProjectContext {
|
|
13
|
+
id: string;
|
|
14
|
+
name: string;
|
|
15
|
+
confidence: number;
|
|
16
|
+
reasoning: string[];
|
|
17
|
+
metadata?: Record<string, any>;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Project configuration from config.json
|
|
21
|
+
*/
|
|
22
|
+
export interface ProjectConfig {
|
|
23
|
+
id: string;
|
|
24
|
+
name: string;
|
|
25
|
+
description?: string;
|
|
26
|
+
keywords?: string[];
|
|
27
|
+
team?: string;
|
|
28
|
+
techStack?: string[];
|
|
29
|
+
specsFolder?: string;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Detector options
|
|
33
|
+
*/
|
|
34
|
+
export interface DetectorOptions {
|
|
35
|
+
configPath?: string;
|
|
36
|
+
fallbackProject?: string;
|
|
37
|
+
confidenceThreshold?: number;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Project Detector class
|
|
41
|
+
*/
|
|
42
|
+
export declare class ProjectDetector {
|
|
43
|
+
private options;
|
|
44
|
+
private projects;
|
|
45
|
+
constructor(options?: DetectorOptions);
|
|
46
|
+
/**
|
|
47
|
+
* Load projects from config.json
|
|
48
|
+
*/
|
|
49
|
+
private loadProjects;
|
|
50
|
+
/**
|
|
51
|
+
* Detect project for an increment
|
|
52
|
+
*/
|
|
53
|
+
detectProject(incrementId: string, spec: ParsedSpec): ProjectContext;
|
|
54
|
+
/**
|
|
55
|
+
* Get all configured projects
|
|
56
|
+
*/
|
|
57
|
+
getProjects(): ProjectConfig[];
|
|
58
|
+
/**
|
|
59
|
+
* Get project by ID
|
|
60
|
+
*/
|
|
61
|
+
getProject(projectId: string): ProjectConfig | null;
|
|
62
|
+
/**
|
|
63
|
+
* Get specs folder path for a project
|
|
64
|
+
*/
|
|
65
|
+
getSpecsFolder(projectId: string): string;
|
|
66
|
+
/**
|
|
67
|
+
* Check if confidence meets threshold for auto-selection
|
|
68
|
+
*/
|
|
69
|
+
shouldAutoSelect(context: ProjectContext): boolean;
|
|
70
|
+
/**
|
|
71
|
+
* Create project context from string ID (fallback when no detection needed)
|
|
72
|
+
*/
|
|
73
|
+
createContext(projectId: string): ProjectContext;
|
|
74
|
+
/**
|
|
75
|
+
* Ensure project specs folder exists
|
|
76
|
+
*/
|
|
77
|
+
ensureSpecsFolder(projectId: string): Promise<string>;
|
|
78
|
+
/**
|
|
79
|
+
* Get folder path for a category
|
|
80
|
+
*/
|
|
81
|
+
getCategoryFolder(category: string, projectId?: string): string;
|
|
82
|
+
/**
|
|
83
|
+
* Extract project ID from increment ID if present
|
|
84
|
+
* Format: 0016-{project}-feature-name OR 0016-feature-name
|
|
85
|
+
*/
|
|
86
|
+
extractProjectFromIncrementId(incrementId: string): string | null;
|
|
87
|
+
/**
|
|
88
|
+
* Validate project structure exists
|
|
89
|
+
*/
|
|
90
|
+
validateProjectStructure(projectId: string): Promise<{
|
|
91
|
+
valid: boolean;
|
|
92
|
+
missing: string[];
|
|
93
|
+
}>;
|
|
94
|
+
/**
|
|
95
|
+
* Create project structure if missing
|
|
96
|
+
*/
|
|
97
|
+
createProjectStructure(projectId: string): Promise<void>;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Factory function to create detector
|
|
101
|
+
*/
|
|
102
|
+
export declare function createProjectDetector(options?: DetectorOptions): ProjectDetector;
|
|
103
|
+
//# sourceMappingURL=project-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-detector.d.ts","sourceRoot":"","sources":["../../../../src/core/living-docs/project-detector.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAChC;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED;;GAEG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,OAAO,CAA4B;IAC3C,OAAO,CAAC,QAAQ,CAA6B;gBAEjC,OAAO,GAAE,eAAoB;IAWzC;;OAEG;IACH,OAAO,CAAC,YAAY;IAkDpB;;OAEG;IACH,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,cAAc;IAqGpE;;OAEG;IACH,WAAW,IAAI,aAAa,EAAE;IAI9B;;OAEG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI;IAInD;;OAEG;IACH,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAWzC;;OAEG;IACH,gBAAgB,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO;IAIlD;;OAEG;IACH,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc;IA2BhD;;OAEG;IACG,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAM3D;;OAEG;IACH,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM;IAmB/D;;;OAGG;IACH,6BAA6B,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAajE;;OAEG;IACG,wBAAwB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;QACzD,KAAK,EAAE,OAAO,CAAC;QACf,OAAO,EAAE,MAAM,EAAE,CAAC;KACnB,CAAC;IAoBF;;OAEG;IACG,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CA+B/D;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,CAAC,EAAE,eAAe,GAAG,eAAe,CAEhF"}
|
|
@@ -0,0 +1,314 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Project Detector for Intelligent Living Docs Sync
|
|
3
|
+
*
|
|
4
|
+
* Detects which project an increment belongs to using keyword matching and metadata.
|
|
5
|
+
*
|
|
6
|
+
* @module living-docs/project-detector
|
|
7
|
+
*/
|
|
8
|
+
import fs from 'fs-extra';
|
|
9
|
+
import path from 'path';
|
|
10
|
+
/**
|
|
11
|
+
* Project Detector class
|
|
12
|
+
*/
|
|
13
|
+
export class ProjectDetector {
|
|
14
|
+
constructor(options = {}) {
|
|
15
|
+
this.options = {
|
|
16
|
+
configPath: options.configPath || path.join(process.cwd(), '.specweave', 'config.json'),
|
|
17
|
+
fallbackProject: options.fallbackProject || 'default',
|
|
18
|
+
confidenceThreshold: options.confidenceThreshold || 0.7,
|
|
19
|
+
};
|
|
20
|
+
this.projects = new Map();
|
|
21
|
+
this.loadProjects();
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Load projects from config.json
|
|
25
|
+
*/
|
|
26
|
+
loadProjects() {
|
|
27
|
+
try {
|
|
28
|
+
if (fs.existsSync(this.options.configPath)) {
|
|
29
|
+
const config = JSON.parse(fs.readFileSync(this.options.configPath, 'utf-8'));
|
|
30
|
+
// Load projects from multiProject config (v0.8.0+)
|
|
31
|
+
if (config.multiProject?.projects) {
|
|
32
|
+
for (const [id, project] of Object.entries(config.multiProject.projects)) {
|
|
33
|
+
this.projects.set(id, {
|
|
34
|
+
id,
|
|
35
|
+
name: project.name || id,
|
|
36
|
+
description: project.description,
|
|
37
|
+
keywords: project.keywords || [],
|
|
38
|
+
team: project.team,
|
|
39
|
+
techStack: project.techStack || [],
|
|
40
|
+
specsFolder: project.specsFolder,
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
// If no projects configured, create default
|
|
45
|
+
if (this.projects.size === 0) {
|
|
46
|
+
this.projects.set(this.options.fallbackProject, {
|
|
47
|
+
id: this.options.fallbackProject,
|
|
48
|
+
name: 'Default Project',
|
|
49
|
+
keywords: [],
|
|
50
|
+
techStack: [],
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
// No config found - create default project
|
|
56
|
+
this.projects.set(this.options.fallbackProject, {
|
|
57
|
+
id: this.options.fallbackProject,
|
|
58
|
+
name: 'Default Project',
|
|
59
|
+
keywords: [],
|
|
60
|
+
techStack: [],
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
console.warn('Failed to load projects from config:', error);
|
|
66
|
+
// Fallback to default project
|
|
67
|
+
this.projects.set(this.options.fallbackProject, {
|
|
68
|
+
id: this.options.fallbackProject,
|
|
69
|
+
name: 'Default Project',
|
|
70
|
+
keywords: [],
|
|
71
|
+
techStack: [],
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Detect project for an increment
|
|
77
|
+
*/
|
|
78
|
+
detectProject(incrementId, spec) {
|
|
79
|
+
const scores = new Map();
|
|
80
|
+
// Initialize scores for all projects
|
|
81
|
+
for (const projectId of this.projects.keys()) {
|
|
82
|
+
scores.set(projectId, { score: 0, reasoning: [] });
|
|
83
|
+
}
|
|
84
|
+
// 1. Check increment name for project keywords
|
|
85
|
+
for (const [projectId, project] of this.projects.entries()) {
|
|
86
|
+
const scoreData = scores.get(projectId);
|
|
87
|
+
// Project name match (exact)
|
|
88
|
+
if (incrementId.toLowerCase().includes(project.id.toLowerCase())) {
|
|
89
|
+
scoreData.score += 10;
|
|
90
|
+
scoreData.reasoning.push(`Increment name contains project ID "${project.id}"`);
|
|
91
|
+
}
|
|
92
|
+
// Team name match
|
|
93
|
+
if (project.team && incrementId.toLowerCase().includes(project.team.toLowerCase())) {
|
|
94
|
+
scoreData.score += 5;
|
|
95
|
+
scoreData.reasoning.push(`Increment name contains team "${project.team}"`);
|
|
96
|
+
}
|
|
97
|
+
// Keyword matches
|
|
98
|
+
if (project.keywords) {
|
|
99
|
+
for (const keyword of project.keywords) {
|
|
100
|
+
const keywordLower = keyword.toLowerCase();
|
|
101
|
+
if (incrementId.toLowerCase().includes(keywordLower) ||
|
|
102
|
+
spec.frontmatter.title?.toLowerCase().includes(keywordLower)) {
|
|
103
|
+
scoreData.score += 3;
|
|
104
|
+
scoreData.reasoning.push(`Keyword match: "${keyword}"`);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// 2. Check frontmatter for project metadata
|
|
110
|
+
if (spec.frontmatter.project) {
|
|
111
|
+
const projectId = spec.frontmatter.project;
|
|
112
|
+
if (this.projects.has(projectId)) {
|
|
113
|
+
const scoreData = scores.get(projectId);
|
|
114
|
+
scoreData.score += 20; // High confidence from explicit metadata
|
|
115
|
+
scoreData.reasoning.push(`Explicit project metadata: "${projectId}"`);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
// 3. Check tech stack from spec content
|
|
119
|
+
for (const [projectId, project] of this.projects.entries()) {
|
|
120
|
+
if (project.techStack && project.techStack.length > 0) {
|
|
121
|
+
const scoreData = scores.get(projectId);
|
|
122
|
+
const specContent = JSON.stringify(spec);
|
|
123
|
+
for (const tech of project.techStack) {
|
|
124
|
+
if (specContent.toLowerCase().includes(tech.toLowerCase())) {
|
|
125
|
+
scoreData.score += 2;
|
|
126
|
+
scoreData.reasoning.push(`Tech stack match: "${tech}"`);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
// Find project with highest score
|
|
132
|
+
let maxScore = 0;
|
|
133
|
+
let bestProjectId = this.options.fallbackProject;
|
|
134
|
+
let bestReasoning = [];
|
|
135
|
+
for (const [projectId, data] of scores.entries()) {
|
|
136
|
+
if (data.score > maxScore) {
|
|
137
|
+
maxScore = data.score;
|
|
138
|
+
bestProjectId = projectId;
|
|
139
|
+
bestReasoning = data.reasoning;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
// If no matches, use fallback
|
|
143
|
+
if (maxScore === 0) {
|
|
144
|
+
bestReasoning.push('No project indicators found - using fallback project');
|
|
145
|
+
}
|
|
146
|
+
// Normalize confidence (max score of ~30 = 1.0 confidence)
|
|
147
|
+
const confidence = Math.min(maxScore / 30, 1.0);
|
|
148
|
+
const project = this.projects.get(bestProjectId);
|
|
149
|
+
return {
|
|
150
|
+
id: project.id,
|
|
151
|
+
name: project.name,
|
|
152
|
+
confidence,
|
|
153
|
+
reasoning: bestReasoning,
|
|
154
|
+
metadata: {
|
|
155
|
+
totalProjects: this.projects.size,
|
|
156
|
+
scores: Object.fromEntries(Array.from(scores.entries()).map(([id, data]) => [id, data.score])),
|
|
157
|
+
},
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Get all configured projects
|
|
162
|
+
*/
|
|
163
|
+
getProjects() {
|
|
164
|
+
return Array.from(this.projects.values());
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Get project by ID
|
|
168
|
+
*/
|
|
169
|
+
getProject(projectId) {
|
|
170
|
+
return this.projects.get(projectId) || null;
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Get specs folder path for a project
|
|
174
|
+
*/
|
|
175
|
+
getSpecsFolder(projectId) {
|
|
176
|
+
const project = this.projects.get(projectId);
|
|
177
|
+
if (project?.specsFolder) {
|
|
178
|
+
return project.specsFolder;
|
|
179
|
+
}
|
|
180
|
+
// Default: .specweave/docs/internal/specs/{projectId}
|
|
181
|
+
return path.join(process.cwd(), '.specweave', 'docs', 'internal', 'specs', projectId);
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Check if confidence meets threshold for auto-selection
|
|
185
|
+
*/
|
|
186
|
+
shouldAutoSelect(context) {
|
|
187
|
+
return context.confidence >= this.options.confidenceThreshold;
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Create project context from string ID (fallback when no detection needed)
|
|
191
|
+
*/
|
|
192
|
+
createContext(projectId) {
|
|
193
|
+
const project = this.projects.get(projectId);
|
|
194
|
+
if (!project) {
|
|
195
|
+
// Unknown project - use fallback
|
|
196
|
+
const fallbackProject = this.projects.get(this.options.fallbackProject);
|
|
197
|
+
return {
|
|
198
|
+
id: fallbackProject.id,
|
|
199
|
+
name: fallbackProject.name,
|
|
200
|
+
confidence: 1.0,
|
|
201
|
+
reasoning: [`Fallback to "${fallbackProject.id}" (project "${projectId}" not found)`],
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
return {
|
|
205
|
+
id: project.id,
|
|
206
|
+
name: project.name,
|
|
207
|
+
confidence: 1.0,
|
|
208
|
+
reasoning: ['Explicitly selected project'],
|
|
209
|
+
metadata: {
|
|
210
|
+
description: project.description,
|
|
211
|
+
team: project.team,
|
|
212
|
+
techStack: project.techStack,
|
|
213
|
+
},
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Ensure project specs folder exists
|
|
218
|
+
*/
|
|
219
|
+
async ensureSpecsFolder(projectId) {
|
|
220
|
+
const specsFolder = this.getSpecsFolder(projectId);
|
|
221
|
+
await fs.ensureDir(specsFolder);
|
|
222
|
+
return specsFolder;
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Get folder path for a category
|
|
226
|
+
*/
|
|
227
|
+
getCategoryFolder(category, projectId) {
|
|
228
|
+
const basePath = path.join(process.cwd(), '.specweave', 'docs', 'internal');
|
|
229
|
+
// Categories that don't use project folders
|
|
230
|
+
const globalCategories = ['architecture', 'operations', 'delivery', 'strategy', 'governance'];
|
|
231
|
+
if (globalCategories.includes(category)) {
|
|
232
|
+
return path.join(basePath, category);
|
|
233
|
+
}
|
|
234
|
+
// Project-specific categories (specs, modules, team, etc.)
|
|
235
|
+
if (projectId) {
|
|
236
|
+
return path.join(basePath, category, projectId);
|
|
237
|
+
}
|
|
238
|
+
// Fallback to default project
|
|
239
|
+
return path.join(basePath, category, this.options.fallbackProject);
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Extract project ID from increment ID if present
|
|
243
|
+
* Format: 0016-{project}-feature-name OR 0016-feature-name
|
|
244
|
+
*/
|
|
245
|
+
extractProjectFromIncrementId(incrementId) {
|
|
246
|
+
// Check if increment ID contains a known project ID
|
|
247
|
+
for (const projectId of this.projects.keys()) {
|
|
248
|
+
// Pattern: 0016-backend-auth OR backend-0016-auth
|
|
249
|
+
const regex = new RegExp(`\\b${projectId}\\b`, 'i');
|
|
250
|
+
if (regex.test(incrementId)) {
|
|
251
|
+
return projectId;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
return null;
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Validate project structure exists
|
|
258
|
+
*/
|
|
259
|
+
async validateProjectStructure(projectId) {
|
|
260
|
+
const basePath = path.join(process.cwd(), '.specweave', 'docs', 'internal');
|
|
261
|
+
const requiredFolders = [
|
|
262
|
+
path.join(basePath, 'specs', projectId),
|
|
263
|
+
];
|
|
264
|
+
const missing = [];
|
|
265
|
+
for (const folder of requiredFolders) {
|
|
266
|
+
if (!fs.existsSync(folder)) {
|
|
267
|
+
missing.push(folder);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
return {
|
|
271
|
+
valid: missing.length === 0,
|
|
272
|
+
missing,
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Create project structure if missing
|
|
277
|
+
*/
|
|
278
|
+
async createProjectStructure(projectId) {
|
|
279
|
+
const basePath = path.join(process.cwd(), '.specweave', 'docs', 'internal');
|
|
280
|
+
const folders = [
|
|
281
|
+
path.join(basePath, 'specs', projectId),
|
|
282
|
+
// Add more project-specific folders as needed
|
|
283
|
+
];
|
|
284
|
+
for (const folder of folders) {
|
|
285
|
+
await fs.ensureDir(folder);
|
|
286
|
+
}
|
|
287
|
+
// Create README in specs folder
|
|
288
|
+
const readmePath = path.join(basePath, 'specs', projectId, 'README.md');
|
|
289
|
+
if (!fs.existsSync(readmePath)) {
|
|
290
|
+
const project = this.projects.get(projectId);
|
|
291
|
+
const content = `# ${project?.name || projectId} Specifications
|
|
292
|
+
|
|
293
|
+
**Project**: ${project?.name || projectId}
|
|
294
|
+
**Description**: ${project?.description || 'No description'}
|
|
295
|
+
|
|
296
|
+
## Specifications
|
|
297
|
+
|
|
298
|
+
*Specifications will appear here after living docs sync.*
|
|
299
|
+
|
|
300
|
+
---
|
|
301
|
+
|
|
302
|
+
Generated by SpecWeave
|
|
303
|
+
`;
|
|
304
|
+
await fs.writeFile(readmePath, content, 'utf-8');
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
309
|
+
* Factory function to create detector
|
|
310
|
+
*/
|
|
311
|
+
export function createProjectDetector(options) {
|
|
312
|
+
return new ProjectDetector(options);
|
|
313
|
+
}
|
|
314
|
+
//# sourceMappingURL=project-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-detector.js","sourceRoot":"","sources":["../../../../src/core/living-docs/project-detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
/**
|
|
10
10
|
* Architecture choice
|
|
11
11
|
*/
|
|
12
|
-
export type ArchitectureChoice = 'single' | 'multi-with-parent' | 'multi-without-parent' | 'monorepo';
|
|
12
|
+
export type ArchitectureChoice = 'single' | 'multi-with-parent' | 'local-parent' | 'multi-without-parent' | 'monorepo';
|
|
13
13
|
/**
|
|
14
14
|
* Architecture prompt option
|
|
15
15
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompt-consolidator.d.ts","sourceRoot":"","sources":["../../../../src/core/repo-structure/prompt-consolidator.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,mBAAmB,GAAG,sBAAsB,GAAG,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"prompt-consolidator.d.ts","sourceRoot":"","sources":["../../../../src/core/repo-structure/prompt-consolidator.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,mBAAmB,GAAG,cAAc,GAAG,sBAAsB,GAAG,UAAU,CAAC;AAEvH;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,kBAAkB,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,IAAI;IACvC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,kBAAkB,EAAE,CAAC;CAC/B,CAoEA;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAqD9C;AAED;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAYxF;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG;IACrD,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,SAAS,GAAG,QAAQ,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACpF,OAAO,EAAE,SAAS,GAAG,QAAQ,CAAC;CAC/B,CAiBA;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,kBAAkB,GAAG,MAAM,CAe3E"}
|
|
@@ -20,7 +20,7 @@ export function getArchitecturePrompt() {
|
|
|
20
20
|
options: [
|
|
21
21
|
{
|
|
22
22
|
value: 'single',
|
|
23
|
-
label: 'Single repository',
|
|
23
|
+
label: '1️⃣ Single repository',
|
|
24
24
|
description: 'All code in one repository',
|
|
25
25
|
example: `
|
|
26
26
|
my-project/
|
|
@@ -32,19 +32,34 @@ my-project/
|
|
|
32
32
|
},
|
|
33
33
|
{
|
|
34
34
|
value: 'multi-with-parent',
|
|
35
|
-
label: 'Multiple
|
|
36
|
-
description: '
|
|
35
|
+
label: '2️⃣ Multiple repos WITH parent repo (GitHub)',
|
|
36
|
+
description: '✅ RECOMMENDED: Parent repo on GitHub + implementation repos (best for teams)',
|
|
37
37
|
example: `
|
|
38
|
-
my-project-parent/ ← Parent repo (specs, docs
|
|
38
|
+
my-project-parent/ ← Parent repo (specs, docs) - PUSHED TO GITHUB
|
|
39
39
|
├── .specweave/
|
|
40
|
-
|
|
41
|
-
|
|
40
|
+
├── .env
|
|
41
|
+
└── .gitignore
|
|
42
|
+
my-project-frontend/ ← Separate GitHub repo (root level)
|
|
43
|
+
my-project-backend/ ← Separate GitHub repo (root level)
|
|
44
|
+
`.trim()
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
value: 'local-parent',
|
|
48
|
+
label: '3️⃣ Multiple repos WITH parent folder (LOCAL only)',
|
|
49
|
+
description: 'Parent folder with .specweave (NOT pushed to GitHub, local filesystem only)',
|
|
50
|
+
example: `
|
|
51
|
+
my-parent-folder/ ← Parent folder (LOCAL, NOT synced to GitHub)
|
|
52
|
+
├── .specweave/ ← Gitignored (local only)
|
|
53
|
+
├── .env
|
|
54
|
+
├── frontend/ ← Cloned from GitHub (or init new)
|
|
55
|
+
├── backend/ ← Cloned from GitHub (or init new)
|
|
56
|
+
└── shared/ ← Cloned from GitHub (or init new)
|
|
42
57
|
`.trim()
|
|
43
58
|
},
|
|
44
59
|
{
|
|
45
60
|
value: 'multi-without-parent',
|
|
46
|
-
label: 'Multiple
|
|
47
|
-
description: 'Each repo has
|
|
61
|
+
label: '4️⃣ Multiple repos WITHOUT parent',
|
|
62
|
+
description: '❌ NOT RECOMMENDED: Each repo has .specweave/ (leads to fragmentation)',
|
|
48
63
|
example: `
|
|
49
64
|
my-project-frontend/
|
|
50
65
|
├── .specweave/ ← Duplicated
|
|
@@ -54,7 +69,7 @@ my-project-backend/
|
|
|
54
69
|
},
|
|
55
70
|
{
|
|
56
71
|
value: 'monorepo',
|
|
57
|
-
label: 'Monorepo (single repo, multiple projects)',
|
|
72
|
+
label: '5️⃣ Monorepo (single repo, multiple projects)',
|
|
58
73
|
description: 'All code in one repo, organized by project (best for tightly coupled services)',
|
|
59
74
|
example: `
|
|
60
75
|
my-monorepo/
|
|
@@ -75,7 +90,7 @@ my-monorepo/
|
|
|
75
90
|
*/
|
|
76
91
|
export function getParentRepoBenefits() {
|
|
77
92
|
return `
|
|
78
|
-
**Why use a parent repository?**
|
|
93
|
+
**Why use a parent folder/repository?**
|
|
79
94
|
|
|
80
95
|
✅ **Central .specweave/ for all specs/docs**
|
|
81
96
|
- One source of truth for entire system
|
|
@@ -92,27 +107,39 @@ export function getParentRepoBenefits() {
|
|
|
92
107
|
|
|
93
108
|
✅ **Simplified onboarding**
|
|
94
109
|
- New developers read one set of docs
|
|
95
|
-
- Complete system overview in one
|
|
110
|
+
- Complete system overview in one location
|
|
96
111
|
|
|
97
112
|
✅ **Compliance & auditing**
|
|
98
113
|
- Complete audit trail in one place
|
|
99
114
|
- Regulatory requirements easier to satisfy
|
|
100
115
|
|
|
101
|
-
**
|
|
116
|
+
**Two parent approaches available:**
|
|
102
117
|
|
|
103
|
-
|
|
104
|
-
|
|
118
|
+
**Option 2: GitHub Parent Repository** (Recommended for teams)
|
|
119
|
+
- Parent repo pushed to GitHub
|
|
120
|
+
- Team can clone and collaborate
|
|
121
|
+
- Full version control for specs/docs
|
|
122
|
+
- Works with CI/CD pipelines
|
|
123
|
+
|
|
124
|
+
**Option 3: Local Parent Folder** (Recommended for solo developers)
|
|
125
|
+
- Parent folder stays on your machine
|
|
126
|
+
- .specweave/ is gitignored (not synced)
|
|
127
|
+
- Implementation repos still on GitHub
|
|
128
|
+
- Lighter setup, less overhead
|
|
129
|
+
|
|
130
|
+
**Example Structure (Local Parent):**
|
|
131
|
+
|
|
132
|
+
my-parent-folder/ ← Local folder (NOT a GitHub repo)
|
|
133
|
+
├── .specweave/ ← Gitignored (local only)
|
|
105
134
|
│ ├── increments/
|
|
106
135
|
│ ├── docs/
|
|
107
136
|
│ └── logs/
|
|
108
|
-
├── .env ←
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
backend/ ← Cloned from GitHub (root-level!)
|
|
113
|
-
shared/ ← Cloned from GitHub (root-level!)
|
|
137
|
+
├── .env ← Config
|
|
138
|
+
├── frontend/ ← Cloned from GitHub (or init new)
|
|
139
|
+
├── backend/ ← Cloned from GitHub (or init new)
|
|
140
|
+
└── shared/ ← Cloned from GitHub (or init new)
|
|
114
141
|
|
|
115
|
-
**Note:**
|
|
142
|
+
**Note:** With local parent, .specweave/ is NOT synced to GitHub.
|
|
116
143
|
`.trim();
|
|
117
144
|
}
|
|
118
145
|
/**
|
|
@@ -168,7 +195,9 @@ export function formatArchitectureChoice(choice) {
|
|
|
168
195
|
case 'single':
|
|
169
196
|
return 'Single repository';
|
|
170
197
|
case 'multi-with-parent':
|
|
171
|
-
return 'Multiple repositories with parent';
|
|
198
|
+
return 'Multiple repositories with parent (GitHub)';
|
|
199
|
+
case 'local-parent':
|
|
200
|
+
return 'Multiple repositories with local parent folder';
|
|
172
201
|
case 'multi-without-parent':
|
|
173
202
|
return 'Multiple repositories without parent';
|
|
174
203
|
case 'monorepo':
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompt-consolidator.js","sourceRoot":"","sources":["../../../../src/core/repo-structure/prompt-consolidator.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAiBH;;;;;;;GAOG;AACH,MAAM,UAAU,qBAAqB;IAInC,OAAO;QACL,QAAQ,EAAE,uCAAuC;QACjD,OAAO,EAAE;YACP;gBACE,KAAK,EAAE,QAAQ;gBACf,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"prompt-consolidator.js","sourceRoot":"","sources":["../../../../src/core/repo-structure/prompt-consolidator.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAiBH;;;;;;;GAOG;AACH,MAAM,UAAU,qBAAqB;IAInC,OAAO;QACL,QAAQ,EAAE,uCAAuC;QACjD,OAAO,EAAE;YACP;gBACE,KAAK,EAAE,QAAQ;gBACf,KAAK,EAAE,wBAAwB;gBAC/B,WAAW,EAAE,4BAA4B;gBACzC,OAAO,EAAE;;;;;;SAMR,CAAC,IAAI,EAAE;aACT;YACD;gBACE,KAAK,EAAE,mBAAmB;gBAC1B,KAAK,EAAE,+CAA+C;gBACtD,WAAW,EAAE,8EAA8E;gBAC3F,OAAO,EAAE;;;;;;;SAOR,CAAC,IAAI,EAAE;aACT;YACD;gBACE,KAAK,EAAE,cAAc;gBACrB,KAAK,EAAE,qDAAqD;gBAC5D,WAAW,EAAE,6EAA6E;gBAC1F,OAAO,EAAE;;;;;;;SAOR,CAAC,IAAI,EAAE;aACT;YACD;gBACE,KAAK,EAAE,sBAAsB;gBAC7B,KAAK,EAAE,oCAAoC;gBAC3C,WAAW,EAAE,uEAAuE;gBACpF,OAAO,EAAE;;;;;SAKR,CAAC,IAAI,EAAE;aACT;YACD;gBACE,KAAK,EAAE,UAAU;gBACjB,KAAK,EAAE,gDAAgD;gBACvD,WAAW,EAAE,gFAAgF;gBAC7F,OAAO,EAAE;;;;;;;SAOR,CAAC,IAAI,EAAE;aACT;SACF;KACF,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,qBAAqB;IACnC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmDN,CAAC,IAAI,EAAE,CAAC;AACX,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,yBAAyB,CAAC,WAAmB,EAAE,SAAiB;IAC9E,MAAM,KAAK,GAAG,WAAW,GAAG,SAAS,CAAC;IAEtC,IAAI,WAAW,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,qCAAqC,KAAK;;MAE/C,SAAS,mBAAmB,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,cAAc;;eAElE,KAAK,yCAAyC,CAAC;IAC5D,CAAC;IAED,OAAO,qCAAqC,KAAK,EAAE,CAAC;AACtD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,QAAgB;IAKlD,OAAO;QACL,QAAQ,EAAE,8BAA8B,QAAQ,IAAI;QACpD,OAAO,EAAE;YACP;gBACE,KAAK,EAAE,SAAS;gBAChB,KAAK,EAAE,uBAAuB;gBAC9B,WAAW,EAAE,oDAAoD;aAClE;YACD;gBACE,KAAK,EAAE,QAAQ;gBACf,KAAK,EAAE,QAAQ;gBACf,WAAW,EAAE,gCAAgC;aAC9C;SACF;QACD,OAAO,EAAE,SAAS;KACnB,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,wBAAwB,CAAC,MAA0B;IACjE,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,QAAQ;YACX,OAAO,mBAAmB,CAAC;QAC7B,KAAK,mBAAmB;YACtB,OAAO,4CAA4C,CAAC;QACtD,KAAK,cAAc;YACjB,OAAO,gDAAgD,CAAC;QAC1D,KAAK,sBAAsB;YACzB,OAAO,sCAAsC,CAAC;QAChD,KAAK,UAAU;YACb,OAAO,UAAU,CAAC;QACpB;YACE,OAAO,MAAM,CAAC;IAClB,CAAC;AACH,CAAC"}
|
|
@@ -59,6 +59,8 @@ export declare class RepoStructureManager {
|
|
|
59
59
|
private configureSingleRepo;
|
|
60
60
|
/**
|
|
61
61
|
* Configure multi-repository architecture
|
|
62
|
+
* @param useParent - Whether to use parent repository/folder
|
|
63
|
+
* @param isLocalParent - If true, parent folder is local only (NOT pushed to GitHub)
|
|
62
64
|
*/
|
|
63
65
|
private configureMultiRepo;
|
|
64
66
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repo-structure-manager.d.ts","sourceRoot":"","sources":["../../../../src/core/repo-structure/repo-structure-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAuBH,MAAM,MAAM,gBAAgB,GAAG,QAAQ,GAAG,YAAY,GAAG,UAAU,GAAG,QAAQ,CAAC;AAE/E,MAAM,WAAW,mBAAmB;IAClC,YAAY,EAAE,gBAAgB,CAAC;IAC/B,UAAU,CAAC,EAAE;QACX,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,SAAS,GAAG,QAAQ,CAAC;QACjC,cAAc,EAAE,OAAO,CAAC;KACzB,CAAC;IACF,YAAY,EAAE,KAAK,CAAC;QAClB,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,EAAE,MAAM,CAAC;QACpB,IAAI,EAAE,MAAM,CAAC;QACb,UAAU,EAAE,SAAS,GAAG,QAAQ,CAAC;QACjC,cAAc,EAAE,OAAO,CAAC;QACxB,QAAQ,EAAE,OAAO,CAAC;KACnB,CAAC,CAAC;IACH,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC7B;AAED,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,WAAW,CAAC,CAAS;IAC7B,OAAO,CAAC,YAAY,CAAoB;gBAE5B,WAAW,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM;IAMrD;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"repo-structure-manager.d.ts","sourceRoot":"","sources":["../../../../src/core/repo-structure/repo-structure-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAuBH,MAAM,MAAM,gBAAgB,GAAG,QAAQ,GAAG,YAAY,GAAG,UAAU,GAAG,QAAQ,CAAC;AAE/E,MAAM,WAAW,mBAAmB;IAClC,YAAY,EAAE,gBAAgB,CAAC;IAC/B,UAAU,CAAC,EAAE;QACX,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,SAAS,GAAG,QAAQ,CAAC;QACjC,cAAc,EAAE,OAAO,CAAC;KACzB,CAAC;IACF,YAAY,EAAE,KAAK,CAAC;QAClB,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,EAAE,MAAM,CAAC;QACpB,IAAI,EAAE,MAAM,CAAC;QACb,UAAU,EAAE,SAAS,GAAG,QAAQ,CAAC;QACjC,cAAc,EAAE,OAAO,CAAC;QACxB,QAAQ,EAAE,OAAO,CAAC;KACnB,CAAC,CAAC;IACH,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC7B;AAED,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,WAAW,CAAC,CAAS;IAC7B,OAAO,CAAC,YAAY,CAAoB;gBAE5B,WAAW,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM;IAMrD;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,mBAAmB,CAAC;IA4DrD;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAiB7B;;OAEG;YACW,WAAW;IAsBzB;;OAEG;YACW,mBAAmB;IA2GjC;;;;OAIG;YACW,kBAAkB;IA2UhC;;OAEG;YACW,cAAc;IAQ5B;;OAEG;YACW,iBAAiB;IA4E/B;;OAEG;IACG,wBAAwB,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAiF1E;;OAEG;YACW,eAAe;IA8C7B;;OAEG;YACW,gBAAgB;IAgC9B;;OAEG;YACW,gBAAgB;IAmC9B;;OAEG;YACW,oBAAoB;IAmBlC;;OAEG;IACG,oBAAoB,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAiFtE;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAyBhC;;;;;OAKG;IACG,wBAAwB,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;CAwC3E"}
|