@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,217 @@
1
+ /**
2
+ * Example: OpenClaw integration with Kaseki API
3
+ *
4
+ * This example shows how OpenClaw would use the Kaseki API to:
5
+ * 1. Submit a coding task to kaseki-agent
6
+ * 2. Monitor progress
7
+ * 3. Retrieve and analyze results
8
+ */
9
+
10
+ import { KasekiApiClient } from './kaseki-api-client';
11
+
12
+ /**
13
+ * Example: Request a bug fix from kaseki-agent
14
+ */
15
+ export async function exampleBugFixWorkflow(): Promise<void> {
16
+ // Initialize client
17
+ const client = new KasekiApiClient('<http://kaseki-host:8080>', 'sk-your-api-key');
18
+
19
+ try {
20
+ // 1. Verify API is healthy
21
+ console.log('Checking API health...');
22
+ const health = await client.getHealth();
23
+ console.log('API health:', health.status);
24
+
25
+ // 2. Submit a bug fix task
26
+ console.log('\nSubmitting bug fix task...');
27
+ const run = await client.submit({
28
+ repoUrl: 'https://github.com/your-org/your-repo',
29
+ ref: 'main',
30
+ taskPrompt: 'Fix the parser bug in src/lib/parser.ts. The bug causes incorrect parsing of nested objects.',
31
+ changedFilesAllowlist: ['src/lib/parser.ts', 'tests/parser.test.ts'],
32
+ maxDiffBytes: 150000,
33
+ validationCommands: ['npm run lint', 'npm run test'],
34
+ });
35
+
36
+ console.log(`Task submitted! Run ID: ${run.id}`);
37
+
38
+ // 3. Monitor progress
39
+ console.log('\nMonitoring progress...');
40
+ const result = await client.waitForCompletion(run.id, {
41
+ timeout: 95 * 60 * 1000, // 95 minutes
42
+ interval: 5000, // Poll every 5 seconds
43
+ onProgress: (status) => {
44
+ const timeoutPercent = status.timeoutRiskPercent || 0;
45
+ const progressMsg = status.progress
46
+ ? `${status.progress.stage} (${status.progress.percentComplete || 0}%)`
47
+ : 'running';
48
+ console.log(`[${status.elapsedSeconds}s] ${status.status}: ${progressMsg} (${timeoutPercent}% timeout risk)`);
49
+ },
50
+ });
51
+
52
+ console.log(`\nRun completed with status: ${result.status}`);
53
+
54
+ // 4. Retrieve detailed analysis
55
+ if (result.status === 'completed') {
56
+ console.log('\nRetrieving analysis...');
57
+ const analysis = await client.getAnalysis(run.id);
58
+
59
+ console.log('Changes made:');
60
+ if (analysis.changes) {
61
+ console.log(` Files modified: ${analysis.changes.changedFiles.join(', ')}`);
62
+ console.log(` Diff size: ${analysis.changes.diffSize} bytes`);
63
+ }
64
+
65
+ console.log('\nValidation results:');
66
+ if (analysis.validation) {
67
+ console.log(` Passed: ${analysis.validation.passed}`);
68
+ for (const cmd of analysis.validation.commandResults) {
69
+ console.log(` - ${cmd.command}: exit code ${cmd.exitCode} (${cmd.elapsed}ms)`);
70
+ }
71
+ }
72
+
73
+ // 5. Download the diff for review
74
+ console.log('\nDownloading diff...');
75
+ const diff = await client.getArtifact(run.id, 'git.diff');
76
+ console.log('Diff preview (first 500 chars):');
77
+ console.log(diff.substring(0, 500));
78
+
79
+ // 6. Get full metadata
80
+ const metadata = await client.getArtifact(run.id, 'metadata.json');
81
+ const meta = JSON.parse(metadata);
82
+ console.log('\nRun metadata:');
83
+ console.log(` Model: ${meta.model}`);
84
+ console.log(` Instance: ${meta.instance}`);
85
+ console.log(` Exit code: ${meta.exitCode}`);
86
+ } else {
87
+ // 7. Handle failure
88
+ console.log(`\nRun failed with: ${result.failureClass}`);
89
+ console.log(`Error: ${result.error}`);
90
+
91
+ // Get stderr for debugging
92
+ const stderr = await client.getLog(run.id, 'stderr');
93
+ console.log('Error output:');
94
+ console.log(stderr.substring(0, 1000));
95
+ }
96
+ } catch (err) {
97
+ console.error('Error:', err);
98
+ process.exit(1);
99
+ }
100
+ }
101
+
102
+ /**
103
+ * Example: Batch submit multiple tasks and wait for all to complete
104
+ */
105
+ export async function exampleBatchWorkflow(): Promise<void> {
106
+ const client = new KasekiApiClient('<http://kaseki-host:8080>', 'sk-your-api-key');
107
+
108
+ const tasks = [
109
+ {
110
+ repoUrl: 'https://github.com/org/repo1',
111
+ taskPrompt: 'Fix typo in README',
112
+ },
113
+ {
114
+ repoUrl: 'https://github.com/org/repo2',
115
+ taskPrompt: 'Update dependencies',
116
+ },
117
+ {
118
+ repoUrl: 'https://github.com/org/repo3',
119
+ taskPrompt: 'Add type annotations to JavaScript files',
120
+ },
121
+ ];
122
+
123
+ console.log(`Submitting ${tasks.length} tasks...\n`);
124
+
125
+ // Submit all tasks
126
+ const runs = await Promise.all(
127
+ tasks.map((task) =>
128
+ client.submit({
129
+ ...task,
130
+ ref: 'main',
131
+ })
132
+ )
133
+ );
134
+
135
+ console.log(`Submitted ${runs.length} runs: ${runs.map((r) => r.id).join(', ')}\n`);
136
+
137
+ // Wait for all to complete
138
+ const results = await Promise.all(
139
+ runs.map((run) =>
140
+ client.waitForCompletion(run.id, {
141
+ onProgress: (status) => {
142
+ console.log(`[${run.id}] ${status.status}`);
143
+ },
144
+ })
145
+ )
146
+ );
147
+
148
+ // Summarize results
149
+ const succeeded = results.filter((r) => r.status === 'completed').length;
150
+ const failed = results.filter((r) => r.status === 'failed').length;
151
+
152
+ console.log(`\nResults: ${succeeded} succeeded, ${failed} failed`);
153
+ }
154
+
155
+ /**
156
+ * Example: Stream logs in real-time (polling)
157
+ */
158
+ export async function exampleStreamLogs(runId: string): Promise<void> {
159
+ const client = new KasekiApiClient('<http://kaseki-host:8080>', 'sk-your-api-key');
160
+
161
+ let lastLineCount = 0;
162
+
163
+ // Poll for new log lines
164
+ const pollInterval = setInterval(async () => {
165
+ try {
166
+ const log = await client.getLog(runId, 'progress');
167
+ const lines = log.split('\n');
168
+ const newLines = lines.slice(lastLineCount);
169
+
170
+ if (newLines.length > 0) {
171
+ console.log(newLines.join('\n'));
172
+ lastLineCount = lines.length;
173
+ }
174
+
175
+ // Check if job is done
176
+ const status = await client.getStatus(runId);
177
+ if (status.status !== 'running' && status.status !== 'queued') {
178
+ clearInterval(pollInterval);
179
+ console.log(`\nJob ${status.status}`);
180
+ }
181
+ } catch (err) {
182
+ console.error('Error polling logs:', err);
183
+ clearInterval(pollInterval);
184
+ }
185
+ }, 5000); // Poll every 5 seconds
186
+ }
187
+
188
+ /**
189
+ * Example: Check queue status
190
+ */
191
+ export async function exampleCheckQueue(): Promise<void> {
192
+ const client = new KasekiApiClient('<http://kaseki-host:8080>', 'sk-your-api-key');
193
+
194
+ const health = await client.getHealth();
195
+ console.log('API Health:', health.status);
196
+
197
+ if (health.status === 'healthy' || health.status === 'degraded') {
198
+ const queue = health.errors;
199
+ console.log(`Queue status:`);
200
+ console.log(` Status: ${health.status}`);
201
+ }
202
+
203
+ // List recent runs
204
+ const runsList = await client.listRuns();
205
+ console.log(`\nRecent runs (${runsList.total} total):`);
206
+ for (const run of runsList.runs.slice(0, 5)) {
207
+ const duration = run.completedAt
208
+ ? Math.round((new Date(run.completedAt).getTime() - new Date(run.createdAt).getTime()) / 1000)
209
+ : '?';
210
+ console.log(` ${run.id}: ${run.status} (${duration}s)`);
211
+ }
212
+ }
213
+
214
+ // Run an example
215
+ if (require.main === module) {
216
+ exampleBugFixWorkflow().catch(console.error);
217
+ }
@@ -0,0 +1,468 @@
1
+ # NPM Package Setup Guide
2
+
3
+ This guide covers installation and usage of `@cyanautomation/kaseki-agent` as an npm package.
4
+
5
+ ## Installation
6
+
7
+ ### Global Install (Recommended)
8
+
9
+ ```bash
10
+ npm install -g @cyanautomation/kaseki-agent
11
+ ```
12
+
13
+ Provides the `kaseki-agent` command globally. After installation, run:
14
+
15
+ ```bash
16
+ kaseki-agent setup
17
+ ```
18
+
19
+ ### Local Project Install
20
+
21
+ ```bash
22
+ npm install @cyanautomation/kaseki-agent
23
+ ```
24
+
25
+ Use with `npx`:
26
+
27
+ ```bash
28
+ npx kaseki-agent setup
29
+ npx kaseki-agent run <repo> <ref>
30
+ ```
31
+
32
+ ### Requirements
33
+
34
+ - **Node.js v24 or higher**
35
+ - **Docker** (for running agent containers)
36
+ - **Linux or macOS** (headless Linux recommended)
37
+ - **Internet access** (for OpenRouter API)
38
+
39
+ ### Verify Installation
40
+
41
+ ```bash
42
+ kaseki-agent doctor
43
+ ```
44
+
45
+ Should output:
46
+
47
+ ```
48
+ ✓ Docker daemon running
49
+ ✓ Node.js v24.x available
50
+ ✓ npm available
51
+ ✓ git available
52
+ ✓ API key configured
53
+ ✓ Disk space: XXX GB available
54
+ ```
55
+
56
+ ---
57
+
58
+ ## First-Time Setup
59
+
60
+ ### 1. Get API Key
61
+
62
+ Sign up for [OpenRouter](https://openrouter.ai/) and create an API key.
63
+
64
+ ### 2. Run Setup Wizard
65
+
66
+ ```bash
67
+ kaseki-agent setup
68
+ ```
69
+
70
+ This interactive wizard will:
71
+
72
+ - Validate your environment
73
+ - Prompt for OpenRouter API key
74
+ - Save configuration (locally or globally)
75
+ - Run health checks
76
+
77
+ ### 3. Test with `doctor`
78
+
79
+ ```bash
80
+ kaseki-agent doctor
81
+ ```
82
+
83
+ All checks should pass.
84
+
85
+ ---
86
+
87
+ ## Basic Usage
88
+
89
+ ### Run Agent on a Repository
90
+
91
+ ```bash
92
+ kaseki-agent run https://github.com/your-org/your-repo main
93
+ ```
94
+
95
+ This will:
96
+
97
+ 1. Create instance `kaseki-1` (or next available number)
98
+ 2. Clone repository at specified branch
99
+ 3. Run Pi agent in Docker container
100
+ 4. Collect results
101
+ 5. Display summary
102
+
103
+ ### View Results
104
+
105
+ ```bash
106
+ # List all instances
107
+ kaseki-agent list
108
+
109
+ # View specific instance
110
+ kaseki-agent report kaseki-1
111
+ ```
112
+
113
+ ---
114
+
115
+ ## Configuration
116
+
117
+ ### Project-Level Configuration
118
+
119
+ Create `kaseki-agent.json` in your project:
120
+
121
+ ```json
122
+ {
123
+ "repo": {
124
+ "url": "https://github.com/your-org/your-repo",
125
+ "ref": "main"
126
+ },
127
+ "agent": {
128
+ "model": "openrouter/free",
129
+ "timeout_seconds": 1200,
130
+ "provider": "openrouter"
131
+ },
132
+ "validation": {
133
+ "allowlist": ["src/lib/", "tests/"],
134
+ "max_diff_bytes": 200000,
135
+ "commands": ["npm run check", "npm run test"]
136
+ }
137
+ }
138
+ ```
139
+
140
+ Then run without args:
141
+
142
+ ```bash
143
+ kaseki-agent run
144
+ ```
145
+
146
+ ### User-Level Configuration
147
+
148
+ Set global defaults:
149
+
150
+ ```bash
151
+ kaseki-agent config set agent.timeout_seconds 1800 --global
152
+ kaseki-agent config set docker.auto_pull true --global
153
+ ```
154
+
155
+ View global config:
156
+
157
+ ```bash
158
+ kaseki-agent config show --global
159
+ ```
160
+
161
+ ### Environment Variables
162
+
163
+ Override configuration via environment:
164
+
165
+ ```bash
166
+ export KASEKI_MODEL=openrouter/free
167
+ export KASEKI_AGENT_TIMEOUT_SECONDS=1200
168
+ export OPENROUTER_API_KEY_FILE=~/.kaseki/secrets/openrouter_api_key
169
+
170
+ kaseki-agent run <repo> <ref>
171
+ ```
172
+
173
+ **Common variables:**
174
+
175
+ - `KASEKI_ROOT` — Results/runs directory (default: /agents)
176
+ - `KASEKI_MODEL` — AI model string
177
+ - `KASEKI_AGENT_TIMEOUT_SECONDS` — Timeout for agent
178
+ - `KASEKI_VALIDATION_COMMANDS` — Validation commands (semicolon-separated)
179
+ - `KASEKI_CHANGED_FILES_ALLOWLIST` — File patterns to allow (space-separated)
180
+ - `OPENROUTER_API_KEY_FILE` — Path to API key file
181
+
182
+ ---
183
+
184
+ ## Advanced Usage
185
+
186
+ ### Custom Task Prompts
187
+
188
+ ```bash
189
+ kaseki-agent run https://github.com/your-org/your-repo main \
190
+ "Fix all TypeScript compilation errors in src/"
191
+ ```
192
+
193
+ The task prompt is passed to the Pi agent for context-specific instructions.
194
+
195
+ ### Filtering Instances
196
+
197
+ ```bash
198
+ # Show only completed
199
+ kaseki-agent list --status completed
200
+
201
+ # Show only failed
202
+ kaseki-agent list --status failed
203
+ ```
204
+
205
+ ### Viewing Detailed Reports
206
+
207
+ ```bash
208
+ kaseki-agent report kaseki-1
209
+ ```
210
+
211
+ Shows:
212
+
213
+ - Instance metadata
214
+ - Execution stages and timing
215
+ - Exit code and status
216
+ - Detailed summary
217
+
218
+ ### Secret Management
219
+
220
+ Store sensitive credentials securely:
221
+
222
+ ```bash
223
+ # Store API key
224
+ kaseki-agent secrets set openrouter-api-key sk-or-...
225
+
226
+ # List stored secrets
227
+ kaseki-agent secrets list
228
+
229
+ # Retrieve (hidden)
230
+ kaseki-agent secrets get openrouter-api-key
231
+
232
+ # Show value (explicit)
233
+ kaseki-agent secrets get openrouter-api-key --show
234
+
235
+ # Delete
236
+ kaseki-agent secrets delete openrouter-api-key
237
+ ```
238
+
239
+ **Storage:**
240
+
241
+ - Linux: `pass` (password-store) keyring
242
+ - Headless: `~/.kaseki/secrets/` (0600 permissions)
243
+
244
+ ---
245
+
246
+ ## Using Docker Image
247
+
248
+ If you don't want to install Node.js:
249
+
250
+ ### Setup
251
+
252
+ ```bash
253
+ docker run -it \
254
+ -v ~/.kaseki/secrets:/secrets \
255
+ docker.io/cyanautomation/kaseki-agent:latest \
256
+ setup
257
+ ```
258
+
259
+ ### Run Agent
260
+
261
+ ```bash
262
+ docker run -it \
263
+ -v ~/.kaseki/secrets:/secrets \
264
+ -v /var/run/docker.sock:/var/run/docker.sock \
265
+ docker.io/cyanautomation/kaseki-agent:latest \
266
+ run https://github.com/your-org/your-repo main
267
+ ```
268
+
269
+ ### Start API Service
270
+
271
+ ```bash
272
+ docker run -d \
273
+ -p 8080:8080 \
274
+ -v ~/.kaseki/secrets:/secrets \
275
+ -v /var/run/docker.sock:/var/run/docker.sock \
276
+ docker.io/cyanautomation/kaseki-agent:latest \
277
+ serve --port 8080
278
+ ```
279
+
280
+ ---
281
+
282
+ ## REST API Service
283
+
284
+ For distributed/async execution:
285
+
286
+ ### Start Service
287
+
288
+ ```bash
289
+ kaseki-agent serve --port 8080
290
+ ```
291
+
292
+ Or with custom port:
293
+
294
+ ```bash
295
+ kaseki-agent serve --port 9000
296
+ ```
297
+
298
+ ### API Endpoints
299
+
300
+ **Health Check**
301
+
302
+ ```bash
303
+ curl http://localhost:8080/health
304
+ ```
305
+
306
+ **List Instances**
307
+
308
+ ```bash
309
+ curl http://localhost:8080/api/runs
310
+ ```
311
+
312
+ **Start Run**
313
+
314
+ ```bash
315
+ curl -X POST http://localhost:8080/api/runs \
316
+ -H "Content-Type: application/json" \
317
+ -d '{
318
+ "repo": "https://github.com/your-org/your-repo",
319
+ "ref": "main",
320
+ "task": "Fix TypeScript errors"
321
+ }'
322
+ ```
323
+
324
+ **Get Instance Status**
325
+
326
+ ```bash
327
+ curl http://localhost:8080/api/runs/kaseki-1
328
+ ```
329
+
330
+ **Stream Logs**
331
+
332
+ ```bash
333
+ curl http://localhost:8080/api/runs/kaseki-1/logs
334
+ ```
335
+
336
+ ---
337
+
338
+ ## Troubleshooting
339
+
340
+ ### Issue: Doctor fails
341
+
342
+ ```bash
343
+ kaseki-agent doctor --fix
344
+ ```
345
+
346
+ This attempts auto-remediation:
347
+
348
+ - Pulls Docker image
349
+ - Provides install instructions
350
+
351
+ ### Issue: Agent times out
352
+
353
+ Increase timeout:
354
+
355
+ ```bash
356
+ kaseki-agent config set agent.timeout_seconds 1800 --global
357
+ ```
358
+
359
+ Or for single run:
360
+
361
+ ```bash
362
+ KASEKI_AGENT_TIMEOUT_SECONDS=1800 kaseki-agent run <repo> <ref>
363
+ ```
364
+
365
+ ### Issue: Docker permission denied
366
+
367
+ ```bash
368
+ # Add current user to docker group
369
+ sudo usermod -aG docker $USER
370
+ newgrp docker
371
+ ```
372
+
373
+ ### Issue: API key not found
374
+
375
+ ```bash
376
+ # Check stored secrets
377
+ kaseki-agent secrets list
378
+
379
+ # Re-setup if needed
380
+ kaseki-agent setup
381
+
382
+ # Or manually set
383
+ kaseki-agent secrets set openrouter-api-key sk-or-...
384
+ ```
385
+
386
+ ### Issue: Out of disk space
387
+
388
+ ```bash
389
+ # Check available space
390
+ kaseki-agent doctor
391
+
392
+ # Clean old instances (optional)
393
+ rm -rf /agents/kaseki-results/kaseki-*
394
+ ```
395
+
396
+ ---
397
+
398
+ ## Configuration Precedence
399
+
400
+ Settings are loaded in this order (first wins):
401
+
402
+ 1. **CLI flags** (`--flag=value`)
403
+ 2. **kaseki-agent.json** (project directory)
404
+ 3. **~/.kaseki/config.json** (home directory)
405
+ 4. **Environment variables** (`KASEKI_*`, `OPENROUTER_*`)
406
+ 5. **Built-in defaults**
407
+
408
+ Example:
409
+
410
+ ```bash
411
+ # Uses CLI flag (highest precedence)
412
+ KASEKI_AGENT_TIMEOUT_SECONDS=900 kaseki-agent run <repo> <ref> --model=custom-model
413
+ ```
414
+
415
+ ---
416
+
417
+ ## Example Workflow
418
+
419
+ ```bash
420
+ # 1. One-time setup
421
+ kaseki-agent setup
422
+
423
+ # 2. Verify environment
424
+ kaseki-agent doctor
425
+
426
+ # 3. Create project config
427
+ cat > kaseki-agent.json << 'EOF'
428
+ {
429
+ "agent": {
430
+ "timeout_seconds": 1200
431
+ },
432
+ "validation": {
433
+ "allowlist": ["src/", "tests/"]
434
+ }
435
+ }
436
+ EOF
437
+
438
+ # 4. Run agent
439
+ kaseki-agent run https://github.com/your-org/your-repo main
440
+
441
+ # 5. Check results
442
+ kaseki-agent list
443
+ kaseki-agent report kaseki-1
444
+
445
+ # 6. Start API service for continuous use
446
+ kaseki-agent serve --port 8080
447
+ ```
448
+
449
+ ---
450
+
451
+ ## Documentation
452
+
453
+ - [README.md](../README.md) — Overview and quick start
454
+ - [docs/SETUP_GUIDE.md](SETUP_GUIDE.md) — Detailed setup walkthrough
455
+ - [docs/CLI.md](CLI.md) — CLI monitoring and debugging
456
+ - [docs/DEPLOYMENT.md](DEPLOYMENT.md) — Production deployment
457
+ - [docs/QUALITY_GATES.md](QUALITY_GATES.md) — Quality gate configuration
458
+
459
+ ---
460
+
461
+ ## Support
462
+
463
+ For issues:
464
+
465
+ 1. Run `kaseki-agent doctor` to check environment
466
+ 2. Check logs in `/agents/kaseki-results/kaseki-N/`
467
+ 3. Enable verbose output: `kaseki-agent --verbose run <repo> <ref>`
468
+ 4. Open issue on [GitHub](https://github.com/CyanAutomation/kaseki-agent)