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.
Files changed (224) hide show
  1. package/CLAUDE.md +162 -1
  2. package/dist/plugins/specweave-ado/lib/per-us-sync.d.ts +120 -0
  3. package/dist/plugins/specweave-ado/lib/per-us-sync.d.ts.map +1 -0
  4. package/dist/plugins/specweave-ado/lib/per-us-sync.js +276 -0
  5. package/dist/plugins/specweave-ado/lib/per-us-sync.js.map +1 -0
  6. package/dist/plugins/specweave-github/lib/github-client-v2.d.ts +4 -1
  7. package/dist/plugins/specweave-github/lib/github-client-v2.d.ts.map +1 -1
  8. package/dist/plugins/specweave-github/lib/github-client-v2.js +13 -3
  9. package/dist/plugins/specweave-github/lib/github-client-v2.js.map +1 -1
  10. package/dist/plugins/specweave-github/lib/per-us-sync.d.ts +97 -0
  11. package/dist/plugins/specweave-github/lib/per-us-sync.d.ts.map +1 -0
  12. package/dist/plugins/specweave-github/lib/per-us-sync.js +274 -0
  13. package/dist/plugins/specweave-github/lib/per-us-sync.js.map +1 -0
  14. package/dist/plugins/specweave-jira/lib/per-us-sync.d.ts +113 -0
  15. package/dist/plugins/specweave-jira/lib/per-us-sync.d.ts.map +1 -0
  16. package/dist/plugins/specweave-jira/lib/per-us-sync.js +254 -0
  17. package/dist/plugins/specweave-jira/lib/per-us-sync.js.map +1 -0
  18. package/dist/src/cli/add-child-pid.d.ts +11 -0
  19. package/dist/src/cli/add-child-pid.d.ts.map +1 -0
  20. package/dist/src/cli/add-child-pid.js +42 -0
  21. package/dist/src/cli/add-child-pid.js.map +1 -0
  22. package/dist/src/cli/add-child-process.d.ts +15 -0
  23. package/dist/src/cli/add-child-process.d.ts.map +1 -0
  24. package/dist/src/cli/add-child-process.js +40 -0
  25. package/dist/src/cli/add-child-process.js.map +1 -0
  26. package/dist/src/cli/check-watchdog.d.ts +15 -0
  27. package/dist/src/cli/check-watchdog.d.ts.map +1 -0
  28. package/dist/src/cli/check-watchdog.js +47 -0
  29. package/dist/src/cli/check-watchdog.js.map +1 -0
  30. package/dist/src/cli/cleanup-zombies.d.ts +14 -0
  31. package/dist/src/cli/cleanup-zombies.d.ts.map +1 -0
  32. package/dist/src/cli/cleanup-zombies.js +268 -0
  33. package/dist/src/cli/cleanup-zombies.js.map +1 -0
  34. package/dist/src/cli/find-session-by-pid.d.ts +14 -0
  35. package/dist/src/cli/find-session-by-pid.d.ts.map +1 -0
  36. package/dist/src/cli/find-session-by-pid.js +45 -0
  37. package/dist/src/cli/find-session-by-pid.js.map +1 -0
  38. package/dist/src/cli/get-stale-sessions.d.ts +17 -0
  39. package/dist/src/cli/get-stale-sessions.d.ts.map +1 -0
  40. package/dist/src/cli/get-stale-sessions.js +36 -0
  41. package/dist/src/cli/get-stale-sessions.js.map +1 -0
  42. package/dist/src/cli/register-session.d.ts +16 -0
  43. package/dist/src/cli/register-session.d.ts.map +1 -0
  44. package/dist/src/cli/register-session.js +48 -0
  45. package/dist/src/cli/register-session.js.map +1 -0
  46. package/dist/src/cli/remove-session.d.ts +11 -0
  47. package/dist/src/cli/remove-session.d.ts.map +1 -0
  48. package/dist/src/cli/remove-session.js +36 -0
  49. package/dist/src/cli/remove-session.js.map +1 -0
  50. package/dist/src/cli/update-heartbeat.d.ts +11 -0
  51. package/dist/src/cli/update-heartbeat.d.ts.map +1 -0
  52. package/dist/src/cli/update-heartbeat.js +36 -0
  53. package/dist/src/cli/update-heartbeat.js.map +1 -0
  54. package/dist/src/config/types.d.ts +1208 -203
  55. package/dist/src/config/types.d.ts.map +1 -1
  56. package/dist/src/core/background/job-manager.d.ts +16 -0
  57. package/dist/src/core/background/job-manager.d.ts.map +1 -1
  58. package/dist/src/core/background/job-manager.js +110 -15
  59. package/dist/src/core/background/job-manager.js.map +1 -1
  60. package/dist/src/core/config/config-manager.d.ts.map +1 -1
  61. package/dist/src/core/config/config-manager.js +58 -0
  62. package/dist/src/core/config/config-manager.js.map +1 -1
  63. package/dist/src/core/config/types.d.ts +80 -0
  64. package/dist/src/core/config/types.d.ts.map +1 -1
  65. package/dist/src/core/config/types.js.map +1 -1
  66. package/dist/src/core/increment/increment-utils.d.ts +26 -1
  67. package/dist/src/core/increment/increment-utils.d.ts.map +1 -1
  68. package/dist/src/core/increment/increment-utils.js +66 -4
  69. package/dist/src/core/increment/increment-utils.js.map +1 -1
  70. package/dist/src/core/increment/status-change-sync-trigger.d.ts +3 -1
  71. package/dist/src/core/increment/status-change-sync-trigger.d.ts.map +1 -1
  72. package/dist/src/core/increment/status-change-sync-trigger.js +5 -2
  73. package/dist/src/core/increment/status-change-sync-trigger.js.map +1 -1
  74. package/dist/src/core/living-docs/cross-project-sync.d.ts +87 -15
  75. package/dist/src/core/living-docs/cross-project-sync.d.ts.map +1 -1
  76. package/dist/src/core/living-docs/cross-project-sync.js +147 -28
  77. package/dist/src/core/living-docs/cross-project-sync.js.map +1 -1
  78. package/dist/src/core/living-docs/intelligent-analyzer/architecture-generator.d.ts.map +1 -1
  79. package/dist/src/core/living-docs/intelligent-analyzer/architecture-generator.js +48 -12
  80. package/dist/src/core/living-docs/intelligent-analyzer/architecture-generator.js.map +1 -1
  81. package/dist/src/core/living-docs/intelligent-analyzer/cache-manager.d.ts +70 -0
  82. package/dist/src/core/living-docs/intelligent-analyzer/cache-manager.d.ts.map +1 -0
  83. package/dist/src/core/living-docs/intelligent-analyzer/cache-manager.js +188 -0
  84. package/dist/src/core/living-docs/intelligent-analyzer/cache-manager.js.map +1 -0
  85. package/dist/src/core/living-docs/intelligent-analyzer/dashboard-generator.d.ts +33 -0
  86. package/dist/src/core/living-docs/intelligent-analyzer/dashboard-generator.d.ts.map +1 -0
  87. package/dist/src/core/living-docs/intelligent-analyzer/dashboard-generator.js +290 -0
  88. package/dist/src/core/living-docs/intelligent-analyzer/dashboard-generator.js.map +1 -0
  89. package/dist/src/core/living-docs/intelligent-analyzer/deep-repo-analyzer.d.ts.map +1 -1
  90. package/dist/src/core/living-docs/intelligent-analyzer/deep-repo-analyzer.js +114 -11
  91. package/dist/src/core/living-docs/intelligent-analyzer/deep-repo-analyzer.js.map +1 -1
  92. package/dist/src/core/living-docs/intelligent-analyzer/graph-visualizer.d.ts +23 -0
  93. package/dist/src/core/living-docs/intelligent-analyzer/graph-visualizer.d.ts.map +1 -0
  94. package/dist/src/core/living-docs/intelligent-analyzer/graph-visualizer.js +283 -0
  95. package/dist/src/core/living-docs/intelligent-analyzer/graph-visualizer.js.map +1 -0
  96. package/dist/src/core/living-docs/intelligent-analyzer/mermaid-generator.d.ts +44 -0
  97. package/dist/src/core/living-docs/intelligent-analyzer/mermaid-generator.d.ts.map +1 -0
  98. package/dist/src/core/living-docs/intelligent-analyzer/mermaid-generator.js +61 -0
  99. package/dist/src/core/living-docs/intelligent-analyzer/mermaid-generator.js.map +1 -0
  100. package/dist/src/core/living-docs/intelligent-analyzer/orchestrator.d.ts +126 -0
  101. package/dist/src/core/living-docs/intelligent-analyzer/orchestrator.d.ts.map +1 -0
  102. package/dist/src/core/living-docs/intelligent-analyzer/orchestrator.js +378 -0
  103. package/dist/src/core/living-docs/intelligent-analyzer/orchestrator.js.map +1 -0
  104. package/dist/src/core/living-docs/intelligent-analyzer/organization-synthesizer.d.ts.map +1 -1
  105. package/dist/src/core/living-docs/intelligent-analyzer/organization-synthesizer.js +57 -0
  106. package/dist/src/core/living-docs/intelligent-analyzer/organization-synthesizer.js.map +1 -1
  107. package/dist/src/core/living-docs/intelligent-analyzer/pattern-analyzer.d.ts +82 -0
  108. package/dist/src/core/living-docs/intelligent-analyzer/pattern-analyzer.d.ts.map +1 -0
  109. package/dist/src/core/living-docs/intelligent-analyzer/pattern-analyzer.js +430 -0
  110. package/dist/src/core/living-docs/intelligent-analyzer/pattern-analyzer.js.map +1 -0
  111. package/dist/src/core/living-docs/intelligent-analyzer/repo-scanner.d.ts +84 -0
  112. package/dist/src/core/living-docs/intelligent-analyzer/repo-scanner.d.ts.map +1 -0
  113. package/dist/src/core/living-docs/intelligent-analyzer/repo-scanner.js +387 -0
  114. package/dist/src/core/living-docs/intelligent-analyzer/repo-scanner.js.map +1 -0
  115. package/dist/src/core/living-docs/intelligent-analyzer/report-writer.d.ts +61 -0
  116. package/dist/src/core/living-docs/intelligent-analyzer/report-writer.d.ts.map +1 -0
  117. package/dist/src/core/living-docs/intelligent-analyzer/report-writer.js +174 -0
  118. package/dist/src/core/living-docs/intelligent-analyzer/report-writer.js.map +1 -0
  119. package/dist/src/core/living-docs/intelligent-analyzer/types.d.ts +1 -1
  120. package/dist/src/core/living-docs/intelligent-analyzer/types.d.ts.map +1 -1
  121. package/dist/src/core/living-docs/living-docs-sync.d.ts.map +1 -1
  122. package/dist/src/core/living-docs/living-docs-sync.js +26 -22
  123. package/dist/src/core/living-docs/living-docs-sync.js.map +1 -1
  124. package/dist/src/core/living-docs/module-analyzer.d.ts +3 -0
  125. package/dist/src/core/living-docs/module-analyzer.d.ts.map +1 -1
  126. package/dist/src/core/living-docs/module-analyzer.js +40 -1
  127. package/dist/src/core/living-docs/module-analyzer.js.map +1 -1
  128. package/dist/src/core/living-docs/types.d.ts +24 -3
  129. package/dist/src/core/living-docs/types.d.ts.map +1 -1
  130. package/dist/src/core/qa/qa-runner.js +1 -1
  131. package/dist/src/core/qa/qa-runner.js.map +1 -1
  132. package/dist/src/core/scheduler/session-sync-executor.js +1 -1
  133. package/dist/src/core/scheduler/session-sync-executor.js.map +1 -1
  134. package/dist/src/core/status-line/status-line-updater.d.ts +1 -1
  135. package/dist/src/core/status-line/status-line-updater.d.ts.map +1 -1
  136. package/dist/src/core/status-line/status-line-updater.js +4 -3
  137. package/dist/src/core/status-line/status-line-updater.js.map +1 -1
  138. package/dist/src/core/types/config.d.ts +79 -0
  139. package/dist/src/core/types/config.d.ts.map +1 -1
  140. package/dist/src/core/types/config.js.map +1 -1
  141. package/dist/src/importers/jira-importer.d.ts.map +1 -1
  142. package/dist/src/importers/jira-importer.js +18 -9
  143. package/dist/src/importers/jira-importer.js.map +1 -1
  144. package/dist/src/init/architecture/types.d.ts +140 -33
  145. package/dist/src/init/architecture/types.d.ts.map +1 -1
  146. package/dist/src/init/compliance/types.d.ts +27 -30
  147. package/dist/src/init/compliance/types.d.ts.map +1 -1
  148. package/dist/src/init/repo/types.d.ts +34 -11
  149. package/dist/src/init/repo/types.d.ts.map +1 -1
  150. package/dist/src/init/research/src/config/types.d.ts +82 -15
  151. package/dist/src/init/research/src/config/types.d.ts.map +1 -1
  152. package/dist/src/init/research/types.d.ts +93 -38
  153. package/dist/src/init/research/types.d.ts.map +1 -1
  154. package/dist/src/init/team/types.d.ts +42 -4
  155. package/dist/src/init/team/types.d.ts.map +1 -1
  156. package/dist/src/sync/ado-reconciler.js +1 -1
  157. package/dist/src/sync/ado-reconciler.js.map +1 -1
  158. package/dist/src/sync/github-reconciler.js +1 -1
  159. package/dist/src/sync/github-reconciler.js.map +1 -1
  160. package/dist/src/sync/jira-reconciler.js +1 -1
  161. package/dist/src/sync/jira-reconciler.js.map +1 -1
  162. package/dist/src/sync/sync-coordinator.d.ts +20 -0
  163. package/dist/src/sync/sync-coordinator.d.ts.map +1 -1
  164. package/dist/src/sync/sync-coordinator.js +258 -33
  165. package/dist/src/sync/sync-coordinator.js.map +1 -1
  166. package/dist/src/types/session.d.ts +65 -0
  167. package/dist/src/types/session.d.ts.map +1 -0
  168. package/dist/src/types/session.js +8 -0
  169. package/dist/src/types/session.js.map +1 -0
  170. package/dist/src/utils/lock-manager.d.ts +48 -0
  171. package/dist/src/utils/lock-manager.d.ts.map +1 -0
  172. package/dist/src/utils/lock-manager.js +195 -0
  173. package/dist/src/utils/lock-manager.js.map +1 -0
  174. package/dist/src/utils/notification-manager.d.ts +45 -0
  175. package/dist/src/utils/notification-manager.d.ts.map +1 -0
  176. package/dist/src/utils/notification-manager.js +130 -0
  177. package/dist/src/utils/notification-manager.js.map +1 -0
  178. package/dist/src/utils/platform-utils.d.ts +136 -0
  179. package/dist/src/utils/platform-utils.d.ts.map +1 -0
  180. package/dist/src/utils/platform-utils.js +366 -0
  181. package/dist/src/utils/platform-utils.js.map +1 -0
  182. package/dist/src/utils/project-resolver.d.ts +156 -0
  183. package/dist/src/utils/project-resolver.d.ts.map +1 -0
  184. package/dist/src/utils/project-resolver.js +587 -0
  185. package/dist/src/utils/project-resolver.js.map +1 -0
  186. package/dist/src/utils/session-registry.d.ts +142 -0
  187. package/dist/src/utils/session-registry.d.ts.map +1 -0
  188. package/dist/src/utils/session-registry.js +480 -0
  189. package/dist/src/utils/session-registry.js.map +1 -0
  190. package/package.json +5 -2
  191. package/plugins/specweave/commands/specweave-living-docs.md +42 -0
  192. package/plugins/specweave/hooks/hooks.json +20 -0
  193. package/plugins/specweave/hooks/lib/update-active-increment.sh +2 -2
  194. package/plugins/specweave/hooks/lib/update-status-line.sh +1 -1
  195. package/plugins/specweave/hooks/post-increment-status-change.sh +3 -3
  196. package/plugins/specweave/hooks/post-metadata-change.sh +1 -1
  197. package/plugins/specweave/hooks/universal/hook-wrapper.cmd +26 -26
  198. package/plugins/specweave/hooks/universal/session-start.cmd +16 -16
  199. package/plugins/specweave/hooks/universal/session-start.ps1 +16 -16
  200. package/plugins/specweave/hooks/user-prompt-submit.sh +107 -5
  201. package/plugins/specweave/hooks/v2/guards/increment-root-guard.sh +61 -0
  202. package/plugins/specweave/hooks/v2/guards/per-us-project-validator.sh +281 -0
  203. package/plugins/specweave/hooks/v2/handlers/living-specs-handler.sh +29 -0
  204. package/plugins/specweave/hooks/v2/session-end.sh +69 -0
  205. package/plugins/specweave/hooks/v2/session-start.sh +81 -0
  206. package/plugins/specweave/lib/vendor/sync/github-reconciler.js +1 -1
  207. package/plugins/specweave/lib/vendor/sync/github-reconciler.js.map +1 -1
  208. package/plugins/specweave/scripts/heartbeat.sh +110 -0
  209. package/plugins/specweave/scripts/progress.js +34 -4
  210. package/plugins/specweave/scripts/read-jobs.sh +1 -1
  211. package/plugins/specweave/scripts/read-progress.sh +50 -5
  212. package/plugins/specweave/scripts/read-workflow.sh +1 -1
  213. package/plugins/specweave/scripts/session-watchdog.sh +65 -0
  214. package/plugins/specweave/scripts/status.js +28 -11
  215. package/plugins/specweave-ado/lib/per-us-sync.js +247 -0
  216. package/plugins/specweave-ado/lib/per-us-sync.ts +410 -0
  217. package/plugins/specweave-github/hooks/.specweave/logs/hooks-debug.log +738 -0
  218. package/plugins/specweave-github/lib/github-client-v2.js +10 -3
  219. package/plugins/specweave-github/lib/github-client-v2.ts +15 -3
  220. package/plugins/specweave-github/lib/per-us-sync.js +241 -0
  221. package/plugins/specweave-github/lib/per-us-sync.ts +375 -0
  222. package/plugins/specweave-jira/lib/per-us-sync.js +224 -0
  223. package/plugins/specweave-jira/lib/per-us-sync.ts +366 -0
  224. package/plugins/specweave-release/hooks/.specweave/logs/dora-tracking.log +1107 -0
@@ -0,0 +1,387 @@
1
+ /**
2
+ * Repo Scanner
3
+ *
4
+ * Discovers and inventories all repositories in the project.
5
+ * Detects repo type (frontend/backend/mobile/shared-lib) and extracts tech stack.
6
+ */
7
+ import * as fs from 'fs';
8
+ import * as path from 'path';
9
+ import { consoleLogger } from '../../../utils/logger.js';
10
+ /**
11
+ * Repository scanner that discovers repos and extracts metadata.
12
+ */
13
+ export class RepoScanner {
14
+ constructor(projectRoot, logger) {
15
+ this.projectRoot = projectRoot;
16
+ this.logger = logger ?? consoleLogger;
17
+ }
18
+ /**
19
+ * Scan all repos (umbrella or single).
20
+ */
21
+ async scanAll() {
22
+ const repos = await this.discoverRepos();
23
+ const repoInfos = [];
24
+ for (const repo of repos) {
25
+ const info = await this.scanRepo(repo.path);
26
+ repoInfos.push(info);
27
+ }
28
+ return repoInfos;
29
+ }
30
+ /**
31
+ * Scan a single repository.
32
+ */
33
+ async scanRepo(repoPath) {
34
+ const name = path.basename(repoPath);
35
+ const type = this.detectRepoType(repoPath);
36
+ const techStack = await this.extractTechStack(repoPath);
37
+ const fileCount = this.countFiles(repoPath);
38
+ const lineCount = await this.countLines(repoPath);
39
+ const languages = this.detectLanguages(repoPath);
40
+ const { lastCommit, branch } = this.getGitInfo(repoPath);
41
+ return {
42
+ path: repoPath,
43
+ name,
44
+ type,
45
+ techStack,
46
+ fileCount,
47
+ lineCount,
48
+ languages,
49
+ lastCommit,
50
+ branch,
51
+ };
52
+ }
53
+ /**
54
+ * Detect repository type based on file patterns.
55
+ */
56
+ detectRepoType(repoPath) {
57
+ // Check package.json for Node.js projects
58
+ const packageJsonPath = path.join(repoPath, 'package.json');
59
+ if (fs.existsSync(packageJsonPath)) {
60
+ try {
61
+ const pkg = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));
62
+ const deps = { ...pkg.dependencies, ...pkg.devDependencies };
63
+ // Frontend indicators
64
+ if (deps['react'] || deps['vue'] || deps['@angular/core'] || deps['svelte']) {
65
+ return 'frontend';
66
+ }
67
+ // Mobile indicators
68
+ if (deps['react-native'] || deps['expo'] || deps['@ionic/angular']) {
69
+ return 'mobile';
70
+ }
71
+ // Backend indicators
72
+ if (deps['express'] || deps['fastify'] || deps['koa'] || deps['@nestjs/core']) {
73
+ return 'backend';
74
+ }
75
+ }
76
+ catch {
77
+ // Ignore parse errors
78
+ }
79
+ }
80
+ // Check go.mod for Go projects
81
+ if (fs.existsSync(path.join(repoPath, 'go.mod'))) {
82
+ return 'backend';
83
+ }
84
+ // Check requirements.txt for Python projects
85
+ if (fs.existsSync(path.join(repoPath, 'requirements.txt'))) {
86
+ const content = fs.readFileSync(path.join(repoPath, 'requirements.txt'), 'utf-8');
87
+ if (content.includes('django') || content.includes('flask') || content.includes('fastapi')) {
88
+ return 'backend';
89
+ }
90
+ }
91
+ // Check for Terraform/infrastructure
92
+ const tfFiles = this.findFiles(repoPath, /\.tf$/);
93
+ if (tfFiles.length > 0) {
94
+ return 'infrastructure';
95
+ }
96
+ // Check for shared library indicators
97
+ const hasTypesFolder = fs.existsSync(path.join(repoPath, 'types'));
98
+ const hasUtilsFolder = fs.existsSync(path.join(repoPath, 'utils'));
99
+ const hasSharedFolder = fs.existsSync(path.join(repoPath, 'shared'));
100
+ if ((hasTypesFolder || hasUtilsFolder || hasSharedFolder) && packageJsonPath) {
101
+ try {
102
+ const pkg = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));
103
+ if (pkg.main || pkg.exports) {
104
+ return 'shared-lib';
105
+ }
106
+ }
107
+ catch {
108
+ // Ignore
109
+ }
110
+ }
111
+ return 'unknown';
112
+ }
113
+ /**
114
+ * Extract tech stack from repository.
115
+ */
116
+ async extractTechStack(repoPath) {
117
+ const techStack = {
118
+ primary: 'unknown',
119
+ };
120
+ // Check package.json for Node.js/TypeScript
121
+ const packageJsonPath = path.join(repoPath, 'package.json');
122
+ if (fs.existsSync(packageJsonPath)) {
123
+ try {
124
+ const pkg = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));
125
+ const deps = { ...pkg.dependencies, ...pkg.devDependencies };
126
+ // Primary language
127
+ if (deps['typescript'] || fs.existsSync(path.join(repoPath, 'tsconfig.json'))) {
128
+ techStack.primary = 'typescript';
129
+ }
130
+ else {
131
+ techStack.primary = 'javascript';
132
+ }
133
+ // Framework detection
134
+ if (deps['next'])
135
+ techStack.framework = 'nextjs';
136
+ else if (deps['@nestjs/core'])
137
+ techStack.framework = 'nestjs';
138
+ else if (deps['express'])
139
+ techStack.framework = 'express';
140
+ else if (deps['fastify'])
141
+ techStack.framework = 'fastify';
142
+ else if (deps['react'])
143
+ techStack.framework = 'react';
144
+ else if (deps['vue'])
145
+ techStack.framework = 'vue';
146
+ else if (deps['@angular/core'])
147
+ techStack.framework = 'angular';
148
+ // Database detection
149
+ if (deps['pg'] || deps['postgres'])
150
+ techStack.database = 'postgresql';
151
+ else if (deps['mysql'] || deps['mysql2'])
152
+ techStack.database = 'mysql';
153
+ else if (deps['mongodb'] || deps['mongoose'])
154
+ techStack.database = 'mongodb';
155
+ else if (deps['redis'])
156
+ techStack.database = 'redis';
157
+ // ORM detection
158
+ if (deps['prisma'] || deps['@prisma/client'])
159
+ techStack.orm = 'prisma';
160
+ else if (deps['typeorm'])
161
+ techStack.orm = 'typeorm';
162
+ else if (deps['sequelize'])
163
+ techStack.orm = 'sequelize';
164
+ else if (deps['mongoose'])
165
+ techStack.orm = 'mongoose';
166
+ // Testing framework
167
+ if (deps['jest'])
168
+ techStack.testing = 'jest';
169
+ else if (deps['vitest'])
170
+ techStack.testing = 'vitest';
171
+ else if (deps['mocha'])
172
+ techStack.testing = 'mocha';
173
+ else if (deps['@playwright/test'])
174
+ techStack.testing = 'playwright';
175
+ }
176
+ catch {
177
+ // Ignore parse errors
178
+ }
179
+ }
180
+ // Check go.mod for Go projects
181
+ if (fs.existsSync(path.join(repoPath, 'go.mod'))) {
182
+ techStack.primary = 'go';
183
+ const goModContent = fs.readFileSync(path.join(repoPath, 'go.mod'), 'utf-8');
184
+ if (goModContent.includes('gin-gonic/gin'))
185
+ techStack.framework = 'gin';
186
+ else if (goModContent.includes('gorilla/mux'))
187
+ techStack.framework = 'gorilla';
188
+ if (goModContent.includes('gorm.io/gorm'))
189
+ techStack.orm = 'gorm';
190
+ }
191
+ // Check requirements.txt for Python
192
+ const requirementsTxt = path.join(repoPath, 'requirements.txt');
193
+ if (fs.existsSync(requirementsTxt)) {
194
+ techStack.primary = 'python';
195
+ const content = fs.readFileSync(requirementsTxt, 'utf-8');
196
+ if (content.includes('django'))
197
+ techStack.framework = 'django';
198
+ else if (content.includes('flask'))
199
+ techStack.framework = 'flask';
200
+ else if (content.includes('fastapi'))
201
+ techStack.framework = 'fastapi';
202
+ if (content.includes('sqlalchemy'))
203
+ techStack.orm = 'sqlalchemy';
204
+ if (content.includes('pytest'))
205
+ techStack.testing = 'pytest';
206
+ }
207
+ // Check for Rust
208
+ if (fs.existsSync(path.join(repoPath, 'Cargo.toml'))) {
209
+ techStack.primary = 'rust';
210
+ }
211
+ // Check for Java
212
+ if (fs.existsSync(path.join(repoPath, 'pom.xml')) || fs.existsSync(path.join(repoPath, 'build.gradle'))) {
213
+ techStack.primary = 'java';
214
+ }
215
+ return techStack;
216
+ }
217
+ /**
218
+ * Count files in repository (excluding node_modules, .git, etc.).
219
+ */
220
+ countFiles(repoPath) {
221
+ let count = 0;
222
+ const excludeDirs = ['node_modules', '.git', 'dist', 'build', '.specweave', 'coverage', '__pycache__'];
223
+ const walk = (dir) => {
224
+ try {
225
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
226
+ for (const entry of entries) {
227
+ if (excludeDirs.includes(entry.name))
228
+ continue;
229
+ const fullPath = path.join(dir, entry.name);
230
+ if (entry.isDirectory()) {
231
+ walk(fullPath);
232
+ }
233
+ else {
234
+ count++;
235
+ }
236
+ }
237
+ }
238
+ catch {
239
+ // Ignore permission errors
240
+ }
241
+ };
242
+ walk(repoPath);
243
+ return count;
244
+ }
245
+ /**
246
+ * Count total lines of code.
247
+ */
248
+ async countLines(repoPath) {
249
+ // Simplified - would use cloc or similar in production
250
+ return 0; // Placeholder
251
+ }
252
+ /**
253
+ * Detect languages used in repository.
254
+ */
255
+ detectLanguages(repoPath) {
256
+ const langCounts = {};
257
+ const excludeDirs = ['node_modules', '.git', 'dist', 'build', '.specweave'];
258
+ const walk = (dir) => {
259
+ try {
260
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
261
+ for (const entry of entries) {
262
+ if (excludeDirs.includes(entry.name))
263
+ continue;
264
+ const fullPath = path.join(dir, entry.name);
265
+ if (entry.isDirectory()) {
266
+ walk(fullPath);
267
+ }
268
+ else {
269
+ const ext = path.extname(entry.name);
270
+ const lang = this.extensionToLanguage(ext);
271
+ if (lang) {
272
+ langCounts[lang] = (langCounts[lang] || 0) + 1;
273
+ }
274
+ }
275
+ }
276
+ }
277
+ catch {
278
+ // Ignore permission errors
279
+ }
280
+ };
281
+ walk(repoPath);
282
+ const total = Object.values(langCounts).reduce((sum, count) => sum + count, 0);
283
+ const stats = [];
284
+ for (const [language, fileCount] of Object.entries(langCounts)) {
285
+ stats.push({
286
+ language,
287
+ fileCount,
288
+ percentage: Math.round((fileCount / total) * 100),
289
+ });
290
+ }
291
+ return stats.sort((a, b) => b.fileCount - a.fileCount);
292
+ }
293
+ /**
294
+ * Map file extension to language.
295
+ */
296
+ extensionToLanguage(ext) {
297
+ const map = {
298
+ '.ts': 'TypeScript',
299
+ '.tsx': 'TypeScript',
300
+ '.js': 'JavaScript',
301
+ '.jsx': 'JavaScript',
302
+ '.py': 'Python',
303
+ '.go': 'Go',
304
+ '.rs': 'Rust',
305
+ '.java': 'Java',
306
+ '.kt': 'Kotlin',
307
+ '.rb': 'Ruby',
308
+ '.php': 'PHP',
309
+ '.cs': 'C#',
310
+ '.cpp': 'C++',
311
+ '.c': 'C',
312
+ '.swift': 'Swift',
313
+ };
314
+ return map[ext] || null;
315
+ }
316
+ /**
317
+ * Get Git information for repository.
318
+ */
319
+ getGitInfo(repoPath) {
320
+ try {
321
+ const { execSync } = require('child_process');
322
+ const lastCommit = execSync('git rev-parse HEAD', {
323
+ cwd: repoPath,
324
+ encoding: 'utf-8',
325
+ }).trim();
326
+ const branch = execSync('git rev-parse --abbrev-ref HEAD', {
327
+ cwd: repoPath,
328
+ encoding: 'utf-8',
329
+ }).trim();
330
+ return { lastCommit, branch };
331
+ }
332
+ catch {
333
+ return { lastCommit: 'unknown', branch: 'unknown' };
334
+ }
335
+ }
336
+ /**
337
+ * Discover all repos from config.
338
+ */
339
+ async discoverRepos() {
340
+ const configPath = path.join(this.projectRoot, '.specweave/config.json');
341
+ if (!fs.existsSync(configPath)) {
342
+ return [{ name: path.basename(this.projectRoot), path: this.projectRoot }];
343
+ }
344
+ try {
345
+ const config = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
346
+ if (config.umbrella && config.umbrella.childRepos) {
347
+ return config.umbrella.childRepos.map((repo) => ({
348
+ name: repo.name,
349
+ path: path.join(this.projectRoot, repo.path),
350
+ }));
351
+ }
352
+ }
353
+ catch (error) {
354
+ this.logger.warn(`Failed to load config: ${error}`);
355
+ }
356
+ return [{ name: path.basename(this.projectRoot), path: this.projectRoot }];
357
+ }
358
+ /**
359
+ * Find files matching pattern.
360
+ */
361
+ findFiles(repoPath, pattern) {
362
+ const files = [];
363
+ const excludeDirs = ['node_modules', '.git', 'dist', 'build'];
364
+ const walk = (dir) => {
365
+ try {
366
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
367
+ for (const entry of entries) {
368
+ if (excludeDirs.includes(entry.name))
369
+ continue;
370
+ const fullPath = path.join(dir, entry.name);
371
+ if (entry.isDirectory()) {
372
+ walk(fullPath);
373
+ }
374
+ else if (pattern.test(entry.name)) {
375
+ files.push(fullPath);
376
+ }
377
+ }
378
+ }
379
+ catch {
380
+ // Ignore errors
381
+ }
382
+ };
383
+ walk(repoPath);
384
+ return files;
385
+ }
386
+ }
387
+ //# sourceMappingURL=repo-scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repo-scanner.js","sourceRoot":"","sources":["../../../../../src/core/living-docs/intelligent-analyzer/repo-scanner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Report Writer
3
+ *
4
+ * Generates markdown reports for technical debt, team structure, and other documentation.
5
+ */
6
+ export interface TechDebtItem {
7
+ severity: 'P1' | 'P2' | 'P3';
8
+ category: 'large-file' | 'high-complexity' | 'outdated-deps' | 'pattern-inconsistency' | 'circular-dep';
9
+ file: string;
10
+ lineNumber?: number;
11
+ description: string;
12
+ impact: string;
13
+ recommendation: string;
14
+ estimatedEffort: string;
15
+ }
16
+ export interface TechDebtReport {
17
+ items: TechDebtItem[];
18
+ summary: {
19
+ p1Count: number;
20
+ p2Count: number;
21
+ p3Count: number;
22
+ totalCount: number;
23
+ };
24
+ }
25
+ export interface TeamInfo {
26
+ name: string;
27
+ modules: string[];
28
+ techStack: string[];
29
+ contact?: string;
30
+ repos: string[];
31
+ }
32
+ /**
33
+ * Writes formatted markdown reports.
34
+ */
35
+ export declare class ReportWriter {
36
+ /**
37
+ * Generate technical debt report in markdown format.
38
+ */
39
+ generateTechDebtReport(report: TechDebtReport): string;
40
+ /**
41
+ * Format individual tech debt item.
42
+ */
43
+ private formatTechDebtItem;
44
+ /**
45
+ * Get human-readable category label.
46
+ */
47
+ private getCategoryLabel;
48
+ /**
49
+ * Generate team structure documentation.
50
+ */
51
+ generateTeamStructure(teams: TeamInfo[]): string;
52
+ /**
53
+ * Generate organization chart in Mermaid format.
54
+ */
55
+ generateOrgChart(teams: TeamInfo[]): string;
56
+ /**
57
+ * Sanitize ID for Mermaid diagrams.
58
+ */
59
+ private sanitizeId;
60
+ }
61
+ //# sourceMappingURL=report-writer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report-writer.d.ts","sourceRoot":"","sources":["../../../../../src/core/living-docs/intelligent-analyzer/report-writer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC7B,QAAQ,EAAE,YAAY,GAAG,iBAAiB,GAAG,eAAe,GAAG,uBAAuB,GAAG,cAAc,CAAC;IACxG,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,OAAO,EAAE;QACP,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;QAChB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;CACH;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED;;GAEG;AACH,qBAAa,YAAY;IACvB;;OAEG;IACH,sBAAsB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM;IAuEtD;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAgB1B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAWxB;;OAEG;IACH,qBAAqB,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,MAAM;IAmDhD;;OAEG;IACH,gBAAgB,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,MAAM;IAoB3C;;OAEG;IACH,OAAO,CAAC,UAAU;CAGnB"}
@@ -0,0 +1,174 @@
1
+ /**
2
+ * Report Writer
3
+ *
4
+ * Generates markdown reports for technical debt, team structure, and other documentation.
5
+ */
6
+ /**
7
+ * Writes formatted markdown reports.
8
+ */
9
+ export class ReportWriter {
10
+ /**
11
+ * Generate technical debt report in markdown format.
12
+ */
13
+ generateTechDebtReport(report) {
14
+ const { items, summary } = report;
15
+ let md = `# Technical Debt Report
16
+
17
+ **Generated**: ${new Date().toISOString().split('T')[0]}
18
+ **Total Items**: ${summary.totalCount}
19
+
20
+ ---
21
+
22
+ ## Summary
23
+
24
+ | Severity | Count | Description |
25
+ |----------|-------|-------------|
26
+ | **P1 (Critical)** | ${summary.p1Count} | Must fix - impacts production or security |
27
+ | **P2 (Important)** | ${summary.p2Count} | Should fix - reduces maintainability |
28
+ | **P3 (Nice-to-have)** | ${summary.p3Count} | Optional - minor improvements |
29
+
30
+ ---
31
+
32
+ `;
33
+ // Group by severity
34
+ const p1Items = items.filter(i => i.severity === 'P1');
35
+ const p2Items = items.filter(i => i.severity === 'P2');
36
+ const p3Items = items.filter(i => i.severity === 'P3');
37
+ // P1 Critical Issues
38
+ if (p1Items.length > 0) {
39
+ md += `## 🔴 P1 - Critical Issues\n\n`;
40
+ md += `**These issues must be addressed immediately.**\n\n`;
41
+ p1Items.forEach((item, index) => {
42
+ md += this.formatTechDebtItem(item, index + 1);
43
+ });
44
+ }
45
+ // P2 Important Issues
46
+ if (p2Items.length > 0) {
47
+ md += `## 🟡 P2 - Important Issues\n\n`;
48
+ md += `**These issues should be addressed in the next sprint.**\n\n`;
49
+ p2Items.forEach((item, index) => {
50
+ md += this.formatTechDebtItem(item, index + 1);
51
+ });
52
+ }
53
+ // P3 Nice-to-have
54
+ if (p3Items.length > 0) {
55
+ md += `## 🟢 P3 - Nice-to-have Improvements\n\n`;
56
+ md += `**These improvements can be addressed when time permits.**\n\n`;
57
+ p3Items.forEach((item, index) => {
58
+ md += this.formatTechDebtItem(item, index + 1);
59
+ });
60
+ }
61
+ // No issues
62
+ if (items.length === 0) {
63
+ md += `## ✅ No Technical Debt Detected\n\n`;
64
+ md += `Great work! No significant technical debt was found during analysis.\n\n`;
65
+ }
66
+ // Footer
67
+ md += `---\n\n`;
68
+ md += `**Next Steps**:\n`;
69
+ md += `1. Review all P1 issues and create tasks to address them\n`;
70
+ md += `2. Prioritize P2 issues for next sprint planning\n`;
71
+ md += `3. Consider P3 improvements during refactoring cycles\n\n`;
72
+ md += `Generated by SpecWeave Intelligent Living Docs\n`;
73
+ return md;
74
+ }
75
+ /**
76
+ * Format individual tech debt item.
77
+ */
78
+ formatTechDebtItem(item, index) {
79
+ const location = item.lineNumber
80
+ ? `${item.file}:${item.lineNumber}`
81
+ : item.file;
82
+ let md = `### ${index}. ${this.getCategoryLabel(item.category)}\n\n`;
83
+ md += `**File**: \`${location}\`\n\n`;
84
+ md += `**Description**: ${item.description}\n\n`;
85
+ md += `**Impact**: ${item.impact}\n\n`;
86
+ md += `**Recommendation**: ${item.recommendation}\n\n`;
87
+ md += `**Estimated Effort**: ${item.estimatedEffort}\n\n`;
88
+ md += `---\n\n`;
89
+ return md;
90
+ }
91
+ /**
92
+ * Get human-readable category label.
93
+ */
94
+ getCategoryLabel(category) {
95
+ const labels = {
96
+ 'large-file': 'Large File (>1000 lines)',
97
+ 'high-complexity': 'High Complexity Function',
98
+ 'outdated-deps': 'Outdated Dependencies',
99
+ 'pattern-inconsistency': 'Pattern Inconsistency',
100
+ 'circular-dep': 'Circular Dependency',
101
+ };
102
+ return labels[category] || category;
103
+ }
104
+ /**
105
+ * Generate team structure documentation.
106
+ */
107
+ generateTeamStructure(teams) {
108
+ let md = `# Team Structure & Ownership
109
+
110
+ **Generated**: ${new Date().toISOString().split('T')[0]}
111
+ **Teams**: ${teams.length}
112
+
113
+ ---
114
+
115
+ ## Overview
116
+
117
+ This document describes the team structure, module ownership, and technical responsibilities across the organization.
118
+
119
+ ---
120
+
121
+ `;
122
+ teams.forEach((team, index) => {
123
+ md += `## ${index + 1}. ${team.name}\n\n`;
124
+ if (team.contact) {
125
+ md += `**Contact**: ${team.contact}\n\n`;
126
+ }
127
+ md += `**Repositories**:\n`;
128
+ team.repos.forEach(repo => {
129
+ md += `- \`${repo}\`\n`;
130
+ });
131
+ md += `\n`;
132
+ md += `**Owned Modules**:\n`;
133
+ team.modules.forEach(module => {
134
+ md += `- ${module}\n`;
135
+ });
136
+ md += `\n`;
137
+ md += `**Tech Stack**:\n`;
138
+ team.techStack.forEach(tech => {
139
+ md += `- ${tech}\n`;
140
+ });
141
+ md += `\n`;
142
+ md += `---\n\n`;
143
+ });
144
+ // Footer
145
+ md += `**Note**: This document is automatically generated from codebase analysis and configuration files. Update team information in \`.specweave/config.json\` to reflect changes.\n\n`;
146
+ md += `Generated by SpecWeave Intelligent Living Docs\n`;
147
+ return md;
148
+ }
149
+ /**
150
+ * Generate organization chart in Mermaid format.
151
+ */
152
+ generateOrgChart(teams) {
153
+ let mmd = `graph TD\n`;
154
+ mmd += ` ROOT[Organization]\n\n`;
155
+ teams.forEach(team => {
156
+ const teamId = this.sanitizeId(team.name);
157
+ mmd += ` ROOT --> ${teamId}["${team.name}"]\n`;
158
+ // Add repos under each team
159
+ team.repos.forEach(repo => {
160
+ const repoId = this.sanitizeId(`${team.name}-${repo}`);
161
+ mmd += ` ${teamId} --> ${repoId}["${repo}"]\n`;
162
+ });
163
+ mmd += `\n`;
164
+ });
165
+ return mmd;
166
+ }
167
+ /**
168
+ * Sanitize ID for Mermaid diagrams.
169
+ */
170
+ sanitizeId(id) {
171
+ return id.replace(/[^a-zA-Z0-9_]/g, '_');
172
+ }
173
+ }
174
+ //# sourceMappingURL=report-writer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report-writer.js","sourceRoot":"","sources":["../../../../../src/core/living-docs/intelligent-analyzer/report-writer.ts"],"names":[],"mappings":"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"}
@@ -52,7 +52,7 @@ export interface ApiSurface {
52
52
  */
53
53
  export interface PatternUsage {
54
54
  pattern: string;
55
- category: 'auth' | 'api' | 'data' | 'messaging' | 'architecture' | 'other';
55
+ category: 'auth' | 'api' | 'data' | 'messaging' | 'architecture' | 'security' | 'cloud' | 'deployment' | 'frontend' | 'testing' | 'quality' | 'integration' | 'structure' | 'other';
56
56
  evidence: string[];
57
57
  confidence: 'high' | 'medium' | 'low';
58
58
  }