@mc1global/opencode-jarvis 0.1.1 → 0.3.1

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 (299) 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/hooks/event-handlers.d.ts +3 -0
  190. package/dist/hooks/event-handlers.d.ts.map +1 -1
  191. package/dist/hooks/event-handlers.js +4 -2
  192. package/dist/hooks/event-handlers.js.map +1 -1
  193. package/dist/hooks/logger.d.ts +46 -0
  194. package/dist/hooks/logger.d.ts.map +1 -0
  195. package/dist/hooks/logger.js +79 -0
  196. package/dist/hooks/logger.js.map +1 -0
  197. package/dist/index.d.ts.map +1 -1
  198. package/dist/index.js +152 -108
  199. package/dist/index.js.map +1 -1
  200. package/dist/infrastructure/agent-registry/agent-profile-repository.d.ts +29 -0
  201. package/dist/infrastructure/agent-registry/agent-profile-repository.d.ts.map +1 -0
  202. package/dist/infrastructure/agent-registry/agent-profile-repository.js +109 -0
  203. package/dist/infrastructure/agent-registry/agent-profile-repository.js.map +1 -0
  204. package/dist/infrastructure/agent-registry/agent-session-adapter.d.ts +28 -0
  205. package/dist/infrastructure/agent-registry/agent-session-adapter.d.ts.map +1 -0
  206. package/dist/infrastructure/agent-registry/agent-session-adapter.js +61 -0
  207. package/dist/infrastructure/agent-registry/agent-session-adapter.js.map +1 -0
  208. package/dist/infrastructure/agent-registry/built-in-profiles.d.ts +19 -0
  209. package/dist/infrastructure/agent-registry/built-in-profiles.d.ts.map +1 -0
  210. package/dist/infrastructure/agent-registry/built-in-profiles.js +210 -0
  211. package/dist/infrastructure/agent-registry/built-in-profiles.js.map +1 -0
  212. package/dist/infrastructure/azure-sync/azure-auth.d.ts +40 -0
  213. package/dist/infrastructure/azure-sync/azure-auth.d.ts.map +1 -0
  214. package/dist/infrastructure/azure-sync/azure-auth.js +94 -0
  215. package/dist/infrastructure/azure-sync/azure-auth.js.map +1 -0
  216. package/dist/infrastructure/azure-sync/azure-devops-client.d.ts +43 -0
  217. package/dist/infrastructure/azure-sync/azure-devops-client.d.ts.map +1 -0
  218. package/dist/infrastructure/azure-sync/azure-devops-client.js +296 -0
  219. package/dist/infrastructure/azure-sync/azure-devops-client.js.map +1 -0
  220. package/dist/infrastructure/azure-sync/index.d.ts +9 -0
  221. package/dist/infrastructure/azure-sync/index.d.ts.map +1 -0
  222. package/dist/infrastructure/azure-sync/index.js +12 -0
  223. package/dist/infrastructure/azure-sync/index.js.map +1 -0
  224. package/dist/infrastructure/azure-sync/sqlite-sync-repository.d.ts +39 -0
  225. package/dist/infrastructure/azure-sync/sqlite-sync-repository.d.ts.map +1 -0
  226. package/dist/infrastructure/azure-sync/sqlite-sync-repository.js +202 -0
  227. package/dist/infrastructure/azure-sync/sqlite-sync-repository.js.map +1 -0
  228. package/dist/infrastructure/config/index.d.ts +5 -0
  229. package/dist/infrastructure/config/index.d.ts.map +1 -0
  230. package/dist/infrastructure/config/index.js +5 -0
  231. package/dist/infrastructure/config/index.js.map +1 -0
  232. package/dist/infrastructure/config/yaml-config-repository.d.ts +22 -0
  233. package/dist/infrastructure/config/yaml-config-repository.d.ts.map +1 -0
  234. package/dist/infrastructure/config/yaml-config-repository.js +68 -0
  235. package/dist/infrastructure/config/yaml-config-repository.js.map +1 -0
  236. package/dist/infrastructure/domain-map/llm-prompt-factory.d.ts +21 -0
  237. package/dist/infrastructure/domain-map/llm-prompt-factory.d.ts.map +1 -0
  238. package/dist/infrastructure/domain-map/llm-prompt-factory.js +49 -0
  239. package/dist/infrastructure/domain-map/llm-prompt-factory.js.map +1 -0
  240. package/dist/infrastructure/kanban/card-repository.d.ts +6 -0
  241. package/dist/infrastructure/kanban/card-repository.d.ts.map +1 -1
  242. package/dist/infrastructure/kanban/card-repository.js +79 -7
  243. package/dist/infrastructure/kanban/card-repository.js.map +1 -1
  244. package/dist/infrastructure/pipeline/dagger-adapter.d.ts +50 -0
  245. package/dist/infrastructure/pipeline/dagger-adapter.d.ts.map +1 -0
  246. package/dist/infrastructure/pipeline/dagger-adapter.js +153 -0
  247. package/dist/infrastructure/pipeline/dagger-adapter.js.map +1 -0
  248. package/dist/infrastructure/pipeline/dagger-scaffold-generator.d.ts +35 -0
  249. package/dist/infrastructure/pipeline/dagger-scaffold-generator.d.ts.map +1 -0
  250. package/dist/infrastructure/pipeline/dagger-scaffold-generator.js +132 -0
  251. package/dist/infrastructure/pipeline/dagger-scaffold-generator.js.map +1 -0
  252. package/dist/infrastructure/pipeline/index.d.ts +20 -0
  253. package/dist/infrastructure/pipeline/index.d.ts.map +1 -0
  254. package/dist/infrastructure/pipeline/index.js +19 -0
  255. package/dist/infrastructure/pipeline/index.js.map +1 -0
  256. package/dist/infrastructure/pipeline/pipeline-template-registry.d.ts +23 -0
  257. package/dist/infrastructure/pipeline/pipeline-template-registry.d.ts.map +1 -0
  258. package/dist/infrastructure/pipeline/pipeline-template-registry.js +63 -0
  259. package/dist/infrastructure/pipeline/pipeline-template-registry.js.map +1 -0
  260. package/dist/infrastructure/pipeline/scaffold-templates-extra.d.ts +17 -0
  261. package/dist/infrastructure/pipeline/scaffold-templates-extra.d.ts.map +1 -0
  262. package/dist/infrastructure/pipeline/scaffold-templates-extra.js +467 -0
  263. package/dist/infrastructure/pipeline/scaffold-templates-extra.js.map +1 -0
  264. package/dist/infrastructure/pipeline/scaffold-templates.d.ts +23 -0
  265. package/dist/infrastructure/pipeline/scaffold-templates.d.ts.map +1 -0
  266. package/dist/infrastructure/pipeline/scaffold-templates.js +476 -0
  267. package/dist/infrastructure/pipeline/scaffold-templates.js.map +1 -0
  268. package/dist/infrastructure/pipeline/sqlite-pipeline-repository.d.ts +32 -0
  269. package/dist/infrastructure/pipeline/sqlite-pipeline-repository.d.ts.map +1 -0
  270. package/dist/infrastructure/pipeline/sqlite-pipeline-repository.js +197 -0
  271. package/dist/infrastructure/pipeline/sqlite-pipeline-repository.js.map +1 -0
  272. package/dist/mcp-server.d.ts +3 -0
  273. package/dist/mcp-server.d.ts.map +1 -0
  274. package/dist/mcp-server.js +300 -0
  275. package/dist/mcp-server.js.map +1 -0
  276. package/dist/tools/agent-registry-tools.d.ts +11 -0
  277. package/dist/tools/agent-registry-tools.d.ts.map +1 -0
  278. package/dist/tools/agent-registry-tools.js +208 -0
  279. package/dist/tools/agent-registry-tools.js.map +1 -0
  280. package/dist/tools/azure-sync-tools.d.ts +15 -0
  281. package/dist/tools/azure-sync-tools.d.ts.map +1 -0
  282. package/dist/tools/azure-sync-tools.js +332 -0
  283. package/dist/tools/azure-sync-tools.js.map +1 -0
  284. package/dist/tools/kanban-card-tools.d.ts.map +1 -1
  285. package/dist/tools/kanban-card-tools.js +41 -16
  286. package/dist/tools/kanban-card-tools.js.map +1 -1
  287. package/dist/tools/kanban-gate-tools.d.ts +7 -0
  288. package/dist/tools/kanban-gate-tools.d.ts.map +1 -0
  289. package/dist/tools/kanban-gate-tools.js +106 -0
  290. package/dist/tools/kanban-gate-tools.js.map +1 -0
  291. package/dist/tools/kanban-grooming-tools.d.ts +7 -0
  292. package/dist/tools/kanban-grooming-tools.d.ts.map +1 -0
  293. package/dist/tools/kanban-grooming-tools.js +180 -0
  294. package/dist/tools/kanban-grooming-tools.js.map +1 -0
  295. package/dist/tools/pipeline-tools.d.ts +15 -0
  296. package/dist/tools/pipeline-tools.d.ts.map +1 -0
  297. package/dist/tools/pipeline-tools.js +424 -0
  298. package/dist/tools/pipeline-tools.js.map +1 -0
  299. package/package.json +7 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yaml-config-repository.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/config/yaml-config-repository.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AAE5E;;;;;;GAMG;AACH,qBAAa,oBAAqB,YAAW,gBAAgB;IAC3D,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAoC;IACzD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAU;gBAExB,QAAQ,EAAE,MAAM;IAM5B,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAIrD,OAAO,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAI5C,WAAW,IAAI,OAAO;IAMtB;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,SAAS;CA8BzB"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * YAML Configuration Repository
3
+ *
4
+ * Implements ConfigRepository by reading a single YAML file.
5
+ * Parses once on construction and caches the result.
6
+ * Returns undefined for missing sections — never throws.
7
+ *
8
+ * SOLID: SRP — YAML file reading only
9
+ * SOLID: DIP — implements domain-defined ConfigRepository interface
10
+ * DDD: Infrastructure adapter for config persistence
11
+ */
12
+ import { readFileSync, existsSync } from "node:fs";
13
+ import yaml from "js-yaml";
14
+ /**
15
+ * Reads configuration from a YAML file on disk.
16
+ *
17
+ * - Parses once at construction and caches
18
+ * - Missing or unreadable files produce an empty config (no throw)
19
+ * - Returns raw parsed data; type validation is the application layer's job
20
+ */
21
+ export class YamlConfigRepository {
22
+ data;
23
+ available;
24
+ constructor(filePath) {
25
+ const result = YamlConfigRepository.parseFile(filePath);
26
+ this.data = result.data;
27
+ this.available = result.available;
28
+ }
29
+ loadContext(contextName) {
30
+ return this.data[contextName];
31
+ }
32
+ loadAll() {
33
+ return this.data;
34
+ }
35
+ isAvailable() {
36
+ return this.available;
37
+ }
38
+ // ── Private ──────────────────────────────────────────────────────
39
+ /**
40
+ * Parse a YAML file safely. Returns empty data if the file
41
+ * is missing, empty, or contains invalid YAML.
42
+ */
43
+ static parseFile(filePath) {
44
+ if (!existsSync(filePath)) {
45
+ return { data: Object.freeze({}), available: false };
46
+ }
47
+ try {
48
+ const raw = readFileSync(filePath, "utf-8");
49
+ if (!raw.trim()) {
50
+ return { data: Object.freeze({}), available: true };
51
+ }
52
+ const parsed = yaml.load(raw);
53
+ // yaml.load can return scalar/array for non-object YAML
54
+ if (parsed === null || parsed === undefined || typeof parsed !== "object" || Array.isArray(parsed)) {
55
+ return { data: Object.freeze({}), available: true };
56
+ }
57
+ return {
58
+ data: Object.freeze(parsed),
59
+ available: true,
60
+ };
61
+ }
62
+ catch {
63
+ // Invalid YAML — treat as unavailable but don't crash
64
+ return { data: Object.freeze({}), available: false };
65
+ }
66
+ }
67
+ }
68
+ //# sourceMappingURL=yaml-config-repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yaml-config-repository.js","sourceRoot":"","sources":["../../../src/infrastructure/config/yaml-config-repository.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,IAAI,MAAM,SAAS,CAAC;AAG3B;;;;;;GAMG;AACH,MAAM,OAAO,oBAAoB;IACd,IAAI,CAAoC;IACxC,SAAS,CAAU;IAEpC,YAAY,QAAgB;QAC1B,MAAM,MAAM,GAAG,oBAAoB,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACxD,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;QACxB,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;IACpC,CAAC;IAED,WAAW,CAAC,WAAmB;QAC7B,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAChC,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED,WAAW;QACT,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,oEAAoE;IAEpE;;;OAGG;IACK,MAAM,CAAC,SAAS,CAAC,QAAgB;QAIvC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;QACvD,CAAC;QAED,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAC5C,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;gBAChB,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;YACtD,CAAC;YAED,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAE9B,wDAAwD;YACxD,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,SAAS,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBACnG,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;YACtD,CAAC;YAED,OAAO;gBACL,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,MAAiC,CAAC;gBACtD,SAAS,EAAE,IAAI;aAChB,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,sDAAsD;YACtD,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;QACvD,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * LLM Prompt Factory
3
+ *
4
+ * Creates the PromptFn used by LlmSemanticAnalyzer for domain-map analysis.
5
+ * Delegates to OpenCode SDK session.prompt() — creates a temporary session,
6
+ * sends the analysis prompt, extracts text response, and cleans up.
7
+ *
8
+ * Extracted from index.ts to respect the 500-line limit.
9
+ *
10
+ * SOLID: SRP - LLM prompt delegation only
11
+ */
12
+ import type { PluginInput } from "@opencode-ai/plugin";
13
+ import type { PromptFn } from "./llm-analyzer.js";
14
+ type OpencodeClient = PluginInput["client"];
15
+ /**
16
+ * Creates a PromptFn that delegates to the OpenCode SDK.
17
+ * Supports model override for cost-effective analysis.
18
+ */
19
+ export declare function createLlmPromptFn(client: OpencodeClient): PromptFn;
20
+ export {};
21
+ //# sourceMappingURL=llm-prompt-factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-prompt-factory.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/domain-map/llm-prompt-factory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAElD,KAAK,cAAc,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;AAE5C;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,cAAc,GAAG,QAAQ,CAqDlE"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Creates a PromptFn that delegates to the OpenCode SDK.
3
+ * Supports model override for cost-effective analysis.
4
+ */
5
+ export function createLlmPromptFn(client) {
6
+ return async (prompt, model) => {
7
+ const createResult = await client.session.create({
8
+ body: { title: "[jarvis] domain-map-analysis" },
9
+ });
10
+ if (!createResult.data) {
11
+ throw new Error("Failed to create analysis session");
12
+ }
13
+ const sessionId = createResult.data.id;
14
+ try {
15
+ const promptResult = await client.session.prompt({
16
+ path: { id: sessionId },
17
+ body: {
18
+ system: "You are a Domain-Driven Design expert analyzing a codebase. " +
19
+ "Respond ONLY with valid JSON matching the schema in the prompt. " +
20
+ "Do not include markdown fences around the JSON. " +
21
+ "Do not use any tools.",
22
+ ...(model !== undefined
23
+ ? {
24
+ model: {
25
+ providerID: model.providerID,
26
+ modelID: model.modelID,
27
+ },
28
+ }
29
+ : {}),
30
+ parts: [{ type: "text", text: prompt }],
31
+ },
32
+ });
33
+ if (!promptResult.data) {
34
+ throw new Error("LLM analysis returned no data");
35
+ }
36
+ const textParts = promptResult.data.parts.filter((p) => p.type === "text");
37
+ if (textParts.length === 0) {
38
+ throw new Error("LLM analysis returned no text parts");
39
+ }
40
+ return textParts.map((p) => p.text).join("");
41
+ }
42
+ finally {
43
+ await client.session
44
+ .delete({ path: { id: sessionId } })
45
+ .catch(() => { });
46
+ }
47
+ };
48
+ }
49
+ //# sourceMappingURL=llm-prompt-factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-prompt-factory.js","sourceRoot":"","sources":["../../../src/infrastructure/domain-map/llm-prompt-factory.ts"],"names":[],"mappings":"AAgBA;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAsB;IACtD,OAAO,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE;QAC7B,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;YAC/C,IAAI,EAAE,EAAE,KAAK,EAAE,8BAA8B,EAAE;SAChD,CAAC,CAAC;QACH,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACvD,CAAC;QACD,MAAM,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;QAEvC,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;gBAC/C,IAAI,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE;gBACvB,IAAI,EAAE;oBACJ,MAAM,EACJ,8DAA8D;wBAC9D,kEAAkE;wBAClE,kDAAkD;wBAClD,uBAAuB;oBACzB,GAAG,CAAC,KAAK,KAAK,SAAS;wBACrB,CAAC,CAAC;4BACE,KAAK,EAAE;gCACL,UAAU,EAAE,KAAK,CAAC,UAAU;gCAC5B,OAAO,EAAE,KAAK,CAAC,OAAO;6BACvB;yBACF;wBACH,CAAC,CAAC,EAAE,CAAC;oBACP,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;iBACjD;aACF,CAAC,CAAC;YAEH,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;gBACvB,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;YACnD,CAAC;YAED,MAAM,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAC9C,CACE,CAAC,EAID,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CACvB,CAAC;YACF,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC3B,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;YACzD,CAAC;YACD,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC/C,CAAC;gBAAS,CAAC;YACT,MAAM,MAAM,CAAC,OAAO;iBACjB,MAAM,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,CAAC;iBACnC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACrB,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
@@ -27,6 +27,11 @@ import { WorkspaceId } from "../../domain/shared/value-objects.js";
27
27
  export declare class SqliteCardRepository implements CardRepository {
28
28
  private readonly db;
29
29
  constructor(db: SqliteAdapter);
30
+ /**
31
+ * Add gate_tasks and last_transition_at columns if they don't exist.
32
+ * Required for databases created before CD-007.
33
+ */
34
+ private migrateGateTaskColumns;
30
35
  save(card: Card): Promise<void>;
31
36
  findById(id: CardId): Promise<Card | null>;
32
37
  findByWorkspace(workspace: WorkspaceId, status?: CardStatus): Promise<readonly Card[]>;
@@ -36,6 +41,7 @@ export declare class SqliteCardRepository implements CardRepository {
36
41
  countByStatus(workspace: WorkspaceId, status: CardStatus): Promise<number>;
37
42
  nextSequence(workspace: WorkspaceId): Promise<number>;
38
43
  delete(id: CardId): Promise<void>;
44
+ private parseCardIds;
39
45
  private toDomain;
40
46
  }
41
47
  //# sourceMappingURL=card-repository.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"card-repository.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/kanban/card-repository.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,EAAE,IAAI,EAAE,MAAM,iCAAiC,CAAC;AAEvD,OAAO,EACL,MAAM,EACN,UAAU,EAEV,QAAQ,EACR,MAAM,EACP,MAAM,sCAAsC,CAAC;AAE9C,OAAO,EAAE,WAAW,EAAa,MAAM,sCAAsC,CAAC;AAuD9E;;;;;GAKG;AACH,qBAAa,oBAAqB,YAAW,cAAc;IAC7C,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,aAAa;IAIxC,IAAI,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAkD/B,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAQ1C,eAAe,CACnB,SAAS,EAAE,WAAW,EACtB,MAAM,CAAC,EAAE,UAAU,GAClB,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC;IAmBrB,YAAY,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC;IAU1D,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC;IAUpD,WAAW,CACf,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,WAAW,GACrB,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC;IAUrB,aAAa,CACjB,SAAS,EAAE,WAAW,EACtB,MAAM,EAAE,UAAU,GACjB,OAAO,CAAC,MAAM,CAAC;IASZ,YAAY,CAAC,SAAS,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;IASrD,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMvC,OAAO,CAAC,QAAQ;CA2CjB"}
1
+ {"version":3,"file":"card-repository.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/kanban/card-repository.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,EAAE,IAAI,EAAE,MAAM,iCAAiC,CAAC;AAEvD,OAAO,EACL,MAAM,EACN,UAAU,EAEV,QAAQ,EACR,MAAM,EAEP,MAAM,sCAAsC,CAAC;AAE9C,OAAO,EAAE,WAAW,EAAa,MAAM,sCAAsC,CAAC;AAmE9E;;;;;GAKG;AACH,qBAAa,oBAAqB,YAAW,cAAc;IAC7C,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,aAAa;IAK9C;;;OAGG;IACH,OAAO,CAAC,sBAAsB;IAmBxB,IAAI,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAyE/B,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAQ1C,eAAe,CACnB,SAAS,EAAE,WAAW,EACtB,MAAM,CAAC,EAAE,UAAU,GAClB,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC;IAmBrB,YAAY,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC;IAU1D,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC;IAUpD,WAAW,CACf,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,WAAW,GACrB,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC;IAUrB,aAAa,CACjB,SAAS,EAAE,WAAW,EACtB,MAAM,EAAE,UAAU,GACjB,OAAO,CAAC,MAAM,CAAC;IASZ,YAAY,CAAC,SAAS,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;IASrD,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMvC,OAAO,CAAC,YAAY;IASpB,OAAO,CAAC,QAAQ;CA8DjB"}
@@ -1,5 +1,5 @@
1
1
  import { Card } from "../../domain/kanban/entities.js";
2
- import { CardId, CardStatus, Priority, SprintId, EpicId, } from "../../domain/kanban/value-objects.js";
2
+ import { CardId, CardStatus, Priority, SprintId, EpicId, ScopeDocPath, } from "../../domain/kanban/value-objects.js";
3
3
  import { WorkspaceId, Timestamp } from "../../domain/shared/value-objects.js";
4
4
  const SCHEMA_KEY = "kanban_cards";
5
5
  const DDL = `
@@ -17,10 +17,16 @@ const DDL = `
17
17
  acceptance_criteria TEXT NOT NULL DEFAULT '[]',
18
18
  review_iterations INTEGER NOT NULL DEFAULT 0,
19
19
  previous_status TEXT,
20
+ depends_on TEXT NOT NULL DEFAULT '[]',
21
+ blocked_by TEXT NOT NULL DEFAULT '[]',
22
+ scope_doc_path TEXT,
20
23
  grooming_completed INTEGER NOT NULL DEFAULT 0,
21
24
  created_at TEXT NOT NULL,
22
25
  started_at TEXT,
23
- completed_at TEXT
26
+ completed_at TEXT,
27
+ pipeline_id TEXT,
28
+ gate_tasks TEXT NOT NULL DEFAULT '[]',
29
+ last_transition_at TEXT
24
30
  );
25
31
  CREATE INDEX IF NOT EXISTS idx_cards_workspace ON cards(workspace);
26
32
  CREATE INDEX IF NOT EXISTS idx_cards_status ON cards(status);
@@ -42,20 +48,46 @@ export class SqliteCardRepository {
42
48
  constructor(db) {
43
49
  this.db = db;
44
50
  this.db.ensureSchema(SCHEMA_KEY, DDL);
51
+ this.migrateGateTaskColumns();
52
+ }
53
+ /**
54
+ * Add gate_tasks and last_transition_at columns if they don't exist.
55
+ * Required for databases created before CD-007.
56
+ */
57
+ migrateGateTaskColumns() {
58
+ try {
59
+ this.db.execute("ALTER TABLE cards ADD COLUMN gate_tasks TEXT NOT NULL DEFAULT '[]'", {});
60
+ }
61
+ catch {
62
+ // Column already exists — ignore
63
+ }
64
+ try {
65
+ this.db.execute("ALTER TABLE cards ADD COLUMN last_transition_at TEXT", {});
66
+ }
67
+ catch {
68
+ // Column already exists — ignore
69
+ }
45
70
  }
46
71
  async save(card) {
47
72
  const acJson = JSON.stringify(card.acceptanceCriteria);
73
+ const dependsOnJson = JSON.stringify(card.dependsOn.map((id) => id.value));
74
+ const blockedByJson = JSON.stringify(card.blockedBy.map((id) => id.value));
75
+ const gateTasksJson = JSON.stringify(card.gateTasks);
48
76
  const sql = `
49
77
  INSERT INTO cards (
50
78
  id, workspace, title, status, priority, description,
51
79
  epic_id, sprint_id, story_points, assigned_agent,
52
- acceptance_criteria, review_iterations, previous_status,
53
- grooming_completed, created_at, started_at, completed_at
80
+ acceptance_criteria, depends_on, blocked_by, scope_doc_path,
81
+ review_iterations, previous_status,
82
+ grooming_completed, created_at, started_at, completed_at,
83
+ pipeline_id, gate_tasks, last_transition_at
54
84
  ) VALUES (
55
85
  @id, @workspace, @title, @status, @priority, @description,
56
86
  @epic_id, @sprint_id, @story_points, @assigned_agent,
57
- @acceptance_criteria, @review_iterations, @previous_status,
58
- @grooming_completed, @created_at, @started_at, @completed_at
87
+ @acceptance_criteria, @depends_on, @blocked_by, @scope_doc_path,
88
+ @review_iterations, @previous_status,
89
+ @grooming_completed, @created_at, @started_at, @completed_at,
90
+ @pipeline_id, @gate_tasks, @last_transition_at
59
91
  )
60
92
  ON CONFLICT(id) DO UPDATE SET
61
93
  status = @status,
@@ -66,11 +98,17 @@ export class SqliteCardRepository {
66
98
  story_points = @story_points,
67
99
  assigned_agent = @assigned_agent,
68
100
  acceptance_criteria = @acceptance_criteria,
101
+ depends_on = @depends_on,
102
+ blocked_by = @blocked_by,
103
+ scope_doc_path = @scope_doc_path,
69
104
  review_iterations = @review_iterations,
70
105
  previous_status = @previous_status,
71
106
  grooming_completed = @grooming_completed,
72
107
  started_at = @started_at,
73
- completed_at = @completed_at
108
+ completed_at = @completed_at,
109
+ pipeline_id = @pipeline_id,
110
+ gate_tasks = @gate_tasks,
111
+ last_transition_at = @last_transition_at
74
112
  `;
75
113
  this.db.execute(sql, {
76
114
  id: card.id.value,
@@ -84,12 +122,18 @@ export class SqliteCardRepository {
84
122
  story_points: card.storyPoints ?? null,
85
123
  assigned_agent: card.assignedAgent ?? null,
86
124
  acceptance_criteria: acJson,
125
+ depends_on: dependsOnJson,
126
+ blocked_by: blockedByJson,
127
+ scope_doc_path: card.scopeDocPath?.value ?? null,
87
128
  review_iterations: card.reviewIterations,
88
129
  previous_status: card.previousStatus ?? null,
89
130
  grooming_completed: card.groomingCompleted ? 1 : 0,
90
131
  created_at: card.createdAt.toISO(),
91
132
  started_at: card.startedAt?.toISO() ?? null,
92
133
  completed_at: card.completedAt?.toISO() ?? null,
134
+ pipeline_id: card.pipelineId ?? null,
135
+ gate_tasks: gateTasksJson,
136
+ last_transition_at: card.lastTransitionAt?.toISO() ?? null,
93
137
  });
94
138
  }
95
139
  async findById(id) {
@@ -140,6 +184,15 @@ export class SqliteCardRepository {
140
184
  this.db.execute("DELETE FROM cards WHERE id = @id", { id: id.value });
141
185
  }
142
186
  // ── Mapping ─────────────────────────────────────────────────────
187
+ parseCardIds(json) {
188
+ try {
189
+ const arr = JSON.parse(json);
190
+ return arr.map((v) => CardId.from(v));
191
+ }
192
+ catch {
193
+ return [];
194
+ }
195
+ }
143
196
  toDomain(row) {
144
197
  let acceptanceCriteria = [];
145
198
  try {
@@ -148,6 +201,13 @@ export class SqliteCardRepository {
148
201
  catch {
149
202
  acceptanceCriteria = [];
150
203
  }
204
+ let gateTasks = [];
205
+ try {
206
+ gateTasks = JSON.parse(row.gate_tasks);
207
+ }
208
+ catch {
209
+ gateTasks = [];
210
+ }
151
211
  const props = {
152
212
  id: CardId.from(row.id),
153
213
  workspace: WorkspaceId.from(row.workspace),
@@ -166,6 +226,11 @@ export class SqliteCardRepository {
166
226
  ? { assignedAgent: row.assigned_agent }
167
227
  : {}),
168
228
  acceptanceCriteria,
229
+ dependsOn: row.depends_on ? this.parseCardIds(row.depends_on) : [],
230
+ blockedBy: row.blocked_by ? this.parseCardIds(row.blocked_by) : [],
231
+ ...(row.scope_doc_path !== null
232
+ ? { scopeDocPath: ScopeDocPath.from(row.scope_doc_path) }
233
+ : {}),
169
234
  reviewIterations: row.review_iterations,
170
235
  ...(row.previous_status !== null
171
236
  ? { previousStatus: row.previous_status }
@@ -178,6 +243,13 @@ export class SqliteCardRepository {
178
243
  ...(row.completed_at !== null
179
244
  ? { completedAt: Timestamp.fromISO(row.completed_at) }
180
245
  : {}),
246
+ ...(row.pipeline_id !== null
247
+ ? { pipelineId: row.pipeline_id }
248
+ : {}),
249
+ gateTasks,
250
+ ...(row.last_transition_at !== null
251
+ ? { lastTransitionAt: Timestamp.fromISO(row.last_transition_at) }
252
+ : {}),
181
253
  };
182
254
  return Card.reconstitute(props);
183
255
  }
@@ -1 +1 @@
1
- {"version":3,"file":"card-repository.js","sourceRoot":"","sources":["../../../src/infrastructure/kanban/card-repository.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"card-repository.js","sourceRoot":"","sources":["../../../src/infrastructure/kanban/card-repository.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Dagger CLI Adapter
3
+ *
4
+ * Infrastructure implementation of the DaggerPort domain interface.
5
+ * Wraps shell execution of the `dagger` CLI binary and container runtime
6
+ * detection (Docker, Apple Container).
7
+ *
8
+ * This phase delivers the adapter skeleton with runtime detection.
9
+ * Actual Dagger module templates come in CD-006/CD-007.
10
+ *
11
+ * SOLID: SRP — Dagger CLI interaction only
12
+ * SOLID: DIP — implements domain port interface
13
+ * SOLID: OCP — new runtime detectors can be added without modifying existing
14
+ */
15
+ import type { DaggerPort, DaggerEnvironmentInfo, DaggerRunRequest, DaggerRunResult } from "../../domain/pipeline/ports.js";
16
+ import type { Result } from "../../domain/shared/value-objects.js";
17
+ /**
18
+ * Abstraction over shell command execution.
19
+ * Allows testing without real process spawning.
20
+ */
21
+ export interface ShellExecutor {
22
+ exec(command: string, args: readonly string[], options: ShellExecOptions): Promise<ShellExecResult>;
23
+ }
24
+ export interface ShellExecOptions {
25
+ readonly cwd?: string;
26
+ readonly timeoutMs?: number;
27
+ readonly env?: Record<string, string>;
28
+ }
29
+ export interface ShellExecResult {
30
+ readonly stdout: string;
31
+ readonly stderr: string;
32
+ readonly exitCode: number;
33
+ }
34
+ /**
35
+ * Default shell executor using Node.js/Bun child_process.
36
+ * Spawns processes with timeout support.
37
+ */
38
+ export declare class ChildProcessExecutor implements ShellExecutor {
39
+ exec(command: string, args: readonly string[], options: ShellExecOptions): Promise<ShellExecResult>;
40
+ }
41
+ export declare class DaggerCliAdapter implements DaggerPort {
42
+ private readonly shell;
43
+ constructor(shell?: ShellExecutor);
44
+ checkEnvironment(): Promise<DaggerEnvironmentInfo>;
45
+ run(request: DaggerRunRequest): Promise<Result<DaggerRunResult>>;
46
+ private buildRunArgs;
47
+ private parseDaggerVersion;
48
+ private detectContainerRuntime;
49
+ }
50
+ //# sourceMappingURL=dagger-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dagger-adapter.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/pipeline/dagger-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,EACV,UAAU,EACV,qBAAqB,EACrB,gBAAgB,EAChB,eAAe,EAEhB,MAAM,gCAAgC,CAAC;AACxC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sCAAsC,CAAC;AAKnE;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,CACF,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,eAAe,CAAC,CAAC;CAC7B;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACvC;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAID;;;GAGG;AACH,qBAAa,oBAAqB,YAAW,aAAa;IAClD,IAAI,CACR,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,eAAe,CAAC;CA0D5B;AAUD,qBAAa,gBAAiB,YAAW,UAAU;IACjD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAgB;gBAE1B,KAAK,CAAC,EAAE,aAAa;IAI3B,gBAAgB,IAAI,OAAO,CAAC,qBAAqB,CAAC;IAwBlD,GAAG,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;IA2CtE,OAAO,CAAC,YAAY;IAQpB,OAAO,CAAC,kBAAkB;YAMZ,sBAAsB;CAoCrC"}
@@ -0,0 +1,153 @@
1
+ import { ok, fail } from "../../domain/shared/value-objects.js";
2
+ // ─── Default Shell Executor (child_process) ──────────────────────────────────
3
+ /**
4
+ * Default shell executor using Node.js/Bun child_process.
5
+ * Spawns processes with timeout support.
6
+ */
7
+ export class ChildProcessExecutor {
8
+ async exec(command, args, options) {
9
+ const { spawn } = await import("child_process");
10
+ return new Promise((resolve) => {
11
+ const child = spawn(command, [...args], {
12
+ cwd: options.cwd,
13
+ env: { ...process.env, ...options.env },
14
+ stdio: ["ignore", "pipe", "pipe"],
15
+ });
16
+ let stdout = "";
17
+ let stderr = "";
18
+ child.stdout.on("data", (data) => {
19
+ stdout += data.toString();
20
+ });
21
+ child.stderr.on("data", (data) => {
22
+ stderr += data.toString();
23
+ });
24
+ let timedOut = false;
25
+ let timer;
26
+ if (options.timeoutMs !== undefined && options.timeoutMs > 0) {
27
+ timer = setTimeout(() => {
28
+ timedOut = true;
29
+ child.kill("SIGTERM");
30
+ }, options.timeoutMs);
31
+ }
32
+ child.on("close", (code) => {
33
+ if (timer !== undefined)
34
+ clearTimeout(timer);
35
+ if (timedOut) {
36
+ resolve({
37
+ stdout,
38
+ stderr: stderr + "\n[TIMEOUT] Process killed after timeout",
39
+ exitCode: 124, // Standard timeout exit code
40
+ });
41
+ }
42
+ else {
43
+ resolve({
44
+ stdout,
45
+ stderr,
46
+ exitCode: code ?? 1,
47
+ });
48
+ }
49
+ });
50
+ child.on("error", (err) => {
51
+ if (timer !== undefined)
52
+ clearTimeout(timer);
53
+ resolve({
54
+ stdout: "",
55
+ stderr: err.message,
56
+ exitCode: 127, // Command not found
57
+ });
58
+ });
59
+ });
60
+ }
61
+ }
62
+ // ─── Dagger Adapter ──────────────────────────────────────────────────────────
63
+ /** Default timeout for Dagger operations (5 minutes). */
64
+ const DEFAULT_TIMEOUT_MS = 300_000;
65
+ /** Default timeout for environment checks (10 seconds). */
66
+ const CHECK_TIMEOUT_MS = 10_000;
67
+ export class DaggerCliAdapter {
68
+ shell;
69
+ constructor(shell) {
70
+ this.shell = shell ?? new ChildProcessExecutor();
71
+ }
72
+ async checkEnvironment() {
73
+ // Check Dagger CLI
74
+ const daggerResult = await this.shell.exec("dagger", ["version"], { timeoutMs: CHECK_TIMEOUT_MS });
75
+ const daggerAvailable = daggerResult.exitCode === 0;
76
+ const daggerVersion = daggerAvailable
77
+ ? this.parseDaggerVersion(daggerResult.stdout)
78
+ : undefined;
79
+ // Check container runtime
80
+ const runtime = await this.detectContainerRuntime();
81
+ return {
82
+ daggerAvailable,
83
+ ...(daggerVersion !== undefined ? { daggerVersion } : {}),
84
+ ...(runtime !== undefined ? { containerRuntime: runtime.type } : {}),
85
+ runtimeReady: runtime?.ready ?? false,
86
+ };
87
+ }
88
+ async run(request) {
89
+ // Pre-flight: check Dagger availability
90
+ const envCheck = await this.checkEnvironment();
91
+ if (!envCheck.daggerAvailable) {
92
+ return fail("Dagger CLI is not installed or not accessible. " +
93
+ "Install from https://docs.dagger.io/install");
94
+ }
95
+ if (!envCheck.runtimeReady) {
96
+ return fail("No container runtime is available. " +
97
+ "Ensure Docker Desktop or compatible runtime is running.");
98
+ }
99
+ // Build command arguments
100
+ const args = this.buildRunArgs(request);
101
+ const timeoutMs = request.timeoutMs ?? DEFAULT_TIMEOUT_MS;
102
+ const startTime = Date.now();
103
+ const result = await this.shell.exec("dagger", args, {
104
+ cwd: request.moduleDir,
105
+ timeoutMs,
106
+ });
107
+ const durationMs = Date.now() - startTime;
108
+ const output = [result.stdout, result.stderr]
109
+ .filter((s) => s.length > 0)
110
+ .join("\n");
111
+ const runResult = {
112
+ success: result.exitCode === 0,
113
+ output,
114
+ exitCode: result.exitCode,
115
+ durationMs,
116
+ };
117
+ return ok(runResult);
118
+ }
119
+ // ─── Private Helpers ─────────────────────────────────────────────────
120
+ buildRunArgs(request) {
121
+ const args = ["call", request.functionName];
122
+ if (request.args) {
123
+ args.push(...request.args);
124
+ }
125
+ return args;
126
+ }
127
+ parseDaggerVersion(stdout) {
128
+ // Dagger version output format: "dagger v0.15.1 (registry.dagger.io/engine) ..."
129
+ const match = /v?(\d+\.\d+\.\d+)/.exec(stdout);
130
+ return match?.[1];
131
+ }
132
+ async detectContainerRuntime() {
133
+ // Try Docker first (most common)
134
+ const dockerResult = await this.shell.exec("docker", ["info", "--format", "{{.ServerVersion}}"], { timeoutMs: CHECK_TIMEOUT_MS });
135
+ if (dockerResult.exitCode === 0) {
136
+ return { type: "docker", ready: true };
137
+ }
138
+ // Docker installed but daemon not running
139
+ if (dockerResult.exitCode !== 127) {
140
+ return { type: "docker", ready: false };
141
+ }
142
+ // Try Apple Container (macOS Swift/Xcode workflows)
143
+ const containerResult = await this.shell.exec("container", ["--version"], { timeoutMs: CHECK_TIMEOUT_MS });
144
+ if (containerResult.exitCode === 0) {
145
+ return { type: "apple-container", ready: true };
146
+ }
147
+ if (containerResult.exitCode !== 127) {
148
+ return { type: "apple-container", ready: false };
149
+ }
150
+ return undefined;
151
+ }
152
+ }
153
+ //# sourceMappingURL=dagger-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dagger-adapter.js","sourceRoot":"","sources":["../../../src/infrastructure/pipeline/dagger-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Dagger Scaffold Generator
3
+ *
4
+ * Generates Dagger module scaffold files for supported stack templates.
5
+ * Each stack produces a complete set of files (.dagger/dagger.json,
6
+ * .dagger/src/index.ts or .dagger/src/{name}/main.py) with real CI/CD
7
+ * functions that match the gate-to-function mapping in the template registry.
8
+ *
9
+ * Template source content is in scaffold-templates.ts (SRP split).
10
+ *
11
+ * SOLID: SRP — scaffold generation orchestration only
12
+ * SOLID: OCP — new stacks added by extending the generator map
13
+ * SOLID: DIP — implements domain ScaffoldPort interface
14
+ */
15
+ import type { ScaffoldPort, ScaffoldOutput } from "../../domain/pipeline/ports.js";
16
+ /**
17
+ * Dagger scaffold generator for TypeScript and Python stacks.
18
+ *
19
+ * Generates complete Dagger module files with real CI/CD functions
20
+ * that match the gate-to-function mapping in the template registry.
21
+ * Function names use the stack prefix (e.g., "typescript-lib-lint"
22
+ * becomes "typescriptLibLint" in TS or "typescript_lib_lint" in Python).
23
+ */
24
+ export declare class DaggerScaffoldGenerator implements ScaffoldPort {
25
+ /** Generate scaffold files for a supported stack. */
26
+ generate(stack: string): ScaffoldOutput | undefined;
27
+ /** List all stacks with scaffold support. */
28
+ supportedStacks(): readonly string[];
29
+ private buildScaffold;
30
+ private getSdk;
31
+ private generateFiles;
32
+ private getTypescriptSource;
33
+ private getPythonSource;
34
+ }
35
+ //# sourceMappingURL=dagger-scaffold-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dagger-scaffold-generator.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/pipeline/dagger-scaffold-generator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EACV,YAAY,EACZ,cAAc,EAEf,MAAM,gCAAgC,CAAC;AAoDxC;;;;;;;GAOG;AACH,qBAAa,uBAAwB,YAAW,YAAY;IAC1D,qDAAqD;IACrD,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAOnD,6CAA6C;IAC7C,eAAe,IAAI,SAAS,MAAM,EAAE;IAMpC,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,MAAM;IAKd,OAAO,CAAC,aAAa;IAmCrB,OAAO,CAAC,mBAAmB;IAmB3B,OAAO,CAAC,eAAe;CAUxB"}