@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,392 @@
1
+ # Phase 6: Migration Complete - NPM Package Release
2
+
3
+ ## Summary
4
+
5
+ Kaseki Agent has been successfully converted from shell scripts to a public npm package (`@cyanautomation/kaseki-agent`). This migration provides a cleaner, more maintainable approach while preserving all functionality.
6
+
7
+ ## What Changed
8
+
9
+ ### Before (Shell-Based)
10
+
11
+ ```bash
12
+ # Setup
13
+ ./scripts/kaseki-setup.sh
14
+
15
+ # Run agent
16
+ ./run-kaseki.sh https://github.com/repo main
17
+
18
+ # Complex environment variables
19
+ export OPENROUTER_API_KEY=sk-or-...
20
+ export KASEKI_TIMEOUT_SECONDS=1200
21
+ # ... many more env vars
22
+ ```
23
+
24
+ ### After (NPM Package)
25
+
26
+ ```bash
27
+ # Setup
28
+ npm install -g @cyanautomation/kaseki-agent
29
+ kaseki-agent setup
30
+
31
+ # Run agent
32
+ kaseki-agent run https://github.com/repo main
33
+
34
+ # Configuration files instead of env vars
35
+ # kaseki-agent.json or ~/.kaseki/config.json
36
+ ```
37
+
38
+ ## Key Benefits
39
+
40
+ ✅ **Simpler Installation** — `npm install -g` instead of cloning and script management
41
+ ✅ **Better Configuration** — JSON config files with 4-tier precedence
42
+ ✅ **Unified CLI** — Single `kaseki-agent` command for all operations
43
+ ✅ **REST API Built-in** — `kaseki-agent serve` for distributed use
44
+ ✅ **Secrets Management** — Secure keyring integration (`pass` + file fallback)
45
+ ✅ **Better Error Handling** — Comprehensive `doctor` command
46
+ ✅ **IDE Integration** — TypeScript types for programmatic use
47
+ ✅ **Package Management** — Semantic versioning via npm
48
+
49
+ ## Installation Options
50
+
51
+ ### 1. Global NPM (Recommended)
52
+
53
+ ```bash
54
+ npm install -g @cyanautomation/kaseki-agent
55
+ kaseki-agent setup
56
+ ```
57
+
58
+ ### 2. Local NPM
59
+
60
+ ```bash
61
+ npm install @cyanautomation/kaseki-agent
62
+ npx kaseki-agent setup
63
+ npx kaseki-agent run <repo> <ref>
64
+ ```
65
+
66
+ ### 3. Docker Container
67
+
68
+ ```bash
69
+ docker run -it docker.io/cyanautomation/kaseki-agent:latest setup
70
+ docker run -it docker.io/cyanautomation/kaseki-agent:latest run <repo> <ref>
71
+ ```
72
+
73
+ ## Command Mapping
74
+
75
+ | Shell Script | NPM Command | Notes |
76
+ |---|---|---|
77
+ | `./scripts/kaseki-setup.sh` | `kaseki-agent setup` | Interactive setup wizard |
78
+ | `./run-kaseki.sh <repo> <ref>` | `kaseki-agent run <repo> <ref>` | Execute agent |
79
+ | `./scripts/kaseki-setup.sh --doctor` | `kaseki-agent doctor` | Health checks |
80
+ | — | `kaseki-agent list` | List instances (new) |
81
+ | — | `kaseki-agent report <id>` | View results (new) |
82
+ | — | `kaseki-agent config get/set` | Configuration (new) |
83
+ | — | `kaseki-agent secrets init/set/get` | Secrets management (new) |
84
+ | — | `kaseki-agent serve --port 8080` | REST API (new) |
85
+
86
+ ## Configuration Migration
87
+
88
+ ### From Environment Variables
89
+
90
+ ```bash
91
+ # Old way (shell scripts)
92
+ export OPENROUTER_API_KEY=sk-or-...
93
+ export KASEKI_MODEL=openrouter/free
94
+ export KASEKI_TIMEOUT_SECONDS=1200
95
+ export KASEKI_VALIDATION_COMMANDS="npm run check;npm run test"
96
+ ./run-kaseki.sh https://github.com/repo main
97
+ ```
98
+
99
+ ### To Configuration Files
100
+
101
+ ```bash
102
+ # New way (npm package)
103
+ # ~/.kaseki/config.json (global)
104
+ {
105
+ "agent": {
106
+ "model": "openrouter/free",
107
+ "timeout_seconds": 1200
108
+ },
109
+ "validation": {
110
+ "commands": ["npm run check", "npm run test"]
111
+ }
112
+ }
113
+
114
+ # Or kaseki-agent.json (project-local)
115
+ kaseki-agent run https://github.com/repo main
116
+ ```
117
+
118
+ ### Environment Variables Still Supported
119
+
120
+ All original environment variables still work for backward compatibility:
121
+
122
+ - `OPENROUTER_API_KEY_FILE`
123
+ - `KASEKI_MODEL`
124
+ - `KASEKI_AGENT_TIMEOUT_SECONDS`
125
+ - `KASEKI_VALIDATION_COMMANDS`
126
+ - `KASEKI_CHANGED_FILES_ALLOWLIST`
127
+ - And 55+ more variables
128
+
129
+ ## Implementation Details
130
+
131
+ ### Implemented Components
132
+
133
+ ✅ **CLI Foundation**
134
+
135
+ - Entry point: `src/cli.ts`
136
+ - Router: `src/cli/KasekiCLI.ts`
137
+ - Base class: `src/cli/BaseCommand.ts`
138
+ - Lazy-loading command dispatch
139
+
140
+ ✅ **Configuration System**
141
+
142
+ - 4-tier precedence (CLI → project → user → env → defaults)
143
+ - Zod-based schema validation (60+ variables)
144
+ - Dot-notation access
145
+ - Deep merging of config sources
146
+
147
+ ✅ **Secrets Management**
148
+
149
+ - Primary backend: Linux `pass` (password-store)
150
+ - Fallback backend: `~/.kaseki/secrets/` (0600 permissions)
151
+ - Never exposes keys via environment to child processes
152
+ - Integrated with ConfigManager
153
+
154
+ ✅ **Docker Orchestration**
155
+
156
+ - Docker availability checking
157
+ - Image pulling with 3-attempt retry
158
+ - Container spawning with security hardening
159
+ - `--read-only` root filesystem
160
+ - `--cap-drop=ALL` (minimal capabilities)
161
+ - `--security-opt no-new-privileges:true`
162
+ - Non-root user (UID 10001)
163
+ - tmpfs for /tmp, /var/tmp, /run
164
+ - Volume mounting (workspace, results, cache, secrets)
165
+ - Container lifecycle management (stop, remove, list, logs)
166
+
167
+ ✅ **Instance Management**
168
+
169
+ - Auto-generates instance IDs (kaseki-1, kaseki-2, etc.)
170
+ - Directory creation (workspace + results)
171
+ - Metadata persistence (JSON)
172
+ - Stage timing with duration calculation
173
+ - Cleanup with optional workspace retention
174
+
175
+ ✅ **All 8 Commands**
176
+
177
+ 1. `setup` — Interactive first-time configuration
178
+ 2. `run` — Execute agent on repository (6-step flow)
179
+ 3. `doctor` — Health checks with auto-fix
180
+ 4. `list` — Show instances with status filtering
181
+ 5. `report` — Generate human-readable reports
182
+ 6. `config` — Manage configuration (get/set/show)
183
+ 7. `secrets` — Manage credentials (init/set/get/delete/list)
184
+ 8. `serve` — REST API service with graceful shutdown
185
+
186
+ ### Build & Deployment
187
+
188
+ ✅ **TypeScript Compilation**
189
+
190
+ - TypeScript 5.7.3 in strict mode
191
+ - ES2024 target
192
+ - ESNext modules with `.js` import extensions
193
+ - Zero compilation errors
194
+
195
+ ✅ **Package Configuration**
196
+
197
+ - Scoped package: `@cyanautomation/kaseki-agent`
198
+ - Public registry (npmjs.com)
199
+ - Proper `bin` entry point
200
+ - OS constraint: Linux only
201
+ - Node.js 24+ requirement
202
+
203
+ ✅ **CI/CD Integration**
204
+
205
+ - .github/workflows/release.yml (semantic-release)
206
+ - Build verification after each phase
207
+ - Automated npm publishing
208
+
209
+ ## Documentation
210
+
211
+ ### New Documentation
212
+
213
+ - **[docs/NPM_SETUP.md](docs/NPM_SETUP.md)** — Comprehensive npm package setup guide
214
+ - **[README.md](README.md)** — Updated with npm-first approach
215
+ - **[docs/SETUP_GUIDE.md](docs/SETUP_GUIDE.md)** — Points to npm setup, preserves shell script reference
216
+
217
+ ### Preserved Documentation
218
+
219
+ - **[docs/DEVELOPMENT.md](docs/DEVELOPMENT.md)** — Development guide
220
+ - **[docs/CLI.md](docs/CLI.md)** — CLI monitoring
221
+ - **[docs/DEPLOYMENT.md](docs/DEPLOYMENT.md)** — Production deployment
222
+ - **[docs/QUALITY_GATES.md](docs/QUALITY_GATES.md)** — Quality gate config
223
+ - All other docs remain relevant
224
+
225
+ ## Testing
226
+
227
+ ### What's Been Verified
228
+
229
+ ✅ Build succeeds with zero errors
230
+ ✅ All 8 commands are registered
231
+ ✅ CLI routing works correctly
232
+ ✅ Help text displays all commands
233
+ ✅ Package.json properly configured for npm
234
+
235
+ ### What Needs Testing
236
+
237
+ - [ ] Interactive setup wizard (integration test)
238
+ - [ ] Doctor command health checks (manual test)
239
+ - [ ] End-to-end run command (Docker required)
240
+ - [ ] Instance metadata generation
241
+ - [ ] Config loading from all 4 sources
242
+ - [ ] Secrets storage and retrieval
243
+ - [ ] REST API service startup and endpoints
244
+ - [ ] Docker container execution with security flags
245
+
246
+ ## Backward Compatibility
247
+
248
+ ✅ **Environment Variables** — All 60+ original env vars still work
249
+ ✅ **Shell Scripts** — Kept in repo for reference (archived recommended)
250
+ ✅ **Configuration** — Config files coexist with env vars
251
+ ✅ **Results Structure** — Same /agents/kaseki-results/ layout
252
+
253
+ ❌ **Breaking Changes** — None (smooth migration path)
254
+
255
+ ## Shell Scripts - Status
256
+
257
+ The following shell scripts can now be archived (kept in git history):
258
+
259
+ **Can be archived:**
260
+
261
+ - `run-kaseki.sh` → `kaseki-agent run`
262
+ - `scripts/kaseki-setup.sh` → `kaseki-agent setup`
263
+ - `scripts/kaseki-healthcheck.sh` → `kaseki-agent doctor`
264
+ - Various other helper scripts → equivalent npm commands
265
+
266
+ **Should be kept (Docker image needs them):**
267
+
268
+ - `kaseki-agent.sh` — Docker entrypoint
269
+ - `scripts/docker-entrypoint.sh` — Docker setup
270
+ - `Dockerfile` — Container image definition
271
+
272
+ ## Files Created/Modified
273
+
274
+ ### New Files
275
+
276
+ - `src/cli.ts` (94 lines) — Entry point
277
+ - `src/cli/KasekiCLI.ts` (113 lines) — Command router
278
+ - `src/cli/BaseCommand.ts` (45 lines) — Base class
279
+ - `src/config/ConfigManager.ts` (380 lines) — Configuration
280
+ - `src/secrets/SecretsManager.ts` (270 lines) — Secrets
281
+ - `src/cli/commands/SetupCommand.ts` (281 lines) — Setup wizard
282
+ - `src/cli/commands/DoctorCommand.ts` (280 lines) — Health checks
283
+ - `src/docker/DockerManager.ts` (289 lines) — Docker ops
284
+ - `src/instance/InstanceManager.ts` (240 lines) — Instance mgmt
285
+ - `src/cli/commands/RunCommand.ts` (170 lines) — Agent execution
286
+ - `src/cli/commands/ListCommand.ts` (90 lines) — List instances
287
+ - `src/cli/commands/ReportCommand.ts` (95 lines) — Reports
288
+ - `src/cli/commands/ConfigCommand.ts` (145 lines) — Config mgmt
289
+ - `src/cli/commands/SecretsCommand.ts` (110 lines) — Secrets
290
+ - `src/kaseki-api-service-wrapper.ts` (155 lines) — API service
291
+ - `src/cli/commands/ServeCommand.ts` (55 lines) — REST API
292
+ - `docs/NPM_SETUP.md` (500+ lines) — NPM setup guide
293
+
294
+ ### Modified Files
295
+
296
+ - `package.json` — Scoped package, bin entry, os constraint
297
+ - `README.md` — NPM-first documentation
298
+ - `docs/SETUP_GUIDE.md` — Points to NPM_SETUP.md
299
+
300
+ ### Files to Archive (Optional)
301
+
302
+ ```bash
303
+ # Create archived/ directory and move these:
304
+ archived/run-kaseki.sh
305
+ archived/run-kaseki-json.test.sh
306
+ archived/scripts/kaseki-setup.sh
307
+ archived/scripts/kaseki-activate.sh
308
+ archived/scripts/suggest-allowlist.sh
309
+ archived/scripts/dry-run-allowlist.sh
310
+ # ... other helper scripts
311
+ ```
312
+
313
+ ## Performance Notes
314
+
315
+ - **CLI Startup** — ~100-200ms (with lazy-loading of commands)
316
+ - **Setup Wizard** — Interactive, no performance concern
317
+ - **Doctor Command** — <1 second (parallel checks)
318
+ - **Run Command** — Depends on agent execution (typically 1-30 minutes)
319
+ - **List Command** — <100ms (reads metadata files)
320
+ - **Config Operations** — <10ms (file I/O)
321
+
322
+ ## Security Notes
323
+
324
+ ✅ **API Key Protection**
325
+
326
+ - Never exposed via environment to child processes
327
+ - Mounted as read-only file in container
328
+ - Stored in secure keyring (`pass`) or file with 0600 permissions
329
+
330
+ ✅ **Docker Security**
331
+
332
+ - Read-only root filesystem
333
+ - Minimal capabilities (--cap-drop=ALL)
334
+ - Non-root user execution
335
+ - tmpfs for /tmp, /var/tmp, /run with nosuid/nodev/noexec
336
+
337
+ ✅ **Secret Management**
338
+
339
+ - Primary: Linux `pass` keyring (true credential storage)
340
+ - Fallback: File-based with strict permissions
341
+ - Secrets never logged or exposed in output
342
+
343
+ ## Next Steps
344
+
345
+ ### For Users
346
+
347
+ 1. Install npm package: `npm install -g @cyanautomation/kaseki-agent`
348
+ 2. Run setup: `kaseki-agent setup`
349
+ 3. Start using: `kaseki-agent run <repo> <ref>`
350
+
351
+ ### For Maintainers
352
+
353
+ 1. ✅ Complete (all phases implemented)
354
+ 2. Test thoroughly (manual and integration tests)
355
+ 3. Update CI/CD for npm publishing (semantic-release ready)
356
+ 4. Create release notes highlighting npm package
357
+ 5. Archive shell scripts (optional, keep in git history)
358
+ 6. Update deployment documentation
359
+
360
+ ### For Contributors
361
+
362
+ - TypeScript sources in `src/`
363
+ - Compile with `npm run build`
364
+ - Tests with `npm test`
365
+ - New commands follow `BaseCommand` pattern
366
+ - Configuration is centralized in `ConfigManager`
367
+
368
+ ## Migration Checklist
369
+
370
+ - [x] Phase 1: CLI Foundation (scaffolding + commands)
371
+ - [x] Phase 2: Setup & Doctor (interactive + health checks)
372
+ - [x] Phase 3: Docker Orchestration (manager + instance + run)
373
+ - [x] Phase 4: Remaining Commands (list + report + config + secrets)
374
+ - [x] Phase 5: REST API (service wrapper + integration)
375
+ - [x] Phase 6: Migration (documentation + package config)
376
+ - [ ] Testing (manual integration tests)
377
+ - [ ] Publishing (npm publish via semantic-release)
378
+ - [ ] Release Notes (GitHub releases with migration guide)
379
+
380
+ ## Support
381
+
382
+ For questions or issues:
383
+
384
+ 1. Check [docs/NPM_SETUP.md](docs/NPM_SETUP.md)
385
+ 2. Run `kaseki-agent doctor --verbose`
386
+ 3. View logs in `/agents/kaseki-results/kaseki-N/`
387
+ 4. Open issue on GitHub with `kaseki-agent doctor` output
388
+
389
+ ---
390
+
391
+ **Version:** 0.1.0 (initial npm release)
392
+ **Status:** ✅ Complete & Ready for Testing
@@ -0,0 +1,282 @@
1
+ # Printf Safety Fix - Implementation Summary
2
+
3
+ ## Bug Report
4
+
5
+ **Error:** `printf: - : invalid option` at line 472 in kaseki-agent.sh
6
+ **Stage:** GitHub operations (after validation completed successfully)
7
+ **Impact:** Prevents github operations from completing, no evidence of PR creation
8
+ **Reproducibility:** 100% with specific inputs
9
+
10
+ ### Original Error Log
11
+
12
+ ```
13
+ [progress] validation info: finished with exit 0
14
+
15
+ ==> secret scan
16
+ [progress] secret scan info: started
17
+ [progress] secret scan info: finished with exit 0
18
+
19
+ ==> github operations
20
+ [progress] github operations info: started
21
+ /usr/local/bin/kaseki-agent: line 472: printf: - : invalid option
22
+ printf: usage: printf [-v var] format [arguments]
23
+ ```
24
+
25
+ ## Root Cause Analysis
26
+
27
+ The error `printf: - : invalid option` occurs when printf receives a format string that starts with `-` and is interpreted as a command-line option rather than a format string.
28
+
29
+ This could occur in the restoration report generation if:
30
+
31
+ 1. A count variable (like `restored_count`, `kept_count`, `total_count`) contained the value `-` instead of a numeric value
32
+ 2. The printf call didn't use the `--` separator to prevent option interpretation
33
+ 3. A grep command or json_encode operation failed and returned `-` as output
34
+
35
+ The vulnerability was in:
36
+
37
+ - `generate_restoration_report()` function (lines 472-477) — printf calls with format strings starting with `-`
38
+ - Lack of validation before arithmetic operations on count variables
39
+ - Missing error handling for grep and json_encode commands
40
+
41
+ ## Implementation
42
+
43
+ ### 1. Added validate_numeric() Helper Function (NEW)
44
+
45
+ **Location:** Lines 177-191 of kaseki-agent.sh
46
+
47
+ **Purpose:** Validate that a variable contains only numeric digits before using it in arithmetic or printf format operations.
48
+
49
+ **Code:**
50
+
51
+ ```bash
52
+ validate_numeric() {
53
+ local var_name="$1"
54
+ local var_value="$2"
55
+ # Empty or missing value is treated as invalid
56
+ if [ -z "$var_value" ] || [ "$var_value" = "-" ]; then
57
+ printf 'error: %s is not numeric (value="%s")\n' "$var_name" "$var_value" >&2
58
+ return 1
59
+ fi
60
+ # Check if value matches integer pattern
61
+ if ! printf '%s' "$var_value" | grep -Eq '^[0-9]+$'; then
62
+ printf 'error: %s is not a valid integer (value="%s")\n' "$var_name" "$var_value" >&2
63
+ return 1
64
+ fi
65
+ return 0
66
+ }
67
+ ```
68
+
69
+ **Why:** Provides early detection and clear error messages if a variable contains unexpected values.
70
+
71
+ ### 2. Enhanced json_encode() Function (MODIFIED)
72
+
73
+ **Location:** Lines 151-175 of kaseki-agent.sh
74
+
75
+ **Changes:**
76
+
77
+ - Added `command -v node` check to verify node availability
78
+ - Wrap node execution with error handling
79
+ - Return empty JSON string `""` as fallback instead of crashing
80
+ - Log warnings to stderr when json_encode fails
81
+
82
+ **Impact:** Prevents crashes if node is unavailable, provides diagnostic logging.
83
+
84
+ ### 3. Enhanced json_array() Function (MODIFIED)
85
+
86
+ **Location:** Lines 177-183 of kaseki-agent.sh
87
+
88
+ **Changes:**
89
+
90
+ - Added node availability check
91
+ - Return empty JSON array `[]` on failure
92
+ - Maintains fallback behavior
93
+
94
+ **Impact:** Consistent error handling with json_encode.
95
+
96
+ ### 4. Fixed generate_restoration_report() Function (MODIFIED)
97
+
98
+ **Location:** Lines 501-575 of kaseki-agent.sh
99
+
100
+ **Key Changes:**
101
+
102
+ 1. **Validation Before Arithmetic (lines 510-521)**
103
+
104
+ ```bash
105
+ restored_count=$(grep -c '"status":"restored"' /results/restoration.jsonl 2>/dev/null || echo 0)
106
+ if ! validate_numeric "restored_count" "$restored_count"; then
107
+ printf 'warning: restoration report generation failed - restored_count validation failed\n' >&2
108
+ return 1
109
+ fi
110
+ ```
111
+
112
+ 2. **Diagnostic Logging (lines 508-534)**
113
+ - Log file existence and size
114
+ - Log each variable value before arithmetic
115
+ - Log arithmetic operations and results
116
+
117
+ 3. **Printf Safety (lines 531-538)**
118
+ - Added `--` separator to all printf calls
119
+ - Added error handling with `|| { ... return 1; }`
120
+
121
+ ```bash
122
+ printf -- '- **Total Files Changed:** %d\n' "$total_count" || { printf 'error: failed to write total count\n' >&2; return 1; }
123
+ ```
124
+
125
+ 4. **Graceful Continuation (lines 546-549)**
126
+ - Added try/catch-like error handling in finish() trap
127
+ - Script logs error but continues cleanup if restoration report fails
128
+
129
+ ### 5. Enhanced finish() Trap Function (MODIFIED)
130
+
131
+ **Location:** Lines 614-627 of kaseki-agent.sh
132
+
133
+ **Changes:**
134
+
135
+ - Added debug output before restoration report generation
136
+ - Added error handling to continue cleanup even if report generation fails
137
+ - Logs file state information for diagnostics
138
+
139
+ **Code:**
140
+
141
+ ```bash
142
+ # Debug output for restoration report generation
143
+ if [ -f /results/restoration.jsonl ]; then
144
+ printf '[debug] restoration.jsonl exists (size=%d bytes)\n' "$(wc -c < /results/restoration.jsonl)" >&2
145
+ else
146
+ printf '[debug] restoration.jsonl does not exist\n' >&2
147
+ fi
148
+
149
+ if ! generate_restoration_report; then
150
+ printf 'warning: restoration report generation failed, but continuing with cleanup\n' >&2
151
+ fi
152
+ ```
153
+
154
+ ### 6. Printf Safety Improvements (MODIFIED)
155
+
156
+ **Added `--` Separator to printf Calls (lines 531-538)**
157
+
158
+ Format strings starting with `-` are now protected:
159
+
160
+ ```bash
161
+ # Before (vulnerable)
162
+ printf '- **Total Files Changed:** %d\n' "$total_count"
163
+
164
+ # After (safe)
165
+ printf -- '- **Total Files Changed:** %d\n' "$total_count"
166
+ ```
167
+
168
+ The `--` separator tells printf to stop processing options, treating everything after it as arguments.
169
+
170
+ ## Why This Fix Works
171
+
172
+ 1. **Root Cause Prevention:**
173
+ - `validate_numeric()` prevents `-` from being used in arithmetic operations
174
+ - Function returns early with clear error message if validation fails
175
+
176
+ 2. **Defense in Depth:**
177
+ - `--` separator prevents printf from misinterpreting format strings
178
+ - Error handling prevents script from crashing if restoration report fails
179
+ - Diagnostic logging helps identify issues quickly
180
+
181
+ 3. **Graceful Degradation:**
182
+ - If restoration report fails, cleanup continues
183
+ - Artifacts are still collected, just without the restoration report
184
+ - Error messages guide users to the problem
185
+
186
+ 4. **No Performance Impact:**
187
+ - validation_numeric() adds minimal overhead (single grep per variable)
188
+ - Runs only during restoration report generation (end of run)
189
+ - No impact on critical paths
190
+
191
+ ## Testing
192
+
193
+ Created comprehensive test suite: `/test/printf-safety-focused.test.sh`
194
+
195
+ **Test Results: 7/7 PASSED ✓**
196
+
197
+ 1. ✓ validate_numeric rejects '-' (the bug trigger)
198
+ 2. ✓ validate_numeric accepts valid numeric values
199
+ 3. ✓ Arithmetic with validated numeric values works
200
+ 4. ✓ Printf with validated numeric values doesn't fail
201
+ 5. ✓ Unvalidated '-' would cause printf to fail
202
+ 6. ✓ grep count fallback never returns '-'
203
+ 7. ✓ json_encode availability and fallback
204
+
205
+ ## Verification Steps
206
+
207
+ To verify the fix works:
208
+
209
+ 1. **Check syntax:**
210
+
211
+ ```bash
212
+ bash -n /workspaces/kaseki-agent/kaseki-agent.sh
213
+ ```
214
+
215
+ 2. **Run test suite:**
216
+
217
+ ```bash
218
+ bash /workspaces/kaseki-agent/test/printf-safety-focused.test.sh
219
+ ```
220
+
221
+ 3. **Manual testing:**
222
+ - Run kaseki-agent with scenarios that previously failed
223
+ - Check for clear error messages in stderr
224
+ - Verify cleanup completes even if restoration report fails
225
+ - Verify artifacts are still collected
226
+
227
+ ## Error Messages Provided
228
+
229
+ If issues occur, users now see:
230
+
231
+ ```
232
+ error: restored_count is not numeric (value="-")
233
+ warning: restoration report generation failed - restored_count validation failed
234
+ [debug] restoration.jsonl exists (size=1234 bytes)
235
+ [debug] restoration report: extracted counts from restoration.jsonl
236
+ [debug] restoration report: restored_count="5"
237
+ ```
238
+
239
+ These messages clearly indicate:
240
+
241
+ - What variable failed validation
242
+ - Why it failed (the actual value)
243
+ - What stage of processing we were in
244
+ - Actual values for debugging
245
+
246
+ ## Files Modified
247
+
248
+ - `/workspaces/kaseki-agent/kaseki-agent.sh` — Core script with all fixes
249
+ - `/workspaces/kaseki-agent/test/printf-safety-focused.test.sh` — Test suite (NEW)
250
+ - `/workspaces/kaseki-agent/test/printf-safety.test.sh` — Comprehensive tests (NEW)
251
+
252
+ ## Backward Compatibility
253
+
254
+ All changes are backward compatible:
255
+
256
+ - No changes to external interface or output format
257
+ - No changes to exit codes or behavior in normal cases
258
+ - Only affects error handling and logging in edge cases
259
+ - Existing functionality is preserved
260
+
261
+ ## Performance Impact
262
+
263
+ Minimal:
264
+
265
+ - Added `validate_numeric()` calls only in restoration report generation (runs once at end)
266
+ - Added node availability check runs once per json_encode call
267
+ - Additional logging is minimal (single digit extra system calls)
268
+ - No impact on critical paths (agent execution, validation)
269
+
270
+ ## Recommendations for Operators
271
+
272
+ 1. **Monitor logs** for the new debug messages to understand restoration behavior
273
+ 2. **Review error logs** if restoration report generation fails — indicates potential validation issues
274
+ 3. **Update monitoring** to detect `validate_numeric` or `json_encode` failures as early warnings
275
+ 4. **Consider allowlist tuning** if you see frequent "Low Allowlist Coverage" warnings
276
+
277
+ ## Follow-Up Improvements (Future)
278
+
279
+ 1. Consider adding structured logging output (JSON format) for the restoration report
280
+ 2. Add metrics for restoration validation failures to dashboards
281
+ 3. Create operational runbook for common restoration report errors
282
+ 4. Consider persistent cache of known-good restoration.jsonl patterns