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.
Files changed (108) hide show
  1. package/CLAUDE.md +365 -9
  2. package/dist/locales/de/.gitkeep +0 -0
  3. package/dist/locales/de/cli.json +108 -0
  4. package/dist/locales/en/cli.json +287 -0
  5. package/dist/locales/en/errors.json +7 -0
  6. package/dist/locales/en/templates.json +6 -0
  7. package/dist/locales/es/.gitkeep +0 -0
  8. package/dist/locales/es/cli.json +41 -0
  9. package/dist/locales/fr/.gitkeep +0 -0
  10. package/dist/locales/fr/cli.json +108 -0
  11. package/dist/locales/ja/.gitkeep +0 -0
  12. package/dist/locales/ja/cli.json +108 -0
  13. package/dist/locales/ko/.gitkeep +0 -0
  14. package/dist/locales/ko/cli.json +108 -0
  15. package/dist/locales/pt/.gitkeep +0 -0
  16. package/dist/locales/pt/cli.json +108 -0
  17. package/dist/locales/ru/.gitkeep +0 -0
  18. package/dist/locales/ru/cli.json +269 -0
  19. package/dist/locales/zh/.gitkeep +0 -0
  20. package/dist/locales/zh/cli.json +108 -0
  21. package/dist/plugins/specweave/lib/hooks/sync-living-docs.d.ts +9 -4
  22. package/dist/plugins/specweave/lib/hooks/sync-living-docs.d.ts.map +1 -1
  23. package/dist/plugins/specweave/lib/hooks/sync-living-docs.js +82 -12
  24. package/dist/plugins/specweave/lib/hooks/sync-living-docs.js.map +1 -1
  25. package/dist/plugins/specweave-github/lib/github-spec-content-sync.d.ts +2 -2
  26. package/dist/plugins/specweave-github/lib/github-spec-content-sync.d.ts.map +1 -1
  27. package/dist/plugins/specweave-github/lib/github-spec-content-sync.js +69 -10
  28. package/dist/plugins/specweave-github/lib/github-spec-content-sync.js.map +1 -1
  29. package/dist/src/cli/commands/detect-project.d.ts +9 -0
  30. package/dist/src/cli/commands/detect-project.d.ts.map +1 -0
  31. package/dist/src/cli/commands/detect-project.js +85 -0
  32. package/dist/src/cli/commands/detect-project.js.map +1 -0
  33. package/dist/src/cli/commands/detect-specs.d.ts +9 -0
  34. package/dist/src/cli/commands/detect-specs.d.ts.map +1 -0
  35. package/dist/src/cli/commands/detect-specs.js +73 -0
  36. package/dist/src/cli/commands/detect-specs.js.map +1 -0
  37. package/dist/src/cli/commands/init.d.ts.map +1 -1
  38. package/dist/src/cli/commands/init.js +8 -15
  39. package/dist/src/cli/commands/init.js.map +1 -1
  40. package/dist/src/core/living-docs/content-classifier.d.ts +83 -0
  41. package/dist/src/core/living-docs/content-classifier.d.ts.map +1 -0
  42. package/dist/src/core/living-docs/content-classifier.js +393 -0
  43. package/dist/src/core/living-docs/content-classifier.js.map +1 -0
  44. package/dist/src/core/living-docs/content-distributor.d.ts +126 -0
  45. package/dist/src/core/living-docs/content-distributor.d.ts.map +1 -0
  46. package/dist/src/core/living-docs/content-distributor.js +339 -0
  47. package/dist/src/core/living-docs/content-distributor.js.map +1 -0
  48. package/dist/src/core/living-docs/content-parser.d.ts +140 -0
  49. package/dist/src/core/living-docs/content-parser.d.ts.map +1 -0
  50. package/dist/src/core/living-docs/content-parser.js +316 -0
  51. package/dist/src/core/living-docs/content-parser.js.map +1 -0
  52. package/dist/src/core/living-docs/cross-linker.d.ts +126 -0
  53. package/dist/src/core/living-docs/cross-linker.d.ts.map +1 -0
  54. package/dist/src/core/living-docs/cross-linker.js +374 -0
  55. package/dist/src/core/living-docs/cross-linker.js.map +1 -0
  56. package/dist/src/core/living-docs/index.d.ts +89 -0
  57. package/dist/src/core/living-docs/index.d.ts.map +1 -0
  58. package/dist/src/core/living-docs/index.js +169 -0
  59. package/dist/src/core/living-docs/index.js.map +1 -0
  60. package/dist/src/core/living-docs/project-detector.d.ts +103 -0
  61. package/dist/src/core/living-docs/project-detector.d.ts.map +1 -0
  62. package/dist/src/core/living-docs/project-detector.js +314 -0
  63. package/dist/src/core/living-docs/project-detector.js.map +1 -0
  64. package/dist/src/core/repo-structure/prompt-consolidator.d.ts +1 -1
  65. package/dist/src/core/repo-structure/prompt-consolidator.d.ts.map +1 -1
  66. package/dist/src/core/repo-structure/prompt-consolidator.js +51 -22
  67. package/dist/src/core/repo-structure/prompt-consolidator.js.map +1 -1
  68. package/dist/src/core/repo-structure/repo-structure-manager.d.ts +2 -0
  69. package/dist/src/core/repo-structure/repo-structure-manager.d.ts.map +1 -1
  70. package/dist/src/core/repo-structure/repo-structure-manager.js +126 -62
  71. package/dist/src/core/repo-structure/repo-structure-manager.js.map +1 -1
  72. package/dist/src/core/spec-content-sync.d.ts +6 -0
  73. package/dist/src/core/spec-content-sync.d.ts.map +1 -1
  74. package/dist/src/core/spec-content-sync.js +25 -7
  75. package/dist/src/core/spec-content-sync.js.map +1 -1
  76. package/dist/src/core/spec-detector.d.ts +54 -0
  77. package/dist/src/core/spec-detector.d.ts.map +1 -0
  78. package/dist/src/core/spec-detector.js +197 -0
  79. package/dist/src/core/spec-detector.js.map +1 -0
  80. package/dist/src/core/spec-identifier-detector.d.ts +49 -0
  81. package/dist/src/core/spec-identifier-detector.d.ts.map +1 -0
  82. package/dist/src/core/spec-identifier-detector.js +198 -0
  83. package/dist/src/core/spec-identifier-detector.js.map +1 -0
  84. package/dist/src/core/types/spec-identifier.d.ts +67 -0
  85. package/dist/src/core/types/spec-identifier.d.ts.map +1 -0
  86. package/dist/src/core/types/spec-identifier.js +23 -0
  87. package/dist/src/core/types/spec-identifier.js.map +1 -0
  88. package/dist/src/utils/docs-preview/config-generator.d.ts.map +1 -1
  89. package/dist/src/utils/docs-preview/config-generator.js +11 -0
  90. package/dist/src/utils/docs-preview/config-generator.js.map +1 -1
  91. package/package.json +1 -1
  92. package/plugins/specweave/.claude-plugin/plugin.json +1 -1
  93. package/plugins/specweave/lib/hooks/sync-living-docs.js +61 -5
  94. package/plugins/specweave/lib/hooks/sync-living-docs.ts +102 -13
  95. package/plugins/specweave-ado/.claude-plugin/plugin.json +1 -1
  96. package/plugins/specweave-docs-preview/commands/preview.md +11 -11
  97. package/plugins/specweave-github/.claude-plugin/plugin.json +1 -1
  98. package/plugins/specweave-github/hooks/post-task-completion.sh +59 -30
  99. package/plugins/specweave-github/lib/github-spec-content-sync.js +55 -6
  100. package/plugins/specweave-github/lib/github-spec-content-sync.ts +84 -12
  101. package/plugins/specweave-jira/.claude-plugin/plugin.json +1 -1
  102. package/plugins/specweave-mobile/.claude-plugin/plugin.json +1 -4
  103. package/plugins/specweave-release/.claude-plugin/plugin.json +3 -15
  104. package/src/templates/AGENTS.md.template +297 -0
  105. package/plugins/specweave/plugin.json +0 -22
  106. package/plugins/specweave-ado/plugin.json +0 -20
  107. package/plugins/specweave-github/plugin.json +0 -19
  108. 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;AAEtG;;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,CAqDA;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAyC9C;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,CAa3E"}
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 separate repositories WITH parent repository',
36
- description: '1 parent repo (specs, docs) + N implementation repos (recommended for teams)',
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, increments)
38
+ my-project-parent/ ← Parent repo (specs, docs) - PUSHED TO GITHUB
39
39
  ├── .specweave/
40
- my-project-frontend/ ← Separate GitHub repo
41
- my-project-backend/ ← Separate GitHub repo
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 separate repositories WITHOUT parent repository',
47
- description: 'Each repo has its own .specweave/ (NOT RECOMMENDED - leads to fragmentation)',
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 repo
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
- **Example Structure:**
116
+ **Two parent approaches available:**
102
117
 
103
- my-project-parent/ ← Contains .specweave/ (cloned locally)
104
- ├── .specweave/
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 ← GitHub config
109
- └── .gitignore
110
-
111
- frontend/ ← Cloned from GitHub (root-level!)
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:** Implementation repos are cloned at root level for clean folder structure.
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,mBAAmB;gBAC1B,WAAW,EAAE,4BAA4B;gBACzC,OAAO,EAAE;;;;;;SAMR,CAAC,IAAI,EAAE;aACT;YACD;gBACE,KAAK,EAAE,mBAAmB;gBAC1B,KAAK,EAAE,uDAAuD;gBAC9D,WAAW,EAAE,8EAA8E;gBAC3F,OAAO,EAAE;;;;;SAKR,CAAC,IAAI,EAAE;aACT;YACD;gBACE,KAAK,EAAE,sBAAsB;gBAC7B,KAAK,EAAE,0DAA0D;gBACjE,WAAW,EAAE,8EAA8E;gBAC3F,OAAO,EAAE;;;;;SAKR,CAAC,IAAI,EAAE;aACT;YACD;gBACE,KAAK,EAAE,UAAU;gBACjB,KAAK,EAAE,2CAA2C;gBAClD,WAAW,EAAE,gFAAgF;gBAC7F,OAAO,EAAE;;;;;;;SAOR,CAAC,IAAI,EAAE;aACT;SACF;KACF,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,qBAAqB;IACnC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCN,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,mCAAmC,CAAC;QAC7C,KAAK,sBAAsB;YACzB,OAAO,sCAAsC,CAAC;QAChD,KAAK,UAAU;YACb,OAAO,UAAU,CAAC;QACpB;YACE,OAAO,MAAM,CAAC;IAClB,CAAC;AACH,CAAC"}
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;IAwDrD;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAe7B;;OAEG;YACW,WAAW;IAsBzB;;OAEG;YACW,mBAAmB;IA2GjC;;OAEG;YACW,kBAAkB;IAkRhC;;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"}
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"}