@mc1global/opencode-jarvis 0.1.0 → 0.3.0

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 (295) hide show
  1. package/dist/application/agent-registry/dtos.d.ts +66 -0
  2. package/dist/application/agent-registry/dtos.d.ts.map +1 -0
  3. package/dist/application/agent-registry/dtos.js +11 -0
  4. package/dist/application/agent-registry/dtos.js.map +1 -0
  5. package/dist/application/agent-registry/use-cases.d.ts +39 -0
  6. package/dist/application/agent-registry/use-cases.d.ts.map +1 -0
  7. package/dist/application/agent-registry/use-cases.js +222 -0
  8. package/dist/application/agent-registry/use-cases.js.map +1 -0
  9. package/dist/application/azure-sync/dtos.d.ts +210 -0
  10. package/dist/application/azure-sync/dtos.d.ts.map +1 -0
  11. package/dist/application/azure-sync/dtos.js +11 -0
  12. package/dist/application/azure-sync/dtos.js.map +1 -0
  13. package/dist/application/azure-sync/field-builders.d.ts +54 -0
  14. package/dist/application/azure-sync/field-builders.d.ts.map +1 -0
  15. package/dist/application/azure-sync/field-builders.js +166 -0
  16. package/dist/application/azure-sync/field-builders.js.map +1 -0
  17. package/dist/application/azure-sync/index.d.ts +16 -0
  18. package/dist/application/azure-sync/index.d.ts.map +1 -0
  19. package/dist/application/azure-sync/index.js +10 -0
  20. package/dist/application/azure-sync/index.js.map +1 -0
  21. package/dist/application/azure-sync/pr-use-cases.d.ts +39 -0
  22. package/dist/application/azure-sync/pr-use-cases.d.ts.map +1 -0
  23. package/dist/application/azure-sync/pr-use-cases.js +192 -0
  24. package/dist/application/azure-sync/pr-use-cases.js.map +1 -0
  25. package/dist/application/azure-sync/pull-use-cases.d.ts +43 -0
  26. package/dist/application/azure-sync/pull-use-cases.d.ts.map +1 -0
  27. package/dist/application/azure-sync/pull-use-cases.js +322 -0
  28. package/dist/application/azure-sync/pull-use-cases.js.map +1 -0
  29. package/dist/application/azure-sync/push-use-cases.d.ts +53 -0
  30. package/dist/application/azure-sync/push-use-cases.d.ts.map +1 -0
  31. package/dist/application/azure-sync/push-use-cases.js +341 -0
  32. package/dist/application/azure-sync/push-use-cases.js.map +1 -0
  33. package/dist/application/azure-sync/reverse-field-builder.d.ts +52 -0
  34. package/dist/application/azure-sync/reverse-field-builder.d.ts.map +1 -0
  35. package/dist/application/azure-sync/reverse-field-builder.js +130 -0
  36. package/dist/application/azure-sync/reverse-field-builder.js.map +1 -0
  37. package/dist/application/azure-sync/task-push-use-cases.d.ts +68 -0
  38. package/dist/application/azure-sync/task-push-use-cases.d.ts.map +1 -0
  39. package/dist/application/azure-sync/task-push-use-cases.js +162 -0
  40. package/dist/application/azure-sync/task-push-use-cases.js.map +1 -0
  41. package/dist/application/config/config-service.d.ts +64 -0
  42. package/dist/application/config/config-service.d.ts.map +1 -0
  43. package/dist/application/config/config-service.js +110 -0
  44. package/dist/application/config/config-service.js.map +1 -0
  45. package/dist/application/config/index.d.ts +5 -0
  46. package/dist/application/config/index.d.ts.map +1 -0
  47. package/dist/application/config/index.js +5 -0
  48. package/dist/application/config/index.js.map +1 -0
  49. package/dist/application/kanban/board-use-cases.d.ts.map +1 -1
  50. package/dist/application/kanban/board-use-cases.js +14 -0
  51. package/dist/application/kanban/board-use-cases.js.map +1 -1
  52. package/dist/application/kanban/card-use-cases.d.ts +21 -2
  53. package/dist/application/kanban/card-use-cases.d.ts.map +1 -1
  54. package/dist/application/kanban/card-use-cases.js +180 -1
  55. package/dist/application/kanban/card-use-cases.js.map +1 -1
  56. package/dist/application/kanban/dtos.d.ts +59 -0
  57. package/dist/application/kanban/dtos.d.ts.map +1 -1
  58. package/dist/application/mcp/index.d.ts +10 -0
  59. package/dist/application/mcp/index.d.ts.map +1 -0
  60. package/dist/application/mcp/index.js +8 -0
  61. package/dist/application/mcp/index.js.map +1 -0
  62. package/dist/application/mcp/middleware.d.ts +91 -0
  63. package/dist/application/mcp/middleware.d.ts.map +1 -0
  64. package/dist/application/mcp/middleware.js +84 -0
  65. package/dist/application/mcp/middleware.js.map +1 -0
  66. package/dist/application/mcp/tool-adapter.d.ts +72 -0
  67. package/dist/application/mcp/tool-adapter.d.ts.map +1 -0
  68. package/dist/application/mcp/tool-adapter.js +132 -0
  69. package/dist/application/mcp/tool-adapter.js.map +1 -0
  70. package/dist/application/pipeline/dtos.d.ts +135 -0
  71. package/dist/application/pipeline/dtos.d.ts.map +1 -0
  72. package/dist/application/pipeline/dtos.js +11 -0
  73. package/dist/application/pipeline/dtos.js.map +1 -0
  74. package/dist/application/pipeline/index.d.ts +8 -0
  75. package/dist/application/pipeline/index.d.ts.map +1 -0
  76. package/dist/application/pipeline/index.js +7 -0
  77. package/dist/application/pipeline/index.js.map +1 -0
  78. package/dist/application/pipeline/use-cases.d.ts +67 -0
  79. package/dist/application/pipeline/use-cases.d.ts.map +1 -0
  80. package/dist/application/pipeline/use-cases.js +413 -0
  81. package/dist/application/pipeline/use-cases.js.map +1 -0
  82. package/dist/application/rag/use-cases.d.ts +3 -0
  83. package/dist/application/rag/use-cases.d.ts.map +1 -1
  84. package/dist/application/rag/use-cases.js +112 -34
  85. package/dist/application/rag/use-cases.js.map +1 -1
  86. package/dist/domain/agent-registry/entities.d.ts +68 -0
  87. package/dist/domain/agent-registry/entities.d.ts.map +1 -0
  88. package/dist/domain/agent-registry/entities.js +177 -0
  89. package/dist/domain/agent-registry/entities.js.map +1 -0
  90. package/dist/domain/agent-registry/repositories.d.ts +56 -0
  91. package/dist/domain/agent-registry/repositories.d.ts.map +1 -0
  92. package/dist/domain/agent-registry/repositories.js +12 -0
  93. package/dist/domain/agent-registry/repositories.js.map +1 -0
  94. package/dist/domain/agent-registry/services.d.ts +87 -0
  95. package/dist/domain/agent-registry/services.d.ts.map +1 -0
  96. package/dist/domain/agent-registry/services.js +188 -0
  97. package/dist/domain/agent-registry/services.js.map +1 -0
  98. package/dist/domain/agent-registry/value-objects.d.ts +145 -0
  99. package/dist/domain/agent-registry/value-objects.d.ts.map +1 -0
  100. package/dist/domain/agent-registry/value-objects.js +339 -0
  101. package/dist/domain/agent-registry/value-objects.js.map +1 -0
  102. package/dist/domain/azure-sync/entities.d.ts +165 -0
  103. package/dist/domain/azure-sync/entities.d.ts.map +1 -0
  104. package/dist/domain/azure-sync/entities.js +203 -0
  105. package/dist/domain/azure-sync/entities.js.map +1 -0
  106. package/dist/domain/azure-sync/index.d.ts +16 -0
  107. package/dist/domain/azure-sync/index.d.ts.map +1 -0
  108. package/dist/domain/azure-sync/index.js +14 -0
  109. package/dist/domain/azure-sync/index.js.map +1 -0
  110. package/dist/domain/azure-sync/ports.d.ts +117 -0
  111. package/dist/domain/azure-sync/ports.d.ts.map +1 -0
  112. package/dist/domain/azure-sync/ports.js +13 -0
  113. package/dist/domain/azure-sync/ports.js.map +1 -0
  114. package/dist/domain/azure-sync/repositories.d.ts +53 -0
  115. package/dist/domain/azure-sync/repositories.d.ts.map +1 -0
  116. package/dist/domain/azure-sync/repositories.js +11 -0
  117. package/dist/domain/azure-sync/repositories.js.map +1 -0
  118. package/dist/domain/azure-sync/services.d.ts +107 -0
  119. package/dist/domain/azure-sync/services.d.ts.map +1 -0
  120. package/dist/domain/azure-sync/services.js +316 -0
  121. package/dist/domain/azure-sync/services.js.map +1 -0
  122. package/dist/domain/azure-sync/value-objects.d.ts +129 -0
  123. package/dist/domain/azure-sync/value-objects.d.ts.map +1 -0
  124. package/dist/domain/azure-sync/value-objects.js +343 -0
  125. package/dist/domain/azure-sync/value-objects.js.map +1 -0
  126. package/dist/domain/config/index.d.ts +9 -0
  127. package/dist/domain/config/index.d.ts.map +1 -0
  128. package/dist/domain/config/index.js +7 -0
  129. package/dist/domain/config/index.js.map +1 -0
  130. package/dist/domain/config/repositories.d.ts +36 -0
  131. package/dist/domain/config/repositories.d.ts.map +1 -0
  132. package/dist/domain/config/repositories.js +12 -0
  133. package/dist/domain/config/repositories.js.map +1 -0
  134. package/dist/domain/config/value-objects.d.ts +112 -0
  135. package/dist/domain/config/value-objects.d.ts.map +1 -0
  136. package/dist/domain/config/value-objects.js +93 -0
  137. package/dist/domain/config/value-objects.js.map +1 -0
  138. package/dist/domain/governance/policies.d.ts.map +1 -1
  139. package/dist/domain/governance/policies.js +70 -0
  140. package/dist/domain/governance/policies.js.map +1 -1
  141. package/dist/domain/kanban/entities.d.ts +67 -15
  142. package/dist/domain/kanban/entities.d.ts.map +1 -1
  143. package/dist/domain/kanban/entities.js +177 -14
  144. package/dist/domain/kanban/entities.js.map +1 -1
  145. package/dist/domain/kanban/grooming.d.ts +27 -7
  146. package/dist/domain/kanban/grooming.d.ts.map +1 -1
  147. package/dist/domain/kanban/grooming.js +50 -12
  148. package/dist/domain/kanban/grooming.js.map +1 -1
  149. package/dist/domain/kanban/services.d.ts +16 -2
  150. package/dist/domain/kanban/services.d.ts.map +1 -1
  151. package/dist/domain/kanban/services.js +29 -2
  152. package/dist/domain/kanban/services.js.map +1 -1
  153. package/dist/domain/kanban/value-objects.d.ts +48 -0
  154. package/dist/domain/kanban/value-objects.d.ts.map +1 -1
  155. package/dist/domain/kanban/value-objects.js +53 -0
  156. package/dist/domain/kanban/value-objects.js.map +1 -1
  157. package/dist/domain/pipeline/gate.d.ts +75 -0
  158. package/dist/domain/pipeline/gate.d.ts.map +1 -0
  159. package/dist/domain/pipeline/gate.js +158 -0
  160. package/dist/domain/pipeline/gate.js.map +1 -0
  161. package/dist/domain/pipeline/index.d.ts +13 -0
  162. package/dist/domain/pipeline/index.d.ts.map +1 -0
  163. package/dist/domain/pipeline/index.js +14 -0
  164. package/dist/domain/pipeline/index.js.map +1 -0
  165. package/dist/domain/pipeline/pipeline.d.ts +99 -0
  166. package/dist/domain/pipeline/pipeline.d.ts.map +1 -0
  167. package/dist/domain/pipeline/pipeline.js +257 -0
  168. package/dist/domain/pipeline/pipeline.js.map +1 -0
  169. package/dist/domain/pipeline/ports.d.ts +120 -0
  170. package/dist/domain/pipeline/ports.d.ts.map +1 -0
  171. package/dist/domain/pipeline/ports.js +12 -0
  172. package/dist/domain/pipeline/ports.js.map +1 -0
  173. package/dist/domain/pipeline/repositories.d.ts +66 -0
  174. package/dist/domain/pipeline/repositories.d.ts.map +1 -0
  175. package/dist/domain/pipeline/repositories.js +11 -0
  176. package/dist/domain/pipeline/repositories.js.map +1 -0
  177. package/dist/domain/pipeline/services.d.ts +77 -0
  178. package/dist/domain/pipeline/services.d.ts.map +1 -0
  179. package/dist/domain/pipeline/services.js +156 -0
  180. package/dist/domain/pipeline/services.js.map +1 -0
  181. package/dist/domain/pipeline/value-objects.d.ts +117 -0
  182. package/dist/domain/pipeline/value-objects.d.ts.map +1 -0
  183. package/dist/domain/pipeline/value-objects.js +313 -0
  184. package/dist/domain/pipeline/value-objects.js.map +1 -0
  185. package/dist/domain/rag/value-objects.d.ts +9 -2
  186. package/dist/domain/rag/value-objects.d.ts.map +1 -1
  187. package/dist/domain/rag/value-objects.js +8 -2
  188. package/dist/domain/rag/value-objects.js.map +1 -1
  189. package/dist/index.d.ts.map +1 -1
  190. package/dist/index.js +113 -75
  191. package/dist/index.js.map +1 -1
  192. package/dist/infrastructure/agent-registry/agent-profile-repository.d.ts +29 -0
  193. package/dist/infrastructure/agent-registry/agent-profile-repository.d.ts.map +1 -0
  194. package/dist/infrastructure/agent-registry/agent-profile-repository.js +109 -0
  195. package/dist/infrastructure/agent-registry/agent-profile-repository.js.map +1 -0
  196. package/dist/infrastructure/agent-registry/agent-session-adapter.d.ts +28 -0
  197. package/dist/infrastructure/agent-registry/agent-session-adapter.d.ts.map +1 -0
  198. package/dist/infrastructure/agent-registry/agent-session-adapter.js +61 -0
  199. package/dist/infrastructure/agent-registry/agent-session-adapter.js.map +1 -0
  200. package/dist/infrastructure/agent-registry/built-in-profiles.d.ts +19 -0
  201. package/dist/infrastructure/agent-registry/built-in-profiles.d.ts.map +1 -0
  202. package/dist/infrastructure/agent-registry/built-in-profiles.js +210 -0
  203. package/dist/infrastructure/agent-registry/built-in-profiles.js.map +1 -0
  204. package/dist/infrastructure/azure-sync/azure-auth.d.ts +40 -0
  205. package/dist/infrastructure/azure-sync/azure-auth.d.ts.map +1 -0
  206. package/dist/infrastructure/azure-sync/azure-auth.js +94 -0
  207. package/dist/infrastructure/azure-sync/azure-auth.js.map +1 -0
  208. package/dist/infrastructure/azure-sync/azure-devops-client.d.ts +43 -0
  209. package/dist/infrastructure/azure-sync/azure-devops-client.d.ts.map +1 -0
  210. package/dist/infrastructure/azure-sync/azure-devops-client.js +296 -0
  211. package/dist/infrastructure/azure-sync/azure-devops-client.js.map +1 -0
  212. package/dist/infrastructure/azure-sync/index.d.ts +9 -0
  213. package/dist/infrastructure/azure-sync/index.d.ts.map +1 -0
  214. package/dist/infrastructure/azure-sync/index.js +12 -0
  215. package/dist/infrastructure/azure-sync/index.js.map +1 -0
  216. package/dist/infrastructure/azure-sync/sqlite-sync-repository.d.ts +39 -0
  217. package/dist/infrastructure/azure-sync/sqlite-sync-repository.d.ts.map +1 -0
  218. package/dist/infrastructure/azure-sync/sqlite-sync-repository.js +202 -0
  219. package/dist/infrastructure/azure-sync/sqlite-sync-repository.js.map +1 -0
  220. package/dist/infrastructure/config/index.d.ts +5 -0
  221. package/dist/infrastructure/config/index.d.ts.map +1 -0
  222. package/dist/infrastructure/config/index.js +5 -0
  223. package/dist/infrastructure/config/index.js.map +1 -0
  224. package/dist/infrastructure/config/yaml-config-repository.d.ts +22 -0
  225. package/dist/infrastructure/config/yaml-config-repository.d.ts.map +1 -0
  226. package/dist/infrastructure/config/yaml-config-repository.js +68 -0
  227. package/dist/infrastructure/config/yaml-config-repository.js.map +1 -0
  228. package/dist/infrastructure/database/sqlite-adapter.d.ts +13 -15
  229. package/dist/infrastructure/database/sqlite-adapter.d.ts.map +1 -1
  230. package/dist/infrastructure/database/sqlite-adapter.js +31 -17
  231. package/dist/infrastructure/database/sqlite-adapter.js.map +1 -1
  232. package/dist/infrastructure/domain-map/llm-prompt-factory.d.ts +21 -0
  233. package/dist/infrastructure/domain-map/llm-prompt-factory.d.ts.map +1 -0
  234. package/dist/infrastructure/domain-map/llm-prompt-factory.js +49 -0
  235. package/dist/infrastructure/domain-map/llm-prompt-factory.js.map +1 -0
  236. package/dist/infrastructure/kanban/card-repository.d.ts +6 -0
  237. package/dist/infrastructure/kanban/card-repository.d.ts.map +1 -1
  238. package/dist/infrastructure/kanban/card-repository.js +79 -7
  239. package/dist/infrastructure/kanban/card-repository.js.map +1 -1
  240. package/dist/infrastructure/pipeline/dagger-adapter.d.ts +50 -0
  241. package/dist/infrastructure/pipeline/dagger-adapter.d.ts.map +1 -0
  242. package/dist/infrastructure/pipeline/dagger-adapter.js +153 -0
  243. package/dist/infrastructure/pipeline/dagger-adapter.js.map +1 -0
  244. package/dist/infrastructure/pipeline/dagger-scaffold-generator.d.ts +35 -0
  245. package/dist/infrastructure/pipeline/dagger-scaffold-generator.d.ts.map +1 -0
  246. package/dist/infrastructure/pipeline/dagger-scaffold-generator.js +132 -0
  247. package/dist/infrastructure/pipeline/dagger-scaffold-generator.js.map +1 -0
  248. package/dist/infrastructure/pipeline/index.d.ts +20 -0
  249. package/dist/infrastructure/pipeline/index.d.ts.map +1 -0
  250. package/dist/infrastructure/pipeline/index.js +19 -0
  251. package/dist/infrastructure/pipeline/index.js.map +1 -0
  252. package/dist/infrastructure/pipeline/pipeline-template-registry.d.ts +23 -0
  253. package/dist/infrastructure/pipeline/pipeline-template-registry.d.ts.map +1 -0
  254. package/dist/infrastructure/pipeline/pipeline-template-registry.js +63 -0
  255. package/dist/infrastructure/pipeline/pipeline-template-registry.js.map +1 -0
  256. package/dist/infrastructure/pipeline/scaffold-templates-extra.d.ts +17 -0
  257. package/dist/infrastructure/pipeline/scaffold-templates-extra.d.ts.map +1 -0
  258. package/dist/infrastructure/pipeline/scaffold-templates-extra.js +467 -0
  259. package/dist/infrastructure/pipeline/scaffold-templates-extra.js.map +1 -0
  260. package/dist/infrastructure/pipeline/scaffold-templates.d.ts +23 -0
  261. package/dist/infrastructure/pipeline/scaffold-templates.d.ts.map +1 -0
  262. package/dist/infrastructure/pipeline/scaffold-templates.js +476 -0
  263. package/dist/infrastructure/pipeline/scaffold-templates.js.map +1 -0
  264. package/dist/infrastructure/pipeline/sqlite-pipeline-repository.d.ts +32 -0
  265. package/dist/infrastructure/pipeline/sqlite-pipeline-repository.d.ts.map +1 -0
  266. package/dist/infrastructure/pipeline/sqlite-pipeline-repository.js +197 -0
  267. package/dist/infrastructure/pipeline/sqlite-pipeline-repository.js.map +1 -0
  268. package/dist/mcp-server.d.ts +3 -0
  269. package/dist/mcp-server.d.ts.map +1 -0
  270. package/dist/mcp-server.js +300 -0
  271. package/dist/mcp-server.js.map +1 -0
  272. package/dist/tools/agent-registry-tools.d.ts +11 -0
  273. package/dist/tools/agent-registry-tools.d.ts.map +1 -0
  274. package/dist/tools/agent-registry-tools.js +208 -0
  275. package/dist/tools/agent-registry-tools.js.map +1 -0
  276. package/dist/tools/azure-sync-tools.d.ts +15 -0
  277. package/dist/tools/azure-sync-tools.d.ts.map +1 -0
  278. package/dist/tools/azure-sync-tools.js +332 -0
  279. package/dist/tools/azure-sync-tools.js.map +1 -0
  280. package/dist/tools/kanban-card-tools.d.ts.map +1 -1
  281. package/dist/tools/kanban-card-tools.js +41 -16
  282. package/dist/tools/kanban-card-tools.js.map +1 -1
  283. package/dist/tools/kanban-gate-tools.d.ts +7 -0
  284. package/dist/tools/kanban-gate-tools.d.ts.map +1 -0
  285. package/dist/tools/kanban-gate-tools.js +106 -0
  286. package/dist/tools/kanban-gate-tools.js.map +1 -0
  287. package/dist/tools/kanban-grooming-tools.d.ts +7 -0
  288. package/dist/tools/kanban-grooming-tools.d.ts.map +1 -0
  289. package/dist/tools/kanban-grooming-tools.js +180 -0
  290. package/dist/tools/kanban-grooming-tools.js.map +1 -0
  291. package/dist/tools/pipeline-tools.d.ts +15 -0
  292. package/dist/tools/pipeline-tools.d.ts.map +1 -0
  293. package/dist/tools/pipeline-tools.js +424 -0
  294. package/dist/tools/pipeline-tools.js.map +1 -0
  295. package/package.json +9 -3
@@ -0,0 +1,296 @@
1
+ /**
2
+ * Azure Sync Infrastructure — Azure DevOps REST Client
3
+ *
4
+ * Implements the AzureDevOpsPort using fetch + az cli/PAT authentication.
5
+ * All API calls target Azure DevOps REST API v7.1.
6
+ *
7
+ * SOLID: SRP — HTTP communication with Azure DevOps API only
8
+ * SOLID: DIP — implements domain-defined AzureDevOpsPort interface
9
+ * DDD: Infrastructure adapter for external system integration
10
+ */
11
+ import { ok, fail } from "../../domain/shared/value-objects.js";
12
+ import { isValidProcessTemplate } from "../../domain/azure-sync/value-objects.js";
13
+ import { AzureAuthProvider } from "./azure-auth.js";
14
+ /** Azure DevOps REST API version. */
15
+ const API_VERSION = "7.1";
16
+ /**
17
+ * Azure DevOps REST API client.
18
+ * Implements the domain port interface for all Azure DevOps operations.
19
+ */
20
+ export class AzureDevOpsClient {
21
+ auth;
22
+ authMethod;
23
+ constructor(authMethod) {
24
+ this.authMethod = authMethod;
25
+ this.auth = new AzureAuthProvider(authMethod);
26
+ }
27
+ // ── Authentication ──────────────────────────────────────────────
28
+ async testConnection() {
29
+ const authResult = this.auth.getAuthHeader();
30
+ if (!authResult.success)
31
+ return authResult;
32
+ try {
33
+ const response = await fetch(`https://app.vssps.visualstudio.com/_apis/profile/profiles/me?api-version=${API_VERSION}`, { headers: { Authorization: authResult.data } });
34
+ if (!response.ok) {
35
+ return fail(`Connection test failed: ${response.status} ${response.statusText}`);
36
+ }
37
+ return ok("Connected successfully to Azure DevOps");
38
+ }
39
+ catch (error) {
40
+ return fail(`Connection test failed: ${errorMessage(error)}`);
41
+ }
42
+ }
43
+ // ── Project Discovery ───────────────────────────────────────────
44
+ async getProjectInfo(org, project) {
45
+ const result = await this.apiGet(org, `_apis/projects/${encodeURIComponent(project)}`);
46
+ if (!result.success)
47
+ return result;
48
+ const data = result.data;
49
+ const templateName = data.capabilities?.processTemplate?.templateName?.toLowerCase() ?? "basic";
50
+ const processTemplate = isValidProcessTemplate(templateName)
51
+ ? templateName
52
+ : "basic";
53
+ return ok({
54
+ id: data.id,
55
+ name: data.name,
56
+ description: data.description ?? "",
57
+ processTemplate,
58
+ url: data._links?.web?.href ?? "",
59
+ });
60
+ }
61
+ // ── Work Items ──────────────────────────────────────────────────
62
+ async getWorkItem(org, project, id) {
63
+ const result = await this.apiGet(org, `${encodeURIComponent(project)}/_apis/wit/workitems/${id}`, { "$expand": "all" });
64
+ return result;
65
+ }
66
+ async listWorkItems(org, project, workItemType, top = 200) {
67
+ // Use WIQL to query work items by type
68
+ const wiql = {
69
+ query: `SELECT [System.Id] FROM WorkItems WHERE [System.TeamProject] = '${project}' AND [System.WorkItemType] = '${workItemType}' ORDER BY [System.Id] DESC`,
70
+ };
71
+ const wiqlResult = await this.apiPost(org, `${encodeURIComponent(project)}/_apis/wit/wiql`, wiql, {
72
+ "$top": String(top),
73
+ });
74
+ if (!wiqlResult.success)
75
+ return wiqlResult;
76
+ const ids = wiqlResult.data.workItems.map((wi) => wi.id);
77
+ if (ids.length === 0)
78
+ return ok([]);
79
+ // Batch fetch work items (max 200 per request)
80
+ const batchIds = ids.slice(0, 200);
81
+ const idsParam = batchIds.join(",");
82
+ const itemsResult = await this.apiGet(org, `${encodeURIComponent(project)}/_apis/wit/workitems`, {
83
+ ids: idsParam,
84
+ "$expand": "all",
85
+ });
86
+ if (!itemsResult.success)
87
+ return itemsResult;
88
+ return ok(itemsResult.data.value);
89
+ }
90
+ async createWorkItem(org, project, workItemType, fields) {
91
+ const encodedType = encodeURIComponent(workItemType);
92
+ const result = await this.apiPatch(org, `${encodeURIComponent(project)}/_apis/wit/workitems/$${encodedType}`, fields);
93
+ if (!result.success)
94
+ return result;
95
+ return ok({
96
+ id: result.data.id,
97
+ rev: result.data.rev,
98
+ url: result.data._links?.html?.href ?? "",
99
+ });
100
+ }
101
+ async updateWorkItem(org, project, id, fields) {
102
+ const result = await this.apiPatch(org, `${encodeURIComponent(project)}/_apis/wit/workitems/${id}`, fields);
103
+ if (!result.success)
104
+ return result;
105
+ return ok({
106
+ id: result.data.id,
107
+ rev: result.data.rev,
108
+ url: result.data._links?.html?.href ?? "",
109
+ });
110
+ }
111
+ // ── Iterations ──────────────────────────────────────────────────
112
+ async listIterations(org, project) {
113
+ const result = await this.apiGet(org, `${encodeURIComponent(project)}/_apis/work/teamsettings/iterations`);
114
+ if (!result.success)
115
+ return result;
116
+ return ok(result.data.value);
117
+ }
118
+ async createIteration(org, project, name, startDate, finishDate) {
119
+ const body = { name };
120
+ if (startDate !== undefined || finishDate !== undefined) {
121
+ body["attributes"] = {
122
+ ...(startDate !== undefined ? { startDate } : {}),
123
+ ...(finishDate !== undefined ? { finishDate } : {}),
124
+ };
125
+ }
126
+ return this.apiPost(org, `${encodeURIComponent(project)}/_apis/wit/classificationnodes/Iterations`, body);
127
+ }
128
+ async addIterationToTeam(org, project, iterationId) {
129
+ const result = await this.apiPost(org, `${encodeURIComponent(project)}/_apis/work/teamsettings/iterations`, { id: iterationId });
130
+ if (!result.success)
131
+ return result;
132
+ return ok(undefined);
133
+ }
134
+ // ── Work Item Links ─────────────────────────────────────────────
135
+ async addParentLink(org, project, childId, parentId) {
136
+ const parentUrl = `https://dev.azure.com/${encodeURIComponent(org)}/${encodeURIComponent(project)}/_apis/wit/workitems/${parentId}`;
137
+ const ops = [
138
+ {
139
+ op: "add",
140
+ path: "/relations/-",
141
+ value: {
142
+ rel: "System.LinkTypes.Hierarchy-Reverse",
143
+ url: parentUrl,
144
+ attributes: { name: "Parent" },
145
+ },
146
+ },
147
+ ];
148
+ const result = await this.apiPatch(org, `${encodeURIComponent(project)}/_apis/wit/workitems/${childId}`, ops);
149
+ if (!result.success)
150
+ return result;
151
+ return ok(undefined);
152
+ }
153
+ async addComment(org, project, workItemId, text) {
154
+ // Comments API is in preview — requires -preview suffix
155
+ const result = await this.apiPost(org, `${encodeURIComponent(project)}/_apis/wit/workitems/${workItemId}/comments`, { text }, { "api-version": `${API_VERSION}-preview` });
156
+ if (!result.success)
157
+ return result;
158
+ return ok(undefined);
159
+ }
160
+ // ── Pull Requests ───────────────────────────────────────────────
161
+ prPath(project, repo, suffix = "") {
162
+ return `${encodeURIComponent(project)}/_apis/git/repositories/${encodeURIComponent(repo)}/pullrequests${suffix}`;
163
+ }
164
+ async createPullRequest(org, project, repository, input) {
165
+ const body = {
166
+ sourceRefName: input.sourceRefName, targetRefName: input.targetRefName,
167
+ title: input.title, description: input.description,
168
+ ...(input.reviewers !== undefined && input.reviewers.length > 0
169
+ ? { reviewers: input.reviewers.map((r) => ({ uniqueName: r })) } : {}),
170
+ ...(input.workItemIds !== undefined && input.workItemIds.length > 0
171
+ ? { workItemRefs: input.workItemIds.map((id) => ({ id: String(id) })) } : {}),
172
+ };
173
+ const result = await this.apiPost(org, this.prPath(project, repository), body);
174
+ if (!result.success)
175
+ return result;
176
+ return ok(mapRawPullRequest(result.data));
177
+ }
178
+ async listPullRequests(org, project, repository, status = "active", top = 50) {
179
+ const params = { "$top": String(top) };
180
+ if (status !== "all")
181
+ params["searchCriteria.status"] = status;
182
+ const result = await this.apiGet(org, this.prPath(project, repository), params);
183
+ if (!result.success)
184
+ return result;
185
+ return ok(result.data.value.map(mapRawPullRequest));
186
+ }
187
+ async getPullRequest(org, project, repository, pullRequestId) {
188
+ const result = await this.apiGet(org, this.prPath(project, repository, `/${pullRequestId}`));
189
+ if (!result.success)
190
+ return result;
191
+ return ok(mapRawPullRequest(result.data));
192
+ }
193
+ // ── HTTP Helpers ────────────────────────────────────────────────
194
+ async apiGet(org, path, params) {
195
+ const authResult = this.auth.getAuthHeader();
196
+ if (!authResult.success)
197
+ return authResult;
198
+ const url = this.buildUrl(org, path, params);
199
+ try {
200
+ const response = await fetch(url, {
201
+ method: "GET",
202
+ headers: {
203
+ Authorization: authResult.data,
204
+ Accept: "application/json",
205
+ },
206
+ });
207
+ return this.handleResponse(response);
208
+ }
209
+ catch (error) {
210
+ return fail(`GET ${path} failed: ${errorMessage(error)}`);
211
+ }
212
+ }
213
+ async apiPost(org, path, body, params) {
214
+ const authResult = this.auth.getAuthHeader();
215
+ if (!authResult.success)
216
+ return authResult;
217
+ const url = this.buildUrl(org, path, params);
218
+ try {
219
+ const response = await fetch(url, {
220
+ method: "POST",
221
+ headers: {
222
+ Authorization: authResult.data,
223
+ "Content-Type": "application/json",
224
+ Accept: "application/json",
225
+ },
226
+ body: JSON.stringify(body),
227
+ });
228
+ return this.handleResponse(response);
229
+ }
230
+ catch (error) {
231
+ return fail(`POST ${path} failed: ${errorMessage(error)}`);
232
+ }
233
+ }
234
+ async apiPatch(org, path, body) {
235
+ const authResult = this.auth.getAuthHeader();
236
+ if (!authResult.success)
237
+ return authResult;
238
+ const url = this.buildUrl(org, path);
239
+ try {
240
+ const response = await fetch(url, {
241
+ method: "PATCH",
242
+ headers: {
243
+ Authorization: authResult.data,
244
+ "Content-Type": "application/json-patch+json",
245
+ Accept: "application/json",
246
+ },
247
+ body: JSON.stringify(body),
248
+ });
249
+ return this.handleResponse(response);
250
+ }
251
+ catch (error) {
252
+ return fail(`PATCH ${path} failed: ${errorMessage(error)}`);
253
+ }
254
+ }
255
+ buildUrl(org, path, params) {
256
+ const base = `https://dev.azure.com/${encodeURIComponent(org)}/${path}`;
257
+ const searchParams = new URLSearchParams({
258
+ "api-version": API_VERSION,
259
+ ...params,
260
+ });
261
+ return `${base}?${searchParams.toString()}`;
262
+ }
263
+ async handleResponse(response) {
264
+ if (!response.ok) {
265
+ const text = await response.text().catch(() => "");
266
+ return fail(`Azure DevOps API error ${response.status}: ${response.statusText}${text ? ` — ${text}` : ""}`);
267
+ }
268
+ try {
269
+ const data = (await response.json());
270
+ return ok(data);
271
+ }
272
+ catch {
273
+ return fail("Failed to parse Azure DevOps API response as JSON");
274
+ }
275
+ }
276
+ }
277
+ // ── Utilities ─────────────────────────────────────────────────────────────────
278
+ function errorMessage(error) {
279
+ return error instanceof Error ? error.message : String(error);
280
+ }
281
+ function mapRawPullRequest(raw) {
282
+ const s = raw.status.toLowerCase();
283
+ const status = s === "abandoned" ? "abandoned" : s === "completed" ? "completed" : "active";
284
+ return {
285
+ pullRequestId: raw.pullRequestId, title: raw.title, description: raw.description ?? "",
286
+ status, sourceRefName: raw.sourceRefName, targetRefName: raw.targetRefName,
287
+ createdBy: raw.createdBy?.displayName ?? raw.createdBy?.uniqueName ?? "",
288
+ creationDate: raw.creationDate ?? "", mergeStatus: raw.mergeStatus ?? "",
289
+ url: raw._links?.web?.href ?? "",
290
+ workItemIds: (raw.workItemRefs ?? []).map((r) => parseInt(r.id ?? "0", 10)).filter((id) => id > 0),
291
+ reviewers: (raw.reviewers ?? []).map((r) => ({
292
+ displayName: r.displayName ?? "", uniqueName: r.uniqueName ?? "", vote: r.vote ?? 0,
293
+ })),
294
+ };
295
+ }
296
+ //# sourceMappingURL=azure-devops-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"azure-devops-client.js","sourceRoot":"","sources":["../../../src/infrastructure/azure-sync/azure-devops-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Azure Sync Infrastructure — Barrel Export
3
+ *
4
+ * Public API for the azure-sync bounded context infrastructure layer.
5
+ */
6
+ export { AzureAuthProvider } from "./azure-auth.js";
7
+ export { AzureDevOpsClient } from "./azure-devops-client.js";
8
+ export { SqliteSyncRepository } from "./sqlite-sync-repository.js";
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/azure-sync/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAIpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAI7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Azure Sync Infrastructure — Barrel Export
3
+ *
4
+ * Public API for the azure-sync bounded context infrastructure layer.
5
+ */
6
+ // ── Authentication ───────────────────────────────────────────────────────────
7
+ export { AzureAuthProvider } from "./azure-auth.js";
8
+ // ── Azure DevOps REST Client ─────────────────────────────────────────────────
9
+ export { AzureDevOpsClient } from "./azure-devops-client.js";
10
+ // ── SQLite Repository ────────────────────────────────────────────────────────
11
+ export { SqliteSyncRepository } from "./sqlite-sync-repository.js";
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/infrastructure/azure-sync/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,gFAAgF;AAEhF,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEpD,gFAAgF;AAEhF,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7D,gFAAgF;AAEhF,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Azure Sync Infrastructure — SQLite Sync Mapping Repository
3
+ *
4
+ * Persists SyncMapping and SyncLog entities in SQLite.
5
+ * Uses the shared SqliteAdapter for database operations.
6
+ *
7
+ * SOLID: SRP — persistence logic only
8
+ * SOLID: DIP — implements domain-defined repository interfaces
9
+ * DDD: Repository implementation in infrastructure layer
10
+ */
11
+ import type { SqliteAdapter } from "../database/sqlite-adapter.js";
12
+ import { SyncMapping, SyncLog } from "../../domain/azure-sync/entities.js";
13
+ import type { SyncLogStatus } from "../../domain/azure-sync/entities.js";
14
+ import { SyncMappingId } from "../../domain/azure-sync/value-objects.js";
15
+ import type { SyncStatus, LocalEntityType } from "../../domain/azure-sync/value-objects.js";
16
+ import type { SyncMappingRepository, SyncLogRepository } from "../../domain/azure-sync/repositories.js";
17
+ /**
18
+ * SQLite implementation of SyncMappingRepository and SyncLogRepository.
19
+ * Combines both interfaces since they share the same database and schema.
20
+ */
21
+ export declare class SqliteSyncRepository implements SyncMappingRepository, SyncLogRepository {
22
+ private readonly db;
23
+ constructor(db: SqliteAdapter);
24
+ save(mapping: SyncMapping): Promise<void>;
25
+ findById(id: SyncMappingId): Promise<SyncMapping | undefined>;
26
+ findByLocalId(localId: string, entityType: LocalEntityType): Promise<SyncMapping | undefined>;
27
+ findByAzureWorkItemId(workItemId: number, azureProject: string): Promise<SyncMapping | undefined>;
28
+ findByProject(azureProject: string): Promise<readonly SyncMapping[]>;
29
+ findByStatus(status: SyncStatus): Promise<readonly SyncMapping[]>;
30
+ findByEntityType(entityType: LocalEntityType): Promise<readonly SyncMapping[]>;
31
+ delete(id: SyncMappingId): Promise<boolean>;
32
+ nextMappingSequence(): Promise<number>;
33
+ nextLogSequence(): Promise<number>;
34
+ append(log: SyncLog): Promise<void>;
35
+ findByMappingId(mappingId: SyncMappingId, limit?: number): Promise<readonly SyncLog[]>;
36
+ findLogsByStatus(status: SyncLogStatus, limit?: number): Promise<readonly SyncLog[]>;
37
+ findRecent(limit: number): Promise<readonly SyncLog[]>;
38
+ }
39
+ //# sourceMappingURL=sqlite-sync-repository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite-sync-repository.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/azure-sync/sqlite-sync-repository.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAEnE,OAAO,EACL,WAAW,EACX,OAAO,EACR,MAAM,qCAAqC,CAAC;AAC7C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AACzE,OAAO,EACL,aAAa,EAGd,MAAM,0CAA0C,CAAC;AAClD,OAAO,KAAK,EACV,UAAU,EACV,eAAe,EAGhB,MAAM,0CAA0C,CAAC;AAClD,OAAO,KAAK,EACV,qBAAqB,EACrB,iBAAiB,EAClB,MAAM,yCAAyC,CAAC;AAsFjD;;;GAGG;AACH,qBAAa,oBACX,YAAW,qBAAqB,EAAE,iBAAiB;IAEvC,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,aAAa;IAMxC,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAsCzC,QAAQ,CAAC,EAAE,EAAE,aAAa,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;IAQ7D,aAAa,CACjB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,eAAe,GAC1B,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;IAQ7B,qBAAqB,CACzB,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;IAQ7B,aAAa,CACjB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,SAAS,WAAW,EAAE,CAAC;IAQ5B,YAAY,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,SAAS,WAAW,EAAE,CAAC;IAQjE,gBAAgB,CACpB,UAAU,EAAE,eAAe,GAC1B,OAAO,CAAC,SAAS,WAAW,EAAE,CAAC;IAQ5B,MAAM,CAAC,EAAE,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC;IAQ3C,mBAAmB,IAAI,OAAO,CAAC,MAAM,CAAC;IAOtC,eAAe,IAAI,OAAO,CAAC,MAAM,CAAC;IASlC,MAAM,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBnC,eAAe,CACnB,SAAS,EAAE,aAAa,EACxB,KAAK,SAAK,GACT,OAAO,CAAC,SAAS,OAAO,EAAE,CAAC;IAQxB,gBAAgB,CACpB,MAAM,EAAE,aAAa,EACrB,KAAK,SAAK,GACT,OAAO,CAAC,SAAS,OAAO,EAAE,CAAC;IAQxB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,OAAO,EAAE,CAAC;CAO7D"}
@@ -0,0 +1,202 @@
1
+ /**
2
+ * Azure Sync Infrastructure — SQLite Sync Mapping Repository
3
+ *
4
+ * Persists SyncMapping and SyncLog entities in SQLite.
5
+ * Uses the shared SqliteAdapter for database operations.
6
+ *
7
+ * SOLID: SRP — persistence logic only
8
+ * SOLID: DIP — implements domain-defined repository interfaces
9
+ * DDD: Repository implementation in infrastructure layer
10
+ */
11
+ import { Timestamp } from "../../domain/shared/value-objects.js";
12
+ import { SyncMapping, SyncLog, } from "../../domain/azure-sync/entities.js";
13
+ import { SyncMappingId, SyncLogId, WorkItemId, } from "../../domain/azure-sync/value-objects.js";
14
+ // ─── Schema ───────────────────────────────────────────────────────────────────
15
+ const SCHEMA_KEY = "azure-sync";
16
+ const DDL = `
17
+ CREATE TABLE IF NOT EXISTS sync_mappings (
18
+ id TEXT PRIMARY KEY,
19
+ local_id TEXT NOT NULL,
20
+ local_entity_type TEXT NOT NULL,
21
+ azure_work_item_id INTEGER NOT NULL,
22
+ azure_project TEXT NOT NULL,
23
+ azure_org TEXT NOT NULL,
24
+ process_template TEXT NOT NULL,
25
+ sync_status TEXT NOT NULL DEFAULT 'pending',
26
+ last_synced_at TEXT NOT NULL,
27
+ local_modified_at TEXT NOT NULL,
28
+ azure_modified_at TEXT NOT NULL,
29
+ sync_direction TEXT NOT NULL,
30
+ azure_revision INTEGER NOT NULL DEFAULT 0,
31
+ created_at TEXT NOT NULL
32
+ );
33
+
34
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_sync_mappings_local
35
+ ON sync_mappings(local_id, local_entity_type);
36
+
37
+ CREATE INDEX IF NOT EXISTS idx_sync_mappings_azure
38
+ ON sync_mappings(azure_work_item_id, azure_project);
39
+
40
+ CREATE INDEX IF NOT EXISTS idx_sync_mappings_status
41
+ ON sync_mappings(sync_status);
42
+
43
+ CREATE INDEX IF NOT EXISTS idx_sync_mappings_project
44
+ ON sync_mappings(azure_project);
45
+
46
+ CREATE TABLE IF NOT EXISTS sync_logs (
47
+ id TEXT PRIMARY KEY,
48
+ mapping_id TEXT NOT NULL,
49
+ direction TEXT NOT NULL,
50
+ status TEXT NOT NULL,
51
+ detail TEXT NOT NULL DEFAULT '',
52
+ timestamp TEXT NOT NULL,
53
+ FOREIGN KEY (mapping_id) REFERENCES sync_mappings(id) ON DELETE CASCADE
54
+ );
55
+
56
+ CREATE INDEX IF NOT EXISTS idx_sync_logs_mapping
57
+ ON sync_logs(mapping_id);
58
+
59
+ CREATE INDEX IF NOT EXISTS idx_sync_logs_status
60
+ ON sync_logs(status);
61
+
62
+ CREATE INDEX IF NOT EXISTS idx_sync_logs_timestamp
63
+ ON sync_logs(timestamp DESC);
64
+ `;
65
+ // ─── Repository Implementation ────────────────────────────────────────────────
66
+ /**
67
+ * SQLite implementation of SyncMappingRepository and SyncLogRepository.
68
+ * Combines both interfaces since they share the same database and schema.
69
+ */
70
+ export class SqliteSyncRepository {
71
+ db;
72
+ constructor(db) {
73
+ this.db = db;
74
+ this.db.ensureSchema(SCHEMA_KEY, DDL);
75
+ }
76
+ // ── SyncMappingRepository ───────────────────────────────────────
77
+ async save(mapping) {
78
+ const props = mapping.toProps();
79
+ this.db.execute(`INSERT INTO sync_mappings (
80
+ id, local_id, local_entity_type, azure_work_item_id,
81
+ azure_project, azure_org, process_template, sync_status,
82
+ last_synced_at, local_modified_at, azure_modified_at,
83
+ sync_direction, azure_revision, created_at
84
+ ) VALUES (
85
+ @id, @localId, @localEntityType, @azureWorkItemId,
86
+ @azureProject, @azureOrg, @processTemplate, @syncStatus,
87
+ @lastSyncedAt, @localModifiedAt, @azureModifiedAt,
88
+ @syncDirection, @azureRevision, @createdAt
89
+ ) ON CONFLICT(id) DO UPDATE SET
90
+ sync_status = @syncStatus,
91
+ last_synced_at = @lastSyncedAt,
92
+ local_modified_at = @localModifiedAt,
93
+ azure_modified_at = @azureModifiedAt,
94
+ azure_revision = @azureRevision`, {
95
+ id: props.id,
96
+ localId: props.localId,
97
+ localEntityType: props.localEntityType,
98
+ azureWorkItemId: props.azureWorkItemId,
99
+ azureProject: props.azureProject,
100
+ azureOrg: props.azureOrg,
101
+ processTemplate: props.processTemplate,
102
+ syncStatus: props.syncStatus,
103
+ lastSyncedAt: props.lastSyncedAt,
104
+ localModifiedAt: props.localModifiedAt,
105
+ azureModifiedAt: props.azureModifiedAt,
106
+ syncDirection: props.syncDirection,
107
+ azureRevision: props.azureRevision,
108
+ createdAt: props.createdAt,
109
+ });
110
+ }
111
+ async findById(id) {
112
+ const row = this.db.queryOne("SELECT * FROM sync_mappings WHERE id = @id", { id: id.value });
113
+ return row ? toDomainMapping(row) : undefined;
114
+ }
115
+ async findByLocalId(localId, entityType) {
116
+ const row = this.db.queryOne("SELECT * FROM sync_mappings WHERE local_id = @localId AND local_entity_type = @entityType", { localId, entityType });
117
+ return row ? toDomainMapping(row) : undefined;
118
+ }
119
+ async findByAzureWorkItemId(workItemId, azureProject) {
120
+ const row = this.db.queryOne("SELECT * FROM sync_mappings WHERE azure_work_item_id = @workItemId AND azure_project = @azureProject", { workItemId, azureProject });
121
+ return row ? toDomainMapping(row) : undefined;
122
+ }
123
+ async findByProject(azureProject) {
124
+ const rows = this.db.queryAll("SELECT * FROM sync_mappings WHERE azure_project = @azureProject ORDER BY created_at DESC", { azureProject });
125
+ return rows.map(toDomainMapping);
126
+ }
127
+ async findByStatus(status) {
128
+ const rows = this.db.queryAll("SELECT * FROM sync_mappings WHERE sync_status = @status ORDER BY last_synced_at DESC", { status });
129
+ return rows.map(toDomainMapping);
130
+ }
131
+ async findByEntityType(entityType) {
132
+ const rows = this.db.queryAll("SELECT * FROM sync_mappings WHERE local_entity_type = @entityType ORDER BY created_at DESC", { entityType });
133
+ return rows.map(toDomainMapping);
134
+ }
135
+ async delete(id) {
136
+ const result = this.db.execute("DELETE FROM sync_mappings WHERE id = @id", { id: id.value });
137
+ return result.changes > 0;
138
+ }
139
+ async nextMappingSequence() {
140
+ const row = this.db.queryOne("SELECT MAX(CAST(SUBSTR(id, 4) AS INTEGER)) as max_seq FROM sync_mappings");
141
+ return (row?.max_seq ?? 0) + 1;
142
+ }
143
+ async nextLogSequence() {
144
+ const row = this.db.queryOne("SELECT MAX(CAST(SUBSTR(id, 4) AS INTEGER)) as max_seq FROM sync_logs");
145
+ return (row?.max_seq ?? 0) + 1;
146
+ }
147
+ // ── SyncLogRepository ───────────────────────────────────────────
148
+ async append(log) {
149
+ const props = log.toProps();
150
+ this.db.execute(`INSERT INTO sync_logs (id, mapping_id, direction, status, detail, timestamp)
151
+ VALUES (@id, @mappingId, @direction, @status, @detail, @timestamp)`, {
152
+ id: props.id,
153
+ mappingId: props.mappingId,
154
+ direction: props.direction,
155
+ status: props.status,
156
+ detail: props.detail,
157
+ timestamp: props.timestamp,
158
+ });
159
+ }
160
+ async findByMappingId(mappingId, limit = 50) {
161
+ const rows = this.db.queryAll("SELECT * FROM sync_logs WHERE mapping_id = @mappingId ORDER BY timestamp DESC LIMIT @limit", { mappingId: mappingId.value, limit });
162
+ return rows.map(toDomainLog);
163
+ }
164
+ async findLogsByStatus(status, limit = 50) {
165
+ const rows = this.db.queryAll("SELECT * FROM sync_logs WHERE status = @status ORDER BY timestamp DESC LIMIT @limit", { status, limit });
166
+ return rows.map(toDomainLog);
167
+ }
168
+ async findRecent(limit) {
169
+ const rows = this.db.queryAll("SELECT * FROM sync_logs ORDER BY timestamp DESC LIMIT @limit", { limit });
170
+ return rows.map(toDomainLog);
171
+ }
172
+ }
173
+ // ─── Domain Reconstitution ────────────────────────────────────────────────────
174
+ function toDomainMapping(row) {
175
+ return SyncMapping.reconstitute({
176
+ id: SyncMappingId.from(row.id),
177
+ localId: row.local_id,
178
+ localEntityType: row.local_entity_type,
179
+ azureWorkItemId: WorkItemId.from(row.azure_work_item_id),
180
+ azureProject: row.azure_project,
181
+ azureOrg: row.azure_org,
182
+ processTemplate: row.process_template,
183
+ syncStatus: row.sync_status,
184
+ lastSyncedAt: Timestamp.fromISO(row.last_synced_at),
185
+ localModifiedAt: Timestamp.fromISO(row.local_modified_at),
186
+ azureModifiedAt: Timestamp.fromISO(row.azure_modified_at),
187
+ syncDirection: row.sync_direction,
188
+ azureRevision: row.azure_revision,
189
+ createdAt: Timestamp.fromISO(row.created_at),
190
+ });
191
+ }
192
+ function toDomainLog(row) {
193
+ return SyncLog.reconstitute({
194
+ id: SyncLogId.from(row.id),
195
+ mappingId: SyncMappingId.from(row.mapping_id),
196
+ direction: row.direction,
197
+ status: row.status,
198
+ detail: row.detail,
199
+ timestamp: Timestamp.fromISO(row.timestamp),
200
+ });
201
+ }
202
+ //# sourceMappingURL=sqlite-sync-repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite-sync-repository.js","sourceRoot":"","sources":["../../../src/infrastructure/azure-sync/sqlite-sync-repository.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Configuration Infrastructure — Barrel Exports
3
+ */
4
+ export { YamlConfigRepository } from "./yaml-config-repository.js";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/config/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Configuration Infrastructure — Barrel Exports
3
+ */
4
+ export { YamlConfigRepository } from "./yaml-config-repository.js";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/infrastructure/config/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC"}
@@ -0,0 +1,22 @@
1
+ import type { ConfigRepository } from "../../domain/config/repositories.js";
2
+ /**
3
+ * Reads configuration from a YAML file on disk.
4
+ *
5
+ * - Parses once at construction and caches
6
+ * - Missing or unreadable files produce an empty config (no throw)
7
+ * - Returns raw parsed data; type validation is the application layer's job
8
+ */
9
+ export declare class YamlConfigRepository implements ConfigRepository {
10
+ private readonly data;
11
+ private readonly available;
12
+ constructor(filePath: string);
13
+ loadContext(contextName: string): unknown | undefined;
14
+ loadAll(): Readonly<Record<string, unknown>>;
15
+ isAvailable(): boolean;
16
+ /**
17
+ * Parse a YAML file safely. Returns empty data if the file
18
+ * is missing, empty, or contains invalid YAML.
19
+ */
20
+ private static parseFile;
21
+ }
22
+ //# sourceMappingURL=yaml-config-repository.d.ts.map