popeye-cli 1.10.0 → 2.1.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 (326) hide show
  1. package/CHANGELOG.md +114 -0
  2. package/CONTRIBUTING.md +38 -3
  3. package/README.md +104 -18
  4. package/dist/adapters/gemini.js +3 -3
  5. package/dist/adapters/openai.js +2 -2
  6. package/dist/adapters/openai.js.map +1 -1
  7. package/dist/auth/gemini.js +1 -1
  8. package/dist/cli/commands/create.d.ts.map +1 -1
  9. package/dist/cli/commands/create.js +11 -5
  10. package/dist/cli/commands/create.js.map +1 -1
  11. package/dist/cli/commands/resume.d.ts.map +1 -1
  12. package/dist/cli/commands/resume.js +9 -1
  13. package/dist/cli/commands/resume.js.map +1 -1
  14. package/dist/cli/interactive.d.ts.map +1 -1
  15. package/dist/cli/interactive.js +29 -3
  16. package/dist/cli/interactive.js.map +1 -1
  17. package/dist/config/defaults.d.ts.map +1 -1
  18. package/dist/config/defaults.js +7 -2
  19. package/dist/config/defaults.js.map +1 -1
  20. package/dist/config/index.d.ts +1 -7
  21. package/dist/config/index.d.ts.map +1 -1
  22. package/dist/config/popeye-md.d.ts +32 -0
  23. package/dist/config/popeye-md.d.ts.map +1 -0
  24. package/dist/config/popeye-md.js +111 -0
  25. package/dist/config/popeye-md.js.map +1 -0
  26. package/dist/config/schema.d.ts +3 -21
  27. package/dist/config/schema.d.ts.map +1 -1
  28. package/dist/config/schema.js +21 -8
  29. package/dist/config/schema.js.map +1 -1
  30. package/dist/pipeline/artifact-manager.d.ts +47 -0
  31. package/dist/pipeline/artifact-manager.d.ts.map +1 -0
  32. package/dist/pipeline/artifact-manager.js +251 -0
  33. package/dist/pipeline/artifact-manager.js.map +1 -0
  34. package/dist/pipeline/artifact-validators.d.ts +29 -0
  35. package/dist/pipeline/artifact-validators.d.ts.map +1 -0
  36. package/dist/pipeline/artifact-validators.js +173 -0
  37. package/dist/pipeline/artifact-validators.js.map +1 -0
  38. package/dist/pipeline/bridges/review-bridge.d.ts +70 -0
  39. package/dist/pipeline/bridges/review-bridge.d.ts.map +1 -0
  40. package/dist/pipeline/bridges/review-bridge.js +266 -0
  41. package/dist/pipeline/bridges/review-bridge.js.map +1 -0
  42. package/dist/pipeline/change-request.d.ts +47 -0
  43. package/dist/pipeline/change-request.d.ts.map +1 -0
  44. package/dist/pipeline/change-request.js +91 -0
  45. package/dist/pipeline/change-request.js.map +1 -0
  46. package/dist/pipeline/check-runner.d.ts +47 -0
  47. package/dist/pipeline/check-runner.d.ts.map +1 -0
  48. package/dist/pipeline/check-runner.js +417 -0
  49. package/dist/pipeline/check-runner.js.map +1 -0
  50. package/dist/pipeline/command-resolver.d.ts +9 -0
  51. package/dist/pipeline/command-resolver.d.ts.map +1 -0
  52. package/dist/pipeline/command-resolver.js +140 -0
  53. package/dist/pipeline/command-resolver.js.map +1 -0
  54. package/dist/pipeline/consensus/consensus-runner.d.ts +44 -0
  55. package/dist/pipeline/consensus/consensus-runner.d.ts.map +1 -0
  56. package/dist/pipeline/consensus/consensus-runner.js +212 -0
  57. package/dist/pipeline/consensus/consensus-runner.js.map +1 -0
  58. package/dist/pipeline/constitution.d.ts +45 -0
  59. package/dist/pipeline/constitution.d.ts.map +1 -0
  60. package/dist/pipeline/constitution.js +82 -0
  61. package/dist/pipeline/constitution.js.map +1 -0
  62. package/dist/pipeline/gate-engine.d.ts +55 -0
  63. package/dist/pipeline/gate-engine.d.ts.map +1 -0
  64. package/dist/pipeline/gate-engine.js +270 -0
  65. package/dist/pipeline/gate-engine.js.map +1 -0
  66. package/dist/pipeline/index.d.ts +26 -0
  67. package/dist/pipeline/index.d.ts.map +1 -0
  68. package/dist/pipeline/index.js +35 -0
  69. package/dist/pipeline/index.js.map +1 -0
  70. package/dist/pipeline/migration.d.ts +15 -0
  71. package/dist/pipeline/migration.d.ts.map +1 -0
  72. package/dist/pipeline/migration.js +76 -0
  73. package/dist/pipeline/migration.js.map +1 -0
  74. package/dist/pipeline/orchestrator.d.ts +30 -0
  75. package/dist/pipeline/orchestrator.d.ts.map +1 -0
  76. package/dist/pipeline/orchestrator.js +242 -0
  77. package/dist/pipeline/orchestrator.js.map +1 -0
  78. package/dist/pipeline/packets/audit-report-builder.d.ts +11 -0
  79. package/dist/pipeline/packets/audit-report-builder.d.ts.map +1 -0
  80. package/dist/pipeline/packets/audit-report-builder.js +32 -0
  81. package/dist/pipeline/packets/audit-report-builder.js.map +1 -0
  82. package/dist/pipeline/packets/consensus-packet-builder.d.ts +35 -0
  83. package/dist/pipeline/packets/consensus-packet-builder.d.ts.map +1 -0
  84. package/dist/pipeline/packets/consensus-packet-builder.js +80 -0
  85. package/dist/pipeline/packets/consensus-packet-builder.js.map +1 -0
  86. package/dist/pipeline/packets/index.d.ts +12 -0
  87. package/dist/pipeline/packets/index.d.ts.map +1 -0
  88. package/dist/pipeline/packets/index.js +8 -0
  89. package/dist/pipeline/packets/index.js.map +1 -0
  90. package/dist/pipeline/packets/plan-packet-builder.d.ts +21 -0
  91. package/dist/pipeline/packets/plan-packet-builder.d.ts.map +1 -0
  92. package/dist/pipeline/packets/plan-packet-builder.js +27 -0
  93. package/dist/pipeline/packets/plan-packet-builder.js.map +1 -0
  94. package/dist/pipeline/packets/rca-packet-builder.d.ts +19 -0
  95. package/dist/pipeline/packets/rca-packet-builder.d.ts.map +1 -0
  96. package/dist/pipeline/packets/rca-packet-builder.js +22 -0
  97. package/dist/pipeline/packets/rca-packet-builder.js.map +1 -0
  98. package/dist/pipeline/phases/architecture.d.ts +7 -0
  99. package/dist/pipeline/phases/architecture.d.ts.map +1 -0
  100. package/dist/pipeline/phases/architecture.js +60 -0
  101. package/dist/pipeline/phases/architecture.js.map +1 -0
  102. package/dist/pipeline/phases/audit.d.ts +8 -0
  103. package/dist/pipeline/phases/audit.d.ts.map +1 -0
  104. package/dist/pipeline/phases/audit.js +144 -0
  105. package/dist/pipeline/phases/audit.js.map +1 -0
  106. package/dist/pipeline/phases/consensus-architecture.d.ts +7 -0
  107. package/dist/pipeline/phases/consensus-architecture.d.ts.map +1 -0
  108. package/dist/pipeline/phases/consensus-architecture.js +84 -0
  109. package/dist/pipeline/phases/consensus-architecture.js.map +1 -0
  110. package/dist/pipeline/phases/consensus-master-plan.d.ts +7 -0
  111. package/dist/pipeline/phases/consensus-master-plan.d.ts.map +1 -0
  112. package/dist/pipeline/phases/consensus-master-plan.js +81 -0
  113. package/dist/pipeline/phases/consensus-master-plan.js.map +1 -0
  114. package/dist/pipeline/phases/consensus-role-plans.d.ts +7 -0
  115. package/dist/pipeline/phases/consensus-role-plans.d.ts.map +1 -0
  116. package/dist/pipeline/phases/consensus-role-plans.js +85 -0
  117. package/dist/pipeline/phases/consensus-role-plans.js.map +1 -0
  118. package/dist/pipeline/phases/done.d.ts +7 -0
  119. package/dist/pipeline/phases/done.d.ts.map +1 -0
  120. package/dist/pipeline/phases/done.js +45 -0
  121. package/dist/pipeline/phases/done.js.map +1 -0
  122. package/dist/pipeline/phases/implementation.d.ts +8 -0
  123. package/dist/pipeline/phases/implementation.d.ts.map +1 -0
  124. package/dist/pipeline/phases/implementation.js +45 -0
  125. package/dist/pipeline/phases/implementation.js.map +1 -0
  126. package/dist/pipeline/phases/index.d.ts +20 -0
  127. package/dist/pipeline/phases/index.d.ts.map +1 -0
  128. package/dist/pipeline/phases/index.js +19 -0
  129. package/dist/pipeline/phases/index.js.map +1 -0
  130. package/dist/pipeline/phases/intake.d.ts +8 -0
  131. package/dist/pipeline/phases/intake.d.ts.map +1 -0
  132. package/dist/pipeline/phases/intake.js +49 -0
  133. package/dist/pipeline/phases/intake.js.map +1 -0
  134. package/dist/pipeline/phases/phase-context.d.ts +30 -0
  135. package/dist/pipeline/phases/phase-context.d.ts.map +1 -0
  136. package/dist/pipeline/phases/phase-context.js +33 -0
  137. package/dist/pipeline/phases/phase-context.js.map +1 -0
  138. package/dist/pipeline/phases/production-gate.d.ts +8 -0
  139. package/dist/pipeline/phases/production-gate.d.ts.map +1 -0
  140. package/dist/pipeline/phases/production-gate.js +84 -0
  141. package/dist/pipeline/phases/production-gate.js.map +1 -0
  142. package/dist/pipeline/phases/qa-validation.d.ts +7 -0
  143. package/dist/pipeline/phases/qa-validation.d.ts.map +1 -0
  144. package/dist/pipeline/phases/qa-validation.js +50 -0
  145. package/dist/pipeline/phases/qa-validation.js.map +1 -0
  146. package/dist/pipeline/phases/recovery-loop.d.ts +7 -0
  147. package/dist/pipeline/phases/recovery-loop.d.ts.map +1 -0
  148. package/dist/pipeline/phases/recovery-loop.js +93 -0
  149. package/dist/pipeline/phases/recovery-loop.js.map +1 -0
  150. package/dist/pipeline/phases/review.d.ts +8 -0
  151. package/dist/pipeline/phases/review.d.ts.map +1 -0
  152. package/dist/pipeline/phases/review.js +127 -0
  153. package/dist/pipeline/phases/review.js.map +1 -0
  154. package/dist/pipeline/phases/role-planning.d.ts +7 -0
  155. package/dist/pipeline/phases/role-planning.d.ts.map +1 -0
  156. package/dist/pipeline/phases/role-planning.js +75 -0
  157. package/dist/pipeline/phases/role-planning.js.map +1 -0
  158. package/dist/pipeline/phases/stuck.d.ts +7 -0
  159. package/dist/pipeline/phases/stuck.d.ts.map +1 -0
  160. package/dist/pipeline/phases/stuck.js +51 -0
  161. package/dist/pipeline/phases/stuck.js.map +1 -0
  162. package/dist/pipeline/repo-snapshot.d.ts +24 -0
  163. package/dist/pipeline/repo-snapshot.d.ts.map +1 -0
  164. package/dist/pipeline/repo-snapshot.js +343 -0
  165. package/dist/pipeline/repo-snapshot.js.map +1 -0
  166. package/dist/pipeline/role-execution-adapter.d.ts +59 -0
  167. package/dist/pipeline/role-execution-adapter.d.ts.map +1 -0
  168. package/dist/pipeline/role-execution-adapter.js +159 -0
  169. package/dist/pipeline/role-execution-adapter.js.map +1 -0
  170. package/dist/pipeline/skill-loader.d.ts +34 -0
  171. package/dist/pipeline/skill-loader.d.ts.map +1 -0
  172. package/dist/pipeline/skill-loader.js +156 -0
  173. package/dist/pipeline/skill-loader.js.map +1 -0
  174. package/dist/pipeline/skills/defaults.d.ts +16 -0
  175. package/dist/pipeline/skills/defaults.d.ts.map +1 -0
  176. package/dist/pipeline/skills/defaults.js +189 -0
  177. package/dist/pipeline/skills/defaults.js.map +1 -0
  178. package/dist/pipeline/type-defs/artifacts.d.ts +207 -0
  179. package/dist/pipeline/type-defs/artifacts.d.ts.map +1 -0
  180. package/dist/pipeline/type-defs/artifacts.js +67 -0
  181. package/dist/pipeline/type-defs/artifacts.js.map +1 -0
  182. package/dist/pipeline/type-defs/audit.d.ts +259 -0
  183. package/dist/pipeline/type-defs/audit.d.ts.map +1 -0
  184. package/dist/pipeline/type-defs/audit.js +54 -0
  185. package/dist/pipeline/type-defs/audit.js.map +1 -0
  186. package/dist/pipeline/type-defs/checks.d.ts +82 -0
  187. package/dist/pipeline/type-defs/checks.d.ts.map +1 -0
  188. package/dist/pipeline/type-defs/checks.js +38 -0
  189. package/dist/pipeline/type-defs/checks.js.map +1 -0
  190. package/dist/pipeline/type-defs/enums.d.ts +43 -0
  191. package/dist/pipeline/type-defs/enums.d.ts.map +1 -0
  192. package/dist/pipeline/type-defs/enums.js +55 -0
  193. package/dist/pipeline/type-defs/enums.js.map +1 -0
  194. package/dist/pipeline/type-defs/index.d.ts +12 -0
  195. package/dist/pipeline/type-defs/index.d.ts.map +1 -0
  196. package/dist/pipeline/type-defs/index.js +12 -0
  197. package/dist/pipeline/type-defs/index.js.map +1 -0
  198. package/dist/pipeline/type-defs/packets.d.ts +821 -0
  199. package/dist/pipeline/type-defs/packets.d.ts.map +1 -0
  200. package/dist/pipeline/type-defs/packets.js +109 -0
  201. package/dist/pipeline/type-defs/packets.js.map +1 -0
  202. package/dist/pipeline/type-defs/snapshot.d.ts +52 -0
  203. package/dist/pipeline/type-defs/snapshot.d.ts.map +1 -0
  204. package/dist/pipeline/type-defs/snapshot.js +35 -0
  205. package/dist/pipeline/type-defs/snapshot.js.map +1 -0
  206. package/dist/pipeline/type-defs/state.d.ts +455 -0
  207. package/dist/pipeline/type-defs/state.d.ts.map +1 -0
  208. package/dist/pipeline/type-defs/state.js +90 -0
  209. package/dist/pipeline/type-defs/state.js.map +1 -0
  210. package/dist/pipeline/types.d.ts +16 -0
  211. package/dist/pipeline/types.d.ts.map +1 -0
  212. package/dist/pipeline/types.js +16 -0
  213. package/dist/pipeline/types.js.map +1 -0
  214. package/dist/types/audit.d.ts +6 -6
  215. package/dist/types/consensus.d.ts +5 -1
  216. package/dist/types/consensus.d.ts.map +1 -1
  217. package/dist/types/consensus.js +15 -4
  218. package/dist/types/consensus.js.map +1 -1
  219. package/dist/types/index.d.ts +1 -1
  220. package/dist/types/index.d.ts.map +1 -1
  221. package/dist/types/index.js +1 -1
  222. package/dist/types/index.js.map +1 -1
  223. package/dist/types/project.d.ts +1 -1
  224. package/dist/types/project.d.ts.map +1 -1
  225. package/dist/types/project.js +39 -10
  226. package/dist/types/project.js.map +1 -1
  227. package/dist/types/workflow.d.ts +1 -7
  228. package/dist/types/workflow.d.ts.map +1 -1
  229. package/dist/types/workflow.js +1 -1
  230. package/dist/types/workflow.js.map +1 -1
  231. package/dist/upgrade/handlers.js +5 -5
  232. package/dist/upgrade/handlers.js.map +1 -1
  233. package/dist/workflow/index.d.ts.map +1 -1
  234. package/dist/workflow/index.js +52 -0
  235. package/dist/workflow/index.js.map +1 -1
  236. package/dist/workflow/website-strategy.js +1 -1
  237. package/dist/workflow/website-strategy.js.map +1 -1
  238. package/package.json +1 -1
  239. package/skills/PHASE_GATE_ENGINE_SPEC.md +113 -20
  240. package/skills/POPEYE_FULL_AUTONOMY_PIPELINE.md +66 -13
  241. package/src/adapters/gemini.ts +3 -3
  242. package/src/adapters/openai.ts +2 -2
  243. package/src/auth/gemini.ts +1 -1
  244. package/src/cli/commands/create.ts +12 -6
  245. package/src/cli/commands/resume.ts +9 -1
  246. package/src/cli/interactive.ts +32 -3
  247. package/src/config/defaults.ts +7 -2
  248. package/src/config/popeye-md.ts +139 -0
  249. package/src/config/schema.ts +21 -8
  250. package/src/pipeline/artifact-manager.ts +339 -0
  251. package/src/pipeline/artifact-validators.ts +224 -0
  252. package/src/pipeline/bridges/review-bridge.ts +371 -0
  253. package/src/pipeline/change-request.ts +119 -0
  254. package/src/pipeline/check-runner.ts +504 -0
  255. package/src/pipeline/command-resolver.ts +168 -0
  256. package/src/pipeline/consensus/consensus-runner.ts +317 -0
  257. package/src/pipeline/constitution.ts +109 -0
  258. package/src/pipeline/gate-engine.ts +347 -0
  259. package/src/pipeline/index.ts +82 -0
  260. package/src/pipeline/migration.ts +91 -0
  261. package/src/pipeline/orchestrator.ts +322 -0
  262. package/src/pipeline/packets/audit-report-builder.ts +47 -0
  263. package/src/pipeline/packets/consensus-packet-builder.ts +112 -0
  264. package/src/pipeline/packets/index.ts +15 -0
  265. package/src/pipeline/packets/plan-packet-builder.ts +52 -0
  266. package/src/pipeline/packets/rca-packet-builder.ts +38 -0
  267. package/src/pipeline/phases/architecture.ts +73 -0
  268. package/src/pipeline/phases/audit.ts +193 -0
  269. package/src/pipeline/phases/consensus-architecture.ts +104 -0
  270. package/src/pipeline/phases/consensus-master-plan.ts +100 -0
  271. package/src/pipeline/phases/consensus-role-plans.ts +105 -0
  272. package/src/pipeline/phases/done.ts +68 -0
  273. package/src/pipeline/phases/implementation.ts +52 -0
  274. package/src/pipeline/phases/index.ts +21 -0
  275. package/src/pipeline/phases/intake.ts +68 -0
  276. package/src/pipeline/phases/phase-context.ts +86 -0
  277. package/src/pipeline/phases/production-gate.ts +113 -0
  278. package/src/pipeline/phases/qa-validation.ts +63 -0
  279. package/src/pipeline/phases/recovery-loop.ts +120 -0
  280. package/src/pipeline/phases/review.ts +149 -0
  281. package/src/pipeline/phases/role-planning.ts +92 -0
  282. package/src/pipeline/phases/stuck.ts +62 -0
  283. package/src/pipeline/repo-snapshot.ts +395 -0
  284. package/src/pipeline/role-execution-adapter.ts +238 -0
  285. package/src/pipeline/skill-loader.ts +192 -0
  286. package/src/pipeline/skills/defaults.ts +215 -0
  287. package/src/pipeline/type-defs/artifacts.ts +82 -0
  288. package/src/pipeline/type-defs/audit.ts +67 -0
  289. package/src/pipeline/type-defs/checks.ts +47 -0
  290. package/src/pipeline/type-defs/enums.ts +62 -0
  291. package/src/pipeline/type-defs/index.ts +12 -0
  292. package/src/pipeline/type-defs/packets.ts +131 -0
  293. package/src/pipeline/type-defs/snapshot.ts +55 -0
  294. package/src/pipeline/type-defs/state.ts +167 -0
  295. package/src/pipeline/types.ts +16 -0
  296. package/src/types/consensus.ts +16 -4
  297. package/src/types/index.ts +1 -0
  298. package/src/types/project.ts +39 -10
  299. package/src/types/workflow.ts +1 -1
  300. package/src/upgrade/handlers.ts +5 -5
  301. package/src/workflow/index.ts +52 -0
  302. package/src/workflow/website-strategy.ts +1 -1
  303. package/tests/cli/model-command.test.ts +19 -9
  304. package/tests/config/config.test.ts +3 -3
  305. package/tests/config/popeye-md.test.ts +168 -0
  306. package/tests/pipeline/artifact-manager.test.ts +183 -0
  307. package/tests/pipeline/artifact-validators.test.ts +207 -0
  308. package/tests/pipeline/bridges/review-bridge.test.ts +243 -0
  309. package/tests/pipeline/change-request.test.ts +180 -0
  310. package/tests/pipeline/check-runner.test.ts +157 -0
  311. package/tests/pipeline/command-resolver.test.ts +159 -0
  312. package/tests/pipeline/consensus-runner.test.ts +206 -0
  313. package/tests/pipeline/consensus-scoring.test.ts +163 -0
  314. package/tests/pipeline/constitution.test.ts +122 -0
  315. package/tests/pipeline/gate-engine.test.ts +195 -0
  316. package/tests/pipeline/migration.test.ts +133 -0
  317. package/tests/pipeline/orchestrator.test.ts +614 -0
  318. package/tests/pipeline/packets/builders.test.ts +347 -0
  319. package/tests/pipeline/repo-snapshot.test.ts +189 -0
  320. package/tests/pipeline/role-execution-adapter.test.ts +299 -0
  321. package/tests/pipeline/session-guidance.test.ts +205 -0
  322. package/tests/pipeline/skill-loader.test.ts +186 -0
  323. package/tests/pipeline/start-env-checks.test.ts +123 -0
  324. package/tests/pipeline/types.test.ts +156 -0
  325. package/tests/types/consensus.test.ts +1 -1
  326. package/tests/workflow/pipeline-bootstrap.test.ts +162 -0
@@ -0,0 +1,251 @@
1
+ /**
2
+ * Artifact Manager — manages immutable versioned artifacts under /docs/.
3
+ * Supports both Markdown and JSON content types (P0-C).
4
+ * Implements version chains via group_id + previous_id (P1-2).
5
+ */
6
+ import { randomUUID } from 'node:crypto';
7
+ import { createHash } from 'node:crypto';
8
+ import { existsSync, mkdirSync, writeFileSync, readFileSync, readdirSync } from 'node:fs';
9
+ import { join, relative } from 'node:path';
10
+ // ─── Constants ───────────────────────────────────────────
11
+ /** Directory mappings: artifact type -> subdirectory under /docs/ */
12
+ const ARTIFACT_DIRS = {
13
+ master_plan: 'master-plan',
14
+ architecture: 'architecture',
15
+ role_plan: 'role-plans',
16
+ consensus: 'consensus',
17
+ arbitration: 'arbitration',
18
+ audit_report: 'audit',
19
+ rca_report: 'incidents',
20
+ production_readiness: 'production',
21
+ release_notes: 'release',
22
+ deployment: 'release',
23
+ rollback: 'release',
24
+ repo_snapshot: 'snapshots',
25
+ build_check: 'checks',
26
+ test_check: 'checks',
27
+ lint_check: 'checks',
28
+ typecheck_check: 'checks',
29
+ placeholder_scan: 'checks',
30
+ qa_validation: 'role-plans',
31
+ review_decision: 'consensus',
32
+ stuck_report: 'incidents',
33
+ journalist_trace: 'journal',
34
+ resolved_commands: 'checks',
35
+ constitution: 'governance',
36
+ change_request: 'governance',
37
+ };
38
+ /** All required subdirectories under /docs/ */
39
+ const DOCS_SUBDIRS = [
40
+ 'master-plan',
41
+ 'architecture',
42
+ 'role-plans',
43
+ 'consensus',
44
+ 'arbitration',
45
+ 'audit',
46
+ 'incidents',
47
+ 'production',
48
+ 'release',
49
+ 'snapshots',
50
+ 'checks',
51
+ 'journal',
52
+ 'governance',
53
+ ];
54
+ // ─── Helper Functions ────────────────────────────────────
55
+ function computeSha256(content) {
56
+ return createHash('sha256').update(content, 'utf-8').digest('hex');
57
+ }
58
+ function shortId() {
59
+ return randomUUID().split('-')[0];
60
+ }
61
+ function formatDate() {
62
+ return new Date().toISOString().split('T')[0];
63
+ }
64
+ function getExtension(contentType) {
65
+ return contentType === 'json' ? '.json' : '.md';
66
+ }
67
+ export class ArtifactManager {
68
+ projectDir;
69
+ docsDir;
70
+ constructor(options) {
71
+ this.projectDir = options.projectDir;
72
+ this.docsDir = join(options.projectDir, 'docs');
73
+ }
74
+ /** Ensure all /docs/ subdirectories exist */
75
+ ensureDocsStructure() {
76
+ if (!existsSync(this.docsDir)) {
77
+ mkdirSync(this.docsDir, { recursive: true });
78
+ }
79
+ for (const subdir of DOCS_SUBDIRS) {
80
+ const dirPath = join(this.docsDir, subdir);
81
+ if (!existsSync(dirPath)) {
82
+ mkdirSync(dirPath, { recursive: true });
83
+ }
84
+ }
85
+ }
86
+ /** Create an artifact from Markdown content */
87
+ createArtifactText(type, markdown, phase, groupId) {
88
+ return this.createArtifact(type, markdown, phase, 'markdown', groupId);
89
+ }
90
+ /** Create an artifact from a JSON-serializable object */
91
+ createArtifactJson(type, jsonObject, phase, groupId) {
92
+ const content = JSON.stringify(jsonObject, null, 2);
93
+ return this.createArtifact(type, content, phase, 'json', groupId);
94
+ }
95
+ /** Core artifact creation logic */
96
+ createArtifact(type, content, phase, contentType, groupId) {
97
+ this.ensureDocsStructure();
98
+ const resolvedGroupId = groupId ?? randomUUID();
99
+ const existingArtifacts = this.listArtifacts(type);
100
+ const version = this.getNextVersion(resolvedGroupId, existingArtifacts);
101
+ const previousEntry = this.getLatestInGroup(resolvedGroupId, existingArtifacts);
102
+ const id = randomUUID();
103
+ const date = formatDate();
104
+ const sid = shortId();
105
+ const ext = getExtension(contentType);
106
+ const filename = `${type}_${sid}_v${version}_${date}${ext}`;
107
+ const subdir = ARTIFACT_DIRS[type] ?? 'misc';
108
+ const dirPath = join(this.docsDir, subdir);
109
+ if (!existsSync(dirPath)) {
110
+ mkdirSync(dirPath, { recursive: true });
111
+ }
112
+ const filePath = join(dirPath, filename);
113
+ const sha256 = computeSha256(content);
114
+ writeFileSync(filePath, content, 'utf-8');
115
+ const relativePath = relative(this.projectDir, filePath);
116
+ const entry = {
117
+ id,
118
+ type,
119
+ phase,
120
+ version,
121
+ path: relativePath,
122
+ sha256,
123
+ timestamp: new Date().toISOString(),
124
+ immutable: true,
125
+ content_type: contentType,
126
+ group_id: resolvedGroupId,
127
+ previous_id: previousEntry?.id,
128
+ };
129
+ return entry;
130
+ }
131
+ /** Get the file path for a given artifact type and naming components */
132
+ getArtifactPath(type, sid, version, date, contentType) {
133
+ const ext = getExtension(contentType);
134
+ const subdir = ARTIFACT_DIRS[type] ?? 'misc';
135
+ return join(this.docsDir, subdir, `${type}_${sid}_v${version}_${date}${ext}`);
136
+ }
137
+ /** List all artifacts, optionally filtered by type */
138
+ listArtifacts(type) {
139
+ // Scan for artifact JSON metadata files in a .artifacts/ dir
140
+ const metaDir = join(this.docsDir, '.artifacts');
141
+ if (!existsSync(metaDir)) {
142
+ return [];
143
+ }
144
+ const entries = [];
145
+ const files = readdirSync(metaDir).filter((f) => f.endsWith('.json'));
146
+ for (const file of files) {
147
+ try {
148
+ const raw = readFileSync(join(metaDir, file), 'utf-8');
149
+ const parsed = JSON.parse(raw);
150
+ if (!type || parsed.type === type) {
151
+ entries.push(parsed);
152
+ }
153
+ }
154
+ catch {
155
+ // Skip malformed metadata files
156
+ }
157
+ }
158
+ return entries.sort((a, b) => a.timestamp.localeCompare(b.timestamp));
159
+ }
160
+ /** Verify an artifact's SHA-256 matches its stored content */
161
+ verifyArtifact(entry) {
162
+ const fullPath = join(this.projectDir, entry.path);
163
+ if (!existsSync(fullPath)) {
164
+ return false;
165
+ }
166
+ const content = readFileSync(fullPath, 'utf-8');
167
+ const currentHash = computeSha256(content);
168
+ return currentHash === entry.sha256;
169
+ }
170
+ /** Get the latest artifact of a given type */
171
+ getLatestArtifact(type) {
172
+ const all = this.listArtifacts(type);
173
+ if (all.length === 0)
174
+ return null;
175
+ return all[all.length - 1];
176
+ }
177
+ /** Get next version number for a group across existing artifacts */
178
+ getNextVersion(groupId, existingArtifacts) {
179
+ const groupArtifacts = existingArtifacts.filter((a) => a.group_id === groupId);
180
+ if (groupArtifacts.length === 0)
181
+ return 1;
182
+ const maxVersion = Math.max(...groupArtifacts.map((a) => a.version));
183
+ return maxVersion + 1;
184
+ }
185
+ /** Convert an ArtifactEntry to an ArtifactRef */
186
+ toArtifactRef(entry) {
187
+ return {
188
+ artifact_id: entry.id,
189
+ path: entry.path,
190
+ sha256: entry.sha256,
191
+ version: entry.version,
192
+ type: entry.type,
193
+ };
194
+ }
195
+ /** Store artifact metadata for later retrieval */
196
+ storeArtifactMetadata(entry) {
197
+ const metaDir = join(this.docsDir, '.artifacts');
198
+ if (!existsSync(metaDir)) {
199
+ mkdirSync(metaDir, { recursive: true });
200
+ }
201
+ const metaPath = join(metaDir, `${entry.id}.json`);
202
+ writeFileSync(metaPath, JSON.stringify(entry, null, 2), 'utf-8');
203
+ }
204
+ /** Create an artifact and store its metadata in one step */
205
+ createAndStoreText(type, markdown, phase, groupId) {
206
+ const entry = this.createArtifactText(type, markdown, phase, groupId);
207
+ this.storeArtifactMetadata(entry);
208
+ return entry;
209
+ }
210
+ /** Create a JSON artifact and store its metadata in one step */
211
+ createAndStoreJson(type, jsonObject, phase, groupId) {
212
+ const entry = this.createArtifactJson(type, jsonObject, phase, groupId);
213
+ this.storeArtifactMetadata(entry);
214
+ return entry;
215
+ }
216
+ /** Update /docs/INDEX.md with current artifact listing */
217
+ updateIndex(artifacts) {
218
+ this.ensureDocsStructure();
219
+ const lines = [
220
+ '# Documentation Index',
221
+ '',
222
+ `> Auto-generated by Popeye Pipeline — ${new Date().toISOString()}`,
223
+ '',
224
+ '## Artifacts',
225
+ '',
226
+ '| Type | Version | Path | Phase | Timestamp |',
227
+ '|------|---------|------|-------|-----------|',
228
+ ];
229
+ const sorted = [...artifacts].sort((a, b) => a.timestamp.localeCompare(b.timestamp));
230
+ for (const a of sorted) {
231
+ lines.push(`| ${a.type} | v${a.version} | ${a.path} | ${a.phase} | ${a.timestamp} |`);
232
+ }
233
+ lines.push('');
234
+ const indexPath = join(this.docsDir, 'INDEX.md');
235
+ writeFileSync(indexPath, lines.join('\n'), 'utf-8');
236
+ }
237
+ /** Get the latest artifact entry in a specific group */
238
+ getLatestInGroup(groupId, existingArtifacts) {
239
+ const groupArtifacts = existingArtifacts
240
+ .filter((a) => a.group_id === groupId)
241
+ .sort((a, b) => a.version - b.version);
242
+ if (groupArtifacts.length === 0)
243
+ return null;
244
+ return groupArtifacts[groupArtifacts.length - 1];
245
+ }
246
+ }
247
+ /** Factory function */
248
+ export function createArtifactManager(projectDir) {
249
+ return new ArtifactManager({ projectDir });
250
+ }
251
+ //# sourceMappingURL=artifact-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artifact-manager.js","sourceRoot":"","sources":["../../src/pipeline/artifact-manager.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAC1F,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAU3C,4DAA4D;AAE5D,qEAAqE;AACrE,MAAM,aAAa,GAA2B;IAC5C,WAAW,EAAE,aAAa;IAC1B,YAAY,EAAE,cAAc;IAC5B,SAAS,EAAE,YAAY;IACvB,SAAS,EAAE,WAAW;IACtB,WAAW,EAAE,aAAa;IAC1B,YAAY,EAAE,OAAO;IACrB,UAAU,EAAE,WAAW;IACvB,oBAAoB,EAAE,YAAY;IAClC,aAAa,EAAE,SAAS;IACxB,UAAU,EAAE,SAAS;IACrB,QAAQ,EAAE,SAAS;IACnB,aAAa,EAAE,WAAW;IAC1B,WAAW,EAAE,QAAQ;IACrB,UAAU,EAAE,QAAQ;IACpB,UAAU,EAAE,QAAQ;IACpB,eAAe,EAAE,QAAQ;IACzB,gBAAgB,EAAE,QAAQ;IAC1B,aAAa,EAAE,YAAY;IAC3B,eAAe,EAAE,WAAW;IAC5B,YAAY,EAAE,WAAW;IACzB,gBAAgB,EAAE,SAAS;IAC3B,iBAAiB,EAAE,QAAQ;IAC3B,YAAY,EAAE,YAAY;IAC1B,cAAc,EAAE,YAAY;CAC7B,CAAC;AAEF,+CAA+C;AAC/C,MAAM,YAAY,GAAG;IACnB,aAAa;IACb,cAAc;IACd,YAAY;IACZ,WAAW;IACX,aAAa;IACb,OAAO;IACP,WAAW;IACX,YAAY;IACZ,SAAS;IACT,WAAW;IACX,QAAQ;IACR,SAAS;IACT,YAAY;CACb,CAAC;AAEF,4DAA4D;AAE5D,SAAS,aAAa,CAAC,OAAe;IACpC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACrE,CAAC;AAED,SAAS,OAAO;IACd,OAAO,UAAU,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACpC,CAAC;AAED,SAAS,UAAU;IACjB,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAChD,CAAC;AAED,SAAS,YAAY,CAAC,WAAwB;IAC5C,OAAO,WAAW,KAAK,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;AAClD,CAAC;AAQD,MAAM,OAAO,eAAe;IACT,UAAU,CAAS;IACnB,OAAO,CAAS;IAEjC,YAAY,OAA+B;QACzC,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;QACrC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAClD,CAAC;IAED,6CAA6C;IAC7C,mBAAmB;QACjB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAC9B,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/C,CAAC;QACD,KAAK,MAAM,MAAM,IAAI,YAAY,EAAE,CAAC;YAClC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC3C,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBACzB,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC;IACH,CAAC;IAED,+CAA+C;IAC/C,kBAAkB,CAChB,IAAkB,EAClB,QAAgB,EAChB,KAAoB,EACpB,OAAgB;QAEhB,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;IACzE,CAAC;IAED,yDAAyD;IACzD,kBAAkB,CAChB,IAAkB,EAClB,UAAmB,EACnB,KAAoB,EACpB,OAAgB;QAEhB,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QACpD,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IACpE,CAAC;IAED,mCAAmC;IAC3B,cAAc,CACpB,IAAkB,EAClB,OAAe,EACf,KAAoB,EACpB,WAAwB,EACxB,OAAgB;QAEhB,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAE3B,MAAM,eAAe,GAAG,OAAO,IAAI,UAAU,EAAE,CAAC;QAChD,MAAM,iBAAiB,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QACnD,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,eAAe,EAAE,iBAAiB,CAAC,CAAC;QACxE,MAAM,aAAa,GAAG,IAAI,CAAC,gBAAgB,CAAC,eAAe,EAAE,iBAAiB,CAAC,CAAC;QAEhF,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,UAAU,EAAE,CAAC;QAC1B,MAAM,GAAG,GAAG,OAAO,EAAE,CAAC;QACtB,MAAM,GAAG,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;QACtC,MAAM,QAAQ,GAAG,GAAG,IAAI,IAAI,GAAG,KAAK,OAAO,IAAI,IAAI,GAAG,GAAG,EAAE,CAAC;QAE5D,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC;QAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC3C,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YACzB,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1C,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACzC,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;QAEtC,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAE1C,MAAM,YAAY,GAAG,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QAEzD,MAAM,KAAK,GAAkB;YAC3B,EAAE;YACF,IAAI;YACJ,KAAK;YACL,OAAO;YACP,IAAI,EAAE,YAAY;YAClB,MAAM;YACN,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,SAAS,EAAE,IAAI;YACf,YAAY,EAAE,WAAW;YACzB,QAAQ,EAAE,eAAe;YACzB,WAAW,EAAE,aAAa,EAAE,EAAE;SAC/B,CAAC;QAEF,OAAO,KAAK,CAAC;IACf,CAAC;IAED,wEAAwE;IACxE,eAAe,CACb,IAAkB,EAClB,GAAW,EACX,OAAe,EACf,IAAY,EACZ,WAAwB;QAExB,MAAM,GAAG,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;QACtC,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC;QAC7C,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,IAAI,GAAG,KAAK,OAAO,IAAI,IAAI,GAAG,GAAG,EAAE,CAAC,CAAC;IAChF,CAAC;IAED,sDAAsD;IACtD,aAAa,CAAC,IAAmB;QAC/B,6DAA6D;QAC7D,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QACjD,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YACzB,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,OAAO,GAAoB,EAAE,CAAC;QACpC,MAAM,KAAK,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;QAEtE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;gBACvD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAkB,CAAC;gBAChD,IAAI,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;oBAClC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACvB,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,gCAAgC;YAClC,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;IACxE,CAAC;IAED,8DAA8D;IAC9D,cAAc,CAAC,KAAoB;QACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACnD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAChD,MAAM,WAAW,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;QAC3C,OAAO,WAAW,KAAK,KAAK,CAAC,MAAM,CAAC;IACtC,CAAC;IAED,8CAA8C;IAC9C,iBAAiB,CAAC,IAAkB;QAClC,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAClC,OAAO,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC7B,CAAC;IAED,oEAAoE;IACpE,cAAc,CAAC,OAAe,EAAE,iBAAkC;QAChE,MAAM,cAAc,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC;QAC/E,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,CAAC,CAAC;QAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;QACrE,OAAO,UAAU,GAAG,CAAC,CAAC;IACxB,CAAC;IAED,iDAAiD;IACjD,aAAa,CAAC,KAAoB;QAChC,OAAO;YACL,WAAW,EAAE,KAAK,CAAC,EAAE;YACrB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,IAAI,EAAE,KAAK,CAAC,IAAI;SACjB,CAAC;IACJ,CAAC;IAED,kDAAkD;IAClD,qBAAqB,CAAC,KAAoB;QACxC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QACjD,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YACzB,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1C,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;QACnD,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACnE,CAAC;IAED,4DAA4D;IAC5D,kBAAkB,CAChB,IAAkB,EAClB,QAAgB,EAChB,KAAoB,EACpB,OAAgB;QAEhB,MAAM,KAAK,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;QACtE,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC;QAClC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,gEAAgE;IAChE,kBAAkB,CAChB,IAAkB,EAClB,UAAmB,EACnB,KAAoB,EACpB,OAAgB;QAEhB,MAAM,KAAK,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;QACxE,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC;QAClC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,0DAA0D;IAC1D,WAAW,CAAC,SAA0B;QACpC,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAE3B,MAAM,KAAK,GAAa;YACtB,uBAAuB;YACvB,EAAE;YACF,yCAAyC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE;YACnE,EAAE;YACF,cAAc;YACd,EAAE;YACF,+CAA+C;YAC/C,+CAA+C;SAChD,CAAC;QAEF,MAAM,MAAM,GAAG,CAAC,GAAG,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;QAErF,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;YACvB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,OAAO,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC;QACxF,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QACjD,aAAa,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;IACtD,CAAC;IAED,wDAAwD;IAChD,gBAAgB,CACtB,OAAe,EACf,iBAAkC;QAElC,MAAM,cAAc,GAAG,iBAAiB;aACrC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC;aACrC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC;QACzC,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAC7C,OAAO,cAAc,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACnD,CAAC;CACF;AAED,uBAAuB;AACvB,MAAM,UAAU,qBAAqB,CAAC,UAAkB;IACtD,OAAO,IAAI,eAAe,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC;AAC7C,CAAC"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Artifact Completeness Validators — deterministic structural checks.
3
+ * Runs BEFORE LLM review in consensus phases to catch obvious issues.
4
+ * Each validator checks for required sections, minimum content length,
5
+ * and structural integrity specific to its artifact type.
6
+ */
7
+ import type { ArtifactType } from './types.js';
8
+ export interface ValidationResult {
9
+ valid: boolean;
10
+ errors: string[];
11
+ warnings: string[];
12
+ }
13
+ /**
14
+ * Validate artifact content completeness based on type-specific rules.
15
+ * Returns a ValidationResult with errors (blocking) and warnings (non-blocking).
16
+ *
17
+ * Args:
18
+ * type: The artifact type to validate against.
19
+ * content: The artifact content string.
20
+ *
21
+ * Returns:
22
+ * ValidationResult with valid flag, errors, and warnings.
23
+ */
24
+ export declare function validateArtifactCompleteness(type: ArtifactType, content: string): ValidationResult;
25
+ /**
26
+ * Get all artifact types that have validators.
27
+ */
28
+ export declare function getValidatableArtifactTypes(): ArtifactType[];
29
+ //# sourceMappingURL=artifact-validators.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artifact-validators.d.ts","sourceRoot":"","sources":["../../src/pipeline/artifact-validators.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAI/C,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AA2KD;;;;;;;;;;GAUG;AACH,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,YAAY,EAClB,OAAO,EAAE,MAAM,GACd,gBAAgB,CAgBlB;AAED;;GAEG;AACH,wBAAgB,2BAA2B,IAAI,YAAY,EAAE,CAE5D"}
@@ -0,0 +1,173 @@
1
+ /**
2
+ * Artifact Completeness Validators — deterministic structural checks.
3
+ * Runs BEFORE LLM review in consensus phases to catch obvious issues.
4
+ * Each validator checks for required sections, minimum content length,
5
+ * and structural integrity specific to its artifact type.
6
+ */
7
+ // ─── Section Patterns ────────────────────────────────────
8
+ /** Regex patterns for detecting markdown sections (case-insensitive) */
9
+ function hasSection(content, patterns) {
10
+ return patterns.some((p) => p.test(content));
11
+ }
12
+ function findMissingSections(content, required) {
13
+ const missing = [];
14
+ for (const { name, patterns } of required) {
15
+ if (!hasSection(content, patterns)) {
16
+ missing.push(name);
17
+ }
18
+ }
19
+ return missing;
20
+ }
21
+ // ─── Per-Type Validators ─────────────────────────────────
22
+ function validateMasterPlan(content) {
23
+ const errors = [];
24
+ const warnings = [];
25
+ if (content.length < 200) {
26
+ errors.push('Master plan is too short (min 200 characters)');
27
+ }
28
+ const missing = findMissingSections(content, [
29
+ { name: 'Goals/Objectives', patterns: [/#+\s*(goals?|objectives?)/i, /\bgoals?\b.*:/i] },
30
+ { name: 'Milestones', patterns: [/#+\s*milestones?/i, /\bmilestone\s+\d/i] },
31
+ { name: 'Success Criteria', patterns: [/#+\s*success\s+criteria/i, /\bsuccess\s+criteria\b/i, /#+\s*acceptance\s+criteria/i] },
32
+ ]);
33
+ for (const section of missing) {
34
+ errors.push(`Missing required section: ${section}`);
35
+ }
36
+ // Check for empty sections (heading followed by another heading or end)
37
+ const emptyHeadings = content.match(/^(#+\s+.+)\n(?=#+\s+|\s*$)/gm);
38
+ if (emptyHeadings && emptyHeadings.length > 2) {
39
+ warnings.push(`${emptyHeadings.length} potentially empty sections detected`);
40
+ }
41
+ return { valid: errors.length === 0, errors, warnings };
42
+ }
43
+ function validateArchitecture(content) {
44
+ const errors = [];
45
+ const warnings = [];
46
+ if (content.length < 200) {
47
+ errors.push('Architecture document is too short (min 200 characters)');
48
+ }
49
+ const missing = findMissingSections(content, [
50
+ { name: 'Components/Modules', patterns: [/#+\s*(components?|modules?|services?)/i, /\bcomponent\b/i] },
51
+ { name: 'Data Flow/Contracts', patterns: [/#+\s*(data\s+flow|contracts?|api|interfaces?)/i, /\bcontract\b/i, /\bdata\s+flow\b/i] },
52
+ { name: 'Tech Stack', patterns: [/#+\s*(tech\s+stack|technology|stack)/i, /\btech\s+stack\b/i] },
53
+ ]);
54
+ for (const section of missing) {
55
+ errors.push(`Missing required section: ${section}`);
56
+ }
57
+ // Must reference at least one file path
58
+ const hasFilePath = /(?:src\/|app\/|pages\/|lib\/|\.ts|\.js|\.py|\.go)/.test(content);
59
+ if (!hasFilePath) {
60
+ warnings.push('Architecture should reference at least one file path');
61
+ }
62
+ return { valid: errors.length === 0, errors, warnings };
63
+ }
64
+ function validateRolePlan(content) {
65
+ const errors = [];
66
+ const warnings = [];
67
+ if (content.length < 100) {
68
+ errors.push('Role plan is too short (min 100 characters)');
69
+ }
70
+ const missing = findMissingSections(content, [
71
+ { name: 'Tasks/Responsibilities', patterns: [/#+\s*(tasks?|responsibilities?|work\s+items?)/i, /\btask\b/i] },
72
+ { name: 'Dependencies', patterns: [/#+\s*(dependenc|prerequisites?|requires?)/i, /\bdepend/i] },
73
+ { name: 'Acceptance Criteria', patterns: [/#+\s*(acceptance|done\s+when|completion)/i, /\bacceptance\b/i, /\bdone\s+when\b/i] },
74
+ ]);
75
+ for (const section of missing) {
76
+ errors.push(`Missing required section: ${section}`);
77
+ }
78
+ // Should reference a role name
79
+ const rolePatterns = /\b(DISPATCHER|ARCHITECT|DB_EXPERT|BACKEND|FRONTEND|WEBSITE|QA_TESTER|REVIEWER|AUDITOR|JOURNALIST)\b/i;
80
+ if (!rolePatterns.test(content)) {
81
+ warnings.push('Role plan should reference the role name');
82
+ }
83
+ return { valid: errors.length === 0, errors, warnings };
84
+ }
85
+ function validateQaValidation(content) {
86
+ const errors = [];
87
+ const warnings = [];
88
+ const missing = findMissingSections(content, [
89
+ { name: 'Test Results', patterns: [/#+\s*(test\s+results?|results?)/i, /\btest\s+results?\b/i, /\bpass(?:ed|ing)?\b/i] },
90
+ { name: 'Coverage', patterns: [/#+\s*coverage/i, /\bcoverage\b/i, /\d+\s*%/] },
91
+ ]);
92
+ for (const section of missing) {
93
+ errors.push(`Missing required section: ${section}`);
94
+ }
95
+ // Should contain pass/fail counts
96
+ const hasPassFail = /\b\d+\s*(pass|fail|error|skip)/i.test(content);
97
+ if (!hasPassFail) {
98
+ warnings.push('QA validation should include pass/fail counts');
99
+ }
100
+ return { valid: errors.length === 0, errors, warnings };
101
+ }
102
+ function validateAuditReport(content) {
103
+ const errors = [];
104
+ const warnings = [];
105
+ // Try JSON parsing
106
+ try {
107
+ const parsed = JSON.parse(content);
108
+ if (!Array.isArray(parsed.findings)) {
109
+ errors.push('Audit report must have a "findings" array');
110
+ }
111
+ if (typeof parsed.overall_status !== 'string') {
112
+ errors.push('Audit report must have "overall_status"');
113
+ }
114
+ if (typeof parsed.system_risk_score !== 'number') {
115
+ errors.push('Audit report must have "system_risk_score"');
116
+ }
117
+ }
118
+ catch {
119
+ // Not JSON — check for markdown-style audit
120
+ if (!content.includes('findings') && !content.includes('finding')) {
121
+ errors.push('Audit report must contain findings');
122
+ }
123
+ if (!content.includes('status') && !content.includes('PASS') && !content.includes('FAIL')) {
124
+ errors.push('Audit report must contain overall status');
125
+ }
126
+ if (!content.includes('risk') && !content.includes('score')) {
127
+ warnings.push('Audit report should include risk score');
128
+ }
129
+ }
130
+ return { valid: errors.length === 0, errors, warnings };
131
+ }
132
+ // ─── Validator Registry ──────────────────────────────────
133
+ const VALIDATORS = {
134
+ master_plan: validateMasterPlan,
135
+ architecture: validateArchitecture,
136
+ role_plan: validateRolePlan,
137
+ qa_validation: validateQaValidation,
138
+ audit_report: validateAuditReport,
139
+ };
140
+ // ─── Public API ──────────────────────────────────────────
141
+ /**
142
+ * Validate artifact content completeness based on type-specific rules.
143
+ * Returns a ValidationResult with errors (blocking) and warnings (non-blocking).
144
+ *
145
+ * Args:
146
+ * type: The artifact type to validate against.
147
+ * content: The artifact content string.
148
+ *
149
+ * Returns:
150
+ * ValidationResult with valid flag, errors, and warnings.
151
+ */
152
+ export function validateArtifactCompleteness(type, content) {
153
+ const validator = VALIDATORS[type];
154
+ if (!validator) {
155
+ // No validator for this type — pass by default
156
+ return { valid: true, errors: [], warnings: [] };
157
+ }
158
+ if (!content || content.trim().length === 0) {
159
+ return {
160
+ valid: false,
161
+ errors: [`${type} artifact has empty content`],
162
+ warnings: [],
163
+ };
164
+ }
165
+ return validator(content);
166
+ }
167
+ /**
168
+ * Get all artifact types that have validators.
169
+ */
170
+ export function getValidatableArtifactTypes() {
171
+ return Object.keys(VALIDATORS);
172
+ }
173
+ //# sourceMappingURL=artifact-validators.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artifact-validators.js","sourceRoot":"","sources":["../../src/pipeline/artifact-validators.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Review Bridge — connects /review (rich audit-mode scanner) to the pipeline
3
+ * artifact + CR system when a project is pipeline-managed.
4
+ *
5
+ * When pipeline state exists, /review produces pipeline-native audit_report
6
+ * artifacts and Change Requests instead of injecting recovery milestones
7
+ * into state.json. This keeps the pipeline as the single source of truth.
8
+ */
9
+ import type { ProjectState } from '../../types/workflow.js';
10
+ import type { PipelineState, ArtifactRef } from '../types.js';
11
+ import type { AuditFinding as WorkflowAuditFinding, AuditCategory as WorkflowCategory, AuditSeverity as WorkflowSeverity } from '../../types/audit.js';
12
+ import type { AuditFinding as PipelineAuditFinding, AuditSeverity as PipelineSeverity } from '../type-defs/audit.js';
13
+ import type { ChangeRequest } from '../types.js';
14
+ export interface ReviewBridgeOptions {
15
+ projectDir: string;
16
+ depth?: number;
17
+ strict?: boolean;
18
+ onProgress?: (stage: string, message: string) => void;
19
+ }
20
+ export interface ReviewBridgeResult {
21
+ success: boolean;
22
+ findingsCount: number;
23
+ changeRequestCount: number;
24
+ overallScore: number;
25
+ recommendation: string;
26
+ artifactsCreated: number;
27
+ error?: string;
28
+ }
29
+ /**
30
+ * Check if a project is pipeline-managed.
31
+ * A project is pipeline-managed if its state has a pipeline object
32
+ * with a pipelinePhase field.
33
+ *
34
+ * @param state - The project state to check
35
+ * @returns True if pipeline-managed
36
+ */
37
+ export declare function isPipelineManaged(state: ProjectState): boolean;
38
+ /**
39
+ * Extract pipeline state from project state.
40
+ *
41
+ * @param state - The project state
42
+ * @returns Pipeline state or undefined
43
+ */
44
+ export declare function extractPipelineState(state: ProjectState): PipelineState | undefined;
45
+ export declare function mapSeverity(severity: WorkflowSeverity): PipelineSeverity;
46
+ /** Map workflow audit categories to pipeline audit categories */
47
+ type PipelineCategory = 'integration' | 'config' | 'tests' | 'schema' | 'security' | 'deployment';
48
+ export declare function mapCategory(category: WorkflowCategory): PipelineCategory;
49
+ export declare function categoryToChangeType(category: PipelineCategory): ChangeRequest['change_type'];
50
+ /**
51
+ * Convert a workflow AuditFinding to a pipeline AuditFinding.
52
+ *
53
+ * @param finding - Workflow finding
54
+ * @param snapshotRef - Pipeline artifact ref for the repo snapshot
55
+ * @returns Pipeline-native audit finding
56
+ */
57
+ export declare function convertFinding(finding: WorkflowAuditFinding, snapshotRef: ArtifactRef): PipelineAuditFinding;
58
+ /**
59
+ * Run /review through the pipeline bridge.
60
+ * Uses the rich audit-mode scanner but writes results as pipeline artifacts
61
+ * and creates Change Requests for blocking findings.
62
+ *
63
+ * Does NOT inject recovery milestones — the pipeline RECOVERY_LOOP handles fixes.
64
+ *
65
+ * @param options - Bridge options
66
+ * @returns Bridge result with counts and score
67
+ */
68
+ export declare function runReviewBridge(options: ReviewBridgeOptions): Promise<ReviewBridgeResult>;
69
+ export {};
70
+ //# sourceMappingURL=review-bridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-bridge.d.ts","sourceRoot":"","sources":["../../../src/pipeline/bridges/review-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,KAAK,EACV,aAAa,EAGb,WAAW,EACZ,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,YAAY,IAAI,oBAAoB,EAAE,aAAa,IAAI,gBAAgB,EAAE,aAAa,IAAI,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACvJ,OAAO,KAAK,EAAE,YAAY,IAAI,oBAAoB,EAAE,aAAa,IAAI,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACrH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAWjD,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACvD;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAID;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAG9D;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,YAAY,GAAG,aAAa,GAAG,SAAS,CAEnF;AAYD,wBAAgB,WAAW,CAAC,QAAQ,EAAE,gBAAgB,GAAG,gBAAgB,CAExE;AAID,iEAAiE;AACjE,KAAK,gBAAgB,GAAG,aAAa,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,UAAU,GAAG,YAAY,CAAC;AAalG,wBAAgB,WAAW,CAAC,QAAQ,EAAE,gBAAgB,GAAG,gBAAgB,CAExE;AAcD,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,aAAa,CAAC,aAAa,CAAC,CAE7F;AAID;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,oBAAoB,EAC7B,WAAW,EAAE,WAAW,GACvB,oBAAoB,CAatB;AAID;;;;;;;;;GASG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAkK/F"}