lastlight 0.1.8 → 0.2.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 (478) hide show
  1. package/README.md +265 -118
  2. package/agent-context/rules.md +62 -9
  3. package/agent-context/security.md +69 -0
  4. package/config/default.yaml +89 -0
  5. package/deploy/.env.production.example +20 -2
  6. package/deploy/entrypoint.sh +16 -17
  7. package/deploy/native/README.md +160 -0
  8. package/deploy/native/install.sh +110 -0
  9. package/deploy/native/lastlight.env.example +95 -0
  10. package/deploy/native/lastlight.service +50 -0
  11. package/deploy/sandbox-entrypoint.sh +59 -42
  12. package/dist/admin/auth.d.ts +1 -1
  13. package/dist/admin/auth.js +3 -1
  14. package/dist/admin/auth.js.map +1 -1
  15. package/dist/admin/chat-session-reader.d.ts +11 -14
  16. package/dist/admin/chat-session-reader.js +27 -51
  17. package/dist/admin/chat-session-reader.js.map +1 -1
  18. package/dist/admin/docker.d.ts +37 -0
  19. package/dist/admin/docker.js +86 -1
  20. package/dist/admin/docker.js.map +1 -1
  21. package/dist/admin/index.js +38 -3
  22. package/dist/admin/index.js.map +1 -1
  23. package/dist/admin/log-search.test.d.ts +1 -0
  24. package/dist/admin/log-search.test.js +78 -0
  25. package/dist/admin/log-search.test.js.map +1 -0
  26. package/dist/admin/routes.d.ts +52 -3
  27. package/dist/admin/routes.js +780 -63
  28. package/dist/admin/routes.js.map +1 -1
  29. package/dist/admin/routes.test.js +680 -14
  30. package/dist/admin/routes.test.js.map +1 -1
  31. package/dist/admin/server-logs.test.d.ts +1 -0
  32. package/dist/admin/server-logs.test.js +58 -0
  33. package/dist/admin/server-logs.test.js.map +1 -0
  34. package/dist/admin/sessions.d.ts +26 -39
  35. package/dist/admin/sessions.js +86 -310
  36. package/dist/admin/sessions.js.map +1 -1
  37. package/dist/admin/sessions.test.d.ts +1 -0
  38. package/dist/admin/sessions.test.js +78 -0
  39. package/dist/admin/sessions.test.js.map +1 -0
  40. package/dist/admin/version.d.ts +15 -0
  41. package/dist/admin/version.js +73 -0
  42. package/dist/admin/version.js.map +1 -0
  43. package/dist/admin/version.test.d.ts +1 -0
  44. package/dist/admin/version.test.js +71 -0
  45. package/dist/admin/version.test.js.map +1 -0
  46. package/dist/cli-config.d.ts +55 -0
  47. package/dist/cli-config.js +119 -0
  48. package/dist/cli-config.js.map +1 -0
  49. package/dist/cli-config.test.d.ts +1 -0
  50. package/dist/cli-config.test.js +92 -0
  51. package/dist/cli-config.test.js.map +1 -0
  52. package/dist/cli-format.d.ts +19 -0
  53. package/dist/cli-format.js +107 -0
  54. package/dist/cli-format.js.map +1 -0
  55. package/dist/cli-server.d.ts +73 -0
  56. package/dist/cli-server.js +347 -0
  57. package/dist/cli-server.js.map +1 -0
  58. package/dist/cli-server.test.d.ts +1 -0
  59. package/dist/cli-server.test.js +38 -0
  60. package/dist/cli-server.test.js.map +1 -0
  61. package/dist/cli-timeline.d.ts +35 -0
  62. package/dist/cli-timeline.js +373 -0
  63. package/dist/cli-timeline.js.map +1 -0
  64. package/dist/cli-timeline.test.d.ts +1 -0
  65. package/dist/cli-timeline.test.js +104 -0
  66. package/dist/cli-timeline.test.js.map +1 -0
  67. package/dist/cli.d.ts +0 -19
  68. package/dist/cli.js +910 -194
  69. package/dist/cli.js.map +1 -1
  70. package/dist/config-overlay.test.d.ts +1 -0
  71. package/dist/config-overlay.test.js +112 -0
  72. package/dist/config-overlay.test.js.map +1 -0
  73. package/dist/config-resolve.d.ts +28 -0
  74. package/dist/config-resolve.js +47 -0
  75. package/dist/config-resolve.js.map +1 -0
  76. package/dist/config-resolve.test.d.ts +1 -0
  77. package/dist/config-resolve.test.js +68 -0
  78. package/dist/config-resolve.test.js.map +1 -0
  79. package/dist/config.d.ts +62 -49
  80. package/dist/config.js +452 -76
  81. package/dist/config.js.map +1 -1
  82. package/dist/config.test.js +201 -32
  83. package/dist/config.test.js.map +1 -1
  84. package/dist/connectors/github-webhook.js +83 -5
  85. package/dist/connectors/github-webhook.js.map +1 -1
  86. package/dist/connectors/github-webhook.test.d.ts +1 -0
  87. package/dist/connectors/github-webhook.test.js +156 -0
  88. package/dist/connectors/github-webhook.test.js.map +1 -0
  89. package/dist/connectors/messaging/session-manager.d.ts +18 -0
  90. package/dist/connectors/messaging/session-manager.js +83 -2
  91. package/dist/connectors/messaging/session-manager.js.map +1 -1
  92. package/dist/connectors/messaging/session-manager.test.d.ts +1 -0
  93. package/dist/connectors/messaging/session-manager.test.js +144 -0
  94. package/dist/connectors/messaging/session-manager.test.js.map +1 -0
  95. package/dist/connectors/slack/connector.d.ts +9 -0
  96. package/dist/connectors/slack/connector.js +15 -0
  97. package/dist/connectors/slack/connector.js.map +1 -1
  98. package/dist/connectors/slack/mrkdwn.js +81 -0
  99. package/dist/connectors/slack/mrkdwn.js.map +1 -1
  100. package/dist/connectors/slack/mrkdwn.test.js +49 -0
  101. package/dist/connectors/slack/mrkdwn.test.js.map +1 -1
  102. package/dist/connectors/types.d.ts +1 -1
  103. package/dist/cron/fanout.d.ts +33 -0
  104. package/dist/cron/fanout.js +55 -0
  105. package/dist/cron/fanout.js.map +1 -0
  106. package/dist/cron/fanout.test.d.ts +1 -0
  107. package/dist/cron/fanout.test.js +73 -0
  108. package/dist/cron/fanout.test.js.map +1 -0
  109. package/dist/cron/jobs.d.ts +5 -0
  110. package/dist/cron/jobs.js +10 -3
  111. package/dist/cron/jobs.js.map +1 -1
  112. package/dist/cron/scheduler.d.ts +12 -0
  113. package/dist/cron/scheduler.js +27 -1
  114. package/dist/cron/scheduler.js.map +1 -1
  115. package/dist/engine/agent-executor.d.ts +158 -0
  116. package/dist/engine/agent-executor.js +1140 -0
  117. package/dist/engine/agent-executor.js.map +1 -0
  118. package/dist/engine/agent-executor.test.d.ts +1 -0
  119. package/dist/engine/agent-executor.test.js +395 -0
  120. package/dist/engine/agent-executor.test.js.map +1 -0
  121. package/dist/engine/chat-runner.d.ts +123 -0
  122. package/dist/engine/chat-runner.js +379 -0
  123. package/dist/engine/chat-runner.js.map +1 -0
  124. package/dist/engine/chat-runner.test.d.ts +1 -0
  125. package/dist/engine/chat-runner.test.js +104 -0
  126. package/dist/engine/chat-runner.test.js.map +1 -0
  127. package/dist/engine/chat-skills.d.ts +45 -0
  128. package/dist/engine/chat-skills.js +184 -0
  129. package/dist/engine/chat-skills.js.map +1 -0
  130. package/dist/engine/chat-skills.test.d.ts +1 -0
  131. package/dist/engine/chat-skills.test.js +20 -0
  132. package/dist/engine/chat-skills.test.js.map +1 -0
  133. package/dist/engine/chat.d.ts +20 -23
  134. package/dist/engine/chat.js +251 -155
  135. package/dist/engine/chat.js.map +1 -1
  136. package/dist/engine/chat.test.d.ts +1 -0
  137. package/dist/engine/chat.test.js +42 -0
  138. package/dist/engine/chat.test.js.map +1 -0
  139. package/dist/engine/classifier.d.ts +35 -2
  140. package/dist/engine/classifier.js +170 -31
  141. package/dist/engine/classifier.js.map +1 -1
  142. package/dist/engine/classifier.test.d.ts +1 -0
  143. package/dist/engine/classifier.test.js +115 -0
  144. package/dist/engine/classifier.test.js.map +1 -0
  145. package/dist/engine/dispatcher.d.ts +60 -0
  146. package/dist/engine/dispatcher.js +601 -0
  147. package/dist/engine/dispatcher.js.map +1 -0
  148. package/dist/engine/dispatcher.test.d.ts +1 -0
  149. package/dist/engine/dispatcher.test.js +511 -0
  150. package/dist/engine/dispatcher.test.js.map +1 -0
  151. package/dist/engine/event-shim.d.ts +117 -0
  152. package/dist/engine/event-shim.js +435 -0
  153. package/dist/engine/event-shim.js.map +1 -0
  154. package/dist/engine/event-shim.test.d.ts +1 -0
  155. package/dist/engine/event-shim.test.js +194 -0
  156. package/dist/engine/event-shim.test.js.map +1 -0
  157. package/dist/engine/git-auth.d.ts +13 -17
  158. package/dist/engine/git-auth.js +99 -42
  159. package/dist/engine/git-auth.js.map +1 -1
  160. package/dist/engine/git-auth.test.d.ts +1 -0
  161. package/dist/engine/git-auth.test.js +117 -0
  162. package/dist/engine/git-auth.test.js.map +1 -0
  163. package/dist/engine/github-app-client.d.ts +7 -0
  164. package/dist/engine/github-app-client.js +16 -0
  165. package/dist/engine/github-app-client.js.map +1 -0
  166. package/dist/engine/github-app-client.test.d.ts +1 -0
  167. package/dist/engine/github-app-client.test.js +44 -0
  168. package/dist/engine/github-app-client.test.js.map +1 -0
  169. package/dist/engine/github-tools.d.ts +12 -0
  170. package/dist/engine/github-tools.js +261 -0
  171. package/dist/engine/github-tools.js.map +1 -0
  172. package/dist/engine/github.d.ts +1027 -43
  173. package/dist/engine/github.js +153 -14
  174. package/dist/engine/github.js.map +1 -1
  175. package/dist/engine/llm.d.ts +47 -0
  176. package/dist/engine/llm.js +221 -0
  177. package/dist/engine/llm.js.map +1 -0
  178. package/dist/engine/llm.test.d.ts +1 -0
  179. package/dist/engine/llm.test.js +189 -0
  180. package/dist/engine/llm.test.js.map +1 -0
  181. package/dist/engine/profiles.d.ts +249 -0
  182. package/dist/engine/profiles.js +42 -0
  183. package/dist/engine/profiles.js.map +1 -0
  184. package/dist/engine/router.d.ts +12 -6
  185. package/dist/engine/router.js +339 -81
  186. package/dist/engine/router.js.map +1 -1
  187. package/dist/engine/router.test.js +428 -78
  188. package/dist/engine/router.test.js.map +1 -1
  189. package/dist/engine/screen.d.ts +41 -0
  190. package/dist/engine/screen.js +93 -0
  191. package/dist/engine/screen.js.map +1 -0
  192. package/dist/engine/screen.test.d.ts +1 -0
  193. package/dist/engine/screen.test.js +82 -0
  194. package/dist/engine/screen.test.js.map +1 -0
  195. package/dist/index.js +423 -437
  196. package/dist/index.js.map +1 -1
  197. package/dist/managed-repos.d.ts +7 -9
  198. package/dist/managed-repos.js +12 -15
  199. package/dist/managed-repos.js.map +1 -1
  200. package/dist/managed-repos.test.js +24 -19
  201. package/dist/managed-repos.test.js.map +1 -1
  202. package/dist/notify/index.d.ts +15 -0
  203. package/dist/notify/index.js +6 -0
  204. package/dist/notify/index.js.map +1 -0
  205. package/dist/notify/model.d.ts +57 -0
  206. package/dist/notify/model.js +89 -0
  207. package/dist/notify/model.js.map +1 -0
  208. package/dist/notify/model.test.d.ts +1 -0
  209. package/dist/notify/model.test.js +109 -0
  210. package/dist/notify/model.test.js.map +1 -0
  211. package/dist/notify/notifier.d.ts +17 -0
  212. package/dist/notify/notifier.js +87 -0
  213. package/dist/notify/notifier.js.map +1 -0
  214. package/dist/notify/notifier.test.d.ts +1 -0
  215. package/dist/notify/notifier.test.js +100 -0
  216. package/dist/notify/notifier.test.js.map +1 -0
  217. package/dist/notify/render.d.ts +21 -0
  218. package/dist/notify/render.js +59 -0
  219. package/dist/notify/render.js.map +1 -0
  220. package/dist/notify/render.test.d.ts +1 -0
  221. package/dist/notify/render.test.js +65 -0
  222. package/dist/notify/render.test.js.map +1 -0
  223. package/dist/notify/transports/github.d.ts +26 -0
  224. package/dist/notify/transports/github.js +26 -0
  225. package/dist/notify/transports/github.js.map +1 -0
  226. package/dist/notify/transports/slack.d.ts +26 -0
  227. package/dist/notify/transports/slack.js +28 -0
  228. package/dist/notify/transports/slack.js.map +1 -0
  229. package/dist/notify/transports.test.d.ts +1 -0
  230. package/dist/notify/transports.test.js +71 -0
  231. package/dist/notify/transports.test.js.map +1 -0
  232. package/dist/notify/types.d.ts +95 -0
  233. package/dist/notify/types.js +16 -0
  234. package/dist/notify/types.js.map +1 -0
  235. package/dist/sandbox/docker-compose.test.d.ts +1 -0
  236. package/dist/sandbox/docker-compose.test.js +128 -0
  237. package/dist/sandbox/docker-compose.test.js.map +1 -0
  238. package/dist/sandbox/docker.d.ts +97 -9
  239. package/dist/sandbox/docker.js +192 -41
  240. package/dist/sandbox/docker.js.map +1 -1
  241. package/dist/sandbox/docker.test.d.ts +1 -0
  242. package/dist/sandbox/docker.test.js +137 -0
  243. package/dist/sandbox/docker.test.js.map +1 -0
  244. package/dist/sandbox/egress-allowlist.d.ts +69 -0
  245. package/dist/sandbox/egress-allowlist.js +164 -0
  246. package/dist/sandbox/egress-allowlist.js.map +1 -0
  247. package/dist/sandbox/egress-allowlist.test.d.ts +1 -0
  248. package/dist/sandbox/egress-allowlist.test.js +65 -0
  249. package/dist/sandbox/egress-allowlist.test.js.map +1 -0
  250. package/dist/sandbox/egress-firewall-config.d.ts +127 -0
  251. package/dist/sandbox/egress-firewall-config.js +434 -0
  252. package/dist/sandbox/egress-firewall-config.js.map +1 -0
  253. package/dist/sandbox/egress-firewall-config.test.d.ts +1 -0
  254. package/dist/sandbox/egress-firewall-config.test.js +244 -0
  255. package/dist/sandbox/egress-firewall-config.test.js.map +1 -0
  256. package/dist/sandbox/images.d.ts +23 -0
  257. package/dist/sandbox/images.js +55 -0
  258. package/dist/sandbox/images.js.map +1 -0
  259. package/dist/sandbox/index.d.ts +82 -3
  260. package/dist/sandbox/index.js +223 -93
  261. package/dist/sandbox/index.js.map +1 -1
  262. package/dist/sandbox/index.test.d.ts +1 -0
  263. package/dist/sandbox/index.test.js +157 -0
  264. package/dist/sandbox/index.test.js.map +1 -0
  265. package/dist/session-log.d.ts +63 -0
  266. package/dist/session-log.js +290 -0
  267. package/dist/session-log.js.map +1 -0
  268. package/dist/session-log.test.d.ts +1 -0
  269. package/dist/session-log.test.js +85 -0
  270. package/dist/session-log.test.js.map +1 -0
  271. package/dist/setup.d.ts +31 -12
  272. package/dist/setup.js +516 -174
  273. package/dist/setup.js.map +1 -1
  274. package/dist/setup.test.js +138 -6
  275. package/dist/setup.test.js.map +1 -1
  276. package/dist/state/approval-store.d.ts +86 -0
  277. package/dist/state/approval-store.js +140 -0
  278. package/dist/state/approval-store.js.map +1 -0
  279. package/dist/state/build-assets.d.ts +50 -0
  280. package/dist/state/build-assets.js +154 -0
  281. package/dist/state/build-assets.js.map +1 -0
  282. package/dist/state/build-assets.test.d.ts +1 -0
  283. package/dist/state/build-assets.test.js +106 -0
  284. package/dist/state/build-assets.test.js.map +1 -0
  285. package/dist/state/db.d.ts +65 -333
  286. package/dist/state/db.js +112 -835
  287. package/dist/state/db.js.map +1 -1
  288. package/dist/state/db.test.js +127 -91
  289. package/dist/state/db.test.js.map +1 -1
  290. package/dist/state/execution-store.d.ts +257 -0
  291. package/dist/state/execution-store.js +527 -0
  292. package/dist/state/execution-store.js.map +1 -0
  293. package/dist/state/migrate.d.ts +15 -0
  294. package/dist/state/migrate.js +175 -0
  295. package/dist/state/migrate.js.map +1 -0
  296. package/dist/state/workflow-run-store.d.ts +195 -0
  297. package/dist/state/workflow-run-store.js +363 -0
  298. package/dist/state/workflow-run-store.js.map +1 -0
  299. package/dist/state/workflow-run-store.test.d.ts +1 -0
  300. package/dist/state/workflow-run-store.test.js +264 -0
  301. package/dist/state/workflow-run-store.test.js.map +1 -0
  302. package/dist/telemetry/index.d.ts +38 -0
  303. package/dist/telemetry/index.js +253 -0
  304. package/dist/telemetry/index.js.map +1 -0
  305. package/dist/telemetry/index.test.d.ts +1 -0
  306. package/dist/telemetry/index.test.js +73 -0
  307. package/dist/telemetry/index.test.js.map +1 -0
  308. package/dist/telemetry/pi-events.d.ts +12 -0
  309. package/dist/telemetry/pi-events.js +134 -0
  310. package/dist/telemetry/pi-events.js.map +1 -0
  311. package/dist/telemetry/pi-events.test.d.ts +1 -0
  312. package/dist/telemetry/pi-events.test.js +69 -0
  313. package/dist/telemetry/pi-events.test.js.map +1 -0
  314. package/dist/workflows/dag.d.ts +13 -1
  315. package/dist/workflows/dag.js +7 -3
  316. package/dist/workflows/dag.js.map +1 -1
  317. package/dist/workflows/dag.test.js +22 -0
  318. package/dist/workflows/dag.test.js.map +1 -1
  319. package/dist/workflows/golden-build.test.d.ts +1 -0
  320. package/dist/workflows/golden-build.test.js +45 -0
  321. package/dist/workflows/golden-build.test.js.map +1 -0
  322. package/dist/workflows/loader-overlay.test.d.ts +1 -0
  323. package/dist/workflows/loader-overlay.test.js +101 -0
  324. package/dist/workflows/loader-overlay.test.js.map +1 -0
  325. package/dist/workflows/loader.d.ts +36 -11
  326. package/dist/workflows/loader.js +311 -87
  327. package/dist/workflows/loader.js.map +1 -1
  328. package/dist/workflows/loader.test.js +114 -10
  329. package/dist/workflows/loader.test.js.map +1 -1
  330. package/dist/workflows/loop-eval.js +2 -0
  331. package/dist/workflows/loop-eval.js.map +1 -1
  332. package/dist/workflows/loop-eval.test.js +14 -0
  333. package/dist/workflows/loop-eval.test.js.map +1 -1
  334. package/dist/workflows/phase-executor.d.ts +145 -0
  335. package/dist/workflows/phase-executor.js +691 -0
  336. package/dist/workflows/phase-executor.js.map +1 -0
  337. package/dist/workflows/phase-executor.test.d.ts +1 -0
  338. package/dist/workflows/phase-executor.test.js +434 -0
  339. package/dist/workflows/phase-executor.test.js.map +1 -0
  340. package/dist/workflows/phase-ref.d.ts +44 -0
  341. package/dist/workflows/phase-ref.js +78 -0
  342. package/dist/workflows/phase-ref.js.map +1 -0
  343. package/dist/workflows/phase-ref.test.d.ts +1 -0
  344. package/dist/workflows/phase-ref.test.js +24 -0
  345. package/dist/workflows/phase-ref.test.js.map +1 -0
  346. package/dist/workflows/resume.d.ts +5 -11
  347. package/dist/workflows/resume.js +88 -7
  348. package/dist/workflows/resume.js.map +1 -1
  349. package/dist/workflows/runner.d.ts +34 -27
  350. package/dist/workflows/runner.js +252 -930
  351. package/dist/workflows/runner.js.map +1 -1
  352. package/dist/workflows/runner.test.js +346 -35
  353. package/dist/workflows/runner.test.js.map +1 -1
  354. package/dist/workflows/schema.d.ts +52 -10
  355. package/dist/workflows/schema.js +147 -7
  356. package/dist/workflows/schema.js.map +1 -1
  357. package/dist/workflows/simple.d.ts +67 -3
  358. package/dist/workflows/simple.js +248 -87
  359. package/dist/workflows/simple.js.map +1 -1
  360. package/dist/workflows/simple.test.d.ts +1 -0
  361. package/dist/workflows/simple.test.js +107 -0
  362. package/dist/workflows/simple.test.js.map +1 -0
  363. package/dist/workflows/templates.d.ts +29 -0
  364. package/dist/workflows/templates.js +42 -4
  365. package/dist/workflows/templates.js.map +1 -1
  366. package/dist/workflows/templates.test.js +103 -0
  367. package/dist/workflows/templates.test.js.map +1 -1
  368. package/dist/workflows/triggers.d.ts +21 -0
  369. package/dist/workflows/triggers.js +44 -0
  370. package/dist/workflows/triggers.js.map +1 -0
  371. package/dist/workflows/verdict.d.ts +19 -0
  372. package/dist/workflows/verdict.js +30 -0
  373. package/dist/workflows/verdict.js.map +1 -0
  374. package/dist/workflows/verdict.test.d.ts +1 -0
  375. package/dist/workflows/verdict.test.js +44 -0
  376. package/dist/workflows/verdict.test.js.map +1 -0
  377. package/dist/worktree/manager.d.ts +1 -1
  378. package/dist/worktree/manager.js +14 -14
  379. package/dist/worktree/manager.js.map +1 -1
  380. package/dist/worktree/manager.test.d.ts +1 -0
  381. package/dist/worktree/manager.test.js +87 -0
  382. package/dist/worktree/manager.test.js.map +1 -0
  383. package/docker-compose.yml +206 -5
  384. package/package.json +19 -7
  385. package/sandbox.Dockerfile +97 -18
  386. package/skills/README.md +40 -0
  387. package/skills/browser-qa/SKILL.md +193 -0
  388. package/skills/browser-qa/scripts/agent-browser.mjs +380 -0
  389. package/skills/building/SKILL.md +95 -0
  390. package/skills/chat/SKILL.md +30 -11
  391. package/skills/code-review/SKILL.md +59 -0
  392. package/skills/debug-production/SKILL.md +108 -0
  393. package/skills/demo/SKILL.md +194 -0
  394. package/skills/demo/scripts/compose-demo.sh +205 -0
  395. package/skills/issue-answer/SKILL.md +90 -0
  396. package/skills/issue-comment/SKILL.md +38 -24
  397. package/skills/issue-triage/SKILL.md +103 -37
  398. package/skills/issue-triage/references/AGENT-BRIEF.md +61 -0
  399. package/skills/pr-comment/SKILL.md +64 -0
  400. package/skills/pr-review/SKILL.md +65 -49
  401. package/skills/qa-test/SKILL.md +97 -0
  402. package/skills/repo-health/SKILL.md +48 -45
  403. package/skills/security-feedback/SKILL.md +173 -0
  404. package/skills/security-feedback/references/templates.md +77 -0
  405. package/skills/security-review/SKILL.md +213 -0
  406. package/skills/security-review/references/issue-format.md +302 -0
  407. package/skills/verify/SKILL.md +118 -0
  408. package/workflows/answer.yaml +37 -0
  409. package/workflows/build.yaml +32 -22
  410. package/workflows/cron-security.yaml +6 -0
  411. package/workflows/demo.yaml +55 -0
  412. package/workflows/explore.yaml +9 -0
  413. package/workflows/pr-comment.yaml +16 -0
  414. package/workflows/pr-fix.yaml +3 -0
  415. package/workflows/pr-review.yaml +4 -1
  416. package/workflows/prompts/answer.md +67 -0
  417. package/workflows/prompts/architect.md +24 -7
  418. package/workflows/prompts/demo.md +100 -0
  419. package/workflows/prompts/executor.md +29 -20
  420. package/workflows/prompts/explore-ask.md +51 -22
  421. package/workflows/prompts/explore-publish.md +2 -2
  422. package/workflows/prompts/explore-read.md +24 -10
  423. package/workflows/prompts/explore-synthesize.md +15 -8
  424. package/workflows/prompts/fix.md +9 -10
  425. package/workflows/prompts/guardrails.md +26 -8
  426. package/workflows/prompts/pr-fix.md +6 -7
  427. package/workflows/prompts/pr.md +11 -10
  428. package/workflows/prompts/qa-browser.md +95 -0
  429. package/workflows/prompts/qa-synth.md +44 -0
  430. package/workflows/prompts/qa-test.md +60 -0
  431. package/workflows/prompts/re-reviewer.md +8 -9
  432. package/workflows/prompts/reviewer.md +10 -9
  433. package/workflows/prompts/verify-browser.md +93 -0
  434. package/workflows/prompts/verify-synth.md +44 -0
  435. package/workflows/prompts/verify.md +63 -0
  436. package/workflows/qa-test.yaml +87 -0
  437. package/workflows/security-feedback.yaml +25 -0
  438. package/workflows/security-review.yaml +29 -0
  439. package/workflows/verify.yaml +85 -0
  440. package/deploy/mcp-config.tmpl.json +0 -14
  441. package/dist/cron/rate-limits.d.ts +0 -26
  442. package/dist/cron/rate-limits.js +0 -193
  443. package/dist/cron/rate-limits.js.map +0 -1
  444. package/dist/engine/executor.d.ts +0 -75
  445. package/dist/engine/executor.js +0 -292
  446. package/dist/engine/executor.js.map +0 -1
  447. package/mcp-github-app/package.json +0 -18
  448. package/mcp-github-app/src/auth.js +0 -66
  449. package/mcp-github-app/src/github.js +0 -371
  450. package/mcp-github-app/src/index.js +0 -534
  451. package/skills/devops/webhook-subscriptions/SKILL.md +0 -180
  452. package/skills/github/DESCRIPTION.md +0 -3
  453. package/skills/github/codebase-inspection/SKILL.md +0 -115
  454. package/skills/github/github-auth/SKILL.md +0 -54
  455. package/skills/github/github-auth/scripts/gh-env.sh +0 -66
  456. package/skills/github/github-code-review/SKILL.md +0 -480
  457. package/skills/github/github-code-review/references/review-output-template.md +0 -74
  458. package/skills/github/github-issues/SKILL.md +0 -369
  459. package/skills/github/github-issues/templates/bug-report.md +0 -35
  460. package/skills/github/github-issues/templates/feature-request.md +0 -31
  461. package/skills/github/github-pr-workflow/SKILL.md +0 -395
  462. package/skills/github/github-pr-workflow/references/ci-troubleshooting.md +0 -183
  463. package/skills/github/github-pr-workflow/references/conventional-commits.md +0 -71
  464. package/skills/github/github-pr-workflow/templates/pr-body-bugfix.md +0 -35
  465. package/skills/github/github-pr-workflow/templates/pr-body-feature.md +0 -33
  466. package/skills/github/github-repo-management/SKILL.md +0 -515
  467. package/skills/github/github-repo-management/references/github-api-cheatsheet.md +0 -161
  468. package/skills/github-orchestrator/SKILL.md +0 -103
  469. package/skills/mcp/DESCRIPTION.md +0 -3
  470. package/skills/mcp/mcporter/SKILL.md +0 -122
  471. package/skills/mcp/native-mcp/SKILL.md +0 -356
  472. package/skills/software-development/architect/SKILL.md +0 -154
  473. package/skills/software-development/assure-guardrails/SKILL.md +0 -239
  474. package/skills/software-development/plan/SKILL.md +0 -64
  475. package/skills/software-development/requesting-code-review/SKILL.md +0 -291
  476. package/skills/software-development/subagent-driven-development/SKILL.md +0 -433
  477. package/skills/software-development/systematic-debugging/SKILL.md +0 -366
  478. package/skills/software-development/test-driven-development/SKILL.md +0 -342
@@ -1,480 +0,0 @@
1
- ---
2
- name: github-code-review
3
- description: Review code changes by analyzing git diffs, leaving inline comments on PRs, and performing thorough pre-push review. Works with gh CLI or falls back to git + GitHub REST API via curl.
4
- version: 1.1.0
5
- author: Hermes Agent
6
- license: MIT
7
- metadata:
8
- hermes:
9
- tags: [GitHub, Code-Review, Pull-Requests, Git, Quality]
10
- related_skills: [github-auth, github-pr-workflow]
11
- ---
12
-
13
- # GitHub Code Review
14
-
15
- Perform code reviews on local changes before pushing, or review open PRs on GitHub. Most of this skill uses plain `git` — the `gh`/`curl` split only matters for PR-level interactions.
16
-
17
- ## Prerequisites
18
-
19
- - Authenticated with GitHub (see `github-auth` skill)
20
- - Inside a git repository
21
-
22
- ### Setup (for PR interactions)
23
-
24
- ```bash
25
- if command -v gh &>/dev/null && gh auth status &>/dev/null; then
26
- AUTH="gh"
27
- else
28
- AUTH="git"
29
- if [ -z "$GITHUB_TOKEN" ]; then
30
- if [ -f ~/.hermes/.env ] && grep -q "^GITHUB_TOKEN=" ~/.hermes/.env; then
31
- GITHUB_TOKEN=$(grep "^GITHUB_TOKEN=" ~/.hermes/.env | head -1 | cut -d= -f2 | tr -d '\n\r')
32
- elif grep -q "github.com" ~/.git-credentials 2>/dev/null; then
33
- GITHUB_TOKEN=$(grep "github.com" ~/.git-credentials 2>/dev/null | head -1 | sed 's|https://[^:]*:\([^@]*\)@.*|\1|')
34
- fi
35
- fi
36
- fi
37
-
38
- REMOTE_URL=$(git remote get-url origin)
39
- OWNER_REPO=$(echo "$REMOTE_URL" | sed -E 's|.*github\.com[:/]||; s|\.git$||')
40
- OWNER=$(echo "$OWNER_REPO" | cut -d/ -f1)
41
- REPO=$(echo "$OWNER_REPO" | cut -d/ -f2)
42
- ```
43
-
44
- ---
45
-
46
- ## 1. Reviewing Local Changes (Pre-Push)
47
-
48
- This is pure `git` — works everywhere, no API needed.
49
-
50
- ### Get the Diff
51
-
52
- ```bash
53
- # Staged changes (what would be committed)
54
- git diff --staged
55
-
56
- # All changes vs main (what a PR would contain)
57
- git diff main...HEAD
58
-
59
- # File names only
60
- git diff main...HEAD --name-only
61
-
62
- # Stat summary (insertions/deletions per file)
63
- git diff main...HEAD --stat
64
- ```
65
-
66
- ### Review Strategy
67
-
68
- 1. **Get the big picture first:**
69
-
70
- ```bash
71
- git diff main...HEAD --stat
72
- git log main..HEAD --oneline
73
- ```
74
-
75
- 2. **Review file by file** — use `read_file` on changed files for full context, and the diff to see what changed:
76
-
77
- ```bash
78
- git diff main...HEAD -- src/auth/login.py
79
- ```
80
-
81
- 3. **Check for common issues:**
82
-
83
- ```bash
84
- # Debug statements, TODOs, console.logs left behind
85
- git diff main...HEAD | grep -n "print(\|console\.log\|TODO\|FIXME\|HACK\|XXX\|debugger"
86
-
87
- # Large files accidentally staged
88
- git diff main...HEAD --stat | sort -t'|' -k2 -rn | head -10
89
-
90
- # Secrets or credential patterns
91
- git diff main...HEAD | grep -in "password\|secret\|api_key\|token.*=\|private_key"
92
-
93
- # Merge conflict markers
94
- git diff main...HEAD | grep -n "<<<<<<\|>>>>>>\|======="
95
- ```
96
-
97
- 4. **Present structured feedback** to the user.
98
-
99
- ### Review Output Format
100
-
101
- When reviewing local changes, present findings in this structure:
102
-
103
- ```
104
- ## Code Review Summary
105
-
106
- ### Critical
107
- - **src/auth.py:45** — SQL injection: user input passed directly to query.
108
- Suggestion: Use parameterized queries.
109
-
110
- ### Warnings
111
- - **src/models/user.py:23** — Password stored in plaintext. Use bcrypt or argon2.
112
- - **src/api/routes.py:112** — No rate limiting on login endpoint.
113
-
114
- ### Suggestions
115
- - **src/utils/helpers.py:8** — Duplicates logic in `src/core/utils.py:34`. Consolidate.
116
- - **tests/test_auth.py** — Missing edge case: expired token test.
117
-
118
- ### Looks Good
119
- - Clean separation of concerns in the middleware layer
120
- - Good test coverage for the happy path
121
- ```
122
-
123
- ---
124
-
125
- ## 2. Reviewing a Pull Request on GitHub
126
-
127
- ### View PR Details
128
-
129
- **With gh:**
130
-
131
- ```bash
132
- gh pr view 123
133
- gh pr diff 123
134
- gh pr diff 123 --name-only
135
- ```
136
-
137
- **With git + curl:**
138
-
139
- ```bash
140
- PR_NUMBER=123
141
-
142
- # Get PR details
143
- curl -s \
144
- -H "Authorization: token $GITHUB_TOKEN" \
145
- https://api.github.com/repos/$OWNER/$REPO/pulls/$PR_NUMBER \
146
- | python3 -c "
147
- import sys, json
148
- pr = json.load(sys.stdin)
149
- print(f\"Title: {pr['title']}\")
150
- print(f\"Author: {pr['user']['login']}\")
151
- print(f\"Branch: {pr['head']['ref']} -> {pr['base']['ref']}\")
152
- print(f\"State: {pr['state']}\")
153
- print(f\"Body:\n{pr['body']}\")"
154
-
155
- # List changed files
156
- curl -s \
157
- -H "Authorization: token $GITHUB_TOKEN" \
158
- https://api.github.com/repos/$OWNER/$REPO/pulls/$PR_NUMBER/files \
159
- | python3 -c "
160
- import sys, json
161
- for f in json.load(sys.stdin):
162
- print(f\"{f['status']:10} +{f['additions']:-4} -{f['deletions']:-4} {f['filename']}\")"
163
- ```
164
-
165
- ### Check Out PR Locally for Full Review
166
-
167
- This works with plain `git` — no `gh` needed:
168
-
169
- ```bash
170
- # Fetch the PR branch and check it out
171
- git fetch origin pull/123/head:pr-123
172
- git checkout pr-123
173
-
174
- # Now you can use read_file, search_files, run tests, etc.
175
-
176
- # View diff against the base branch
177
- git diff main...pr-123
178
- ```
179
-
180
- **With gh (shortcut):**
181
-
182
- ```bash
183
- gh pr checkout 123
184
- ```
185
-
186
- ### Leave Comments on a PR
187
-
188
- **General PR comment — with gh:**
189
-
190
- ```bash
191
- gh pr comment 123 --body "Overall looks good, a few suggestions below."
192
- ```
193
-
194
- **General PR comment — with curl:**
195
-
196
- ```bash
197
- curl -s -X POST \
198
- -H "Authorization: token $GITHUB_TOKEN" \
199
- https://api.github.com/repos/$OWNER/$REPO/issues/$PR_NUMBER/comments \
200
- -d '{"body": "Overall looks good, a few suggestions below."}'
201
- ```
202
-
203
- ### Leave Inline Review Comments
204
-
205
- **Single inline comment — with gh (via API):**
206
-
207
- ```bash
208
- HEAD_SHA=$(gh pr view 123 --json headRefOid --jq '.headRefOid')
209
-
210
- gh api repos/$OWNER/$REPO/pulls/123/comments \
211
- --method POST \
212
- -f body="This could be simplified with a list comprehension." \
213
- -f path="src/auth/login.py" \
214
- -f commit_id="$HEAD_SHA" \
215
- -f line=45 \
216
- -f side="RIGHT"
217
- ```
218
-
219
- **Single inline comment — with curl:**
220
-
221
- ```bash
222
- # Get the head commit SHA
223
- HEAD_SHA=$(curl -s \
224
- -H "Authorization: token $GITHUB_TOKEN" \
225
- https://api.github.com/repos/$OWNER/$REPO/pulls/$PR_NUMBER \
226
- | python3 -c "import sys,json; print(json.load(sys.stdin)['head']['sha'])")
227
-
228
- curl -s -X POST \
229
- -H "Authorization: token $GITHUB_TOKEN" \
230
- https://api.github.com/repos/$OWNER/$REPO/pulls/$PR_NUMBER/comments \
231
- -d "{
232
- \"body\": \"This could be simplified with a list comprehension.\",
233
- \"path\": \"src/auth/login.py\",
234
- \"commit_id\": \"$HEAD_SHA\",
235
- \"line\": 45,
236
- \"side\": \"RIGHT\"
237
- }"
238
- ```
239
-
240
- ### Submit a Formal Review (Approve / Request Changes)
241
-
242
- **With gh:**
243
-
244
- ```bash
245
- gh pr review 123 --approve --body "LGTM!"
246
- gh pr review 123 --request-changes --body "See inline comments."
247
- gh pr review 123 --comment --body "Some suggestions, nothing blocking."
248
- ```
249
-
250
- **With curl — multi-comment review submitted atomically:**
251
-
252
- ```bash
253
- HEAD_SHA=$(curl -s \
254
- -H "Authorization: token $GITHUB_TOKEN" \
255
- https://api.github.com/repos/$OWNER/$REPO/pulls/$PR_NUMBER \
256
- | python3 -c "import sys,json; print(json.load(sys.stdin)['head']['sha'])")
257
-
258
- curl -s -X POST \
259
- -H "Authorization: token $GITHUB_TOKEN" \
260
- https://api.github.com/repos/$OWNER/$REPO/pulls/$PR_NUMBER/reviews \
261
- -d "{
262
- \"commit_id\": \"$HEAD_SHA\",
263
- \"event\": \"COMMENT\",
264
- \"body\": \"Code review from Hermes Agent\",
265
- \"comments\": [
266
- {\"path\": \"src/auth.py\", \"line\": 45, \"body\": \"Use parameterized queries to prevent SQL injection.\"},
267
- {\"path\": \"src/models/user.py\", \"line\": 23, \"body\": \"Hash passwords with bcrypt before storing.\"},
268
- {\"path\": \"tests/test_auth.py\", \"line\": 1, \"body\": \"Add test for expired token edge case.\"}
269
- ]
270
- }"
271
- ```
272
-
273
- Event values: `"APPROVE"`, `"REQUEST_CHANGES"`, `"COMMENT"`
274
-
275
- The `line` field refers to the line number in the *new* version of the file. For deleted lines, use `"side": "LEFT"`.
276
-
277
- ---
278
-
279
- ## 3. Review Checklist
280
-
281
- When performing a code review (local or PR), systematically check:
282
-
283
- ### Correctness
284
- - Does the code do what it claims?
285
- - Edge cases handled (empty inputs, nulls, large data, concurrent access)?
286
- - Error paths handled gracefully?
287
-
288
- ### Security
289
- - No hardcoded secrets, credentials, or API keys
290
- - Input validation on user-facing inputs
291
- - No SQL injection, XSS, or path traversal
292
- - Auth/authz checks where needed
293
-
294
- ### Code Quality
295
- - Clear naming (variables, functions, classes)
296
- - No unnecessary complexity or premature abstraction
297
- - DRY — no duplicated logic that should be extracted
298
- - Functions are focused (single responsibility)
299
-
300
- ### Testing
301
- - New code paths tested?
302
- - Happy path and error cases covered?
303
- - Tests readable and maintainable?
304
-
305
- ### Performance
306
- - No N+1 queries or unnecessary loops
307
- - Appropriate caching where beneficial
308
- - No blocking operations in async code paths
309
-
310
- ### Documentation
311
- - Public APIs documented
312
- - Non-obvious logic has comments explaining "why"
313
- - README updated if behavior changed
314
-
315
- ---
316
-
317
- ## 4. Pre-Push Review Workflow
318
-
319
- When the user asks you to "review the code" or "check before pushing":
320
-
321
- 1. `git diff main...HEAD --stat` — see scope of changes
322
- 2. `git diff main...HEAD` — read the full diff
323
- 3. For each changed file, use `read_file` if you need more context
324
- 4. Apply the checklist above
325
- 5. Present findings in the structured format (Critical / Warnings / Suggestions / Looks Good)
326
- 6. If critical issues found, offer to fix them before the user pushes
327
-
328
- ---
329
-
330
- ## 5. PR Review Workflow (End-to-End)
331
-
332
- When the user asks you to "review PR #N", "look at this PR", or gives you a PR URL, follow this recipe:
333
-
334
- ### Step 1: Set up environment
335
-
336
- ```bash
337
- source ~/.hermes/skills/github/github-auth/scripts/gh-env.sh
338
- # Or run the inline setup block from the top of this skill
339
- ```
340
-
341
- ### Step 2: Gather PR context
342
-
343
- Get the PR metadata, description, and list of changed files to understand scope before diving into code.
344
-
345
- **With gh:**
346
- ```bash
347
- gh pr view 123
348
- gh pr diff 123 --name-only
349
- gh pr checks 123
350
- ```
351
-
352
- **With curl:**
353
- ```bash
354
- PR_NUMBER=123
355
-
356
- # PR details (title, author, description, branch)
357
- curl -s -H "Authorization: token $GITHUB_TOKEN" \
358
- https://api.github.com/repos/$GH_OWNER/$GH_REPO/pulls/$PR_NUMBER
359
-
360
- # Changed files with line counts
361
- curl -s -H "Authorization: token $GITHUB_TOKEN" \
362
- https://api.github.com/repos/$GH_OWNER/$GH_REPO/pulls/$PR_NUMBER/files
363
- ```
364
-
365
- ### Step 3: Check out the PR locally
366
-
367
- This gives you full access to `read_file`, `search_files`, and the ability to run tests.
368
-
369
- ```bash
370
- git fetch origin pull/$PR_NUMBER/head:pr-$PR_NUMBER
371
- git checkout pr-$PR_NUMBER
372
- ```
373
-
374
- ### Step 4: Read the diff and understand changes
375
-
376
- ```bash
377
- # Full diff against the base branch
378
- git diff main...HEAD
379
-
380
- # Or file-by-file for large PRs
381
- git diff main...HEAD --name-only
382
- # Then for each file:
383
- git diff main...HEAD -- path/to/file.py
384
- ```
385
-
386
- For each changed file, use `read_file` to see full context around the changes — diffs alone can miss issues visible only with surrounding code.
387
-
388
- ### Step 5: Run automated checks locally (if applicable)
389
-
390
- ```bash
391
- # Run tests if there's a test suite
392
- python -m pytest 2>&1 | tail -20
393
- # or: npm test, cargo test, go test ./..., etc.
394
-
395
- # Run linter if configured
396
- ruff check . 2>&1 | head -30
397
- # or: eslint, clippy, etc.
398
- ```
399
-
400
- ### Step 6: Apply the review checklist (Section 3)
401
-
402
- Go through each category: Correctness, Security, Code Quality, Testing, Performance, Documentation.
403
-
404
- ### Step 7: Post the review to GitHub
405
-
406
- Collect your findings and submit them as a formal review with inline comments.
407
-
408
- **With gh:**
409
- ```bash
410
- # If no issues — approve
411
- gh pr review $PR_NUMBER --approve --body "Reviewed by Hermes Agent. Code looks clean — good test coverage, no security concerns."
412
-
413
- # If issues found — request changes with inline comments
414
- gh pr review $PR_NUMBER --request-changes --body "Found a few issues — see inline comments."
415
- ```
416
-
417
- **With curl — atomic review with multiple inline comments:**
418
- ```bash
419
- HEAD_SHA=$(curl -s -H "Authorization: token $GITHUB_TOKEN" \
420
- https://api.github.com/repos/$GH_OWNER/$GH_REPO/pulls/$PR_NUMBER \
421
- | python3 -c "import sys,json; print(json.load(sys.stdin)['head']['sha'])")
422
-
423
- # Build the review JSON — event is APPROVE, REQUEST_CHANGES, or COMMENT
424
- curl -s -X POST \
425
- -H "Authorization: token $GITHUB_TOKEN" \
426
- https://api.github.com/repos/$GH_OWNER/$GH_REPO/pulls/$PR_NUMBER/reviews \
427
- -d "{
428
- \"commit_id\": \"$HEAD_SHA\",
429
- \"event\": \"REQUEST_CHANGES\",
430
- \"body\": \"## Hermes Agent Review\n\nFound 2 issues, 1 suggestion. See inline comments.\",
431
- \"comments\": [
432
- {\"path\": \"src/auth.py\", \"line\": 45, \"body\": \"🔴 **Critical:** User input passed directly to SQL query — use parameterized queries.\"},
433
- {\"path\": \"src/models.py\", \"line\": 23, \"body\": \"⚠️ **Warning:** Password stored without hashing.\"},
434
- {\"path\": \"src/utils.py\", \"line\": 8, \"body\": \"💡 **Suggestion:** This duplicates logic in core/utils.py:34.\"}
435
- ]
436
- }"
437
- ```
438
-
439
- ### Step 8: Also post a summary comment
440
-
441
- In addition to inline comments, leave a top-level summary so the PR author gets the full picture at a glance. Use the review output format from `references/review-output-template.md`.
442
-
443
- **With gh:**
444
- ```bash
445
- gh pr comment $PR_NUMBER --body "$(cat <<'EOF'
446
- ## Code Review Summary
447
-
448
- **Verdict: Changes Requested** (2 issues, 1 suggestion)
449
-
450
- ### 🔴 Critical
451
- - **src/auth.py:45** — SQL injection vulnerability
452
-
453
- ### ⚠️ Warnings
454
- - **src/models.py:23** — Plaintext password storage
455
-
456
- ### 💡 Suggestions
457
- - **src/utils.py:8** — Duplicated logic, consider consolidating
458
-
459
- ### ✅ Looks Good
460
- - Clean API design
461
- - Good error handling in the middleware layer
462
-
463
- ---
464
- *Reviewed by Hermes Agent*
465
- EOF
466
- )"
467
- ```
468
-
469
- ### Step 9: Clean up
470
-
471
- ```bash
472
- git checkout main
473
- git branch -D pr-$PR_NUMBER
474
- ```
475
-
476
- ### Decision: Approve vs Request Changes vs Comment
477
-
478
- - **Approve** — no critical or warning-level issues, only minor suggestions or all clear
479
- - **Request Changes** — any critical or warning-level issue that should be fixed before merge
480
- - **Comment** — observations and suggestions, but nothing blocking (use when you're unsure or the PR is a draft)
@@ -1,74 +0,0 @@
1
- # Review Output Template
2
-
3
- Use this as the structure for PR review summary comments. Copy and fill in the sections.
4
-
5
- ## For PR Summary Comment
6
-
7
- ```markdown
8
- ## Code Review Summary
9
-
10
- **Verdict: [Approved ✅ | Changes Requested 🔴 | Reviewed 💬]** ([N] issues, [N] suggestions)
11
-
12
- **PR:** #[number] — [title]
13
- **Author:** @[username]
14
- **Files changed:** [N] (+[additions] -[deletions])
15
-
16
- ### 🔴 Critical
17
- <!-- Issues that MUST be fixed before merge -->
18
- - **file.py:line** — [description]. Suggestion: [fix].
19
-
20
- ### ⚠️ Warnings
21
- <!-- Issues that SHOULD be fixed, but not strictly blocking -->
22
- - **file.py:line** — [description].
23
-
24
- ### 💡 Suggestions
25
- <!-- Non-blocking improvements, style preferences, future considerations -->
26
- - **file.py:line** — [description].
27
-
28
- ### ✅ Looks Good
29
- <!-- Call out things done well — positive reinforcement -->
30
- - [aspect that was done well]
31
-
32
- ---
33
- *Reviewed by Hermes Agent*
34
- ```
35
-
36
- ## Severity Guide
37
-
38
- | Level | Icon | When to use | Blocks merge? |
39
- |-------|------|-------------|---------------|
40
- | Critical | 🔴 | Security vulnerabilities, data loss risk, crashes, broken core functionality | Yes |
41
- | Warning | ⚠️ | Bugs in non-critical paths, missing error handling, missing tests for new code | Usually yes |
42
- | Suggestion | 💡 | Style improvements, refactoring ideas, performance hints, documentation gaps | No |
43
- | Looks Good | ✅ | Clean patterns, good test coverage, clear naming, smart design decisions | N/A |
44
-
45
- ## Verdict Decision
46
-
47
- - **Approved ✅** — Zero critical/warning items. Only suggestions or all clear.
48
- - **Changes Requested 🔴** — Any critical or warning item exists.
49
- - **Reviewed 💬** — Observations only (draft PRs, uncertain findings, informational).
50
-
51
- ## For Inline Comments
52
-
53
- Prefix inline comments with the severity icon so they're scannable:
54
-
55
- ```
56
- 🔴 **Critical:** User input passed directly to SQL query — use parameterized queries to prevent injection.
57
- ```
58
-
59
- ```
60
- ⚠️ **Warning:** This error is silently swallowed. At minimum, log it.
61
- ```
62
-
63
- ```
64
- 💡 **Suggestion:** This could be simplified with a dict comprehension:
65
- `{k: v for k, v in items if v is not None}`
66
- ```
67
-
68
- ```
69
- ✅ **Nice:** Good use of context manager here — ensures cleanup on exceptions.
70
- ```
71
-
72
- ## For Local (Pre-Push) Review
73
-
74
- When reviewing locally before push, use the same structure but present it as a message to the user instead of a PR comment. Skip the PR metadata header and just start with the severity sections.