@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.
- package/.dockerignore +54 -0
- package/.eslintignore +11 -0
- package/.eslintrc.json +95 -0
- package/.github/ISSUE_TEMPLATE/bug_report.md +53 -0
- package/.github/ISSUE_TEMPLATE/feature_request.md +53 -0
- package/.github/ISSUE_TEMPLATE/security.md +51 -0
- package/.github/PULL_REQUEST_TEMPLATE/default.md +71 -0
- package/.github/dependabot.yml +38 -0
- package/.github/skills/dependency-cache-optimization/SKILL.md +526 -0
- package/.github/skills/docker-image-management/SKILL.md +532 -0
- package/.github/skills/frontend-design/SKILL.md +782 -0
- package/.github/skills/prompt-engineering/SKILL.md +360 -0
- package/.github/skills/quality-gate-config/SKILL.md +591 -0
- package/.github/skills/result-report-analysis/SKILL.md +576 -0
- package/.github/skills/test-automation/SKILL.md +593 -0
- package/.github/skills/workflow-diagnosis/SKILL.md +468 -0
- package/.github/workflows/build-docker-image.yml +453 -0
- package/.github/workflows/release.yml +68 -0
- package/.releaserc.json +135 -0
- package/CHANGELOG.md +117 -0
- package/CLAUDE.md +336 -0
- package/CONTRIBUTING.md +339 -0
- package/Dockerfile +217 -0
- package/README.md +1527 -0
- package/STYLE.md +521 -0
- package/add-js-extensions.d.ts +9 -0
- package/add-js-extensions.d.ts.map +1 -0
- package/add-js-extensions.js.map +1 -0
- package/dist/add-js-extensions.d.ts +9 -0
- package/dist/add-js-extensions.d.ts.map +1 -0
- package/dist/add-js-extensions.js +52 -0
- package/dist/add-js-extensions.js.map +1 -0
- package/dist/ansi-colors.d.ts +26 -0
- package/dist/ansi-colors.d.ts.map +1 -0
- package/dist/ansi-colors.js +51 -0
- package/dist/ansi-colors.js.map +1 -0
- package/dist/cli/BaseCommand.d.ts +18 -0
- package/dist/cli/BaseCommand.d.ts.map +1 -0
- package/dist/cli/BaseCommand.js +31 -0
- package/dist/cli/BaseCommand.js.map +1 -0
- package/dist/cli/KasekiCLI.d.ts +30 -0
- package/dist/cli/KasekiCLI.d.ts.map +1 -0
- package/dist/cli/KasekiCLI.js +134 -0
- package/dist/cli/KasekiCLI.js.map +1 -0
- package/dist/cli/commands/ConfigCommand.d.ts +13 -0
- package/dist/cli/commands/ConfigCommand.d.ts.map +1 -0
- package/dist/cli/commands/ConfigCommand.js +131 -0
- package/dist/cli/commands/ConfigCommand.js.map +1 -0
- package/dist/cli/commands/DoctorCommand.d.ts +45 -0
- package/dist/cli/commands/DoctorCommand.d.ts.map +1 -0
- package/dist/cli/commands/DoctorCommand.js +309 -0
- package/dist/cli/commands/DoctorCommand.js.map +1 -0
- package/dist/cli/commands/ListCommand.d.ts +9 -0
- package/dist/cli/commands/ListCommand.d.ts.map +1 -0
- package/dist/cli/commands/ListCommand.js +81 -0
- package/dist/cli/commands/ListCommand.js.map +1 -0
- package/dist/cli/commands/ReportCommand.d.ts +9 -0
- package/dist/cli/commands/ReportCommand.d.ts.map +1 -0
- package/dist/cli/commands/ReportCommand.js +98 -0
- package/dist/cli/commands/ReportCommand.js.map +1 -0
- package/dist/cli/commands/RunCommand.d.ts +13 -0
- package/dist/cli/commands/RunCommand.d.ts.map +1 -0
- package/dist/cli/commands/RunCommand.js +191 -0
- package/dist/cli/commands/RunCommand.js.map +1 -0
- package/dist/cli/commands/SecretsCommand.d.ts +9 -0
- package/dist/cli/commands/SecretsCommand.d.ts.map +1 -0
- package/dist/cli/commands/SecretsCommand.js +109 -0
- package/dist/cli/commands/SecretsCommand.js.map +1 -0
- package/dist/cli/commands/ServeCommand.d.ts +9 -0
- package/dist/cli/commands/ServeCommand.d.ts.map +1 -0
- package/dist/cli/commands/ServeCommand.js +50 -0
- package/dist/cli/commands/ServeCommand.js.map +1 -0
- package/dist/cli/commands/SetupCommand.d.ts +42 -0
- package/dist/cli/commands/SetupCommand.d.ts.map +1 -0
- package/dist/cli/commands/SetupCommand.js +249 -0
- package/dist/cli/commands/SetupCommand.js.map +1 -0
- package/dist/cli.d.ts +9 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +130 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/ConfigManager.d.ts +395 -0
- package/dist/config/ConfigManager.d.ts.map +1 -0
- package/dist/config/ConfigManager.js +446 -0
- package/dist/config/ConfigManager.js.map +1 -0
- package/dist/docker/DockerManager.d.ts +69 -0
- package/dist/docker/DockerManager.d.ts.map +1 -0
- package/dist/docker/DockerManager.js +266 -0
- package/dist/docker/DockerManager.js.map +1 -0
- package/dist/event-aggregator.d.ts +71 -0
- package/dist/event-aggregator.d.ts.map +1 -0
- package/dist/event-aggregator.js +95 -0
- package/dist/event-aggregator.js.map +1 -0
- package/dist/github-app-token.d.ts +16 -0
- package/dist/github-app-token.d.ts.map +1 -0
- package/dist/github-app-token.js +148 -0
- package/dist/github-app-token.js.map +1 -0
- package/dist/idempotency-store.d.ts +61 -0
- package/dist/idempotency-store.d.ts.map +1 -0
- package/dist/idempotency-store.js +321 -0
- package/dist/idempotency-store.js.map +1 -0
- package/dist/index.d.ts +25 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +31 -0
- package/dist/index.js.map +1 -0
- package/dist/instance/InstanceManager.d.ts +81 -0
- package/dist/instance/InstanceManager.d.ts.map +1 -0
- package/dist/instance/InstanceManager.js +220 -0
- package/dist/instance/InstanceManager.js.map +1 -0
- package/dist/instance-metadata-reader.d.ts +48 -0
- package/dist/instance-metadata-reader.d.ts.map +1 -0
- package/dist/instance-metadata-reader.js +94 -0
- package/dist/instance-metadata-reader.js.map +1 -0
- package/dist/instance-state-derivation.d.ts +42 -0
- package/dist/instance-state-derivation.d.ts.map +1 -0
- package/dist/instance-state-derivation.js +133 -0
- package/dist/instance-state-derivation.js.map +1 -0
- package/dist/job-scheduler.d.ts +124 -0
- package/dist/job-scheduler.d.ts.map +1 -0
- package/dist/job-scheduler.js +992 -0
- package/dist/job-scheduler.js.map +1 -0
- package/dist/kaseki-api-client.d.ts +89 -0
- package/dist/kaseki-api-client.d.ts.map +1 -0
- package/dist/kaseki-api-client.js +405 -0
- package/dist/kaseki-api-client.js.map +1 -0
- package/dist/kaseki-api-config.d.ts +34 -0
- package/dist/kaseki-api-config.d.ts.map +1 -0
- package/dist/kaseki-api-config.js +113 -0
- package/dist/kaseki-api-config.js.map +1 -0
- package/dist/kaseki-api-routes.d.ts +13 -0
- package/dist/kaseki-api-routes.d.ts.map +1 -0
- package/dist/kaseki-api-routes.js +559 -0
- package/dist/kaseki-api-routes.js.map +1 -0
- package/dist/kaseki-api-service-wrapper.d.ts +43 -0
- package/dist/kaseki-api-service-wrapper.d.ts.map +1 -0
- package/dist/kaseki-api-service-wrapper.js +150 -0
- package/dist/kaseki-api-service-wrapper.js.map +1 -0
- package/dist/kaseki-api-service.d.ts +16 -0
- package/dist/kaseki-api-service.d.ts.map +1 -0
- package/dist/kaseki-api-service.js +143 -0
- package/dist/kaseki-api-service.js.map +1 -0
- package/dist/kaseki-api-types.d.ts +440 -0
- package/dist/kaseki-api-types.d.ts.map +1 -0
- package/dist/kaseki-api-types.js +64 -0
- package/dist/kaseki-api-types.js.map +1 -0
- package/dist/kaseki-cli-lib.d.ts +219 -0
- package/dist/kaseki-cli-lib.d.ts.map +1 -0
- package/dist/kaseki-cli-lib.js +523 -0
- package/dist/kaseki-cli-lib.js.map +1 -0
- package/dist/kaseki-cli.d.ts +38 -0
- package/dist/kaseki-cli.d.ts.map +1 -0
- package/dist/kaseki-cli.js +559 -0
- package/dist/kaseki-cli.js.map +1 -0
- package/dist/kaseki-report.d.ts +3 -0
- package/dist/kaseki-report.d.ts.map +1 -0
- package/dist/kaseki-report.js +140 -0
- package/dist/kaseki-report.js.map +1 -0
- package/dist/lib/subprocess-helpers.d.ts +98 -0
- package/dist/lib/subprocess-helpers.d.ts.map +1 -0
- package/dist/lib/subprocess-helpers.js +136 -0
- package/dist/lib/subprocess-helpers.js.map +1 -0
- package/dist/logger.d.ts +39 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +79 -0
- package/dist/logger.js.map +1 -0
- package/dist/metrics.d.ts +19 -0
- package/dist/metrics.d.ts.map +1 -0
- package/dist/metrics.js +59 -0
- package/dist/metrics.js.map +1 -0
- package/dist/middleware/job-lookup.d.ts +27 -0
- package/dist/middleware/job-lookup.d.ts.map +1 -0
- package/dist/middleware/job-lookup.js +28 -0
- package/dist/middleware/job-lookup.js.map +1 -0
- package/dist/pi-event-filter.d.ts +3 -0
- package/dist/pi-event-filter.d.ts.map +1 -0
- package/dist/pi-event-filter.js +126 -0
- package/dist/pi-event-filter.js.map +1 -0
- package/dist/pi-progress-stream.d.ts +3 -0
- package/dist/pi-progress-stream.d.ts.map +1 -0
- package/dist/pi-progress-stream.js +205 -0
- package/dist/pi-progress-stream.js.map +1 -0
- package/dist/pi-progress-summarizer.d.ts +61 -0
- package/dist/pi-progress-summarizer.d.ts.map +1 -0
- package/dist/pi-progress-summarizer.js +246 -0
- package/dist/pi-progress-summarizer.js.map +1 -0
- package/dist/pre-flight-validator.d.ts +72 -0
- package/dist/pre-flight-validator.d.ts.map +1 -0
- package/dist/pre-flight-validator.js +513 -0
- package/dist/pre-flight-validator.js.map +1 -0
- package/dist/progress-stream-utils.d.ts +3 -0
- package/dist/progress-stream-utils.d.ts.map +1 -0
- package/dist/progress-stream-utils.js +15 -0
- package/dist/progress-stream-utils.js.map +1 -0
- package/dist/result-cache.d.ts +52 -0
- package/dist/result-cache.d.ts.map +1 -0
- package/dist/result-cache.js +134 -0
- package/dist/result-cache.js.map +1 -0
- package/dist/routes/artifact-routes.d.ts +10 -0
- package/dist/routes/artifact-routes.d.ts.map +1 -0
- package/dist/routes/artifact-routes.js +126 -0
- package/dist/routes/artifact-routes.js.map +1 -0
- package/dist/routes/log-routes.d.ts +8 -0
- package/dist/routes/log-routes.d.ts.map +1 -0
- package/dist/routes/log-routes.js +345 -0
- package/dist/routes/log-routes.js.map +1 -0
- package/dist/routes/status-routes.d.ts +8 -0
- package/dist/routes/status-routes.d.ts.map +1 -0
- package/dist/routes/status-routes.js +82 -0
- package/dist/routes/status-routes.js.map +1 -0
- package/dist/routes/webhook-routes.d.ts +6 -0
- package/dist/routes/webhook-routes.d.ts.map +1 -0
- package/dist/routes/webhook-routes.js +86 -0
- package/dist/routes/webhook-routes.js.map +1 -0
- package/dist/run-artifact-metadata-cache.d.ts +42 -0
- package/dist/run-artifact-metadata-cache.d.ts.map +1 -0
- package/dist/run-artifact-metadata-cache.js +139 -0
- package/dist/run-artifact-metadata-cache.js.map +1 -0
- package/dist/secret-value-cache.d.ts +13 -0
- package/dist/secret-value-cache.d.ts.map +1 -0
- package/dist/secret-value-cache.js +44 -0
- package/dist/secret-value-cache.js.map +1 -0
- package/dist/secrets/SecretsManager.d.ts +80 -0
- package/dist/secrets/SecretsManager.d.ts.map +1 -0
- package/dist/secrets/SecretsManager.js +306 -0
- package/dist/secrets/SecretsManager.js.map +1 -0
- package/dist/test-utils.d.ts +55 -0
- package/dist/test-utils.d.ts.map +1 -0
- package/dist/test-utils.js +48 -0
- package/dist/test-utils.js.map +1 -0
- package/dist/timestamp-tracker.d.ts +75 -0
- package/dist/timestamp-tracker.d.ts.map +1 -0
- package/dist/timestamp-tracker.js +121 -0
- package/dist/timestamp-tracker.js.map +1 -0
- package/dist/utils/failure-artifact-writer.d.ts +29 -0
- package/dist/utils/failure-artifact-writer.d.ts.map +1 -0
- package/dist/utils/failure-artifact-writer.js +157 -0
- package/dist/utils/failure-artifact-writer.js.map +1 -0
- package/dist/utils/file-helpers.d.ts +41 -0
- package/dist/utils/file-helpers.d.ts.map +1 -0
- package/dist/utils/file-helpers.js +143 -0
- package/dist/utils/file-helpers.js.map +1 -0
- package/dist/utils/http-client-factory.d.ts +46 -0
- package/dist/utils/http-client-factory.d.ts.map +1 -0
- package/dist/utils/http-client-factory.js +114 -0
- package/dist/utils/http-client-factory.js.map +1 -0
- package/dist/utils/progress-normalizer.d.ts +13 -0
- package/dist/utils/progress-normalizer.d.ts.map +1 -0
- package/dist/utils/progress-normalizer.js +57 -0
- package/dist/utils/progress-normalizer.js.map +1 -0
- package/dist/utils/response-helpers.d.ts +34 -0
- package/dist/utils/response-helpers.d.ts.map +1 -0
- package/dist/utils/response-helpers.js +78 -0
- package/dist/utils/response-helpers.js.map +1 -0
- package/dist/utils/route-helpers.d.ts +17 -0
- package/dist/utils/route-helpers.d.ts.map +1 -0
- package/dist/utils/route-helpers.js +22 -0
- package/dist/utils/route-helpers.js.map +1 -0
- package/dist/utils/status-response-builder.d.ts +23 -0
- package/dist/utils/status-response-builder.d.ts.map +1 -0
- package/dist/utils/status-response-builder.js +144 -0
- package/dist/utils/status-response-builder.js.map +1 -0
- package/dist/utils/type-guards.d.ts +37 -0
- package/dist/utils/type-guards.d.ts.map +1 -0
- package/dist/utils/type-guards.js +45 -0
- package/dist/utils/type-guards.js.map +1 -0
- package/dist/utils/utf8-helpers.d.ts +32 -0
- package/dist/utils/utf8-helpers.d.ts.map +1 -0
- package/dist/utils/utf8-helpers.js +97 -0
- package/dist/utils/utf8-helpers.js.map +1 -0
- package/dist/utils/webhook-event-builder.d.ts +26 -0
- package/dist/utils/webhook-event-builder.d.ts.map +1 -0
- package/dist/utils/webhook-event-builder.js +77 -0
- package/dist/utils/webhook-event-builder.js.map +1 -0
- package/dist/webhook-manager.d.ts +56 -0
- package/dist/webhook-manager.d.ts.map +1 -0
- package/dist/webhook-manager.js +359 -0
- package/dist/webhook-manager.js.map +1 -0
- package/docker/workspace-cache/package-lock.json +13 -0
- package/docker/workspace-cache/package.json +7 -0
- package/docker-compose.yml +53 -0
- package/docs/API.md +708 -0
- package/docs/BACKLOG.md +19 -0
- package/docs/BUILD_STRATEGY.md +404 -0
- package/docs/CLI.md +569 -0
- package/docs/DEPLOYMENT.md +521 -0
- package/docs/DEVELOPMENT.md +459 -0
- package/docs/DOCKER_SETUP.md +522 -0
- package/docs/ENHANCED_PROGRESS_LOGS.md +264 -0
- package/docs/IMPLEMENTATION_SUMMARY.md +549 -0
- package/docs/INTEGRATION_EXAMPLE.md +217 -0
- package/docs/NPM_SETUP.md +468 -0
- package/docs/PHASE1-4_IMPLEMENTATION.md +302 -0
- package/docs/PHASE1_COMPLETION.md +192 -0
- package/docs/PHASE2_COMPLETION.md +134 -0
- package/docs/PHASE6_MIGRATION.md +392 -0
- package/docs/PRINTF_SAFETY_FIX.md +282 -0
- package/docs/QUALITY_GATES.md +369 -0
- package/docs/SETUP_GUIDE.md +482 -0
- package/docs/TASK_PROMPT_TEMPLATES.md +533 -0
- package/docs/VALIDATION_FIX.md +139 -0
- package/docs/VERIFICATION_CHECKLIST.md +335 -0
- package/docs/repo-maturity.md +760 -0
- package/fix-tests.d.ts +9 -0
- package/fix-tests.d.ts.map +1 -0
- package/fix-tests.js.map +1 -0
- package/fix-tests.ts +53 -0
- package/jest.config.ts +31 -0
- package/kaseki +183 -0
- package/kaseki-agent.sh +1961 -0
- package/ops/logrotate/kaseki +10 -0
- package/package.json +83 -0
- package/perf/README.md +54 -0
- package/perf/pi-event-filter.benchmark.test.ts +98 -0
- package/run-kaseki-json.test.sh +106 -0
- package/run-kaseki.sh +990 -0
- package/scripts/allowlist-helper.sh +56 -0
- package/scripts/cleanup-kaseki.sh +168 -0
- package/scripts/deploy-pi-template.sh +293 -0
- package/scripts/docker-entrypoint.sh +71 -0
- package/scripts/dry-run-allowlist.sh +161 -0
- package/scripts/kaseki-activate.sh +396 -0
- package/scripts/kaseki-api.service +62 -0
- package/scripts/kaseki-container-entrypoint-wrapper.sh +119 -0
- package/scripts/kaseki-container-setup-remote.sh +172 -0
- package/scripts/kaseki-container-setup.sh +193 -0
- package/scripts/kaseki-healthcheck.sh +95 -0
- package/scripts/kaseki-install.sh +50 -0
- package/scripts/kaseki-maturity-score.sh +291 -0
- package/scripts/kaseki-performance-metrics.sh +122 -0
- package/scripts/kaseki-preflight.sh +270 -0
- package/scripts/kaseki-setup.sh +265 -0
- package/scripts/pi-setup-remote.sh +213 -0
- package/scripts/setup-github-labels.sh +42 -0
- package/scripts/suggest-allowlist.sh +68 -0
- package/scripts/templates/MULTI_HOST_DISTRIBUTED.md +337 -0
- package/scripts/templates/REST_API_SERVICE.md +490 -0
- package/scripts/templates/SINGLE_HOST_CLI.md +194 -0
- package/scripts/test-github-app.sh +248 -0
- package/src/add-js-extensions.ts +61 -0
- package/src/ansi-colors.test.ts +62 -0
- package/src/ansi-colors.ts +67 -0
- package/src/cli/BaseCommand.ts +40 -0
- package/src/cli/KasekiCLI.ts +154 -0
- package/src/cli/commands/ConfigCommand.ts +145 -0
- package/src/cli/commands/DoctorCommand.ts +329 -0
- package/src/cli/commands/ListCommand.ts +105 -0
- package/src/cli/commands/ReportCommand.ts +110 -0
- package/src/cli/commands/RunCommand.ts +218 -0
- package/src/cli/commands/SecretsCommand.ts +120 -0
- package/src/cli/commands/ServeCommand.ts +62 -0
- package/src/cli/commands/SetupCommand.ts +301 -0
- package/src/cli.ts +138 -0
- package/src/config/ConfigManager.ts +476 -0
- package/src/docker/DockerManager.ts +319 -0
- package/src/docker-entrypoint-packaging.test.ts +33 -0
- package/src/event-aggregator.test.ts +117 -0
- package/src/event-aggregator.ts +126 -0
- package/src/github-app-token.ts +215 -0
- package/src/idempotency-store.test.ts +117 -0
- package/src/idempotency-store.ts +385 -0
- package/src/index.ts +89 -0
- package/src/instance/InstanceManager.ts +285 -0
- package/src/instance-metadata-reader.test.ts +190 -0
- package/src/instance-metadata-reader.ts +129 -0
- package/src/instance-state-derivation.test.ts +263 -0
- package/src/instance-state-derivation.ts +148 -0
- package/src/job-scheduler.test.ts +1236 -0
- package/src/job-scheduler.ts +1117 -0
- package/src/kaseki-api-client.ts +488 -0
- package/src/kaseki-api-config.test.ts +315 -0
- package/src/kaseki-api-config.ts +175 -0
- package/src/kaseki-api-routes.test.ts +1615 -0
- package/src/kaseki-api-routes.ts +643 -0
- package/src/kaseki-api-service-wrapper.ts +188 -0
- package/src/kaseki-api-service.test.ts +418 -0
- package/src/kaseki-api-service.ts +192 -0
- package/src/kaseki-api-types.ts +320 -0
- package/src/kaseki-cli-lib.test.ts +552 -0
- package/src/kaseki-cli-lib.ts +760 -0
- package/src/kaseki-cli.ts +682 -0
- package/src/kaseki-report.test.ts +118 -0
- package/src/kaseki-report.ts +192 -0
- package/src/lib/subprocess-helpers.ts +177 -0
- package/src/logger.ts +114 -0
- package/src/metrics.ts +66 -0
- package/src/middleware/job-lookup.test.ts +113 -0
- package/src/middleware/job-lookup.ts +45 -0
- package/src/pi-event-filter.test.ts +183 -0
- package/src/pi-event-filter.ts +183 -0
- package/src/pi-progress-stream.ts +287 -0
- package/src/pi-progress-summarizer.test.ts +302 -0
- package/src/pi-progress-summarizer.ts +287 -0
- package/src/pre-flight-validator.test.ts +512 -0
- package/src/pre-flight-validator.ts +618 -0
- package/src/progress-stream-utils.test.ts +35 -0
- package/src/progress-stream-utils.ts +14 -0
- package/src/result-cache.test.ts +195 -0
- package/src/result-cache.ts +181 -0
- package/src/routes/artifact-routes.ts +169 -0
- package/src/routes/log-routes.ts +391 -0
- package/src/routes/status-routes.ts +92 -0
- package/src/routes/webhook-routes.ts +97 -0
- package/src/run-artifact-metadata-cache.test.ts +80 -0
- package/src/run-artifact-metadata-cache.ts +184 -0
- package/src/secret-value-cache.test.ts +66 -0
- package/src/secret-value-cache.ts +55 -0
- package/src/secrets/SecretsManager.ts +343 -0
- package/src/test-utils.ts +81 -0
- package/src/timestamp-tracker.test.ts +134 -0
- package/src/timestamp-tracker.ts +132 -0
- package/src/utils/failure-artifact-writer.ts +187 -0
- package/src/utils/file-helpers.test.ts +235 -0
- package/src/utils/file-helpers.ts +150 -0
- package/src/utils/http-client-factory.test.ts +245 -0
- package/src/utils/http-client-factory.ts +157 -0
- package/src/utils/progress-normalizer.test.ts +442 -0
- package/src/utils/progress-normalizer.ts +68 -0
- package/src/utils/response-helpers.test.ts +122 -0
- package/src/utils/response-helpers.ts +101 -0
- package/src/utils/route-helpers.ts +30 -0
- package/src/utils/status-response-builder.ts +159 -0
- package/src/utils/type-guards.ts +52 -0
- package/src/utils/utf8-helpers.ts +102 -0
- package/src/utils/webhook-event-builder.test.ts +143 -0
- package/src/utils/webhook-event-builder.ts +87 -0
- package/src/webhook-manager.test.ts +152 -0
- package/src/webhook-manager.ts +445 -0
- package/templates/allowlist-api-route.txt +7 -0
- package/templates/allowlist-comprehensive.txt +8 -0
- package/templates/allowlist-parser-fix.txt +6 -0
- package/templates/allowlist-ui-component.txt +9 -0
- package/templates/allowlist-utility.txt +9 -0
- package/test/actual-model-metadata.test.sh +102 -0
- package/test/dry-run.test.sh +131 -0
- package/test/fixtures/kaseki-report-exit-codes/metadata-exit-0.json +1 -0
- package/test/fixtures/kaseki-report-exit-codes/metadata-exit-1.json +1 -0
- package/test/fixtures/kaseki-report-exit-codes/metadata-exit-invalid.json +1 -0
- package/test/fixtures/kaseki-report-exit-codes/metadata-exit-str-0.json +1 -0
- package/test/fixtures/kaseki-report-exit-codes/metadata-exit-str-1.json +1 -0
- package/test/kaseki-api.integration.test.sh +165 -0
- package/test/pi-event-filter-failure.test.sh +83 -0
- package/test/printf-safety-focused.test.sh +99 -0
- package/test/printf-safety-results/results/restoration.jsonl +10 -0
- package/test/printf-safety-results/results/test.jsonl +0 -0
- package/test/printf-safety.test.sh +297 -0
- package/test/validation-fix.test.sh +79 -0
- package/test/validation-integration.test.sh +109 -0
- package/tests/allowlist-glob.test.sh +61 -0
- package/tests/dependency-cache-key.test.sh +48 -0
- package/tests/dependency-restore-mode.test.sh +48 -0
- package/tests/doctor-template-parity.test.sh +95 -0
- package/tests/github-operations.test.sh +142 -0
- package/tests/npm-install-flags.test.sh +58 -0
- package/tests/quality-gates.test.sh +178 -0
- package/tests/repo-memory.test.sh +103 -0
- package/tests/restore-disallowed-changes.test.sh +80 -0
- package/tests/validation-missing-npm-scripts.test.sh +93 -0
- package/tests/validation-strict-mode.test.sh +118 -0
- package/tsconfig.changed.json +7 -0
- 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
|