@gitgov/core 1.0.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 (469) hide show
  1. package/README.md +303 -0
  2. package/dist/scripts/compile-json-to-types.d.ts +11 -0
  3. package/dist/scripts/compile-json-to-types.d.ts.map +1 -0
  4. package/dist/scripts/compile-json-to-types.js +129 -0
  5. package/dist/scripts/compile-json-to-types.js.map +1 -0
  6. package/dist/scripts/diagnose-duplicates.d.ts +7 -0
  7. package/dist/scripts/diagnose-duplicates.d.ts.map +1 -0
  8. package/dist/scripts/diagnose-duplicates.js +72 -0
  9. package/dist/scripts/diagnose-duplicates.js.map +1 -0
  10. package/dist/scripts/generate-indexes.d.ts +22 -0
  11. package/dist/scripts/generate-indexes.d.ts.map +1 -0
  12. package/dist/scripts/generate-indexes.js +168 -0
  13. package/dist/scripts/generate-indexes.js.map +1 -0
  14. package/dist/scripts/sync-schemas.d.ts +10 -0
  15. package/dist/scripts/sync-schemas.d.ts.map +1 -0
  16. package/dist/scripts/sync-schemas.js +84 -0
  17. package/dist/scripts/sync-schemas.js.map +1 -0
  18. package/dist/scripts/sync-workflow-configs.d.ts +11 -0
  19. package/dist/scripts/sync-workflow-configs.d.ts.map +1 -0
  20. package/dist/scripts/sync-workflow-configs.js +61 -0
  21. package/dist/scripts/sync-workflow-configs.js.map +1 -0
  22. package/dist/scripts/update-diagram.d.ts +7 -0
  23. package/dist/scripts/update-diagram.d.ts.map +1 -0
  24. package/dist/scripts/update-diagram.js +47 -0
  25. package/dist/scripts/update-diagram.js.map +1 -0
  26. package/dist/scripts/validate-schemas.d.ts +18 -0
  27. package/dist/scripts/validate-schemas.d.ts.map +1 -0
  28. package/dist/scripts/validate-schemas.js +313 -0
  29. package/dist/scripts/validate-schemas.js.map +1 -0
  30. package/dist/src/adapters/backlog_adapter/backlog_adapter.integration.test.d.ts +2 -0
  31. package/dist/src/adapters/backlog_adapter/backlog_adapter.integration.test.d.ts.map +1 -0
  32. package/dist/src/adapters/backlog_adapter/backlog_adapter.integration.test.js +507 -0
  33. package/dist/src/adapters/backlog_adapter/backlog_adapter.integration.test.js.map +1 -0
  34. package/dist/src/adapters/backlog_adapter/backlog_adapter.test.d.ts +2 -0
  35. package/dist/src/adapters/backlog_adapter/backlog_adapter.test.d.ts.map +1 -0
  36. package/dist/src/adapters/backlog_adapter/backlog_adapter.test.js +1282 -0
  37. package/dist/src/adapters/backlog_adapter/backlog_adapter.test.js.map +1 -0
  38. package/dist/src/adapters/backlog_adapter/backlog_adapter_e2e.test.d.ts +10 -0
  39. package/dist/src/adapters/backlog_adapter/backlog_adapter_e2e.test.d.ts.map +1 -0
  40. package/dist/src/adapters/backlog_adapter/backlog_adapter_e2e.test.js +144 -0
  41. package/dist/src/adapters/backlog_adapter/backlog_adapter_e2e.test.js.map +1 -0
  42. package/dist/src/adapters/backlog_adapter/index.d.ts +213 -0
  43. package/dist/src/adapters/backlog_adapter/index.d.ts.map +1 -0
  44. package/dist/src/adapters/backlog_adapter/index.js +924 -0
  45. package/dist/src/adapters/backlog_adapter/index.js.map +1 -0
  46. package/dist/src/adapters/changelog_adapter/changelog_adapter.test.d.ts +2 -0
  47. package/dist/src/adapters/changelog_adapter/changelog_adapter.test.d.ts.map +1 -0
  48. package/dist/src/adapters/changelog_adapter/changelog_adapter.test.js +505 -0
  49. package/dist/src/adapters/changelog_adapter/changelog_adapter.test.js.map +1 -0
  50. package/dist/src/adapters/changelog_adapter/index.d.ts +101 -0
  51. package/dist/src/adapters/changelog_adapter/index.d.ts.map +1 -0
  52. package/dist/src/adapters/changelog_adapter/index.js +197 -0
  53. package/dist/src/adapters/changelog_adapter/index.js.map +1 -0
  54. package/dist/src/adapters/execution_adapter/execution_adapter.test.d.ts +2 -0
  55. package/dist/src/adapters/execution_adapter/execution_adapter.test.d.ts.map +1 -0
  56. package/dist/src/adapters/execution_adapter/execution_adapter.test.js +266 -0
  57. package/dist/src/adapters/execution_adapter/execution_adapter.test.js.map +1 -0
  58. package/dist/src/adapters/execution_adapter/index.d.ts +90 -0
  59. package/dist/src/adapters/execution_adapter/index.d.ts.map +1 -0
  60. package/dist/src/adapters/execution_adapter/index.js +150 -0
  61. package/dist/src/adapters/execution_adapter/index.js.map +1 -0
  62. package/dist/src/adapters/feedback_adapter/feedback_adapter.test.d.ts +2 -0
  63. package/dist/src/adapters/feedback_adapter/feedback_adapter.test.d.ts.map +1 -0
  64. package/dist/src/adapters/feedback_adapter/feedback_adapter.test.js +256 -0
  65. package/dist/src/adapters/feedback_adapter/feedback_adapter.test.js.map +1 -0
  66. package/dist/src/adapters/feedback_adapter/index.d.ts +95 -0
  67. package/dist/src/adapters/feedback_adapter/index.d.ts.map +1 -0
  68. package/dist/src/adapters/feedback_adapter/index.js +192 -0
  69. package/dist/src/adapters/feedback_adapter/index.js.map +1 -0
  70. package/dist/src/adapters/identity_adapter/identity_adapter.test.d.ts +2 -0
  71. package/dist/src/adapters/identity_adapter/identity_adapter.test.d.ts.map +1 -0
  72. package/dist/src/adapters/identity_adapter/identity_adapter.test.js +624 -0
  73. package/dist/src/adapters/identity_adapter/identity_adapter.test.js.map +1 -0
  74. package/dist/src/adapters/identity_adapter/index.d.ts +82 -0
  75. package/dist/src/adapters/identity_adapter/index.d.ts.map +1 -0
  76. package/dist/src/adapters/identity_adapter/index.js +336 -0
  77. package/dist/src/adapters/identity_adapter/index.js.map +1 -0
  78. package/dist/src/adapters/index.d.ts +10 -0
  79. package/dist/src/adapters/index.d.ts.map +1 -0
  80. package/dist/src/adapters/index.js +10 -0
  81. package/dist/src/adapters/index.js.map +1 -0
  82. package/dist/src/adapters/indexer_adapter/index.d.ts +214 -0
  83. package/dist/src/adapters/indexer_adapter/index.d.ts.map +1 -0
  84. package/dist/src/adapters/indexer_adapter/index.js +643 -0
  85. package/dist/src/adapters/indexer_adapter/index.js.map +1 -0
  86. package/dist/src/adapters/indexer_adapter/indexer_adapter.test.d.ts +2 -0
  87. package/dist/src/adapters/indexer_adapter/indexer_adapter.test.d.ts.map +1 -0
  88. package/dist/src/adapters/indexer_adapter/indexer_adapter.test.js +409 -0
  89. package/dist/src/adapters/indexer_adapter/indexer_adapter.test.js.map +1 -0
  90. package/dist/src/adapters/metrics_adapter/index.d.ts +189 -0
  91. package/dist/src/adapters/metrics_adapter/index.d.ts.map +1 -0
  92. package/dist/src/adapters/metrics_adapter/index.js +592 -0
  93. package/dist/src/adapters/metrics_adapter/index.js.map +1 -0
  94. package/dist/src/adapters/metrics_adapter/metrics_adapter.test.d.ts +2 -0
  95. package/dist/src/adapters/metrics_adapter/metrics_adapter.test.d.ts.map +1 -0
  96. package/dist/src/adapters/metrics_adapter/metrics_adapter.test.js +558 -0
  97. package/dist/src/adapters/metrics_adapter/metrics_adapter.test.js.map +1 -0
  98. package/dist/src/adapters/project_adapter/index.d.ts +164 -0
  99. package/dist/src/adapters/project_adapter/index.d.ts.map +1 -0
  100. package/dist/src/adapters/project_adapter/index.js +445 -0
  101. package/dist/src/adapters/project_adapter/index.js.map +1 -0
  102. package/dist/src/adapters/project_adapter/project_adapter.test.d.ts +2 -0
  103. package/dist/src/adapters/project_adapter/project_adapter.test.d.ts.map +1 -0
  104. package/dist/src/adapters/project_adapter/project_adapter.test.js +627 -0
  105. package/dist/src/adapters/project_adapter/project_adapter.test.js.map +1 -0
  106. package/dist/src/adapters/workflow_methodology_adapter/index.d.ts +75 -0
  107. package/dist/src/adapters/workflow_methodology_adapter/index.d.ts.map +1 -0
  108. package/dist/src/adapters/workflow_methodology_adapter/index.js +205 -0
  109. package/dist/src/adapters/workflow_methodology_adapter/index.js.map +1 -0
  110. package/dist/src/adapters/workflow_methodology_adapter/workflow_methodology_adapter.test.d.ts +2 -0
  111. package/dist/src/adapters/workflow_methodology_adapter/workflow_methodology_adapter.test.d.ts.map +1 -0
  112. package/dist/src/adapters/workflow_methodology_adapter/workflow_methodology_adapter.test.js +463 -0
  113. package/dist/src/adapters/workflow_methodology_adapter/workflow_methodology_adapter.test.js.map +1 -0
  114. package/dist/src/adapters/workflow_methodology_adapter/workflow_methodology_adapter_integration.test.d.ts +2 -0
  115. package/dist/src/adapters/workflow_methodology_adapter/workflow_methodology_adapter_integration.test.d.ts.map +1 -0
  116. package/dist/src/adapters/workflow_methodology_adapter/workflow_methodology_adapter_integration.test.js +287 -0
  117. package/dist/src/adapters/workflow_methodology_adapter/workflow_methodology_adapter_integration.test.js.map +1 -0
  118. package/dist/src/adapters/workflow_methodology_adapter/workflow_methodology_adapter_scrum_integration.test.d.ts +2 -0
  119. package/dist/src/adapters/workflow_methodology_adapter/workflow_methodology_adapter_scrum_integration.test.d.ts.map +1 -0
  120. package/dist/src/adapters/workflow_methodology_adapter/workflow_methodology_adapter_scrum_integration.test.js +278 -0
  121. package/dist/src/adapters/workflow_methodology_adapter/workflow_methodology_adapter_scrum_integration.test.js.map +1 -0
  122. package/dist/src/adapters/workflow_methodology_adapter/workflow_methodology_default.json +188 -0
  123. package/dist/src/adapters/workflow_methodology_adapter/workflow_methodology_scrum.json +284 -0
  124. package/dist/src/config_manager/config_manager.test.d.ts +2 -0
  125. package/dist/src/config_manager/config_manager.test.d.ts.map +1 -0
  126. package/dist/src/config_manager/config_manager.test.js +321 -0
  127. package/dist/src/config_manager/config_manager.test.js.map +1 -0
  128. package/dist/src/config_manager/index.d.ts +107 -0
  129. package/dist/src/config_manager/index.d.ts.map +1 -0
  130. package/dist/src/config_manager/index.js +192 -0
  131. package/dist/src/config_manager/index.js.map +1 -0
  132. package/dist/src/crypto/checksum.d.ts +6 -0
  133. package/dist/src/crypto/checksum.d.ts.map +1 -0
  134. package/dist/src/crypto/checksum.js +38 -0
  135. package/dist/src/crypto/checksum.js.map +1 -0
  136. package/dist/src/crypto/checksum.test.d.ts +2 -0
  137. package/dist/src/crypto/checksum.test.d.ts.map +1 -0
  138. package/dist/src/crypto/checksum.test.js +167 -0
  139. package/dist/src/crypto/checksum.test.js.map +1 -0
  140. package/dist/src/crypto/index.d.ts +3 -0
  141. package/dist/src/crypto/index.d.ts.map +1 -0
  142. package/dist/src/crypto/index.js +3 -0
  143. package/dist/src/crypto/index.js.map +1 -0
  144. package/dist/src/crypto/signatures.d.ts +24 -0
  145. package/dist/src/crypto/signatures.d.ts.map +1 -0
  146. package/dist/src/crypto/signatures.js +67 -0
  147. package/dist/src/crypto/signatures.js.map +1 -0
  148. package/dist/src/crypto/signatures.test.d.ts +2 -0
  149. package/dist/src/crypto/signatures.test.d.ts.map +1 -0
  150. package/dist/src/crypto/signatures.test.js +378 -0
  151. package/dist/src/crypto/signatures.test.js.map +1 -0
  152. package/dist/src/diagram_generator/diagram_generator.d.ts +76 -0
  153. package/dist/src/diagram_generator/diagram_generator.d.ts.map +1 -0
  154. package/dist/src/diagram_generator/diagram_generator.js +233 -0
  155. package/dist/src/diagram_generator/diagram_generator.js.map +1 -0
  156. package/dist/src/diagram_generator/graph_validator.d.ts +19 -0
  157. package/dist/src/diagram_generator/graph_validator.d.ts.map +1 -0
  158. package/dist/src/diagram_generator/graph_validator.js +98 -0
  159. package/dist/src/diagram_generator/graph_validator.js.map +1 -0
  160. package/dist/src/diagram_generator/index.d.ts +4 -0
  161. package/dist/src/diagram_generator/index.d.ts.map +1 -0
  162. package/dist/src/diagram_generator/index.js +4 -0
  163. package/dist/src/diagram_generator/index.js.map +1 -0
  164. package/dist/src/diagram_generator/mermaid_renderer.d.ts +82 -0
  165. package/dist/src/diagram_generator/mermaid_renderer.d.ts.map +1 -0
  166. package/dist/src/diagram_generator/mermaid_renderer.js +306 -0
  167. package/dist/src/diagram_generator/mermaid_renderer.js.map +1 -0
  168. package/dist/src/diagram_generator/relationship_analyzer.d.ts +116 -0
  169. package/dist/src/diagram_generator/relationship_analyzer.d.ts.map +1 -0
  170. package/dist/src/diagram_generator/relationship_analyzer.js +381 -0
  171. package/dist/src/diagram_generator/relationship_analyzer.js.map +1 -0
  172. package/dist/src/event_bus/event_bus.d.ts +110 -0
  173. package/dist/src/event_bus/event_bus.d.ts.map +1 -0
  174. package/dist/src/event_bus/event_bus.js +161 -0
  175. package/dist/src/event_bus/event_bus.js.map +1 -0
  176. package/dist/src/event_bus/event_bus.test.d.ts +2 -0
  177. package/dist/src/event_bus/event_bus.test.d.ts.map +1 -0
  178. package/dist/src/event_bus/event_bus.test.js +332 -0
  179. package/dist/src/event_bus/event_bus.test.js.map +1 -0
  180. package/dist/src/event_bus/event_bus_integration.test.d.ts +2 -0
  181. package/dist/src/event_bus/event_bus_integration.test.d.ts.map +1 -0
  182. package/dist/src/event_bus/event_bus_integration.test.js +474 -0
  183. package/dist/src/event_bus/event_bus_integration.test.js.map +1 -0
  184. package/dist/src/event_bus/index.d.ts +3 -0
  185. package/dist/src/event_bus/index.d.ts.map +1 -0
  186. package/dist/src/event_bus/index.js +3 -0
  187. package/dist/src/event_bus/index.js.map +1 -0
  188. package/dist/src/event_bus/types.d.ts +203 -0
  189. package/dist/src/event_bus/types.d.ts.map +1 -0
  190. package/dist/src/event_bus/types.js +5 -0
  191. package/dist/src/event_bus/types.js.map +1 -0
  192. package/dist/src/factories/actor_factory.d.ts +6 -0
  193. package/dist/src/factories/actor_factory.d.ts.map +1 -0
  194. package/dist/src/factories/actor_factory.js +25 -0
  195. package/dist/src/factories/actor_factory.js.map +1 -0
  196. package/dist/src/factories/actor_factory.test.d.ts +2 -0
  197. package/dist/src/factories/actor_factory.test.d.ts.map +1 -0
  198. package/dist/src/factories/actor_factory.test.js +169 -0
  199. package/dist/src/factories/actor_factory.test.js.map +1 -0
  200. package/dist/src/factories/agent_factory.d.ts +6 -0
  201. package/dist/src/factories/agent_factory.d.ts.map +1 -0
  202. package/dist/src/factories/agent_factory.js +25 -0
  203. package/dist/src/factories/agent_factory.js.map +1 -0
  204. package/dist/src/factories/agent_factory.test.d.ts +2 -0
  205. package/dist/src/factories/agent_factory.test.d.ts.map +1 -0
  206. package/dist/src/factories/agent_factory.test.js +199 -0
  207. package/dist/src/factories/agent_factory.test.js.map +1 -0
  208. package/dist/src/factories/changelog_factory.d.ts +9 -0
  209. package/dist/src/factories/changelog_factory.d.ts.map +1 -0
  210. package/dist/src/factories/changelog_factory.js +46 -0
  211. package/dist/src/factories/changelog_factory.js.map +1 -0
  212. package/dist/src/factories/changelog_factory.test.d.ts +2 -0
  213. package/dist/src/factories/changelog_factory.test.d.ts.map +1 -0
  214. package/dist/src/factories/changelog_factory.test.js +368 -0
  215. package/dist/src/factories/changelog_factory.test.js.map +1 -0
  216. package/dist/src/factories/cycle_factory.d.ts +6 -0
  217. package/dist/src/factories/cycle_factory.d.ts.map +1 -0
  218. package/dist/src/factories/cycle_factory.js +28 -0
  219. package/dist/src/factories/cycle_factory.js.map +1 -0
  220. package/dist/src/factories/cycle_factory.test.d.ts +2 -0
  221. package/dist/src/factories/cycle_factory.test.d.ts.map +1 -0
  222. package/dist/src/factories/cycle_factory.test.js +175 -0
  223. package/dist/src/factories/cycle_factory.test.js.map +1 -0
  224. package/dist/src/factories/execution_factory.d.ts +9 -0
  225. package/dist/src/factories/execution_factory.d.ts.map +1 -0
  226. package/dist/src/factories/execution_factory.js +29 -0
  227. package/dist/src/factories/execution_factory.js.map +1 -0
  228. package/dist/src/factories/execution_factory.test.d.ts +2 -0
  229. package/dist/src/factories/execution_factory.test.d.ts.map +1 -0
  230. package/dist/src/factories/execution_factory.test.js +207 -0
  231. package/dist/src/factories/execution_factory.test.js.map +1 -0
  232. package/dist/src/factories/feedback_factory.d.ts +9 -0
  233. package/dist/src/factories/feedback_factory.d.ts.map +1 -0
  234. package/dist/src/factories/feedback_factory.js +30 -0
  235. package/dist/src/factories/feedback_factory.js.map +1 -0
  236. package/dist/src/factories/feedback_factory.test.d.ts +2 -0
  237. package/dist/src/factories/feedback_factory.test.d.ts.map +1 -0
  238. package/dist/src/factories/feedback_factory.test.js +256 -0
  239. package/dist/src/factories/feedback_factory.test.js.map +1 -0
  240. package/dist/src/factories/index.d.ts +9 -0
  241. package/dist/src/factories/index.d.ts.map +1 -0
  242. package/dist/src/factories/index.js +9 -0
  243. package/dist/src/factories/index.js.map +1 -0
  244. package/dist/src/factories/task_factory.d.ts +6 -0
  245. package/dist/src/factories/task_factory.d.ts.map +1 -0
  246. package/dist/src/factories/task_factory.js +30 -0
  247. package/dist/src/factories/task_factory.js.map +1 -0
  248. package/dist/src/factories/task_factory.test.d.ts +2 -0
  249. package/dist/src/factories/task_factory.test.d.ts.map +1 -0
  250. package/dist/src/factories/task_factory.test.js +197 -0
  251. package/dist/src/factories/task_factory.test.js.map +1 -0
  252. package/dist/src/factories/workflow_methodology_factory.d.ts +11 -0
  253. package/dist/src/factories/workflow_methodology_factory.d.ts.map +1 -0
  254. package/dist/src/factories/workflow_methodology_factory.js +173 -0
  255. package/dist/src/factories/workflow_methodology_factory.js.map +1 -0
  256. package/dist/src/factories/workflow_methodology_factory.test.d.ts +2 -0
  257. package/dist/src/factories/workflow_methodology_factory.test.d.ts.map +1 -0
  258. package/dist/src/factories/workflow_methodology_factory.test.js +244 -0
  259. package/dist/src/factories/workflow_methodology_factory.test.js.map +1 -0
  260. package/dist/src/index.d.ts +21 -0
  261. package/dist/src/index.d.ts.map +1 -0
  262. package/dist/src/index.js +23 -0
  263. package/dist/src/index.js.map +1 -0
  264. package/dist/src/integration/cycles_tasks_integration.test.d.ts +2 -0
  265. package/dist/src/integration/cycles_tasks_integration.test.d.ts.map +1 -0
  266. package/dist/src/integration/cycles_tasks_integration.test.js +258 -0
  267. package/dist/src/integration/cycles_tasks_integration.test.js.map +1 -0
  268. package/dist/src/integration/schema_integration.test.d.ts +8 -0
  269. package/dist/src/integration/schema_integration.test.d.ts.map +1 -0
  270. package/dist/src/integration/schema_integration.test.js +279 -0
  271. package/dist/src/integration/schema_integration.test.js.map +1 -0
  272. package/dist/src/logger/index.d.ts +2 -0
  273. package/dist/src/logger/index.d.ts.map +1 -0
  274. package/dist/src/logger/index.js +2 -0
  275. package/dist/src/logger/index.js.map +1 -0
  276. package/dist/src/logger/logger.d.ts +10 -0
  277. package/dist/src/logger/logger.d.ts.map +1 -0
  278. package/dist/src/logger/logger.js +48 -0
  279. package/dist/src/logger/logger.js.map +1 -0
  280. package/dist/src/schemas/errors.d.ts +28 -0
  281. package/dist/src/schemas/errors.d.ts.map +1 -0
  282. package/dist/src/schemas/errors.js +31 -0
  283. package/dist/src/schemas/errors.js.map +1 -0
  284. package/dist/src/schemas/generated/actor_record_schema.json +91 -0
  285. package/dist/src/schemas/generated/agent_record_schema.json +142 -0
  286. package/dist/src/schemas/generated/changelog_record_schema.json +227 -0
  287. package/dist/src/schemas/generated/cycle_record_schema.json +80 -0
  288. package/dist/src/schemas/generated/embedded_metadata_schema.json +318 -0
  289. package/dist/src/schemas/generated/execution_record_schema.json +89 -0
  290. package/dist/src/schemas/generated/feedback_record_schema.json +83 -0
  291. package/dist/src/schemas/generated/index.d.ts +2221 -0
  292. package/dist/src/schemas/generated/index.d.ts.map +1 -0
  293. package/dist/src/schemas/generated/index.js +48 -0
  294. package/dist/src/schemas/generated/index.js.map +1 -0
  295. package/dist/src/schemas/generated/task_record_schema.json +103 -0
  296. package/dist/src/schemas/generated/workflow_methodology_record_schema.json +393 -0
  297. package/dist/src/schemas/index.d.ts +4 -0
  298. package/dist/src/schemas/index.d.ts.map +1 -0
  299. package/dist/src/schemas/index.js +4 -0
  300. package/dist/src/schemas/index.js.map +1 -0
  301. package/dist/src/schemas/schema_cache.d.ts +39 -0
  302. package/dist/src/schemas/schema_cache.d.ts.map +1 -0
  303. package/dist/src/schemas/schema_cache.js +109 -0
  304. package/dist/src/schemas/schema_cache.js.map +1 -0
  305. package/dist/src/schemas/schema_cache.test.d.ts +2 -0
  306. package/dist/src/schemas/schema_cache.test.d.ts.map +1 -0
  307. package/dist/src/schemas/schema_cache.test.js +163 -0
  308. package/dist/src/schemas/schema_cache.test.js.map +1 -0
  309. package/dist/src/store/index.d.ts +2 -0
  310. package/dist/src/store/index.d.ts.map +1 -0
  311. package/dist/src/store/index.js +2 -0
  312. package/dist/src/store/index.js.map +1 -0
  313. package/dist/src/store/record_store.d.ts +30 -0
  314. package/dist/src/store/record_store.d.ts.map +1 -0
  315. package/dist/src/store/record_store.js +83 -0
  316. package/dist/src/store/record_store.js.map +1 -0
  317. package/dist/src/store/record_store.test.d.ts +2 -0
  318. package/dist/src/store/record_store.test.d.ts.map +1 -0
  319. package/dist/src/store/record_store.test.js +646 -0
  320. package/dist/src/store/record_store.test.js.map +1 -0
  321. package/dist/src/types/common.types.d.ts +43 -0
  322. package/dist/src/types/common.types.d.ts.map +1 -0
  323. package/dist/src/types/common.types.js +13 -0
  324. package/dist/src/types/common.types.js.map +1 -0
  325. package/dist/src/types/embedded.types.d.ts +17 -0
  326. package/dist/src/types/embedded.types.d.ts.map +1 -0
  327. package/dist/src/types/embedded.types.js +2 -0
  328. package/dist/src/types/embedded.types.js.map +1 -0
  329. package/dist/src/types/generated/actor_record.d.ts +45 -0
  330. package/dist/src/types/generated/actor_record.d.ts.map +1 -0
  331. package/dist/src/types/generated/actor_record.js +7 -0
  332. package/dist/src/types/generated/actor_record.js.map +1 -0
  333. package/dist/src/types/generated/agent_record.d.ts +40 -0
  334. package/dist/src/types/generated/agent_record.d.ts.map +1 -0
  335. package/dist/src/types/generated/agent_record.js +7 -0
  336. package/dist/src/types/generated/agent_record.js.map +1 -0
  337. package/dist/src/types/generated/changelog_record.d.ts +100 -0
  338. package/dist/src/types/generated/changelog_record.d.ts.map +1 -0
  339. package/dist/src/types/generated/changelog_record.js +7 -0
  340. package/dist/src/types/generated/changelog_record.js.map +1 -0
  341. package/dist/src/types/generated/cycle_record.d.ts +36 -0
  342. package/dist/src/types/generated/cycle_record.d.ts.map +1 -0
  343. package/dist/src/types/generated/cycle_record.js +7 -0
  344. package/dist/src/types/generated/cycle_record.js.map +1 -0
  345. package/dist/src/types/generated/embedded_metadata.d.ts +94 -0
  346. package/dist/src/types/generated/embedded_metadata.d.ts.map +1 -0
  347. package/dist/src/types/generated/embedded_metadata.js +7 -0
  348. package/dist/src/types/generated/embedded_metadata.js.map +1 -0
  349. package/dist/src/types/generated/execution_record.d.ts +39 -0
  350. package/dist/src/types/generated/execution_record.d.ts.map +1 -0
  351. package/dist/src/types/generated/execution_record.js +7 -0
  352. package/dist/src/types/generated/execution_record.js.map +1 -0
  353. package/dist/src/types/generated/feedback_record.d.ts +43 -0
  354. package/dist/src/types/generated/feedback_record.d.ts.map +1 -0
  355. package/dist/src/types/generated/feedback_record.js +7 -0
  356. package/dist/src/types/generated/feedback_record.js.map +1 -0
  357. package/dist/src/types/generated/index.d.ts +15 -0
  358. package/dist/src/types/generated/index.d.ts.map +1 -0
  359. package/dist/src/types/generated/index.js +15 -0
  360. package/dist/src/types/generated/index.js.map +1 -0
  361. package/dist/src/types/generated/task_record.d.ts +47 -0
  362. package/dist/src/types/generated/task_record.d.ts.map +1 -0
  363. package/dist/src/types/generated/task_record.js +7 -0
  364. package/dist/src/types/generated/task_record.js.map +1 -0
  365. package/dist/src/types/generated/workflow_methodology_record.d.ts +211 -0
  366. package/dist/src/types/generated/workflow_methodology_record.d.ts.map +1 -0
  367. package/dist/src/types/generated/workflow_methodology_record.js +7 -0
  368. package/dist/src/types/generated/workflow_methodology_record.js.map +1 -0
  369. package/dist/src/types/index.d.ts +4 -0
  370. package/dist/src/types/index.d.ts.map +1 -0
  371. package/dist/src/types/index.js +4 -0
  372. package/dist/src/types/index.js.map +1 -0
  373. package/dist/src/utils/id_generator.d.ts +44 -0
  374. package/dist/src/utils/id_generator.d.ts.map +1 -0
  375. package/dist/src/utils/id_generator.js +107 -0
  376. package/dist/src/utils/id_generator.js.map +1 -0
  377. package/dist/src/utils/id_generator.test.d.ts +2 -0
  378. package/dist/src/utils/id_generator.test.d.ts.map +1 -0
  379. package/dist/src/utils/id_generator.test.js +100 -0
  380. package/dist/src/utils/id_generator.test.js.map +1 -0
  381. package/dist/src/utils/index.d.ts +2 -0
  382. package/dist/src/utils/index.d.ts.map +1 -0
  383. package/dist/src/utils/index.js +3 -0
  384. package/dist/src/utils/index.js.map +1 -0
  385. package/dist/src/validation/actor_validator.d.ts +21 -0
  386. package/dist/src/validation/actor_validator.d.ts.map +1 -0
  387. package/dist/src/validation/actor_validator.js +48 -0
  388. package/dist/src/validation/actor_validator.js.map +1 -0
  389. package/dist/src/validation/actor_validator.test.d.ts +2 -0
  390. package/dist/src/validation/actor_validator.test.d.ts.map +1 -0
  391. package/dist/src/validation/actor_validator.test.js +83 -0
  392. package/dist/src/validation/actor_validator.test.js.map +1 -0
  393. package/dist/src/validation/agent_validator.d.ts +30 -0
  394. package/dist/src/validation/agent_validator.d.ts.map +1 -0
  395. package/dist/src/validation/agent_validator.js +66 -0
  396. package/dist/src/validation/agent_validator.js.map +1 -0
  397. package/dist/src/validation/agent_validator.test.d.ts +2 -0
  398. package/dist/src/validation/agent_validator.test.d.ts.map +1 -0
  399. package/dist/src/validation/agent_validator.test.js +73 -0
  400. package/dist/src/validation/agent_validator.test.js.map +1 -0
  401. package/dist/src/validation/changelog_validator.d.ts +23 -0
  402. package/dist/src/validation/changelog_validator.d.ts.map +1 -0
  403. package/dist/src/validation/changelog_validator.js +58 -0
  404. package/dist/src/validation/changelog_validator.js.map +1 -0
  405. package/dist/src/validation/changelog_validator.test.d.ts +2 -0
  406. package/dist/src/validation/changelog_validator.test.d.ts.map +1 -0
  407. package/dist/src/validation/changelog_validator.test.js +401 -0
  408. package/dist/src/validation/changelog_validator.test.js.map +1 -0
  409. package/dist/src/validation/common.d.ts +10 -0
  410. package/dist/src/validation/common.d.ts.map +1 -0
  411. package/dist/src/validation/common.js +12 -0
  412. package/dist/src/validation/common.js.map +1 -0
  413. package/dist/src/validation/cycle_validator.d.ts +24 -0
  414. package/dist/src/validation/cycle_validator.d.ts.map +1 -0
  415. package/dist/src/validation/cycle_validator.js +51 -0
  416. package/dist/src/validation/cycle_validator.js.map +1 -0
  417. package/dist/src/validation/cycle_validator.test.d.ts +2 -0
  418. package/dist/src/validation/cycle_validator.test.d.ts.map +1 -0
  419. package/dist/src/validation/cycle_validator.test.js +182 -0
  420. package/dist/src/validation/cycle_validator.test.js.map +1 -0
  421. package/dist/src/validation/embedded_metadata_validator.d.ts +26 -0
  422. package/dist/src/validation/embedded_metadata_validator.d.ts.map +1 -0
  423. package/dist/src/validation/embedded_metadata_validator.js +122 -0
  424. package/dist/src/validation/embedded_metadata_validator.js.map +1 -0
  425. package/dist/src/validation/embedded_metadata_validator.test.d.ts +2 -0
  426. package/dist/src/validation/embedded_metadata_validator.test.d.ts.map +1 -0
  427. package/dist/src/validation/embedded_metadata_validator.test.js +316 -0
  428. package/dist/src/validation/embedded_metadata_validator.test.js.map +1 -0
  429. package/dist/src/validation/errors.d.ts +67 -0
  430. package/dist/src/validation/errors.d.ts.map +1 -0
  431. package/dist/src/validation/errors.js +83 -0
  432. package/dist/src/validation/errors.js.map +1 -0
  433. package/dist/src/validation/execution_validator.d.ts +23 -0
  434. package/dist/src/validation/execution_validator.d.ts.map +1 -0
  435. package/dist/src/validation/execution_validator.js +58 -0
  436. package/dist/src/validation/execution_validator.js.map +1 -0
  437. package/dist/src/validation/execution_validator.test.d.ts +2 -0
  438. package/dist/src/validation/execution_validator.test.d.ts.map +1 -0
  439. package/dist/src/validation/execution_validator.test.js +167 -0
  440. package/dist/src/validation/execution_validator.test.js.map +1 -0
  441. package/dist/src/validation/feedback_validator.d.ts +23 -0
  442. package/dist/src/validation/feedback_validator.d.ts.map +1 -0
  443. package/dist/src/validation/feedback_validator.js +58 -0
  444. package/dist/src/validation/feedback_validator.js.map +1 -0
  445. package/dist/src/validation/feedback_validator.test.d.ts +2 -0
  446. package/dist/src/validation/feedback_validator.test.d.ts.map +1 -0
  447. package/dist/src/validation/feedback_validator.test.js +131 -0
  448. package/dist/src/validation/feedback_validator.test.js.map +1 -0
  449. package/dist/src/validation/index.d.ts +11 -0
  450. package/dist/src/validation/index.d.ts.map +1 -0
  451. package/dist/src/validation/index.js +10 -0
  452. package/dist/src/validation/index.js.map +1 -0
  453. package/dist/src/validation/task_validator.d.ts +24 -0
  454. package/dist/src/validation/task_validator.d.ts.map +1 -0
  455. package/dist/src/validation/task_validator.js +50 -0
  456. package/dist/src/validation/task_validator.js.map +1 -0
  457. package/dist/src/validation/task_validator.test.d.ts +2 -0
  458. package/dist/src/validation/task_validator.test.d.ts.map +1 -0
  459. package/dist/src/validation/task_validator.test.js +185 -0
  460. package/dist/src/validation/task_validator.test.js.map +1 -0
  461. package/dist/src/validation/workflow_methodology_validator.d.ts +32 -0
  462. package/dist/src/validation/workflow_methodology_validator.d.ts.map +1 -0
  463. package/dist/src/validation/workflow_methodology_validator.js +91 -0
  464. package/dist/src/validation/workflow_methodology_validator.js.map +1 -0
  465. package/dist/src/validation/workflow_methodology_validator.test.d.ts +2 -0
  466. package/dist/src/validation/workflow_methodology_validator.test.d.ts.map +1 -0
  467. package/dist/src/validation/workflow_methodology_validator.test.js +229 -0
  468. package/dist/src/validation/workflow_methodology_validator.test.js.map +1 -0
  469. package/package.json +63 -0
@@ -0,0 +1,627 @@
1
+ import { ProjectAdapter } from './index';
2
+ import { RecordStore } from '../../store';
3
+ import { ConfigManager } from '../../config_manager';
4
+ import { DetailedValidationError } from '../../validation/common';
5
+ import { promises as fs, existsSync } from 'fs';
6
+ import { createTaskRecord } from '../../factories/task_factory';
7
+ import { createCycleRecord } from '../../factories/cycle_factory';
8
+ // Mock the factories before importing
9
+ jest.mock('../../factories/task_factory', () => ({
10
+ createTaskRecord: jest.fn()
11
+ }));
12
+ jest.mock('../../factories/cycle_factory', () => ({
13
+ createCycleRecord: jest.fn()
14
+ }));
15
+ jest.mock('../../factories/actor_factory', () => ({
16
+ createActorRecord: jest.fn()
17
+ }));
18
+ // Mock dependencies
19
+ jest.mock('../../store');
20
+ jest.mock('../../config_manager');
21
+ jest.mock('fs', () => ({
22
+ promises: {
23
+ access: jest.fn(),
24
+ writeFile: jest.fn(),
25
+ readFile: jest.fn(),
26
+ unlink: jest.fn(),
27
+ mkdir: jest.fn(),
28
+ rm: jest.fn(),
29
+ appendFile: jest.fn(),
30
+ },
31
+ existsSync: jest.fn(),
32
+ }));
33
+ // Helper function to create mock actor record
34
+ function createMockActorRecord(overrides = {}) {
35
+ return {
36
+ id: 'human:test-user',
37
+ type: 'human',
38
+ displayName: 'Test User',
39
+ publicKey: 'test-public-key',
40
+ roles: ['admin', 'author'],
41
+ status: 'active',
42
+ ...overrides,
43
+ };
44
+ }
45
+ // Helper function to create mock cycle record
46
+ function createMockCycleRecord(overrides = {}) {
47
+ return {
48
+ id: `${Date.now()}-cycle-test-cycle`,
49
+ title: 'Test Cycle',
50
+ status: 'planning',
51
+ taskIds: [],
52
+ childCycleIds: [],
53
+ tags: [],
54
+ notes: '',
55
+ ...overrides,
56
+ };
57
+ }
58
+ // Helper function to create mock task record
59
+ function createMockTaskRecord(overrides = {}) {
60
+ return {
61
+ id: `${Date.now()}-task-test-task`,
62
+ title: 'Test Task',
63
+ status: 'draft',
64
+ priority: 'medium',
65
+ description: 'Test task description',
66
+ tags: [],
67
+ cycleIds: [],
68
+ ...overrides,
69
+ };
70
+ }
71
+ describe('ProjectAdapter', () => {
72
+ let projectAdapter;
73
+ let mockIdentityAdapter;
74
+ let mockBacklogAdapter;
75
+ let mockWorkflowMethodologyAdapter;
76
+ let mockConfigManager;
77
+ let mockTaskStore;
78
+ let mockCycleStore;
79
+ let mockFs;
80
+ let mockCreateTaskRecord;
81
+ let mockCreateCycleRecord;
82
+ beforeEach(() => {
83
+ jest.clearAllMocks();
84
+ // Mock all adapters
85
+ mockIdentityAdapter = {
86
+ createActor: jest.fn(),
87
+ getActor: jest.fn(),
88
+ listActors: jest.fn(),
89
+ revokeActor: jest.fn(),
90
+ createAgentRecord: jest.fn(),
91
+ getAgentRecord: jest.fn(),
92
+ listAgentRecords: jest.fn(),
93
+ getCurrentActor: jest.fn(),
94
+ getEffectiveActorForAgent: jest.fn(),
95
+ };
96
+ mockBacklogAdapter = {
97
+ createTask: jest.fn(),
98
+ createCycle: jest.fn(),
99
+ getTask: jest.fn(),
100
+ getCycle: jest.fn(),
101
+ getAllTasks: jest.fn(),
102
+ getAllCycles: jest.fn(),
103
+ };
104
+ mockWorkflowMethodologyAdapter = {
105
+ getTransitionRule: jest.fn(),
106
+ validateSignature: jest.fn(),
107
+ validateCustomRules: jest.fn(),
108
+ };
109
+ mockConfigManager = {
110
+ loadConfig: jest.fn(),
111
+ loadSession: jest.fn(),
112
+ getRootCycle: jest.fn(),
113
+ getProjectInfo: jest.fn(),
114
+ getActorState: jest.fn(),
115
+ updateActorState: jest.fn(),
116
+ getCloudSessionToken: jest.fn(),
117
+ constructor: { name: 'ConfigManager' },
118
+ };
119
+ // Mock stores
120
+ mockTaskStore = {
121
+ write: jest.fn().mockResolvedValue(undefined),
122
+ read: jest.fn().mockResolvedValue(null),
123
+ list: jest.fn().mockResolvedValue([]),
124
+ delete: jest.fn().mockResolvedValue(undefined),
125
+ exists: jest.fn().mockResolvedValue(false),
126
+ };
127
+ mockCycleStore = {
128
+ write: jest.fn().mockResolvedValue(undefined),
129
+ read: jest.fn().mockResolvedValue(null),
130
+ list: jest.fn().mockResolvedValue([]),
131
+ delete: jest.fn().mockResolvedValue(undefined),
132
+ exists: jest.fn().mockResolvedValue(false),
133
+ };
134
+ mockFs = fs;
135
+ mockFs.existsSync = existsSync;
136
+ // Configure default mock behavior
137
+ mockFs.existsSync.mockReturnValue(true); // Default: .git exists
138
+ // Mock factories
139
+ mockCreateTaskRecord = createTaskRecord;
140
+ mockCreateCycleRecord = createCycleRecord;
141
+ // Setup factory mocks
142
+ mockCreateTaskRecord.mockImplementation(async (payload) => ({
143
+ id: `${Date.now()}-task-${payload.title?.toLowerCase().replace(/\s+/g, '-') || 'test'}`,
144
+ title: payload.title || 'Test Task',
145
+ status: payload.status || 'draft',
146
+ priority: payload.priority || 'medium',
147
+ description: payload.description || '',
148
+ tags: payload.tags || [],
149
+ cycleIds: payload.cycleIds || [],
150
+ }));
151
+ mockCreateCycleRecord.mockImplementation(async (payload) => ({
152
+ id: `${Date.now()}-cycle-${payload.title?.toLowerCase().replace(/\s+/g, '-') || 'test'}`,
153
+ title: payload.title || 'Test Cycle',
154
+ status: payload.status || 'planning',
155
+ taskIds: payload.taskIds || [],
156
+ childCycleIds: payload.childCycleIds || [],
157
+ tags: payload.tags || [],
158
+ notes: payload.notes || '',
159
+ }));
160
+ // Create adapter with all dependencies
161
+ projectAdapter = new ProjectAdapter({
162
+ identityAdapter: mockIdentityAdapter,
163
+ backlogAdapter: mockBacklogAdapter,
164
+ workflowMethodologyAdapter: mockWorkflowMethodologyAdapter,
165
+ configManager: mockConfigManager,
166
+ taskStore: mockTaskStore,
167
+ cycleStore: mockCycleStore,
168
+ });
169
+ });
170
+ describe('Environment Validation (EARS 2, 7, 8)', () => {
171
+ it('[EARS-21] should validate current directory, not search upward for init', async () => {
172
+ // This test prevents the critical bug where init modifies parent repositories
173
+ // Simulate being in /packages/cli/ but wanting to init there, not in parent /solo-hub/
174
+ // Mock: no .git in current directory (should fail validation)
175
+ mockFs.existsSync.mockImplementation((path) => {
176
+ if (typeof path === 'string' && path.includes('/packages/cli/.git')) {
177
+ return false; // No .git in subdirectory
178
+ }
179
+ if (typeof path === 'string' && path.includes('/solo-hub/.git')) {
180
+ return true; // .git exists in parent (should NOT be found)
181
+ }
182
+ return false;
183
+ });
184
+ // Mock: no write permissions in current directory
185
+ mockFs.writeFile.mockRejectedValueOnce(new Error('Permission denied'));
186
+ mockFs.access.mockRejectedValue(new Error('Directory does not exist')); // .gitgov doesn't exist
187
+ const result = await projectAdapter.validateEnvironment('/test/project/packages/cli');
188
+ // Should validate the EXACT directory passed, not search upward
189
+ expect(result.isValid).toBe(false);
190
+ expect(result.isGitRepo).toBe(false); // Should be false for /packages/cli/
191
+ expect(result.warnings).toContain('Not a Git repository in directory: /test/project/packages/cli');
192
+ });
193
+ it('[EARS-22] should use GITGOV_ORIGINAL_DIR when provided (pnpm --filter case)', async () => {
194
+ // This test ensures pnpm --filter cli dev init validates the correct directory
195
+ // Mock environment variables as they would be set by our wrapper
196
+ const originalEnv = process.env['GITGOV_ORIGINAL_DIR'];
197
+ process.env['GITGOV_ORIGINAL_DIR'] = '/test/project'; // User executed from root
198
+ try {
199
+ // Mock: .git exists in original directory
200
+ mockFs.existsSync.mockImplementation((path) => {
201
+ if (typeof path === 'string' && path.includes('/test/project/.git')) {
202
+ return true; // .git exists in original directory
203
+ }
204
+ return false;
205
+ });
206
+ // Mock: .gitgov already exists in original directory
207
+ mockFs.writeFile.mockResolvedValueOnce(undefined);
208
+ mockFs.unlink.mockResolvedValueOnce(undefined);
209
+ mockFs.access.mockResolvedValueOnce(undefined); // .gitgov exists
210
+ const result = await projectAdapter.validateEnvironment(); // No path = use env var
211
+ expect(result.isValid).toBe(false);
212
+ expect(result.isGitRepo).toBe(true);
213
+ expect(result.isAlreadyInitialized).toBe(true);
214
+ expect(result.warnings).toContain('GitGovernance already initialized in directory: /test/project');
215
+ }
216
+ finally {
217
+ // Restore original environment
218
+ if (originalEnv) {
219
+ process.env['GITGOV_ORIGINAL_DIR'] = originalEnv;
220
+ }
221
+ else {
222
+ delete process.env['GITGOV_ORIGINAL_DIR'];
223
+ }
224
+ }
225
+ });
226
+ it('[EARS-23] should create .gitgov in correct directory during init', async () => {
227
+ // This test ensures init creates .gitgov in the target directory, not in parent repos
228
+ const targetDirectory = '/tmp/new-project';
229
+ const originalEnv = process.env['GITGOV_ORIGINAL_DIR'];
230
+ process.env['GITGOV_ORIGINAL_DIR'] = targetDirectory;
231
+ try {
232
+ // Mock: .git exists in target directory
233
+ mockFs.existsSync.mockImplementation((path) => {
234
+ if (typeof path === 'string' && path.includes(`${targetDirectory}/.git`)) {
235
+ return true;
236
+ }
237
+ return false;
238
+ });
239
+ // Mock successful initialization
240
+ mockFs.writeFile.mockResolvedValue(undefined);
241
+ mockFs.unlink.mockResolvedValue(undefined);
242
+ mockFs.access.mockRejectedValue(new Error('Directory does not exist')); // .gitgov doesn't exist
243
+ mockFs.mkdir.mockResolvedValue(undefined);
244
+ mockFs.appendFile.mockResolvedValue(undefined);
245
+ const mockActor = createMockActorRecord();
246
+ const mockCycle = createMockCycleRecord();
247
+ mockIdentityAdapter.createActor.mockResolvedValueOnce(mockActor);
248
+ mockBacklogAdapter.createCycle.mockResolvedValueOnce(mockCycle);
249
+ const result = await projectAdapter.initializeProject({
250
+ name: 'New Project',
251
+ actorName: 'New User',
252
+ });
253
+ expect(result.success).toBe(true);
254
+ // Verify .gitgov directory creation was attempted in correct location
255
+ expect(mockFs.mkdir).toHaveBeenCalledWith(expect.stringContaining(targetDirectory), { recursive: true });
256
+ // Verify config.json was written to correct location
257
+ const configWriteCalls = mockFs.writeFile.mock.calls.filter(call => call[0].toString().includes('config.json'));
258
+ expect(configWriteCalls.length).toBeGreaterThan(0);
259
+ expect(configWriteCalls[0]?.[0]).toContain(targetDirectory);
260
+ }
261
+ finally {
262
+ // Restore original environment
263
+ if (originalEnv) {
264
+ process.env['GITGOV_ORIGINAL_DIR'] = originalEnv;
265
+ }
266
+ else {
267
+ delete process.env['GITGOV_ORIGINAL_DIR'];
268
+ }
269
+ }
270
+ });
271
+ it('[EARS-2] should verify git repo permissions and previous state', async () => {
272
+ // Mock successful validation using static method
273
+ jest.spyOn(ConfigManager, 'findProjectRoot').mockReturnValue('/test/project');
274
+ mockFs.writeFile.mockResolvedValueOnce(undefined);
275
+ mockFs.unlink.mockResolvedValueOnce(undefined);
276
+ mockFs.access.mockRejectedValueOnce(new Error('Directory does not exist'));
277
+ const result = await projectAdapter.validateEnvironment('/test/project');
278
+ expect(result.isValid).toBe(true);
279
+ expect(result.isGitRepo).toBe(true);
280
+ expect(result.hasWritePermissions).toBe(true);
281
+ expect(result.isAlreadyInitialized).toBe(false);
282
+ expect(result.warnings).toHaveLength(0);
283
+ });
284
+ it('[EARS-7] should return EnvironmentValidation with specific warnings', async () => {
285
+ // Mock ConfigManager static method for this test
286
+ jest.spyOn(ConfigManager, 'findProjectRoot').mockReturnValue(null);
287
+ // Mock failed validation - no write permissions and no .git
288
+ mockFs.writeFile.mockRejectedValueOnce(new Error('Permission denied'));
289
+ mockFs.access.mockRejectedValue(new Error('Directory does not exist')); // .gitgov doesn't exist
290
+ mockFs.existsSync.mockReturnValue(false); // No .git directory
291
+ const result = await projectAdapter.validateEnvironment('/invalid/path');
292
+ expect(result.isValid).toBe(false);
293
+ expect(result.isGitRepo).toBe(false); // Should be false since findProjectRoot returns null
294
+ expect(result.hasWritePermissions).toBe(false);
295
+ expect(result.warnings).toContain('Not a Git repository in directory: /invalid/path');
296
+ expect(result.warnings).toContain('No write permissions in target directory');
297
+ expect(result.suggestions).toContain("Run 'git init' to initialize a Git repository first");
298
+ });
299
+ it('[EARS-8] should detect already initialized GitGovernance project', async () => {
300
+ // Mock already initialized project
301
+ jest.spyOn(ConfigManager, 'findProjectRoot').mockReturnValue('/test/project');
302
+ mockFs.writeFile.mockResolvedValueOnce(undefined);
303
+ mockFs.unlink.mockResolvedValueOnce(undefined);
304
+ mockFs.access.mockResolvedValueOnce(undefined); // .gitgov exists
305
+ const result = await projectAdapter.validateEnvironment('/test/project');
306
+ expect(result.isValid).toBe(false);
307
+ expect(result.isAlreadyInitialized).toBe(true);
308
+ expect(result.warnings).toContain('GitGovernance already initialized in directory: /test/project');
309
+ expect(result.suggestions).toContain("Use 'gitgov status' to check current state or choose a different directory");
310
+ });
311
+ });
312
+ describe('Project Initialization (EARS 1, 5)', () => {
313
+ beforeEach(() => {
314
+ // Setup successful mocks
315
+ jest.spyOn(ConfigManager, 'findProjectRoot').mockReturnValue('/test/project');
316
+ mockFs.writeFile.mockResolvedValue(undefined);
317
+ mockFs.unlink.mockResolvedValue(undefined);
318
+ mockFs.access.mockRejectedValue(new Error('Directory does not exist')); // .gitgov doesn't exist
319
+ mockFs.mkdir.mockResolvedValue(undefined);
320
+ mockFs.appendFile.mockResolvedValue(undefined);
321
+ });
322
+ it('[EARS-1] should create complete project with 3-adapter orchestration', async () => {
323
+ const mockActor = createMockActorRecord();
324
+ const mockCycle = createMockCycleRecord();
325
+ mockIdentityAdapter.createActor.mockResolvedValueOnce(mockActor);
326
+ mockBacklogAdapter.createCycle.mockResolvedValueOnce(mockCycle);
327
+ const result = await projectAdapter.initializeProject({
328
+ name: 'Test Project',
329
+ actorName: 'Test User',
330
+ });
331
+ expect(result.success).toBe(true);
332
+ expect(result.projectName).toBe('Test Project');
333
+ expect(result.rootCycle).toBe(mockCycle.id);
334
+ expect(result.actor.id).toBe(mockActor.id);
335
+ expect(result.actor.displayName).toBe(mockActor.displayName);
336
+ expect(mockIdentityAdapter.createActor).toHaveBeenCalledWith({
337
+ type: 'human',
338
+ displayName: 'Test User',
339
+ roles: ['admin', 'author'],
340
+ }, 'bootstrap');
341
+ expect(mockBacklogAdapter.createCycle).toHaveBeenCalledWith(expect.objectContaining({
342
+ title: 'root',
343
+ status: 'planning',
344
+ }), mockActor.id);
345
+ });
346
+ it('[EARS-5] should return ProjectInitResult with complete metadata', async () => {
347
+ const mockActor = createMockActorRecord();
348
+ const mockCycle = createMockCycleRecord();
349
+ mockIdentityAdapter.createActor.mockResolvedValueOnce(mockActor);
350
+ mockBacklogAdapter.createCycle.mockResolvedValueOnce(mockCycle);
351
+ const result = await projectAdapter.initializeProject({
352
+ name: 'Test Project',
353
+ actorName: 'Test User',
354
+ methodology: 'scrum',
355
+ });
356
+ expect(result).toEqual({
357
+ success: true,
358
+ projectId: 'test-project',
359
+ projectName: 'Test Project',
360
+ rootCycle: mockCycle.id,
361
+ actor: {
362
+ id: mockActor.id,
363
+ displayName: mockActor.displayName,
364
+ publicKeyPath: expect.stringContaining(`${mockActor.id}.json`),
365
+ },
366
+ template: undefined,
367
+ initializationTime: expect.any(Number),
368
+ nextSteps: expect.arrayContaining([
369
+ "Run 'gitgov status' to see your project overview",
370
+ "Use 'gitgov task create' to add your first task"
371
+ ]),
372
+ });
373
+ });
374
+ });
375
+ describe('Template Processing (EARS 3, 6)', () => {
376
+ beforeEach(() => {
377
+ const mockTemplate = {
378
+ cycles: [
379
+ {
380
+ title: 'Sprint 1',
381
+ status: 'active',
382
+ tasks: [
383
+ { title: 'Task 1', priority: 'high', description: 'Test task 1' },
384
+ { title: 'Task 2', priority: 'medium', description: 'Test task 2' },
385
+ ],
386
+ },
387
+ ],
388
+ };
389
+ mockFs.readFile.mockResolvedValue(JSON.stringify(mockTemplate));
390
+ });
391
+ it('[EARS-3] should create cycles and tasks using factories with validation', async () => {
392
+ const mockCycle = createMockCycleRecord();
393
+ const mockTask1 = createMockTaskRecord({ title: 'Task 1' });
394
+ const mockTask2 = createMockTaskRecord({ title: 'Task 2' });
395
+ mockBacklogAdapter.createCycle.mockResolvedValueOnce(mockCycle);
396
+ mockBacklogAdapter.createTask
397
+ .mockResolvedValueOnce(mockTask1)
398
+ .mockResolvedValueOnce(mockTask2);
399
+ const projectContext = {
400
+ projectId: 'test-project',
401
+ projectName: 'Test Project',
402
+ actorId: 'human:test-user',
403
+ rootCycle: 'cycle-123',
404
+ };
405
+ const result = await projectAdapter.processBlueprintTemplate('./template.json', projectContext);
406
+ expect(result.success).toBe(true);
407
+ expect(result.cyclesCreated).toBe(1);
408
+ expect(result.tasksCreated).toBe(2);
409
+ expect(result.createdIds.cycles).toContain(mockCycle.id);
410
+ expect(result.createdIds.tasks).toContain(mockTask1.id);
411
+ expect(result.createdIds.tasks).toContain(mockTask2.id);
412
+ expect(mockBacklogAdapter.createCycle).toHaveBeenCalledWith(expect.objectContaining({
413
+ title: 'Sprint 1',
414
+ status: 'active',
415
+ }), projectContext.actorId);
416
+ });
417
+ it('[EARS-6] should throw DetailedValidationError for invalid template', async () => {
418
+ mockFs.readFile.mockResolvedValue(JSON.stringify({ invalid: 'template' }));
419
+ const projectContext = {
420
+ projectId: 'test-project',
421
+ projectName: 'Test Project',
422
+ actorId: 'human:test-user',
423
+ rootCycle: 'cycle-123',
424
+ };
425
+ await expect(projectAdapter.processBlueprintTemplate('./invalid-template.json', projectContext)).rejects.toThrow(DetailedValidationError);
426
+ await expect(projectAdapter.processBlueprintTemplate('./invalid-template.json', projectContext)).rejects.toThrow('Invalid template format');
427
+ });
428
+ });
429
+ describe('Error Handling & Rollback (EARS 4, 13, 15, 16, 17)', () => {
430
+ it('[EARS-4] should invoke rollback automatically when initialization fails', async () => {
431
+ // Mock ConfigManager static method for this test
432
+ jest.spyOn(ConfigManager, 'findProjectRoot').mockReturnValue('/test/project');
433
+ // Setup environment validation to pass
434
+ mockFs.writeFile.mockResolvedValue(undefined);
435
+ mockFs.unlink.mockResolvedValue(undefined);
436
+ mockFs.access.mockRejectedValueOnce(new Error('Directory does not exist')); // .gitgov doesn't exist (validation)
437
+ mockFs.mkdir.mockResolvedValue(undefined);
438
+ // Setup identity creation to fail
439
+ mockIdentityAdapter.createActor.mockRejectedValueOnce(new Error('Identity creation failed'));
440
+ // Setup rollback mocks
441
+ mockFs.access.mockResolvedValueOnce(undefined); // .gitgov exists for rollback
442
+ mockFs.rm.mockResolvedValue(undefined);
443
+ await expect(projectAdapter.initializeProject({
444
+ name: 'Test Project',
445
+ actorName: 'Test User',
446
+ })).rejects.toThrow('Identity creation failed');
447
+ // Verify rollback was called
448
+ expect(mockFs.rm).toHaveBeenCalledWith(expect.stringContaining('.gitgov'), { recursive: true, force: true });
449
+ });
450
+ it('[EARS-13] should capture adapter errors with specific context', async () => {
451
+ jest.spyOn(ConfigManager, 'findProjectRoot').mockReturnValue('/test/project');
452
+ mockFs.writeFile.mockResolvedValue(undefined);
453
+ mockFs.unlink.mockResolvedValue(undefined);
454
+ mockFs.access.mockRejectedValue(new Error('Directory does not exist'));
455
+ mockFs.mkdir.mockResolvedValue(undefined);
456
+ const specificError = new Error('BacklogAdapter connection failed');
457
+ mockIdentityAdapter.createActor.mockResolvedValueOnce(createMockActorRecord());
458
+ mockBacklogAdapter.createCycle.mockRejectedValueOnce(specificError);
459
+ await expect(projectAdapter.initializeProject({
460
+ name: 'Test Project',
461
+ actorName: 'Test User',
462
+ })).rejects.toThrow('BacklogAdapter connection failed');
463
+ });
464
+ it('[EARS-15] should provide specific guidance for environment errors', async () => {
465
+ // Mock ConfigManager static method for this test
466
+ jest.spyOn(ConfigManager, 'findProjectRoot').mockReturnValue(null);
467
+ mockFs.writeFile.mockRejectedValueOnce(new Error('Permission denied'));
468
+ mockFs.existsSync.mockReturnValue(false); // No .git directory
469
+ const result = await projectAdapter.validateEnvironment('/invalid/path');
470
+ expect(result.isValid).toBe(false);
471
+ expect(result.suggestions).toContain("Run 'git init' to initialize a Git repository first");
472
+ expect(result.suggestions).toContain('Ensure you have write permissions in the target directory');
473
+ });
474
+ it('[EARS-16] should provide field-level errors for DetailedValidationError', async () => {
475
+ mockFs.readFile.mockResolvedValue('invalid json');
476
+ const projectContext = {
477
+ projectId: 'test-project',
478
+ projectName: 'Test Project',
479
+ actorId: 'human:test-user',
480
+ rootCycle: 'cycle-123',
481
+ };
482
+ await expect(projectAdapter.processBlueprintTemplate('./invalid.json', projectContext)).rejects.toThrow(DetailedValidationError);
483
+ try {
484
+ await projectAdapter.processBlueprintTemplate('./invalid.json', projectContext);
485
+ }
486
+ catch (error) {
487
+ expect(error).toBeInstanceOf(DetailedValidationError);
488
+ if (error instanceof DetailedValidationError) {
489
+ expect(error.ajvErrors).toBeDefined();
490
+ expect(error.ajvErrors[0]).toEqual({
491
+ field: 'template',
492
+ message: expect.any(String),
493
+ value: './invalid.json',
494
+ });
495
+ }
496
+ }
497
+ });
498
+ it('[EARS-17] should handle file system errors gracefully', async () => {
499
+ // Mock ConfigManager static method for this test
500
+ jest.spyOn(ConfigManager, 'findProjectRoot').mockReturnValue('/test/project');
501
+ // Mock file system error during permission check
502
+ mockFs.writeFile.mockRejectedValueOnce(new Error('Disk full'));
503
+ mockFs.access.mockRejectedValue(new Error('Directory does not exist')); // .gitgov doesn't exist
504
+ mockFs.existsSync.mockReturnValue(true); // .git exists but other errors
505
+ const result = await projectAdapter.validateEnvironment('/test/path');
506
+ expect(result.isValid).toBe(false);
507
+ expect(result.warnings).toContain('No write permissions in target directory');
508
+ expect(result.suggestions).toContain('Ensure you have write permissions in the target directory');
509
+ });
510
+ });
511
+ describe('Graceful Degradation (EARS 14)', () => {
512
+ it('[EARS-14] should continue without optional dependencies with warnings', async () => {
513
+ // Create adapter without optional dependencies
514
+ const minimalAdapter = new ProjectAdapter({
515
+ identityAdapter: mockIdentityAdapter,
516
+ backlogAdapter: mockBacklogAdapter,
517
+ workflowMethodologyAdapter: mockWorkflowMethodologyAdapter,
518
+ configManager: mockConfigManager,
519
+ taskStore: mockTaskStore,
520
+ cycleStore: mockCycleStore,
521
+ // No eventBus, platformApi, or userManagement
522
+ });
523
+ jest.spyOn(ConfigManager, 'findProjectRoot').mockReturnValue('/test/project');
524
+ mockFs.writeFile.mockResolvedValue(undefined);
525
+ mockFs.unlink.mockResolvedValue(undefined);
526
+ mockFs.access.mockRejectedValue(new Error('Directory does not exist'));
527
+ mockFs.mkdir.mockResolvedValue(undefined);
528
+ mockFs.appendFile.mockResolvedValue(undefined);
529
+ const mockActor = createMockActorRecord();
530
+ const mockCycle = createMockCycleRecord();
531
+ mockIdentityAdapter.createActor.mockResolvedValueOnce(mockActor);
532
+ mockBacklogAdapter.createCycle.mockResolvedValueOnce(mockCycle);
533
+ const result = await minimalAdapter.initializeProject({
534
+ name: 'Test Project',
535
+ actorName: 'Test User',
536
+ });
537
+ expect(result.success).toBe(true);
538
+ expect(result.projectName).toBe('Test Project');
539
+ // Should work without optional dependencies
540
+ });
541
+ });
542
+ describe('Future Platform Methods (EARS 19, 20)', () => {
543
+ it('[EARS-19] should return project metadata from ConfigManager', async () => {
544
+ const mockConfig = {
545
+ protocolVersion: '1.0.0',
546
+ projectId: 'test-project',
547
+ projectName: 'Test Project',
548
+ rootCycle: 'cycle-123',
549
+ blueprints: { root: './blueprints' },
550
+ state: { branch: 'gitgov-state' },
551
+ };
552
+ mockConfigManager.loadConfig.mockResolvedValueOnce(mockConfig);
553
+ const result = await projectAdapter.getProjectInfo();
554
+ expect(result).toEqual({
555
+ id: 'test-project',
556
+ name: 'Test Project',
557
+ rootCycle: 'cycle-123',
558
+ protocolVersion: '1.0.0',
559
+ });
560
+ });
561
+ it('[EARS-20] should handle missing configuration gracefully', async () => {
562
+ mockConfigManager.loadConfig.mockResolvedValueOnce(null);
563
+ const result = await projectAdapter.getProjectInfo();
564
+ expect(result).toBeNull();
565
+ });
566
+ });
567
+ describe('Type Safety (EARS 18)', () => {
568
+ it('[EARS-18] should compile without any or unknown types unjustified', () => {
569
+ // This test ensures TypeScript compilation is clean
570
+ // The fact that this test file compiles without errors validates EARS-18
571
+ expect(true).toBe(true);
572
+ });
573
+ });
574
+ describe('Integration Tests', () => {
575
+ it('should work end-to-end with real-like data', async () => {
576
+ // Setup complete successful scenario
577
+ jest.spyOn(ConfigManager, 'findProjectRoot').mockReturnValue('/test/project');
578
+ mockFs.writeFile.mockResolvedValue(undefined);
579
+ mockFs.unlink.mockResolvedValue(undefined);
580
+ mockFs.access.mockRejectedValue(new Error('Directory does not exist'));
581
+ mockFs.mkdir.mockResolvedValue(undefined);
582
+ mockFs.appendFile.mockResolvedValue(undefined);
583
+ const mockActor = createMockActorRecord({
584
+ id: 'human:project-owner',
585
+ displayName: 'Project Owner',
586
+ });
587
+ const mockCycle = createMockCycleRecord({
588
+ id: 'cycle-root-project',
589
+ title: 'My Awesome Project - Root Cycle',
590
+ });
591
+ mockIdentityAdapter.createActor.mockResolvedValueOnce(mockActor);
592
+ mockBacklogAdapter.createCycle.mockResolvedValueOnce(mockCycle);
593
+ const envValidation = await projectAdapter.validateEnvironment();
594
+ expect(envValidation.isValid).toBe(true);
595
+ const initResult = await projectAdapter.initializeProject({
596
+ name: 'My Awesome Project',
597
+ actorName: 'Project Owner',
598
+ methodology: 'scrum',
599
+ });
600
+ expect(initResult.success).toBe(true);
601
+ expect(initResult.projectName).toBe('My Awesome Project');
602
+ expect(initResult.actor.displayName).toBe('Project Owner');
603
+ expect(initResult.initializationTime).toBeGreaterThanOrEqual(0);
604
+ });
605
+ });
606
+ describe('Performance Tests', () => {
607
+ it('should complete initialization in reasonable time', async () => {
608
+ jest.spyOn(ConfigManager, 'findProjectRoot').mockReturnValue('/test/project');
609
+ mockFs.writeFile.mockResolvedValue(undefined);
610
+ mockFs.unlink.mockResolvedValue(undefined);
611
+ mockFs.access.mockRejectedValue(new Error('Directory does not exist'));
612
+ mockFs.mkdir.mockResolvedValue(undefined);
613
+ mockFs.appendFile.mockResolvedValue(undefined);
614
+ mockIdentityAdapter.createActor.mockResolvedValueOnce(createMockActorRecord());
615
+ mockBacklogAdapter.createCycle.mockResolvedValueOnce(createMockCycleRecord());
616
+ const startTime = Date.now();
617
+ await projectAdapter.initializeProject({
618
+ name: 'Performance Test Project',
619
+ actorName: 'Test User',
620
+ });
621
+ const endTime = Date.now();
622
+ // Should complete within reasonable time (mocked, so should be very fast)
623
+ expect(endTime - startTime).toBeLessThan(1000);
624
+ });
625
+ });
626
+ });
627
+ //# sourceMappingURL=project_adapter.test.js.map