specweave 0.32.10 → 0.33.3
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 +162 -1
- package/dist/plugins/specweave-ado/lib/per-us-sync.d.ts +120 -0
- package/dist/plugins/specweave-ado/lib/per-us-sync.d.ts.map +1 -0
- package/dist/plugins/specweave-ado/lib/per-us-sync.js +276 -0
- package/dist/plugins/specweave-ado/lib/per-us-sync.js.map +1 -0
- package/dist/plugins/specweave-github/lib/github-client-v2.d.ts +4 -1
- package/dist/plugins/specweave-github/lib/github-client-v2.d.ts.map +1 -1
- package/dist/plugins/specweave-github/lib/github-client-v2.js +13 -3
- package/dist/plugins/specweave-github/lib/github-client-v2.js.map +1 -1
- package/dist/plugins/specweave-github/lib/per-us-sync.d.ts +97 -0
- package/dist/plugins/specweave-github/lib/per-us-sync.d.ts.map +1 -0
- package/dist/plugins/specweave-github/lib/per-us-sync.js +274 -0
- package/dist/plugins/specweave-github/lib/per-us-sync.js.map +1 -0
- package/dist/plugins/specweave-jira/lib/per-us-sync.d.ts +113 -0
- package/dist/plugins/specweave-jira/lib/per-us-sync.d.ts.map +1 -0
- package/dist/plugins/specweave-jira/lib/per-us-sync.js +254 -0
- package/dist/plugins/specweave-jira/lib/per-us-sync.js.map +1 -0
- package/dist/src/cli/add-child-pid.d.ts +11 -0
- package/dist/src/cli/add-child-pid.d.ts.map +1 -0
- package/dist/src/cli/add-child-pid.js +42 -0
- package/dist/src/cli/add-child-pid.js.map +1 -0
- package/dist/src/cli/add-child-process.d.ts +15 -0
- package/dist/src/cli/add-child-process.d.ts.map +1 -0
- package/dist/src/cli/add-child-process.js +40 -0
- package/dist/src/cli/add-child-process.js.map +1 -0
- package/dist/src/cli/check-watchdog.d.ts +15 -0
- package/dist/src/cli/check-watchdog.d.ts.map +1 -0
- package/dist/src/cli/check-watchdog.js +47 -0
- package/dist/src/cli/check-watchdog.js.map +1 -0
- package/dist/src/cli/cleanup-zombies.d.ts +14 -0
- package/dist/src/cli/cleanup-zombies.d.ts.map +1 -0
- package/dist/src/cli/cleanup-zombies.js +268 -0
- package/dist/src/cli/cleanup-zombies.js.map +1 -0
- package/dist/src/cli/find-session-by-pid.d.ts +14 -0
- package/dist/src/cli/find-session-by-pid.d.ts.map +1 -0
- package/dist/src/cli/find-session-by-pid.js +45 -0
- package/dist/src/cli/find-session-by-pid.js.map +1 -0
- package/dist/src/cli/get-stale-sessions.d.ts +17 -0
- package/dist/src/cli/get-stale-sessions.d.ts.map +1 -0
- package/dist/src/cli/get-stale-sessions.js +36 -0
- package/dist/src/cli/get-stale-sessions.js.map +1 -0
- package/dist/src/cli/register-session.d.ts +16 -0
- package/dist/src/cli/register-session.d.ts.map +1 -0
- package/dist/src/cli/register-session.js +48 -0
- package/dist/src/cli/register-session.js.map +1 -0
- package/dist/src/cli/remove-session.d.ts +11 -0
- package/dist/src/cli/remove-session.d.ts.map +1 -0
- package/dist/src/cli/remove-session.js +36 -0
- package/dist/src/cli/remove-session.js.map +1 -0
- package/dist/src/cli/update-heartbeat.d.ts +11 -0
- package/dist/src/cli/update-heartbeat.d.ts.map +1 -0
- package/dist/src/cli/update-heartbeat.js +36 -0
- package/dist/src/cli/update-heartbeat.js.map +1 -0
- package/dist/src/config/types.d.ts +1208 -203
- package/dist/src/config/types.d.ts.map +1 -1
- package/dist/src/core/background/job-manager.d.ts +16 -0
- package/dist/src/core/background/job-manager.d.ts.map +1 -1
- package/dist/src/core/background/job-manager.js +110 -15
- package/dist/src/core/background/job-manager.js.map +1 -1
- package/dist/src/core/config/config-manager.d.ts.map +1 -1
- package/dist/src/core/config/config-manager.js +58 -0
- package/dist/src/core/config/config-manager.js.map +1 -1
- package/dist/src/core/config/types.d.ts +80 -0
- package/dist/src/core/config/types.d.ts.map +1 -1
- package/dist/src/core/config/types.js.map +1 -1
- package/dist/src/core/increment/increment-utils.d.ts +26 -1
- package/dist/src/core/increment/increment-utils.d.ts.map +1 -1
- package/dist/src/core/increment/increment-utils.js +66 -4
- package/dist/src/core/increment/increment-utils.js.map +1 -1
- package/dist/src/core/increment/status-change-sync-trigger.d.ts +3 -1
- package/dist/src/core/increment/status-change-sync-trigger.d.ts.map +1 -1
- package/dist/src/core/increment/status-change-sync-trigger.js +5 -2
- package/dist/src/core/increment/status-change-sync-trigger.js.map +1 -1
- package/dist/src/core/living-docs/cross-project-sync.d.ts +87 -15
- package/dist/src/core/living-docs/cross-project-sync.d.ts.map +1 -1
- package/dist/src/core/living-docs/cross-project-sync.js +147 -28
- package/dist/src/core/living-docs/cross-project-sync.js.map +1 -1
- package/dist/src/core/living-docs/intelligent-analyzer/architecture-generator.d.ts.map +1 -1
- package/dist/src/core/living-docs/intelligent-analyzer/architecture-generator.js +48 -12
- package/dist/src/core/living-docs/intelligent-analyzer/architecture-generator.js.map +1 -1
- package/dist/src/core/living-docs/intelligent-analyzer/cache-manager.d.ts +70 -0
- package/dist/src/core/living-docs/intelligent-analyzer/cache-manager.d.ts.map +1 -0
- package/dist/src/core/living-docs/intelligent-analyzer/cache-manager.js +188 -0
- package/dist/src/core/living-docs/intelligent-analyzer/cache-manager.js.map +1 -0
- package/dist/src/core/living-docs/intelligent-analyzer/dashboard-generator.d.ts +33 -0
- package/dist/src/core/living-docs/intelligent-analyzer/dashboard-generator.d.ts.map +1 -0
- package/dist/src/core/living-docs/intelligent-analyzer/dashboard-generator.js +290 -0
- package/dist/src/core/living-docs/intelligent-analyzer/dashboard-generator.js.map +1 -0
- package/dist/src/core/living-docs/intelligent-analyzer/deep-repo-analyzer.d.ts.map +1 -1
- package/dist/src/core/living-docs/intelligent-analyzer/deep-repo-analyzer.js +114 -11
- package/dist/src/core/living-docs/intelligent-analyzer/deep-repo-analyzer.js.map +1 -1
- package/dist/src/core/living-docs/intelligent-analyzer/graph-visualizer.d.ts +23 -0
- package/dist/src/core/living-docs/intelligent-analyzer/graph-visualizer.d.ts.map +1 -0
- package/dist/src/core/living-docs/intelligent-analyzer/graph-visualizer.js +283 -0
- package/dist/src/core/living-docs/intelligent-analyzer/graph-visualizer.js.map +1 -0
- package/dist/src/core/living-docs/intelligent-analyzer/mermaid-generator.d.ts +44 -0
- package/dist/src/core/living-docs/intelligent-analyzer/mermaid-generator.d.ts.map +1 -0
- package/dist/src/core/living-docs/intelligent-analyzer/mermaid-generator.js +61 -0
- package/dist/src/core/living-docs/intelligent-analyzer/mermaid-generator.js.map +1 -0
- package/dist/src/core/living-docs/intelligent-analyzer/orchestrator.d.ts +126 -0
- package/dist/src/core/living-docs/intelligent-analyzer/orchestrator.d.ts.map +1 -0
- package/dist/src/core/living-docs/intelligent-analyzer/orchestrator.js +378 -0
- package/dist/src/core/living-docs/intelligent-analyzer/orchestrator.js.map +1 -0
- package/dist/src/core/living-docs/intelligent-analyzer/organization-synthesizer.d.ts.map +1 -1
- package/dist/src/core/living-docs/intelligent-analyzer/organization-synthesizer.js +57 -0
- package/dist/src/core/living-docs/intelligent-analyzer/organization-synthesizer.js.map +1 -1
- package/dist/src/core/living-docs/intelligent-analyzer/pattern-analyzer.d.ts +82 -0
- package/dist/src/core/living-docs/intelligent-analyzer/pattern-analyzer.d.ts.map +1 -0
- package/dist/src/core/living-docs/intelligent-analyzer/pattern-analyzer.js +430 -0
- package/dist/src/core/living-docs/intelligent-analyzer/pattern-analyzer.js.map +1 -0
- package/dist/src/core/living-docs/intelligent-analyzer/repo-scanner.d.ts +84 -0
- package/dist/src/core/living-docs/intelligent-analyzer/repo-scanner.d.ts.map +1 -0
- package/dist/src/core/living-docs/intelligent-analyzer/repo-scanner.js +387 -0
- package/dist/src/core/living-docs/intelligent-analyzer/repo-scanner.js.map +1 -0
- package/dist/src/core/living-docs/intelligent-analyzer/report-writer.d.ts +61 -0
- package/dist/src/core/living-docs/intelligent-analyzer/report-writer.d.ts.map +1 -0
- package/dist/src/core/living-docs/intelligent-analyzer/report-writer.js +174 -0
- package/dist/src/core/living-docs/intelligent-analyzer/report-writer.js.map +1 -0
- package/dist/src/core/living-docs/intelligent-analyzer/types.d.ts +1 -1
- package/dist/src/core/living-docs/intelligent-analyzer/types.d.ts.map +1 -1
- package/dist/src/core/living-docs/living-docs-sync.d.ts.map +1 -1
- package/dist/src/core/living-docs/living-docs-sync.js +26 -22
- package/dist/src/core/living-docs/living-docs-sync.js.map +1 -1
- package/dist/src/core/living-docs/module-analyzer.d.ts +3 -0
- package/dist/src/core/living-docs/module-analyzer.d.ts.map +1 -1
- package/dist/src/core/living-docs/module-analyzer.js +40 -1
- package/dist/src/core/living-docs/module-analyzer.js.map +1 -1
- package/dist/src/core/living-docs/types.d.ts +24 -3
- package/dist/src/core/living-docs/types.d.ts.map +1 -1
- package/dist/src/core/qa/qa-runner.js +1 -1
- package/dist/src/core/qa/qa-runner.js.map +1 -1
- package/dist/src/core/scheduler/session-sync-executor.js +1 -1
- package/dist/src/core/scheduler/session-sync-executor.js.map +1 -1
- package/dist/src/core/status-line/status-line-updater.d.ts +1 -1
- package/dist/src/core/status-line/status-line-updater.d.ts.map +1 -1
- package/dist/src/core/status-line/status-line-updater.js +4 -3
- package/dist/src/core/status-line/status-line-updater.js.map +1 -1
- package/dist/src/core/types/config.d.ts +79 -0
- package/dist/src/core/types/config.d.ts.map +1 -1
- package/dist/src/core/types/config.js.map +1 -1
- package/dist/src/importers/jira-importer.d.ts.map +1 -1
- package/dist/src/importers/jira-importer.js +18 -9
- package/dist/src/importers/jira-importer.js.map +1 -1
- package/dist/src/init/architecture/types.d.ts +140 -33
- package/dist/src/init/architecture/types.d.ts.map +1 -1
- package/dist/src/init/compliance/types.d.ts +27 -30
- package/dist/src/init/compliance/types.d.ts.map +1 -1
- package/dist/src/init/repo/types.d.ts +34 -11
- package/dist/src/init/repo/types.d.ts.map +1 -1
- package/dist/src/init/research/src/config/types.d.ts +82 -15
- package/dist/src/init/research/src/config/types.d.ts.map +1 -1
- package/dist/src/init/research/types.d.ts +93 -38
- package/dist/src/init/research/types.d.ts.map +1 -1
- package/dist/src/init/team/types.d.ts +42 -4
- package/dist/src/init/team/types.d.ts.map +1 -1
- package/dist/src/sync/ado-reconciler.js +1 -1
- package/dist/src/sync/ado-reconciler.js.map +1 -1
- package/dist/src/sync/github-reconciler.js +1 -1
- package/dist/src/sync/github-reconciler.js.map +1 -1
- package/dist/src/sync/jira-reconciler.js +1 -1
- package/dist/src/sync/jira-reconciler.js.map +1 -1
- package/dist/src/sync/sync-coordinator.d.ts +20 -0
- package/dist/src/sync/sync-coordinator.d.ts.map +1 -1
- package/dist/src/sync/sync-coordinator.js +258 -33
- package/dist/src/sync/sync-coordinator.js.map +1 -1
- package/dist/src/types/session.d.ts +65 -0
- package/dist/src/types/session.d.ts.map +1 -0
- package/dist/src/types/session.js +8 -0
- package/dist/src/types/session.js.map +1 -0
- package/dist/src/utils/lock-manager.d.ts +48 -0
- package/dist/src/utils/lock-manager.d.ts.map +1 -0
- package/dist/src/utils/lock-manager.js +195 -0
- package/dist/src/utils/lock-manager.js.map +1 -0
- package/dist/src/utils/notification-manager.d.ts +45 -0
- package/dist/src/utils/notification-manager.d.ts.map +1 -0
- package/dist/src/utils/notification-manager.js +130 -0
- package/dist/src/utils/notification-manager.js.map +1 -0
- package/dist/src/utils/platform-utils.d.ts +136 -0
- package/dist/src/utils/platform-utils.d.ts.map +1 -0
- package/dist/src/utils/platform-utils.js +366 -0
- package/dist/src/utils/platform-utils.js.map +1 -0
- package/dist/src/utils/project-resolver.d.ts +156 -0
- package/dist/src/utils/project-resolver.d.ts.map +1 -0
- package/dist/src/utils/project-resolver.js +587 -0
- package/dist/src/utils/project-resolver.js.map +1 -0
- package/dist/src/utils/session-registry.d.ts +142 -0
- package/dist/src/utils/session-registry.d.ts.map +1 -0
- package/dist/src/utils/session-registry.js +480 -0
- package/dist/src/utils/session-registry.js.map +1 -0
- package/package.json +5 -2
- package/plugins/specweave/commands/specweave-living-docs.md +42 -0
- package/plugins/specweave/hooks/hooks.json +20 -0
- package/plugins/specweave/hooks/lib/update-active-increment.sh +2 -2
- package/plugins/specweave/hooks/lib/update-status-line.sh +1 -1
- package/plugins/specweave/hooks/post-increment-status-change.sh +3 -3
- package/plugins/specweave/hooks/post-metadata-change.sh +1 -1
- package/plugins/specweave/hooks/universal/hook-wrapper.cmd +26 -26
- package/plugins/specweave/hooks/universal/session-start.cmd +16 -16
- package/plugins/specweave/hooks/universal/session-start.ps1 +16 -16
- package/plugins/specweave/hooks/user-prompt-submit.sh +107 -5
- package/plugins/specweave/hooks/v2/guards/increment-root-guard.sh +61 -0
- package/plugins/specweave/hooks/v2/guards/per-us-project-validator.sh +281 -0
- package/plugins/specweave/hooks/v2/handlers/living-specs-handler.sh +29 -0
- package/plugins/specweave/hooks/v2/session-end.sh +69 -0
- package/plugins/specweave/hooks/v2/session-start.sh +81 -0
- package/plugins/specweave/lib/vendor/sync/github-reconciler.js +1 -1
- package/plugins/specweave/lib/vendor/sync/github-reconciler.js.map +1 -1
- package/plugins/specweave/scripts/heartbeat.sh +110 -0
- package/plugins/specweave/scripts/progress.js +34 -4
- package/plugins/specweave/scripts/read-jobs.sh +1 -1
- package/plugins/specweave/scripts/read-progress.sh +50 -5
- package/plugins/specweave/scripts/read-workflow.sh +1 -1
- package/plugins/specweave/scripts/session-watchdog.sh +65 -0
- package/plugins/specweave/scripts/status.js +28 -11
- package/plugins/specweave-ado/lib/per-us-sync.js +247 -0
- package/plugins/specweave-ado/lib/per-us-sync.ts +410 -0
- package/plugins/specweave-github/hooks/.specweave/logs/hooks-debug.log +738 -0
- package/plugins/specweave-github/lib/github-client-v2.js +10 -3
- package/plugins/specweave-github/lib/github-client-v2.ts +15 -3
- package/plugins/specweave-github/lib/per-us-sync.js +241 -0
- package/plugins/specweave-github/lib/per-us-sync.ts +375 -0
- package/plugins/specweave-jira/lib/per-us-sync.js +224 -0
- package/plugins/specweave-jira/lib/per-us-sync.ts +366 -0
- package/plugins/specweave-release/hooks/.specweave/logs/dora-tracking.log +1107 -0
|
@@ -41,6 +41,11 @@ export class IncrementNumberManager {
|
|
|
41
41
|
/**
|
|
42
42
|
* Get the next available increment number across all directories.
|
|
43
43
|
*
|
|
44
|
+
* GAP-FILLING STRATEGY (v0.33.1+):
|
|
45
|
+
* - Finds the first available number starting from 0001
|
|
46
|
+
* - Prevents gaps in increment numbering sequence
|
|
47
|
+
* - If no gaps exist, returns highest + 1
|
|
48
|
+
*
|
|
44
49
|
* ALWAYS performs fresh filesystem scan to guarantee unique IDs.
|
|
45
50
|
* No caching - simplicity over premature optimization.
|
|
46
51
|
*
|
|
@@ -50,17 +55,26 @@ export class IncrementNumberManager {
|
|
|
50
55
|
*
|
|
51
56
|
* @example
|
|
52
57
|
* ```typescript
|
|
58
|
+
* // If increments [0001, 0002, 0004, 0005] exist:
|
|
59
|
+
* const nextId = IncrementNumberManager.getNextIncrementNumber();
|
|
60
|
+
* // "0003" - fills the gap!
|
|
61
|
+
*
|
|
62
|
+
* // If increments [0001, 0002, 0003] exist:
|
|
53
63
|
* const nextId = IncrementNumberManager.getNextIncrementNumber();
|
|
54
|
-
* // "
|
|
64
|
+
* // "0004" - sequential if no gaps
|
|
55
65
|
* ```
|
|
56
66
|
*/
|
|
57
67
|
static getNextIncrementNumber(projectRoot = process.cwd(), _useCache = true // Ignored - always fresh scan
|
|
58
68
|
) {
|
|
59
69
|
const incrementsDir = path.join(projectRoot, '.specweave', 'increments');
|
|
60
70
|
// ALWAYS scan fresh - no caching to prevent duplicate ID bugs
|
|
61
|
-
const
|
|
62
|
-
|
|
63
|
-
|
|
71
|
+
const existingNumbers = this.getAllIncrementNumbers(incrementsDir);
|
|
72
|
+
// Gap-filling: Find first available number starting from 1
|
|
73
|
+
let candidate = 1;
|
|
74
|
+
while (existingNumbers.has(candidate)) {
|
|
75
|
+
candidate++;
|
|
76
|
+
}
|
|
77
|
+
return String(candidate).padStart(4, '0');
|
|
64
78
|
}
|
|
65
79
|
/**
|
|
66
80
|
* @deprecated No-op, kept for API compatibility. Cache was removed in v0.30.21.
|
|
@@ -122,6 +136,54 @@ export class IncrementNumberManager {
|
|
|
122
136
|
}
|
|
123
137
|
return false;
|
|
124
138
|
}
|
|
139
|
+
/**
|
|
140
|
+
* Get all existing increment numbers across all directories.
|
|
141
|
+
*
|
|
142
|
+
* Returns a Set of all increment numbers found in:
|
|
143
|
+
* 1. .specweave/increments/ (main)
|
|
144
|
+
* 2. .specweave/increments/_archive/
|
|
145
|
+
* 3. .specweave/increments/_abandoned/
|
|
146
|
+
* 4. .specweave/increments/_paused/
|
|
147
|
+
*
|
|
148
|
+
* @param incrementsDir - Path to .specweave/increments directory
|
|
149
|
+
* @returns Set of increment numbers (e.g., Set([1, 2, 4, 5]))
|
|
150
|
+
* @private
|
|
151
|
+
* @since 0.33.1
|
|
152
|
+
*/
|
|
153
|
+
static getAllIncrementNumbers(incrementsDir) {
|
|
154
|
+
const numbers = new Set();
|
|
155
|
+
// Directories to scan
|
|
156
|
+
const dirsToScan = [
|
|
157
|
+
incrementsDir,
|
|
158
|
+
path.join(incrementsDir, '_archive'),
|
|
159
|
+
path.join(incrementsDir, '_abandoned'),
|
|
160
|
+
path.join(incrementsDir, '_paused')
|
|
161
|
+
];
|
|
162
|
+
// Scan each directory
|
|
163
|
+
for (const dirPath of dirsToScan) {
|
|
164
|
+
if (!fs.existsSync(dirPath))
|
|
165
|
+
continue;
|
|
166
|
+
try {
|
|
167
|
+
const entries = fs.readdirSync(dirPath, { withFileTypes: true });
|
|
168
|
+
for (const entry of entries) {
|
|
169
|
+
if (!entry.isDirectory())
|
|
170
|
+
continue;
|
|
171
|
+
// Match pattern: 0032-name, 032-name, or 0032E-name (external)
|
|
172
|
+
const match = entry.name.match(/^(\d{3,4})E?-/);
|
|
173
|
+
if (match) {
|
|
174
|
+
const number = parseInt(match[1], 10);
|
|
175
|
+
numbers.add(number);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
catch (error) {
|
|
180
|
+
// Permission denied or other error - log warning and continue
|
|
181
|
+
console.warn(`Warning: Could not scan directory ${dirPath}:`, error.message);
|
|
182
|
+
continue;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
return numbers;
|
|
186
|
+
}
|
|
125
187
|
/**
|
|
126
188
|
* Scan all increment directories and return highest number found.
|
|
127
189
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"increment-utils.js","sourceRoot":"","sources":["../../../../src/core/increment/increment-utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,OAAO,sBAAsB;IACjC
|
|
1
|
+
{"version":3,"file":"increment-utils.js","sourceRoot":"","sources":["../../../../src/core/increment/increment-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -57,7 +57,8 @@ export declare class StatusChangeSyncTrigger {
|
|
|
57
57
|
*
|
|
58
58
|
* SYNC-WORTHY TRANSITIONS:
|
|
59
59
|
* - planning → active (work started)
|
|
60
|
-
* - active → completed (work finished)
|
|
60
|
+
* - active → completed (work finished - legacy direct completion)
|
|
61
|
+
* - ready_for_review → completed (work approved - v0.28.63+ user confirmation)
|
|
61
62
|
* - completed → active (work reopened)
|
|
62
63
|
* - backlog → active (backlog item started)
|
|
63
64
|
* - paused → active (work resumed)
|
|
@@ -65,6 +66,7 @@ export declare class StatusChangeSyncTrigger {
|
|
|
65
66
|
* NOT SYNC-WORTHY:
|
|
66
67
|
* - active → paused (temporary pause)
|
|
67
68
|
* - active → backlog (deprioritized)
|
|
69
|
+
* - active → ready_for_review (internal state - sync when actually completed)
|
|
68
70
|
* - Any → abandoned (cancelled)
|
|
69
71
|
*
|
|
70
72
|
* @param oldStatus - Previous status
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status-change-sync-trigger.d.ts","sourceRoot":"","sources":["../../../../src/core/increment/status-change-sync-trigger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAEjE,OAAO,EAAE,MAAM,EAAiB,MAAM,uBAAuB,CAAC;AAE9D,qBAAa,uBAAuB;IAClC,OAAO,CAAC,MAAM,CAAC,cAAc,CAA4B;IACzD,OAAO,CAAC,MAAM,CAAC,MAAM,CAAyB;IAE9C;;;;;;;;;OASG;WACU,eAAe,CAC1B,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,eAAe,EAC1B,SAAS,EAAE,eAAe,GACzB,OAAO,CAAC,IAAI,CAAC;IAqChB;;;;;;;;;;OAUG;mBACkB,mBAAmB;IAgCxC
|
|
1
|
+
{"version":3,"file":"status-change-sync-trigger.d.ts","sourceRoot":"","sources":["../../../../src/core/increment/status-change-sync-trigger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAEjE,OAAO,EAAE,MAAM,EAAiB,MAAM,uBAAuB,CAAC;AAE9D,qBAAa,uBAAuB;IAClC,OAAO,CAAC,MAAM,CAAC,cAAc,CAA4B;IACzD,OAAO,CAAC,MAAM,CAAC,MAAM,CAAyB;IAE9C;;;;;;;;;OASG;WACU,eAAe,CAC1B,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,eAAe,EAC1B,SAAS,EAAE,eAAe,GACzB,OAAO,CAAC,IAAI,CAAC;IAqChB;;;;;;;;;;OAUG;mBACkB,mBAAmB;IAgCxC;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,OAAO,CAAC,MAAM,CAAC,YAAY;IAkB3B;;;;;;;OAOG;mBACkB,cAAc;IAsBnC;;OAEG;IACH,MAAM,CAAC,sBAAsB;IAI7B;;OAEG;IACH,MAAM,CAAC,mBAAmB,IAAI,IAAI;IAIlC;;OAEG;IACH,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;CAGvC"}
|
|
@@ -111,7 +111,8 @@ export class StatusChangeSyncTrigger {
|
|
|
111
111
|
*
|
|
112
112
|
* SYNC-WORTHY TRANSITIONS:
|
|
113
113
|
* - planning → active (work started)
|
|
114
|
-
* - active → completed (work finished)
|
|
114
|
+
* - active → completed (work finished - legacy direct completion)
|
|
115
|
+
* - ready_for_review → completed (work approved - v0.28.63+ user confirmation)
|
|
115
116
|
* - completed → active (work reopened)
|
|
116
117
|
* - backlog → active (backlog item started)
|
|
117
118
|
* - paused → active (work resumed)
|
|
@@ -119,6 +120,7 @@ export class StatusChangeSyncTrigger {
|
|
|
119
120
|
* NOT SYNC-WORTHY:
|
|
120
121
|
* - active → paused (temporary pause)
|
|
121
122
|
* - active → backlog (deprioritized)
|
|
123
|
+
* - active → ready_for_review (internal state - sync when actually completed)
|
|
122
124
|
* - Any → abandoned (cancelled)
|
|
123
125
|
*
|
|
124
126
|
* @param oldStatus - Previous status
|
|
@@ -129,7 +131,8 @@ export class StatusChangeSyncTrigger {
|
|
|
129
131
|
const transition = `${oldStatus} → ${newStatus}`;
|
|
130
132
|
const SYNC_WORTHY = [
|
|
131
133
|
'planning → active', // Work started
|
|
132
|
-
'active → completed', // Work finished
|
|
134
|
+
'active → completed', // Work finished (legacy direct completion)
|
|
135
|
+
'ready_for_review → completed', // Work approved (v0.28.63+ user confirmation)
|
|
133
136
|
'completed → active', // Work reopened
|
|
134
137
|
'backlog → active', // Backlog item started
|
|
135
138
|
'paused → active' // Work resumed
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status-change-sync-trigger.js","sourceRoot":"","sources":["../../../../src/core/increment/status-change-sync-trigger.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"status-change-sync-trigger.js","sourceRoot":"","sources":["../../../../src/core/increment/status-change-sync-trigger.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,8 +5,11 @@
|
|
|
5
5
|
* Groups user stories by their target project and syncs each group
|
|
6
6
|
* to the appropriate project folder in living docs.
|
|
7
7
|
*
|
|
8
|
+
* Supports both 1-level (project) and 2-level (project/board) structures.
|
|
9
|
+
*
|
|
8
10
|
* @module core/living-docs/cross-project-sync
|
|
9
11
|
* @since v0.33.0
|
|
12
|
+
* @updated v0.34.0 - Added 2-level structure support (project/board)
|
|
10
13
|
*/
|
|
11
14
|
import type { UserStoryData } from './types.js';
|
|
12
15
|
import { Logger } from '../../utils/logger.js';
|
|
@@ -45,50 +48,119 @@ export interface CrossProjectSyncOptions {
|
|
|
45
48
|
export declare class CrossProjectSync {
|
|
46
49
|
private projectRoot;
|
|
47
50
|
private logger;
|
|
51
|
+
private structureConfig;
|
|
48
52
|
constructor(projectRoot: string, options?: {
|
|
49
53
|
logger?: Logger;
|
|
50
54
|
});
|
|
51
55
|
/**
|
|
52
|
-
*
|
|
56
|
+
* Get structure level configuration (cached)
|
|
57
|
+
*/
|
|
58
|
+
private getStructureConfig;
|
|
59
|
+
/**
|
|
60
|
+
* Check if 2-level structure is detected
|
|
61
|
+
*/
|
|
62
|
+
is2LevelStructure(): boolean;
|
|
63
|
+
/**
|
|
64
|
+
* Get full target path for a user story
|
|
65
|
+
*
|
|
66
|
+
* For 1-level: returns project
|
|
67
|
+
* For 2-level: returns project/board
|
|
68
|
+
*
|
|
69
|
+
* @param us - User story
|
|
70
|
+
* @param defaultProject - Default project if US doesn't specify
|
|
71
|
+
* @param defaultBoard - Default board if US doesn't specify (2-level only)
|
|
72
|
+
* @returns Full path like "project" or "project/board"
|
|
73
|
+
*/
|
|
74
|
+
getUSTargetPath(us: UserStoryData, defaultProject: string, defaultBoard?: string): string;
|
|
75
|
+
/**
|
|
76
|
+
* Group user stories by their target path (project or project/board)
|
|
53
77
|
*
|
|
54
78
|
* @param userStories - User stories to group
|
|
55
79
|
* @param defaultProject - Default project for USs without explicit project
|
|
56
|
-
* @
|
|
80
|
+
* @param defaultBoard - Default board for USs without explicit board (2-level only)
|
|
81
|
+
* @returns Map of target path to user stories
|
|
82
|
+
*/
|
|
83
|
+
groupByProject(userStories: UserStoryData[], defaultProject: string, defaultBoard?: string): Map<string, UserStoryData[]>;
|
|
84
|
+
/**
|
|
85
|
+
* Group user stories by project only (ignoring board)
|
|
86
|
+
* Useful for project-level operations like external sync
|
|
57
87
|
*/
|
|
58
|
-
|
|
88
|
+
groupByProjectOnly(userStories: UserStoryData[], defaultProject: string): Map<string, UserStoryData[]>;
|
|
59
89
|
/**
|
|
60
|
-
* Check if an increment is cross-project (spans multiple projects)
|
|
90
|
+
* Check if an increment is cross-project (spans multiple projects/boards)
|
|
91
|
+
*
|
|
92
|
+
* For 1-level: checks if USs target different projects
|
|
93
|
+
* For 2-level: checks if USs target different project/board combinations
|
|
61
94
|
*/
|
|
62
|
-
isCrossProject(userStories: UserStoryData[], defaultProject: string): boolean;
|
|
95
|
+
isCrossProject(userStories: UserStoryData[], defaultProject: string, defaultBoard?: string): boolean;
|
|
63
96
|
/**
|
|
64
|
-
*
|
|
97
|
+
* Check if an increment spans multiple projects (ignoring boards)
|
|
98
|
+
* Useful for external sync which groups at project level
|
|
99
|
+
*/
|
|
100
|
+
spansMultipleProjects(userStories: UserStoryData[], defaultProject: string): boolean;
|
|
101
|
+
/**
|
|
102
|
+
* Get the specs folder path for a target path
|
|
103
|
+
* Handles both 1-level (project) and 2-level (project/board)
|
|
104
|
+
*
|
|
105
|
+
* @param targetPath - Either "project" or "project/board"
|
|
106
|
+
*/
|
|
107
|
+
getSpecsPath(targetPath: string): string;
|
|
108
|
+
/**
|
|
109
|
+
* Get the specs folder path for a project (legacy, 1-level only)
|
|
110
|
+
* @deprecated Use getSpecsPath() instead for 2-level support
|
|
65
111
|
*/
|
|
66
112
|
getProjectSpecsPath(projectId: string): string;
|
|
67
113
|
/**
|
|
68
|
-
* Get the feature folder path for a
|
|
114
|
+
* Get the feature folder path for a target path and feature
|
|
115
|
+
* Handles both 1-level and 2-level structures
|
|
116
|
+
*
|
|
117
|
+
* @param targetPath - Either "project" or "project/board"
|
|
118
|
+
* @param featureId - Feature ID (e.g., "FS-125")
|
|
119
|
+
*/
|
|
120
|
+
getFeaturePath(targetPath: string, featureId: string): string;
|
|
121
|
+
/**
|
|
122
|
+
* Ensure specs folder exists for a target path
|
|
123
|
+
* Handles both 1-level and 2-level structures
|
|
69
124
|
*/
|
|
70
|
-
|
|
125
|
+
ensureSpecsFolder(targetPath: string): Promise<string>;
|
|
71
126
|
/**
|
|
72
|
-
* Ensure project specs folder exists
|
|
127
|
+
* Ensure project specs folder exists (legacy, 1-level only)
|
|
128
|
+
* @deprecated Use ensureSpecsFolder() instead
|
|
73
129
|
*/
|
|
74
130
|
ensureProjectFolder(projectId: string): Promise<string>;
|
|
75
131
|
/**
|
|
76
|
-
* Ensure feature folder exists within a
|
|
132
|
+
* Ensure feature folder exists within a target path
|
|
133
|
+
* Handles both 1-level and 2-level structures
|
|
77
134
|
*/
|
|
78
|
-
ensureFeatureFolder(
|
|
135
|
+
ensureFeatureFolder(targetPath: string, featureId: string): Promise<string>;
|
|
79
136
|
/**
|
|
80
137
|
* Generate cross-references section for FEATURE.md
|
|
81
138
|
*
|
|
82
139
|
* @param featureId - The feature ID (e.g., "FS-125")
|
|
83
|
-
* @param
|
|
84
|
-
* @param
|
|
140
|
+
* @param allTargetPaths - All target paths this feature spans (can be "project" or "project/board")
|
|
141
|
+
* @param currentTargetPath - The current target path being generated
|
|
85
142
|
* @returns Markdown content for "Related Projects" section
|
|
86
143
|
*/
|
|
87
|
-
generateCrossReferences(featureId: string,
|
|
144
|
+
generateCrossReferences(featureId: string, allTargetPaths: string[], currentTargetPath: string): string;
|
|
88
145
|
/**
|
|
89
146
|
* Generate cross-reference frontmatter for US files
|
|
147
|
+
*
|
|
148
|
+
* @param allTargetPaths - All target paths (can be "project" or "project/board")
|
|
149
|
+
* @param currentTargetPath - Current target path
|
|
150
|
+
*/
|
|
151
|
+
generateRelatedProjectsFrontmatter(allTargetPaths: string[], currentTargetPath: string): string;
|
|
152
|
+
/**
|
|
153
|
+
* Extract project ID from target path
|
|
154
|
+
* "project" -> "project"
|
|
155
|
+
* "project/board" -> "project"
|
|
156
|
+
*/
|
|
157
|
+
extractProjectId(targetPath: string): string;
|
|
158
|
+
/**
|
|
159
|
+
* Extract board ID from target path (for 2-level structures)
|
|
160
|
+
* "project" -> undefined
|
|
161
|
+
* "project/board" -> "board"
|
|
90
162
|
*/
|
|
91
|
-
|
|
163
|
+
extractBoardId(targetPath: string): string | undefined;
|
|
92
164
|
/**
|
|
93
165
|
* Log cross-project sync summary
|
|
94
166
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cross-project-sync.d.ts","sourceRoot":"","sources":["../../../../src/core/living-docs/cross-project-sync.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"cross-project-sync.d.ts","sourceRoot":"","sources":["../../../../src/core/living-docs/cross-project-sync.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,28 +5,83 @@
|
|
|
5
5
|
* Groups user stories by their target project and syncs each group
|
|
6
6
|
* to the appropriate project folder in living docs.
|
|
7
7
|
*
|
|
8
|
+
* Supports both 1-level (project) and 2-level (project/board) structures.
|
|
9
|
+
*
|
|
8
10
|
* @module core/living-docs/cross-project-sync
|
|
9
11
|
* @since v0.33.0
|
|
12
|
+
* @updated v0.34.0 - Added 2-level structure support (project/board)
|
|
10
13
|
*/
|
|
11
14
|
import * as path from 'node:path';
|
|
12
15
|
import { consoleLogger } from '../../utils/logger.js';
|
|
13
16
|
import { ensureDir } from '../../utils/fs-native.js';
|
|
17
|
+
import { detectStructureLevel } from '../../utils/structure-level-detector.js';
|
|
14
18
|
/**
|
|
15
19
|
* Cross-Project Sync Orchestrator
|
|
16
20
|
*/
|
|
17
21
|
export class CrossProjectSync {
|
|
18
22
|
constructor(projectRoot, options = {}) {
|
|
23
|
+
this.structureConfig = null;
|
|
19
24
|
this.projectRoot = projectRoot;
|
|
20
25
|
this.logger = options.logger ?? consoleLogger;
|
|
21
26
|
}
|
|
22
27
|
/**
|
|
23
|
-
*
|
|
28
|
+
* Get structure level configuration (cached)
|
|
29
|
+
*/
|
|
30
|
+
getStructureConfig() {
|
|
31
|
+
if (!this.structureConfig) {
|
|
32
|
+
this.structureConfig = detectStructureLevel(this.projectRoot);
|
|
33
|
+
}
|
|
34
|
+
return this.structureConfig;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Check if 2-level structure is detected
|
|
38
|
+
*/
|
|
39
|
+
is2LevelStructure() {
|
|
40
|
+
return this.getStructureConfig().level === 2;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Get full target path for a user story
|
|
44
|
+
*
|
|
45
|
+
* For 1-level: returns project
|
|
46
|
+
* For 2-level: returns project/board
|
|
47
|
+
*
|
|
48
|
+
* @param us - User story
|
|
49
|
+
* @param defaultProject - Default project if US doesn't specify
|
|
50
|
+
* @param defaultBoard - Default board if US doesn't specify (2-level only)
|
|
51
|
+
* @returns Full path like "project" or "project/board"
|
|
52
|
+
*/
|
|
53
|
+
getUSTargetPath(us, defaultProject, defaultBoard) {
|
|
54
|
+
const project = us.project || defaultProject;
|
|
55
|
+
if (this.is2LevelStructure()) {
|
|
56
|
+
const board = us.board || defaultBoard || 'default';
|
|
57
|
+
return `${project}/${board}`;
|
|
58
|
+
}
|
|
59
|
+
return project;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Group user stories by their target path (project or project/board)
|
|
24
63
|
*
|
|
25
64
|
* @param userStories - User stories to group
|
|
26
65
|
* @param defaultProject - Default project for USs without explicit project
|
|
27
|
-
* @
|
|
66
|
+
* @param defaultBoard - Default board for USs without explicit board (2-level only)
|
|
67
|
+
* @returns Map of target path to user stories
|
|
68
|
+
*/
|
|
69
|
+
groupByProject(userStories, defaultProject, defaultBoard) {
|
|
70
|
+
const groups = new Map();
|
|
71
|
+
for (const us of userStories) {
|
|
72
|
+
const targetPath = this.getUSTargetPath(us, defaultProject, defaultBoard);
|
|
73
|
+
if (!groups.has(targetPath)) {
|
|
74
|
+
groups.set(targetPath, []);
|
|
75
|
+
}
|
|
76
|
+
groups.get(targetPath).push(us);
|
|
77
|
+
}
|
|
78
|
+
return groups;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Group user stories by project only (ignoring board)
|
|
82
|
+
* Useful for project-level operations like external sync
|
|
28
83
|
*/
|
|
29
|
-
|
|
84
|
+
groupByProjectOnly(userStories, defaultProject) {
|
|
30
85
|
const groups = new Map();
|
|
31
86
|
for (const us of userStories) {
|
|
32
87
|
const project = us.project || defaultProject;
|
|
@@ -38,26 +93,61 @@ export class CrossProjectSync {
|
|
|
38
93
|
return groups;
|
|
39
94
|
}
|
|
40
95
|
/**
|
|
41
|
-
* Check if an increment is cross-project (spans multiple projects)
|
|
96
|
+
* Check if an increment is cross-project (spans multiple projects/boards)
|
|
97
|
+
*
|
|
98
|
+
* For 1-level: checks if USs target different projects
|
|
99
|
+
* For 2-level: checks if USs target different project/board combinations
|
|
100
|
+
*/
|
|
101
|
+
isCrossProject(userStories, defaultProject, defaultBoard) {
|
|
102
|
+
const groups = this.groupByProject(userStories, defaultProject, defaultBoard);
|
|
103
|
+
return groups.size > 1;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Check if an increment spans multiple projects (ignoring boards)
|
|
107
|
+
* Useful for external sync which groups at project level
|
|
42
108
|
*/
|
|
43
|
-
|
|
44
|
-
const groups = this.
|
|
109
|
+
spansMultipleProjects(userStories, defaultProject) {
|
|
110
|
+
const groups = this.groupByProjectOnly(userStories, defaultProject);
|
|
45
111
|
return groups.size > 1;
|
|
46
112
|
}
|
|
47
113
|
/**
|
|
48
|
-
* Get the specs folder path for a
|
|
114
|
+
* Get the specs folder path for a target path
|
|
115
|
+
* Handles both 1-level (project) and 2-level (project/board)
|
|
116
|
+
*
|
|
117
|
+
* @param targetPath - Either "project" or "project/board"
|
|
118
|
+
*/
|
|
119
|
+
getSpecsPath(targetPath) {
|
|
120
|
+
return path.join(this.projectRoot, '.specweave/docs/internal/specs', targetPath);
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Get the specs folder path for a project (legacy, 1-level only)
|
|
124
|
+
* @deprecated Use getSpecsPath() instead for 2-level support
|
|
49
125
|
*/
|
|
50
126
|
getProjectSpecsPath(projectId) {
|
|
51
127
|
return path.join(this.projectRoot, '.specweave/docs/internal/specs', projectId);
|
|
52
128
|
}
|
|
53
129
|
/**
|
|
54
|
-
* Get the feature folder path for a
|
|
130
|
+
* Get the feature folder path for a target path and feature
|
|
131
|
+
* Handles both 1-level and 2-level structures
|
|
132
|
+
*
|
|
133
|
+
* @param targetPath - Either "project" or "project/board"
|
|
134
|
+
* @param featureId - Feature ID (e.g., "FS-125")
|
|
135
|
+
*/
|
|
136
|
+
getFeaturePath(targetPath, featureId) {
|
|
137
|
+
return path.join(this.getSpecsPath(targetPath), featureId);
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Ensure specs folder exists for a target path
|
|
141
|
+
* Handles both 1-level and 2-level structures
|
|
55
142
|
*/
|
|
56
|
-
|
|
57
|
-
|
|
143
|
+
async ensureSpecsFolder(targetPath) {
|
|
144
|
+
const folderPath = this.getSpecsPath(targetPath);
|
|
145
|
+
await ensureDir(folderPath);
|
|
146
|
+
return folderPath;
|
|
58
147
|
}
|
|
59
148
|
/**
|
|
60
|
-
* Ensure project specs folder exists
|
|
149
|
+
* Ensure project specs folder exists (legacy, 1-level only)
|
|
150
|
+
* @deprecated Use ensureSpecsFolder() instead
|
|
61
151
|
*/
|
|
62
152
|
async ensureProjectFolder(projectId) {
|
|
63
153
|
const folderPath = this.getProjectSpecsPath(projectId);
|
|
@@ -65,10 +155,11 @@ export class CrossProjectSync {
|
|
|
65
155
|
return folderPath;
|
|
66
156
|
}
|
|
67
157
|
/**
|
|
68
|
-
* Ensure feature folder exists within a
|
|
158
|
+
* Ensure feature folder exists within a target path
|
|
159
|
+
* Handles both 1-level and 2-level structures
|
|
69
160
|
*/
|
|
70
|
-
async ensureFeatureFolder(
|
|
71
|
-
const folderPath = this.getFeaturePath(
|
|
161
|
+
async ensureFeatureFolder(targetPath, featureId) {
|
|
162
|
+
const folderPath = this.getFeaturePath(targetPath, featureId);
|
|
72
163
|
await ensureDir(folderPath);
|
|
73
164
|
return folderPath;
|
|
74
165
|
}
|
|
@@ -76,39 +167,67 @@ export class CrossProjectSync {
|
|
|
76
167
|
* Generate cross-references section for FEATURE.md
|
|
77
168
|
*
|
|
78
169
|
* @param featureId - The feature ID (e.g., "FS-125")
|
|
79
|
-
* @param
|
|
80
|
-
* @param
|
|
170
|
+
* @param allTargetPaths - All target paths this feature spans (can be "project" or "project/board")
|
|
171
|
+
* @param currentTargetPath - The current target path being generated
|
|
81
172
|
* @returns Markdown content for "Related Projects" section
|
|
82
173
|
*/
|
|
83
|
-
generateCrossReferences(featureId,
|
|
84
|
-
const
|
|
85
|
-
if (
|
|
174
|
+
generateCrossReferences(featureId, allTargetPaths, currentTargetPath) {
|
|
175
|
+
const otherPaths = allTargetPaths.filter(p => p !== currentTargetPath);
|
|
176
|
+
if (otherPaths.length === 0) {
|
|
86
177
|
return '';
|
|
87
178
|
}
|
|
179
|
+
// Determine depth of current path for relative link calculation
|
|
180
|
+
const currentDepth = currentTargetPath.split('/').length;
|
|
88
181
|
const lines = [
|
|
89
182
|
'',
|
|
90
183
|
'## Related Projects',
|
|
91
184
|
'',
|
|
92
|
-
|
|
185
|
+
this.is2LevelStructure()
|
|
186
|
+
? 'This feature spans multiple project/board combinations:'
|
|
187
|
+
: 'This feature spans multiple projects:',
|
|
93
188
|
''
|
|
94
189
|
];
|
|
95
|
-
for (const
|
|
96
|
-
//
|
|
97
|
-
|
|
98
|
-
|
|
190
|
+
for (const targetPath of otherPaths) {
|
|
191
|
+
// Calculate relative path based on depth
|
|
192
|
+
// From project/board/FS-XXX/FEATURE.md to ../../../other-project/other-board/FS-XXX/
|
|
193
|
+
const upLevels = '../'.repeat(currentDepth + 1); // +1 for featureId folder
|
|
194
|
+
const relativePath = `${upLevels}${targetPath}/${featureId}/`;
|
|
195
|
+
// Display label (show full path for clarity)
|
|
196
|
+
const label = targetPath;
|
|
197
|
+
lines.push(`- [${label}](${relativePath})`);
|
|
99
198
|
}
|
|
100
199
|
lines.push('');
|
|
101
200
|
return lines.join('\n');
|
|
102
201
|
}
|
|
103
202
|
/**
|
|
104
203
|
* Generate cross-reference frontmatter for US files
|
|
204
|
+
*
|
|
205
|
+
* @param allTargetPaths - All target paths (can be "project" or "project/board")
|
|
206
|
+
* @param currentTargetPath - Current target path
|
|
105
207
|
*/
|
|
106
|
-
generateRelatedProjectsFrontmatter(
|
|
107
|
-
const
|
|
108
|
-
if (
|
|
208
|
+
generateRelatedProjectsFrontmatter(allTargetPaths, currentTargetPath) {
|
|
209
|
+
const otherPaths = allTargetPaths.filter(p => p !== currentTargetPath);
|
|
210
|
+
if (otherPaths.length === 0) {
|
|
109
211
|
return '';
|
|
110
212
|
}
|
|
111
|
-
return `related_projects: [${
|
|
213
|
+
return `related_projects: [${otherPaths.join(', ')}]`;
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Extract project ID from target path
|
|
217
|
+
* "project" -> "project"
|
|
218
|
+
* "project/board" -> "project"
|
|
219
|
+
*/
|
|
220
|
+
extractProjectId(targetPath) {
|
|
221
|
+
return targetPath.split('/')[0];
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Extract board ID from target path (for 2-level structures)
|
|
225
|
+
* "project" -> undefined
|
|
226
|
+
* "project/board" -> "board"
|
|
227
|
+
*/
|
|
228
|
+
extractBoardId(targetPath) {
|
|
229
|
+
const parts = targetPath.split('/');
|
|
230
|
+
return parts.length > 1 ? parts[1] : undefined;
|
|
112
231
|
}
|
|
113
232
|
/**
|
|
114
233
|
* Log cross-project sync summary
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cross-project-sync.js","sourceRoot":"","sources":["../../../../src/core/living-docs/cross-project-sync.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"cross-project-sync.js","sourceRoot":"","sources":["../../../../src/core/living-docs/cross-project-sync.ts"],"names":[],"mappings":"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"}
|