specweave 0.21.3 → 0.22.2

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 (235) hide show
  1. package/CLAUDE.md +409 -6
  2. package/README.md +38 -8
  3. package/bin/specweave.js +5 -8
  4. package/dist/plugins/specweave-github/lib/CodeValidator.d.ts +101 -0
  5. package/dist/plugins/specweave-github/lib/CodeValidator.d.ts.map +1 -0
  6. package/dist/plugins/specweave-github/lib/CodeValidator.js +219 -0
  7. package/dist/plugins/specweave-github/lib/CodeValidator.js.map +1 -0
  8. package/dist/plugins/specweave-github/lib/ThreeLayerSyncManager.d.ts +182 -0
  9. package/dist/plugins/specweave-github/lib/ThreeLayerSyncManager.d.ts.map +1 -0
  10. package/dist/plugins/specweave-github/lib/ThreeLayerSyncManager.js +603 -0
  11. package/dist/plugins/specweave-github/lib/ThreeLayerSyncManager.js.map +1 -0
  12. package/dist/plugins/specweave-github/lib/github-client-v2.d.ts +10 -0
  13. package/dist/plugins/specweave-github/lib/github-client-v2.d.ts.map +1 -1
  14. package/dist/plugins/specweave-github/lib/github-client-v2.js +26 -0
  15. package/dist/plugins/specweave-github/lib/github-client-v2.js.map +1 -1
  16. package/dist/plugins/specweave-github/lib/task-sync.d.ts.map +1 -1
  17. package/dist/plugins/specweave-github/lib/task-sync.js +7 -0
  18. package/dist/plugins/specweave-github/lib/task-sync.js.map +1 -1
  19. package/dist/plugins/specweave-github/lib/types.d.ts +34 -0
  20. package/dist/plugins/specweave-github/lib/types.d.ts.map +1 -1
  21. package/dist/src/cli/commands/init.d.ts.map +1 -1
  22. package/dist/src/cli/commands/init.js +60 -5
  23. package/dist/src/cli/commands/init.js.map +1 -1
  24. package/dist/src/cli/commands/migrate-to-profiles.d.ts +1 -0
  25. package/dist/src/cli/commands/migrate-to-profiles.d.ts.map +1 -1
  26. package/dist/src/cli/commands/migrate-to-profiles.js +12 -1
  27. package/dist/src/cli/commands/migrate-to-profiles.js.map +1 -1
  28. package/dist/src/cli/commands/next-command.d.ts +52 -0
  29. package/dist/src/cli/commands/next-command.d.ts.map +1 -0
  30. package/dist/src/cli/commands/next-command.js +204 -0
  31. package/dist/src/cli/commands/next-command.js.map +1 -0
  32. package/dist/src/cli/commands/sync-specs.d.ts +16 -0
  33. package/dist/src/cli/commands/sync-specs.d.ts.map +1 -0
  34. package/dist/src/cli/commands/sync-specs.js +130 -0
  35. package/dist/src/cli/commands/sync-specs.js.map +1 -0
  36. package/dist/src/cli/count-tasks.d.ts +20 -0
  37. package/dist/src/cli/count-tasks.d.ts.map +1 -0
  38. package/dist/src/cli/count-tasks.js +50 -0
  39. package/dist/src/cli/count-tasks.js.map +1 -0
  40. package/dist/src/config/ConfigManager.d.ts.map +1 -1
  41. package/dist/src/config/ConfigManager.js +2 -1
  42. package/dist/src/config/ConfigManager.js.map +1 -1
  43. package/dist/src/config/types.d.ts +58 -58
  44. package/dist/src/core/cicd/state-manager.d.ts +8 -0
  45. package/dist/src/core/cicd/state-manager.d.ts.map +1 -1
  46. package/dist/src/core/cicd/state-manager.js +60 -15
  47. package/dist/src/core/cicd/state-manager.js.map +1 -1
  48. package/dist/src/core/cost-tracker.d.ts.map +1 -1
  49. package/dist/src/core/cost-tracker.js +2 -1
  50. package/dist/src/core/cost-tracker.js.map +1 -1
  51. package/dist/src/core/iac/template-engine.d.ts.map +1 -1
  52. package/dist/src/core/iac/template-engine.js +28 -0
  53. package/dist/src/core/iac/template-engine.js.map +1 -1
  54. package/dist/src/core/iac/template-generator.d.ts +53 -0
  55. package/dist/src/core/iac/template-generator.d.ts.map +1 -0
  56. package/dist/src/core/iac/template-generator.js +125 -0
  57. package/dist/src/core/iac/template-generator.js.map +1 -0
  58. package/dist/src/core/increment/status-auto-transition.js +3 -3
  59. package/dist/src/core/increment/status-auto-transition.js.map +1 -1
  60. package/dist/src/core/living-docs/CodeValidator.js +1 -1
  61. package/dist/src/core/living-docs/CodeValidator.js.map +1 -1
  62. package/dist/src/core/living-docs/CompletionPropagator.d.ts.map +1 -1
  63. package/dist/src/core/living-docs/CompletionPropagator.js +4 -3
  64. package/dist/src/core/living-docs/CompletionPropagator.js.map +1 -1
  65. package/dist/src/core/living-docs/SpecDistributor.d.ts +5 -0
  66. package/dist/src/core/living-docs/SpecDistributor.d.ts.map +1 -1
  67. package/dist/src/core/living-docs/SpecDistributor.js +12 -0
  68. package/dist/src/core/living-docs/SpecDistributor.js.map +1 -1
  69. package/dist/src/core/living-docs/content-distributor.d.ts.map +1 -1
  70. package/dist/src/core/living-docs/content-distributor.js +11 -1
  71. package/dist/src/core/living-docs/content-distributor.js.map +1 -1
  72. package/dist/src/core/living-docs/living-docs-sync.d.ts +166 -0
  73. package/dist/src/core/living-docs/living-docs-sync.d.ts.map +1 -0
  74. package/dist/src/core/living-docs/living-docs-sync.js +726 -0
  75. package/dist/src/core/living-docs/living-docs-sync.js.map +1 -0
  76. package/dist/src/core/living-docs/project-detector.d.ts.map +1 -1
  77. package/dist/src/core/living-docs/project-detector.js +38 -0
  78. package/dist/src/core/living-docs/project-detector.js.map +1 -1
  79. package/dist/src/core/living-docs/task-project-specific-generator.d.ts +7 -3
  80. package/dist/src/core/living-docs/task-project-specific-generator.d.ts.map +1 -1
  81. package/dist/src/core/living-docs/task-project-specific-generator.js +40 -24
  82. package/dist/src/core/living-docs/task-project-specific-generator.js.map +1 -1
  83. package/dist/src/core/plugin-loader.d.ts +7 -0
  84. package/dist/src/core/plugin-loader.d.ts.map +1 -1
  85. package/dist/src/core/plugin-loader.js +18 -1
  86. package/dist/src/core/plugin-loader.js.map +1 -1
  87. package/dist/src/core/serverless/platform-data-loader.d.ts +8 -0
  88. package/dist/src/core/serverless/platform-data-loader.d.ts.map +1 -1
  89. package/dist/src/core/serverless/platform-data-loader.js +14 -0
  90. package/dist/src/core/serverless/platform-data-loader.js.map +1 -1
  91. package/dist/src/core/serverless/types.d.ts +1 -1
  92. package/dist/src/core/serverless/types.d.ts.map +1 -1
  93. package/dist/src/core/status-line/status-line-manager.d.ts +6 -2
  94. package/dist/src/core/status-line/status-line-manager.d.ts.map +1 -1
  95. package/dist/src/core/status-line/status-line-manager.js +11 -5
  96. package/dist/src/core/status-line/status-line-manager.js.map +1 -1
  97. package/dist/src/core/status-line/task-counter.d.ts +69 -0
  98. package/dist/src/core/status-line/task-counter.d.ts.map +1 -0
  99. package/dist/src/core/status-line/task-counter.js +107 -0
  100. package/dist/src/core/status-line/task-counter.js.map +1 -0
  101. package/dist/src/core/types/config.d.ts +23 -0
  102. package/dist/src/core/types/config.d.ts.map +1 -1
  103. package/dist/src/core/types/config.js +10 -0
  104. package/dist/src/core/types/config.js.map +1 -1
  105. package/dist/src/core/workflow/autonomous-executor.d.ts +111 -0
  106. package/dist/src/core/workflow/autonomous-executor.d.ts.map +1 -0
  107. package/dist/src/core/workflow/autonomous-executor.js +275 -0
  108. package/dist/src/core/workflow/autonomous-executor.js.map +1 -0
  109. package/dist/src/core/workflow/backlog-scanner.d.ts +94 -0
  110. package/dist/src/core/workflow/backlog-scanner.d.ts.map +1 -0
  111. package/dist/src/core/workflow/backlog-scanner.js +170 -0
  112. package/dist/src/core/workflow/backlog-scanner.js.map +1 -0
  113. package/dist/src/core/workflow/command-invoker.d.ts +86 -0
  114. package/dist/src/core/workflow/command-invoker.d.ts.map +1 -0
  115. package/dist/src/core/workflow/command-invoker.js +131 -0
  116. package/dist/src/core/workflow/command-invoker.js.map +1 -0
  117. package/dist/src/core/workflow/cost-estimator.d.ts +120 -0
  118. package/dist/src/core/workflow/cost-estimator.d.ts.map +1 -0
  119. package/dist/src/core/workflow/cost-estimator.js +222 -0
  120. package/dist/src/core/workflow/cost-estimator.js.map +1 -0
  121. package/dist/src/core/workflow/index.d.ts +20 -0
  122. package/dist/src/core/workflow/index.d.ts.map +1 -0
  123. package/dist/src/core/workflow/index.js +24 -0
  124. package/dist/src/core/workflow/index.js.map +1 -0
  125. package/dist/src/core/workflow/state-manager.d.ts +107 -0
  126. package/dist/src/core/workflow/state-manager.d.ts.map +1 -0
  127. package/dist/src/core/workflow/state-manager.js +126 -0
  128. package/dist/src/core/workflow/state-manager.js.map +1 -0
  129. package/dist/src/core/workflow/workflow-orchestrator.d.ts +93 -0
  130. package/dist/src/core/workflow/workflow-orchestrator.d.ts.map +1 -0
  131. package/dist/src/core/workflow/workflow-orchestrator.js +195 -0
  132. package/dist/src/core/workflow/workflow-orchestrator.js.map +1 -0
  133. package/dist/src/init/ArchitecturePresenter.d.ts +47 -0
  134. package/dist/src/init/ArchitecturePresenter.d.ts.map +1 -0
  135. package/dist/src/init/ArchitecturePresenter.js +180 -0
  136. package/dist/src/init/ArchitecturePresenter.js.map +1 -0
  137. package/dist/src/init/InitFlow.d.ts.map +1 -1
  138. package/dist/src/init/InitFlow.js +30 -1
  139. package/dist/src/init/InitFlow.js.map +1 -1
  140. package/dist/src/init/architecture/CostEstimator.d.ts +52 -0
  141. package/dist/src/init/architecture/CostEstimator.d.ts.map +1 -0
  142. package/dist/src/init/architecture/CostEstimator.js +107 -0
  143. package/dist/src/init/architecture/CostEstimator.js.map +1 -0
  144. package/dist/src/init/architecture/InfrastructureMapper.d.ts +41 -0
  145. package/dist/src/init/architecture/InfrastructureMapper.d.ts.map +1 -0
  146. package/dist/src/init/architecture/InfrastructureMapper.js +140 -0
  147. package/dist/src/init/architecture/InfrastructureMapper.js.map +1 -0
  148. package/dist/src/init/architecture/ProjectGenerator.d.ts +44 -0
  149. package/dist/src/init/architecture/ProjectGenerator.d.ts.map +1 -0
  150. package/dist/src/init/architecture/ProjectGenerator.js +216 -0
  151. package/dist/src/init/architecture/ProjectGenerator.js.map +1 -0
  152. package/dist/src/init/architecture/types.d.ts +10 -10
  153. package/dist/src/init/research/src/config/types.d.ts +8 -8
  154. package/dist/src/metrics/dora-calculator.js +2 -2
  155. package/dist/src/metrics/dora-calculator.js.map +1 -1
  156. package/dist/src/utils/pricing-constants.d.ts +5 -2
  157. package/dist/src/utils/pricing-constants.d.ts.map +1 -1
  158. package/dist/src/utils/pricing-constants.js +3 -2
  159. package/dist/src/utils/pricing-constants.js.map +1 -1
  160. package/package.json +9 -8
  161. package/plugins/specweave/agents/infrastructure/AGENT.md +88 -46
  162. package/plugins/specweave/agents/pm/AGENT.md +58 -1
  163. package/plugins/specweave/commands/specweave-archive-features.md +1 -1
  164. package/plugins/specweave/commands/specweave-archive-increments.md +1 -1
  165. package/plugins/specweave/commands/specweave-check-hooks.md +5 -0
  166. package/plugins/specweave/commands/specweave-done.md +12 -0
  167. package/plugins/specweave/commands/specweave-plan.md +1 -1
  168. package/plugins/specweave/commands/specweave-progress.md +108 -379
  169. package/plugins/specweave/commands/specweave-reopen.md +1 -1
  170. package/plugins/specweave/commands/specweave-restore-feature.md +1 -1
  171. package/plugins/specweave/commands/specweave-sync-specs.md +20 -48
  172. package/plugins/specweave/hooks/lib/update-status-line.sh +44 -35
  173. package/plugins/specweave/hooks/lib/validate-spec-status.sh +163 -0
  174. package/plugins/specweave/hooks/user-prompt-submit.sh +17 -35
  175. package/plugins/specweave/lib/hooks/update-tasks-md.js +52 -9
  176. package/plugins/specweave/lib/hooks/update-tasks-md.ts +77 -16
  177. package/plugins/specweave/templates/iac/aws-lambda/defaults.json +24 -0
  178. package/plugins/specweave/templates/iac/aws-lambda/templates/README.md.hbs +260 -0
  179. package/plugins/specweave/templates/iac/aws-lambda/templates/environments/dev.tfvars.hbs +34 -0
  180. package/plugins/specweave/templates/iac/aws-lambda/templates/environments/prod.tfvars.hbs +37 -0
  181. package/plugins/specweave/templates/iac/aws-lambda/templates/environments/staging.tfvars.hbs +35 -0
  182. package/plugins/specweave/templates/iac/aws-lambda/templates/outputs.tf.hbs +77 -0
  183. package/plugins/specweave/templates/iac/aws-lambda/templates/providers.tf.hbs +36 -0
  184. package/plugins/specweave/templates/iac/aws-lambda/templates/variables.tf.hbs +115 -0
  185. package/plugins/specweave/templates/iac/azure-functions/defaults.json +25 -0
  186. package/plugins/specweave/templates/iac/azure-functions/templates/README.md.hbs +268 -0
  187. package/plugins/specweave/templates/iac/azure-functions/templates/environments/dev.tfvars.hbs +34 -0
  188. package/plugins/specweave/templates/iac/azure-functions/templates/environments/prod.tfvars.hbs +46 -0
  189. package/plugins/specweave/templates/iac/azure-functions/templates/environments/staging.tfvars.hbs +34 -0
  190. package/plugins/specweave/templates/iac/azure-functions/templates/main.tf.hbs +225 -0
  191. package/plugins/specweave/templates/iac/azure-functions/templates/outputs.tf.hbs +89 -0
  192. package/plugins/specweave/templates/iac/azure-functions/templates/provider.tf.hbs +27 -0
  193. package/plugins/specweave/templates/iac/azure-functions/templates/providers.tf.hbs +35 -0
  194. package/plugins/specweave/templates/iac/azure-functions/templates/variables.tf.hbs +124 -0
  195. package/plugins/specweave/templates/iac/firebase/defaults.json +29 -0
  196. package/plugins/specweave/templates/iac/firebase/templates/README.md.hbs +35 -0
  197. package/plugins/specweave/templates/iac/firebase/templates/environments/dev.tfvars.hbs +7 -0
  198. package/plugins/specweave/templates/iac/firebase/templates/environments/prod.tfvars.hbs +7 -0
  199. package/plugins/specweave/templates/iac/firebase/templates/environments/staging.tfvars.hbs +7 -0
  200. package/plugins/specweave/templates/iac/firebase/templates/main.tf.hbs +90 -0
  201. package/plugins/specweave/templates/iac/firebase/templates/outputs.tf.hbs +15 -0
  202. package/plugins/specweave/templates/iac/firebase/templates/providers.tf.hbs +23 -0
  203. package/plugins/specweave/templates/iac/firebase/templates/variables.tf.hbs +42 -0
  204. package/plugins/specweave/templates/iac/gcp-cloud-functions/defaults.json +26 -0
  205. package/plugins/specweave/templates/iac/gcp-cloud-functions/templates/README.md.hbs +299 -0
  206. package/plugins/specweave/templates/iac/gcp-cloud-functions/templates/environments/dev.tfvars.hbs +36 -0
  207. package/plugins/specweave/templates/iac/gcp-cloud-functions/templates/environments/prod.tfvars.hbs +48 -0
  208. package/plugins/specweave/templates/iac/gcp-cloud-functions/templates/environments/staging.tfvars.hbs +41 -0
  209. package/plugins/specweave/templates/iac/gcp-cloud-functions/templates/main.tf.hbs +192 -0
  210. package/plugins/specweave/templates/iac/gcp-cloud-functions/templates/outputs.tf.hbs +66 -0
  211. package/plugins/specweave/templates/iac/gcp-cloud-functions/templates/providers.tf.hbs +25 -0
  212. package/plugins/specweave/templates/iac/gcp-cloud-functions/templates/variables.tf.hbs +119 -0
  213. package/plugins/specweave/templates/iac/supabase/defaults.json +15 -0
  214. package/plugins/specweave/templates/iac/supabase/templates/README.md.hbs +46 -0
  215. package/plugins/specweave/templates/iac/supabase/templates/main.tf.hbs +50 -0
  216. package/plugins/specweave-ado/lib/enhanced-ado-sync.js +170 -0
  217. package/plugins/specweave-github/agents/github-manager/AGENT.md +39 -7
  218. package/plugins/specweave-github/commands/specweave-github-create-issue.md +5 -5
  219. package/plugins/specweave-github/lib/CodeValidator.js +195 -0
  220. package/plugins/specweave-github/lib/CodeValidator.ts +284 -0
  221. package/plugins/specweave-github/lib/ThreeLayerSyncManager.js +545 -0
  222. package/plugins/specweave-github/lib/ThreeLayerSyncManager.ts +809 -0
  223. package/plugins/specweave-github/lib/github-client-v2.js +29 -0
  224. package/plugins/specweave-github/lib/github-client-v2.ts +30 -0
  225. package/plugins/specweave-github/lib/task-sync.js +4 -0
  226. package/plugins/specweave-github/lib/task-sync.ts +7 -0
  227. package/plugins/specweave-github/lib/types.ts +38 -0
  228. package/plugins/specweave-jira/lib/enhanced-jira-sync.js +3 -3
  229. package/plugins/specweave-release/hooks/.specweave/logs/dora-tracking.log +3222 -0
  230. package/src/templates/AGENTS.md.template +22 -1
  231. package/src/templates/CLAUDE.md.template +31 -0
  232. package/dist/src/core/living-docs/ThreeLayerSyncManager.d.ts +0 -116
  233. package/dist/src/core/living-docs/ThreeLayerSyncManager.d.ts.map +0 -1
  234. package/dist/src/core/living-docs/ThreeLayerSyncManager.js +0 -356
  235. package/dist/src/core/living-docs/ThreeLayerSyncManager.js.map +0 -1
@@ -0,0 +1,603 @@
1
+ /**
2
+ * Three-Layer Bidirectional Sync Manager
3
+ *
4
+ * Handles synchronization across three layers:
5
+ * - Layer 1: GitHub Issue (stakeholder UI)
6
+ * - Layer 2: Living Docs User Story files (intermediate representation)
7
+ * - Layer 3: Increment spec.md + tasks.md (source of truth)
8
+ *
9
+ * Supports two sync flows:
10
+ * 1. GitHub → Living Docs → Increment (stakeholder checks checkbox)
11
+ * 2. Increment → Living Docs → GitHub (developer completes work)
12
+ *
13
+ * Features:
14
+ * - Code validation (reopen tasks if code doesn't exist)
15
+ * - Completion propagation (Tasks → ACs → User Stories)
16
+ * - Conflict resolution (Increment always wins)
17
+ *
18
+ * @module ThreeLayerSyncManager
19
+ */
20
+ import fs from 'fs-extra';
21
+ import path from 'path';
22
+ import { execFileNoThrow } from '../../../src/utils/execFileNoThrow.js';
23
+ import { CodeValidator } from './CodeValidator.js';
24
+ export class ThreeLayerSyncManager {
25
+ constructor(projectRoot = process.cwd()) {
26
+ this.userStoryFileCache = new Map();
27
+ this.projectRoot = projectRoot;
28
+ this.codeValidator = new CodeValidator({ projectRoot });
29
+ }
30
+ /**
31
+ * Clear User Story file cache
32
+ * Call this when file structure changes or for testing
33
+ */
34
+ clearCache() {
35
+ this.userStoryFileCache.clear();
36
+ }
37
+ /**
38
+ * Sync from GitHub to Increment (Flow 1: GitHub → Living Docs → Increment)
39
+ *
40
+ * Triggered when stakeholder checks AC/Task checkbox in GitHub issue.
41
+ */
42
+ async syncGitHubToIncrement(issueNumber, incrementPath, livingDocsPath) {
43
+ const result = {
44
+ acsUpdated: 0,
45
+ tasksUpdated: 0,
46
+ tasksReopened: 0,
47
+ conflicts: [],
48
+ errors: []
49
+ };
50
+ try {
51
+ console.log(`🔄 Syncing GitHub issue #${issueNumber} → Increment`);
52
+ // 1. Fetch GitHub issue state
53
+ const githubState = await this.fetchGitHubIssueState(issueNumber);
54
+ // 2. Extract AC and Task completion state from issue body
55
+ const githubAcs = this.extractAcsFromIssue(githubState.body);
56
+ const githubTasks = this.extractTasksFromIssue(githubState.body);
57
+ // 3. Update Living Docs User Stories (Layer 2) - PARALLEL I/O for performance
58
+ const acUpdatePromises = githubAcs.map(async (ac) => {
59
+ const userStoryPath = await this.findUserStoryFile(livingDocsPath, ac.userStoryId);
60
+ if (userStoryPath) {
61
+ await this.updateUserStoryAc(userStoryPath, ac.id, ac.completed);
62
+ result.acsUpdated++;
63
+ }
64
+ });
65
+ const taskUpdatePromises = githubTasks.map(async (task) => {
66
+ // Find User Story that contains this task
67
+ const userStoryPath = await this.findUserStoryFileForTask(livingDocsPath, task.id);
68
+ if (userStoryPath) {
69
+ await this.updateUserStoryTask(userStoryPath, task.id, task.completed);
70
+ result.tasksUpdated++;
71
+ }
72
+ });
73
+ // Wait for all updates to complete in parallel
74
+ await Promise.all([...acUpdatePromises, ...taskUpdatePromises]);
75
+ // 4. Update Increment (Layer 3 - source of truth) with conflict resolution
76
+ await this.updateIncrementAcsWithConflictResolution(incrementPath, githubAcs, result);
77
+ await this.updateIncrementTasksWithConflictResolution(incrementPath, githubTasks, result);
78
+ // 5. Code validation: If task marked complete, check if code exists - PARALLEL for performance
79
+ const completedTasks = githubTasks.filter(t => t.completed);
80
+ const validationPromises = completedTasks.map(async (task) => {
81
+ const codeExists = await this.validateCodeExists(task);
82
+ if (!codeExists) {
83
+ console.log(`⚠️ Task ${task.id} marked complete but code missing - reopening`);
84
+ await this.reopenTask(task.id, incrementPath, livingDocsPath, issueNumber);
85
+ result.tasksReopened++;
86
+ }
87
+ });
88
+ await Promise.all(validationPromises);
89
+ console.log(`✅ Sync complete: ${result.acsUpdated} ACs, ${result.tasksUpdated} tasks updated`);
90
+ if (result.tasksReopened > 0) {
91
+ console.log(` ${result.tasksReopened} tasks reopened due to missing code`);
92
+ }
93
+ }
94
+ catch (error) {
95
+ const errorMsg = error instanceof Error ? error.message : String(error);
96
+ result.errors.push(errorMsg);
97
+ console.error(`❌ Error syncing GitHub → Increment:`, error);
98
+ }
99
+ return result;
100
+ }
101
+ /**
102
+ * Sync from Increment to GitHub (Flow 2: Increment → Living Docs → GitHub)
103
+ *
104
+ * Triggered when developer completes work and updates increment files.
105
+ */
106
+ async syncIncrementToGitHub(incrementPath, livingDocsPath, issueNumber) {
107
+ const result = {
108
+ acsUpdated: 0,
109
+ tasksUpdated: 0,
110
+ tasksReopened: 0,
111
+ conflicts: [],
112
+ errors: []
113
+ };
114
+ try {
115
+ console.log(`🔄 Syncing Increment → GitHub issue #${issueNumber}`);
116
+ // 1. Read increment spec.md and tasks.md
117
+ const specPath = path.join(incrementPath, 'spec.md');
118
+ const tasksPath = path.join(incrementPath, 'tasks.md');
119
+ const specContent = await fs.readFile(specPath, 'utf-8');
120
+ const tasksContent = await fs.readFile(tasksPath, 'utf-8');
121
+ // 2. Parse ACs and Tasks
122
+ const acs = this.parseAcceptanceCriteria(specContent);
123
+ const tasks = this.parseTasks(tasksContent);
124
+ // 3. Update Living Docs User Stories (Layer 2)
125
+ const acsByUserStory = this.groupAcsByUserStory(acs);
126
+ for (const [userStoryId, userStoryAcs] of Object.entries(acsByUserStory)) {
127
+ const userStoryPath = await this.findUserStoryFile(livingDocsPath, userStoryId);
128
+ if (userStoryPath) {
129
+ // Update ACs in User Story
130
+ await this.updateUserStoryAcs(userStoryPath, userStoryAcs);
131
+ result.acsUpdated += userStoryAcs.length;
132
+ // Update Tasks in User Story (filter by AC IDs)
133
+ const acIds = userStoryAcs.map(ac => ac.id);
134
+ const userStoryTasks = this.filterTasksByAcIds(tasks, acIds);
135
+ await this.updateUserStoryTasks(userStoryPath, userStoryTasks);
136
+ result.tasksUpdated += userStoryTasks.length;
137
+ }
138
+ }
139
+ // 4. Update GitHub issue (Layer 1)
140
+ await this.updateGitHubIssue(issueNumber, acs, tasks);
141
+ console.log(`✅ Sync complete: ${result.acsUpdated} ACs, ${result.tasksUpdated} tasks updated`);
142
+ }
143
+ catch (error) {
144
+ const errorMsg = error instanceof Error ? error.message : String(error);
145
+ result.errors.push(errorMsg);
146
+ console.error(`❌ Error syncing Increment → GitHub:`, error);
147
+ }
148
+ return result;
149
+ }
150
+ /**
151
+ * Validate that code exists for completed task
152
+ * Uses CodeValidator for comprehensive validation
153
+ */
154
+ async validateCodeExists(task) {
155
+ // Use CodeValidator for robust validation
156
+ const validationResult = await this.codeValidator.validateTask(task.title, task.id);
157
+ return validationResult.valid;
158
+ }
159
+ /**
160
+ * Reopen task if code validation fails
161
+ */
162
+ async reopenTask(taskId, incrementPath, livingDocsPath, issueNumber) {
163
+ // 1. Reopen in increment tasks.md
164
+ const tasksPath = path.join(incrementPath, 'tasks.md');
165
+ let tasksContent = await fs.readFile(tasksPath, 'utf-8');
166
+ // Find task and mark as incomplete
167
+ const taskRegex = new RegExp(`(### ${taskId}:[^#]*?)\\*\\*Completed\\*\\*:[^\\n]*\\n`, 's');
168
+ tasksContent = tasksContent.replace(taskRegex, '$1');
169
+ await fs.writeFile(tasksPath, tasksContent, 'utf-8');
170
+ // 2. Propagate to Living Docs
171
+ const userStoryPath = await this.findUserStoryFileForTask(livingDocsPath, taskId);
172
+ if (userStoryPath) {
173
+ await this.updateUserStoryTask(userStoryPath, taskId, false);
174
+ }
175
+ // 3. Propagate to GitHub (add comment explaining why)
176
+ await this.addGitHubComment(issueNumber, `⚠️ Task ${taskId} reopened: Code validation failed (missing or empty file). Please implement the required code.`);
177
+ }
178
+ /**
179
+ * Propagate completion from Tasks → ACs → User Stories (bottom-up)
180
+ */
181
+ async propagateCompletion(incrementPath, livingDocsPath) {
182
+ // 1. Read increment files
183
+ const specPath = path.join(incrementPath, 'spec.md');
184
+ const tasksPath = path.join(incrementPath, 'tasks.md');
185
+ const specContent = await fs.readFile(specPath, 'utf-8');
186
+ const tasksContent = await fs.readFile(tasksPath, 'utf-8');
187
+ const acs = this.parseAcceptanceCriteria(specContent);
188
+ const tasks = this.parseTasks(tasksContent);
189
+ // 2. For each AC, check if all its tasks are complete
190
+ for (const ac of acs) {
191
+ const acTasks = tasks.filter(t => t.acIds.includes(ac.id));
192
+ const allTasksComplete = acTasks.length > 0 && acTasks.every(t => t.completed);
193
+ if (allTasksComplete && !ac.completed) {
194
+ // Mark AC as complete
195
+ console.log(`✅ All tasks for ${ac.id} complete - marking AC as complete`);
196
+ await this.updateIncrementAc(incrementPath, ac.id, true);
197
+ // Propagate to Living Docs
198
+ const userStoryPath = await this.findUserStoryFile(livingDocsPath, ac.userStoryId);
199
+ if (userStoryPath) {
200
+ await this.updateUserStoryAc(userStoryPath, ac.id, true);
201
+ }
202
+ }
203
+ }
204
+ // 3. For each User Story, check if all ACs are complete
205
+ const acsByUserStory = this.groupAcsByUserStory(acs);
206
+ for (const [userStoryId, userStoryAcs] of Object.entries(acsByUserStory)) {
207
+ const allAcsComplete = userStoryAcs.every(ac => ac.completed);
208
+ if (allAcsComplete) {
209
+ console.log(`✅ All ACs for ${userStoryId} complete - User Story complete`);
210
+ // Could trigger User Story completion workflow here
211
+ }
212
+ }
213
+ }
214
+ // ==================== Helper Methods ====================
215
+ /**
216
+ * Fetch GitHub issue state
217
+ */
218
+ async fetchGitHubIssueState(issueNumber) {
219
+ const result = await execFileNoThrow('gh', [
220
+ 'issue',
221
+ 'view',
222
+ String(issueNumber),
223
+ '--json',
224
+ 'body,state'
225
+ ]);
226
+ if (result.stderr) {
227
+ throw new Error(`Failed to fetch GitHub issue: ${result.stderr}`);
228
+ }
229
+ return JSON.parse(result.stdout);
230
+ }
231
+ /**
232
+ * Extract ACs from GitHub issue body
233
+ */
234
+ extractAcsFromIssue(body) {
235
+ const acs = [];
236
+ const lines = body.split('\n');
237
+ // Match lines like: - [x] AC-US1-01: Description
238
+ const acRegex = /^- \[([ x])\] (AC-[A-Z0-9]+-\d+):\s*(.+)$/;
239
+ for (const line of lines) {
240
+ const match = line.match(acRegex);
241
+ if (match) {
242
+ const completed = match[1] === 'x';
243
+ const id = match[2];
244
+ const description = match[3];
245
+ const userStoryMatch = id.match(/AC-([A-Z0-9]+)-\d+/);
246
+ const userStoryId = userStoryMatch ? userStoryMatch[1] : '';
247
+ acs.push({
248
+ id,
249
+ userStoryId,
250
+ description,
251
+ completed,
252
+ projects: [],
253
+ rawLine: line
254
+ });
255
+ }
256
+ }
257
+ return acs;
258
+ }
259
+ /**
260
+ * Extract Tasks from GitHub issue body
261
+ */
262
+ extractTasksFromIssue(body) {
263
+ const tasks = [];
264
+ const lines = body.split('\n');
265
+ // Match lines like: - [x] T-001: Description
266
+ const taskRegex = /^- \[([ x])\] (T-\d+):\s*(.+)$/;
267
+ for (const line of lines) {
268
+ const match = line.match(taskRegex);
269
+ if (match) {
270
+ const completed = match[1] === 'x';
271
+ const id = match[2];
272
+ const title = match[3];
273
+ tasks.push({
274
+ id,
275
+ title,
276
+ completed,
277
+ acIds: []
278
+ });
279
+ }
280
+ }
281
+ return tasks;
282
+ }
283
+ /**
284
+ * Parse ACs from spec.md
285
+ */
286
+ parseAcceptanceCriteria(specContent) {
287
+ const acs = [];
288
+ const lines = specContent.split('\n');
289
+ const acRegex = /^- \[([ x])\] (AC-[A-Z0-9]+-\d+):\s*(.+)$/;
290
+ for (const line of lines) {
291
+ const match = line.match(acRegex);
292
+ if (match) {
293
+ const completed = match[1] === 'x';
294
+ const id = match[2];
295
+ const description = match[3];
296
+ const userStoryMatch = id.match(/AC-([A-Z0-9]+)-\d+/);
297
+ const userStoryId = userStoryMatch ? userStoryMatch[1] : '';
298
+ acs.push({
299
+ id,
300
+ userStoryId,
301
+ description,
302
+ completed,
303
+ projects: [],
304
+ rawLine: line
305
+ });
306
+ }
307
+ }
308
+ return acs;
309
+ }
310
+ /**
311
+ * Parse Tasks from tasks.md
312
+ */
313
+ parseTasks(tasksContent) {
314
+ const tasks = [];
315
+ const lines = tasksContent.split('\n');
316
+ let currentTask = null;
317
+ for (const line of lines) {
318
+ // Match task header: ### T-001: Title (P1)
319
+ const headerMatch = line.match(/^### (T-\d+):\s*(.+?)\s*\(P\d+\)$/);
320
+ if (headerMatch) {
321
+ if (currentTask && currentTask.id) {
322
+ tasks.push(currentTask);
323
+ }
324
+ currentTask = {
325
+ id: headerMatch[1],
326
+ title: headerMatch[2],
327
+ completed: false,
328
+ acIds: []
329
+ };
330
+ continue;
331
+ }
332
+ // Check for completion
333
+ const completedMatch = line.match(/^\*\*Completed\*\*:\s*(.+)$/);
334
+ if (completedMatch && currentTask) {
335
+ currentTask.completed = true;
336
+ currentTask.completedDate = completedMatch[1];
337
+ }
338
+ // Extract AC IDs
339
+ const acMatch = line.match(/\*\*AC\*\*:\s*(.+)$/);
340
+ if (acMatch && currentTask) {
341
+ const acIds = acMatch[1].split(',').map(id => id.trim());
342
+ currentTask.acIds = acIds;
343
+ }
344
+ }
345
+ if (currentTask && currentTask.id) {
346
+ tasks.push(currentTask);
347
+ }
348
+ return tasks;
349
+ }
350
+ /**
351
+ * Group ACs by User Story ID
352
+ */
353
+ groupAcsByUserStory(acs) {
354
+ const grouped = {};
355
+ for (const ac of acs) {
356
+ if (!grouped[ac.userStoryId]) {
357
+ grouped[ac.userStoryId] = [];
358
+ }
359
+ grouped[ac.userStoryId].push(ac);
360
+ }
361
+ return grouped;
362
+ }
363
+ /**
364
+ * Filter tasks by AC IDs
365
+ */
366
+ filterTasksByAcIds(tasks, acIds) {
367
+ return tasks.filter(task => task.acIds.some(acId => acIds.includes(acId)));
368
+ }
369
+ /**
370
+ * Find User Story file by ID (with caching for performance)
371
+ */
372
+ async findUserStoryFile(livingDocsPath, userStoryId) {
373
+ // Check cache first
374
+ const cacheKey = `${livingDocsPath}:${userStoryId}`;
375
+ if (this.userStoryFileCache.has(cacheKey)) {
376
+ return this.userStoryFileCache.get(cacheKey);
377
+ }
378
+ // Search in specs directory
379
+ const specsPath = path.join(livingDocsPath, 'internal', 'specs');
380
+ // Use glob to find user story files
381
+ const pattern = `**/us-*${userStoryId.toLowerCase()}*.md`;
382
+ const { glob } = await import('glob');
383
+ const files = await glob(pattern, { cwd: specsPath, absolute: true });
384
+ const result = files.length > 0 ? files[0] : null;
385
+ // Cache the result
386
+ this.userStoryFileCache.set(cacheKey, result);
387
+ return result;
388
+ }
389
+ /**
390
+ * Find User Story file that contains specific task
391
+ */
392
+ async findUserStoryFileForTask(livingDocsPath, taskId) {
393
+ // Search all user story files for the task
394
+ const specsPath = path.join(livingDocsPath, 'internal', 'specs');
395
+ const { glob } = await import('glob');
396
+ const files = await glob('**/us-*.md', { cwd: specsPath, absolute: true });
397
+ for (const file of files) {
398
+ const content = await fs.readFile(file, 'utf-8');
399
+ if (content.includes(taskId)) {
400
+ return file;
401
+ }
402
+ }
403
+ return null;
404
+ }
405
+ /**
406
+ * Update AC in User Story file
407
+ */
408
+ async updateUserStoryAc(userStoryPath, acId, completed) {
409
+ let content = await fs.readFile(userStoryPath, 'utf-8');
410
+ // Update checkbox state
411
+ const checkboxState = completed ? 'x' : ' ';
412
+ const regex = new RegExp(`(- \\[)[ x](\\] ${acId}:)`, 'g');
413
+ content = content.replace(regex, `$1${checkboxState}$2`);
414
+ await fs.writeFile(userStoryPath, content, 'utf-8');
415
+ }
416
+ /**
417
+ * Update Task in User Story file
418
+ */
419
+ async updateUserStoryTask(userStoryPath, taskId, completed) {
420
+ let content = await fs.readFile(userStoryPath, 'utf-8');
421
+ // Update checkbox state
422
+ const checkboxState = completed ? 'x' : ' ';
423
+ const regex = new RegExp(`(- \\[)[ x](\\] ${taskId}:)`, 'g');
424
+ content = content.replace(regex, `$1${checkboxState}$2`);
425
+ await fs.writeFile(userStoryPath, content, 'utf-8');
426
+ }
427
+ /**
428
+ * Update multiple ACs in User Story file
429
+ */
430
+ async updateUserStoryAcs(userStoryPath, acs) {
431
+ let content = await fs.readFile(userStoryPath, 'utf-8');
432
+ for (const ac of acs) {
433
+ const checkboxState = ac.completed ? 'x' : ' ';
434
+ const regex = new RegExp(`(- \\[)[ x](\\] ${ac.id}:)`, 'g');
435
+ content = content.replace(regex, `$1${checkboxState}$2`);
436
+ }
437
+ await fs.writeFile(userStoryPath, content, 'utf-8');
438
+ }
439
+ /**
440
+ * Update multiple Tasks in User Story file
441
+ */
442
+ async updateUserStoryTasks(userStoryPath, tasks) {
443
+ let content = await fs.readFile(userStoryPath, 'utf-8');
444
+ for (const task of tasks) {
445
+ const checkboxState = task.completed ? 'x' : ' ';
446
+ const regex = new RegExp(`(- \\[)[ x](\\] ${task.id}:)`, 'g');
447
+ content = content.replace(regex, `$1${checkboxState}$2`);
448
+ }
449
+ await fs.writeFile(userStoryPath, content, 'utf-8');
450
+ }
451
+ /**
452
+ * Update AC in increment spec.md
453
+ */
454
+ async updateIncrementAc(incrementPath, acId, completed) {
455
+ const specPath = path.join(incrementPath, 'spec.md');
456
+ let content = await fs.readFile(specPath, 'utf-8');
457
+ const checkboxState = completed ? 'x' : ' ';
458
+ const regex = new RegExp(`(- \\[)[ x](\\] ${acId}:)`, 'g');
459
+ content = content.replace(regex, `$1${checkboxState}$2`);
460
+ await fs.writeFile(specPath, content, 'utf-8');
461
+ }
462
+ /**
463
+ * Update multiple ACs in increment spec.md
464
+ */
465
+ async updateIncrementAcs(incrementPath, acs) {
466
+ const specPath = path.join(incrementPath, 'spec.md');
467
+ let content = await fs.readFile(specPath, 'utf-8');
468
+ for (const ac of acs) {
469
+ const checkboxState = ac.completed ? 'x' : ' ';
470
+ const regex = new RegExp(`(- \\[)[ x](\\] ${ac.id}:)`, 'g');
471
+ content = content.replace(regex, `$1${checkboxState}$2`);
472
+ }
473
+ await fs.writeFile(specPath, content, 'utf-8');
474
+ }
475
+ /**
476
+ * Update multiple Tasks in increment tasks.md
477
+ */
478
+ async updateIncrementTasks(incrementPath, tasks) {
479
+ const tasksPath = path.join(incrementPath, 'tasks.md');
480
+ let content = await fs.readFile(tasksPath, 'utf-8');
481
+ for (const task of tasks) {
482
+ if (task.completed) {
483
+ // Add **Completed** marker if not present
484
+ const taskHeader = `### ${task.id}:`;
485
+ const completedMarker = `**Completed**: ${new Date().toISOString().split('T')[0]}`;
486
+ if (!content.includes(`${taskHeader}`) || !content.includes(`**Completed**`)) {
487
+ // Find task section and add completed marker
488
+ const regex = new RegExp(`(### ${task.id}:[^#]*?)(###|$)`, 's');
489
+ content = content.replace(regex, `$1\n${completedMarker}\n\n$2`);
490
+ }
491
+ }
492
+ }
493
+ await fs.writeFile(tasksPath, content, 'utf-8');
494
+ }
495
+ /**
496
+ * Update ACs in increment with conflict resolution (Increment wins)
497
+ *
498
+ * If GitHub and Increment disagree, Increment state wins as it's the source of truth.
499
+ * Conflicts are logged for transparency.
500
+ */
501
+ async updateIncrementAcsWithConflictResolution(incrementPath, githubAcs, result) {
502
+ const specPath = path.join(incrementPath, 'spec.md');
503
+ const currentContent = await fs.readFile(specPath, 'utf-8');
504
+ // Parse current state from increment
505
+ const currentAcs = this.parseAcceptanceCriteria(currentContent);
506
+ let content = currentContent;
507
+ for (const githubAc of githubAcs) {
508
+ const currentAc = currentAcs.find(ac => ac.id === githubAc.id);
509
+ if (currentAc && currentAc.completed !== githubAc.completed) {
510
+ // CONFLICT: Increment state differs from GitHub state
511
+ const conflictMsg = `AC ${githubAc.id}: GitHub says ${githubAc.completed ? 'complete' : 'incomplete'}, Increment says ${currentAc.completed ? 'complete' : 'incomplete'} → Increment wins`;
512
+ result.conflicts.push(conflictMsg);
513
+ console.log(`⚠️ CONFLICT RESOLVED: ${conflictMsg}`);
514
+ // Keep increment state (do not update)
515
+ continue;
516
+ }
517
+ // No conflict - apply GitHub change
518
+ const checkboxState = githubAc.completed ? 'x' : ' ';
519
+ const regex = new RegExp(`(- \\[)[ x](\\] ${githubAc.id}:)`, 'g');
520
+ content = content.replace(regex, `$1${checkboxState}$2`);
521
+ }
522
+ await fs.writeFile(specPath, content, 'utf-8');
523
+ }
524
+ /**
525
+ * Update Tasks in increment with conflict resolution (Increment wins)
526
+ */
527
+ async updateIncrementTasksWithConflictResolution(incrementPath, githubTasks, result) {
528
+ const tasksPath = path.join(incrementPath, 'tasks.md');
529
+ const currentContent = await fs.readFile(tasksPath, 'utf-8');
530
+ // Parse current state from increment
531
+ const currentTasks = this.parseTasks(currentContent);
532
+ let content = currentContent;
533
+ for (const githubTask of githubTasks) {
534
+ const currentTask = currentTasks.find(t => t.id === githubTask.id);
535
+ if (currentTask && currentTask.completed !== githubTask.completed) {
536
+ // CONFLICT: Increment state differs from GitHub state
537
+ const conflictMsg = `Task ${githubTask.id}: GitHub says ${githubTask.completed ? 'complete' : 'incomplete'}, Increment says ${currentTask.completed ? 'complete' : 'incomplete'} → Increment wins`;
538
+ result.conflicts.push(conflictMsg);
539
+ console.log(`⚠️ CONFLICT RESOLVED: ${conflictMsg}`);
540
+ // Keep increment state (do not update)
541
+ continue;
542
+ }
543
+ // No conflict - apply GitHub change
544
+ if (githubTask.completed) {
545
+ const taskHeader = `### ${githubTask.id}:`;
546
+ const completedMarker = `**Completed**: ${new Date().toISOString().split('T')[0]}`;
547
+ if (!content.includes(`${taskHeader}`) || !content.includes(`**Completed**`)) {
548
+ const regex = new RegExp(`(### ${githubTask.id}:[^#]*?)(###|$)`, 's');
549
+ content = content.replace(regex, `$1\n${completedMarker}\n\n$2`);
550
+ }
551
+ }
552
+ }
553
+ await fs.writeFile(tasksPath, content, 'utf-8');
554
+ }
555
+ /**
556
+ * Update GitHub issue with ACs and Tasks
557
+ */
558
+ async updateGitHubIssue(issueNumber, acs, tasks) {
559
+ // Fetch current issue
560
+ const result = await execFileNoThrow('gh', [
561
+ 'issue',
562
+ 'view',
563
+ String(issueNumber),
564
+ '--json',
565
+ 'body'
566
+ ]);
567
+ const { body } = JSON.parse(result.stdout);
568
+ // Update AC checkboxes
569
+ let updatedBody = body;
570
+ for (const ac of acs) {
571
+ const checkboxState = ac.completed ? 'x' : ' ';
572
+ const regex = new RegExp(`(- \\[)[ x](\\] ${ac.id}:)`, 'g');
573
+ updatedBody = updatedBody.replace(regex, `$1${checkboxState}$2`);
574
+ }
575
+ // Update Task checkboxes
576
+ for (const task of tasks) {
577
+ const checkboxState = task.completed ? 'x' : ' ';
578
+ const regex = new RegExp(`(- \\[)[ x](\\] ${task.id}:)`, 'g');
579
+ updatedBody = updatedBody.replace(regex, `$1${checkboxState}$2`);
580
+ }
581
+ // Update issue via gh CLI
582
+ await execFileNoThrow('gh', [
583
+ 'issue',
584
+ 'edit',
585
+ String(issueNumber),
586
+ '--body',
587
+ updatedBody
588
+ ]);
589
+ }
590
+ /**
591
+ * Add comment to GitHub issue
592
+ */
593
+ async addGitHubComment(issueNumber, comment) {
594
+ await execFileNoThrow('gh', [
595
+ 'issue',
596
+ 'comment',
597
+ String(issueNumber),
598
+ '--body',
599
+ comment
600
+ ]);
601
+ }
602
+ }
603
+ //# sourceMappingURL=ThreeLayerSyncManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ThreeLayerSyncManager.js","sourceRoot":"","sources":["../../../../plugins/specweave-github/lib/ThreeLayerSyncManager.ts"],"names":[],"mappings":"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"}
@@ -52,6 +52,16 @@ export declare class GitHubClientV2 {
52
52
  * Get milestone by title
53
53
  */
54
54
  private getMilestoneByTitle;
55
+ /**
56
+ * Validate issue title format
57
+ *
58
+ * CRITICAL: Enforces correct data flow architecture
59
+ * - ✅ CORRECT: "US-XXX: Title" or "FS-YY-MM-DD: Title"
60
+ * - ❌ WRONG: "[Increment XXXX] Title" (deprecated old format)
61
+ *
62
+ * @throws Error if title uses deprecated [Increment XXXX] format
63
+ */
64
+ private validateIssueTitle;
55
65
  /**
56
66
  * Create epic issue (increment-level)
57
67
  */