@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,265 @@
1
+ #!/usr/bin/env bash
2
+ #
3
+ # kaseki-setup.sh — Interactive setup for kaseki-agent on a local host
4
+ #
5
+ # This script:
6
+ # 1. Validates Docker installation (or guides to install)
7
+ # 2. Prompts for OpenRouter API key securely
8
+ # 3. Stores the key in ~/.kaseki/secrets/openrouter_api_key
9
+ # 4. Runs final health checks
10
+ #
11
+ # Usage: ./scripts/kaseki-setup.sh
12
+
13
+ set -euo pipefail
14
+
15
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
16
+ PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
17
+ SECRETS_DIR="$HOME/.kaseki/secrets"
18
+ API_KEY_FILE="$SECRETS_DIR/openrouter_api_key"
19
+
20
+ # Colors for output
21
+ RED='\033[0;31m'
22
+ GREEN='\033[0;32m'
23
+ YELLOW='\033[1;33m'
24
+ BLUE='\033[0;34m'
25
+ NC='\033[0m' # No Color
26
+
27
+ # Helper functions
28
+ print_header() {
29
+ echo -e "${BLUE}=== $1 ===${NC}"
30
+ }
31
+
32
+ print_success() {
33
+ echo -e "${GREEN}✓ $1${NC}"
34
+ }
35
+
36
+ print_error() {
37
+ echo -e "${RED}✗ $1${NC}" >&2
38
+ }
39
+
40
+ print_warning() {
41
+ echo -e "${YELLOW}⚠ $1${NC}"
42
+ }
43
+
44
+ # Check Docker installation
45
+ check_docker() {
46
+ print_header "Checking Docker Installation"
47
+
48
+ if command -v docker >/dev/null 2>&1; then
49
+ print_success "Docker is installed"
50
+
51
+ # Check if daemon is running
52
+ if docker ps >/dev/null 2>&1; then
53
+ print_success "Docker daemon is running"
54
+ return 0
55
+ else
56
+ print_error "Docker daemon is not running"
57
+ print_warning "Start Docker and try again"
58
+ print_warning " Linux: sudo systemctl start docker"
59
+ print_warning " macOS: open -a Docker"
60
+ return 1
61
+ fi
62
+ else
63
+ print_error "Docker is not installed"
64
+
65
+ # Suggest installation
66
+ if [[ "$OSTYPE" == "linux-gnu"* ]]; then
67
+ print_warning "Install Docker with one of these commands:"
68
+ print_warning ""
69
+ print_warning "Debian/Ubuntu:"
70
+ print_warning " sudo apt update && sudo apt install -y docker.io"
71
+ print_warning ""
72
+ print_warning "Fedora/RHEL/CentOS:"
73
+ print_warning " sudo dnf install -y docker"
74
+ print_warning ""
75
+ print_warning "Arch:"
76
+ print_warning " sudo pacman -S --needed docker"
77
+ elif [[ "$OSTYPE" == "darwin"* ]]; then
78
+ print_warning "Install Docker Desktop for macOS:"
79
+ print_warning " https://docs.docker.com/desktop/install/mac-install/"
80
+ print_warning "Or via Homebrew:"
81
+ print_warning " brew install --cask docker"
82
+ fi
83
+
84
+ return 1
85
+ fi
86
+ }
87
+
88
+ # Set up OpenRouter API key
89
+ setup_api_key() {
90
+ print_header "OpenRouter API Key Setup"
91
+
92
+ # Create secrets directory
93
+ mkdir -p "$SECRETS_DIR"
94
+ chmod 700 "$SECRETS_DIR"
95
+
96
+ # Check if key already exists
97
+ if [ -f "$API_KEY_FILE" ] && [ -s "$API_KEY_FILE" ]; then
98
+ print_warning "API key file already exists at $API_KEY_FILE"
99
+ read -p "Do you want to replace it? (y/n) " -n 1 -r
100
+ echo
101
+ if [[ ! $REPLY =~ ^[Yy]$ ]]; then
102
+ print_success "Using existing API key"
103
+ return 0
104
+ fi
105
+ fi
106
+
107
+ # Prompt for API key securely
108
+ echo "You can obtain an API key from: https://openrouter.ai/keys"
109
+ echo ""
110
+ read -rsp "Enter your OpenRouter API key (sk-or-v1-...): " API_KEY
111
+ echo
112
+
113
+ # Validate key format
114
+ if [[ ! "$API_KEY" =~ ^sk-or ]]; then
115
+ print_error "Invalid API key format. Must start with 'sk-or'"
116
+ return 1
117
+ fi
118
+
119
+ # Store key securely
120
+ echo "$API_KEY" > "$API_KEY_FILE"
121
+ chmod 600 "$API_KEY_FILE"
122
+ print_success "API key stored in $API_KEY_FILE (mode 600)"
123
+ }
124
+
125
+ # Run preflight checks
126
+ run_preflight_checks() {
127
+ print_header "Running Preflight Checks"
128
+
129
+ # Use enhanced preflight script if available
130
+ if [ -x "$SCRIPT_DIR/kaseki-preflight.sh" ]; then
131
+ if "$SCRIPT_DIR/kaseki-preflight.sh" run; then
132
+ print_success "All preflight checks passed"
133
+ return 0
134
+ else
135
+ print_error "Some preflight checks failed"
136
+ return 1
137
+ fi
138
+ else
139
+ print_warning "kaseki-preflight.sh not found, skipping enhanced checks"
140
+ return 0
141
+ fi
142
+ }
143
+
144
+ # Run health check
145
+ run_health_check() {
146
+ print_header "Running Health Check"
147
+
148
+ cd "$PROJECT_ROOT"
149
+
150
+ if ./run-kaseki.sh --doctor 2>&1 | tail -20; then
151
+ print_success "Health check passed"
152
+ return 0
153
+ else
154
+ print_error "Health check failed"
155
+ return 1
156
+ fi
157
+ }
158
+
159
+ # Optional: Add to shell profile
160
+ offer_shell_profile_update() {
161
+ print_header "Shell Profile Configuration (Optional)"
162
+
163
+ echo "Would you like to add the API key path to your shell profile?"
164
+ echo "This makes running kaseki-agent easier (no need to set OPENROUTER_API_KEY_FILE)."
165
+ echo ""
166
+
167
+ read -p "Add to shell profile? (y/n) " -n 1 -r
168
+ echo
169
+
170
+ if [[ ! $REPLY =~ ^[Yy]$ ]]; then
171
+ return 0
172
+ fi
173
+
174
+ # Detect shell
175
+ if [ -f "$HOME/.bashrc" ]; then
176
+ PROFILE_FILE="$HOME/.bashrc"
177
+ elif [ -f "$HOME/.zshrc" ]; then
178
+ PROFILE_FILE="$HOME/.zshrc"
179
+ else
180
+ print_warning "Could not detect shell profile. Skipping."
181
+ return 0
182
+ fi
183
+
184
+ EXPORT_LINE="export OPENROUTER_API_KEY_FILE=$API_KEY_FILE"
185
+
186
+ # Check if already in profile
187
+ if grep -q "OPENROUTER_API_KEY_FILE" "$PROFILE_FILE"; then
188
+ print_warning "OPENROUTER_API_KEY_FILE already in $PROFILE_FILE"
189
+ return 0
190
+ fi
191
+
192
+ # Add to profile
193
+ {
194
+ echo ""
195
+ echo "# Kaseki Agent API key (added by kaseki-setup.sh)"
196
+ echo "$EXPORT_LINE"
197
+ } >> "$PROFILE_FILE"
198
+
199
+ print_success "Added to $PROFILE_FILE"
200
+ echo ""
201
+ echo "Reload your shell with:"
202
+ echo " source $PROFILE_FILE"
203
+ echo "or restart your terminal"
204
+ }
205
+
206
+ # Main workflow
207
+ main() {
208
+ echo ""
209
+ echo "╔════════════════════════════════════════════════════════════╗"
210
+ echo "║ Kaseki Agent - Interactive Setup Wizard ║"
211
+ echo "╚════════════════════════════════════════════════════════════╝"
212
+ echo ""
213
+
214
+ # Step 1: Check Docker
215
+ if ! check_docker; then
216
+ print_error "Setup cannot continue without Docker. Please install Docker first."
217
+ exit 1
218
+ fi
219
+ echo ""
220
+
221
+ # Step 2: Set up API key
222
+ if ! setup_api_key; then
223
+ print_error "Failed to set up API key."
224
+ exit 1
225
+ fi
226
+ echo ""
227
+
228
+ # Step 3: Run preflight checks
229
+ if ! run_preflight_checks; then
230
+ print_warning "Some checks failed. Installation may have issues."
231
+ fi
232
+ echo ""
233
+
234
+ # Step 4: Run health check
235
+ if ! run_health_check; then
236
+ print_warning "Health check failed. Please review the output above."
237
+ fi
238
+ echo ""
239
+
240
+ # Step 5: Offer shell profile update
241
+ offer_shell_profile_update
242
+ echo ""
243
+
244
+ # Success message
245
+ echo "╔════════════════════════════════════════════════════════════╗"
246
+ echo -e "${GREEN}║ Setup Complete! ✓ ║${NC}"
247
+ echo "╚════════════════════════════════════════════════════════════╝"
248
+ echo ""
249
+ echo "Next steps:"
250
+ echo " 1. Reload your shell (or restart terminal):"
251
+ echo " source $HOME/.bashrc # or .zshrc"
252
+ echo ""
253
+ echo " 2. Run your first task:"
254
+ echo " cd $PROJECT_ROOT"
255
+ echo " ./run-kaseki.sh https://github.com/your-org/your-repo main"
256
+ echo ""
257
+ echo " 3. Learn more:"
258
+ echo " - Single host: docs/SETUP_GUIDE.md"
259
+ echo " - Multi-host: scripts/templates/MULTI_HOST_DISTRIBUTED.md"
260
+ echo " - REST API: scripts/templates/REST_API_SERVICE.md"
261
+ echo ""
262
+ }
263
+
264
+ # Run main
265
+ main "$@"
@@ -0,0 +1,213 @@
1
+ #!/usr/bin/env bash
2
+ #
3
+ # pi-setup-remote.sh — Remote setup for kaseki-agent via SSH
4
+ #
5
+ # This script bootstraps a remote Pi or host for kaseki-agent execution.
6
+ # It:
7
+ # 1. Validates SSH connectivity
8
+ # 2. Creates secrets directory on remote host
9
+ # 3. Securely transfers OpenRouter API key
10
+ # 4. Runs kaseki bootstrap (installs/deploys kaseki-agent)
11
+ # 5. Validates readiness with health check
12
+ #
13
+ # Usage:
14
+ # ./scripts/pi-setup-remote.sh pi@192.168.88.201 sk-or-v1-xxx
15
+ # ./scripts/pi-setup-remote.sh pi@192.168.88.201 ~/my-openrouter-key.txt
16
+
17
+ set -euo pipefail
18
+
19
+ # Colors for output
20
+ RED='\033[0;31m'
21
+ GREEN='\033[0;32m'
22
+ YELLOW='\033[1;33m'
23
+ BLUE='\033[0;34m'
24
+ NC='\033[0m'
25
+
26
+ # Helper functions
27
+ print_header() {
28
+ echo -e "${BLUE}=== $1 ===${NC}"
29
+ }
30
+
31
+ print_success() {
32
+ echo -e "${GREEN}✓ $1${NC}"
33
+ }
34
+
35
+ print_error() {
36
+ echo -e "${RED}✗ $1${NC}" >&2
37
+ }
38
+
39
+ print_warning() {
40
+ echo -e "${YELLOW}⚠ $1${NC}"
41
+ }
42
+
43
+ # Validate arguments
44
+ if [ $# -lt 2 ]; then
45
+ echo "Usage: $0 <remote-host> <api-key-or-file>"
46
+ echo ""
47
+ echo "Examples:"
48
+ echo " $0 pi@192.168.88.201 sk-or-v1-your-key"
49
+ echo " $0 pi@192.168.88.201 ~/my-openrouter-key.txt"
50
+ echo ""
51
+ exit 1
52
+ fi
53
+
54
+ REMOTE_HOST="$1"
55
+ API_KEY_SOURCE="$2"
56
+ REMOTE_SECRETS_DIR="$HOME/.kaseki/secrets"
57
+ REMOTE_API_KEY_FILE="$REMOTE_SECRETS_DIR/openrouter_api_key"
58
+ REMOTE_KASEKI_TEMPLATE="/agents/kaseki-template"
59
+ REMOTE_KASEKI_INSTALL_SCRIPT="$REMOTE_KASEKI_TEMPLATE/scripts/kaseki-install.sh"
60
+
61
+ # Determine if API_KEY_SOURCE is a file or inline key
62
+ if [ -f "$API_KEY_SOURCE" ]; then
63
+ # It's a file, read it
64
+ if [ ! -r "$API_KEY_SOURCE" ]; then
65
+ print_error "Cannot read API key file: $API_KEY_SOURCE"
66
+ exit 1
67
+ fi
68
+ API_KEY=$(<"$API_KEY_SOURCE")
69
+ elif [[ "$API_KEY_SOURCE" =~ ^sk-or ]]; then
70
+ # It's an inline key
71
+ API_KEY="$API_KEY_SOURCE"
72
+ else
73
+ print_error "Invalid API key source. Must be either:"
74
+ print_error " - A file path"
75
+ print_error " - An inline key starting with 'sk-or'"
76
+ exit 1
77
+ fi
78
+
79
+ # Validate API key format
80
+ if [[ ! "$API_KEY" =~ ^sk-or ]]; then
81
+ print_error "Invalid API key format. Must start with 'sk-or'"
82
+ exit 1
83
+ fi
84
+
85
+ main() {
86
+ echo ""
87
+ echo "╔════════════════════════════════════════════════════════════╗"
88
+ echo "║ Kaseki Agent - Remote Setup via SSH ║"
89
+ echo "╚════════════════════════════════════════════════════════════╝"
90
+ echo ""
91
+
92
+ print_header "Setup Configuration"
93
+ echo "Remote host: $REMOTE_HOST"
94
+ echo "Secrets dir: $REMOTE_SECRETS_DIR"
95
+ echo "API key file: $REMOTE_API_KEY_FILE"
96
+ echo "Kaseki template: $REMOTE_KASEKI_TEMPLATE"
97
+ echo ""
98
+
99
+ # Step 1: Test SSH connectivity
100
+ print_header "SSH Connectivity Check"
101
+ if ssh -o ConnectTimeout=5 "$REMOTE_HOST" "echo 'SSH OK'" >/dev/null 2>&1; then
102
+ print_success "SSH connectivity to $REMOTE_HOST"
103
+ else
104
+ print_error "Cannot connect to $REMOTE_HOST via SSH"
105
+ print_warning "Make sure:"
106
+ print_warning " 1. Host is reachable"
107
+ print_warning " 2. SSH keys are configured (or use -i flag)"
108
+ print_warning " 3. You have permission to connect"
109
+ exit 1
110
+ fi
111
+ echo ""
112
+
113
+ # Step 2: Create secrets directory
114
+ print_header "Creating Secrets Directory on Remote Host"
115
+ # shellcheck disable=SC2029
116
+ if ssh "$REMOTE_HOST" "
117
+ mkdir -p '$REMOTE_SECRETS_DIR'
118
+ chmod 700 '$REMOTE_SECRETS_DIR'
119
+ [ -d '$REMOTE_SECRETS_DIR' ] && echo 'Secrets directory created'
120
+ " >/dev/null 2>&1; then
121
+ print_success "Secrets directory created/verified"
122
+ else
123
+ print_error "Failed to create secrets directory on remote host"
124
+ exit 1
125
+ fi
126
+ echo ""
127
+
128
+ # Step 3: Transfer API key securely via SSH
129
+ print_header "Transferring OpenRouter API Key"
130
+ echo "API key:"
131
+ echo " Source: $([ -f "$API_KEY_SOURCE" ] && echo "$API_KEY_SOURCE" || echo 'inline')"
132
+ echo " Destination: $REMOTE_HOST:$REMOTE_API_KEY_FILE"
133
+ echo ""
134
+
135
+ # Use stdin to pipe key to remote host (avoids exposing in process list)
136
+ # shellcheck disable=SC2029
137
+ if echo "$API_KEY" | ssh "$REMOTE_HOST" "
138
+ cat > '$REMOTE_API_KEY_FILE'
139
+ chmod 600 '$REMOTE_API_KEY_FILE'
140
+ [ -f '$REMOTE_API_KEY_FILE' ] && echo 'API key transferred'
141
+ " >/dev/null 2>&1; then
142
+ print_success "API key transferred securely"
143
+ else
144
+ print_error "Failed to transfer API key"
145
+ exit 1
146
+ fi
147
+ echo ""
148
+
149
+ # Step 4: Bootstrap kaseki-agent on remote host
150
+ print_header "Bootstrapping Kaseki Agent"
151
+ echo "This may take a few minutes the first time (cloning repo, pulling image)..."
152
+ echo ""
153
+
154
+ # Bootstrap via remote kaseki-install.sh if it exists, else via curl
155
+ # shellcheck disable=SC2029
156
+ BOOTSTRAP_CMD='
157
+ if [ -f '"$REMOTE_KASEKI_INSTALL_SCRIPT"' ]; then
158
+ KASEKI_CONTROLLER_MODE=1 KASEKI_REPLACE_STALE=1 '"$REMOTE_KASEKI_INSTALL_SCRIPT"'
159
+ else
160
+ echo "Kaseki template not found. Installing via curl..." >&2
161
+ curl -fsSL https://raw.githubusercontent.com/CyanAutomation/kaseki-agent/main/scripts/kaseki-install.sh | \
162
+ KASEKI_CONTROLLER_MODE=1 KASEKI_REPLACE_STALE=1 sh
163
+ fi
164
+ '
165
+
166
+ # shellcheck disable=SC2029
167
+ if ssh "$REMOTE_HOST" "${BOOTSTRAP_CMD}" 2>&1 | tail -20; then
168
+ print_success "Bootstrap completed"
169
+ else
170
+ print_error "Bootstrap failed. Check the output above."
171
+ exit 1
172
+ fi
173
+ echo ""
174
+
175
+ # Step 5: Verify readiness with health check
176
+ print_header "Verifying Readiness (Running --doctor)"
177
+ # shellcheck disable=SC2029
178
+ HEALTH_CHECK_CMD="
179
+ export OPENROUTER_API_KEY_FILE=$REMOTE_API_KEY_FILE
180
+ $REMOTE_KASEKI_TEMPLATE/run-kaseki.sh --doctor
181
+ "
182
+
183
+ # shellcheck disable=SC2029
184
+ if ssh "$REMOTE_HOST" "${HEALTH_CHECK_CMD}" 2>&1 | tail -15; then
185
+ print_success "Health check passed"
186
+ else
187
+ print_warning "Health check reported issues. Review the output above."
188
+ fi
189
+ echo ""
190
+
191
+ # Success message
192
+ echo "╔════════════════════════════════════════════════════════════╗"
193
+ echo -e "${GREEN}║ Setup Complete for $REMOTE_HOST! ✓ ║${NC}"
194
+ echo "╚════════════════════════════════════════════════════════════╝"
195
+ echo ""
196
+ echo "Next steps:"
197
+ echo " 1. Test a remote run:"
198
+ echo " ssh $REMOTE_HOST '"
199
+ echo " OPENROUTER_API_KEY_FILE=$REMOTE_API_KEY_FILE \\"
200
+ echo " $REMOTE_KASEKI_TEMPLATE/run-kaseki.sh \\"
201
+ echo " https://github.com/your-org/your-repo main"
202
+ echo " '"
203
+ echo ""
204
+ echo " 2. Retrieve results:"
205
+ echo " scp -r $REMOTE_HOST:/agents/kaseki-results/kaseki-1 ~/results/"
206
+ echo ""
207
+ echo " 3. For multi-host setup, repeat for other hosts:"
208
+ echo " $0 pi@192.168.88.202 \$(cat ~/.kaseki/secrets/openrouter_api_key)"
209
+ echo ""
210
+ }
211
+
212
+ # Run main
213
+ main "$@"
@@ -0,0 +1,42 @@
1
+ #!/bin/bash
2
+ # Configure GitHub labels for kaseki-agent
3
+ # This script uses GitHub CLI (gh) to create standard labels
4
+
5
+ # Requires: gh CLI with authentication
6
+ # Install: https://cli.github.com/
7
+ # Login: gh auth login
8
+
9
+ set -e
10
+
11
+ REPO="CyanAutomation/kaseki-agent"
12
+
13
+ echo "🏷️ Creating GitHub labels for $REPO..."
14
+
15
+ # Define labels: name, color, description
16
+ declare -A labels=(
17
+ ["bug"]="d73a49|Something is broken"
18
+ ["feature"]="0075ca|New capability or enhancement"
19
+ ["security"]="ae2a23|Security vulnerability or hardening"
20
+ ["documentation"]="0e8a16|Documentation, guides, or comments"
21
+ ["infrastructure"]="8f1a9a|Docker, CI/CD, operations, or deployment"
22
+ ["good first issue"]="7057ff|Good for newcomers or new contributors"
23
+ ["help wanted"]="fbca04|Need community input or assistance"
24
+ ["stale"]="cccccc|Inactive or abandoned issue"
25
+ ["testing"]="e99695|Tests, test coverage, or test improvements"
26
+ ["performance"]="fbcf3f|Performance optimization or benchmarking"
27
+ ["dependencies"]="0366d6|Dependency updates or version management"
28
+ )
29
+
30
+ for label in "${!labels[@]}"; do
31
+ IFS='|' read -r color description <<< "${labels[$label]}"
32
+ echo " Creating label: $label (color: $color)"
33
+ gh label create "$label" \
34
+ --repo "$REPO" \
35
+ --color "$color" \
36
+ --description "$description" \
37
+ --force 2>/dev/null || true
38
+ done
39
+
40
+ echo "✅ Labels created successfully!"
41
+ echo ""
42
+ echo "Verify labels at: https://github.com/$REPO/labels"
@@ -0,0 +1,68 @@
1
+ #!/bin/bash
2
+ # suggest-allowlist.sh - Suggest allowlist patterns based on a completed kaseki run
3
+ # Usage: ./scripts/suggest-allowlist.sh <results-dir>
4
+ # Example: ./scripts/suggest-allowlist.sh /agents/kaseki-results/kaseki-1
5
+
6
+ set -e
7
+
8
+ RESULTS_DIR="${1:-.}"
9
+
10
+ if [ ! -f "$RESULTS_DIR/changed-files.txt" ]; then
11
+ echo "❌ changed-files.txt not found in $RESULTS_DIR" >&2
12
+ exit 1
13
+ fi
14
+
15
+ # Count files by directory pattern
16
+ declare -A dir_counts
17
+
18
+ while IFS= read -r file || [ -n "$file" ]; do
19
+ [ -z "$file" ] && continue
20
+
21
+ # Extract directory pattern (e.g., src/lib -> src/lib, src -> src)
22
+ dir=$(dirname "$file")
23
+ dir=${dir#./} # Remove leading ./
24
+
25
+ # Increment counter
26
+ dir_counts["$dir"]=$((${dir_counts["$dir"]:-0} + 1))
27
+
28
+ # Also track top-level directory
29
+ top_dir=$(echo "$dir" | cut -d'/' -f1)
30
+ dir_counts["$top_dir/**"]=$((${dir_counts["$top_dir/**"]:-0} + 1))
31
+ done < "$RESULTS_DIR/changed-files.txt"
32
+
33
+ # Sort by count (descending) and print suggestions
34
+ {
35
+ printf '# Suggested allowlist based on: %s\n\n' "$(basename "$RESULTS_DIR")"
36
+ printf '## Option 1: Specific directories (most restrictive)\n'
37
+ printf 'Use this to be more specific about which directories are allowed:\n\n'
38
+ printf '```bash\nKASEKI_CHANGED_FILES_ALLOWLIST="\n'
39
+
40
+ for dir in "${!dir_counts[@]}"; do
41
+ printf ' %s\n' "$dir"
42
+ done | sort | head -10
43
+
44
+ printf '"\n```\n\n'
45
+
46
+ printf '## Option 2: Top-level directories (less restrictive)\n'
47
+ printf 'Use this to allow entire directory trees:\n\n'
48
+ printf '```bash\nKASEKI_CHANGED_FILES_ALLOWLIST="\n'
49
+
50
+ for dir in "${!dir_counts[@]}"; do
51
+ if [[ "$dir" == *"/**" ]]; then
52
+ printf ' %s\n' "$dir"
53
+ fi
54
+ done | sort | uniq
55
+
56
+ printf '"\n```\n\n'
57
+
58
+ printf '## Statistics\n'
59
+ printf '- Total files changed: %s\n' "$(wc -l < "$RESULTS_DIR/changed-files.txt")"
60
+ printf '- Unique directories: %s\n' "${#dir_counts[@]}"
61
+ printf '\n## All changed files\n\n'
62
+ printf '```\n'
63
+ sort "$RESULTS_DIR/changed-files.txt"
64
+ printf '```\n'
65
+ } > "$RESULTS_DIR/allowlist-suggestions.md"
66
+
67
+ echo "✅ Suggestions written to: $RESULTS_DIR/allowlist-suggestions.md"
68
+ cat "$RESULTS_DIR/allowlist-suggestions.md"