@cyanautomation/kaseki-agent 1.4.1

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 (459) hide show
  1. package/.dockerignore +54 -0
  2. package/.eslintignore +11 -0
  3. package/.eslintrc.json +95 -0
  4. package/.github/ISSUE_TEMPLATE/bug_report.md +53 -0
  5. package/.github/ISSUE_TEMPLATE/feature_request.md +53 -0
  6. package/.github/ISSUE_TEMPLATE/security.md +51 -0
  7. package/.github/PULL_REQUEST_TEMPLATE/default.md +71 -0
  8. package/.github/dependabot.yml +38 -0
  9. package/.github/skills/dependency-cache-optimization/SKILL.md +526 -0
  10. package/.github/skills/docker-image-management/SKILL.md +532 -0
  11. package/.github/skills/frontend-design/SKILL.md +782 -0
  12. package/.github/skills/prompt-engineering/SKILL.md +360 -0
  13. package/.github/skills/quality-gate-config/SKILL.md +591 -0
  14. package/.github/skills/result-report-analysis/SKILL.md +576 -0
  15. package/.github/skills/test-automation/SKILL.md +593 -0
  16. package/.github/skills/workflow-diagnosis/SKILL.md +468 -0
  17. package/.github/workflows/build-docker-image.yml +453 -0
  18. package/.github/workflows/release.yml +68 -0
  19. package/.releaserc.json +135 -0
  20. package/CHANGELOG.md +117 -0
  21. package/CLAUDE.md +336 -0
  22. package/CONTRIBUTING.md +339 -0
  23. package/Dockerfile +217 -0
  24. package/README.md +1527 -0
  25. package/STYLE.md +521 -0
  26. package/add-js-extensions.d.ts +9 -0
  27. package/add-js-extensions.d.ts.map +1 -0
  28. package/add-js-extensions.js.map +1 -0
  29. package/dist/add-js-extensions.d.ts +9 -0
  30. package/dist/add-js-extensions.d.ts.map +1 -0
  31. package/dist/add-js-extensions.js +52 -0
  32. package/dist/add-js-extensions.js.map +1 -0
  33. package/dist/ansi-colors.d.ts +26 -0
  34. package/dist/ansi-colors.d.ts.map +1 -0
  35. package/dist/ansi-colors.js +51 -0
  36. package/dist/ansi-colors.js.map +1 -0
  37. package/dist/cli/BaseCommand.d.ts +18 -0
  38. package/dist/cli/BaseCommand.d.ts.map +1 -0
  39. package/dist/cli/BaseCommand.js +31 -0
  40. package/dist/cli/BaseCommand.js.map +1 -0
  41. package/dist/cli/KasekiCLI.d.ts +30 -0
  42. package/dist/cli/KasekiCLI.d.ts.map +1 -0
  43. package/dist/cli/KasekiCLI.js +134 -0
  44. package/dist/cli/KasekiCLI.js.map +1 -0
  45. package/dist/cli/commands/ConfigCommand.d.ts +13 -0
  46. package/dist/cli/commands/ConfigCommand.d.ts.map +1 -0
  47. package/dist/cli/commands/ConfigCommand.js +131 -0
  48. package/dist/cli/commands/ConfigCommand.js.map +1 -0
  49. package/dist/cli/commands/DoctorCommand.d.ts +45 -0
  50. package/dist/cli/commands/DoctorCommand.d.ts.map +1 -0
  51. package/dist/cli/commands/DoctorCommand.js +309 -0
  52. package/dist/cli/commands/DoctorCommand.js.map +1 -0
  53. package/dist/cli/commands/ListCommand.d.ts +9 -0
  54. package/dist/cli/commands/ListCommand.d.ts.map +1 -0
  55. package/dist/cli/commands/ListCommand.js +81 -0
  56. package/dist/cli/commands/ListCommand.js.map +1 -0
  57. package/dist/cli/commands/ReportCommand.d.ts +9 -0
  58. package/dist/cli/commands/ReportCommand.d.ts.map +1 -0
  59. package/dist/cli/commands/ReportCommand.js +98 -0
  60. package/dist/cli/commands/ReportCommand.js.map +1 -0
  61. package/dist/cli/commands/RunCommand.d.ts +13 -0
  62. package/dist/cli/commands/RunCommand.d.ts.map +1 -0
  63. package/dist/cli/commands/RunCommand.js +191 -0
  64. package/dist/cli/commands/RunCommand.js.map +1 -0
  65. package/dist/cli/commands/SecretsCommand.d.ts +9 -0
  66. package/dist/cli/commands/SecretsCommand.d.ts.map +1 -0
  67. package/dist/cli/commands/SecretsCommand.js +109 -0
  68. package/dist/cli/commands/SecretsCommand.js.map +1 -0
  69. package/dist/cli/commands/ServeCommand.d.ts +9 -0
  70. package/dist/cli/commands/ServeCommand.d.ts.map +1 -0
  71. package/dist/cli/commands/ServeCommand.js +50 -0
  72. package/dist/cli/commands/ServeCommand.js.map +1 -0
  73. package/dist/cli/commands/SetupCommand.d.ts +42 -0
  74. package/dist/cli/commands/SetupCommand.d.ts.map +1 -0
  75. package/dist/cli/commands/SetupCommand.js +249 -0
  76. package/dist/cli/commands/SetupCommand.js.map +1 -0
  77. package/dist/cli.d.ts +9 -0
  78. package/dist/cli.d.ts.map +1 -0
  79. package/dist/cli.js +130 -0
  80. package/dist/cli.js.map +1 -0
  81. package/dist/config/ConfigManager.d.ts +395 -0
  82. package/dist/config/ConfigManager.d.ts.map +1 -0
  83. package/dist/config/ConfigManager.js +446 -0
  84. package/dist/config/ConfigManager.js.map +1 -0
  85. package/dist/docker/DockerManager.d.ts +69 -0
  86. package/dist/docker/DockerManager.d.ts.map +1 -0
  87. package/dist/docker/DockerManager.js +266 -0
  88. package/dist/docker/DockerManager.js.map +1 -0
  89. package/dist/event-aggregator.d.ts +71 -0
  90. package/dist/event-aggregator.d.ts.map +1 -0
  91. package/dist/event-aggregator.js +95 -0
  92. package/dist/event-aggregator.js.map +1 -0
  93. package/dist/github-app-token.d.ts +16 -0
  94. package/dist/github-app-token.d.ts.map +1 -0
  95. package/dist/github-app-token.js +148 -0
  96. package/dist/github-app-token.js.map +1 -0
  97. package/dist/idempotency-store.d.ts +61 -0
  98. package/dist/idempotency-store.d.ts.map +1 -0
  99. package/dist/idempotency-store.js +321 -0
  100. package/dist/idempotency-store.js.map +1 -0
  101. package/dist/index.d.ts +25 -0
  102. package/dist/index.d.ts.map +1 -0
  103. package/dist/index.js +31 -0
  104. package/dist/index.js.map +1 -0
  105. package/dist/instance/InstanceManager.d.ts +81 -0
  106. package/dist/instance/InstanceManager.d.ts.map +1 -0
  107. package/dist/instance/InstanceManager.js +220 -0
  108. package/dist/instance/InstanceManager.js.map +1 -0
  109. package/dist/instance-metadata-reader.d.ts +48 -0
  110. package/dist/instance-metadata-reader.d.ts.map +1 -0
  111. package/dist/instance-metadata-reader.js +94 -0
  112. package/dist/instance-metadata-reader.js.map +1 -0
  113. package/dist/instance-state-derivation.d.ts +42 -0
  114. package/dist/instance-state-derivation.d.ts.map +1 -0
  115. package/dist/instance-state-derivation.js +133 -0
  116. package/dist/instance-state-derivation.js.map +1 -0
  117. package/dist/job-scheduler.d.ts +124 -0
  118. package/dist/job-scheduler.d.ts.map +1 -0
  119. package/dist/job-scheduler.js +992 -0
  120. package/dist/job-scheduler.js.map +1 -0
  121. package/dist/kaseki-api-client.d.ts +89 -0
  122. package/dist/kaseki-api-client.d.ts.map +1 -0
  123. package/dist/kaseki-api-client.js +405 -0
  124. package/dist/kaseki-api-client.js.map +1 -0
  125. package/dist/kaseki-api-config.d.ts +34 -0
  126. package/dist/kaseki-api-config.d.ts.map +1 -0
  127. package/dist/kaseki-api-config.js +113 -0
  128. package/dist/kaseki-api-config.js.map +1 -0
  129. package/dist/kaseki-api-routes.d.ts +13 -0
  130. package/dist/kaseki-api-routes.d.ts.map +1 -0
  131. package/dist/kaseki-api-routes.js +559 -0
  132. package/dist/kaseki-api-routes.js.map +1 -0
  133. package/dist/kaseki-api-service-wrapper.d.ts +43 -0
  134. package/dist/kaseki-api-service-wrapper.d.ts.map +1 -0
  135. package/dist/kaseki-api-service-wrapper.js +150 -0
  136. package/dist/kaseki-api-service-wrapper.js.map +1 -0
  137. package/dist/kaseki-api-service.d.ts +16 -0
  138. package/dist/kaseki-api-service.d.ts.map +1 -0
  139. package/dist/kaseki-api-service.js +143 -0
  140. package/dist/kaseki-api-service.js.map +1 -0
  141. package/dist/kaseki-api-types.d.ts +440 -0
  142. package/dist/kaseki-api-types.d.ts.map +1 -0
  143. package/dist/kaseki-api-types.js +64 -0
  144. package/dist/kaseki-api-types.js.map +1 -0
  145. package/dist/kaseki-cli-lib.d.ts +219 -0
  146. package/dist/kaseki-cli-lib.d.ts.map +1 -0
  147. package/dist/kaseki-cli-lib.js +523 -0
  148. package/dist/kaseki-cli-lib.js.map +1 -0
  149. package/dist/kaseki-cli.d.ts +38 -0
  150. package/dist/kaseki-cli.d.ts.map +1 -0
  151. package/dist/kaseki-cli.js +559 -0
  152. package/dist/kaseki-cli.js.map +1 -0
  153. package/dist/kaseki-report.d.ts +3 -0
  154. package/dist/kaseki-report.d.ts.map +1 -0
  155. package/dist/kaseki-report.js +140 -0
  156. package/dist/kaseki-report.js.map +1 -0
  157. package/dist/lib/subprocess-helpers.d.ts +98 -0
  158. package/dist/lib/subprocess-helpers.d.ts.map +1 -0
  159. package/dist/lib/subprocess-helpers.js +136 -0
  160. package/dist/lib/subprocess-helpers.js.map +1 -0
  161. package/dist/logger.d.ts +39 -0
  162. package/dist/logger.d.ts.map +1 -0
  163. package/dist/logger.js +79 -0
  164. package/dist/logger.js.map +1 -0
  165. package/dist/metrics.d.ts +19 -0
  166. package/dist/metrics.d.ts.map +1 -0
  167. package/dist/metrics.js +59 -0
  168. package/dist/metrics.js.map +1 -0
  169. package/dist/middleware/job-lookup.d.ts +27 -0
  170. package/dist/middleware/job-lookup.d.ts.map +1 -0
  171. package/dist/middleware/job-lookup.js +28 -0
  172. package/dist/middleware/job-lookup.js.map +1 -0
  173. package/dist/pi-event-filter.d.ts +3 -0
  174. package/dist/pi-event-filter.d.ts.map +1 -0
  175. package/dist/pi-event-filter.js +126 -0
  176. package/dist/pi-event-filter.js.map +1 -0
  177. package/dist/pi-progress-stream.d.ts +3 -0
  178. package/dist/pi-progress-stream.d.ts.map +1 -0
  179. package/dist/pi-progress-stream.js +205 -0
  180. package/dist/pi-progress-stream.js.map +1 -0
  181. package/dist/pi-progress-summarizer.d.ts +61 -0
  182. package/dist/pi-progress-summarizer.d.ts.map +1 -0
  183. package/dist/pi-progress-summarizer.js +246 -0
  184. package/dist/pi-progress-summarizer.js.map +1 -0
  185. package/dist/pre-flight-validator.d.ts +72 -0
  186. package/dist/pre-flight-validator.d.ts.map +1 -0
  187. package/dist/pre-flight-validator.js +513 -0
  188. package/dist/pre-flight-validator.js.map +1 -0
  189. package/dist/progress-stream-utils.d.ts +3 -0
  190. package/dist/progress-stream-utils.d.ts.map +1 -0
  191. package/dist/progress-stream-utils.js +15 -0
  192. package/dist/progress-stream-utils.js.map +1 -0
  193. package/dist/result-cache.d.ts +52 -0
  194. package/dist/result-cache.d.ts.map +1 -0
  195. package/dist/result-cache.js +134 -0
  196. package/dist/result-cache.js.map +1 -0
  197. package/dist/routes/artifact-routes.d.ts +10 -0
  198. package/dist/routes/artifact-routes.d.ts.map +1 -0
  199. package/dist/routes/artifact-routes.js +126 -0
  200. package/dist/routes/artifact-routes.js.map +1 -0
  201. package/dist/routes/log-routes.d.ts +8 -0
  202. package/dist/routes/log-routes.d.ts.map +1 -0
  203. package/dist/routes/log-routes.js +345 -0
  204. package/dist/routes/log-routes.js.map +1 -0
  205. package/dist/routes/status-routes.d.ts +8 -0
  206. package/dist/routes/status-routes.d.ts.map +1 -0
  207. package/dist/routes/status-routes.js +82 -0
  208. package/dist/routes/status-routes.js.map +1 -0
  209. package/dist/routes/webhook-routes.d.ts +6 -0
  210. package/dist/routes/webhook-routes.d.ts.map +1 -0
  211. package/dist/routes/webhook-routes.js +86 -0
  212. package/dist/routes/webhook-routes.js.map +1 -0
  213. package/dist/run-artifact-metadata-cache.d.ts +42 -0
  214. package/dist/run-artifact-metadata-cache.d.ts.map +1 -0
  215. package/dist/run-artifact-metadata-cache.js +139 -0
  216. package/dist/run-artifact-metadata-cache.js.map +1 -0
  217. package/dist/secret-value-cache.d.ts +13 -0
  218. package/dist/secret-value-cache.d.ts.map +1 -0
  219. package/dist/secret-value-cache.js +44 -0
  220. package/dist/secret-value-cache.js.map +1 -0
  221. package/dist/secrets/SecretsManager.d.ts +80 -0
  222. package/dist/secrets/SecretsManager.d.ts.map +1 -0
  223. package/dist/secrets/SecretsManager.js +306 -0
  224. package/dist/secrets/SecretsManager.js.map +1 -0
  225. package/dist/test-utils.d.ts +55 -0
  226. package/dist/test-utils.d.ts.map +1 -0
  227. package/dist/test-utils.js +48 -0
  228. package/dist/test-utils.js.map +1 -0
  229. package/dist/timestamp-tracker.d.ts +75 -0
  230. package/dist/timestamp-tracker.d.ts.map +1 -0
  231. package/dist/timestamp-tracker.js +121 -0
  232. package/dist/timestamp-tracker.js.map +1 -0
  233. package/dist/utils/failure-artifact-writer.d.ts +29 -0
  234. package/dist/utils/failure-artifact-writer.d.ts.map +1 -0
  235. package/dist/utils/failure-artifact-writer.js +157 -0
  236. package/dist/utils/failure-artifact-writer.js.map +1 -0
  237. package/dist/utils/file-helpers.d.ts +41 -0
  238. package/dist/utils/file-helpers.d.ts.map +1 -0
  239. package/dist/utils/file-helpers.js +143 -0
  240. package/dist/utils/file-helpers.js.map +1 -0
  241. package/dist/utils/http-client-factory.d.ts +46 -0
  242. package/dist/utils/http-client-factory.d.ts.map +1 -0
  243. package/dist/utils/http-client-factory.js +114 -0
  244. package/dist/utils/http-client-factory.js.map +1 -0
  245. package/dist/utils/progress-normalizer.d.ts +13 -0
  246. package/dist/utils/progress-normalizer.d.ts.map +1 -0
  247. package/dist/utils/progress-normalizer.js +57 -0
  248. package/dist/utils/progress-normalizer.js.map +1 -0
  249. package/dist/utils/response-helpers.d.ts +34 -0
  250. package/dist/utils/response-helpers.d.ts.map +1 -0
  251. package/dist/utils/response-helpers.js +78 -0
  252. package/dist/utils/response-helpers.js.map +1 -0
  253. package/dist/utils/route-helpers.d.ts +17 -0
  254. package/dist/utils/route-helpers.d.ts.map +1 -0
  255. package/dist/utils/route-helpers.js +22 -0
  256. package/dist/utils/route-helpers.js.map +1 -0
  257. package/dist/utils/status-response-builder.d.ts +23 -0
  258. package/dist/utils/status-response-builder.d.ts.map +1 -0
  259. package/dist/utils/status-response-builder.js +144 -0
  260. package/dist/utils/status-response-builder.js.map +1 -0
  261. package/dist/utils/type-guards.d.ts +37 -0
  262. package/dist/utils/type-guards.d.ts.map +1 -0
  263. package/dist/utils/type-guards.js +45 -0
  264. package/dist/utils/type-guards.js.map +1 -0
  265. package/dist/utils/utf8-helpers.d.ts +32 -0
  266. package/dist/utils/utf8-helpers.d.ts.map +1 -0
  267. package/dist/utils/utf8-helpers.js +97 -0
  268. package/dist/utils/utf8-helpers.js.map +1 -0
  269. package/dist/utils/webhook-event-builder.d.ts +26 -0
  270. package/dist/utils/webhook-event-builder.d.ts.map +1 -0
  271. package/dist/utils/webhook-event-builder.js +77 -0
  272. package/dist/utils/webhook-event-builder.js.map +1 -0
  273. package/dist/webhook-manager.d.ts +56 -0
  274. package/dist/webhook-manager.d.ts.map +1 -0
  275. package/dist/webhook-manager.js +359 -0
  276. package/dist/webhook-manager.js.map +1 -0
  277. package/docker/workspace-cache/package-lock.json +13 -0
  278. package/docker/workspace-cache/package.json +7 -0
  279. package/docker-compose.yml +53 -0
  280. package/docs/API.md +708 -0
  281. package/docs/BACKLOG.md +19 -0
  282. package/docs/BUILD_STRATEGY.md +404 -0
  283. package/docs/CLI.md +569 -0
  284. package/docs/DEPLOYMENT.md +521 -0
  285. package/docs/DEVELOPMENT.md +459 -0
  286. package/docs/DOCKER_SETUP.md +522 -0
  287. package/docs/ENHANCED_PROGRESS_LOGS.md +264 -0
  288. package/docs/IMPLEMENTATION_SUMMARY.md +549 -0
  289. package/docs/INTEGRATION_EXAMPLE.md +217 -0
  290. package/docs/NPM_SETUP.md +468 -0
  291. package/docs/PHASE1-4_IMPLEMENTATION.md +302 -0
  292. package/docs/PHASE1_COMPLETION.md +192 -0
  293. package/docs/PHASE2_COMPLETION.md +134 -0
  294. package/docs/PHASE6_MIGRATION.md +392 -0
  295. package/docs/PRINTF_SAFETY_FIX.md +282 -0
  296. package/docs/QUALITY_GATES.md +369 -0
  297. package/docs/SETUP_GUIDE.md +482 -0
  298. package/docs/TASK_PROMPT_TEMPLATES.md +533 -0
  299. package/docs/VALIDATION_FIX.md +139 -0
  300. package/docs/VERIFICATION_CHECKLIST.md +335 -0
  301. package/docs/repo-maturity.md +760 -0
  302. package/fix-tests.d.ts +9 -0
  303. package/fix-tests.d.ts.map +1 -0
  304. package/fix-tests.js.map +1 -0
  305. package/fix-tests.ts +53 -0
  306. package/jest.config.ts +31 -0
  307. package/kaseki +183 -0
  308. package/kaseki-agent.sh +1961 -0
  309. package/ops/logrotate/kaseki +10 -0
  310. package/package.json +83 -0
  311. package/perf/README.md +54 -0
  312. package/perf/pi-event-filter.benchmark.test.ts +98 -0
  313. package/run-kaseki-json.test.sh +106 -0
  314. package/run-kaseki.sh +990 -0
  315. package/scripts/allowlist-helper.sh +56 -0
  316. package/scripts/cleanup-kaseki.sh +168 -0
  317. package/scripts/deploy-pi-template.sh +293 -0
  318. package/scripts/docker-entrypoint.sh +71 -0
  319. package/scripts/dry-run-allowlist.sh +161 -0
  320. package/scripts/kaseki-activate.sh +396 -0
  321. package/scripts/kaseki-api.service +62 -0
  322. package/scripts/kaseki-container-entrypoint-wrapper.sh +119 -0
  323. package/scripts/kaseki-container-setup-remote.sh +172 -0
  324. package/scripts/kaseki-container-setup.sh +193 -0
  325. package/scripts/kaseki-healthcheck.sh +95 -0
  326. package/scripts/kaseki-install.sh +50 -0
  327. package/scripts/kaseki-maturity-score.sh +291 -0
  328. package/scripts/kaseki-performance-metrics.sh +122 -0
  329. package/scripts/kaseki-preflight.sh +270 -0
  330. package/scripts/kaseki-setup.sh +265 -0
  331. package/scripts/pi-setup-remote.sh +213 -0
  332. package/scripts/setup-github-labels.sh +42 -0
  333. package/scripts/suggest-allowlist.sh +68 -0
  334. package/scripts/templates/MULTI_HOST_DISTRIBUTED.md +337 -0
  335. package/scripts/templates/REST_API_SERVICE.md +490 -0
  336. package/scripts/templates/SINGLE_HOST_CLI.md +194 -0
  337. package/scripts/test-github-app.sh +248 -0
  338. package/src/add-js-extensions.ts +61 -0
  339. package/src/ansi-colors.test.ts +62 -0
  340. package/src/ansi-colors.ts +67 -0
  341. package/src/cli/BaseCommand.ts +40 -0
  342. package/src/cli/KasekiCLI.ts +154 -0
  343. package/src/cli/commands/ConfigCommand.ts +145 -0
  344. package/src/cli/commands/DoctorCommand.ts +329 -0
  345. package/src/cli/commands/ListCommand.ts +105 -0
  346. package/src/cli/commands/ReportCommand.ts +110 -0
  347. package/src/cli/commands/RunCommand.ts +218 -0
  348. package/src/cli/commands/SecretsCommand.ts +120 -0
  349. package/src/cli/commands/ServeCommand.ts +62 -0
  350. package/src/cli/commands/SetupCommand.ts +301 -0
  351. package/src/cli.ts +138 -0
  352. package/src/config/ConfigManager.ts +476 -0
  353. package/src/docker/DockerManager.ts +319 -0
  354. package/src/docker-entrypoint-packaging.test.ts +33 -0
  355. package/src/event-aggregator.test.ts +117 -0
  356. package/src/event-aggregator.ts +126 -0
  357. package/src/github-app-token.ts +215 -0
  358. package/src/idempotency-store.test.ts +117 -0
  359. package/src/idempotency-store.ts +385 -0
  360. package/src/index.ts +89 -0
  361. package/src/instance/InstanceManager.ts +285 -0
  362. package/src/instance-metadata-reader.test.ts +190 -0
  363. package/src/instance-metadata-reader.ts +129 -0
  364. package/src/instance-state-derivation.test.ts +263 -0
  365. package/src/instance-state-derivation.ts +148 -0
  366. package/src/job-scheduler.test.ts +1236 -0
  367. package/src/job-scheduler.ts +1117 -0
  368. package/src/kaseki-api-client.ts +488 -0
  369. package/src/kaseki-api-config.test.ts +315 -0
  370. package/src/kaseki-api-config.ts +175 -0
  371. package/src/kaseki-api-routes.test.ts +1615 -0
  372. package/src/kaseki-api-routes.ts +643 -0
  373. package/src/kaseki-api-service-wrapper.ts +188 -0
  374. package/src/kaseki-api-service.test.ts +418 -0
  375. package/src/kaseki-api-service.ts +192 -0
  376. package/src/kaseki-api-types.ts +320 -0
  377. package/src/kaseki-cli-lib.test.ts +552 -0
  378. package/src/kaseki-cli-lib.ts +760 -0
  379. package/src/kaseki-cli.ts +682 -0
  380. package/src/kaseki-report.test.ts +118 -0
  381. package/src/kaseki-report.ts +192 -0
  382. package/src/lib/subprocess-helpers.ts +177 -0
  383. package/src/logger.ts +114 -0
  384. package/src/metrics.ts +66 -0
  385. package/src/middleware/job-lookup.test.ts +113 -0
  386. package/src/middleware/job-lookup.ts +45 -0
  387. package/src/pi-event-filter.test.ts +183 -0
  388. package/src/pi-event-filter.ts +183 -0
  389. package/src/pi-progress-stream.ts +287 -0
  390. package/src/pi-progress-summarizer.test.ts +302 -0
  391. package/src/pi-progress-summarizer.ts +287 -0
  392. package/src/pre-flight-validator.test.ts +512 -0
  393. package/src/pre-flight-validator.ts +618 -0
  394. package/src/progress-stream-utils.test.ts +35 -0
  395. package/src/progress-stream-utils.ts +14 -0
  396. package/src/result-cache.test.ts +195 -0
  397. package/src/result-cache.ts +181 -0
  398. package/src/routes/artifact-routes.ts +169 -0
  399. package/src/routes/log-routes.ts +391 -0
  400. package/src/routes/status-routes.ts +92 -0
  401. package/src/routes/webhook-routes.ts +97 -0
  402. package/src/run-artifact-metadata-cache.test.ts +80 -0
  403. package/src/run-artifact-metadata-cache.ts +184 -0
  404. package/src/secret-value-cache.test.ts +66 -0
  405. package/src/secret-value-cache.ts +55 -0
  406. package/src/secrets/SecretsManager.ts +343 -0
  407. package/src/test-utils.ts +81 -0
  408. package/src/timestamp-tracker.test.ts +134 -0
  409. package/src/timestamp-tracker.ts +132 -0
  410. package/src/utils/failure-artifact-writer.ts +187 -0
  411. package/src/utils/file-helpers.test.ts +235 -0
  412. package/src/utils/file-helpers.ts +150 -0
  413. package/src/utils/http-client-factory.test.ts +245 -0
  414. package/src/utils/http-client-factory.ts +157 -0
  415. package/src/utils/progress-normalizer.test.ts +442 -0
  416. package/src/utils/progress-normalizer.ts +68 -0
  417. package/src/utils/response-helpers.test.ts +122 -0
  418. package/src/utils/response-helpers.ts +101 -0
  419. package/src/utils/route-helpers.ts +30 -0
  420. package/src/utils/status-response-builder.ts +159 -0
  421. package/src/utils/type-guards.ts +52 -0
  422. package/src/utils/utf8-helpers.ts +102 -0
  423. package/src/utils/webhook-event-builder.test.ts +143 -0
  424. package/src/utils/webhook-event-builder.ts +87 -0
  425. package/src/webhook-manager.test.ts +152 -0
  426. package/src/webhook-manager.ts +445 -0
  427. package/templates/allowlist-api-route.txt +7 -0
  428. package/templates/allowlist-comprehensive.txt +8 -0
  429. package/templates/allowlist-parser-fix.txt +6 -0
  430. package/templates/allowlist-ui-component.txt +9 -0
  431. package/templates/allowlist-utility.txt +9 -0
  432. package/test/actual-model-metadata.test.sh +102 -0
  433. package/test/dry-run.test.sh +131 -0
  434. package/test/fixtures/kaseki-report-exit-codes/metadata-exit-0.json +1 -0
  435. package/test/fixtures/kaseki-report-exit-codes/metadata-exit-1.json +1 -0
  436. package/test/fixtures/kaseki-report-exit-codes/metadata-exit-invalid.json +1 -0
  437. package/test/fixtures/kaseki-report-exit-codes/metadata-exit-str-0.json +1 -0
  438. package/test/fixtures/kaseki-report-exit-codes/metadata-exit-str-1.json +1 -0
  439. package/test/kaseki-api.integration.test.sh +165 -0
  440. package/test/pi-event-filter-failure.test.sh +83 -0
  441. package/test/printf-safety-focused.test.sh +99 -0
  442. package/test/printf-safety-results/results/restoration.jsonl +10 -0
  443. package/test/printf-safety-results/results/test.jsonl +0 -0
  444. package/test/printf-safety.test.sh +297 -0
  445. package/test/validation-fix.test.sh +79 -0
  446. package/test/validation-integration.test.sh +109 -0
  447. package/tests/allowlist-glob.test.sh +61 -0
  448. package/tests/dependency-cache-key.test.sh +48 -0
  449. package/tests/dependency-restore-mode.test.sh +48 -0
  450. package/tests/doctor-template-parity.test.sh +95 -0
  451. package/tests/github-operations.test.sh +142 -0
  452. package/tests/npm-install-flags.test.sh +58 -0
  453. package/tests/quality-gates.test.sh +178 -0
  454. package/tests/repo-memory.test.sh +103 -0
  455. package/tests/restore-disallowed-changes.test.sh +80 -0
  456. package/tests/validation-missing-npm-scripts.test.sh +93 -0
  457. package/tests/validation-strict-mode.test.sh +118 -0
  458. package/tsconfig.changed.json +7 -0
  459. package/tsconfig.json +39 -0
@@ -0,0 +1,490 @@
1
+ # REST API Service Setup
2
+
3
+ For running kaseki-agent as a long-running HTTP API service for async, distributed execution.
4
+
5
+ **Complexity**: High | **Time**: 15-30 minutes
6
+
7
+ ---
8
+
9
+ ## Architecture
10
+
11
+ ```
12
+ External Client
13
+ ↓ (HTTP POST /api/run)
14
+ REST API Service (port 8080)
15
+
16
+ Docker Daemon
17
+
18
+ Kaseki Agent Container (kaseki-1, kaseki-2, ...)
19
+ ```
20
+
21
+ The API service acts as a broker, accepting HTTP requests and managing kaseki instances on behalf of clients.
22
+
23
+ ---
24
+
25
+ ## Comparison: API Service vs. Direct CLI
26
+
27
+ | Aspect | Direct CLI | REST API Service |
28
+ |--------|-----------|------------------|
29
+ | **Deployment** | Single host or SSH-based | Long-running service |
30
+ | **Execution** | Synchronous (blocking) | Asynchronous (non-blocking) |
31
+ | **Concurrent Runs** | One at a time | Multiple (configurable) |
32
+ | **Access Method** | Shell commands | HTTP REST API |
33
+ | **Best For** | Development, simple tasks | Production, distributed systems |
34
+
35
+ ---
36
+
37
+ ## Prerequisites
38
+
39
+ - Docker (required)
40
+ - Docker Compose (recommended) or Node.js ≥24.x (fallback)
41
+ - OpenRouter API key
42
+ - Port 8080 available (or configure different port)
43
+
44
+ ---
45
+
46
+ ## Step 1: Clone and Prepare
47
+
48
+ ```bash
49
+ cd /agents/kaseki-template
50
+ # (or clone if not already done)
51
+ git clone https://github.com/CyanAutomation/kaseki-agent.git /agents/kaseki-template
52
+ cd /agents/kaseki-template
53
+ ```
54
+
55
+ ## Step 2: Set API Keys
56
+
57
+ ### Option A: Single API Key (Simple)
58
+
59
+ ```bash
60
+ export KASEKI_API_KEYS=sk-your-secret-key-here
61
+ ```
62
+
63
+ ### Option B: Multiple API Keys (Production)
64
+
65
+ ```bash
66
+ export KASEKI_API_KEYS="sk-key1,sk-key2,sk-key3"
67
+ ```
68
+
69
+ Or store in a file:
70
+
71
+ ```bash
72
+ # Create file with one key per line
73
+ cat > ~/.kaseki/api-keys.txt << 'EOF'
74
+ sk-key1
75
+ sk-key2
76
+ sk-key3
77
+ EOF
78
+
79
+ # Set environment to point to file
80
+ export KASEKI_API_KEYS_FILE=~/.kaseki/api-keys.txt
81
+ ```
82
+
83
+ ## Step 3: Configure OpenRouter API Key
84
+
85
+ The service needs your OpenRouter key to invoke the Pi agent:
86
+
87
+ ```bash
88
+ # Option 1: Environment variable (not recommended for production)
89
+ export OPENROUTER_API_KEY=sk-or-v1-your-key
90
+
91
+ # Option 2: File (recommended)
92
+ mkdir -p ~/.kaseki/secrets
93
+ read -sp 'Enter OpenRouter API key: ' OPENROUTER_KEY
94
+ echo "$OPENROUTER_KEY" > ~/.kaseki/secrets/openrouter_api_key
95
+ chmod 600 ~/.kaseki/secrets/openrouter_api_key
96
+ export OPENROUTER_API_KEY_FILE=~/.kaseki/secrets/openrouter_api_key
97
+ ```
98
+
99
+ ---
100
+
101
+ ## Step 4: Launch the Service
102
+
103
+ ### Option A: Docker Compose (Recommended)
104
+
105
+ ```bash
106
+ # Navigate to repo root
107
+ cd /agents/kaseki-template
108
+
109
+ # Set configuration
110
+ export KASEKI_API_KEYS=sk-your-secret-key-here
111
+ export OPENROUTER_API_KEY_FILE=~/.kaseki/secrets/openrouter_api_key
112
+
113
+ # Get Docker socket GID (required for container to launch kaseki instances)
114
+ export DOCKER_GID="$(stat -c '%g' /var/run/docker.sock)"
115
+
116
+ # Start services
117
+ docker-compose up -d
118
+
119
+ # View logs
120
+ docker-compose logs -f kaseki-api
121
+ ```
122
+
123
+ ### Option B: systemd Service
124
+
125
+ ```bash
126
+ # Copy service file to systemd directory
127
+ sudo cp scripts/kaseki-api.service /etc/systemd/system/
128
+
129
+ # Create environment file
130
+ sudo tee /etc/kaseki.env > /dev/null << 'EOF'
131
+ KASEKI_API_KEYS=sk-your-secret-key-here
132
+ OPENROUTER_API_KEY_FILE=/home/pi/secrets/openrouter_api_key
133
+ KASEKI_API_PORT=8080
134
+ KASEKI_RESULTS_DIR=/agents/kaseki-results
135
+ EOF
136
+
137
+ # Enable and start service
138
+ sudo systemctl daemon-reload
139
+ sudo systemctl enable kaseki-api
140
+ sudo systemctl start kaseki-api
141
+
142
+ # Check status
143
+ sudo systemctl status kaseki-api
144
+
145
+ # View logs
146
+ sudo journalctl -u kaseki-api -f
147
+ ```
148
+
149
+ ### Option C: Direct Node.js (Fallback)
150
+
151
+ ```bash
152
+ # Install dependencies
153
+ npm ci --omit=dev
154
+
155
+ # Build TypeScript
156
+ npm run build
157
+
158
+ # Start API service
159
+ KASEKI_API_KEYS=sk-your-secret-key-here \
160
+ OPENROUTER_API_KEY_FILE=~/.kaseki/secrets/openrouter_api_key \
161
+ npm run kaseki-api
162
+
163
+ # Service runs on http://localhost:8080
164
+ ```
165
+
166
+ ---
167
+
168
+ ## Step 5: Verify the Service
169
+
170
+ ### Health Check
171
+
172
+ ```bash
173
+ # Without authentication (preflight endpoint)
174
+ curl http://localhost:8080/api/health
175
+
176
+ # Response: { "status": "ok" }
177
+ ```
178
+
179
+ ### Authenticated Preflight Check
180
+
181
+ ```bash
182
+ # With API key authentication
183
+ curl -H "Authorization: Bearer sk-your-secret-key-here" \
184
+ http://localhost:8080/api/preflight
185
+
186
+ # Response includes Docker readiness, image status, etc.
187
+ ```
188
+
189
+ ---
190
+
191
+ ## Step 6: Trigger Your First Run
192
+
193
+ ### Via curl
194
+
195
+ ```bash
196
+ curl -X POST http://localhost:8080/api/run \
197
+ -H "Authorization: Bearer sk-your-secret-key-here" \
198
+ -H "Content-Type: application/json" \
199
+ -d '{
200
+ "repo_url": "https://github.com/your-org/your-repo",
201
+ "git_ref": "main",
202
+ "task_prompt": "Fix the bug in parser.ts"
203
+ }'
204
+ ```
205
+
206
+ Response:
207
+
208
+ ```json
209
+ {
210
+ "instance_name": "kaseki-1",
211
+ "status": "queued",
212
+ "estimated_start_time": "2026-05-07T10:15:32Z"
213
+ }
214
+ ```
215
+
216
+ ### Via Node.js Client
217
+
218
+ ```typescript
219
+ import { KasekirClient } from './dist/kaseki-api-client.js';
220
+
221
+ const client = new KasekirClient('http://localhost:8080', 'sk-your-secret-key-here');
222
+
223
+ const result = await client.run({
224
+ repo_url: 'https://github.com/your-org/your-repo',
225
+ git_ref: 'main',
226
+ task_prompt: 'Fix the bug in parser.ts',
227
+ });
228
+
229
+ console.log('Started:', result.instance_name);
230
+ ```
231
+
232
+ ---
233
+
234
+ ## Step 7: Monitor Runs
235
+
236
+ ### Get Run Status
237
+
238
+ ```bash
239
+ curl -H "Authorization: Bearer sk-your-secret-key-here" \
240
+ http://localhost:8080/api/status/kaseki-1
241
+ ```
242
+
243
+ Response:
244
+
245
+ ```json
246
+ {
247
+ "instance_name": "kaseki-1",
248
+ "status": "running",
249
+ "elapsed_seconds": 42,
250
+ "timeout_seconds": 1200,
251
+ "stage": "pi-agent",
252
+ "progress": "Analyzing code..."
253
+ }
254
+ ```
255
+
256
+ ### List All Runs
257
+
258
+ ```bash
259
+ curl -H "Authorization: Bearer sk-your-secret-key-here" \
260
+ http://localhost:8080/api/runs
261
+ ```
262
+
263
+ ### Get Results (After Completion)
264
+
265
+ ```bash
266
+ curl -H "Authorization: Bearer sk-your-secret-key-here" \
267
+ http://localhost:8080/api/results/kaseki-1
268
+ ```
269
+
270
+ ---
271
+
272
+ ## Configuration Reference
273
+
274
+ ### Environment Variables
275
+
276
+ | Variable | Default | Notes |
277
+ |----------|---------|-------|
278
+ | `KASEKI_API_KEYS` | — | Required: comma-separated API keys |
279
+ | `KASEKI_API_KEYS_FILE` | — | Alternative: file with newline-separated keys |
280
+ | `KASEKI_API_PORT` | `8080` | HTTP listen port |
281
+ | `KASEKI_API_LOG_LEVEL` | `info` | Log level: debug, info, warn, error |
282
+ | `KASEKI_API_IMAGE` | `docker.io/cyanautomation/kaseki-agent:latest` | Docker image to use |
283
+ | `KASEKI_API_MAX_CONCURRENT_RUNS` | `3` | Max parallel instances |
284
+ | `KASEKI_AGENT_TIMEOUT_SECONDS` | `1200` | Per-run timeout (20 min) |
285
+ | `KASEKI_MAX_DIFF_BYTES` | `200000` | Max diff size (200 KB) |
286
+ | `OPENROUTER_API_KEY_FILE` | — | Required: path to OpenRouter key file |
287
+ | `KASEKI_RESULTS_DIR` | `/agents/kaseki-results` | Output directory |
288
+
289
+ ### Docker Compose Override
290
+
291
+ To customize Docker Compose, create `docker-compose.override.yml`:
292
+
293
+ ```yaml
294
+ version: '3.8'
295
+
296
+ services:
297
+ kaseki-api:
298
+ environment:
299
+ KASEKI_API_MAX_CONCURRENT_RUNS: 5
300
+ KASEKI_AGENT_TIMEOUT_SECONDS: 3600
301
+ ports:
302
+ - "9000:8080" # Listen on port 9000 instead
303
+ ```
304
+
305
+ ---
306
+
307
+ ## Scaling & Production Setup
308
+
309
+ ### Load Balancing (nginx)
310
+
311
+ ```nginx
312
+ upstream kaseki_api {
313
+ server localhost:8080;
314
+ server host2:8080;
315
+ server host3:8080;
316
+ }
317
+
318
+ server {
319
+ listen 80;
320
+ server_name kaseki.example.com;
321
+
322
+ location /api/ {
323
+ proxy_pass http://kaseki_api;
324
+ proxy_set_header Authorization $http_authorization;
325
+ }
326
+ }
327
+ ```
328
+
329
+ ### Multiple Instances on Different Ports
330
+
331
+ ```bash
332
+ # Instance 1
333
+ export KASEKI_API_PORT=8080
334
+ docker-compose -f docker-compose.yml -p kaseki-1 up -d
335
+
336
+ # Instance 2
337
+ export KASEKI_API_PORT=8081
338
+ docker-compose -f docker-compose.yml -p kaseki-2 up -d
339
+
340
+ # Instance 3
341
+ export KASEKI_API_PORT=8082
342
+ docker-compose -f docker-compose.yml -p kaseki-3 up -d
343
+ ```
344
+
345
+ ### Monitoring & Logging
346
+
347
+ ```bash
348
+ # Real-time logs
349
+ docker-compose logs -f kaseki-api
350
+
351
+ # JSON logs for parsing
352
+ docker-compose logs --format='{{json .}}' kaseki-api | jq .
353
+
354
+ # Log rotation (optional)
355
+ sudo cp ops/logrotate/kaseki-api /etc/logrotate.d/
356
+ ```
357
+
358
+ ---
359
+
360
+ ## Troubleshooting
361
+
362
+ ### "Connection refused"
363
+
364
+ Service is not running:
365
+
366
+ ```bash
367
+ # Check Docker Compose
368
+ docker-compose ps
369
+
370
+ # Check systemd
371
+ sudo systemctl status kaseki-api
372
+
373
+ # Check Node.js process
374
+ ps aux | grep kaseki-api
375
+ ```
376
+
377
+ ### "Unauthorized" (401 error)
378
+
379
+ Invalid or missing API key:
380
+
381
+ ```bash
382
+ # Verify key is set
383
+ echo $KASEKI_API_KEYS
384
+
385
+ # Check curl header
386
+ curl -v -H "Authorization: Bearer sk-your-secret-key" \
387
+ http://localhost:8080/api/health
388
+ ```
389
+
390
+ ### "Max concurrent runs exceeded"
391
+
392
+ All worker slots are in use. Either:
393
+
394
+ 1. Wait for a run to complete
395
+ 2. Increase `KASEKI_API_MAX_CONCURRENT_RUNS`
396
+
397
+ ```bash
398
+ export KASEKI_API_MAX_CONCURRENT_RUNS=10
399
+ docker-compose up -d # Restart with new limit
400
+ ```
401
+
402
+ ### Results Directory Filling Up
403
+
404
+ Clean up old runs:
405
+
406
+ ```bash
407
+ ./scripts/cleanup-kaseki.sh --keep 10
408
+ ```
409
+
410
+ Or configure automatic retention:
411
+
412
+ ```bash
413
+ # In crontab
414
+ 0 2 * * * /agents/kaseki-template/scripts/cleanup-kaseki.sh --keep 20
415
+ ```
416
+
417
+ ---
418
+
419
+ ## Integration Examples
420
+
421
+ ### Python Client
422
+
423
+ ```python
424
+ import requests
425
+
426
+ API_URL = "http://localhost:8080"
427
+ API_KEY = "sk-your-secret-key-here"
428
+
429
+ def run_kaseki(repo_url, git_ref, task_prompt):
430
+ headers = {
431
+ "Authorization": f"Bearer {API_KEY}",
432
+ "Content-Type": "application/json",
433
+ }
434
+
435
+ data = {
436
+ "repo_url": repo_url,
437
+ "git_ref": git_ref,
438
+ "task_prompt": task_prompt,
439
+ }
440
+
441
+ response = requests.post(f"{API_URL}/api/run", headers=headers, json=data)
442
+ return response.json()
443
+
444
+ result = run_kaseki("https://github.com/org/repo", "main", "Fix bug")
445
+ print(f"Started: {result['instance_name']}")
446
+ ```
447
+
448
+ ### Bash Wrapper
449
+
450
+ ```bash
451
+ #!/bin/bash
452
+
453
+ API_URL="http://localhost:8080"
454
+ API_KEY="sk-your-secret-key-here"
455
+ REPO_URL="$1"
456
+ GIT_REF="$2"
457
+ TASK_PROMPT="$3"
458
+
459
+ RESPONSE=$(curl -s -X POST "$API_URL/api/run" \
460
+ -H "Authorization: Bearer $API_KEY" \
461
+ -H "Content-Type: application/json" \
462
+ -d "{
463
+ \"repo_url\": \"$REPO_URL\",
464
+ \"git_ref\": \"$GIT_REF\",
465
+ \"task_prompt\": \"$TASK_PROMPT\"
466
+ }")
467
+
468
+ INSTANCE=$(echo "$RESPONSE" | jq -r '.instance_name')
469
+ echo "Started: $INSTANCE"
470
+
471
+ # Poll for completion
472
+ while true; do
473
+ STATUS=$(curl -s -H "Authorization: Bearer $API_KEY" \
474
+ "$API_URL/api/status/$INSTANCE" | jq -r '.status')
475
+
476
+ [ "$STATUS" = "completed" ] && break
477
+ sleep 5
478
+ done
479
+
480
+ echo "Completed!"
481
+ ```
482
+
483
+ ---
484
+
485
+ ## Next Steps
486
+
487
+ - Set up SSL/TLS for production: [docs/DEPLOYMENT.md](../../docs/DEPLOYMENT.md)
488
+ - Integrate with orchestrators: See integration examples
489
+ - Monitor performance: `kaseki-cli.js` and dashboard
490
+ - Scale horizontally: Deploy multiple API instances behind load balancer
@@ -0,0 +1,194 @@
1
+ # Single Host CLI Setup
2
+
3
+ For running kaseki-agent directly on a single host (Pi, Ubuntu VM, etc.) via command-line.
4
+
5
+ **Complexity**: Low | **Time**: 5-10 minutes
6
+
7
+ ---
8
+
9
+ ## Prerequisites
10
+
11
+ - Docker installed and running
12
+ - Git installed
13
+ - OpenRouter API key
14
+
15
+ ## Step 1: Clone the Repository
16
+
17
+ ```bash
18
+ # On your Pi or host machine
19
+ git clone https://github.com/CyanAutomation/kaseki-agent.git /agents/kaseki-template
20
+ cd /agents/kaseki-template
21
+ ```
22
+
23
+ ## Step 2: Run Interactive Setup
24
+
25
+ ```bash
26
+ ./scripts/kaseki-setup.sh
27
+ ```
28
+
29
+ This will:
30
+
31
+ - Validate Docker is installed
32
+ - Prompt for your OpenRouter API key (securely, not in shell history)
33
+ - Create `~/.kaseki/secrets/openrouter_api_key` with proper permissions
34
+ - Run health checks
35
+
36
+ ## Step 3: Verify Setup
37
+
38
+ ```bash
39
+ /agents/kaseki-template/run-kaseki.sh --doctor
40
+ ```
41
+
42
+ Expected output:
43
+
44
+ ```
45
+ Preflight required dependencies: ok (docker)
46
+ Preflight optional dependencies: ok (curl, wget, sshpass, git, node, npm)
47
+ Docker daemon: running
48
+ Kaseki template image: available
49
+ ✓ Setup is ready!
50
+ ```
51
+
52
+ ## Step 4: Run Your First Task
53
+
54
+ ```bash
55
+ # Set the API key file location
56
+ export OPENROUTER_API_KEY_FILE=~/.kaseki/secrets/openrouter_api_key
57
+
58
+ # Run kaseki-agent against a repository
59
+ ./run-kaseki.sh https://github.com/your-org/your-repo main
60
+ ```
61
+
62
+ Or with inline arguments:
63
+
64
+ ```bash
65
+ REPO_URL=https://github.com/your-org/your-repo \
66
+ GIT_REF=main \
67
+ TASK_PROMPT='Fix the bug in parser.ts' \
68
+ OPENROUTER_API_KEY_FILE=~/.kaseki/secrets/openrouter_api_key \
69
+ ./run-kaseki.sh
70
+ ```
71
+
72
+ ## Step 5: Monitor Results
73
+
74
+ Kaseki creates a numbered instance folder. Check the results:
75
+
76
+ ```bash
77
+ # List all runs
78
+ ls -la /agents/kaseki-results/
79
+
80
+ # Check the first run
81
+ cat /agents/kaseki-results/kaseki-1/result-summary.md
82
+
83
+ # View the git diff
84
+ cat /agents/kaseki-results/kaseki-1/git.diff
85
+
86
+ # Stream live progress (if still running)
87
+ ./kaseki-cli.js watch kaseki-1
88
+ ```
89
+
90
+ ## Convenience: Add to Shell Profile
91
+
92
+ To avoid typing `OPENROUTER_API_KEY_FILE=...` every time:
93
+
94
+ ```bash
95
+ # Add to ~/.bashrc or ~/.zshrc
96
+ export OPENROUTER_API_KEY_FILE=~/.kaseki/secrets/openrouter_api_key
97
+ export REPO_URL=https://github.com/your-org/your-repo
98
+ export GIT_REF=main
99
+
100
+ # Reload shell
101
+ source ~/.bashrc # or ~/.zshrc
102
+ ```
103
+
104
+ Then simply run:
105
+
106
+ ```bash
107
+ ./run-kaseki.sh
108
+ ```
109
+
110
+ ## Common Tasks
111
+
112
+ ### Run a Custom Task
113
+
114
+ ```bash
115
+ TASK_PROMPT='Refactor the authentication module to use async/await' \
116
+ OPENROUTER_API_KEY_FILE=~/.kaseki/secrets/openrouter_api_key \
117
+ ./run-kaseki.sh https://github.com/your-org/your-repo main
118
+ ```
119
+
120
+ ### Increase Agent Timeout
121
+
122
+ ```bash
123
+ KASEKI_AGENT_TIMEOUT_SECONDS=3600 \
124
+ OPENROUTER_API_KEY_FILE=~/.kaseki/secrets/openrouter_api_key \
125
+ ./run-kaseki.sh ...
126
+ ```
127
+
128
+ ### Run Against a Specific Commit
129
+
130
+ ```bash
131
+ GIT_REF=abc1234def5678 \
132
+ OPENROUTER_API_KEY_FILE=~/.kaseki/secrets/openrouter_api_key \
133
+ ./run-kaseki.sh https://github.com/your-org/your-repo abc1234def5678
134
+ ```
135
+
136
+ ### Enable Debug Output
137
+
138
+ ```bash
139
+ KASEKI_DEBUG_RAW_EVENTS=1 \
140
+ OPENROUTER_API_KEY_FILE=~/.kaseki/secrets/openrouter_api_key \
141
+ ./run-kaseki.sh ...
142
+ ```
143
+
144
+ ## Troubleshooting
145
+
146
+ ### "Docker daemon not running"
147
+
148
+ ```bash
149
+ # Start Docker
150
+ sudo systemctl start docker
151
+
152
+ # Or (if not using systemd)
153
+ sudo service docker start
154
+
155
+ # Verify
156
+ docker ps
157
+ ```
158
+
159
+ ### "Permission denied" when accessing Docker
160
+
161
+ ```bash
162
+ # Add user to docker group
163
+ sudo usermod -aG docker "$USER"
164
+
165
+ # Apply immediately
166
+ newgrp docker
167
+
168
+ # Or restart shell
169
+ ```
170
+
171
+ ### "API key not found"
172
+
173
+ ```bash
174
+ # Recreate the key file
175
+ mkdir -p ~/.kaseki/secrets
176
+ read -sp 'Enter your OpenRouter API key: ' OPENROUTER_KEY
177
+ echo "$OPENROUTER_KEY" > ~/.kaseki/secrets/openrouter_api_key
178
+ chmod 600 ~/.kaseki/secrets/openrouter_api_key
179
+ ```
180
+
181
+ ### Agent times out
182
+
183
+ Increase the timeout:
184
+
185
+ ```bash
186
+ KASEKI_AGENT_TIMEOUT_SECONDS=3600 ./run-kaseki.sh ... # 1 hour
187
+ ```
188
+
189
+ ## Next Steps
190
+
191
+ - Review [docs/QUALITY_GATES.md](../../docs/QUALITY_GATES.md) to understand constraints
192
+ - Learn about task prompts: [docs/TASK_PROMPT_TEMPLATES.md](../../docs/TASK_PROMPT_TEMPLATES.md)
193
+ - Monitor runs with CLI: [docs/CLI.md](../../docs/CLI.md)
194
+ - Scale to multiple hosts: [MULTI_HOST_DISTRIBUTED.md](MULTI_HOST_DISTRIBUTED.md)