specweave 0.32.3 → 0.32.5
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 +12 -9
- package/dist/src/cli/commands/init-multiproject.js +1 -1
- package/dist/src/cli/commands/init-multiproject.js.map +1 -1
- package/dist/src/cli/commands/migrate-to-multiproject.js +2 -2
- package/dist/src/cli/commands/migrate-to-multiproject.js.map +1 -1
- package/dist/src/core/living-docs/cross-project-sync.d.ts +97 -0
- package/dist/src/core/living-docs/cross-project-sync.d.ts.map +1 -0
- package/dist/src/core/living-docs/cross-project-sync.js +135 -0
- package/dist/src/core/living-docs/cross-project-sync.js.map +1 -0
- package/dist/src/core/living-docs/external-sync-orchestrator.d.ts +106 -0
- package/dist/src/core/living-docs/external-sync-orchestrator.d.ts.map +1 -0
- package/dist/src/core/living-docs/external-sync-orchestrator.js +146 -0
- package/dist/src/core/living-docs/external-sync-orchestrator.js.map +1 -0
- package/dist/src/core/living-docs/living-docs-sync.d.ts +1 -0
- package/dist/src/core/living-docs/living-docs-sync.d.ts.map +1 -1
- package/dist/src/core/living-docs/living-docs-sync.js +77 -2
- package/dist/src/core/living-docs/living-docs-sync.js.map +1 -1
- package/dist/src/core/living-docs/sync-helpers/generators.d.ts +8 -1
- package/dist/src/core/living-docs/sync-helpers/generators.d.ts.map +1 -1
- package/dist/src/core/living-docs/sync-helpers/generators.js +18 -1
- package/dist/src/core/living-docs/sync-helpers/generators.js.map +1 -1
- package/dist/src/core/living-docs/sync-helpers/index.d.ts +1 -1
- package/dist/src/core/living-docs/sync-helpers/index.d.ts.map +1 -1
- package/dist/src/core/living-docs/sync-helpers/index.js.map +1 -1
- package/dist/src/core/living-docs/sync-helpers/parsers.d.ts +3 -1
- package/dist/src/core/living-docs/sync-helpers/parsers.d.ts.map +1 -1
- package/dist/src/core/living-docs/sync-helpers/parsers.js +24 -2
- package/dist/src/core/living-docs/sync-helpers/parsers.js.map +1 -1
- package/dist/src/core/living-docs/types.d.ts +6 -0
- package/dist/src/core/living-docs/types.d.ts.map +1 -1
- package/dist/src/core/living-docs/validators/index.d.ts +7 -0
- package/dist/src/core/living-docs/validators/index.d.ts.map +1 -0
- package/dist/src/core/living-docs/validators/index.js +7 -0
- package/dist/src/core/living-docs/validators/index.js.map +1 -0
- package/dist/src/core/living-docs/validators/project-validator.d.ts +92 -0
- package/dist/src/core/living-docs/validators/project-validator.d.ts.map +1 -0
- package/dist/src/core/living-docs/validators/project-validator.js +142 -0
- package/dist/src/core/living-docs/validators/project-validator.js.map +1 -0
- package/dist/src/core/project/project-manager.d.ts.map +1 -1
- package/dist/src/core/project/project-manager.js +19 -17
- package/dist/src/core/project/project-manager.js.map +1 -1
- package/dist/src/core/types/config.d.ts +4 -2
- package/dist/src/core/types/config.d.ts.map +1 -1
- package/dist/src/core/types/config.js.map +1 -1
- package/dist/src/core/types/increment-metadata.d.ts +34 -0
- package/dist/src/core/types/increment-metadata.d.ts.map +1 -1
- package/dist/src/utils/cross-cutting-detector.d.ts +66 -0
- package/dist/src/utils/cross-cutting-detector.d.ts.map +1 -0
- package/dist/src/utils/cross-cutting-detector.js +179 -0
- package/dist/src/utils/cross-cutting-detector.js.map +1 -0
- package/dist/src/utils/project-detection.d.ts +12 -8
- package/dist/src/utils/project-detection.d.ts.map +1 -1
- package/dist/src/utils/project-detection.js +13 -19
- package/dist/src/utils/project-detection.js.map +1 -1
- package/package.json +1 -1
- package/plugins/specweave/commands/specweave-status.md +64 -0
- package/plugins/specweave/hooks/hooks.json +1 -1
- package/plugins/specweave/hooks/spec-project-validator.sh +2 -1
- package/plugins/specweave/lib/vendor/core/types/increment-metadata.d.ts +34 -0
- package/plugins/specweave/skills/increment-planner/SKILL.md +77 -2
- package/plugins/specweave/skills/spec-generator/SKILL.md +78 -7
- package/plugins/specweave/commands/specweave-switch-project.md +0 -168
package/CLAUDE.md
CHANGED
|
@@ -19,26 +19,29 @@ For **contributors to SpecWeave itself** (not users).
|
|
|
19
19
|
# OR close completed increments: /specweave:done XXXX
|
|
20
20
|
```
|
|
21
21
|
|
|
22
|
-
### 1b. Max
|
|
22
|
+
### 1b. Max 25 Tasks Per Increment (SOFT LIMIT)
|
|
23
23
|
|
|
24
|
-
**>
|
|
24
|
+
**>25 tasks = consider splitting for maintainability**
|
|
25
25
|
|
|
26
26
|
```bash
|
|
27
27
|
# Check task count before starting work:
|
|
28
28
|
grep -c "^### T-" .specweave/increments/*/tasks.md
|
|
29
29
|
|
|
30
|
-
# If >
|
|
31
|
-
# Pattern: Feature →
|
|
30
|
+
# If >25 tasks: Consider splitting by phase
|
|
31
|
+
# Pattern: Feature → Phase1 (T-001 to T-008) + Phase2 (T-009 to T-016) + ...
|
|
32
32
|
```
|
|
33
33
|
|
|
34
|
-
**
|
|
34
|
+
**When to split (guidelines, not hard rules):**
|
|
35
|
+
- Tasks span unrelated subsystems
|
|
36
|
+
- Different teams would own different phases
|
|
37
|
+
- Review cycles would benefit from smaller PRs
|
|
38
|
+
|
|
39
|
+
**Phase-by-phase execution** (recommended for 15-25 tasks):
|
|
35
40
|
```
|
|
36
|
-
|
|
37
|
-
→ 0046-auth-system-ui/ (T-005 to T-008)
|
|
38
|
-
→ 0047-auth-system-tests/ (T-009 to T-012)
|
|
41
|
+
Execute Phase 1 → validate → continue to Phase 2 → ...
|
|
39
42
|
```
|
|
40
43
|
|
|
41
|
-
**Token budget per increment**: ~
|
|
44
|
+
**Token budget per increment**: ~80k tokens max (tasks + spec + plan + context)
|
|
42
45
|
|
|
43
46
|
### 2. Source of Truth
|
|
44
47
|
|
|
@@ -45,10 +45,10 @@ export async function initMultiProject(projectRoot) {
|
|
|
45
45
|
return;
|
|
46
46
|
}
|
|
47
47
|
// 3. Enable multi-project mode
|
|
48
|
+
// NOTE (v0.33.0): activeProject REMOVED - per-US project targeting replaces it
|
|
48
49
|
if (!config.multiProject) {
|
|
49
50
|
config.multiProject = {
|
|
50
51
|
enabled: true,
|
|
51
|
-
activeProject: projectId,
|
|
52
52
|
projects: {
|
|
53
53
|
[projectId]: {
|
|
54
54
|
id: projectId,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init-multiproject.js","sourceRoot":"","sources":["../../../../src/cli/commands/init-multiproject.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,cAAc,EAAkB,MAAM,uCAAuC,CAAC;AACvF,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AACxE,OAAO,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAG9F,mHAAmH;AACnH,yEAAyE;AACzE,mFAAmF;AACnF,4EAA4E;AAE5E,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,WAAmB;IACxD,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;IAEpD,IAAI,CAAC;QACH,6EAA6E;QAC7E,OAAO,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC;QACzE,MAAM,eAAe,GAAG,MAAM,wBAAwB,CAAC,WAAW,CAAC,CAAC;QAEpE,IAAI,eAAe,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtC,OAAO,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;YACvC,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC;YACvE,OAAO;QACT,CAAC;QAED,IAAI,eAAe,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxC,OAAO,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;YAC1C,eAAe,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,OAAO,EAAE,CAAC,CAAC,CAAC;QAC9E,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAEhB,wCAAwC;QACxC,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC;YAChC,OAAO,EAAE,4DAA4D;YACrE,OAAO,EAAE,KAAK;SACf,CAAC,CAAC;QAEH,MAAM,aAAa,GAAG,IAAI,aAAa,CAAC,WAAW,CAAC,CAAC;QACrD,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,EAAE,CAAC;QAEpC,yBAAyB;QACzB,MAAM,SAAS,GAAG,uBAAuB,CAAC,WAAW,CAAC,CAAC;QAEvD,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;YAClD,OAAO,CAAC,GAAG,CAAC,qBAAqB,SAAS,kCAAkC,CAAC,CAAC;YAC9E,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;YACrD,OAAO;QACT,CAAC;QAED,+BAA+B;QAC/B,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;YACzB,MAAM,CAAC,YAAY,GAAG;gBACpB,OAAO,EAAE,IAAI;gBACb,
|
|
1
|
+
{"version":3,"file":"init-multiproject.js","sourceRoot":"","sources":["../../../../src/cli/commands/init-multiproject.ts"],"names":[],"mappings":"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"}
|
|
@@ -42,10 +42,10 @@ export async function autoMigrateSingleToMulti(projectRoot) {
|
|
|
42
42
|
if (await fs.pathExists(projectPath)) {
|
|
43
43
|
console.log(`✅ Already using multi-project structure (projects/${projectId}/ exists)`);
|
|
44
44
|
// Update config to reflect reality
|
|
45
|
+
// NOTE (v0.33.0): activeProject REMOVED - per-US project targeting replaces it
|
|
45
46
|
if (!config.multiProject) {
|
|
46
47
|
config.multiProject = {
|
|
47
48
|
enabled: false,
|
|
48
|
-
activeProject: projectId,
|
|
49
49
|
projects: {
|
|
50
50
|
[projectId]: {
|
|
51
51
|
id: projectId,
|
|
@@ -79,10 +79,10 @@ export async function autoMigrateSingleToMulti(projectRoot) {
|
|
|
79
79
|
// 3. Create project structure with auto-detected ID
|
|
80
80
|
const projectManager = new ProjectManager(projectRoot);
|
|
81
81
|
// Ensure multiProject section exists
|
|
82
|
+
// NOTE (v0.33.0): activeProject REMOVED - per-US project targeting replaces it
|
|
82
83
|
if (!config.multiProject) {
|
|
83
84
|
config.multiProject = {
|
|
84
85
|
enabled: false, // Still single project, just using new structure
|
|
85
|
-
activeProject: projectId,
|
|
86
86
|
projects: {
|
|
87
87
|
[projectId]: {
|
|
88
88
|
id: projectId,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrate-to-multiproject.js","sourceRoot":"","sources":["../../../../src/cli/commands/migrate-to-multiproject.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,KAAK,EAAE,MAAM,0BAA0B,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAiB9F;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,WAAmB;IAEnB,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;IAEjE,MAAM,MAAM,GAAoB;QAC9B,OAAO,EAAE,KAAK;QACd,kBAAkB,EAAE,CAAC;QACrB,aAAa,EAAE,KAAK;QACpB,MAAM,EAAE,EAAE;QACV,QAAQ,EAAE,EAAE;KACb,CAAC;IAEF,IAAI,CAAC;QACH,MAAM,aAAa,GAAG,IAAI,aAAa,CAAC,WAAW,CAAC,CAAC;QACrD,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,EAAE,CAAC;QAEpC,iEAAiE;QACjE,MAAM,SAAS,GAAG,uBAAuB,CAAC,WAAW,CAAC,CAAC;QACvD,OAAO,CAAC,GAAG,CAAC,wBAAwB,SAAS,EAAE,CAAC,CAAC;QAEjD,4BAA4B;QAC5B,IAAI,MAAM,CAAC,YAAY,EAAE,OAAO,EAAE,CAAC;YACjC,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;YACjE,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;YACtB,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,2FAA2F;QAC3F,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAC3B,WAAW,EACX,qCAAqC,SAAS,EAAE,CACjD,CAAC;QAEF,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YACrC,OAAO,CAAC,GAAG,CAAC,qDAAqD,SAAS,WAAW,CAAC,CAAC;YAEvF,mCAAmC;YACnC,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;gBACzB,MAAM,CAAC,YAAY,GAAG;oBACpB,OAAO,EAAE,KAAK;oBACd,
|
|
1
|
+
{"version":3,"file":"migrate-to-multiproject.js","sourceRoot":"","sources":["../../../../src/cli/commands/migrate-to-multiproject.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cross-Project Sync Orchestrator
|
|
3
|
+
*
|
|
4
|
+
* Handles syncing increments that span multiple projects.
|
|
5
|
+
* Groups user stories by their target project and syncs each group
|
|
6
|
+
* to the appropriate project folder in living docs.
|
|
7
|
+
*
|
|
8
|
+
* @module core/living-docs/cross-project-sync
|
|
9
|
+
* @since v0.33.0
|
|
10
|
+
*/
|
|
11
|
+
import type { UserStoryData } from './types.js';
|
|
12
|
+
import { Logger } from '../../utils/logger.js';
|
|
13
|
+
/**
|
|
14
|
+
* Result of syncing to a single project
|
|
15
|
+
*/
|
|
16
|
+
export interface ProjectSyncResult {
|
|
17
|
+
projectId: string;
|
|
18
|
+
success: boolean;
|
|
19
|
+
userStories: string[];
|
|
20
|
+
filesCreated: string[];
|
|
21
|
+
filesUpdated: string[];
|
|
22
|
+
errors: string[];
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Result of syncing across multiple projects
|
|
26
|
+
*/
|
|
27
|
+
export interface MultiProjectSyncResult {
|
|
28
|
+
success: boolean;
|
|
29
|
+
projects: ProjectSyncResult[];
|
|
30
|
+
crossReferences: string[];
|
|
31
|
+
totalUserStories: number;
|
|
32
|
+
projectCount: number;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Options for cross-project sync
|
|
36
|
+
*/
|
|
37
|
+
export interface CrossProjectSyncOptions {
|
|
38
|
+
dryRun?: boolean;
|
|
39
|
+
force?: boolean;
|
|
40
|
+
generateCrossReferences?: boolean;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Cross-Project Sync Orchestrator
|
|
44
|
+
*/
|
|
45
|
+
export declare class CrossProjectSync {
|
|
46
|
+
private projectRoot;
|
|
47
|
+
private logger;
|
|
48
|
+
constructor(projectRoot: string, options?: {
|
|
49
|
+
logger?: Logger;
|
|
50
|
+
});
|
|
51
|
+
/**
|
|
52
|
+
* Group user stories by their target project
|
|
53
|
+
*
|
|
54
|
+
* @param userStories - User stories to group
|
|
55
|
+
* @param defaultProject - Default project for USs without explicit project
|
|
56
|
+
* @returns Map of project ID to user stories
|
|
57
|
+
*/
|
|
58
|
+
groupByProject(userStories: UserStoryData[], defaultProject: string): Map<string, UserStoryData[]>;
|
|
59
|
+
/**
|
|
60
|
+
* Check if an increment is cross-project (spans multiple projects)
|
|
61
|
+
*/
|
|
62
|
+
isCrossProject(userStories: UserStoryData[], defaultProject: string): boolean;
|
|
63
|
+
/**
|
|
64
|
+
* Get the specs folder path for a project
|
|
65
|
+
*/
|
|
66
|
+
getProjectSpecsPath(projectId: string): string;
|
|
67
|
+
/**
|
|
68
|
+
* Get the feature folder path for a project and feature
|
|
69
|
+
*/
|
|
70
|
+
getFeaturePath(projectId: string, featureId: string): string;
|
|
71
|
+
/**
|
|
72
|
+
* Ensure project specs folder exists
|
|
73
|
+
*/
|
|
74
|
+
ensureProjectFolder(projectId: string): Promise<string>;
|
|
75
|
+
/**
|
|
76
|
+
* Ensure feature folder exists within a project
|
|
77
|
+
*/
|
|
78
|
+
ensureFeatureFolder(projectId: string, featureId: string): Promise<string>;
|
|
79
|
+
/**
|
|
80
|
+
* Generate cross-references section for FEATURE.md
|
|
81
|
+
*
|
|
82
|
+
* @param featureId - The feature ID (e.g., "FS-125")
|
|
83
|
+
* @param allProjects - All projects this feature spans
|
|
84
|
+
* @param currentProject - The current project being generated
|
|
85
|
+
* @returns Markdown content for "Related Projects" section
|
|
86
|
+
*/
|
|
87
|
+
generateCrossReferences(featureId: string, allProjects: string[], currentProject: string): string;
|
|
88
|
+
/**
|
|
89
|
+
* Generate cross-reference frontmatter for US files
|
|
90
|
+
*/
|
|
91
|
+
generateRelatedProjectsFrontmatter(allProjects: string[], currentProject: string): string;
|
|
92
|
+
/**
|
|
93
|
+
* Log cross-project sync summary
|
|
94
|
+
*/
|
|
95
|
+
logSyncSummary(result: MultiProjectSyncResult): void;
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=cross-project-sync.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cross-project-sync.d.ts","sourceRoot":"","sources":["../../../../src/core/living-docs/cross-project-sync.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,KAAK,EAAE,aAAa,EAAc,MAAM,YAAY,CAAC;AAC5D,OAAO,EAAE,MAAM,EAAiB,MAAM,uBAAuB,CAAC;AAG9D;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,uBAAuB,CAAC,EAAE,OAAO,CAAC;CACnC;AAED;;GAEG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,MAAM,CAAS;gBAEX,WAAW,EAAE,MAAM,EAAE,OAAO,GAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAO;IAKlE;;;;;;OAMG;IACH,cAAc,CACZ,WAAW,EAAE,aAAa,EAAE,EAC5B,cAAc,EAAE,MAAM,GACrB,GAAG,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC;IAe/B;;OAEG;IACH,cAAc,CACZ,WAAW,EAAE,aAAa,EAAE,EAC5B,cAAc,EAAE,MAAM,GACrB,OAAO;IAKV;;OAEG;IACH,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAQ9C;;OAEG;IACH,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM;IAO5D;;OAEG;IACG,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAM7D;;OAEG;IACG,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAMhF;;;;;;;OAOG;IACH,uBAAuB,CACrB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EAAE,EACrB,cAAc,EAAE,MAAM,GACrB,MAAM;IAyBT;;OAEG;IACH,kCAAkC,CAChC,WAAW,EAAE,MAAM,EAAE,EACrB,cAAc,EAAE,MAAM,GACrB,MAAM;IAUT;;OAEG;IACH,cAAc,CAAC,MAAM,EAAE,sBAAsB,GAAG,IAAI;CAqBrD"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cross-Project Sync Orchestrator
|
|
3
|
+
*
|
|
4
|
+
* Handles syncing increments that span multiple projects.
|
|
5
|
+
* Groups user stories by their target project and syncs each group
|
|
6
|
+
* to the appropriate project folder in living docs.
|
|
7
|
+
*
|
|
8
|
+
* @module core/living-docs/cross-project-sync
|
|
9
|
+
* @since v0.33.0
|
|
10
|
+
*/
|
|
11
|
+
import * as path from 'node:path';
|
|
12
|
+
import { consoleLogger } from '../../utils/logger.js';
|
|
13
|
+
import { ensureDir } from '../../utils/fs-native.js';
|
|
14
|
+
/**
|
|
15
|
+
* Cross-Project Sync Orchestrator
|
|
16
|
+
*/
|
|
17
|
+
export class CrossProjectSync {
|
|
18
|
+
constructor(projectRoot, options = {}) {
|
|
19
|
+
this.projectRoot = projectRoot;
|
|
20
|
+
this.logger = options.logger ?? consoleLogger;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Group user stories by their target project
|
|
24
|
+
*
|
|
25
|
+
* @param userStories - User stories to group
|
|
26
|
+
* @param defaultProject - Default project for USs without explicit project
|
|
27
|
+
* @returns Map of project ID to user stories
|
|
28
|
+
*/
|
|
29
|
+
groupByProject(userStories, defaultProject) {
|
|
30
|
+
const groups = new Map();
|
|
31
|
+
for (const us of userStories) {
|
|
32
|
+
const project = us.project || defaultProject;
|
|
33
|
+
if (!groups.has(project)) {
|
|
34
|
+
groups.set(project, []);
|
|
35
|
+
}
|
|
36
|
+
groups.get(project).push(us);
|
|
37
|
+
}
|
|
38
|
+
return groups;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Check if an increment is cross-project (spans multiple projects)
|
|
42
|
+
*/
|
|
43
|
+
isCrossProject(userStories, defaultProject) {
|
|
44
|
+
const groups = this.groupByProject(userStories, defaultProject);
|
|
45
|
+
return groups.size > 1;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Get the specs folder path for a project
|
|
49
|
+
*/
|
|
50
|
+
getProjectSpecsPath(projectId) {
|
|
51
|
+
return path.join(this.projectRoot, '.specweave/docs/internal/specs', projectId);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Get the feature folder path for a project and feature
|
|
55
|
+
*/
|
|
56
|
+
getFeaturePath(projectId, featureId) {
|
|
57
|
+
return path.join(this.getProjectSpecsPath(projectId), featureId);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Ensure project specs folder exists
|
|
61
|
+
*/
|
|
62
|
+
async ensureProjectFolder(projectId) {
|
|
63
|
+
const folderPath = this.getProjectSpecsPath(projectId);
|
|
64
|
+
await ensureDir(folderPath);
|
|
65
|
+
return folderPath;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Ensure feature folder exists within a project
|
|
69
|
+
*/
|
|
70
|
+
async ensureFeatureFolder(projectId, featureId) {
|
|
71
|
+
const folderPath = this.getFeaturePath(projectId, featureId);
|
|
72
|
+
await ensureDir(folderPath);
|
|
73
|
+
return folderPath;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Generate cross-references section for FEATURE.md
|
|
77
|
+
*
|
|
78
|
+
* @param featureId - The feature ID (e.g., "FS-125")
|
|
79
|
+
* @param allProjects - All projects this feature spans
|
|
80
|
+
* @param currentProject - The current project being generated
|
|
81
|
+
* @returns Markdown content for "Related Projects" section
|
|
82
|
+
*/
|
|
83
|
+
generateCrossReferences(featureId, allProjects, currentProject) {
|
|
84
|
+
const otherProjects = allProjects.filter(p => p !== currentProject);
|
|
85
|
+
if (otherProjects.length === 0) {
|
|
86
|
+
return '';
|
|
87
|
+
}
|
|
88
|
+
const lines = [
|
|
89
|
+
'',
|
|
90
|
+
'## Related Projects',
|
|
91
|
+
'',
|
|
92
|
+
'This feature spans multiple projects:',
|
|
93
|
+
''
|
|
94
|
+
];
|
|
95
|
+
for (const projectId of otherProjects) {
|
|
96
|
+
// Relative path from current project to other project
|
|
97
|
+
const relativePath = `../../${projectId}/${featureId}/`;
|
|
98
|
+
lines.push(`- [${projectId}](${relativePath})`);
|
|
99
|
+
}
|
|
100
|
+
lines.push('');
|
|
101
|
+
return lines.join('\n');
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Generate cross-reference frontmatter for US files
|
|
105
|
+
*/
|
|
106
|
+
generateRelatedProjectsFrontmatter(allProjects, currentProject) {
|
|
107
|
+
const otherProjects = allProjects.filter(p => p !== currentProject);
|
|
108
|
+
if (otherProjects.length === 0) {
|
|
109
|
+
return '';
|
|
110
|
+
}
|
|
111
|
+
return `related_projects: [${otherProjects.join(', ')}]`;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Log cross-project sync summary
|
|
115
|
+
*/
|
|
116
|
+
logSyncSummary(result) {
|
|
117
|
+
this.logger.log('');
|
|
118
|
+
this.logger.log('📦 Cross-Project Sync Summary:');
|
|
119
|
+
this.logger.log(` Projects: ${result.projectCount}`);
|
|
120
|
+
this.logger.log(` User Stories: ${result.totalUserStories}`);
|
|
121
|
+
for (const project of result.projects) {
|
|
122
|
+
const status = project.success ? '✅' : '❌';
|
|
123
|
+
this.logger.log(` ${status} ${project.projectId}: ${project.userStories.length} USs`);
|
|
124
|
+
if (project.errors.length > 0) {
|
|
125
|
+
for (const error of project.errors) {
|
|
126
|
+
this.logger.warn(` ⚠️ ${error}`);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
if (result.crossReferences.length > 0) {
|
|
131
|
+
this.logger.log(` 🔗 Cross-references: ${result.crossReferences.length} links created`);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=cross-project-sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cross-project-sync.js","sourceRoot":"","sources":["../../../../src/core/living-docs/cross-project-sync.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* External Sync Orchestrator
|
|
3
|
+
*
|
|
4
|
+
* Coordinates syncing user stories to multiple external tools based on
|
|
5
|
+
* per-US project targeting. Groups USs by their target project and
|
|
6
|
+
* syncs each group to the appropriate external system.
|
|
7
|
+
*
|
|
8
|
+
* @module core/living-docs/external-sync-orchestrator
|
|
9
|
+
* @since v0.33.0
|
|
10
|
+
*/
|
|
11
|
+
import type { UserStoryData } from './types.js';
|
|
12
|
+
import type { USExternalRefsMap } from '../types/increment-metadata.js';
|
|
13
|
+
import { Logger } from '../../utils/logger.js';
|
|
14
|
+
/**
|
|
15
|
+
* Project mapping configuration
|
|
16
|
+
*/
|
|
17
|
+
export interface ProjectMapping {
|
|
18
|
+
github?: {
|
|
19
|
+
owner: string;
|
|
20
|
+
repo: string;
|
|
21
|
+
};
|
|
22
|
+
jira?: {
|
|
23
|
+
project: string;
|
|
24
|
+
board?: string;
|
|
25
|
+
};
|
|
26
|
+
ado?: {
|
|
27
|
+
project: string;
|
|
28
|
+
areaPath?: string;
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Result of syncing a single US to an external tool
|
|
33
|
+
*/
|
|
34
|
+
export interface USSyncResult {
|
|
35
|
+
usId: string;
|
|
36
|
+
provider: 'github' | 'jira' | 'ado';
|
|
37
|
+
success: boolean;
|
|
38
|
+
issueNumber?: number | string;
|
|
39
|
+
url?: string;
|
|
40
|
+
error?: string;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Result of syncing all USs in a project group
|
|
44
|
+
*/
|
|
45
|
+
export interface ProjectSyncResult {
|
|
46
|
+
projectId: string;
|
|
47
|
+
provider: 'github' | 'jira' | 'ado';
|
|
48
|
+
success: boolean;
|
|
49
|
+
synced: USSyncResult[];
|
|
50
|
+
errors: string[];
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Result of complete cross-project sync
|
|
54
|
+
*/
|
|
55
|
+
export interface CrossProjectExternalSyncResult {
|
|
56
|
+
success: boolean;
|
|
57
|
+
projects: ProjectSyncResult[];
|
|
58
|
+
externalRefs: USExternalRefsMap;
|
|
59
|
+
summary: {
|
|
60
|
+
totalUSs: number;
|
|
61
|
+
syncedUSs: number;
|
|
62
|
+
failedUSs: number;
|
|
63
|
+
projectCount: number;
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* External Sync Orchestrator
|
|
68
|
+
*/
|
|
69
|
+
export declare class ExternalSyncOrchestrator {
|
|
70
|
+
private projectRoot;
|
|
71
|
+
private logger;
|
|
72
|
+
private projectMappings;
|
|
73
|
+
constructor(projectRoot: string, options?: {
|
|
74
|
+
logger?: Logger;
|
|
75
|
+
});
|
|
76
|
+
/**
|
|
77
|
+
* Load project mappings from config
|
|
78
|
+
*/
|
|
79
|
+
loadProjectMappings(): Promise<void>;
|
|
80
|
+
/**
|
|
81
|
+
* Get project mapping for a project ID
|
|
82
|
+
*/
|
|
83
|
+
getProjectMapping(projectId: string): ProjectMapping | undefined;
|
|
84
|
+
/**
|
|
85
|
+
* Group user stories by their target project
|
|
86
|
+
*/
|
|
87
|
+
groupUSsByProject(userStories: UserStoryData[], defaultProject: string): Map<string, UserStoryData[]>;
|
|
88
|
+
/**
|
|
89
|
+
* Get preferred provider for a US
|
|
90
|
+
* Priority: US.externalProvider > first available in mapping
|
|
91
|
+
*/
|
|
92
|
+
getPreferredProvider(us: UserStoryData, mapping: ProjectMapping): 'github' | 'jira' | 'ado' | null;
|
|
93
|
+
/**
|
|
94
|
+
* Build external refs map from sync results
|
|
95
|
+
*/
|
|
96
|
+
buildExternalRefsMap(results: ProjectSyncResult[]): USExternalRefsMap;
|
|
97
|
+
/**
|
|
98
|
+
* Log sync summary
|
|
99
|
+
*/
|
|
100
|
+
logSyncSummary(result: CrossProjectExternalSyncResult): void;
|
|
101
|
+
/**
|
|
102
|
+
* Create placeholder sync result for dry-run or when sync is skipped
|
|
103
|
+
*/
|
|
104
|
+
createPlaceholderResult(userStories: UserStoryData[], defaultProject: string): CrossProjectExternalSyncResult;
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=external-sync-orchestrator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"external-sync-orchestrator.d.ts","sourceRoot":"","sources":["../../../../src/core/living-docs/external-sync-orchestrator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,KAAK,EAAiB,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACvF,OAAO,EAAE,MAAM,EAAiB,MAAM,uBAAuB,CAAC;AAG9D;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE;QACP,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,IAAI,CAAC,EAAE;QACL,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,GAAG,CAAC,EAAE;QACJ,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,QAAQ,GAAG,MAAM,GAAG,KAAK,CAAC;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC9B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,QAAQ,GAAG,MAAM,GAAG,KAAK,CAAC;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,8BAA8B;IAC7C,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,YAAY,EAAE,iBAAiB,CAAC;IAChC,OAAO,EAAE;QACP,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;CACH;AAED;;GAEG;AACH,qBAAa,wBAAwB;IACnC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,eAAe,CAAsC;gBAEjD,WAAW,EAAE,MAAM,EAAE,OAAO,GAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAO;IAKlE;;OAEG;IACG,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC;IAa1C;;OAEG;IACH,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAIhE;;OAEG;IACH,iBAAiB,CACf,WAAW,EAAE,aAAa,EAAE,EAC5B,cAAc,EAAE,MAAM,GACrB,GAAG,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC;IAe/B;;;OAGG;IACH,oBAAoB,CAClB,EAAE,EAAE,aAAa,EACjB,OAAO,EAAE,cAAc,GACtB,QAAQ,GAAG,MAAM,GAAG,KAAK,GAAG,IAAI;IAcnC;;OAEG;IACH,oBAAoB,CAAC,OAAO,EAAE,iBAAiB,EAAE,GAAG,iBAAiB;IAwBrE;;OAEG;IACH,cAAc,CAAC,MAAM,EAAE,8BAA8B,GAAG,IAAI;IAkB5D;;OAEG;IACH,uBAAuB,CACrB,WAAW,EAAE,aAAa,EAAE,EAC5B,cAAc,EAAE,MAAM,GACrB,8BAA8B;CA0BlC"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* External Sync Orchestrator
|
|
3
|
+
*
|
|
4
|
+
* Coordinates syncing user stories to multiple external tools based on
|
|
5
|
+
* per-US project targeting. Groups USs by their target project and
|
|
6
|
+
* syncs each group to the appropriate external system.
|
|
7
|
+
*
|
|
8
|
+
* @module core/living-docs/external-sync-orchestrator
|
|
9
|
+
* @since v0.33.0
|
|
10
|
+
*/
|
|
11
|
+
import * as path from 'node:path';
|
|
12
|
+
import { consoleLogger } from '../../utils/logger.js';
|
|
13
|
+
import { pathExists, readJson } from './sync-helpers/file-utils.js';
|
|
14
|
+
/**
|
|
15
|
+
* External Sync Orchestrator
|
|
16
|
+
*/
|
|
17
|
+
export class ExternalSyncOrchestrator {
|
|
18
|
+
constructor(projectRoot, options = {}) {
|
|
19
|
+
this.projectMappings = {};
|
|
20
|
+
this.projectRoot = projectRoot;
|
|
21
|
+
this.logger = options.logger ?? consoleLogger;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Load project mappings from config
|
|
25
|
+
*/
|
|
26
|
+
async loadProjectMappings() {
|
|
27
|
+
const configPath = path.join(this.projectRoot, '.specweave/config.json');
|
|
28
|
+
if (await pathExists(configPath)) {
|
|
29
|
+
try {
|
|
30
|
+
const config = await readJson(configPath);
|
|
31
|
+
this.projectMappings = config.projectMappings || {};
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
this.logger.warn('Failed to load projectMappings from config');
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Get project mapping for a project ID
|
|
40
|
+
*/
|
|
41
|
+
getProjectMapping(projectId) {
|
|
42
|
+
return this.projectMappings[projectId];
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Group user stories by their target project
|
|
46
|
+
*/
|
|
47
|
+
groupUSsByProject(userStories, defaultProject) {
|
|
48
|
+
const groups = new Map();
|
|
49
|
+
for (const us of userStories) {
|
|
50
|
+
const project = us.project || defaultProject;
|
|
51
|
+
if (!groups.has(project)) {
|
|
52
|
+
groups.set(project, []);
|
|
53
|
+
}
|
|
54
|
+
groups.get(project).push(us);
|
|
55
|
+
}
|
|
56
|
+
return groups;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Get preferred provider for a US
|
|
60
|
+
* Priority: US.externalProvider > first available in mapping
|
|
61
|
+
*/
|
|
62
|
+
getPreferredProvider(us, mapping) {
|
|
63
|
+
// Explicit preference in US
|
|
64
|
+
if (us.externalProvider && mapping[us.externalProvider]) {
|
|
65
|
+
return us.externalProvider;
|
|
66
|
+
}
|
|
67
|
+
// Fall back to first available in mapping
|
|
68
|
+
if (mapping.github)
|
|
69
|
+
return 'github';
|
|
70
|
+
if (mapping.jira)
|
|
71
|
+
return 'jira';
|
|
72
|
+
if (mapping.ado)
|
|
73
|
+
return 'ado';
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Build external refs map from sync results
|
|
78
|
+
*/
|
|
79
|
+
buildExternalRefsMap(results) {
|
|
80
|
+
const refsMap = {};
|
|
81
|
+
for (const projectResult of results) {
|
|
82
|
+
for (const usResult of projectResult.synced) {
|
|
83
|
+
if (!usResult.success)
|
|
84
|
+
continue;
|
|
85
|
+
if (!refsMap[usResult.usId]) {
|
|
86
|
+
refsMap[usResult.usId] = {};
|
|
87
|
+
}
|
|
88
|
+
refsMap[usResult.usId][usResult.provider] = {
|
|
89
|
+
provider: usResult.provider,
|
|
90
|
+
issueNumber: usResult.issueNumber,
|
|
91
|
+
url: usResult.url,
|
|
92
|
+
targetProject: projectResult.projectId,
|
|
93
|
+
lastSynced: new Date().toISOString()
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return refsMap;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Log sync summary
|
|
101
|
+
*/
|
|
102
|
+
logSyncSummary(result) {
|
|
103
|
+
this.logger.log('');
|
|
104
|
+
this.logger.log('🔗 Cross-Project External Sync Summary:');
|
|
105
|
+
this.logger.log(` Projects: ${result.summary.projectCount}`);
|
|
106
|
+
this.logger.log(` User Stories: ${result.summary.syncedUSs}/${result.summary.totalUSs} synced`);
|
|
107
|
+
for (const project of result.projects) {
|
|
108
|
+
const status = project.success ? '✅' : '❌';
|
|
109
|
+
this.logger.log(` ${status} ${project.projectId} (${project.provider}): ${project.synced.length} USs`);
|
|
110
|
+
if (project.errors.length > 0) {
|
|
111
|
+
for (const error of project.errors) {
|
|
112
|
+
this.logger.warn(` ⚠️ ${error}`);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Create placeholder sync result for dry-run or when sync is skipped
|
|
119
|
+
*/
|
|
120
|
+
createPlaceholderResult(userStories, defaultProject) {
|
|
121
|
+
const groups = this.groupUSsByProject(userStories, defaultProject);
|
|
122
|
+
return {
|
|
123
|
+
success: true,
|
|
124
|
+
projects: [...groups.entries()].map(([projectId, stories]) => ({
|
|
125
|
+
projectId,
|
|
126
|
+
provider: 'github',
|
|
127
|
+
success: true,
|
|
128
|
+
synced: stories.map(us => ({
|
|
129
|
+
usId: us.id,
|
|
130
|
+
provider: 'github',
|
|
131
|
+
success: false,
|
|
132
|
+
error: 'Sync skipped (dry-run or SKIP_EXTERNAL_SYNC)'
|
|
133
|
+
})),
|
|
134
|
+
errors: []
|
|
135
|
+
})),
|
|
136
|
+
externalRefs: {},
|
|
137
|
+
summary: {
|
|
138
|
+
totalUSs: userStories.length,
|
|
139
|
+
syncedUSs: 0,
|
|
140
|
+
failedUSs: 0,
|
|
141
|
+
projectCount: groups.size
|
|
142
|
+
}
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=external-sync-orchestrator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"external-sync-orchestrator.js","sourceRoot":"","sources":["../../../../src/core/living-docs/external-sync-orchestrator.ts"],"names":[],"mappings":"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"}
|