popeye-cli 1.9.5 → 2.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 (318) hide show
  1. package/CHANGELOG.md +59 -0
  2. package/CONTRIBUTING.md +15 -1
  3. package/README.md +57 -0
  4. package/cheatsheet.md +65 -0
  5. package/dist/cli/commands/debug-context.d.ts +64 -0
  6. package/dist/cli/commands/debug-context.d.ts.map +1 -0
  7. package/dist/cli/commands/debug-context.js +221 -0
  8. package/dist/cli/commands/debug-context.js.map +1 -0
  9. package/dist/cli/commands/debug-prompts.d.ts +25 -0
  10. package/dist/cli/commands/debug-prompts.d.ts.map +1 -0
  11. package/dist/cli/commands/debug-prompts.js +80 -0
  12. package/dist/cli/commands/debug-prompts.js.map +1 -0
  13. package/dist/cli/commands/debug.d.ts +68 -0
  14. package/dist/cli/commands/debug.d.ts.map +1 -0
  15. package/dist/cli/commands/debug.js +543 -0
  16. package/dist/cli/commands/debug.js.map +1 -0
  17. package/dist/cli/commands/index.d.ts +1 -0
  18. package/dist/cli/commands/index.d.ts.map +1 -1
  19. package/dist/cli/commands/index.js +1 -0
  20. package/dist/cli/commands/index.js.map +1 -1
  21. package/dist/cli/index.d.ts.map +1 -1
  22. package/dist/cli/index.js +2 -1
  23. package/dist/cli/index.js.map +1 -1
  24. package/dist/cli/interactive.d.ts.map +1 -1
  25. package/dist/cli/interactive.js +25 -0
  26. package/dist/cli/interactive.js.map +1 -1
  27. package/dist/generators/all.d.ts.map +1 -1
  28. package/dist/generators/all.js +2 -0
  29. package/dist/generators/all.js.map +1 -1
  30. package/dist/generators/templates/database-docker.d.ts.map +1 -1
  31. package/dist/generators/templates/database-docker.js +10 -0
  32. package/dist/generators/templates/database-docker.js.map +1 -1
  33. package/dist/generators/templates/fullstack.d.ts +4 -1
  34. package/dist/generators/templates/fullstack.d.ts.map +1 -1
  35. package/dist/generators/templates/fullstack.js +6 -2
  36. package/dist/generators/templates/fullstack.js.map +1 -1
  37. package/dist/pipeline/artifact-manager.d.ts +47 -0
  38. package/dist/pipeline/artifact-manager.d.ts.map +1 -0
  39. package/dist/pipeline/artifact-manager.js +251 -0
  40. package/dist/pipeline/artifact-manager.js.map +1 -0
  41. package/dist/pipeline/artifact-validators.d.ts +29 -0
  42. package/dist/pipeline/artifact-validators.d.ts.map +1 -0
  43. package/dist/pipeline/artifact-validators.js +173 -0
  44. package/dist/pipeline/artifact-validators.js.map +1 -0
  45. package/dist/pipeline/change-request.d.ts +47 -0
  46. package/dist/pipeline/change-request.d.ts.map +1 -0
  47. package/dist/pipeline/change-request.js +91 -0
  48. package/dist/pipeline/change-request.js.map +1 -0
  49. package/dist/pipeline/check-runner.d.ts +47 -0
  50. package/dist/pipeline/check-runner.d.ts.map +1 -0
  51. package/dist/pipeline/check-runner.js +417 -0
  52. package/dist/pipeline/check-runner.js.map +1 -0
  53. package/dist/pipeline/command-resolver.d.ts +9 -0
  54. package/dist/pipeline/command-resolver.d.ts.map +1 -0
  55. package/dist/pipeline/command-resolver.js +140 -0
  56. package/dist/pipeline/command-resolver.js.map +1 -0
  57. package/dist/pipeline/consensus/consensus-runner.d.ts +44 -0
  58. package/dist/pipeline/consensus/consensus-runner.d.ts.map +1 -0
  59. package/dist/pipeline/consensus/consensus-runner.js +212 -0
  60. package/dist/pipeline/consensus/consensus-runner.js.map +1 -0
  61. package/dist/pipeline/constitution.d.ts +45 -0
  62. package/dist/pipeline/constitution.d.ts.map +1 -0
  63. package/dist/pipeline/constitution.js +82 -0
  64. package/dist/pipeline/constitution.js.map +1 -0
  65. package/dist/pipeline/gate-engine.d.ts +55 -0
  66. package/dist/pipeline/gate-engine.d.ts.map +1 -0
  67. package/dist/pipeline/gate-engine.js +270 -0
  68. package/dist/pipeline/gate-engine.js.map +1 -0
  69. package/dist/pipeline/index.d.ts +26 -0
  70. package/dist/pipeline/index.d.ts.map +1 -0
  71. package/dist/pipeline/index.js +35 -0
  72. package/dist/pipeline/index.js.map +1 -0
  73. package/dist/pipeline/migration.d.ts +15 -0
  74. package/dist/pipeline/migration.d.ts.map +1 -0
  75. package/dist/pipeline/migration.js +76 -0
  76. package/dist/pipeline/migration.js.map +1 -0
  77. package/dist/pipeline/orchestrator.d.ts +28 -0
  78. package/dist/pipeline/orchestrator.d.ts.map +1 -0
  79. package/dist/pipeline/orchestrator.js +238 -0
  80. package/dist/pipeline/orchestrator.js.map +1 -0
  81. package/dist/pipeline/packets/audit-report-builder.d.ts +11 -0
  82. package/dist/pipeline/packets/audit-report-builder.d.ts.map +1 -0
  83. package/dist/pipeline/packets/audit-report-builder.js +32 -0
  84. package/dist/pipeline/packets/audit-report-builder.js.map +1 -0
  85. package/dist/pipeline/packets/consensus-packet-builder.d.ts +35 -0
  86. package/dist/pipeline/packets/consensus-packet-builder.d.ts.map +1 -0
  87. package/dist/pipeline/packets/consensus-packet-builder.js +80 -0
  88. package/dist/pipeline/packets/consensus-packet-builder.js.map +1 -0
  89. package/dist/pipeline/packets/index.d.ts +12 -0
  90. package/dist/pipeline/packets/index.d.ts.map +1 -0
  91. package/dist/pipeline/packets/index.js +8 -0
  92. package/dist/pipeline/packets/index.js.map +1 -0
  93. package/dist/pipeline/packets/plan-packet-builder.d.ts +21 -0
  94. package/dist/pipeline/packets/plan-packet-builder.d.ts.map +1 -0
  95. package/dist/pipeline/packets/plan-packet-builder.js +27 -0
  96. package/dist/pipeline/packets/plan-packet-builder.js.map +1 -0
  97. package/dist/pipeline/packets/rca-packet-builder.d.ts +19 -0
  98. package/dist/pipeline/packets/rca-packet-builder.d.ts.map +1 -0
  99. package/dist/pipeline/packets/rca-packet-builder.js +22 -0
  100. package/dist/pipeline/packets/rca-packet-builder.js.map +1 -0
  101. package/dist/pipeline/phases/architecture.d.ts +7 -0
  102. package/dist/pipeline/phases/architecture.d.ts.map +1 -0
  103. package/dist/pipeline/phases/architecture.js +60 -0
  104. package/dist/pipeline/phases/architecture.js.map +1 -0
  105. package/dist/pipeline/phases/audit.d.ts +8 -0
  106. package/dist/pipeline/phases/audit.d.ts.map +1 -0
  107. package/dist/pipeline/phases/audit.js +144 -0
  108. package/dist/pipeline/phases/audit.js.map +1 -0
  109. package/dist/pipeline/phases/consensus-architecture.d.ts +7 -0
  110. package/dist/pipeline/phases/consensus-architecture.d.ts.map +1 -0
  111. package/dist/pipeline/phases/consensus-architecture.js +84 -0
  112. package/dist/pipeline/phases/consensus-architecture.js.map +1 -0
  113. package/dist/pipeline/phases/consensus-master-plan.d.ts +7 -0
  114. package/dist/pipeline/phases/consensus-master-plan.d.ts.map +1 -0
  115. package/dist/pipeline/phases/consensus-master-plan.js +81 -0
  116. package/dist/pipeline/phases/consensus-master-plan.js.map +1 -0
  117. package/dist/pipeline/phases/consensus-role-plans.d.ts +7 -0
  118. package/dist/pipeline/phases/consensus-role-plans.d.ts.map +1 -0
  119. package/dist/pipeline/phases/consensus-role-plans.js +85 -0
  120. package/dist/pipeline/phases/consensus-role-plans.js.map +1 -0
  121. package/dist/pipeline/phases/done.d.ts +7 -0
  122. package/dist/pipeline/phases/done.d.ts.map +1 -0
  123. package/dist/pipeline/phases/done.js +45 -0
  124. package/dist/pipeline/phases/done.js.map +1 -0
  125. package/dist/pipeline/phases/implementation.d.ts +8 -0
  126. package/dist/pipeline/phases/implementation.d.ts.map +1 -0
  127. package/dist/pipeline/phases/implementation.js +42 -0
  128. package/dist/pipeline/phases/implementation.js.map +1 -0
  129. package/dist/pipeline/phases/index.d.ts +20 -0
  130. package/dist/pipeline/phases/index.d.ts.map +1 -0
  131. package/dist/pipeline/phases/index.js +19 -0
  132. package/dist/pipeline/phases/index.js.map +1 -0
  133. package/dist/pipeline/phases/intake.d.ts +8 -0
  134. package/dist/pipeline/phases/intake.d.ts.map +1 -0
  135. package/dist/pipeline/phases/intake.js +40 -0
  136. package/dist/pipeline/phases/intake.js.map +1 -0
  137. package/dist/pipeline/phases/phase-context.d.ts +30 -0
  138. package/dist/pipeline/phases/phase-context.d.ts.map +1 -0
  139. package/dist/pipeline/phases/phase-context.js +33 -0
  140. package/dist/pipeline/phases/phase-context.js.map +1 -0
  141. package/dist/pipeline/phases/production-gate.d.ts +8 -0
  142. package/dist/pipeline/phases/production-gate.d.ts.map +1 -0
  143. package/dist/pipeline/phases/production-gate.js +84 -0
  144. package/dist/pipeline/phases/production-gate.js.map +1 -0
  145. package/dist/pipeline/phases/qa-validation.d.ts +7 -0
  146. package/dist/pipeline/phases/qa-validation.d.ts.map +1 -0
  147. package/dist/pipeline/phases/qa-validation.js +50 -0
  148. package/dist/pipeline/phases/qa-validation.js.map +1 -0
  149. package/dist/pipeline/phases/recovery-loop.d.ts +7 -0
  150. package/dist/pipeline/phases/recovery-loop.d.ts.map +1 -0
  151. package/dist/pipeline/phases/recovery-loop.js +91 -0
  152. package/dist/pipeline/phases/recovery-loop.js.map +1 -0
  153. package/dist/pipeline/phases/review.d.ts +8 -0
  154. package/dist/pipeline/phases/review.d.ts.map +1 -0
  155. package/dist/pipeline/phases/review.js +127 -0
  156. package/dist/pipeline/phases/review.js.map +1 -0
  157. package/dist/pipeline/phases/role-planning.d.ts +7 -0
  158. package/dist/pipeline/phases/role-planning.d.ts.map +1 -0
  159. package/dist/pipeline/phases/role-planning.js +75 -0
  160. package/dist/pipeline/phases/role-planning.js.map +1 -0
  161. package/dist/pipeline/phases/stuck.d.ts +7 -0
  162. package/dist/pipeline/phases/stuck.d.ts.map +1 -0
  163. package/dist/pipeline/phases/stuck.js +51 -0
  164. package/dist/pipeline/phases/stuck.js.map +1 -0
  165. package/dist/pipeline/repo-snapshot.d.ts +24 -0
  166. package/dist/pipeline/repo-snapshot.d.ts.map +1 -0
  167. package/dist/pipeline/repo-snapshot.js +343 -0
  168. package/dist/pipeline/repo-snapshot.js.map +1 -0
  169. package/dist/pipeline/role-execution-adapter.d.ts +59 -0
  170. package/dist/pipeline/role-execution-adapter.d.ts.map +1 -0
  171. package/dist/pipeline/role-execution-adapter.js +159 -0
  172. package/dist/pipeline/role-execution-adapter.js.map +1 -0
  173. package/dist/pipeline/skill-loader.d.ts +34 -0
  174. package/dist/pipeline/skill-loader.d.ts.map +1 -0
  175. package/dist/pipeline/skill-loader.js +156 -0
  176. package/dist/pipeline/skill-loader.js.map +1 -0
  177. package/dist/pipeline/skills/defaults.d.ts +16 -0
  178. package/dist/pipeline/skills/defaults.d.ts.map +1 -0
  179. package/dist/pipeline/skills/defaults.js +189 -0
  180. package/dist/pipeline/skills/defaults.js.map +1 -0
  181. package/dist/pipeline/type-defs/artifacts.d.ts +202 -0
  182. package/dist/pipeline/type-defs/artifacts.d.ts.map +1 -0
  183. package/dist/pipeline/type-defs/artifacts.js +66 -0
  184. package/dist/pipeline/type-defs/artifacts.js.map +1 -0
  185. package/dist/pipeline/type-defs/audit.d.ts +256 -0
  186. package/dist/pipeline/type-defs/audit.d.ts.map +1 -0
  187. package/dist/pipeline/type-defs/audit.js +54 -0
  188. package/dist/pipeline/type-defs/audit.js.map +1 -0
  189. package/dist/pipeline/type-defs/checks.d.ts +81 -0
  190. package/dist/pipeline/type-defs/checks.d.ts.map +1 -0
  191. package/dist/pipeline/type-defs/checks.js +38 -0
  192. package/dist/pipeline/type-defs/checks.js.map +1 -0
  193. package/dist/pipeline/type-defs/enums.d.ts +43 -0
  194. package/dist/pipeline/type-defs/enums.d.ts.map +1 -0
  195. package/dist/pipeline/type-defs/enums.js +55 -0
  196. package/dist/pipeline/type-defs/enums.js.map +1 -0
  197. package/dist/pipeline/type-defs/index.d.ts +12 -0
  198. package/dist/pipeline/type-defs/index.d.ts.map +1 -0
  199. package/dist/pipeline/type-defs/index.js +12 -0
  200. package/dist/pipeline/type-defs/index.js.map +1 -0
  201. package/dist/pipeline/type-defs/packets.d.ts +806 -0
  202. package/dist/pipeline/type-defs/packets.d.ts.map +1 -0
  203. package/dist/pipeline/type-defs/packets.js +109 -0
  204. package/dist/pipeline/type-defs/packets.js.map +1 -0
  205. package/dist/pipeline/type-defs/snapshot.d.ts +52 -0
  206. package/dist/pipeline/type-defs/snapshot.d.ts.map +1 -0
  207. package/dist/pipeline/type-defs/snapshot.js +35 -0
  208. package/dist/pipeline/type-defs/snapshot.js.map +1 -0
  209. package/dist/pipeline/type-defs/state.d.ts +449 -0
  210. package/dist/pipeline/type-defs/state.d.ts.map +1 -0
  211. package/dist/pipeline/type-defs/state.js +88 -0
  212. package/dist/pipeline/type-defs/state.js.map +1 -0
  213. package/dist/pipeline/types.d.ts +16 -0
  214. package/dist/pipeline/types.d.ts.map +1 -0
  215. package/dist/pipeline/types.js +16 -0
  216. package/dist/pipeline/types.js.map +1 -0
  217. package/dist/types/audit.d.ts +6 -6
  218. package/dist/workflow/index.d.ts.map +1 -1
  219. package/dist/workflow/index.js +48 -0
  220. package/dist/workflow/index.js.map +1 -1
  221. package/package.json +1 -1
  222. package/skills/ARBITRATOR.md +137 -0
  223. package/skills/ARCHITECT.md +167 -0
  224. package/skills/AUDITOR.md +128 -0
  225. package/skills/AUDIT_REPORT_SCHEMA.md +20 -0
  226. package/skills/BACKEND_PROGRAMMER.md +95 -0
  227. package/skills/CONSENSUS_PACKET_SCHEMA.md +166 -0
  228. package/skills/DB_EXPERT.md +106 -0
  229. package/skills/DEBUGGER.md +286 -0
  230. package/skills/DISPATCHER.md +157 -0
  231. package/skills/FRONTEND_PROGRAMMER.md +84 -0
  232. package/skills/JOURNALIST.md +247 -0
  233. package/skills/MARKETING_EXPERT.md +23 -0
  234. package/skills/PHASE_GATE_ENGINE_SPEC.md +171 -0
  235. package/skills/PLAN_PACKET_SCHEMA.md +222 -0
  236. package/skills/POPEYE_CONSTITUTION.md +177 -0
  237. package/skills/POPEYE_FULL_AUTONOMY_PIPELINE.md +537 -0
  238. package/skills/PRODUCTION_READINESS_SCHEMA.md +19 -0
  239. package/skills/QA_TESTER.md +40 -0
  240. package/skills/RCA_PACKET_SCHEMA.md +22 -0
  241. package/skills/RELEASE_MANAGER.md +60 -0
  242. package/skills/REVIEWER.md +133 -0
  243. package/skills/SOCIAL_EXPERT.md +22 -0
  244. package/skills/UI_UX_SPECIALIST.md +22 -0
  245. package/skills/WEBSITE_PROGRAMMER.md +37 -0
  246. package/src/cli/commands/debug-context.ts +265 -0
  247. package/src/cli/commands/debug-prompts.ts +91 -0
  248. package/src/cli/commands/debug.ts +662 -0
  249. package/src/cli/commands/index.ts +1 -0
  250. package/src/cli/index.ts +2 -0
  251. package/src/cli/interactive.ts +27 -0
  252. package/src/generators/all.ts +2 -0
  253. package/src/generators/templates/database-docker.ts +10 -0
  254. package/src/generators/templates/fullstack.ts +6 -2
  255. package/src/pipeline/artifact-manager.ts +339 -0
  256. package/src/pipeline/artifact-validators.ts +224 -0
  257. package/src/pipeline/change-request.ts +119 -0
  258. package/src/pipeline/check-runner.ts +504 -0
  259. package/src/pipeline/command-resolver.ts +168 -0
  260. package/src/pipeline/consensus/consensus-runner.ts +317 -0
  261. package/src/pipeline/constitution.ts +109 -0
  262. package/src/pipeline/gate-engine.ts +347 -0
  263. package/src/pipeline/index.ts +82 -0
  264. package/src/pipeline/migration.ts +91 -0
  265. package/src/pipeline/orchestrator.ts +314 -0
  266. package/src/pipeline/packets/audit-report-builder.ts +47 -0
  267. package/src/pipeline/packets/consensus-packet-builder.ts +112 -0
  268. package/src/pipeline/packets/index.ts +15 -0
  269. package/src/pipeline/packets/plan-packet-builder.ts +52 -0
  270. package/src/pipeline/packets/rca-packet-builder.ts +38 -0
  271. package/src/pipeline/phases/architecture.ts +73 -0
  272. package/src/pipeline/phases/audit.ts +193 -0
  273. package/src/pipeline/phases/consensus-architecture.ts +104 -0
  274. package/src/pipeline/phases/consensus-master-plan.ts +100 -0
  275. package/src/pipeline/phases/consensus-role-plans.ts +105 -0
  276. package/src/pipeline/phases/done.ts +68 -0
  277. package/src/pipeline/phases/implementation.ts +48 -0
  278. package/src/pipeline/phases/index.ts +21 -0
  279. package/src/pipeline/phases/intake.ts +54 -0
  280. package/src/pipeline/phases/phase-context.ts +86 -0
  281. package/src/pipeline/phases/production-gate.ts +113 -0
  282. package/src/pipeline/phases/qa-validation.ts +63 -0
  283. package/src/pipeline/phases/recovery-loop.ts +118 -0
  284. package/src/pipeline/phases/review.ts +149 -0
  285. package/src/pipeline/phases/role-planning.ts +92 -0
  286. package/src/pipeline/phases/stuck.ts +62 -0
  287. package/src/pipeline/repo-snapshot.ts +395 -0
  288. package/src/pipeline/role-execution-adapter.ts +238 -0
  289. package/src/pipeline/skill-loader.ts +192 -0
  290. package/src/pipeline/skills/defaults.ts +215 -0
  291. package/src/pipeline/type-defs/artifacts.ts +81 -0
  292. package/src/pipeline/type-defs/audit.ts +67 -0
  293. package/src/pipeline/type-defs/checks.ts +47 -0
  294. package/src/pipeline/type-defs/enums.ts +62 -0
  295. package/src/pipeline/type-defs/index.ts +12 -0
  296. package/src/pipeline/type-defs/packets.ts +131 -0
  297. package/src/pipeline/type-defs/snapshot.ts +55 -0
  298. package/src/pipeline/type-defs/state.ts +165 -0
  299. package/src/pipeline/types.ts +16 -0
  300. package/src/workflow/index.ts +48 -0
  301. package/tests/cli/commands/debug.test.ts +376 -0
  302. package/tests/pipeline/artifact-manager.test.ts +183 -0
  303. package/tests/pipeline/artifact-validators.test.ts +207 -0
  304. package/tests/pipeline/change-request.test.ts +180 -0
  305. package/tests/pipeline/check-runner.test.ts +157 -0
  306. package/tests/pipeline/command-resolver.test.ts +159 -0
  307. package/tests/pipeline/consensus-runner.test.ts +206 -0
  308. package/tests/pipeline/consensus-scoring.test.ts +163 -0
  309. package/tests/pipeline/constitution.test.ts +122 -0
  310. package/tests/pipeline/gate-engine.test.ts +195 -0
  311. package/tests/pipeline/migration.test.ts +133 -0
  312. package/tests/pipeline/orchestrator.test.ts +614 -0
  313. package/tests/pipeline/packets/builders.test.ts +347 -0
  314. package/tests/pipeline/repo-snapshot.test.ts +189 -0
  315. package/tests/pipeline/role-execution-adapter.test.ts +299 -0
  316. package/tests/pipeline/skill-loader.test.ts +186 -0
  317. package/tests/pipeline/start-env-checks.test.ts +123 -0
  318. package/tests/pipeline/types.test.ts +156 -0
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Change Request mechanism — structured change tracking for mid-pipeline modifications.
3
+ * CRs are created when drift is detected (REVIEW) or architectural issues found (AUDIT).
4
+ * Each CR routes to the appropriate consensus phase for approval.
5
+ */
6
+ import type { PipelinePhase, PipelineRole, ArtifactRef, ChangeRequest } from './types.js';
7
+ export interface BuildChangeRequestArgs {
8
+ originPhase: PipelinePhase;
9
+ requestedBy: PipelineRole;
10
+ changeType: ChangeRequest['change_type'];
11
+ description: string;
12
+ justification: string;
13
+ affectedArtifacts: ArtifactRef[];
14
+ affectedPhases: PipelinePhase[];
15
+ riskLevel: 'low' | 'medium' | 'high';
16
+ }
17
+ /**
18
+ * Build a change request with generated ID and timestamp.
19
+ *
20
+ * Args:
21
+ * args: Change request parameters.
22
+ *
23
+ * Returns:
24
+ * A fully formed ChangeRequest in 'proposed' status.
25
+ */
26
+ export declare function buildChangeRequest(args: BuildChangeRequestArgs): ChangeRequest;
27
+ /**
28
+ * Determine which consensus phase should review a change request.
29
+ *
30
+ * Args:
31
+ * cr: The change request to route.
32
+ *
33
+ * Returns:
34
+ * The pipeline phase that should handle the CR approval.
35
+ */
36
+ export declare function routeChangeRequest(cr: ChangeRequest): PipelinePhase;
37
+ /**
38
+ * Format a change request as markdown for inclusion in artifacts.
39
+ *
40
+ * Args:
41
+ * cr: The change request to format.
42
+ *
43
+ * Returns:
44
+ * Markdown-formatted string.
45
+ */
46
+ export declare function formatChangeRequest(cr: ChangeRequest): string;
47
+ //# sourceMappingURL=change-request.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"change-request.d.ts","sourceRoot":"","sources":["../../src/pipeline/change-request.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EACV,aAAa,EACb,YAAY,EACZ,WAAW,EACX,aAAa,EACd,MAAM,YAAY,CAAC;AAIpB,MAAM,WAAW,sBAAsB;IACrC,WAAW,EAAE,aAAa,CAAC;IAC3B,WAAW,EAAE,YAAY,CAAC;IAC1B,UAAU,EAAE,aAAa,CAAC,aAAa,CAAC,CAAC;IACzC,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,WAAW,EAAE,CAAC;IACjC,cAAc,EAAE,aAAa,EAAE,CAAC;IAChC,SAAS,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;CACtC;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,sBAAsB,GAAG,aAAa,CAgB9E;AAaD;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,aAAa,GAAG,aAAa,CAEnE;AAID;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,aAAa,GAAG,MAAM,CA4B7D"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * Change Request mechanism — structured change tracking for mid-pipeline modifications.
3
+ * CRs are created when drift is detected (REVIEW) or architectural issues found (AUDIT).
4
+ * Each CR routes to the appropriate consensus phase for approval.
5
+ */
6
+ import { randomUUID } from 'node:crypto';
7
+ /**
8
+ * Build a change request with generated ID and timestamp.
9
+ *
10
+ * Args:
11
+ * args: Change request parameters.
12
+ *
13
+ * Returns:
14
+ * A fully formed ChangeRequest in 'proposed' status.
15
+ */
16
+ export function buildChangeRequest(args) {
17
+ return {
18
+ cr_id: `CR-${randomUUID().split('-')[0].toUpperCase()}`,
19
+ timestamp: new Date().toISOString(),
20
+ origin_phase: args.originPhase,
21
+ requested_by: args.requestedBy,
22
+ change_type: args.changeType,
23
+ description: args.description,
24
+ justification: args.justification,
25
+ impact_analysis: {
26
+ affected_artifacts: args.affectedArtifacts,
27
+ affected_phases: args.affectedPhases,
28
+ risk_level: args.riskLevel,
29
+ },
30
+ status: 'proposed',
31
+ };
32
+ }
33
+ // ─── CR Routing ──────────────────────────────────────────
34
+ /** Maps change types to the consensus phase that must approve them */
35
+ const CHANGE_TYPE_ROUTING = {
36
+ scope: 'CONSENSUS_MASTER_PLAN',
37
+ architecture: 'CONSENSUS_ARCHITECTURE',
38
+ dependency: 'CONSENSUS_ROLE_PLANS',
39
+ config: 'QA_VALIDATION',
40
+ requirement: 'CONSENSUS_MASTER_PLAN',
41
+ };
42
+ /**
43
+ * Determine which consensus phase should review a change request.
44
+ *
45
+ * Args:
46
+ * cr: The change request to route.
47
+ *
48
+ * Returns:
49
+ * The pipeline phase that should handle the CR approval.
50
+ */
51
+ export function routeChangeRequest(cr) {
52
+ return CHANGE_TYPE_ROUTING[cr.change_type];
53
+ }
54
+ // ─── CR Formatting ───────────────────────────────────────
55
+ /**
56
+ * Format a change request as markdown for inclusion in artifacts.
57
+ *
58
+ * Args:
59
+ * cr: The change request to format.
60
+ *
61
+ * Returns:
62
+ * Markdown-formatted string.
63
+ */
64
+ export function formatChangeRequest(cr) {
65
+ const lines = [
66
+ `# Change Request ${cr.cr_id}`,
67
+ '',
68
+ `**Status:** ${cr.status}`,
69
+ `**Type:** ${cr.change_type}`,
70
+ `**Origin Phase:** ${cr.origin_phase}`,
71
+ `**Requested By:** ${cr.requested_by}`,
72
+ `**Risk Level:** ${cr.impact_analysis.risk_level}`,
73
+ `**Timestamp:** ${cr.timestamp}`,
74
+ '',
75
+ '## Description',
76
+ cr.description,
77
+ '',
78
+ '## Justification',
79
+ cr.justification,
80
+ '',
81
+ '## Impact Analysis',
82
+ `- Affected phases: ${cr.impact_analysis.affected_phases.join(', ')}`,
83
+ `- Affected artifacts: ${cr.impact_analysis.affected_artifacts.length}`,
84
+ `- Risk level: ${cr.impact_analysis.risk_level}`,
85
+ ];
86
+ if (cr.approval_artifact) {
87
+ lines.push('', `## Approval: ${cr.approval_artifact.artifact_id}`);
88
+ }
89
+ return lines.join('\n');
90
+ }
91
+ //# sourceMappingURL=change-request.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"change-request.js","sourceRoot":"","sources":["../../src/pipeline/change-request.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAsBzC;;;;;;;;GAQG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAA4B;IAC7D,OAAO;QACL,KAAK,EAAE,MAAM,UAAU,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,EAAE;QACvD,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,YAAY,EAAE,IAAI,CAAC,WAAW;QAC9B,YAAY,EAAE,IAAI,CAAC,WAAW;QAC9B,WAAW,EAAE,IAAI,CAAC,UAAU;QAC5B,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,aAAa,EAAE,IAAI,CAAC,aAAa;QACjC,eAAe,EAAE;YACf,kBAAkB,EAAE,IAAI,CAAC,iBAAiB;YAC1C,eAAe,EAAE,IAAI,CAAC,cAAc;YACpC,UAAU,EAAE,IAAI,CAAC,SAAS;SAC3B;QACD,MAAM,EAAE,UAAU;KACnB,CAAC;AACJ,CAAC;AAED,4DAA4D;AAE5D,sEAAsE;AACtE,MAAM,mBAAmB,GAAwD;IAC/E,KAAK,EAAE,uBAAuB;IAC9B,YAAY,EAAE,wBAAwB;IACtC,UAAU,EAAE,sBAAsB;IAClC,MAAM,EAAE,eAAe;IACvB,WAAW,EAAE,uBAAuB;CACrC,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,UAAU,kBAAkB,CAAC,EAAiB;IAClD,OAAO,mBAAmB,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC;AAC7C,CAAC;AAED,4DAA4D;AAE5D;;;;;;;;GAQG;AACH,MAAM,UAAU,mBAAmB,CAAC,EAAiB;IACnD,MAAM,KAAK,GAAG;QACZ,oBAAoB,EAAE,CAAC,KAAK,EAAE;QAC9B,EAAE;QACF,eAAe,EAAE,CAAC,MAAM,EAAE;QAC1B,aAAa,EAAE,CAAC,WAAW,EAAE;QAC7B,qBAAqB,EAAE,CAAC,YAAY,EAAE;QACtC,qBAAqB,EAAE,CAAC,YAAY,EAAE;QACtC,mBAAmB,EAAE,CAAC,eAAe,CAAC,UAAU,EAAE;QAClD,kBAAkB,EAAE,CAAC,SAAS,EAAE;QAChC,EAAE;QACF,gBAAgB;QAChB,EAAE,CAAC,WAAW;QACd,EAAE;QACF,kBAAkB;QAClB,EAAE,CAAC,aAAa;QAChB,EAAE;QACF,oBAAoB;QACpB,sBAAsB,EAAE,CAAC,eAAe,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;QACrE,yBAAyB,EAAE,CAAC,eAAe,CAAC,kBAAkB,CAAC,MAAM,EAAE;QACvE,iBAAiB,EAAE,CAAC,eAAe,CAAC,UAAU,EAAE;KACjD,CAAC;IAEF,IAAI,EAAE,CAAC,iBAAiB,EAAE,CAAC;QACzB,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,gBAAgB,EAAE,CAAC,iBAAiB,CAAC,WAAW,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Check Runner — executes build/test/lint/typecheck commands
3
+ * and produces GateCheckResult artifacts.
4
+ *
5
+ * Safety: command sanitization, cwd enforcement, stream caps,
6
+ * configurable timeouts (P2-G).
7
+ */
8
+ import type { GateCheckResult, GateCheckType, ResolvedCommands, RepoSnapshot, ArtifactEntry, PipelinePhase } from './types.js';
9
+ import { ArtifactManager } from './artifact-manager.js';
10
+ /** Execute a single check command */
11
+ export declare function runCheck(checkType: GateCheckType, command: string, projectDir: string, timeoutOverride?: number): Promise<GateCheckResult>;
12
+ /** Run all applicable checks based on resolved commands */
13
+ export declare function runAllChecks(resolvedCommands: ResolvedCommands, projectDir: string): Promise<GateCheckResult[]>;
14
+ /** Store check results as artifacts */
15
+ export declare function storeCheckResults(results: GateCheckResult[], artifactManager: ArtifactManager, phase: PipelinePhase): ArtifactEntry[];
16
+ /** Scan project for placeholder/TODO/mock content */
17
+ export declare function runPlaceholderScan(projectDir: string, allowlistPath?: string): GateCheckResult;
18
+ /**
19
+ * Attempt to start the application and verify it does not crash immediately.
20
+ * Optionally checks a health endpoint if a port is detected.
21
+ *
22
+ * Args:
23
+ * startCommand: The command to start the app (e.g., "npm run start").
24
+ * projectDir: Project root directory.
25
+ * options: Optional port, health path, and timeout.
26
+ *
27
+ * Returns:
28
+ * GateCheckResult with pass/fail status.
29
+ */
30
+ export declare function runStartCheck(startCommand: string, projectDir: string, options?: {
31
+ port?: number;
32
+ healthPath?: string;
33
+ timeoutMs?: number;
34
+ }): Promise<GateCheckResult>;
35
+ /**
36
+ * Validate that required environment variables exist.
37
+ * Reads .env.example for required var names and checks .env has them set.
38
+ *
39
+ * Args:
40
+ * projectDir: Project root directory.
41
+ * _snapshot: Repo snapshot (for future use).
42
+ *
43
+ * Returns:
44
+ * GateCheckResult with pass/fail status.
45
+ */
46
+ export declare function runEnvCheck(projectDir: string, _snapshot?: RepoSnapshot): GateCheckResult;
47
+ //# sourceMappingURL=check-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-runner.d.ts","sourceRoot":"","sources":["../../src/pipeline/check-runner.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,OAAO,KAAK,EACV,eAAe,EACf,aAAa,EACb,gBAAgB,EAChB,YAAY,EACZ,aAAa,EACb,aAAa,EACd,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAuDxD,qCAAqC;AACrC,wBAAsB,QAAQ,CAC5B,SAAS,EAAE,aAAa,EACxB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,eAAe,CAAC,EAAE,MAAM,GACvB,OAAO,CAAC,eAAe,CAAC,CAuD1B;AAED,2DAA2D;AAC3D,wBAAsB,YAAY,CAChC,gBAAgB,EAAE,gBAAgB,EAClC,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,eAAe,EAAE,CAAC,CA4B5B;AAED,uCAAuC;AACvC,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,eAAe,EAAE,EAC1B,eAAe,EAAE,eAAe,EAChC,KAAK,EAAE,aAAa,GACnB,aAAa,EAAE,CAmBjB;AAiBD,qDAAqD;AACrD,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,MAAM,EAClB,aAAa,CAAC,EAAE,MAAM,GACrB,eAAe,CA+BjB;AA2DD;;;;;;;;;;;GAWG;AACH,wBAAsB,aAAa,CACjC,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GACnE,OAAO,CAAC,eAAe,CAAC,CAoE1B;AAID;;;;;;;;;;GAUG;AACH,wBAAgB,WAAW,CACzB,UAAU,EAAE,MAAM,EAClB,SAAS,CAAC,EAAE,YAAY,GACvB,eAAe,CAqEjB"}
@@ -0,0 +1,417 @@
1
+ /**
2
+ * Check Runner — executes build/test/lint/typecheck commands
3
+ * and produces GateCheckResult artifacts.
4
+ *
5
+ * Safety: command sanitization, cwd enforcement, stream caps,
6
+ * configurable timeouts (P2-G).
7
+ */
8
+ import { exec } from 'node:child_process';
9
+ import { existsSync, readFileSync, readdirSync } from 'node:fs';
10
+ import { join, extname } from 'node:path';
11
+ // ─── Constants ───────────────────────────────────────────
12
+ /** Default timeout per check type in milliseconds */
13
+ const DEFAULT_TIMEOUTS = {
14
+ build: 20 * 60 * 1000, // 20 minutes
15
+ test: 10 * 60 * 1000, // 10 minutes
16
+ lint: 5 * 60 * 1000, // 5 minutes
17
+ typecheck: 5 * 60 * 1000, // 5 minutes
18
+ migration: 5 * 60 * 1000, // 5 minutes
19
+ };
20
+ /** Max stdout/stderr capture in bytes */
21
+ const MAX_OUTPUT_SIZE = 1024 * 1024; // 1 MB
22
+ /** Dangerous command patterns to reject */
23
+ const DANGEROUS_PATTERNS = [
24
+ /rm\s+-rf\s+\//,
25
+ /sudo\s+/,
26
+ />\s*\/dev\//,
27
+ />\s*\/etc\//,
28
+ />\s*\/usr\//,
29
+ /;\s*rm\s/,
30
+ /&&\s*rm\s/,
31
+ /\|\s*sh$/,
32
+ /\|\s*bash$/,
33
+ ];
34
+ /** Placeholder patterns for scanning */
35
+ const PLACEHOLDER_PATTERNS = [
36
+ /\bTODO\b/i,
37
+ /\bFIXME\b/i,
38
+ /\bHACK\b/i,
39
+ /\bXXX\b/i,
40
+ /placeholder/i,
41
+ /\bmock\b(?!\.)/i, // 'mock' but not 'mock.' (import paths)
42
+ /\btemp\b(?!late)/i, // 'temp' but not 'template'
43
+ /lorem ipsum/i,
44
+ /example\.com/i,
45
+ ];
46
+ // ─── Command Sanitization ────────────────────────────────
47
+ function sanitizeCommand(command) {
48
+ for (const pattern of DANGEROUS_PATTERNS) {
49
+ if (pattern.test(command)) {
50
+ return { safe: false, reason: `Matches dangerous pattern: ${pattern.source}` };
51
+ }
52
+ }
53
+ return { safe: true };
54
+ }
55
+ // ─── Check Execution ─────────────────────────────────────
56
+ /** Execute a single check command */
57
+ export async function runCheck(checkType, command, projectDir, timeoutOverride) {
58
+ const startTime = Date.now();
59
+ // Sanitize command
60
+ const { safe, reason } = sanitizeCommand(command);
61
+ if (!safe) {
62
+ return {
63
+ check_type: checkType,
64
+ status: 'fail',
65
+ command,
66
+ exit_code: -1,
67
+ stderr_summary: `Command rejected: ${reason}`,
68
+ duration_ms: 0,
69
+ timestamp: new Date().toISOString(),
70
+ };
71
+ }
72
+ const timeout = timeoutOverride ?? DEFAULT_TIMEOUTS[checkType] ?? 5 * 60 * 1000;
73
+ return new Promise((resolve) => {
74
+ const proc = exec(command, {
75
+ cwd: projectDir,
76
+ timeout,
77
+ maxBuffer: MAX_OUTPUT_SIZE,
78
+ env: {
79
+ ...process.env,
80
+ NODE_ENV: 'test',
81
+ CI: 'true',
82
+ },
83
+ }, (error, _stdout, stderr) => {
84
+ const duration = Date.now() - startTime;
85
+ const exitCode = error ? error.code ?? 1 : 0;
86
+ // Truncate output for summary
87
+ const stderrSummary = stderr
88
+ ? stderr.slice(0, 2000) + (stderr.length > 2000 ? '\n... (truncated)' : '')
89
+ : undefined;
90
+ resolve({
91
+ check_type: checkType,
92
+ status: exitCode === 0 ? 'pass' : 'fail',
93
+ command,
94
+ exit_code: typeof exitCode === 'number' ? exitCode : 1,
95
+ stdout_artifact: undefined, // Filled by storeCheckResults if needed
96
+ stderr_summary: stderrSummary,
97
+ duration_ms: duration,
98
+ timestamp: new Date().toISOString(),
99
+ });
100
+ });
101
+ // Safety: kill after timeout (backup for exec timeout)
102
+ setTimeout(() => {
103
+ try {
104
+ proc.kill('SIGTERM');
105
+ }
106
+ catch { /* already dead */ }
107
+ }, timeout + 5000);
108
+ });
109
+ }
110
+ /** Run all applicable checks based on resolved commands */
111
+ export async function runAllChecks(resolvedCommands, projectDir) {
112
+ const results = [];
113
+ const checkMap = [
114
+ ['build', resolvedCommands.build],
115
+ ['test', resolvedCommands.test],
116
+ ['lint', resolvedCommands.lint],
117
+ ['typecheck', resolvedCommands.typecheck],
118
+ ['migration', resolvedCommands.migrations],
119
+ ];
120
+ for (const [checkType, command] of checkMap) {
121
+ if (!command) {
122
+ results.push({
123
+ check_type: checkType,
124
+ status: 'skip',
125
+ command: '',
126
+ exit_code: 0,
127
+ duration_ms: 0,
128
+ timestamp: new Date().toISOString(),
129
+ });
130
+ continue;
131
+ }
132
+ const result = await runCheck(checkType, command, projectDir);
133
+ results.push(result);
134
+ }
135
+ return results;
136
+ }
137
+ /** Store check results as artifacts */
138
+ export function storeCheckResults(results, artifactManager, phase) {
139
+ const artifacts = [];
140
+ for (const result of results) {
141
+ if (result.status === 'skip')
142
+ continue;
143
+ // Only store meaningful output
144
+ const content = JSON.stringify(result, null, 2);
145
+ if (content.length > 100) {
146
+ const entry = artifactManager.createAndStoreJson(mapCheckTypeToArtifactType(result.check_type), result, phase);
147
+ artifacts.push(entry);
148
+ }
149
+ }
150
+ return artifacts;
151
+ }
152
+ function mapCheckTypeToArtifactType(checkType) {
153
+ switch (checkType) {
154
+ case 'build': return 'build_check';
155
+ case 'test': return 'test_check';
156
+ case 'lint': return 'lint_check';
157
+ case 'typecheck': return 'typecheck_check';
158
+ case 'placeholder_scan': return 'placeholder_scan';
159
+ default: return 'build_check';
160
+ }
161
+ }
162
+ // ─── Placeholder Scanner (P2-2) ──────────────────────────
163
+ /** Scan project for placeholder/TODO/mock content */
164
+ export function runPlaceholderScan(projectDir, allowlistPath) {
165
+ const startTime = Date.now();
166
+ const findings = [];
167
+ // Load allowlist if present
168
+ const allowlist = loadAllowlist(allowlistPath ?? join(projectDir, '.popeye-placeholder-allowlist'));
169
+ // Scan source directories
170
+ const scanDirs = ['src', 'app', 'pages', 'components', 'lib', 'server', 'api'];
171
+ for (const dir of scanDirs) {
172
+ const fullDir = join(projectDir, dir);
173
+ if (!existsSync(fullDir))
174
+ continue;
175
+ scanDirForPlaceholders(fullDir, projectDir, allowlist, findings);
176
+ }
177
+ const duration = Date.now() - startTime;
178
+ return {
179
+ check_type: 'placeholder_scan',
180
+ status: findings.length > 0 ? 'fail' : 'pass',
181
+ command: 'placeholder-scan',
182
+ exit_code: findings.length > 0 ? 1 : 0,
183
+ stderr_summary: findings.length > 0
184
+ ? `Found ${findings.length} placeholder(s):\n${findings.slice(0, 20).join('\n')}`
185
+ : undefined,
186
+ duration_ms: duration,
187
+ timestamp: new Date().toISOString(),
188
+ };
189
+ }
190
+ function scanDirForPlaceholders(dir, projectDir, allowlist, findings) {
191
+ const codeExts = new Set(['.ts', '.tsx', '.js', '.jsx', '.py', '.go', '.rs']);
192
+ try {
193
+ const entries = readdirSync(dir, { withFileTypes: true });
194
+ for (const entry of entries) {
195
+ if (entry.name.startsWith('.') || entry.name === 'node_modules')
196
+ continue;
197
+ const fullPath = join(dir, entry.name);
198
+ if (entry.isDirectory()) {
199
+ scanDirForPlaceholders(fullPath, projectDir, allowlist, findings);
200
+ }
201
+ else if (codeExts.has(extname(entry.name))) {
202
+ const relativePath = fullPath.replace(projectDir + '/', '');
203
+ if (allowlist.has(relativePath))
204
+ continue;
205
+ try {
206
+ const content = readFileSync(fullPath, 'utf-8');
207
+ const lines = content.split('\n');
208
+ for (let i = 0; i < lines.length; i++) {
209
+ for (const pattern of PLACEHOLDER_PATTERNS) {
210
+ if (pattern.test(lines[i])) {
211
+ findings.push(`${relativePath}:${i + 1}: ${lines[i].trim().slice(0, 80)}`);
212
+ break; // One finding per line
213
+ }
214
+ }
215
+ }
216
+ }
217
+ catch {
218
+ // Skip unreadable files
219
+ }
220
+ }
221
+ }
222
+ }
223
+ catch {
224
+ // Skip unreadable directories
225
+ }
226
+ }
227
+ function loadAllowlist(path) {
228
+ if (!existsSync(path))
229
+ return new Set();
230
+ try {
231
+ const content = readFileSync(path, 'utf-8');
232
+ return new Set(content.split('\n').map((l) => l.trim()).filter((l) => l && !l.startsWith('#')));
233
+ }
234
+ catch {
235
+ return new Set();
236
+ }
237
+ }
238
+ // ─── Start Check (v1.1 Gap #5) ──────────────────────────
239
+ /**
240
+ * Attempt to start the application and verify it does not crash immediately.
241
+ * Optionally checks a health endpoint if a port is detected.
242
+ *
243
+ * Args:
244
+ * startCommand: The command to start the app (e.g., "npm run start").
245
+ * projectDir: Project root directory.
246
+ * options: Optional port, health path, and timeout.
247
+ *
248
+ * Returns:
249
+ * GateCheckResult with pass/fail status.
250
+ */
251
+ export async function runStartCheck(startCommand, projectDir, options) {
252
+ const startTime = Date.now();
253
+ const timeout = options?.timeoutMs ?? 15000;
254
+ // Sanitize command
255
+ const { safe, reason } = sanitizeCommand(startCommand);
256
+ if (!safe) {
257
+ return {
258
+ check_type: 'start',
259
+ status: 'fail',
260
+ command: startCommand,
261
+ exit_code: -1,
262
+ stderr_summary: `Command rejected: ${reason}`,
263
+ duration_ms: 0,
264
+ timestamp: new Date().toISOString(),
265
+ };
266
+ }
267
+ return new Promise((resolve) => {
268
+ let stderr = '';
269
+ let resolved = false;
270
+ const proc = exec(startCommand, {
271
+ cwd: projectDir,
272
+ timeout: timeout + 5000,
273
+ maxBuffer: MAX_OUTPUT_SIZE,
274
+ env: { ...process.env, NODE_ENV: 'production' },
275
+ }, (error, _stdout, stderrOutput) => {
276
+ if (resolved)
277
+ return;
278
+ resolved = true;
279
+ const duration = Date.now() - startTime;
280
+ stderr = stderrOutput ?? '';
281
+ // Process exited — if it exited within timeout, it crashed
282
+ resolve({
283
+ check_type: 'start',
284
+ status: 'fail',
285
+ command: startCommand,
286
+ exit_code: error ? (typeof error.code === 'number'
287
+ ? error.code
288
+ : 1) : 0,
289
+ stderr_summary: stderr ? stderr.slice(0, 2000) : 'Process exited prematurely',
290
+ duration_ms: duration,
291
+ timestamp: new Date().toISOString(),
292
+ });
293
+ });
294
+ // If process survives for the timeout period, consider it passing
295
+ setTimeout(() => {
296
+ if (resolved)
297
+ return;
298
+ resolved = true;
299
+ // Kill the process
300
+ try {
301
+ proc.kill('SIGTERM');
302
+ }
303
+ catch { /* already dead */ }
304
+ const duration = Date.now() - startTime;
305
+ resolve({
306
+ check_type: 'start',
307
+ status: 'pass',
308
+ command: startCommand,
309
+ exit_code: 0,
310
+ stderr_summary: stderr ? stderr.slice(0, 500) : undefined,
311
+ duration_ms: duration,
312
+ timestamp: new Date().toISOString(),
313
+ });
314
+ }, timeout);
315
+ });
316
+ }
317
+ // ─── Env Check (v1.1 Gap #5) ────────────────────────────
318
+ /**
319
+ * Validate that required environment variables exist.
320
+ * Reads .env.example for required var names and checks .env has them set.
321
+ *
322
+ * Args:
323
+ * projectDir: Project root directory.
324
+ * _snapshot: Repo snapshot (for future use).
325
+ *
326
+ * Returns:
327
+ * GateCheckResult with pass/fail status.
328
+ */
329
+ export function runEnvCheck(projectDir, _snapshot) {
330
+ const startTime = Date.now();
331
+ const examplePath = join(projectDir, '.env.example');
332
+ const envPath = join(projectDir, '.env');
333
+ const missingVars = [];
334
+ const emptyVars = [];
335
+ // If no .env.example, skip check
336
+ if (!existsSync(examplePath)) {
337
+ return {
338
+ check_type: 'env_check',
339
+ status: 'pass',
340
+ command: 'env-check',
341
+ exit_code: 0,
342
+ stderr_summary: 'No .env.example found — skipping env validation',
343
+ duration_ms: Date.now() - startTime,
344
+ timestamp: new Date().toISOString(),
345
+ };
346
+ }
347
+ // Parse .env.example for required var names
348
+ const exampleContent = readFileSync(examplePath, 'utf-8');
349
+ const requiredVars = parseEnvVarNames(exampleContent);
350
+ // Check .env exists
351
+ if (!existsSync(envPath)) {
352
+ return {
353
+ check_type: 'env_check',
354
+ status: 'fail',
355
+ command: 'env-check',
356
+ exit_code: 1,
357
+ stderr_summary: `.env file not found. Required vars from .env.example: ${requiredVars.join(', ')}`,
358
+ duration_ms: Date.now() - startTime,
359
+ timestamp: new Date().toISOString(),
360
+ };
361
+ }
362
+ // Parse .env and check all required vars are present and non-empty
363
+ const envContent = readFileSync(envPath, 'utf-8');
364
+ const envVars = parseEnvVarValues(envContent);
365
+ for (const varName of requiredVars) {
366
+ if (!(varName in envVars)) {
367
+ missingVars.push(varName);
368
+ }
369
+ else if (!envVars[varName]) {
370
+ emptyVars.push(varName);
371
+ }
372
+ }
373
+ const duration = Date.now() - startTime;
374
+ const hasFail = missingVars.length > 0;
375
+ const summaryParts = [];
376
+ if (missingVars.length > 0) {
377
+ summaryParts.push(`Missing vars: ${missingVars.join(', ')}`);
378
+ }
379
+ if (emptyVars.length > 0) {
380
+ summaryParts.push(`Empty vars (warning): ${emptyVars.join(', ')}`);
381
+ }
382
+ return {
383
+ check_type: 'env_check',
384
+ status: hasFail ? 'fail' : 'pass',
385
+ command: 'env-check',
386
+ exit_code: hasFail ? 1 : 0,
387
+ stderr_summary: summaryParts.length > 0 ? summaryParts.join('; ') : undefined,
388
+ duration_ms: duration,
389
+ timestamp: new Date().toISOString(),
390
+ };
391
+ }
392
+ /** Parse env var names from .env.example (lines like KEY=value or KEY=) */
393
+ function parseEnvVarNames(content) {
394
+ return content
395
+ .split('\n')
396
+ .map((line) => line.trim())
397
+ .filter((line) => line && !line.startsWith('#'))
398
+ .map((line) => line.split('=')[0].trim())
399
+ .filter((name) => name.length > 0);
400
+ }
401
+ /** Parse env vars into key-value map from .env content */
402
+ function parseEnvVarValues(content) {
403
+ const vars = {};
404
+ for (const line of content.split('\n')) {
405
+ const trimmed = line.trim();
406
+ if (!trimmed || trimmed.startsWith('#'))
407
+ continue;
408
+ const eqIndex = trimmed.indexOf('=');
409
+ if (eqIndex === -1)
410
+ continue;
411
+ const key = trimmed.slice(0, eqIndex).trim();
412
+ const value = trimmed.slice(eqIndex + 1).trim().replace(/^["']|["']$/g, '');
413
+ vars[key] = value;
414
+ }
415
+ return vars;
416
+ }
417
+ //# sourceMappingURL=check-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-runner.js","sourceRoot":"","sources":["../../src/pipeline/check-runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Command Resolver — detects project-type-specific build/test/lint/typecheck
3
+ * commands from a RepoSnapshot. Used by CheckRunner and ProductionGate.
4
+ */
5
+ import type { RepoSnapshot, ResolvedCommands } from './types.js';
6
+ export type ProjectType = 'node' | 'python' | 'mixed' | 'unknown';
7
+ export declare function detectProjectType(snapshot: RepoSnapshot): ProjectType;
8
+ export declare function resolveCommands(snapshot: RepoSnapshot, overrides?: Partial<ResolvedCommands>): ResolvedCommands;
9
+ //# sourceMappingURL=command-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-resolver.d.ts","sourceRoot":"","sources":["../../src/pipeline/command-resolver.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAIjE,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS,CAAC;AAElE,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,YAAY,GAAG,WAAW,CAUrE;AAID,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,YAAY,EACtB,SAAS,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,GACpC,gBAAgB,CAqClB"}