@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 @@
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"}
@@ -1,15 +1,9 @@
1
- /**
2
- * SQLite Database Adapter
3
- *
4
- * Wraps better-sqlite3 to provide a clean interface for repository use.
5
- * Handles database lifecycle, schema execution, and typed queries.
6
- *
7
- * SOLID: SRP - database connection management only
8
- * SOLID: OCP - repositories extend behavior without modifying adapter
9
- * SOLID: DIP - repositories depend on this adapter, not raw better-sqlite3
10
- */
11
- import Database from "better-sqlite3";
12
- import type { Statement } from "better-sqlite3";
1
+ import type { Statement as BunStatement } from "bun:sqlite";
2
+ /** Result returned by execute() — matches bun:sqlite's Changes shape. */
3
+ export interface RunResult {
4
+ readonly changes: number;
5
+ readonly lastInsertRowid: number | bigint;
6
+ }
13
7
  /** Configuration for database initialization. */
14
8
  export interface DatabaseConfig {
15
9
  /** Path to SQLite file, or ":memory:" for in-memory DB. */
@@ -18,14 +12,18 @@ export interface DatabaseConfig {
18
12
  readonly walMode?: boolean;
19
13
  }
20
14
  /**
21
- * Thin adapter over better-sqlite3.
15
+ * Thin adapter over bun:sqlite.
22
16
  *
23
17
  * Provides typed query helpers and schema management.
24
18
  * Each repository calls ensureSchema() to set up its tables.
19
+ *
20
+ * Uses `strict: true` so named parameters (@param) can be bound
21
+ * with unprefixed keys ({ param: value }) — matching our existing SQL.
25
22
  */
26
23
  export declare class SqliteAdapter {
27
24
  private readonly db;
28
25
  private readonly initializedSchemas;
26
+ private closed;
29
27
  constructor(config: DatabaseConfig);
30
28
  /**
31
29
  * Execute DDL schema idempotently.
@@ -37,11 +35,11 @@ export declare class SqliteAdapter {
37
35
  /** Run a query that returns a single row or undefined. */
38
36
  queryOne<T>(sql: string, params?: Record<string, unknown>): T | undefined;
39
37
  /** Run a statement that modifies data (INSERT, UPDATE, DELETE). */
40
- execute(sql: string, params?: Record<string, unknown>): Database.RunResult;
38
+ execute(sql: string, params?: Record<string, unknown>): RunResult;
41
39
  /** Run multiple statements in a transaction. */
42
40
  transaction<T>(fn: () => T): T;
43
41
  /** Prepare a statement for repeated use. */
44
- prepare(sql: string): Statement;
42
+ prepare(sql: string): BunStatement;
45
43
  /** Get the last inserted rowid. */
46
44
  get lastInsertRowid(): number | bigint;
47
45
  /** Close the database connection. */
@@ -1 +1 @@
1
- {"version":3,"file":"sqlite-adapter.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/database/sqlite-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,KAAK,EAA4B,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE1E,iDAAiD;AACjD,MAAM,WAAW,cAAc;IAC7B,2DAA2D;IAC3D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,8DAA8D;IAC9D,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED;;;;;GAKG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAe;IAClC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAqB;gBAE5C,MAAM,EAAE,cAAc;IAYlC;;;OAGG;IACH,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI;IAMlD,qCAAqC;IACrC,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE;IAK/D,0DAA0D;IAC1D,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,GAAG,SAAS;IAKzE,mEAAmE;IACnE,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,SAAS;IAK1E,gDAAgD;IAChD,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC;IAK9B,4CAA4C;IAC5C,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS;IAI/B,mCAAmC;IACnC,IAAI,eAAe,IAAI,MAAM,GAAG,MAAM,CASrC;IAED,qCAAqC;IACrC,KAAK,IAAI,IAAI;IAIb,qCAAqC;IACrC,IAAI,MAAM,IAAI,OAAO,CAEpB;CACF;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,aAAa,CAErD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,GACb,aAAa,CAGf"}
1
+ {"version":3,"file":"sqlite-adapter.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/database/sqlite-adapter.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,SAAS,IAAI,YAAY,EAAE,MAAM,YAAY,CAAC;AAQ5D,yEAAyE;AACzE,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,eAAe,EAAE,MAAM,GAAG,MAAM,CAAC;CAC3C;AAED,iDAAiD;AACjD,MAAM,WAAW,cAAc;IAC7B,2DAA2D;IAC3D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,8DAA8D;IAC9D,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED;;;;;;;;GAQG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAW;IAC9B,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAqB;IACxD,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,EAAE,cAAc;IAYlC;;;OAGG;IACH,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI;IAMlD,qCAAqC;IACrC,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE;IAM/D,0DAA0D;IAC1D,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,GAAG,SAAS;IAQzE,mEAAmE;IACnE,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS;IAMjE,gDAAgD;IAChD,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC;IAK9B,4CAA4C;IAC5C,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY;IAIlC,mCAAmC;IACnC,IAAI,eAAe,IAAI,MAAM,GAAG,MAAM,CAKrC;IAED,qCAAqC;IACrC,KAAK,IAAI,IAAI;IAOb,qCAAqC;IACrC,IAAI,MAAM,IAAI,OAAO,CAEpB;CACF;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,aAAa,CAErD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,GACb,aAAa,CAGf"}
@@ -1,31 +1,39 @@
1
1
  /**
2
2
  * SQLite Database Adapter
3
3
  *
4
- * Wraps better-sqlite3 to provide a clean interface for repository use.
4
+ * Wraps bun:sqlite to provide a clean interface for repository use.
5
5
  * Handles database lifecycle, schema execution, and typed queries.
6
6
  *
7
7
  * SOLID: SRP - database connection management only
8
8
  * SOLID: OCP - repositories extend behavior without modifying adapter
9
- * SOLID: DIP - repositories depend on this adapter, not raw better-sqlite3
9
+ * SOLID: DIP - repositories depend on this adapter, not raw bun:sqlite
10
+ *
11
+ * NOTE: bun:sqlite is used because OpenCode runs plugins on Bun runtime.
12
+ * The `strict: true` option allows binding named parameters without prefix,
13
+ * so SQL using @param works with binding objects like { param: value }.
10
14
  */
11
- import Database from "better-sqlite3";
15
+ import { Database } from "bun:sqlite";
12
16
  /**
13
- * Thin adapter over better-sqlite3.
17
+ * Thin adapter over bun:sqlite.
14
18
  *
15
19
  * Provides typed query helpers and schema management.
16
20
  * Each repository calls ensureSchema() to set up its tables.
21
+ *
22
+ * Uses `strict: true` so named parameters (@param) can be bound
23
+ * with unprefixed keys ({ param: value }) — matching our existing SQL.
17
24
  */
18
25
  export class SqliteAdapter {
19
26
  db;
20
27
  initializedSchemas = new Set();
28
+ closed = false;
21
29
  constructor(config) {
22
- this.db = new Database(config.path);
30
+ this.db = new Database(config.path, { strict: true });
23
31
  // Enable WAL mode for better read concurrency (default: on)
24
32
  if (config.walMode !== false) {
25
- this.db.pragma("journal_mode = WAL");
33
+ this.db.run("PRAGMA journal_mode = WAL");
26
34
  }
27
35
  // Foreign keys enforcement
28
- this.db.pragma("foreign_keys = ON");
36
+ this.db.run("PRAGMA foreign_keys = ON");
29
37
  }
30
38
  /**
31
39
  * Execute DDL schema idempotently.
@@ -34,23 +42,28 @@ export class SqliteAdapter {
34
42
  ensureSchema(schemaKey, ddl) {
35
43
  if (this.initializedSchemas.has(schemaKey))
36
44
  return;
37
- this.db.exec(ddl);
45
+ this.db.run(ddl);
38
46
  this.initializedSchemas.add(schemaKey);
39
47
  }
40
48
  /** Run a query that returns rows. */
41
49
  queryAll(sql, params) {
42
50
  const stmt = this.db.prepare(sql);
43
- return (params ? stmt.all(params) : stmt.all());
51
+ const bindings = params;
52
+ return (bindings ? stmt.all(bindings) : stmt.all());
44
53
  }
45
54
  /** Run a query that returns a single row or undefined. */
46
55
  queryOne(sql, params) {
47
56
  const stmt = this.db.prepare(sql);
48
- return (params ? stmt.get(params) : stmt.get());
57
+ const bindings = params;
58
+ const result = bindings ? stmt.get(bindings) : stmt.get();
59
+ // bun:sqlite returns null for no rows; normalize to undefined
60
+ return (result ?? undefined);
49
61
  }
50
62
  /** Run a statement that modifies data (INSERT, UPDATE, DELETE). */
51
63
  execute(sql, params) {
52
64
  const stmt = this.db.prepare(sql);
53
- return params ? stmt.run(params) : stmt.run();
65
+ const bindings = params;
66
+ return bindings ? stmt.run(bindings) : stmt.run();
54
67
  }
55
68
  /** Run multiple statements in a transaction. */
56
69
  transaction(fn) {
@@ -63,18 +76,19 @@ export class SqliteAdapter {
63
76
  }
64
77
  /** Get the last inserted rowid. */
65
78
  get lastInsertRowid() {
66
- return this.db.prepare("SELECT last_insert_rowid() as id").get() !==
67
- undefined
68
- ? this.db.prepare("SELECT last_insert_rowid() as id").get().id
69
- : 0;
79
+ const row = this.db.prepare("SELECT last_insert_rowid() as id").get();
80
+ return row?.id ?? 0;
70
81
  }
71
82
  /** Close the database connection. */
72
83
  close() {
73
- this.db.close();
84
+ if (!this.closed) {
85
+ this.db.close();
86
+ this.closed = true;
87
+ }
74
88
  }
75
89
  /** Check if the database is open. */
76
90
  get isOpen() {
77
- return this.db.open;
91
+ return !this.closed;
78
92
  }
79
93
  }
80
94
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"sqlite-adapter.js","sourceRoot":"","sources":["../../../src/infrastructure/database/sqlite-adapter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sqlite-adapter.js","sourceRoot":"","sources":["../../../src/infrastructure/database/sqlite-adapter.ts"],"names":[],"mappings":"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"}
@@ -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"}